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 "dns-domain.h"
30 #include "fileio-label.h"
31 #include "hostname-util.h"
33 #include "netlink-util.h"
34 #include "network-internal.h"
35 #include "ordered-set.h"
36 #include "parse-util.h"
37 #include "random-util.h"
38 #include "resolved-bus.h"
39 #include "resolved-conf.h"
40 #include "resolved-llmnr.h"
41 #include "resolved-manager.h"
42 #include "socket-util.h"
43 #include "string-table.h"
44 #include "string-util.h"
47 #define SEND_TIMEOUT_USEC (200 * USEC_PER_MSEC)
49 static int manager_process_link(sd_netlink
*rtnl
, sd_netlink_message
*mm
, void *userdata
) {
50 Manager
*m
= userdata
;
59 r
= sd_netlink_message_get_type(mm
, &type
);
63 r
= sd_rtnl_message_link_get_ifindex(mm
, &ifindex
);
67 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
75 r
= link_new(m
, &l
, ifindex
);
80 r
= link_update_rtnl(l
, mm
);
84 r
= link_update_monitor(l
);
89 log_debug("Found new link %i/%s", ifindex
, l
->name
);
96 log_debug("Removing link %i/%s", l
->ifindex
, l
->name
);
106 log_warning_errno(r
, "Failed to process RTNL link message: %m");
110 static int manager_process_address(sd_netlink
*rtnl
, sd_netlink_message
*mm
, void *userdata
) {
111 Manager
*m
= userdata
;
112 union in_addr_union address
;
114 int r
, ifindex
, family
;
122 r
= sd_netlink_message_get_type(mm
, &type
);
126 r
= sd_rtnl_message_addr_get_ifindex(mm
, &ifindex
);
130 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
134 r
= sd_rtnl_message_addr_get_family(mm
, &family
);
141 r
= sd_netlink_message_read_in_addr(mm
, IFA_LOCAL
, &address
.in
);
143 r
= sd_netlink_message_read_in_addr(mm
, IFA_ADDRESS
, &address
.in
);
151 r
= sd_netlink_message_read_in6_addr(mm
, IFA_LOCAL
, &address
.in6
);
153 r
= sd_netlink_message_read_in6_addr(mm
, IFA_ADDRESS
, &address
.in6
);
164 a
= link_find_address(l
, family
, &address
);
171 r
= link_address_new(l
, &a
, family
, &address
);
176 r
= link_address_update_rtnl(a
, mm
);
183 link_address_free(a
);
190 log_warning_errno(r
, "Failed to process RTNL address message: %m");
194 static int manager_rtnl_listen(Manager
*m
) {
195 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
, *reply
= NULL
;
196 sd_netlink_message
*i
;
201 /* First, subscribe to interfaces coming and going */
202 r
= sd_netlink_open(&m
->rtnl
);
206 r
= sd_netlink_attach_event(m
->rtnl
, m
->event
, 0);
210 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWLINK
, manager_process_link
, m
);
214 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELLINK
, manager_process_link
, m
);
218 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWADDR
, manager_process_address
, m
);
222 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELADDR
, manager_process_address
, m
);
226 /* Then, enumerate all links */
227 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
231 r
= sd_netlink_message_request_dump(req
, true);
235 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
239 for (i
= reply
; i
; i
= sd_netlink_message_next(i
)) {
240 r
= manager_process_link(m
->rtnl
, i
, m
);
245 req
= sd_netlink_message_unref(req
);
246 reply
= sd_netlink_message_unref(reply
);
248 /* Finally, enumerate all addresses, too */
249 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, AF_UNSPEC
);
253 r
= sd_netlink_message_request_dump(req
, true);
257 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
261 for (i
= reply
; i
; i
= sd_netlink_message_next(i
)) {
262 r
= manager_process_address(m
->rtnl
, i
, m
);
270 static int on_network_event(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
271 Manager
*m
= userdata
;
278 sd_network_monitor_flush(m
->network_monitor
);
280 HASHMAP_FOREACH(l
, m
->links
, i
) {
281 r
= link_update_monitor(l
);
283 log_warning_errno(r
, "Failed to update monitor information for %i: %m", l
->ifindex
);
286 r
= manager_write_resolv_conf(m
);
288 log_warning_errno(r
, "Could not update resolv.conf: %m");
293 static int manager_network_monitor_listen(Manager
*m
) {
298 r
= sd_network_monitor_new(&m
->network_monitor
, NULL
);
302 fd
= sd_network_monitor_get_fd(m
->network_monitor
);
306 events
= sd_network_monitor_get_events(m
->network_monitor
);
310 r
= sd_event_add_io(m
->event
, &m
->network_event_source
, fd
, events
, &on_network_event
, m
);
317 static int determine_hostname(char **llmnr_hostname
, char **mdns_hostname
) {
318 _cleanup_free_
char *h
= NULL
, *n
= NULL
;
319 char label
[DNS_LABEL_MAX
];
323 assert(llmnr_hostname
);
324 assert(mdns_hostname
);
326 /* Extract and normalize the first label of the locally
327 * configured hostname, and check it's not "localhost". */
329 h
= gethostname_malloc();
334 r
= dns_label_unescape(&p
, label
, sizeof(label
));
336 return log_error_errno(r
, "Failed to unescape host name: %m");
338 log_error("Couldn't find a single label in hosntame.");
342 k
= dns_label_undo_idna(label
, r
, label
, sizeof(label
));
344 return log_error_errno(k
, "Failed to undo IDNA: %m");
348 if (!utf8_is_valid(label
)) {
349 log_error("System hostname is not UTF-8 clean.");
353 r
= dns_label_escape(label
, r
, &n
);
355 return log_error_errno(r
, "Failed to escape host name: %m");
357 if (is_localhost(n
)) {
358 log_debug("System hostname is 'localhost', ignoring.");
362 r
= dns_name_concat(n
, "local", mdns_hostname
);
364 return log_error_errno(r
, "Failed to determine mDNS hostname: %m");
372 static int on_hostname_change(sd_event_source
*es
, int fd
, uint32_t revents
, void *userdata
) {
373 _cleanup_free_
char *llmnr_hostname
= NULL
, *mdns_hostname
= NULL
;
374 Manager
*m
= userdata
;
379 r
= determine_hostname(&llmnr_hostname
, &mdns_hostname
);
381 return 0; /* ignore invalid hostnames */
383 if (streq(llmnr_hostname
, m
->llmnr_hostname
) && streq(mdns_hostname
, m
->mdns_hostname
))
386 log_info("System hostname changed to '%s'.", llmnr_hostname
);
388 free(m
->llmnr_hostname
);
389 free(m
->mdns_hostname
);
391 m
->llmnr_hostname
= llmnr_hostname
;
392 m
->mdns_hostname
= mdns_hostname
;
394 llmnr_hostname
= mdns_hostname
= NULL
;
396 manager_refresh_rrs(m
);
401 static int manager_watch_hostname(Manager
*m
) {
406 m
->hostname_fd
= open("/proc/sys/kernel/hostname", O_RDONLY
|O_CLOEXEC
|O_NDELAY
|O_NOCTTY
);
407 if (m
->hostname_fd
< 0) {
408 log_warning_errno(errno
, "Failed to watch hostname: %m");
412 r
= sd_event_add_io(m
->event
, &m
->hostname_event_source
, m
->hostname_fd
, 0, on_hostname_change
, m
);
415 /* kernels prior to 3.2 don't support polling this file. Ignore the failure. */
416 m
->hostname_fd
= safe_close(m
->hostname_fd
);
418 return log_error_errno(r
, "Failed to add hostname event source: %m");
421 r
= determine_hostname(&m
->llmnr_hostname
, &m
->mdns_hostname
);
423 log_info("Defaulting to hostname 'linux'.");
424 m
->llmnr_hostname
= strdup("linux");
425 if (!m
->llmnr_hostname
)
428 m
->mdns_hostname
= strdup("linux.local");
429 if (!m
->mdns_hostname
)
432 log_info("Using system hostname '%s'.", m
->llmnr_hostname
);
437 static int manager_sigusr1(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
438 _cleanup_free_
char *buffer
= NULL
;
439 _cleanup_fclose_
FILE *f
= NULL
;
440 Manager
*m
= userdata
;
448 f
= open_memstream(&buffer
, &size
);
452 LIST_FOREACH(scopes
, scope
, m
->dns_scopes
)
453 dns_scope_dump(scope
, f
);
455 if (fflush_and_check(f
) < 0)
458 log_dump(LOG_INFO
, buffer
);
462 int manager_new(Manager
**ret
) {
463 _cleanup_(manager_freep
) Manager
*m
= NULL
;
468 m
= new0(Manager
, 1);
472 m
->llmnr_ipv4_udp_fd
= m
->llmnr_ipv6_udp_fd
= -1;
473 m
->llmnr_ipv4_tcp_fd
= m
->llmnr_ipv6_tcp_fd
= -1;
476 m
->llmnr_support
= SUPPORT_YES
;
477 m
->read_resolv_conf
= true;
479 r
= manager_parse_dns_server(m
, DNS_SERVER_FALLBACK
, DNS_SERVERS
);
483 r
= sd_event_default(&m
->event
);
487 sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
488 sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
490 sd_event_set_watchdog(m
->event
, true);
492 r
= manager_watch_hostname(m
);
496 r
= dns_scope_new(m
, &m
->unicast_scope
, NULL
, DNS_PROTOCOL_DNS
, AF_UNSPEC
);
500 r
= manager_network_monitor_listen(m
);
504 r
= manager_rtnl_listen(m
);
508 r
= manager_connect_bus(m
);
512 (void) sd_event_add_signal(m
->event
, &m
->sigusr1_event_source
, SIGUSR1
, manager_sigusr1
, m
);
520 int manager_start(Manager
*m
) {
525 r
= manager_llmnr_start(m
);
532 Manager
*manager_free(Manager
*m
) {
538 while ((l
= hashmap_first(m
->links
)))
541 while (m
->dns_queries
)
542 dns_query_free(m
->dns_queries
);
544 manager_flush_dns_servers(m
, DNS_SERVER_SYSTEM
);
545 manager_flush_dns_servers(m
, DNS_SERVER_FALLBACK
);
547 dns_scope_free(m
->unicast_scope
);
549 hashmap_free(m
->links
);
550 hashmap_free(m
->dns_transactions
);
552 sd_event_source_unref(m
->network_event_source
);
553 sd_network_monitor_unref(m
->network_monitor
);
555 manager_llmnr_stop(m
);
557 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
558 sd_event_source_unref(m
->bus_retry_event_source
);
559 sd_bus_unref(m
->bus
);
561 sd_event_source_unref(m
->sigusr1_event_source
);
563 sd_event_unref(m
->event
);
565 dns_resource_key_unref(m
->llmnr_host_ipv4_key
);
566 dns_resource_key_unref(m
->llmnr_host_ipv6_key
);
568 sd_event_source_unref(m
->hostname_event_source
);
569 safe_close(m
->hostname_fd
);
570 free(m
->llmnr_hostname
);
571 free(m
->mdns_hostname
);
578 int manager_read_resolv_conf(Manager
*m
) {
579 _cleanup_fclose_
FILE *f
= NULL
;
588 /* Reads the system /etc/resolv.conf, if it exists and is not
589 * symlinked to our own resolv.conf instance */
591 if (!m
->read_resolv_conf
)
594 r
= stat("/etc/resolv.conf", &st
);
597 log_warning_errno(errno
, "Failed to open /etc/resolv.conf: %m");
602 /* Have we already seen the file? */
603 t
= timespec_load(&st
.st_mtim
);
604 if (t
== m
->resolv_conf_mtime
)
607 m
->resolv_conf_mtime
= t
;
609 /* Is it symlinked to our own file? */
610 if (stat("/run/systemd/resolve/resolv.conf", &own
) >= 0 &&
611 st
.st_dev
== own
.st_dev
&&
612 st
.st_ino
== own
.st_ino
) {
617 f
= fopen("/etc/resolv.conf", "re");
620 log_warning_errno(errno
, "Failed to open /etc/resolv.conf: %m");
625 if (fstat(fileno(f
), &st
) < 0) {
626 r
= log_error_errno(errno
, "Failed to stat open file: %m");
630 LIST_FOREACH(servers
, s
, m
->dns_servers
)
633 FOREACH_LINE(line
, f
, r
= -errno
; goto clear
) {
634 union in_addr_union address
;
642 if (*l
== '#' || *l
== ';')
645 a
= first_word(l
, "nameserver");
649 r
= in_addr_from_string_auto(a
, &family
, &address
);
651 log_warning("Failed to parse name server %s.", a
);
655 LIST_FOREACH(servers
, s
, m
->dns_servers
)
656 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, &address
) > 0)
662 r
= dns_server_new(m
, NULL
, DNS_SERVER_SYSTEM
, NULL
, family
, &address
);
668 LIST_FOREACH_SAFE(servers
, s
, nx
, m
->dns_servers
)
670 LIST_REMOVE(servers
, m
->dns_servers
, s
);
674 /* Whenever /etc/resolv.conf changes, start using the first
675 * DNS server of it. This is useful to deal with broken
676 * network managing implementations (like NetworkManager),
677 * that when connecting to a VPN place both the VPN DNS
678 * servers and the local ones in /etc/resolv.conf. Without
679 * resetting the DNS server to use back to the first entry we
680 * will continue to use the local one thus being unable to
681 * resolve VPN domains. */
682 manager_set_dns_server(m
, m
->dns_servers
);
687 while (m
->dns_servers
) {
690 LIST_REMOVE(servers
, m
->dns_servers
, s
);
697 static void write_resolv_conf_server(DnsServer
*s
, FILE *f
, unsigned *count
) {
698 _cleanup_free_
char *t
= NULL
;
705 r
= in_addr_to_string(s
->family
, &s
->address
, &t
);
707 log_warning_errno(r
, "Invalid DNS address. Ignoring: %m");
712 fputs("# Too many DNS servers configured, the following entries may be ignored.\n", f
);
714 fprintf(f
, "nameserver %s\n", t
);
718 static void write_resolv_conf_search(
719 const char *domain
, FILE *f
,
727 if (*count
>= MAXDNSRCH
||
728 *length
+ strlen(domain
) > 256) {
729 if (*count
== MAXDNSRCH
)
730 fputs(" # Too many search domains configured, remaining ones ignored.", f
);
732 fputs(" # Total length of all search domains is too long, remaining ones ignored.", f
);
737 fprintf(f
, " %s", domain
);
739 (*length
) += strlen(domain
);
743 static int write_resolv_conf_contents(FILE *f
, OrderedSet
*dns
, OrderedSet
*domains
) {
746 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
747 "# Third party programs must not access this file directly, but\n"
748 "# only through the symlink at /etc/resolv.conf. To manage\n"
749 "# resolv.conf(5) in a different way, replace the symlink by a\n"
750 "# static file or a different symlink.\n\n", f
);
752 if (ordered_set_isempty(dns
))
753 fputs("# No DNS servers known.\n", f
);
758 ORDERED_SET_FOREACH(s
, dns
, i
)
759 write_resolv_conf_server(s
, f
, &count
);
762 if (!ordered_set_isempty(domains
)) {
763 unsigned length
= 0, count
= 0;
767 ORDERED_SET_FOREACH(domain
, domains
, i
)
768 write_resolv_conf_search(domain
, f
, &count
, &length
);
772 return fflush_and_check(f
);
775 int manager_write_resolv_conf(Manager
*m
) {
776 static const char path
[] = "/run/systemd/resolve/resolv.conf";
777 _cleanup_free_
char *temp_path
= NULL
;
778 _cleanup_fclose_
FILE *f
= NULL
;
779 _cleanup_ordered_set_free_ OrderedSet
*dns
= NULL
, *domains
= NULL
;
787 /* Read the system /etc/resolv.conf first */
788 manager_read_resolv_conf(m
);
790 /* Add the full list to a set, to filter out duplicates */
791 dns
= ordered_set_new(&dns_server_hash_ops
);
795 domains
= ordered_set_new(&dns_name_hash_ops
);
799 /* First add the system-wide servers */
800 LIST_FOREACH(servers
, s
, m
->dns_servers
) {
801 r
= ordered_set_put(dns
, s
);
808 /* Then, add the per-link servers and domains */
809 HASHMAP_FOREACH(l
, m
->links
, i
) {
812 LIST_FOREACH(servers
, s
, l
->dns_servers
) {
813 r
= ordered_set_put(dns
, s
);
820 if (!l
->unicast_scope
)
823 STRV_FOREACH(domain
, l
->unicast_scope
->domains
) {
824 r
= ordered_set_put(domains
, *domain
);
832 /* If we found nothing, add the fallback servers */
833 if (ordered_set_isempty(dns
)) {
834 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
) {
835 r
= ordered_set_put(dns
, s
);
843 r
= fopen_temporary_label(path
, path
, &f
, &temp_path
);
847 fchmod(fileno(f
), 0644);
849 r
= write_resolv_conf_contents(f
, dns
, domains
);
853 if (rename(temp_path
, path
) < 0) {
862 (void) unlink(temp_path
);
866 int manager_recv(Manager
*m
, int fd
, DnsProtocol protocol
, DnsPacket
**ret
) {
867 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
869 struct cmsghdr header
; /* For alignment */
870 uint8_t buffer
[CMSG_SPACE(MAXSIZE(struct in_pktinfo
, struct in6_pktinfo
))
871 + CMSG_SPACE(int) /* ttl/hoplimit */
872 + EXTRA_CMSG_SPACE
/* kernel appears to require extra buffer space */];
874 union sockaddr_union sa
;
875 struct msghdr mh
= {};
876 struct cmsghdr
*cmsg
;
885 r
= ioctl(fd
, FIONREAD
, &ms
);
891 r
= dns_packet_new(&p
, protocol
, ms
);
895 iov
.iov_base
= DNS_PACKET_DATA(p
);
896 iov
.iov_len
= p
->allocated
;
898 mh
.msg_name
= &sa
.sa
;
899 mh
.msg_namelen
= sizeof(sa
);
902 mh
.msg_control
= &control
;
903 mh
.msg_controllen
= sizeof(control
);
905 l
= recvmsg(fd
, &mh
, 0);
907 if (errno
== EAGAIN
|| errno
== EINTR
)
916 assert(!(mh
.msg_flags
& MSG_CTRUNC
));
917 assert(!(mh
.msg_flags
& MSG_TRUNC
));
919 p
->size
= (size_t) l
;
921 p
->family
= sa
.sa
.sa_family
;
922 p
->ipproto
= IPPROTO_UDP
;
923 if (p
->family
== AF_INET
) {
924 p
->sender
.in
= sa
.in
.sin_addr
;
925 p
->sender_port
= be16toh(sa
.in
.sin_port
);
926 } else if (p
->family
== AF_INET6
) {
927 p
->sender
.in6
= sa
.in6
.sin6_addr
;
928 p
->sender_port
= be16toh(sa
.in6
.sin6_port
);
929 p
->ifindex
= sa
.in6
.sin6_scope_id
;
931 return -EAFNOSUPPORT
;
933 CMSG_FOREACH(cmsg
, &mh
) {
935 if (cmsg
->cmsg_level
== IPPROTO_IPV6
) {
936 assert(p
->family
== AF_INET6
);
938 switch (cmsg
->cmsg_type
) {
941 struct in6_pktinfo
*i
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
944 p
->ifindex
= i
->ipi6_ifindex
;
946 p
->destination
.in6
= i
->ipi6_addr
;
951 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
955 } else if (cmsg
->cmsg_level
== IPPROTO_IP
) {
956 assert(p
->family
== AF_INET
);
958 switch (cmsg
->cmsg_type
) {
961 struct in_pktinfo
*i
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
964 p
->ifindex
= i
->ipi_ifindex
;
966 p
->destination
.in
= i
->ipi_addr
;
971 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
977 /* The Linux kernel sets the interface index to the loopback
978 * device if the packet came from the local host since it
979 * avoids the routing table in such a case. Let's unset the
980 * interface index in such a case. */
981 if (p
->ifindex
== LOOPBACK_IFINDEX
)
984 if (protocol
!= DNS_PROTOCOL_DNS
) {
985 /* If we don't know the interface index still, we look for the
986 * first local interface with a matching address. Yuck! */
988 p
->ifindex
= manager_find_ifindex(m
, p
->family
, &p
->destination
);
997 static int sendmsg_loop(int fd
, struct msghdr
*mh
, int flags
) {
1004 if (sendmsg(fd
, mh
, flags
) >= 0)
1010 if (errno
!= EAGAIN
)
1013 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
1021 static int write_loop(int fd
, void *message
, size_t length
) {
1028 if (write(fd
, message
, length
) >= 0)
1034 if (errno
!= EAGAIN
)
1037 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
1045 int manager_write(Manager
*m
, int fd
, DnsPacket
*p
) {
1048 log_debug("Sending %s packet with id %u", DNS_PACKET_QR(p
) ? "response" : "query", DNS_PACKET_ID(p
));
1050 r
= write_loop(fd
, DNS_PACKET_DATA(p
), p
->size
);
1057 static int manager_ipv4_send(Manager
*m
, int fd
, int ifindex
, const struct in_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
1058 union sockaddr_union sa
= {
1059 .in
.sin_family
= AF_INET
,
1062 struct cmsghdr header
; /* For alignment */
1063 uint8_t buffer
[CMSG_SPACE(sizeof(struct in_pktinfo
))];
1065 struct msghdr mh
= {};
1074 iov
.iov_base
= DNS_PACKET_DATA(p
);
1075 iov
.iov_len
= p
->size
;
1077 sa
.in
.sin_addr
= *addr
;
1078 sa
.in
.sin_port
= htobe16(port
),
1082 mh
.msg_name
= &sa
.sa
;
1083 mh
.msg_namelen
= sizeof(sa
.in
);
1086 struct cmsghdr
*cmsg
;
1087 struct in_pktinfo
*pi
;
1091 mh
.msg_control
= &control
;
1092 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in_pktinfo
));
1094 cmsg
= CMSG_FIRSTHDR(&mh
);
1095 cmsg
->cmsg_len
= mh
.msg_controllen
;
1096 cmsg
->cmsg_level
= IPPROTO_IP
;
1097 cmsg
->cmsg_type
= IP_PKTINFO
;
1099 pi
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
1100 pi
->ipi_ifindex
= ifindex
;
1103 return sendmsg_loop(fd
, &mh
, 0);
1106 static int manager_ipv6_send(Manager
*m
, int fd
, int ifindex
, const struct in6_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
1107 union sockaddr_union sa
= {
1108 .in6
.sin6_family
= AF_INET6
,
1111 struct cmsghdr header
; /* For alignment */
1112 uint8_t buffer
[CMSG_SPACE(sizeof(struct in6_pktinfo
))];
1114 struct msghdr mh
= {};
1123 iov
.iov_base
= DNS_PACKET_DATA(p
);
1124 iov
.iov_len
= p
->size
;
1126 sa
.in6
.sin6_addr
= *addr
;
1127 sa
.in6
.sin6_port
= htobe16(port
),
1128 sa
.in6
.sin6_scope_id
= ifindex
;
1132 mh
.msg_name
= &sa
.sa
;
1133 mh
.msg_namelen
= sizeof(sa
.in6
);
1136 struct cmsghdr
*cmsg
;
1137 struct in6_pktinfo
*pi
;
1141 mh
.msg_control
= &control
;
1142 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in6_pktinfo
));
1144 cmsg
= CMSG_FIRSTHDR(&mh
);
1145 cmsg
->cmsg_len
= mh
.msg_controllen
;
1146 cmsg
->cmsg_level
= IPPROTO_IPV6
;
1147 cmsg
->cmsg_type
= IPV6_PKTINFO
;
1149 pi
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
1150 pi
->ipi6_ifindex
= ifindex
;
1153 return sendmsg_loop(fd
, &mh
, 0);
1156 int manager_send(Manager
*m
, int fd
, int ifindex
, int family
, const union in_addr_union
*addr
, uint16_t port
, DnsPacket
*p
) {
1163 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
));
1165 if (family
== AF_INET
)
1166 return manager_ipv4_send(m
, fd
, ifindex
, &addr
->in
, port
, p
);
1167 else if (family
== AF_INET6
)
1168 return manager_ipv6_send(m
, fd
, ifindex
, &addr
->in6
, port
, p
);
1170 return -EAFNOSUPPORT
;
1173 DnsServer
* manager_find_dns_server(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1179 LIST_FOREACH(servers
, s
, m
->dns_servers
)
1180 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
) > 0)
1183 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
)
1184 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
) > 0)
1190 DnsServer
*manager_set_dns_server(Manager
*m
, DnsServer
*s
) {
1193 if (m
->current_dns_server
== s
)
1197 _cleanup_free_
char *ip
= NULL
;
1199 in_addr_to_string(s
->family
, &s
->address
, &ip
);
1200 log_info("Switching to system DNS server %s.", strna(ip
));
1203 m
->current_dns_server
= s
;
1205 if (m
->unicast_scope
)
1206 dns_cache_flush(&m
->unicast_scope
->cache
);
1211 DnsServer
*manager_get_dns_server(Manager
*m
) {
1215 /* Try to read updates resolv.conf */
1216 manager_read_resolv_conf(m
);
1218 if (!m
->current_dns_server
)
1219 manager_set_dns_server(m
, m
->dns_servers
);
1221 if (!m
->current_dns_server
) {
1225 /* No DNS servers configured, let's see if there are
1226 * any on any links. If not, we use the fallback
1229 HASHMAP_FOREACH(l
, m
->links
, i
)
1230 if (l
->dns_servers
) {
1236 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1239 return m
->current_dns_server
;
1242 void manager_next_dns_server(Manager
*m
) {
1245 /* If there's currently no DNS server set, then the next
1246 * manager_get_dns_server() will find one */
1247 if (!m
->current_dns_server
)
1250 /* Change to the next one */
1251 if (m
->current_dns_server
->servers_next
) {
1252 manager_set_dns_server(m
, m
->current_dns_server
->servers_next
);
1256 /* If there was no next one, then start from the beginning of
1258 if (m
->current_dns_server
->type
== DNS_SERVER_FALLBACK
)
1259 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1261 manager_set_dns_server(m
, m
->dns_servers
);
1264 uint32_t manager_find_mtu(Manager
*m
) {
1269 /* If we don't know on which link a DNS packet would be
1270 * delivered, let's find the largest MTU that works on all
1271 * interfaces we know of */
1273 HASHMAP_FOREACH(l
, m
->links
, i
) {
1277 if (mtu
<= 0 || l
->mtu
< mtu
)
1284 int manager_find_ifindex(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1289 a
= manager_find_link_address(m
, family
, in_addr
);
1291 return a
->link
->ifindex
;
1296 void manager_refresh_rrs(Manager
*m
) {
1302 m
->llmnr_host_ipv4_key
= dns_resource_key_unref(m
->llmnr_host_ipv4_key
);
1303 m
->llmnr_host_ipv6_key
= dns_resource_key_unref(m
->llmnr_host_ipv6_key
);
1305 HASHMAP_FOREACH(l
, m
->links
, i
) {
1306 link_add_rrs(l
, true);
1307 link_add_rrs(l
, false);
1311 int manager_next_hostname(Manager
*m
) {
1319 p
= strchr(m
->llmnr_hostname
, 0);
1322 while (p
> m
->llmnr_hostname
) {
1323 if (!strchr("0123456789", p
[-1]))
1329 if (*p
== 0 || safe_atou64(p
, &u
) < 0 || u
<= 0)
1332 /* Add a random number to the old value. This way we can avoid
1333 * that two hosts pick the same hostname, win on IPv4 and lose
1334 * on IPv6 (or vice versa), and pick the same hostname
1335 * replacement hostname, ad infinitum. We still want the
1336 * numbers to go up monotonically, hence we just add a random
1339 random_bytes(&a
, sizeof(a
));
1342 if (asprintf(&h
, "%.*s%" PRIu64
, (int) (p
- m
->llmnr_hostname
), m
->llmnr_hostname
, u
) < 0)
1345 r
= dns_name_concat(h
, "local", &k
);
1351 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m
->llmnr_hostname
, h
);
1353 free(m
->llmnr_hostname
);
1354 m
->llmnr_hostname
= h
;
1356 free(m
->mdns_hostname
);
1357 m
->mdns_hostname
= k
;
1359 manager_refresh_rrs(m
);
1364 LinkAddress
* manager_find_link_address(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1370 HASHMAP_FOREACH(l
, m
->links
, i
) {
1373 a
= link_find_address(l
, family
, in_addr
);
1381 bool manager_our_packet(Manager
*m
, DnsPacket
*p
) {
1385 return !!manager_find_link_address(m
, p
->family
, &p
->sender
);
1388 DnsScope
* manager_find_scope(Manager
*m
, DnsPacket
*p
) {
1394 l
= hashmap_get(m
->links
, INT_TO_PTR(p
->ifindex
));
1398 if (p
->protocol
== DNS_PROTOCOL_LLMNR
) {
1399 if (p
->family
== AF_INET
)
1400 return l
->llmnr_ipv4_scope
;
1401 else if (p
->family
== AF_INET6
)
1402 return l
->llmnr_ipv6_scope
;
1408 void manager_verify_all(Manager
*m
) {
1413 LIST_FOREACH(scopes
, s
, m
->dns_scopes
)
1414 dns_zone_verify_all(&s
->zone
);
1417 void manager_flush_dns_servers(Manager
*m
, DnsServerType t
) {
1422 if (t
== DNS_SERVER_SYSTEM
)
1423 while (m
->dns_servers
) {
1426 LIST_REMOVE(servers
, m
->dns_servers
, s
);
1427 dns_server_unref(s
);
1430 if (t
== DNS_SERVER_FALLBACK
)
1431 while (m
->fallback_dns_servers
) {
1432 s
= m
->fallback_dns_servers
;
1434 LIST_REMOVE(servers
, m
->fallback_dns_servers
, s
);
1435 dns_server_unref(s
);
1439 int manager_is_own_hostname(Manager
*m
, const char *name
) {
1445 if (m
->llmnr_hostname
) {
1446 r
= dns_name_equal(name
, m
->llmnr_hostname
);
1451 if (m
->mdns_hostname
)
1452 return dns_name_equal(name
, m
->mdns_hostname
);
1457 static const char* const support_table
[_SUPPORT_MAX
] = {
1458 [SUPPORT_NO
] = "no",
1459 [SUPPORT_YES
] = "yes",
1460 [SUPPORT_RESOLVE
] = "resolve",
1462 DEFINE_STRING_TABLE_LOOKUP(support
, Support
);