1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2014 Tom Gundersen <teg@jklm.no>
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
23 #include <sys/ioctl.h>
25 #include <netinet/in.h>
27 #include "netlink-util.h"
28 #include "network-internal.h"
29 #include "socket-util.h"
32 #include "fileio-label.h"
33 #include "ordered-set.h"
34 #include "random-util.h"
35 #include "hostname-util.h"
37 #include "dns-domain.h"
38 #include "resolved-conf.h"
39 #include "resolved-bus.h"
40 #include "resolved-manager.h"
41 #include "resolved-llmnr.h"
43 #define SEND_TIMEOUT_USEC (200 * USEC_PER_MSEC)
45 static int manager_process_link(sd_netlink
*rtnl
, sd_netlink_message
*mm
, void *userdata
) {
46 Manager
*m
= userdata
;
55 r
= sd_netlink_message_get_type(mm
, &type
);
59 r
= sd_rtnl_message_link_get_ifindex(mm
, &ifindex
);
63 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
71 r
= link_new(m
, &l
, ifindex
);
76 r
= link_update_rtnl(l
, mm
);
80 r
= link_update_monitor(l
);
85 log_debug("Found new link %i/%s", ifindex
, l
->name
);
92 log_debug("Removing link %i/%s", l
->ifindex
, l
->name
);
102 log_warning_errno(r
, "Failed to process RTNL link message: %m");
106 static int manager_process_address(sd_netlink
*rtnl
, sd_netlink_message
*mm
, void *userdata
) {
107 Manager
*m
= userdata
;
108 union in_addr_union address
;
110 int r
, ifindex
, family
;
118 r
= sd_netlink_message_get_type(mm
, &type
);
122 r
= sd_rtnl_message_addr_get_ifindex(mm
, &ifindex
);
126 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
130 r
= sd_rtnl_message_addr_get_family(mm
, &family
);
137 r
= sd_netlink_message_read_in_addr(mm
, IFA_LOCAL
, &address
.in
);
139 r
= sd_netlink_message_read_in_addr(mm
, IFA_ADDRESS
, &address
.in
);
147 r
= sd_netlink_message_read_in6_addr(mm
, IFA_LOCAL
, &address
.in6
);
149 r
= sd_netlink_message_read_in6_addr(mm
, IFA_ADDRESS
, &address
.in6
);
160 a
= link_find_address(l
, family
, &address
);
167 r
= link_address_new(l
, &a
, family
, &address
);
172 r
= link_address_update_rtnl(a
, mm
);
179 link_address_free(a
);
186 log_warning_errno(r
, "Failed to process RTNL address message: %m");
190 static int manager_rtnl_listen(Manager
*m
) {
191 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
, *reply
= NULL
;
192 sd_netlink_message
*i
;
197 /* First, subscribe to interfaces coming and going */
198 r
= sd_netlink_open(&m
->rtnl
);
202 r
= sd_netlink_attach_event(m
->rtnl
, m
->event
, 0);
206 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWLINK
, manager_process_link
, m
);
210 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELLINK
, manager_process_link
, m
);
214 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWADDR
, manager_process_address
, m
);
218 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELADDR
, manager_process_address
, m
);
222 /* Then, enumerate all links */
223 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
227 r
= sd_netlink_message_request_dump(req
, true);
231 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
235 for (i
= reply
; i
; i
= sd_netlink_message_next(i
)) {
236 r
= manager_process_link(m
->rtnl
, i
, m
);
241 req
= sd_netlink_message_unref(req
);
242 reply
= sd_netlink_message_unref(reply
);
244 /* Finally, enumerate all addresses, too */
245 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, AF_UNSPEC
);
249 r
= sd_netlink_message_request_dump(req
, true);
253 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
257 for (i
= reply
; i
; i
= sd_netlink_message_next(i
)) {
258 r
= manager_process_address(m
->rtnl
, i
, m
);
266 static int on_network_event(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
267 Manager
*m
= userdata
;
274 sd_network_monitor_flush(m
->network_monitor
);
276 HASHMAP_FOREACH(l
, m
->links
, i
) {
277 r
= link_update_monitor(l
);
279 log_warning_errno(r
, "Failed to update monitor information for %i: %m", l
->ifindex
);
282 r
= manager_write_resolv_conf(m
);
284 log_warning_errno(r
, "Could not update resolv.conf: %m");
289 static int manager_network_monitor_listen(Manager
*m
) {
294 r
= sd_network_monitor_new(&m
->network_monitor
, NULL
);
298 fd
= sd_network_monitor_get_fd(m
->network_monitor
);
302 events
= sd_network_monitor_get_events(m
->network_monitor
);
306 r
= sd_event_add_io(m
->event
, &m
->network_event_source
, fd
, events
, &on_network_event
, m
);
313 static int determine_hostname(char **ret
) {
314 _cleanup_free_
char *h
= NULL
, *n
= NULL
;
319 h
= gethostname_malloc();
323 if (!utf8_is_valid(h
)) {
324 log_error("System hostname is not UTF-8 clean.");
328 r
= dns_name_normalize(h
, &n
);
330 log_error("System hostname '%s' cannot be normalized.", h
);
340 static int on_hostname_change(sd_event_source
*es
, int fd
, uint32_t revents
, void *userdata
) {
341 _cleanup_free_
char *h
= NULL
;
342 Manager
*m
= userdata
;
347 r
= determine_hostname(&h
);
349 return 0; /* ignore invalid hostnames */
351 if (streq(h
, m
->hostname
))
354 log_info("System hostname changed to '%s'.", h
);
359 manager_refresh_rrs(m
);
364 static int manager_watch_hostname(Manager
*m
) {
369 m
->hostname_fd
= open("/proc/sys/kernel/hostname", O_RDONLY
|O_CLOEXEC
|O_NDELAY
|O_NOCTTY
);
370 if (m
->hostname_fd
< 0) {
371 log_warning_errno(errno
, "Failed to watch hostname: %m");
375 r
= sd_event_add_io(m
->event
, &m
->hostname_event_source
, m
->hostname_fd
, 0, on_hostname_change
, m
);
378 /* kernels prior to 3.2 don't support polling this file. Ignore the failure. */
379 m
->hostname_fd
= safe_close(m
->hostname_fd
);
381 return log_error_errno(r
, "Failed to add hostname event source: %m");
384 r
= determine_hostname(&m
->hostname
);
386 log_info("Defaulting to hostname 'linux'.");
387 m
->hostname
= strdup("linux");
391 log_info("Using system hostname '%s'.", m
->hostname
);
396 int manager_new(Manager
**ret
) {
397 _cleanup_(manager_freep
) Manager
*m
= NULL
;
402 m
= new0(Manager
, 1);
406 m
->llmnr_ipv4_udp_fd
= m
->llmnr_ipv6_udp_fd
= -1;
407 m
->llmnr_ipv4_tcp_fd
= m
->llmnr_ipv6_tcp_fd
= -1;
410 m
->llmnr_support
= SUPPORT_YES
;
411 m
->read_resolv_conf
= true;
413 r
= manager_parse_dns_server(m
, DNS_SERVER_FALLBACK
, DNS_SERVERS
);
417 r
= sd_event_default(&m
->event
);
421 sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
422 sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
424 sd_event_set_watchdog(m
->event
, true);
426 r
= manager_watch_hostname(m
);
430 r
= dns_scope_new(m
, &m
->unicast_scope
, NULL
, DNS_PROTOCOL_DNS
, AF_UNSPEC
);
434 r
= manager_network_monitor_listen(m
);
438 r
= manager_rtnl_listen(m
);
442 r
= manager_connect_bus(m
);
452 int manager_start(Manager
*m
) {
457 r
= manager_llmnr_start(m
);
464 Manager
*manager_free(Manager
*m
) {
470 while ((l
= hashmap_first(m
->links
)))
473 while (m
->dns_queries
)
474 dns_query_free(m
->dns_queries
);
476 manager_flush_dns_servers(m
, DNS_SERVER_SYSTEM
);
477 manager_flush_dns_servers(m
, DNS_SERVER_FALLBACK
);
479 dns_scope_free(m
->unicast_scope
);
481 hashmap_free(m
->links
);
482 hashmap_free(m
->dns_transactions
);
484 sd_event_source_unref(m
->network_event_source
);
485 sd_network_monitor_unref(m
->network_monitor
);
487 manager_llmnr_stop(m
);
489 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
490 sd_event_source_unref(m
->bus_retry_event_source
);
491 sd_bus_unref(m
->bus
);
493 sd_event_unref(m
->event
);
495 dns_resource_key_unref(m
->host_ipv4_key
);
496 dns_resource_key_unref(m
->host_ipv6_key
);
498 safe_close(m
->hostname_fd
);
499 sd_event_source_unref(m
->hostname_event_source
);
507 int manager_read_resolv_conf(Manager
*m
) {
508 _cleanup_fclose_
FILE *f
= NULL
;
517 /* Reads the system /etc/resolv.conf, if it exists and is not
518 * symlinked to our own resolv.conf instance */
520 if (!m
->read_resolv_conf
)
523 r
= stat("/etc/resolv.conf", &st
);
526 log_warning_errno(errno
, "Failed to open /etc/resolv.conf: %m");
531 /* Have we already seen the file? */
532 t
= timespec_load(&st
.st_mtim
);
533 if (t
== m
->resolv_conf_mtime
)
536 m
->resolv_conf_mtime
= t
;
538 /* Is it symlinked to our own file? */
539 if (stat("/run/systemd/resolve/resolv.conf", &own
) >= 0 &&
540 st
.st_dev
== own
.st_dev
&&
541 st
.st_ino
== own
.st_ino
) {
546 f
= fopen("/etc/resolv.conf", "re");
549 log_warning_errno(errno
, "Failed to open /etc/resolv.conf: %m");
554 if (fstat(fileno(f
), &st
) < 0) {
555 log_error_errno(errno
, "Failed to stat open file: %m");
560 LIST_FOREACH(servers
, s
, m
->dns_servers
)
563 FOREACH_LINE(line
, f
, r
= -errno
; goto clear
) {
564 union in_addr_union address
;
572 if (*l
== '#' || *l
== ';')
575 a
= first_word(l
, "nameserver");
579 r
= in_addr_from_string_auto(a
, &family
, &address
);
581 log_warning("Failed to parse name server %s.", a
);
585 LIST_FOREACH(servers
, s
, m
->dns_servers
)
586 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, &address
) > 0)
592 r
= dns_server_new(m
, NULL
, DNS_SERVER_SYSTEM
, NULL
, family
, &address
);
598 LIST_FOREACH_SAFE(servers
, s
, nx
, m
->dns_servers
)
600 LIST_REMOVE(servers
, m
->dns_servers
, s
);
604 /* Whenever /etc/resolv.conf changes, start using the first
605 * DNS server of it. This is useful to deal with broken
606 * network managing implementations (like NetworkManager),
607 * that when connecting to a VPN place both the VPN DNS
608 * servers and the local ones in /etc/resolv.conf. Without
609 * resetting the DNS server to use back to the first entry we
610 * will continue to use the local one thus being unable to
611 * resolve VPN domains. */
612 manager_set_dns_server(m
, m
->dns_servers
);
617 while (m
->dns_servers
) {
620 LIST_REMOVE(servers
, m
->dns_servers
, s
);
627 static void write_resolv_conf_server(DnsServer
*s
, FILE *f
, unsigned *count
) {
628 _cleanup_free_
char *t
= NULL
;
635 r
= in_addr_to_string(s
->family
, &s
->address
, &t
);
637 log_warning_errno(r
, "Invalid DNS address. Ignoring: %m");
642 fputs("# Too many DNS servers configured, the following entries may be ignored.\n", f
);
644 fprintf(f
, "nameserver %s\n", t
);
648 static void write_resolv_conf_search(
649 const char *domain
, FILE *f
,
657 if (*count
>= MAXDNSRCH
||
658 *length
+ strlen(domain
) > 256) {
659 if (*count
== MAXDNSRCH
)
660 fputs(" # Too many search domains configured, remaining ones ignored.", f
);
662 fputs(" # Total length of all search domains is too long, remaining ones ignored.", f
);
667 fprintf(f
, " %s", domain
);
669 (*length
) += strlen(domain
);
673 static int write_resolv_conf_contents(FILE *f
, OrderedSet
*dns
, OrderedSet
*domains
) {
676 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
677 "# Third party programs must not access this file directly, but\n"
678 "# only through the symlink at /etc/resolv.conf. To manage\n"
679 "# resolv.conf(5) in a different way, replace the symlink by a\n"
680 "# static file or a different symlink.\n\n", f
);
682 if (ordered_set_isempty(dns
))
683 fputs("# No DNS servers known.\n", f
);
688 ORDERED_SET_FOREACH(s
, dns
, i
)
689 write_resolv_conf_server(s
, f
, &count
);
692 if (!ordered_set_isempty(domains
)) {
693 unsigned length
= 0, count
= 0;
697 ORDERED_SET_FOREACH(domain
, domains
, i
)
698 write_resolv_conf_search(domain
, f
, &count
, &length
);
702 return fflush_and_check(f
);
705 int manager_write_resolv_conf(Manager
*m
) {
706 static const char path
[] = "/run/systemd/resolve/resolv.conf";
707 _cleanup_free_
char *temp_path
= NULL
;
708 _cleanup_fclose_
FILE *f
= NULL
;
709 _cleanup_ordered_set_free_ OrderedSet
*dns
= NULL
, *domains
= NULL
;
717 /* Read the system /etc/resolv.conf first */
718 manager_read_resolv_conf(m
);
720 /* Add the full list to a set, to filter out duplicates */
721 dns
= ordered_set_new(&dns_server_hash_ops
);
725 domains
= ordered_set_new(&dns_name_hash_ops
);
729 /* First add the system-wide servers */
730 LIST_FOREACH(servers
, s
, m
->dns_servers
) {
731 r
= ordered_set_put(dns
, s
);
738 /* Then, add the per-link servers and domains */
739 HASHMAP_FOREACH(l
, m
->links
, i
) {
742 LIST_FOREACH(servers
, s
, l
->dns_servers
) {
743 r
= ordered_set_put(dns
, s
);
750 if (!l
->unicast_scope
)
753 STRV_FOREACH(domain
, l
->unicast_scope
->domains
) {
754 r
= ordered_set_put(domains
, *domain
);
762 /* If we found nothing, add the fallback servers */
763 if (ordered_set_isempty(dns
)) {
764 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
) {
765 r
= ordered_set_put(dns
, s
);
773 r
= fopen_temporary_label(path
, path
, &f
, &temp_path
);
777 fchmod(fileno(f
), 0644);
779 r
= write_resolv_conf_contents(f
, dns
, domains
);
783 if (rename(temp_path
, path
) < 0) {
792 (void) unlink(temp_path
);
796 int manager_recv(Manager
*m
, int fd
, DnsProtocol protocol
, DnsPacket
**ret
) {
797 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
799 struct cmsghdr header
; /* For alignment */
800 uint8_t buffer
[CMSG_SPACE(MAXSIZE(struct in_pktinfo
, struct in6_pktinfo
))
801 + CMSG_SPACE(int) /* ttl/hoplimit */
802 + EXTRA_CMSG_SPACE
/* kernel appears to require extra buffer space */];
804 union sockaddr_union sa
;
805 struct msghdr mh
= {};
806 struct cmsghdr
*cmsg
;
815 r
= ioctl(fd
, FIONREAD
, &ms
);
821 r
= dns_packet_new(&p
, protocol
, ms
);
825 iov
.iov_base
= DNS_PACKET_DATA(p
);
826 iov
.iov_len
= p
->allocated
;
828 mh
.msg_name
= &sa
.sa
;
829 mh
.msg_namelen
= sizeof(sa
);
832 mh
.msg_control
= &control
;
833 mh
.msg_controllen
= sizeof(control
);
835 l
= recvmsg(fd
, &mh
, 0);
837 if (errno
== EAGAIN
|| errno
== EINTR
)
846 assert(!(mh
.msg_flags
& MSG_CTRUNC
));
847 assert(!(mh
.msg_flags
& MSG_TRUNC
));
849 p
->size
= (size_t) l
;
851 p
->family
= sa
.sa
.sa_family
;
852 p
->ipproto
= IPPROTO_UDP
;
853 if (p
->family
== AF_INET
) {
854 p
->sender
.in
= sa
.in
.sin_addr
;
855 p
->sender_port
= be16toh(sa
.in
.sin_port
);
856 } else if (p
->family
== AF_INET6
) {
857 p
->sender
.in6
= sa
.in6
.sin6_addr
;
858 p
->sender_port
= be16toh(sa
.in6
.sin6_port
);
859 p
->ifindex
= sa
.in6
.sin6_scope_id
;
861 return -EAFNOSUPPORT
;
863 CMSG_FOREACH(cmsg
, &mh
) {
865 if (cmsg
->cmsg_level
== IPPROTO_IPV6
) {
866 assert(p
->family
== AF_INET6
);
868 switch (cmsg
->cmsg_type
) {
871 struct in6_pktinfo
*i
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
874 p
->ifindex
= i
->ipi6_ifindex
;
876 p
->destination
.in6
= i
->ipi6_addr
;
881 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
885 } else if (cmsg
->cmsg_level
== IPPROTO_IP
) {
886 assert(p
->family
== AF_INET
);
888 switch (cmsg
->cmsg_type
) {
891 struct in_pktinfo
*i
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
894 p
->ifindex
= i
->ipi_ifindex
;
896 p
->destination
.in
= i
->ipi_addr
;
901 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
907 /* The Linux kernel sets the interface index to the loopback
908 * device if the packet came from the local host since it
909 * avoids the routing table in such a case. Let's unset the
910 * interface index in such a case. */
911 if (p
->ifindex
== LOOPBACK_IFINDEX
)
914 if (protocol
!= DNS_PROTOCOL_DNS
) {
915 /* If we don't know the interface index still, we look for the
916 * first local interface with a matching address. Yuck! */
918 p
->ifindex
= manager_find_ifindex(m
, p
->family
, &p
->destination
);
927 static int sendmsg_loop(int fd
, struct msghdr
*mh
, int flags
) {
934 if (sendmsg(fd
, mh
, flags
) >= 0)
943 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
951 static int write_loop(int fd
, void *message
, size_t length
) {
958 if (write(fd
, message
, length
) >= 0)
967 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
975 int manager_write(Manager
*m
, int fd
, DnsPacket
*p
) {
978 log_debug("Sending %s packet with id %u", DNS_PACKET_QR(p
) ? "response" : "query", DNS_PACKET_ID(p
));
980 r
= write_loop(fd
, DNS_PACKET_DATA(p
), p
->size
);
987 static int manager_ipv4_send(Manager
*m
, int fd
, int ifindex
, const struct in_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
988 union sockaddr_union sa
= {
989 .in
.sin_family
= AF_INET
,
992 struct cmsghdr header
; /* For alignment */
993 uint8_t buffer
[CMSG_SPACE(sizeof(struct in_pktinfo
))];
995 struct msghdr mh
= {};
1004 iov
.iov_base
= DNS_PACKET_DATA(p
);
1005 iov
.iov_len
= p
->size
;
1007 sa
.in
.sin_addr
= *addr
;
1008 sa
.in
.sin_port
= htobe16(port
),
1012 mh
.msg_name
= &sa
.sa
;
1013 mh
.msg_namelen
= sizeof(sa
.in
);
1016 struct cmsghdr
*cmsg
;
1017 struct in_pktinfo
*pi
;
1021 mh
.msg_control
= &control
;
1022 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in_pktinfo
));
1024 cmsg
= CMSG_FIRSTHDR(&mh
);
1025 cmsg
->cmsg_len
= mh
.msg_controllen
;
1026 cmsg
->cmsg_level
= IPPROTO_IP
;
1027 cmsg
->cmsg_type
= IP_PKTINFO
;
1029 pi
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
1030 pi
->ipi_ifindex
= ifindex
;
1033 return sendmsg_loop(fd
, &mh
, 0);
1036 static int manager_ipv6_send(Manager
*m
, int fd
, int ifindex
, const struct in6_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
1037 union sockaddr_union sa
= {
1038 .in6
.sin6_family
= AF_INET6
,
1041 struct cmsghdr header
; /* For alignment */
1042 uint8_t buffer
[CMSG_SPACE(sizeof(struct in6_pktinfo
))];
1044 struct msghdr mh
= {};
1053 iov
.iov_base
= DNS_PACKET_DATA(p
);
1054 iov
.iov_len
= p
->size
;
1056 sa
.in6
.sin6_addr
= *addr
;
1057 sa
.in6
.sin6_port
= htobe16(port
),
1058 sa
.in6
.sin6_scope_id
= ifindex
;
1062 mh
.msg_name
= &sa
.sa
;
1063 mh
.msg_namelen
= sizeof(sa
.in6
);
1066 struct cmsghdr
*cmsg
;
1067 struct in6_pktinfo
*pi
;
1071 mh
.msg_control
= &control
;
1072 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in6_pktinfo
));
1074 cmsg
= CMSG_FIRSTHDR(&mh
);
1075 cmsg
->cmsg_len
= mh
.msg_controllen
;
1076 cmsg
->cmsg_level
= IPPROTO_IPV6
;
1077 cmsg
->cmsg_type
= IPV6_PKTINFO
;
1079 pi
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
1080 pi
->ipi6_ifindex
= ifindex
;
1083 return sendmsg_loop(fd
, &mh
, 0);
1086 int manager_send(Manager
*m
, int fd
, int ifindex
, int family
, const union in_addr_union
*addr
, uint16_t port
, DnsPacket
*p
) {
1093 log_debug("Sending %s packet with id %u on interface %i/%s", DNS_PACKET_QR(p
) ? "response" : "query", DNS_PACKET_ID(p
), ifindex
, af_to_name(family
));
1095 if (family
== AF_INET
)
1096 return manager_ipv4_send(m
, fd
, ifindex
, &addr
->in
, port
, p
);
1097 else if (family
== AF_INET6
)
1098 return manager_ipv6_send(m
, fd
, ifindex
, &addr
->in6
, port
, p
);
1100 return -EAFNOSUPPORT
;
1103 DnsServer
* manager_find_dns_server(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1109 LIST_FOREACH(servers
, s
, m
->dns_servers
)
1110 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
) > 0)
1113 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
)
1114 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
) > 0)
1120 DnsServer
*manager_set_dns_server(Manager
*m
, DnsServer
*s
) {
1123 if (m
->current_dns_server
== s
)
1127 _cleanup_free_
char *ip
= NULL
;
1129 in_addr_to_string(s
->family
, &s
->address
, &ip
);
1130 log_info("Switching to system DNS server %s.", strna(ip
));
1133 m
->current_dns_server
= s
;
1135 if (m
->unicast_scope
)
1136 dns_cache_flush(&m
->unicast_scope
->cache
);
1141 DnsServer
*manager_get_dns_server(Manager
*m
) {
1145 /* Try to read updates resolv.conf */
1146 manager_read_resolv_conf(m
);
1148 if (!m
->current_dns_server
)
1149 manager_set_dns_server(m
, m
->dns_servers
);
1151 if (!m
->current_dns_server
) {
1155 /* No DNS servers configured, let's see if there are
1156 * any on any links. If not, we use the fallback
1159 HASHMAP_FOREACH(l
, m
->links
, i
)
1160 if (l
->dns_servers
) {
1166 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1169 return m
->current_dns_server
;
1172 void manager_next_dns_server(Manager
*m
) {
1175 /* If there's currently no DNS server set, then the next
1176 * manager_get_dns_server() will find one */
1177 if (!m
->current_dns_server
)
1180 /* Change to the next one */
1181 if (m
->current_dns_server
->servers_next
) {
1182 manager_set_dns_server(m
, m
->current_dns_server
->servers_next
);
1186 /* If there was no next one, then start from the beginning of
1188 if (m
->current_dns_server
->type
== DNS_SERVER_FALLBACK
)
1189 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1191 manager_set_dns_server(m
, m
->dns_servers
);
1194 uint32_t manager_find_mtu(Manager
*m
) {
1199 /* If we don't know on which link a DNS packet would be
1200 * delivered, let's find the largest MTU that works on all
1201 * interfaces we know of */
1203 HASHMAP_FOREACH(l
, m
->links
, i
) {
1207 if (mtu
<= 0 || l
->mtu
< mtu
)
1214 int manager_find_ifindex(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1219 a
= manager_find_link_address(m
, family
, in_addr
);
1221 return a
->link
->ifindex
;
1226 void manager_refresh_rrs(Manager
*m
) {
1232 m
->host_ipv4_key
= dns_resource_key_unref(m
->host_ipv4_key
);
1233 m
->host_ipv6_key
= dns_resource_key_unref(m
->host_ipv6_key
);
1235 HASHMAP_FOREACH(l
, m
->links
, i
) {
1236 link_add_rrs(l
, true);
1237 link_add_rrs(l
, false);
1241 int manager_next_hostname(Manager
*m
) {
1248 p
= strchr(m
->hostname
, 0);
1251 while (p
> m
->hostname
) {
1252 if (!strchr("0123456789", p
[-1]))
1258 if (*p
== 0 || safe_atou64(p
, &u
) < 0 || u
<= 0)
1261 /* Add a random number to the old value. This way we can avoid
1262 * that two hosts pick the same hostname, win on IPv4 and lose
1263 * on IPv6 (or vice versa), and pick the same hostname
1264 * replacement hostname, ad infinitum. We still want the
1265 * numbers to go up monotonically, hence we just add a random
1268 random_bytes(&a
, sizeof(a
));
1271 if (asprintf(&h
, "%.*s%" PRIu64
, (int) (p
- m
->hostname
), m
->hostname
, u
) < 0)
1274 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m
->hostname
, h
);
1279 manager_refresh_rrs(m
);
1284 LinkAddress
* manager_find_link_address(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1290 HASHMAP_FOREACH(l
, m
->links
, i
) {
1293 a
= link_find_address(l
, family
, in_addr
);
1301 bool manager_our_packet(Manager
*m
, DnsPacket
*p
) {
1305 return !!manager_find_link_address(m
, p
->family
, &p
->sender
);
1308 DnsScope
* manager_find_scope(Manager
*m
, DnsPacket
*p
) {
1314 l
= hashmap_get(m
->links
, INT_TO_PTR(p
->ifindex
));
1318 if (p
->protocol
== DNS_PROTOCOL_LLMNR
) {
1319 if (p
->family
== AF_INET
)
1320 return l
->llmnr_ipv4_scope
;
1321 else if (p
->family
== AF_INET6
)
1322 return l
->llmnr_ipv6_scope
;
1328 void manager_verify_all(Manager
*m
) {
1333 LIST_FOREACH(scopes
, s
, m
->dns_scopes
)
1334 dns_zone_verify_all(&s
->zone
);
1337 void manager_flush_dns_servers(Manager
*m
, DnsServerType t
) {
1342 if (t
== DNS_SERVER_SYSTEM
)
1343 while (m
->dns_servers
) {
1346 LIST_REMOVE(servers
, m
->dns_servers
, s
);
1347 dns_server_unref(s
);
1350 if (t
== DNS_SERVER_FALLBACK
)
1351 while (m
->fallback_dns_servers
) {
1352 s
= m
->fallback_dns_servers
;
1354 LIST_REMOVE(servers
, m
->fallback_dns_servers
, s
);
1355 dns_server_unref(s
);
1359 static const char* const support_table
[_SUPPORT_MAX
] = {
1360 [SUPPORT_NO
] = "no",
1361 [SUPPORT_YES
] = "yes",
1362 [SUPPORT_RESOLVE
] = "resolve",
1364 DEFINE_STRING_TABLE_LOOKUP(support
, Support
);