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 sd_netlink_unref(m
->rtnl
);
557 sd_event_source_unref(m
->rtnl_event_source
);
559 manager_llmnr_stop(m
);
561 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
562 sd_event_source_unref(m
->bus_retry_event_source
);
563 sd_bus_unref(m
->bus
);
565 sd_event_source_unref(m
->sigusr1_event_source
);
567 sd_event_unref(m
->event
);
569 dns_resource_key_unref(m
->llmnr_host_ipv4_key
);
570 dns_resource_key_unref(m
->llmnr_host_ipv6_key
);
572 sd_event_source_unref(m
->hostname_event_source
);
573 safe_close(m
->hostname_fd
);
574 free(m
->llmnr_hostname
);
575 free(m
->mdns_hostname
);
582 int manager_read_resolv_conf(Manager
*m
) {
583 _cleanup_fclose_
FILE *f
= NULL
;
592 /* Reads the system /etc/resolv.conf, if it exists and is not
593 * symlinked to our own resolv.conf instance */
595 if (!m
->read_resolv_conf
)
598 r
= stat("/etc/resolv.conf", &st
);
603 r
= log_warning_errno(errno
, "Failed to open /etc/resolv.conf: %m");
607 /* Have we already seen the file? */
608 t
= timespec_load(&st
.st_mtim
);
609 if (t
== m
->resolv_conf_mtime
)
612 m
->resolv_conf_mtime
= t
;
614 /* Is it symlinked to our own file? */
615 if (stat("/run/systemd/resolve/resolv.conf", &own
) >= 0 &&
616 st
.st_dev
== own
.st_dev
&&
617 st
.st_ino
== own
.st_ino
) {
622 f
= fopen("/etc/resolv.conf", "re");
627 r
= log_warning_errno(errno
, "Failed to open /etc/resolv.conf: %m");
631 if (fstat(fileno(f
), &st
) < 0) {
632 r
= log_error_errno(errno
, "Failed to stat open file: %m");
636 LIST_FOREACH(servers
, s
, m
->dns_servers
)
639 FOREACH_LINE(line
, f
, r
= -errno
; goto clear
) {
640 union in_addr_union address
;
648 if (*l
== '#' || *l
== ';')
651 a
= first_word(l
, "nameserver");
655 r
= in_addr_from_string_auto(a
, &family
, &address
);
657 log_warning("Failed to parse name server %s.", a
);
661 LIST_FOREACH(servers
, s
, m
->dns_servers
)
662 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, &address
) > 0)
668 r
= dns_server_new(m
, NULL
, DNS_SERVER_SYSTEM
, NULL
, family
, &address
);
674 LIST_FOREACH_SAFE(servers
, s
, nx
, m
->dns_servers
)
676 LIST_REMOVE(servers
, m
->dns_servers
, s
);
680 /* Whenever /etc/resolv.conf changes, start using the first
681 * DNS server of it. This is useful to deal with broken
682 * network managing implementations (like NetworkManager),
683 * that when connecting to a VPN place both the VPN DNS
684 * servers and the local ones in /etc/resolv.conf. Without
685 * resetting the DNS server to use back to the first entry we
686 * will continue to use the local one thus being unable to
687 * resolve VPN domains. */
688 manager_set_dns_server(m
, m
->dns_servers
);
693 while (m
->dns_servers
) {
696 LIST_REMOVE(servers
, m
->dns_servers
, s
);
703 static void write_resolv_conf_server(DnsServer
*s
, FILE *f
, unsigned *count
) {
704 _cleanup_free_
char *t
= NULL
;
711 r
= in_addr_to_string(s
->family
, &s
->address
, &t
);
713 log_warning_errno(r
, "Invalid DNS address. Ignoring: %m");
718 fputs("# Too many DNS servers configured, the following entries may be ignored.\n", f
);
720 fprintf(f
, "nameserver %s\n", t
);
724 static void write_resolv_conf_search(
725 const char *domain
, FILE *f
,
733 if (*count
>= MAXDNSRCH
||
734 *length
+ strlen(domain
) > 256) {
735 if (*count
== MAXDNSRCH
)
736 fputs(" # Too many search domains configured, remaining ones ignored.", f
);
738 fputs(" # Total length of all search domains is too long, remaining ones ignored.", f
);
743 fprintf(f
, " %s", domain
);
745 (*length
) += strlen(domain
);
749 static int write_resolv_conf_contents(FILE *f
, OrderedSet
*dns
, OrderedSet
*domains
) {
752 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
753 "# Third party programs must not access this file directly, but\n"
754 "# only through the symlink at /etc/resolv.conf. To manage\n"
755 "# resolv.conf(5) in a different way, replace the symlink by a\n"
756 "# static file or a different symlink.\n\n", f
);
758 if (ordered_set_isempty(dns
))
759 fputs("# No DNS servers known.\n", f
);
764 ORDERED_SET_FOREACH(s
, dns
, i
)
765 write_resolv_conf_server(s
, f
, &count
);
768 if (!ordered_set_isempty(domains
)) {
769 unsigned length
= 0, count
= 0;
773 ORDERED_SET_FOREACH(domain
, domains
, i
)
774 write_resolv_conf_search(domain
, f
, &count
, &length
);
778 return fflush_and_check(f
);
781 int manager_write_resolv_conf(Manager
*m
) {
782 static const char path
[] = "/run/systemd/resolve/resolv.conf";
783 _cleanup_free_
char *temp_path
= NULL
;
784 _cleanup_fclose_
FILE *f
= NULL
;
785 _cleanup_ordered_set_free_ OrderedSet
*dns
= NULL
, *domains
= NULL
;
793 /* Read the system /etc/resolv.conf first */
794 manager_read_resolv_conf(m
);
796 /* Add the full list to a set, to filter out duplicates */
797 dns
= ordered_set_new(&dns_server_hash_ops
);
801 domains
= ordered_set_new(&dns_name_hash_ops
);
805 /* First add the system-wide servers */
806 LIST_FOREACH(servers
, s
, m
->dns_servers
) {
807 r
= ordered_set_put(dns
, s
);
814 /* Then, add the per-link servers and domains */
815 HASHMAP_FOREACH(l
, m
->links
, i
) {
818 LIST_FOREACH(servers
, s
, l
->dns_servers
) {
819 r
= ordered_set_put(dns
, s
);
826 if (!l
->unicast_scope
)
829 STRV_FOREACH(domain
, l
->unicast_scope
->domains
) {
830 r
= ordered_set_put(domains
, *domain
);
838 /* If we found nothing, add the fallback servers */
839 if (ordered_set_isempty(dns
)) {
840 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
) {
841 r
= ordered_set_put(dns
, s
);
849 r
= fopen_temporary_label(path
, path
, &f
, &temp_path
);
853 fchmod(fileno(f
), 0644);
855 r
= write_resolv_conf_contents(f
, dns
, domains
);
859 if (rename(temp_path
, path
) < 0) {
868 (void) unlink(temp_path
);
872 int manager_recv(Manager
*m
, int fd
, DnsProtocol protocol
, DnsPacket
**ret
) {
873 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
875 struct cmsghdr header
; /* For alignment */
876 uint8_t buffer
[CMSG_SPACE(MAXSIZE(struct in_pktinfo
, struct in6_pktinfo
))
877 + CMSG_SPACE(int) /* ttl/hoplimit */
878 + EXTRA_CMSG_SPACE
/* kernel appears to require extra buffer space */];
880 union sockaddr_union sa
;
881 struct msghdr mh
= {};
882 struct cmsghdr
*cmsg
;
891 r
= ioctl(fd
, FIONREAD
, &ms
);
897 r
= dns_packet_new(&p
, protocol
, ms
);
901 iov
.iov_base
= DNS_PACKET_DATA(p
);
902 iov
.iov_len
= p
->allocated
;
904 mh
.msg_name
= &sa
.sa
;
905 mh
.msg_namelen
= sizeof(sa
);
908 mh
.msg_control
= &control
;
909 mh
.msg_controllen
= sizeof(control
);
911 l
= recvmsg(fd
, &mh
, 0);
913 if (errno
== EAGAIN
|| errno
== EINTR
)
922 assert(!(mh
.msg_flags
& MSG_CTRUNC
));
923 assert(!(mh
.msg_flags
& MSG_TRUNC
));
925 p
->size
= (size_t) l
;
927 p
->family
= sa
.sa
.sa_family
;
928 p
->ipproto
= IPPROTO_UDP
;
929 if (p
->family
== AF_INET
) {
930 p
->sender
.in
= sa
.in
.sin_addr
;
931 p
->sender_port
= be16toh(sa
.in
.sin_port
);
932 } else if (p
->family
== AF_INET6
) {
933 p
->sender
.in6
= sa
.in6
.sin6_addr
;
934 p
->sender_port
= be16toh(sa
.in6
.sin6_port
);
935 p
->ifindex
= sa
.in6
.sin6_scope_id
;
937 return -EAFNOSUPPORT
;
939 CMSG_FOREACH(cmsg
, &mh
) {
941 if (cmsg
->cmsg_level
== IPPROTO_IPV6
) {
942 assert(p
->family
== AF_INET6
);
944 switch (cmsg
->cmsg_type
) {
947 struct in6_pktinfo
*i
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
950 p
->ifindex
= i
->ipi6_ifindex
;
952 p
->destination
.in6
= i
->ipi6_addr
;
957 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
961 } else if (cmsg
->cmsg_level
== IPPROTO_IP
) {
962 assert(p
->family
== AF_INET
);
964 switch (cmsg
->cmsg_type
) {
967 struct in_pktinfo
*i
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
970 p
->ifindex
= i
->ipi_ifindex
;
972 p
->destination
.in
= i
->ipi_addr
;
977 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
983 /* The Linux kernel sets the interface index to the loopback
984 * device if the packet came from the local host since it
985 * avoids the routing table in such a case. Let's unset the
986 * interface index in such a case. */
987 if (p
->ifindex
== LOOPBACK_IFINDEX
)
990 if (protocol
!= DNS_PROTOCOL_DNS
) {
991 /* If we don't know the interface index still, we look for the
992 * first local interface with a matching address. Yuck! */
994 p
->ifindex
= manager_find_ifindex(m
, p
->family
, &p
->destination
);
1003 static int sendmsg_loop(int fd
, struct msghdr
*mh
, int flags
) {
1010 if (sendmsg(fd
, mh
, flags
) >= 0)
1016 if (errno
!= EAGAIN
)
1019 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
1027 static int write_loop(int fd
, void *message
, size_t length
) {
1034 if (write(fd
, message
, length
) >= 0)
1040 if (errno
!= EAGAIN
)
1043 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
1051 int manager_write(Manager
*m
, int fd
, DnsPacket
*p
) {
1054 log_debug("Sending %s packet with id %u", DNS_PACKET_QR(p
) ? "response" : "query", DNS_PACKET_ID(p
));
1056 r
= write_loop(fd
, DNS_PACKET_DATA(p
), p
->size
);
1063 static int manager_ipv4_send(Manager
*m
, int fd
, int ifindex
, const struct in_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
1064 union sockaddr_union sa
= {
1065 .in
.sin_family
= AF_INET
,
1068 struct cmsghdr header
; /* For alignment */
1069 uint8_t buffer
[CMSG_SPACE(sizeof(struct in_pktinfo
))];
1071 struct msghdr mh
= {};
1080 iov
.iov_base
= DNS_PACKET_DATA(p
);
1081 iov
.iov_len
= p
->size
;
1083 sa
.in
.sin_addr
= *addr
;
1084 sa
.in
.sin_port
= htobe16(port
),
1088 mh
.msg_name
= &sa
.sa
;
1089 mh
.msg_namelen
= sizeof(sa
.in
);
1092 struct cmsghdr
*cmsg
;
1093 struct in_pktinfo
*pi
;
1097 mh
.msg_control
= &control
;
1098 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in_pktinfo
));
1100 cmsg
= CMSG_FIRSTHDR(&mh
);
1101 cmsg
->cmsg_len
= mh
.msg_controllen
;
1102 cmsg
->cmsg_level
= IPPROTO_IP
;
1103 cmsg
->cmsg_type
= IP_PKTINFO
;
1105 pi
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
1106 pi
->ipi_ifindex
= ifindex
;
1109 return sendmsg_loop(fd
, &mh
, 0);
1112 static int manager_ipv6_send(Manager
*m
, int fd
, int ifindex
, const struct in6_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
1113 union sockaddr_union sa
= {
1114 .in6
.sin6_family
= AF_INET6
,
1117 struct cmsghdr header
; /* For alignment */
1118 uint8_t buffer
[CMSG_SPACE(sizeof(struct in6_pktinfo
))];
1120 struct msghdr mh
= {};
1129 iov
.iov_base
= DNS_PACKET_DATA(p
);
1130 iov
.iov_len
= p
->size
;
1132 sa
.in6
.sin6_addr
= *addr
;
1133 sa
.in6
.sin6_port
= htobe16(port
),
1134 sa
.in6
.sin6_scope_id
= ifindex
;
1138 mh
.msg_name
= &sa
.sa
;
1139 mh
.msg_namelen
= sizeof(sa
.in6
);
1142 struct cmsghdr
*cmsg
;
1143 struct in6_pktinfo
*pi
;
1147 mh
.msg_control
= &control
;
1148 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in6_pktinfo
));
1150 cmsg
= CMSG_FIRSTHDR(&mh
);
1151 cmsg
->cmsg_len
= mh
.msg_controllen
;
1152 cmsg
->cmsg_level
= IPPROTO_IPV6
;
1153 cmsg
->cmsg_type
= IPV6_PKTINFO
;
1155 pi
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
1156 pi
->ipi6_ifindex
= ifindex
;
1159 return sendmsg_loop(fd
, &mh
, 0);
1162 int manager_send(Manager
*m
, int fd
, int ifindex
, int family
, const union in_addr_union
*addr
, uint16_t port
, DnsPacket
*p
) {
1169 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
));
1171 if (family
== AF_INET
)
1172 return manager_ipv4_send(m
, fd
, ifindex
, &addr
->in
, port
, p
);
1173 else if (family
== AF_INET6
)
1174 return manager_ipv6_send(m
, fd
, ifindex
, &addr
->in6
, port
, p
);
1176 return -EAFNOSUPPORT
;
1179 DnsServer
* manager_find_dns_server(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1185 LIST_FOREACH(servers
, s
, m
->dns_servers
)
1186 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
) > 0)
1189 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
)
1190 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
) > 0)
1196 DnsServer
*manager_set_dns_server(Manager
*m
, DnsServer
*s
) {
1199 if (m
->current_dns_server
== s
)
1203 _cleanup_free_
char *ip
= NULL
;
1205 in_addr_to_string(s
->family
, &s
->address
, &ip
);
1206 log_info("Switching to system DNS server %s.", strna(ip
));
1209 m
->current_dns_server
= s
;
1211 if (m
->unicast_scope
)
1212 dns_cache_flush(&m
->unicast_scope
->cache
);
1217 DnsServer
*manager_get_dns_server(Manager
*m
) {
1221 /* Try to read updates resolv.conf */
1222 manager_read_resolv_conf(m
);
1224 if (!m
->current_dns_server
)
1225 manager_set_dns_server(m
, m
->dns_servers
);
1227 if (!m
->current_dns_server
) {
1231 /* No DNS servers configured, let's see if there are
1232 * any on any links. If not, we use the fallback
1235 HASHMAP_FOREACH(l
, m
->links
, i
)
1236 if (l
->dns_servers
) {
1242 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1245 return m
->current_dns_server
;
1248 void manager_next_dns_server(Manager
*m
) {
1251 /* If there's currently no DNS server set, then the next
1252 * manager_get_dns_server() will find one */
1253 if (!m
->current_dns_server
)
1256 /* Change to the next one */
1257 if (m
->current_dns_server
->servers_next
) {
1258 manager_set_dns_server(m
, m
->current_dns_server
->servers_next
);
1262 /* If there was no next one, then start from the beginning of
1264 if (m
->current_dns_server
->type
== DNS_SERVER_FALLBACK
)
1265 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1267 manager_set_dns_server(m
, m
->dns_servers
);
1270 uint32_t manager_find_mtu(Manager
*m
) {
1275 /* If we don't know on which link a DNS packet would be
1276 * delivered, let's find the largest MTU that works on all
1277 * interfaces we know of */
1279 HASHMAP_FOREACH(l
, m
->links
, i
) {
1283 if (mtu
<= 0 || l
->mtu
< mtu
)
1290 int manager_find_ifindex(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1295 a
= manager_find_link_address(m
, family
, in_addr
);
1297 return a
->link
->ifindex
;
1302 void manager_refresh_rrs(Manager
*m
) {
1308 m
->llmnr_host_ipv4_key
= dns_resource_key_unref(m
->llmnr_host_ipv4_key
);
1309 m
->llmnr_host_ipv6_key
= dns_resource_key_unref(m
->llmnr_host_ipv6_key
);
1311 HASHMAP_FOREACH(l
, m
->links
, i
) {
1312 link_add_rrs(l
, true);
1313 link_add_rrs(l
, false);
1317 int manager_next_hostname(Manager
*m
) {
1325 p
= strchr(m
->llmnr_hostname
, 0);
1328 while (p
> m
->llmnr_hostname
) {
1329 if (!strchr("0123456789", p
[-1]))
1335 if (*p
== 0 || safe_atou64(p
, &u
) < 0 || u
<= 0)
1338 /* Add a random number to the old value. This way we can avoid
1339 * that two hosts pick the same hostname, win on IPv4 and lose
1340 * on IPv6 (or vice versa), and pick the same hostname
1341 * replacement hostname, ad infinitum. We still want the
1342 * numbers to go up monotonically, hence we just add a random
1345 random_bytes(&a
, sizeof(a
));
1348 if (asprintf(&h
, "%.*s%" PRIu64
, (int) (p
- m
->llmnr_hostname
), m
->llmnr_hostname
, u
) < 0)
1351 r
= dns_name_concat(h
, "local", &k
);
1357 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m
->llmnr_hostname
, h
);
1359 free(m
->llmnr_hostname
);
1360 m
->llmnr_hostname
= h
;
1362 free(m
->mdns_hostname
);
1363 m
->mdns_hostname
= k
;
1365 manager_refresh_rrs(m
);
1370 LinkAddress
* manager_find_link_address(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1376 HASHMAP_FOREACH(l
, m
->links
, i
) {
1379 a
= link_find_address(l
, family
, in_addr
);
1387 bool manager_our_packet(Manager
*m
, DnsPacket
*p
) {
1391 return !!manager_find_link_address(m
, p
->family
, &p
->sender
);
1394 DnsScope
* manager_find_scope(Manager
*m
, DnsPacket
*p
) {
1400 l
= hashmap_get(m
->links
, INT_TO_PTR(p
->ifindex
));
1404 if (p
->protocol
== DNS_PROTOCOL_LLMNR
) {
1405 if (p
->family
== AF_INET
)
1406 return l
->llmnr_ipv4_scope
;
1407 else if (p
->family
== AF_INET6
)
1408 return l
->llmnr_ipv6_scope
;
1414 void manager_verify_all(Manager
*m
) {
1419 LIST_FOREACH(scopes
, s
, m
->dns_scopes
)
1420 dns_zone_verify_all(&s
->zone
);
1423 void manager_flush_dns_servers(Manager
*m
, DnsServerType t
) {
1428 if (t
== DNS_SERVER_SYSTEM
)
1429 while (m
->dns_servers
) {
1432 LIST_REMOVE(servers
, m
->dns_servers
, s
);
1433 dns_server_unref(s
);
1436 if (t
== DNS_SERVER_FALLBACK
)
1437 while (m
->fallback_dns_servers
) {
1438 s
= m
->fallback_dns_servers
;
1440 LIST_REMOVE(servers
, m
->fallback_dns_servers
, s
);
1441 dns_server_unref(s
);
1445 int manager_is_own_hostname(Manager
*m
, const char *name
) {
1451 if (m
->llmnr_hostname
) {
1452 r
= dns_name_equal(name
, m
->llmnr_hostname
);
1457 if (m
->mdns_hostname
)
1458 return dns_name_equal(name
, m
->mdns_hostname
);
1463 static const char* const support_table
[_SUPPORT_MAX
] = {
1464 [SUPPORT_NO
] = "no",
1465 [SUPPORT_YES
] = "yes",
1466 [SUPPORT_RESOLVE
] = "resolve",
1468 DEFINE_STRING_TABLE_LOOKUP(support
, Support
);