From: Tom Gundersen Date: Mon, 13 Jan 2014 20:28:53 +0000 (+0100) Subject: networkd: DHCPv4 - allow opting out of using DNS servers X-Git-Tag: v209~442 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=5be4d38e31281727b6f45ae869136bb01a1f7790;ds=sidebyside networkd: DHCPv4 - allow opting out of using DNS servers Setting UseDNS=no will ignore any received DNS servers. --- diff --git a/man/systemd-networkd.service.xml b/man/systemd-networkd.service.xml index de45d10a7..2c1bbf7de 100644 --- a/man/systemd-networkd.service.xml +++ b/man/systemd-networkd.service.xml @@ -192,6 +192,14 @@ . This is a short-hand for a [Route] section only containing a Gateway key. + + DNS + + A DNS server address, which must be in the format described in + inet_pton3 + . + + Bridge @@ -233,7 +241,20 @@ prefixlength, if ommitted a full-length host route is assumed. + + + The [DHCPv4] section accepts the following keys: + + + + UseDNS + + When true (the default) the DNS servers received from the DHCP server will + be used, and take precedence over any statically configured ones. + + + diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf index 92954a836..3e20681c3 100644 --- a/src/network/networkd-gperf.gperf +++ b/src/network/networkd-gperf.gperf @@ -30,5 +30,6 @@ Address.Address, config_parse_address, 0, 0 Address.Label, config_parse_label, 0, 0 Route.Gateway, config_parse_gateway, 0, 0 Route.Destination, config_parse_destination, 0, 0 +DHCPv4.UseDNS, config_parse_bool, 0, offsetof(Network, dhcp_dns) Bridge.Description, config_parse_string, 0, offsetof(Bridge, description) Bridge.Name, config_parse_ifname, 0, offsetof(Bridge, name) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 5dd8e9100..6186f7f89 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -319,6 +319,7 @@ static void dhcp_handler(sd_dhcp_client *client, int event, void *userdata) { int r; assert(link); + assert(link->network); if (link->state == LINK_STATE_FAILED) return; @@ -421,11 +422,13 @@ static void dhcp_handler(sd_dhcp_client *client, int event, void *userdata) { addr = NULL; rt = NULL; - r = sd_dhcp_client_get_dns(client, &nameservers); - if (r >= 0) { - r = manager_update_resolv_conf(link->manager); - if (r < 0) - log_error("Failed to update resolv.conf"); + if (link->network->dhcp_dns) { + r = sd_dhcp_client_get_dns(client, &nameservers); + if (r >= 0) { + r = manager_update_resolv_conf(link->manager); + if (r < 0) + log_error("Failed to update resolv.conf"); + } } link_enter_set_addresses(link); diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index f98731001..498dea65f 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -65,7 +65,9 @@ static int network_load_one(Manager *manager, const char *filename) { if (!network->filename) return log_oom(); - r = config_parse(NULL, filename, file, "Match\0Network\0Address\0Route\0", config_item_perf_lookup, + network->dhcp_dns = true; + + r = config_parse(NULL, filename, file, "Match\0Network\0Address\0Route\0DHCPv4\0", config_item_perf_lookup, (void*) network_gperf_lookup, false, false, network); if (r < 0) { log_warning("Could not parse config file %s: %s", filename, strerror(-r)); diff --git a/src/network/networkd.h b/src/network/networkd.h index 607feba0e..26d7f6baa 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -85,6 +85,7 @@ struct Network { char *description; Bridge *bridge; bool dhcp; + bool dhcp_dns; LIST_HEAD(Address, static_addresses); LIST_HEAD(Route, static_routes);