summaryrefslogtreecommitdiff
path: root/src/resolve/resolved-link.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-08-01 16:04:12 +0200
committerLennart Poettering <lennart@poettering.net>2014-08-01 16:06:39 +0200
commit4e945a6f7971fd7d1f6b2c62ee3afdaff3c95ce4 (patch)
treeb36f290a2aeda5bfb77d20b2953898c3d3c36382 /src/resolve/resolved-link.c
parente70df46b9721a3d025e7a0b4ffb5893cbde5e55d (diff)
resolved: beef up DNS server configuration logic
We now maintain two lists of DNS servers: system servers and fallback servers. system servers are used in combination with any per-link servers. fallback servers are only used if there are no system servers or per-link servers configured. The system server list is supposed to be populated from a foreign tool's /etc/resolv.conf (not implemented yet). Also adds a configuration switch for LLMNR, that allows configuring whether LLMNR shall be used simply for resolving or also for responding.
Diffstat (limited to 'src/resolve/resolved-link.c')
-rw-r--r--src/resolve/resolved-link.c50
1 files changed, 34 insertions, 16 deletions
diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c
index 5355eab042..93ccc04491 100644
--- a/src/resolve/resolved-link.c
+++ b/src/resolve/resolved-link.c
@@ -92,7 +92,7 @@ static void link_allocate_scopes(Link *l) {
} else
l->unicast_scope = dns_scope_free(l->unicast_scope);
- if (link_relevant(l, AF_INET) && l->manager->use_llmnr) {
+ if (link_relevant(l, AF_INET) && l->manager->llmnr_support != SUPPORT_NO) {
if (!l->llmnr_ipv4_scope) {
r = dns_scope_new(l->manager, &l->llmnr_ipv4_scope, l, DNS_PROTOCOL_LLMNR, AF_INET);
if (r < 0)
@@ -101,7 +101,7 @@ static void link_allocate_scopes(Link *l) {
} else
l->llmnr_ipv4_scope = dns_scope_free(l->llmnr_ipv4_scope);
- if (link_relevant(l, AF_INET6) && l->manager->use_llmnr) {
+ if (link_relevant(l, AF_INET6) && l->manager->llmnr_support != SUPPORT_NO) {
if (!l->llmnr_ipv6_scope) {
r = dns_scope_new(l->manager, &l->llmnr_ipv6_scope, l, DNS_PROTOCOL_LLMNR, AF_INET6);
if (r < 0)
@@ -169,7 +169,7 @@ static int link_update_dns_servers(Link *l) {
if (s)
s->marked = false;
else {
- r = dns_server_new(l->manager, NULL, l, family, &a);
+ r = dns_server_new(l->manager, NULL, DNS_SERVER_LINK, l, family, &a);
if (r < 0)
goto clear;
}
@@ -248,11 +248,29 @@ DnsServer* link_find_dns_server(Link *l, int family, const union in_addr_union *
return NULL;
}
+static DnsServer* link_set_dns_server(Link *l, DnsServer *s) {
+ assert(l);
+
+ if (l->current_dns_server == s)
+ return s;
+
+ if (s) {
+ _cleanup_free_ char *ip = NULL;
+
+ in_addr_to_string(s->family, &s->address, &ip);
+ log_info("Switching to DNS server %s for interface %s.", strna(ip), l->name);
+ } else
+ log_info("No DNS server set for interface %s.", l->name);
+
+ l->current_dns_server = s;
+ return s;
+}
+
DnsServer *link_get_dns_server(Link *l) {
assert(l);
if (!l->current_dns_server)
- l->current_dns_server = l->dns_servers;
+ link_set_dns_server(l, l->dns_servers);
return l->current_dns_server;
}
@@ -260,23 +278,15 @@ DnsServer *link_get_dns_server(Link *l) {
void link_next_dns_server(Link *l) {
assert(l);
- /* Switch to the next DNS server */
-
- if (!l->current_dns_server) {
- l->current_dns_server = l->dns_servers;
- if (l->current_dns_server)
- return;
- }
-
if (!l->current_dns_server)
return;
if (l->current_dns_server->servers_next) {
- l->current_dns_server = l->current_dns_server->servers_next;
+ link_set_dns_server(l, l->current_dns_server->servers_next);
return;
}
- l->current_dns_server = l->dns_servers;
+ link_set_dns_server(l, l->dns_servers);
}
int link_address_new(Link *l, LinkAddress **ret, int family, const union in_addr_union *in_addr) {
@@ -337,7 +347,11 @@ void link_address_add_rrs(LinkAddress *a, bool force_remove) {
if (a->family == AF_INET) {
- if (!force_remove && link_address_relevant(a) && a->link->llmnr_ipv4_scope) {
+ if (!force_remove &&
+ link_address_relevant(a) &&
+ a->link->llmnr_ipv4_scope &&
+ a->link->manager->llmnr_support == SUPPORT_YES) {
+
if (!a->link->manager->host_ipv4_key) {
a->link->manager->host_ipv4_key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, a->link->manager->hostname);
if (!a->link->manager->host_ipv4_key) {
@@ -389,7 +403,11 @@ void link_address_add_rrs(LinkAddress *a, bool force_remove) {
if (a->family == AF_INET6) {
- if (!force_remove && link_address_relevant(a) && a->link->llmnr_ipv6_scope) {
+ if (!force_remove &&
+ link_address_relevant(a) &&
+ a->link->llmnr_ipv6_scope &&
+ a->link->manager->llmnr_support == SUPPORT_YES) {
+
if (!a->link->manager->host_ipv6_key) {
a->link->manager->host_ipv6_key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, a->link->manager->hostname);
if (!a->link->manager->host_ipv6_key) {