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/>.
22 #include <netinet/in.h>
25 #include <sys/ioctl.h>
28 #include "alloc-util.h"
29 #include "dns-domain.h"
31 #include "fileio-label.h"
32 #include "hostname-util.h"
34 #include "netlink-util.h"
35 #include "network-internal.h"
36 #include "ordered-set.h"
37 #include "parse-util.h"
38 #include "random-util.h"
39 #include "resolved-bus.h"
40 #include "resolved-conf.h"
41 #include "resolved-llmnr.h"
42 #include "resolved-manager.h"
43 #include "socket-util.h"
44 #include "string-table.h"
45 #include "string-util.h"
48 #define SEND_TIMEOUT_USEC (200 * USEC_PER_MSEC)
50 static int manager_process_link(sd_netlink
*rtnl
, sd_netlink_message
*mm
, void *userdata
) {
51 Manager
*m
= userdata
;
60 r
= sd_netlink_message_get_type(mm
, &type
);
64 r
= sd_rtnl_message_link_get_ifindex(mm
, &ifindex
);
68 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
76 r
= link_new(m
, &l
, ifindex
);
81 r
= link_update_rtnl(l
, mm
);
85 r
= link_update_monitor(l
);
90 log_debug("Found new link %i/%s", ifindex
, l
->name
);
97 log_debug("Removing link %i/%s", l
->ifindex
, l
->name
);
107 log_warning_errno(r
, "Failed to process RTNL link message: %m");
111 static int manager_process_address(sd_netlink
*rtnl
, sd_netlink_message
*mm
, void *userdata
) {
112 Manager
*m
= userdata
;
113 union in_addr_union address
;
115 int r
, ifindex
, family
;
123 r
= sd_netlink_message_get_type(mm
, &type
);
127 r
= sd_rtnl_message_addr_get_ifindex(mm
, &ifindex
);
131 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
135 r
= sd_rtnl_message_addr_get_family(mm
, &family
);
142 r
= sd_netlink_message_read_in_addr(mm
, IFA_LOCAL
, &address
.in
);
144 r
= sd_netlink_message_read_in_addr(mm
, IFA_ADDRESS
, &address
.in
);
152 r
= sd_netlink_message_read_in6_addr(mm
, IFA_LOCAL
, &address
.in6
);
154 r
= sd_netlink_message_read_in6_addr(mm
, IFA_ADDRESS
, &address
.in6
);
165 a
= link_find_address(l
, family
, &address
);
172 r
= link_address_new(l
, &a
, family
, &address
);
177 r
= link_address_update_rtnl(a
, mm
);
184 link_address_free(a
);
191 log_warning_errno(r
, "Failed to process RTNL address message: %m");
195 static int manager_rtnl_listen(Manager
*m
) {
196 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
, *reply
= NULL
;
197 sd_netlink_message
*i
;
202 /* First, subscribe to interfaces coming and going */
203 r
= sd_netlink_open(&m
->rtnl
);
207 r
= sd_netlink_attach_event(m
->rtnl
, m
->event
, 0);
211 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWLINK
, manager_process_link
, m
);
215 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELLINK
, manager_process_link
, m
);
219 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWADDR
, manager_process_address
, m
);
223 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELADDR
, manager_process_address
, m
);
227 /* Then, enumerate all links */
228 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
232 r
= sd_netlink_message_request_dump(req
, true);
236 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
240 for (i
= reply
; i
; i
= sd_netlink_message_next(i
)) {
241 r
= manager_process_link(m
->rtnl
, i
, m
);
246 req
= sd_netlink_message_unref(req
);
247 reply
= sd_netlink_message_unref(reply
);
249 /* Finally, enumerate all addresses, too */
250 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, AF_UNSPEC
);
254 r
= sd_netlink_message_request_dump(req
, true);
258 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
262 for (i
= reply
; i
; i
= sd_netlink_message_next(i
)) {
263 r
= manager_process_address(m
->rtnl
, i
, m
);
271 static int on_network_event(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
272 Manager
*m
= userdata
;
279 sd_network_monitor_flush(m
->network_monitor
);
281 HASHMAP_FOREACH(l
, m
->links
, i
) {
282 r
= link_update_monitor(l
);
284 log_warning_errno(r
, "Failed to update monitor information for %i: %m", l
->ifindex
);
287 r
= manager_write_resolv_conf(m
);
289 log_warning_errno(r
, "Could not update resolv.conf: %m");
294 static int manager_network_monitor_listen(Manager
*m
) {
299 r
= sd_network_monitor_new(&m
->network_monitor
, NULL
);
303 fd
= sd_network_monitor_get_fd(m
->network_monitor
);
307 events
= sd_network_monitor_get_events(m
->network_monitor
);
311 r
= sd_event_add_io(m
->event
, &m
->network_event_source
, fd
, events
, &on_network_event
, m
);
318 static int determine_hostname(char **llmnr_hostname
, char **mdns_hostname
) {
319 _cleanup_free_
char *h
= NULL
, *n
= NULL
;
320 char label
[DNS_LABEL_MAX
];
324 assert(llmnr_hostname
);
325 assert(mdns_hostname
);
327 /* Extract and normalize the first label of the locally
328 * configured hostname, and check it's not "localhost". */
330 h
= gethostname_malloc();
335 r
= dns_label_unescape(&p
, label
, sizeof(label
));
337 return log_error_errno(r
, "Failed to unescape host name: %m");
339 log_error("Couldn't find a single label in hosntame.");
343 k
= dns_label_undo_idna(label
, r
, label
, sizeof(label
));
345 return log_error_errno(k
, "Failed to undo IDNA: %m");
349 if (!utf8_is_valid(label
)) {
350 log_error("System hostname is not UTF-8 clean.");
354 r
= dns_label_escape(label
, r
, &n
);
356 return log_error_errno(r
, "Failed to escape host name: %m");
358 if (is_localhost(n
)) {
359 log_debug("System hostname is 'localhost', ignoring.");
363 r
= dns_name_concat(n
, "local", mdns_hostname
);
365 return log_error_errno(r
, "Failed to determine mDNS hostname: %m");
373 static int on_hostname_change(sd_event_source
*es
, int fd
, uint32_t revents
, void *userdata
) {
374 _cleanup_free_
char *llmnr_hostname
= NULL
, *mdns_hostname
= NULL
;
375 Manager
*m
= userdata
;
380 r
= determine_hostname(&llmnr_hostname
, &mdns_hostname
);
382 return 0; /* ignore invalid hostnames */
384 if (streq(llmnr_hostname
, m
->llmnr_hostname
) && streq(mdns_hostname
, m
->mdns_hostname
))
387 log_info("System hostname changed to '%s'.", llmnr_hostname
);
389 free(m
->llmnr_hostname
);
390 free(m
->mdns_hostname
);
392 m
->llmnr_hostname
= llmnr_hostname
;
393 m
->mdns_hostname
= mdns_hostname
;
395 llmnr_hostname
= mdns_hostname
= NULL
;
397 manager_refresh_rrs(m
);
402 static int manager_watch_hostname(Manager
*m
) {
407 m
->hostname_fd
= open("/proc/sys/kernel/hostname", O_RDONLY
|O_CLOEXEC
|O_NDELAY
|O_NOCTTY
);
408 if (m
->hostname_fd
< 0) {
409 log_warning_errno(errno
, "Failed to watch hostname: %m");
413 r
= sd_event_add_io(m
->event
, &m
->hostname_event_source
, m
->hostname_fd
, 0, on_hostname_change
, m
);
416 /* kernels prior to 3.2 don't support polling this file. Ignore the failure. */
417 m
->hostname_fd
= safe_close(m
->hostname_fd
);
419 return log_error_errno(r
, "Failed to add hostname event source: %m");
422 r
= determine_hostname(&m
->llmnr_hostname
, &m
->mdns_hostname
);
424 log_info("Defaulting to hostname 'linux'.");
425 m
->llmnr_hostname
= strdup("linux");
426 if (!m
->llmnr_hostname
)
429 m
->mdns_hostname
= strdup("linux.local");
430 if (!m
->mdns_hostname
)
433 log_info("Using system hostname '%s'.", m
->llmnr_hostname
);
438 static int manager_sigusr1(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
439 _cleanup_free_
char *buffer
= NULL
;
440 _cleanup_fclose_
FILE *f
= NULL
;
441 Manager
*m
= userdata
;
449 f
= open_memstream(&buffer
, &size
);
453 LIST_FOREACH(scopes
, scope
, m
->dns_scopes
)
454 dns_scope_dump(scope
, f
);
456 if (fflush_and_check(f
) < 0)
459 log_dump(LOG_INFO
, buffer
);
463 int manager_new(Manager
**ret
) {
464 _cleanup_(manager_freep
) Manager
*m
= NULL
;
469 m
= new0(Manager
, 1);
473 m
->llmnr_ipv4_udp_fd
= m
->llmnr_ipv6_udp_fd
= -1;
474 m
->llmnr_ipv4_tcp_fd
= m
->llmnr_ipv6_tcp_fd
= -1;
477 m
->llmnr_support
= SUPPORT_YES
;
478 m
->read_resolv_conf
= true;
480 r
= manager_parse_dns_server(m
, DNS_SERVER_FALLBACK
, DNS_SERVERS
);
484 r
= sd_event_default(&m
->event
);
488 sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
489 sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
491 sd_event_set_watchdog(m
->event
, true);
493 r
= manager_watch_hostname(m
);
497 r
= dns_scope_new(m
, &m
->unicast_scope
, NULL
, DNS_PROTOCOL_DNS
, AF_UNSPEC
);
501 r
= manager_network_monitor_listen(m
);
505 r
= manager_rtnl_listen(m
);
509 r
= manager_connect_bus(m
);
513 (void) sd_event_add_signal(m
->event
, &m
->sigusr1_event_source
, SIGUSR1
, manager_sigusr1
, m
);
521 int manager_start(Manager
*m
) {
526 r
= manager_llmnr_start(m
);
533 Manager
*manager_free(Manager
*m
) {
539 while ((l
= hashmap_first(m
->links
)))
542 while (m
->dns_queries
)
543 dns_query_free(m
->dns_queries
);
545 manager_flush_dns_servers(m
, DNS_SERVER_SYSTEM
);
546 manager_flush_dns_servers(m
, DNS_SERVER_FALLBACK
);
548 dns_scope_free(m
->unicast_scope
);
550 hashmap_free(m
->links
);
551 hashmap_free(m
->dns_transactions
);
553 sd_event_source_unref(m
->network_event_source
);
554 sd_network_monitor_unref(m
->network_monitor
);
556 manager_llmnr_stop(m
);
558 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
559 sd_event_source_unref(m
->bus_retry_event_source
);
560 sd_bus_unref(m
->bus
);
562 sd_event_source_unref(m
->sigusr1_event_source
);
564 sd_event_unref(m
->event
);
566 dns_resource_key_unref(m
->llmnr_host_ipv4_key
);
567 dns_resource_key_unref(m
->llmnr_host_ipv6_key
);
569 sd_event_source_unref(m
->hostname_event_source
);
570 safe_close(m
->hostname_fd
);
571 free(m
->llmnr_hostname
);
572 free(m
->mdns_hostname
);
579 int manager_read_resolv_conf(Manager
*m
) {
580 _cleanup_fclose_
FILE *f
= NULL
;
589 /* Reads the system /etc/resolv.conf, if it exists and is not
590 * symlinked to our own resolv.conf instance */
592 if (!m
->read_resolv_conf
)
595 r
= stat("/etc/resolv.conf", &st
);
598 log_warning_errno(errno
, "Failed to open /etc/resolv.conf: %m");
603 /* Have we already seen the file? */
604 t
= timespec_load(&st
.st_mtim
);
605 if (t
== m
->resolv_conf_mtime
)
608 m
->resolv_conf_mtime
= t
;
610 /* Is it symlinked to our own file? */
611 if (stat("/run/systemd/resolve/resolv.conf", &own
) >= 0 &&
612 st
.st_dev
== own
.st_dev
&&
613 st
.st_ino
== own
.st_ino
) {
618 f
= fopen("/etc/resolv.conf", "re");
621 log_warning_errno(errno
, "Failed to open /etc/resolv.conf: %m");
626 if (fstat(fileno(f
), &st
) < 0) {
627 r
= log_error_errno(errno
, "Failed to stat open file: %m");
631 LIST_FOREACH(servers
, s
, m
->dns_servers
)
634 FOREACH_LINE(line
, f
, r
= -errno
; goto clear
) {
635 union in_addr_union address
;
643 if (*l
== '#' || *l
== ';')
646 a
= first_word(l
, "nameserver");
650 r
= in_addr_from_string_auto(a
, &family
, &address
);
652 log_warning("Failed to parse name server %s.", a
);
656 LIST_FOREACH(servers
, s
, m
->dns_servers
)
657 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, &address
) > 0)
663 r
= dns_server_new(m
, NULL
, DNS_SERVER_SYSTEM
, NULL
, family
, &address
);
669 LIST_FOREACH_SAFE(servers
, s
, nx
, m
->dns_servers
)
671 LIST_REMOVE(servers
, m
->dns_servers
, s
);
675 /* Whenever /etc/resolv.conf changes, start using the first
676 * DNS server of it. This is useful to deal with broken
677 * network managing implementations (like NetworkManager),
678 * that when connecting to a VPN place both the VPN DNS
679 * servers and the local ones in /etc/resolv.conf. Without
680 * resetting the DNS server to use back to the first entry we
681 * will continue to use the local one thus being unable to
682 * resolve VPN domains. */
683 manager_set_dns_server(m
, m
->dns_servers
);
688 while (m
->dns_servers
) {
691 LIST_REMOVE(servers
, m
->dns_servers
, s
);
698 static void write_resolv_conf_server(DnsServer
*s
, FILE *f
, unsigned *count
) {
699 _cleanup_free_
char *t
= NULL
;
706 r
= in_addr_to_string(s
->family
, &s
->address
, &t
);
708 log_warning_errno(r
, "Invalid DNS address. Ignoring: %m");
713 fputs("# Too many DNS servers configured, the following entries may be ignored.\n", f
);
715 fprintf(f
, "nameserver %s\n", t
);
719 static void write_resolv_conf_search(
720 const char *domain
, FILE *f
,
728 if (*count
>= MAXDNSRCH
||
729 *length
+ strlen(domain
) > 256) {
730 if (*count
== MAXDNSRCH
)
731 fputs(" # Too many search domains configured, remaining ones ignored.", f
);
733 fputs(" # Total length of all search domains is too long, remaining ones ignored.", f
);
738 fprintf(f
, " %s", domain
);
740 (*length
) += strlen(domain
);
744 static int write_resolv_conf_contents(FILE *f
, OrderedSet
*dns
, OrderedSet
*domains
) {
747 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
748 "# Third party programs must not access this file directly, but\n"
749 "# only through the symlink at /etc/resolv.conf. To manage\n"
750 "# resolv.conf(5) in a different way, replace the symlink by a\n"
751 "# static file or a different symlink.\n\n", f
);
753 if (ordered_set_isempty(dns
))
754 fputs("# No DNS servers known.\n", f
);
759 ORDERED_SET_FOREACH(s
, dns
, i
)
760 write_resolv_conf_server(s
, f
, &count
);
763 if (!ordered_set_isempty(domains
)) {
764 unsigned length
= 0, count
= 0;
768 ORDERED_SET_FOREACH(domain
, domains
, i
)
769 write_resolv_conf_search(domain
, f
, &count
, &length
);
773 return fflush_and_check(f
);
776 int manager_write_resolv_conf(Manager
*m
) {
777 static const char path
[] = "/run/systemd/resolve/resolv.conf";
778 _cleanup_free_
char *temp_path
= NULL
;
779 _cleanup_fclose_
FILE *f
= NULL
;
780 _cleanup_ordered_set_free_ OrderedSet
*dns
= NULL
, *domains
= NULL
;
788 /* Read the system /etc/resolv.conf first */
789 manager_read_resolv_conf(m
);
791 /* Add the full list to a set, to filter out duplicates */
792 dns
= ordered_set_new(&dns_server_hash_ops
);
796 domains
= ordered_set_new(&dns_name_hash_ops
);
800 /* First add the system-wide servers */
801 LIST_FOREACH(servers
, s
, m
->dns_servers
) {
802 r
= ordered_set_put(dns
, s
);
809 /* Then, add the per-link servers and domains */
810 HASHMAP_FOREACH(l
, m
->links
, i
) {
813 LIST_FOREACH(servers
, s
, l
->dns_servers
) {
814 r
= ordered_set_put(dns
, s
);
821 if (!l
->unicast_scope
)
824 STRV_FOREACH(domain
, l
->unicast_scope
->domains
) {
825 r
= ordered_set_put(domains
, *domain
);
833 /* If we found nothing, add the fallback servers */
834 if (ordered_set_isempty(dns
)) {
835 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
) {
836 r
= ordered_set_put(dns
, s
);
844 r
= fopen_temporary_label(path
, path
, &f
, &temp_path
);
848 fchmod(fileno(f
), 0644);
850 r
= write_resolv_conf_contents(f
, dns
, domains
);
854 if (rename(temp_path
, path
) < 0) {
863 (void) unlink(temp_path
);
867 int manager_recv(Manager
*m
, int fd
, DnsProtocol protocol
, DnsPacket
**ret
) {
868 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
870 struct cmsghdr header
; /* For alignment */
871 uint8_t buffer
[CMSG_SPACE(MAXSIZE(struct in_pktinfo
, struct in6_pktinfo
))
872 + CMSG_SPACE(int) /* ttl/hoplimit */
873 + EXTRA_CMSG_SPACE
/* kernel appears to require extra buffer space */];
875 union sockaddr_union sa
;
876 struct msghdr mh
= {};
877 struct cmsghdr
*cmsg
;
886 r
= ioctl(fd
, FIONREAD
, &ms
);
892 r
= dns_packet_new(&p
, protocol
, ms
);
896 iov
.iov_base
= DNS_PACKET_DATA(p
);
897 iov
.iov_len
= p
->allocated
;
899 mh
.msg_name
= &sa
.sa
;
900 mh
.msg_namelen
= sizeof(sa
);
903 mh
.msg_control
= &control
;
904 mh
.msg_controllen
= sizeof(control
);
906 l
= recvmsg(fd
, &mh
, 0);
908 if (errno
== EAGAIN
|| errno
== EINTR
)
917 assert(!(mh
.msg_flags
& MSG_CTRUNC
));
918 assert(!(mh
.msg_flags
& MSG_TRUNC
));
920 p
->size
= (size_t) l
;
922 p
->family
= sa
.sa
.sa_family
;
923 p
->ipproto
= IPPROTO_UDP
;
924 if (p
->family
== AF_INET
) {
925 p
->sender
.in
= sa
.in
.sin_addr
;
926 p
->sender_port
= be16toh(sa
.in
.sin_port
);
927 } else if (p
->family
== AF_INET6
) {
928 p
->sender
.in6
= sa
.in6
.sin6_addr
;
929 p
->sender_port
= be16toh(sa
.in6
.sin6_port
);
930 p
->ifindex
= sa
.in6
.sin6_scope_id
;
932 return -EAFNOSUPPORT
;
934 CMSG_FOREACH(cmsg
, &mh
) {
936 if (cmsg
->cmsg_level
== IPPROTO_IPV6
) {
937 assert(p
->family
== AF_INET6
);
939 switch (cmsg
->cmsg_type
) {
942 struct in6_pktinfo
*i
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
945 p
->ifindex
= i
->ipi6_ifindex
;
947 p
->destination
.in6
= i
->ipi6_addr
;
952 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
956 } else if (cmsg
->cmsg_level
== IPPROTO_IP
) {
957 assert(p
->family
== AF_INET
);
959 switch (cmsg
->cmsg_type
) {
962 struct in_pktinfo
*i
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
965 p
->ifindex
= i
->ipi_ifindex
;
967 p
->destination
.in
= i
->ipi_addr
;
972 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
978 /* The Linux kernel sets the interface index to the loopback
979 * device if the packet came from the local host since it
980 * avoids the routing table in such a case. Let's unset the
981 * interface index in such a case. */
982 if (p
->ifindex
== LOOPBACK_IFINDEX
)
985 if (protocol
!= DNS_PROTOCOL_DNS
) {
986 /* If we don't know the interface index still, we look for the
987 * first local interface with a matching address. Yuck! */
989 p
->ifindex
= manager_find_ifindex(m
, p
->family
, &p
->destination
);
998 static int sendmsg_loop(int fd
, struct msghdr
*mh
, int flags
) {
1005 if (sendmsg(fd
, mh
, flags
) >= 0)
1011 if (errno
!= EAGAIN
)
1014 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
1022 static int write_loop(int fd
, void *message
, size_t length
) {
1029 if (write(fd
, message
, length
) >= 0)
1035 if (errno
!= EAGAIN
)
1038 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
1046 int manager_write(Manager
*m
, int fd
, DnsPacket
*p
) {
1049 log_debug("Sending %s packet with id %u", DNS_PACKET_QR(p
) ? "response" : "query", DNS_PACKET_ID(p
));
1051 r
= write_loop(fd
, DNS_PACKET_DATA(p
), p
->size
);
1058 static int manager_ipv4_send(Manager
*m
, int fd
, int ifindex
, const struct in_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
1059 union sockaddr_union sa
= {
1060 .in
.sin_family
= AF_INET
,
1063 struct cmsghdr header
; /* For alignment */
1064 uint8_t buffer
[CMSG_SPACE(sizeof(struct in_pktinfo
))];
1066 struct msghdr mh
= {};
1075 iov
.iov_base
= DNS_PACKET_DATA(p
);
1076 iov
.iov_len
= p
->size
;
1078 sa
.in
.sin_addr
= *addr
;
1079 sa
.in
.sin_port
= htobe16(port
),
1083 mh
.msg_name
= &sa
.sa
;
1084 mh
.msg_namelen
= sizeof(sa
.in
);
1087 struct cmsghdr
*cmsg
;
1088 struct in_pktinfo
*pi
;
1092 mh
.msg_control
= &control
;
1093 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in_pktinfo
));
1095 cmsg
= CMSG_FIRSTHDR(&mh
);
1096 cmsg
->cmsg_len
= mh
.msg_controllen
;
1097 cmsg
->cmsg_level
= IPPROTO_IP
;
1098 cmsg
->cmsg_type
= IP_PKTINFO
;
1100 pi
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
1101 pi
->ipi_ifindex
= ifindex
;
1104 return sendmsg_loop(fd
, &mh
, 0);
1107 static int manager_ipv6_send(Manager
*m
, int fd
, int ifindex
, const struct in6_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
1108 union sockaddr_union sa
= {
1109 .in6
.sin6_family
= AF_INET6
,
1112 struct cmsghdr header
; /* For alignment */
1113 uint8_t buffer
[CMSG_SPACE(sizeof(struct in6_pktinfo
))];
1115 struct msghdr mh
= {};
1124 iov
.iov_base
= DNS_PACKET_DATA(p
);
1125 iov
.iov_len
= p
->size
;
1127 sa
.in6
.sin6_addr
= *addr
;
1128 sa
.in6
.sin6_port
= htobe16(port
),
1129 sa
.in6
.sin6_scope_id
= ifindex
;
1133 mh
.msg_name
= &sa
.sa
;
1134 mh
.msg_namelen
= sizeof(sa
.in6
);
1137 struct cmsghdr
*cmsg
;
1138 struct in6_pktinfo
*pi
;
1142 mh
.msg_control
= &control
;
1143 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in6_pktinfo
));
1145 cmsg
= CMSG_FIRSTHDR(&mh
);
1146 cmsg
->cmsg_len
= mh
.msg_controllen
;
1147 cmsg
->cmsg_level
= IPPROTO_IPV6
;
1148 cmsg
->cmsg_type
= IPV6_PKTINFO
;
1150 pi
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
1151 pi
->ipi6_ifindex
= ifindex
;
1154 return sendmsg_loop(fd
, &mh
, 0);
1157 int manager_send(Manager
*m
, int fd
, int ifindex
, int family
, const union in_addr_union
*addr
, uint16_t port
, DnsPacket
*p
) {
1164 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
));
1166 if (family
== AF_INET
)
1167 return manager_ipv4_send(m
, fd
, ifindex
, &addr
->in
, port
, p
);
1168 else if (family
== AF_INET6
)
1169 return manager_ipv6_send(m
, fd
, ifindex
, &addr
->in6
, port
, p
);
1171 return -EAFNOSUPPORT
;
1174 DnsServer
* manager_find_dns_server(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1180 LIST_FOREACH(servers
, s
, m
->dns_servers
)
1181 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
) > 0)
1184 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
)
1185 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
) > 0)
1191 DnsServer
*manager_set_dns_server(Manager
*m
, DnsServer
*s
) {
1194 if (m
->current_dns_server
== s
)
1198 _cleanup_free_
char *ip
= NULL
;
1200 in_addr_to_string(s
->family
, &s
->address
, &ip
);
1201 log_info("Switching to system DNS server %s.", strna(ip
));
1204 m
->current_dns_server
= s
;
1206 if (m
->unicast_scope
)
1207 dns_cache_flush(&m
->unicast_scope
->cache
);
1212 DnsServer
*manager_get_dns_server(Manager
*m
) {
1216 /* Try to read updates resolv.conf */
1217 manager_read_resolv_conf(m
);
1219 if (!m
->current_dns_server
)
1220 manager_set_dns_server(m
, m
->dns_servers
);
1222 if (!m
->current_dns_server
) {
1226 /* No DNS servers configured, let's see if there are
1227 * any on any links. If not, we use the fallback
1230 HASHMAP_FOREACH(l
, m
->links
, i
)
1231 if (l
->dns_servers
) {
1237 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1240 return m
->current_dns_server
;
1243 void manager_next_dns_server(Manager
*m
) {
1246 /* If there's currently no DNS server set, then the next
1247 * manager_get_dns_server() will find one */
1248 if (!m
->current_dns_server
)
1251 /* Change to the next one */
1252 if (m
->current_dns_server
->servers_next
) {
1253 manager_set_dns_server(m
, m
->current_dns_server
->servers_next
);
1257 /* If there was no next one, then start from the beginning of
1259 if (m
->current_dns_server
->type
== DNS_SERVER_FALLBACK
)
1260 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1262 manager_set_dns_server(m
, m
->dns_servers
);
1265 uint32_t manager_find_mtu(Manager
*m
) {
1270 /* If we don't know on which link a DNS packet would be
1271 * delivered, let's find the largest MTU that works on all
1272 * interfaces we know of */
1274 HASHMAP_FOREACH(l
, m
->links
, i
) {
1278 if (mtu
<= 0 || l
->mtu
< mtu
)
1285 int manager_find_ifindex(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1290 a
= manager_find_link_address(m
, family
, in_addr
);
1292 return a
->link
->ifindex
;
1297 void manager_refresh_rrs(Manager
*m
) {
1303 m
->llmnr_host_ipv4_key
= dns_resource_key_unref(m
->llmnr_host_ipv4_key
);
1304 m
->llmnr_host_ipv6_key
= dns_resource_key_unref(m
->llmnr_host_ipv6_key
);
1306 HASHMAP_FOREACH(l
, m
->links
, i
) {
1307 link_add_rrs(l
, true);
1308 link_add_rrs(l
, false);
1312 int manager_next_hostname(Manager
*m
) {
1320 p
= strchr(m
->llmnr_hostname
, 0);
1323 while (p
> m
->llmnr_hostname
) {
1324 if (!strchr("0123456789", p
[-1]))
1330 if (*p
== 0 || safe_atou64(p
, &u
) < 0 || u
<= 0)
1333 /* Add a random number to the old value. This way we can avoid
1334 * that two hosts pick the same hostname, win on IPv4 and lose
1335 * on IPv6 (or vice versa), and pick the same hostname
1336 * replacement hostname, ad infinitum. We still want the
1337 * numbers to go up monotonically, hence we just add a random
1340 random_bytes(&a
, sizeof(a
));
1343 if (asprintf(&h
, "%.*s%" PRIu64
, (int) (p
- m
->llmnr_hostname
), m
->llmnr_hostname
, u
) < 0)
1346 r
= dns_name_concat(h
, "local", &k
);
1352 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m
->llmnr_hostname
, h
);
1354 free(m
->llmnr_hostname
);
1355 m
->llmnr_hostname
= h
;
1357 free(m
->mdns_hostname
);
1358 m
->mdns_hostname
= k
;
1360 manager_refresh_rrs(m
);
1365 LinkAddress
* manager_find_link_address(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1371 HASHMAP_FOREACH(l
, m
->links
, i
) {
1374 a
= link_find_address(l
, family
, in_addr
);
1382 bool manager_our_packet(Manager
*m
, DnsPacket
*p
) {
1386 return !!manager_find_link_address(m
, p
->family
, &p
->sender
);
1389 DnsScope
* manager_find_scope(Manager
*m
, DnsPacket
*p
) {
1395 l
= hashmap_get(m
->links
, INT_TO_PTR(p
->ifindex
));
1399 if (p
->protocol
== DNS_PROTOCOL_LLMNR
) {
1400 if (p
->family
== AF_INET
)
1401 return l
->llmnr_ipv4_scope
;
1402 else if (p
->family
== AF_INET6
)
1403 return l
->llmnr_ipv6_scope
;
1409 void manager_verify_all(Manager
*m
) {
1414 LIST_FOREACH(scopes
, s
, m
->dns_scopes
)
1415 dns_zone_verify_all(&s
->zone
);
1418 void manager_flush_dns_servers(Manager
*m
, DnsServerType t
) {
1423 if (t
== DNS_SERVER_SYSTEM
)
1424 while (m
->dns_servers
) {
1427 LIST_REMOVE(servers
, m
->dns_servers
, s
);
1428 dns_server_unref(s
);
1431 if (t
== DNS_SERVER_FALLBACK
)
1432 while (m
->fallback_dns_servers
) {
1433 s
= m
->fallback_dns_servers
;
1435 LIST_REMOVE(servers
, m
->fallback_dns_servers
, s
);
1436 dns_server_unref(s
);
1440 int manager_is_own_hostname(Manager
*m
, const char *name
) {
1446 if (m
->llmnr_hostname
) {
1447 r
= dns_name_equal(name
, m
->llmnr_hostname
);
1452 if (m
->mdns_hostname
)
1453 return dns_name_equal(name
, m
->mdns_hostname
);
1458 static const char* const support_table
[_SUPPORT_MAX
] = {
1459 [SUPPORT_NO
] = "no",
1460 [SUPPORT_YES
] = "yes",
1461 [SUPPORT_RESOLVE
] = "resolve",
1463 DEFINE_STRING_TABLE_LOOKUP(support
, Support
);