resolved: move dns server picking code from resolved-manager.c to resolved-dns-server.c
This commit is contained in:
parent
84129d46cd
commit
f2f1dbe50f
|
@ -21,7 +21,9 @@
|
|||
|
||||
#include "alloc-util.h"
|
||||
#include "resolved-dns-server.h"
|
||||
#include "resolved-resolv-conf.h"
|
||||
#include "siphash24.h"
|
||||
#include "string-util.h"
|
||||
|
||||
/* After how much time to repeat classic DNS requests */
|
||||
#define DNS_TIMEOUT_MIN_USEC (500 * USEC_PER_MSEC)
|
||||
|
@ -205,3 +207,95 @@ void manager_mark_dns_servers(Manager *m, DnsServerType type) {
|
|||
LIST_FOREACH(servers, s, first)
|
||||
s->marked = true;
|
||||
}
|
||||
|
||||
DnsServer* manager_find_dns_server(Manager *m, int family, const union in_addr_union *in_addr) {
|
||||
DnsServer *s;
|
||||
|
||||
assert(m);
|
||||
assert(in_addr);
|
||||
|
||||
LIST_FOREACH(servers, s, m->dns_servers)
|
||||
if (s->family == family && in_addr_equal(family, &s->address, in_addr) > 0)
|
||||
return s;
|
||||
|
||||
LIST_FOREACH(servers, s, m->fallback_dns_servers)
|
||||
if (s->family == family && in_addr_equal(family, &s->address, in_addr) > 0)
|
||||
return s;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DnsServer *manager_set_dns_server(Manager *m, DnsServer *s) {
|
||||
assert(m);
|
||||
|
||||
if (m->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 system DNS server %s.", strna(ip));
|
||||
}
|
||||
|
||||
m->current_dns_server = s;
|
||||
|
||||
if (m->unicast_scope)
|
||||
dns_cache_flush(&m->unicast_scope->cache);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
DnsServer *manager_get_dns_server(Manager *m) {
|
||||
Link *l;
|
||||
assert(m);
|
||||
|
||||
/* Try to read updates resolv.conf */
|
||||
manager_read_resolv_conf(m);
|
||||
|
||||
/* If no DNS server was chose so far, pick the first one */
|
||||
if (!m->current_dns_server)
|
||||
manager_set_dns_server(m, m->dns_servers);
|
||||
|
||||
if (!m->current_dns_server) {
|
||||
bool found = false;
|
||||
Iterator i;
|
||||
|
||||
/* No DNS servers configured, let's see if there are
|
||||
* any on any links. If not, we use the fallback
|
||||
* servers */
|
||||
|
||||
HASHMAP_FOREACH(l, m->links, i)
|
||||
if (l->dns_servers) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!found)
|
||||
manager_set_dns_server(m, m->fallback_dns_servers);
|
||||
}
|
||||
|
||||
return m->current_dns_server;
|
||||
}
|
||||
|
||||
void manager_next_dns_server(Manager *m) {
|
||||
assert(m);
|
||||
|
||||
/* If there's currently no DNS server set, then the next
|
||||
* manager_get_dns_server() will find one */
|
||||
if (!m->current_dns_server)
|
||||
return;
|
||||
|
||||
/* Change to the next one */
|
||||
if (m->current_dns_server->servers_next) {
|
||||
manager_set_dns_server(m, m->current_dns_server->servers_next);
|
||||
return;
|
||||
}
|
||||
|
||||
/* If there was no next one, then start from the beginning of
|
||||
* the list */
|
||||
if (m->current_dns_server->type == DNS_SERVER_FALLBACK)
|
||||
manager_set_dns_server(m, m->fallback_dns_servers);
|
||||
else
|
||||
manager_set_dns_server(m, m->dns_servers);
|
||||
}
|
||||
|
|
|
@ -68,6 +68,11 @@ DnsServer* dns_server_unref(DnsServer *s);
|
|||
void dns_server_packet_received(DnsServer *s, usec_t rtt);
|
||||
void dns_server_packet_lost(DnsServer *s, usec_t usec);
|
||||
|
||||
DnsServer *manager_set_dns_server(Manager *m, DnsServer *s);
|
||||
DnsServer *manager_find_dns_server(Manager *m, int family, const union in_addr_union *in_addr);
|
||||
DnsServer *manager_get_dns_server(Manager *m);
|
||||
void manager_next_dns_server(Manager *m);
|
||||
|
||||
void manager_flush_dns_servers(Manager *m, DnsServerType t);
|
||||
void manager_flush_marked_dns_servers(Manager *m, DnsServerType type);
|
||||
void manager_mark_dns_servers(Manager *m, DnsServerType type);
|
||||
|
|
|
@ -886,97 +886,6 @@ int manager_send(Manager *m, int fd, int ifindex, int family, const union in_add
|
|||
return -EAFNOSUPPORT;
|
||||
}
|
||||
|
||||
DnsServer* manager_find_dns_server(Manager *m, int family, const union in_addr_union *in_addr) {
|
||||
DnsServer *s;
|
||||
|
||||
assert(m);
|
||||
assert(in_addr);
|
||||
|
||||
LIST_FOREACH(servers, s, m->dns_servers)
|
||||
if (s->family == family && in_addr_equal(family, &s->address, in_addr) > 0)
|
||||
return s;
|
||||
|
||||
LIST_FOREACH(servers, s, m->fallback_dns_servers)
|
||||
if (s->family == family && in_addr_equal(family, &s->address, in_addr) > 0)
|
||||
return s;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DnsServer *manager_set_dns_server(Manager *m, DnsServer *s) {
|
||||
assert(m);
|
||||
|
||||
if (m->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 system DNS server %s.", strna(ip));
|
||||
}
|
||||
|
||||
m->current_dns_server = s;
|
||||
|
||||
if (m->unicast_scope)
|
||||
dns_cache_flush(&m->unicast_scope->cache);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
DnsServer *manager_get_dns_server(Manager *m) {
|
||||
Link *l;
|
||||
assert(m);
|
||||
|
||||
/* Try to read updates resolv.conf */
|
||||
manager_read_resolv_conf(m);
|
||||
|
||||
if (!m->current_dns_server)
|
||||
manager_set_dns_server(m, m->dns_servers);
|
||||
|
||||
if (!m->current_dns_server) {
|
||||
bool found = false;
|
||||
Iterator i;
|
||||
|
||||
/* No DNS servers configured, let's see if there are
|
||||
* any on any links. If not, we use the fallback
|
||||
* servers */
|
||||
|
||||
HASHMAP_FOREACH(l, m->links, i)
|
||||
if (l->dns_servers) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!found)
|
||||
manager_set_dns_server(m, m->fallback_dns_servers);
|
||||
}
|
||||
|
||||
return m->current_dns_server;
|
||||
}
|
||||
|
||||
void manager_next_dns_server(Manager *m) {
|
||||
assert(m);
|
||||
|
||||
/* If there's currently no DNS server set, then the next
|
||||
* manager_get_dns_server() will find one */
|
||||
if (!m->current_dns_server)
|
||||
return;
|
||||
|
||||
/* Change to the next one */
|
||||
if (m->current_dns_server->servers_next) {
|
||||
manager_set_dns_server(m, m->current_dns_server->servers_next);
|
||||
return;
|
||||
}
|
||||
|
||||
/* If there was no next one, then start from the beginning of
|
||||
* the list */
|
||||
if (m->current_dns_server->type == DNS_SERVER_FALLBACK)
|
||||
manager_set_dns_server(m, m->fallback_dns_servers);
|
||||
else
|
||||
manager_set_dns_server(m, m->dns_servers);
|
||||
}
|
||||
|
||||
uint32_t manager_find_mtu(Manager *m) {
|
||||
uint32_t mtu = 0;
|
||||
Link *l;
|
||||
|
|
|
@ -114,11 +114,6 @@ Manager* manager_free(Manager *m);
|
|||
|
||||
int manager_start(Manager *m);
|
||||
|
||||
DnsServer *manager_set_dns_server(Manager *m, DnsServer *s);
|
||||
DnsServer *manager_find_dns_server(Manager *m, int family, const union in_addr_union *in_addr);
|
||||
DnsServer *manager_get_dns_server(Manager *m);
|
||||
void manager_next_dns_server(Manager *m);
|
||||
|
||||
uint32_t manager_find_mtu(Manager *m);
|
||||
|
||||
int manager_write(Manager *m, int fd, DnsPacket *p);
|
||||
|
|
Loading…
Reference in a new issue