aboutgitcodebugslistschat
path: root/dhcpv6.c
diff options
context:
space:
mode:
authorStefano Brivio <sbrivio@redhat.com>2022-02-18 04:03:53 +0100
committerStefano Brivio <sbrivio@redhat.com>2022-02-21 13:41:13 +0100
commit89678c515755403277938e34984f3faf4863d593 (patch)
tree2e704fe4f036cc017e27be5103098b70e4954c75 /dhcpv6.c
parent01ae772dcc4ba7930179521bb22712bb4256bb03 (diff)
downloadpasst-89678c515755403277938e34984f3faf4863d593.tar
passt-89678c515755403277938e34984f3faf4863d593.tar.gz
passt-89678c515755403277938e34984f3faf4863d593.tar.bz2
passt-89678c515755403277938e34984f3faf4863d593.tar.lz
passt-89678c515755403277938e34984f3faf4863d593.tar.xz
passt-89678c515755403277938e34984f3faf4863d593.tar.zst
passt-89678c515755403277938e34984f3faf4863d593.zip
conf, udp: Introduce basic DNS forwarding
For compatibility with libslirp/slirp4netns users: introduce a mechanism to map, in the UDP routines, an address facing guest or namespace to the first IPv4 or IPv6 address resulting from configuration as resolver. This can be enabled with the new --dns-forward option. This implies that sourcing and using DNS addresses and search lists, passed via command line or read from /etc/resolv.conf, is not bound anymore to DHCP/DHCPv6/NDP usage: for example, pasta users might just want to use addresses from /etc/resolv.conf as mapping target, while not passing DNS options via DHCP. Reflect this in all the involved code paths by differentiating DHCP/DHCPv6/NDP usage from DNS configuration per se, and in the new options --dhcp-dns, --dhcp-search for pasta, and --no-dhcp-dns, --no-dhcp-search for passt. This should be the last bit to enable substantial compatibility between slirp4netns.sh and slirp4netns(1): pass the --dns-forward option from the script too. Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'dhcpv6.c')
-rw-r--r--dhcpv6.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/dhcpv6.c b/dhcpv6.c
index e4113bc..b79a8e9 100644
--- a/dhcpv6.c
+++ b/dhcpv6.c
@@ -394,6 +394,9 @@ static size_t dhcpv6_dns_fill(struct ctx *c, char *buf, int offset)
char *p = NULL;
int i;
+ if (c->no_dhcp_dns)
+ goto search;
+
for (i = 0; !IN6_IS_ADDR_UNSPECIFIED(&c->dns6[i]); i++) {
if (!i) {
srv = (struct opt_dns_servers *)(buf + offset);
@@ -410,6 +413,10 @@ static size_t dhcpv6_dns_fill(struct ctx *c, char *buf, int offset)
if (srv)
srv->hdr.l = htons(srv->hdr.l);
+search:
+ if (c->no_dhcp_dns_search)
+ return offset;
+
for (i = 0; *c->dns_search[i].n; i++) {
if (!i) {
srch = (struct opt_dns_search *)(buf + offset);