1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2014 Tom Gundersen <teg@jklm.no>
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21 #include <netinet/in.h>
23 #include <sys/ioctl.h>
30 #include "alloc-util.h"
31 #include "dirent-util.h"
32 #include "dns-domain.h"
34 #include "fileio-label.h"
35 #include "hostname-util.h"
37 #include "netlink-util.h"
38 #include "network-internal.h"
39 #include "ordered-set.h"
40 #include "parse-util.h"
41 #include "random-util.h"
42 #include "resolved-bus.h"
43 #include "resolved-conf.h"
44 #include "resolved-dns-stub.h"
45 #include "resolved-etc-hosts.h"
46 #include "resolved-llmnr.h"
47 #include "resolved-manager.h"
48 #include "resolved-mdns.h"
49 #include "resolved-resolv-conf.h"
50 #include "socket-util.h"
51 #include "string-table.h"
52 #include "string-util.h"
55 #define SEND_TIMEOUT_USEC (200 * USEC_PER_MSEC)
57 static int manager_process_link(sd_netlink
*rtnl
, sd_netlink_message
*mm
, void *userdata
) {
58 Manager
*m
= userdata
;
67 r
= sd_netlink_message_get_type(mm
, &type
);
71 r
= sd_rtnl_message_link_get_ifindex(mm
, &ifindex
);
75 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
83 r
= link_new(m
, &l
, ifindex
);
88 r
= link_process_rtnl(l
, mm
);
97 log_debug("Found new link %i/%s", ifindex
, l
->name
);
104 log_debug("Removing link %i/%s", l
->ifindex
, l
->name
);
115 log_warning_errno(r
, "Failed to process RTNL link message: %m");
119 static int manager_process_address(sd_netlink
*rtnl
, sd_netlink_message
*mm
, void *userdata
) {
120 Manager
*m
= userdata
;
121 union in_addr_union address
;
123 int r
, ifindex
, family
;
131 r
= sd_netlink_message_get_type(mm
, &type
);
135 r
= sd_rtnl_message_addr_get_ifindex(mm
, &ifindex
);
139 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
143 r
= sd_rtnl_message_addr_get_family(mm
, &family
);
150 r
= sd_netlink_message_read_in_addr(mm
, IFA_LOCAL
, &address
.in
);
152 r
= sd_netlink_message_read_in_addr(mm
, IFA_ADDRESS
, &address
.in
);
160 r
= sd_netlink_message_read_in6_addr(mm
, IFA_LOCAL
, &address
.in6
);
162 r
= sd_netlink_message_read_in6_addr(mm
, IFA_ADDRESS
, &address
.in6
);
173 a
= link_find_address(l
, family
, &address
);
180 r
= link_address_new(l
, &a
, family
, &address
);
185 r
= link_address_update_rtnl(a
, mm
);
192 link_address_free(a
);
199 log_warning_errno(r
, "Failed to process RTNL address message: %m");
203 static int manager_rtnl_listen(Manager
*m
) {
204 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
205 sd_netlink_message
*i
;
210 /* First, subscribe to interfaces coming and going */
211 r
= sd_netlink_open(&m
->rtnl
);
215 r
= sd_netlink_attach_event(m
->rtnl
, m
->event
, SD_EVENT_PRIORITY_IMPORTANT
);
219 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWLINK
, manager_process_link
, m
);
223 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELLINK
, manager_process_link
, m
);
227 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWADDR
, manager_process_address
, m
);
231 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELADDR
, manager_process_address
, m
);
235 /* Then, enumerate all links */
236 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
240 r
= sd_netlink_message_request_dump(req
, true);
244 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
248 for (i
= reply
; i
; i
= sd_netlink_message_next(i
)) {
249 r
= manager_process_link(m
->rtnl
, i
, m
);
254 req
= sd_netlink_message_unref(req
);
255 reply
= sd_netlink_message_unref(reply
);
257 /* Finally, enumerate all addresses, too */
258 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, AF_UNSPEC
);
262 r
= sd_netlink_message_request_dump(req
, true);
266 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
270 for (i
= reply
; i
; i
= sd_netlink_message_next(i
)) {
271 r
= manager_process_address(m
->rtnl
, i
, m
);
279 static int on_network_event(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
280 Manager
*m
= userdata
;
287 sd_network_monitor_flush(m
->network_monitor
);
289 HASHMAP_FOREACH(l
, m
->links
, i
) {
292 log_warning_errno(r
, "Failed to update monitor information for %i: %m", l
->ifindex
);
295 (void) manager_write_resolv_conf(m
);
300 static int manager_network_monitor_listen(Manager
*m
) {
305 r
= sd_network_monitor_new(&m
->network_monitor
, NULL
);
309 fd
= sd_network_monitor_get_fd(m
->network_monitor
);
313 events
= sd_network_monitor_get_events(m
->network_monitor
);
317 r
= sd_event_add_io(m
->event
, &m
->network_event_source
, fd
, events
, &on_network_event
, m
);
321 r
= sd_event_source_set_priority(m
->network_event_source
, SD_EVENT_PRIORITY_IMPORTANT
+5);
325 (void) sd_event_source_set_description(m
->network_event_source
, "network-monitor");
330 static int determine_hostname(char **full_hostname
, char **llmnr_hostname
, char **mdns_hostname
) {
331 _cleanup_free_
char *h
= NULL
, *n
= NULL
;
333 _cleanup_free_
char *utf8
= NULL
;
337 char label
[DNS_LABEL_MAX
];
338 const char *p
, *decoded
;
341 assert(full_hostname
);
342 assert(llmnr_hostname
);
343 assert(mdns_hostname
);
345 /* Extract and normalize the first label of the locally configured hostname, and check it's not "localhost". */
347 r
= gethostname_strict(&h
);
349 return log_debug_errno(r
, "Can't determine system hostname: %m");
352 r
= dns_label_unescape(&p
, label
, sizeof label
);
354 return log_error_errno(r
, "Failed to unescape host name: %m");
356 log_error("Couldn't find a single label in hostname.");
361 r
= idn2_to_unicode_8z8z(label
, &utf8
, 0);
363 return log_error("Failed to undo IDNA: %s", idn2_strerror(r
));
364 assert(utf8_is_valid(utf8
));
369 k
= dns_label_undo_idna(label
, r
, label
, sizeof label
);
371 return log_error_errno(k
, "Failed to undo IDNA: %m");
375 if (!utf8_is_valid(label
)) {
376 log_error("System hostname is not UTF-8 clean.");
381 decoded
= label
; /* no decoding */
384 r
= dns_label_escape_new(decoded
, r
, &n
);
386 return log_error_errno(r
, "Failed to escape host name: %m");
388 if (is_localhost(n
)) {
389 log_debug("System hostname is 'localhost', ignoring.");
393 r
= dns_name_concat(n
, "local", mdns_hostname
);
395 return log_error_errno(r
, "Failed to determine mDNS hostname: %m");
406 static const char *fallback_hostname(void) {
408 /* Determine the fall back hostname. For exposing this system to the outside world, we cannot have it to be
409 * "localhost" even if that's the compiled in hostname. In this case, let's revert to "linux" instead. */
411 if (is_localhost(FALLBACK_HOSTNAME
))
414 return FALLBACK_HOSTNAME
;
417 static int make_fallback_hostnames(char **full_hostname
, char **llmnr_hostname
, char **mdns_hostname
) {
418 _cleanup_free_
char *n
= NULL
, *m
= NULL
;
419 char label
[DNS_LABEL_MAX
], *h
;
423 assert(full_hostname
);
424 assert(llmnr_hostname
);
425 assert(mdns_hostname
);
427 p
= fallback_hostname();
428 r
= dns_label_unescape(&p
, label
, sizeof(label
));
430 return log_error_errno(r
, "Failed to unescape fallback host name: %m");
432 assert(r
> 0); /* The fallback hostname must have at least one label */
434 r
= dns_label_escape_new(label
, r
, &n
);
436 return log_error_errno(r
, "Failed to escape fallback hostname: %m");
438 r
= dns_name_concat(n
, "local", &m
);
440 return log_error_errno(r
, "Failed to concatenate mDNS hostname: %m");
442 h
= strdup(fallback_hostname());
457 static int on_hostname_change(sd_event_source
*es
, int fd
, uint32_t revents
, void *userdata
) {
458 _cleanup_free_
char *full_hostname
= NULL
, *llmnr_hostname
= NULL
, *mdns_hostname
= NULL
;
459 Manager
*m
= userdata
;
464 r
= determine_hostname(&full_hostname
, &llmnr_hostname
, &mdns_hostname
);
466 return 0; /* ignore invalid hostnames */
468 if (streq(full_hostname
, m
->full_hostname
) &&
469 streq(llmnr_hostname
, m
->llmnr_hostname
) &&
470 streq(mdns_hostname
, m
->mdns_hostname
))
473 log_info("System hostname changed to '%s'.", full_hostname
);
475 free_and_replace(m
->full_hostname
, full_hostname
);
476 free_and_replace(m
->llmnr_hostname
, llmnr_hostname
);
477 free_and_replace(m
->mdns_hostname
, mdns_hostname
);
479 manager_refresh_rrs(m
);
484 static int manager_watch_hostname(Manager
*m
) {
489 m
->hostname_fd
= open("/proc/sys/kernel/hostname", O_RDONLY
|O_CLOEXEC
|O_NDELAY
|O_NOCTTY
);
490 if (m
->hostname_fd
< 0) {
491 log_warning_errno(errno
, "Failed to watch hostname: %m");
495 r
= sd_event_add_io(m
->event
, &m
->hostname_event_source
, m
->hostname_fd
, 0, on_hostname_change
, m
);
498 /* kernels prior to 3.2 don't support polling this file. Ignore the failure. */
499 m
->hostname_fd
= safe_close(m
->hostname_fd
);
501 return log_error_errno(r
, "Failed to add hostname event source: %m");
504 (void) sd_event_source_set_description(m
->hostname_event_source
, "hostname");
506 r
= determine_hostname(&m
->full_hostname
, &m
->llmnr_hostname
, &m
->mdns_hostname
);
508 log_info("Defaulting to hostname '%s'.", fallback_hostname());
510 r
= make_fallback_hostnames(&m
->full_hostname
, &m
->llmnr_hostname
, &m
->mdns_hostname
);
514 log_info("Using system hostname '%s'.", m
->full_hostname
);
519 static int manager_sigusr1(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
520 _cleanup_free_
char *buffer
= NULL
;
521 _cleanup_fclose_
FILE *f
= NULL
;
522 Manager
*m
= userdata
;
533 f
= open_memstream(&buffer
, &size
);
537 LIST_FOREACH(scopes
, scope
, m
->dns_scopes
)
538 dns_scope_dump(scope
, f
);
540 LIST_FOREACH(servers
, server
, m
->dns_servers
)
541 dns_server_dump(server
, f
);
542 LIST_FOREACH(servers
, server
, m
->fallback_dns_servers
)
543 dns_server_dump(server
, f
);
544 HASHMAP_FOREACH(l
, m
->links
, i
)
545 LIST_FOREACH(servers
, server
, l
->dns_servers
)
546 dns_server_dump(server
, f
);
548 if (fflush_and_check(f
) < 0)
551 log_dump(LOG_INFO
, buffer
);
555 static int manager_sigusr2(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
556 Manager
*m
= userdata
;
562 manager_flush_caches(m
);
567 static int manager_sigrtmin1(sd_event_source
*s
, const struct signalfd_siginfo
*si
, void *userdata
) {
568 Manager
*m
= userdata
;
574 manager_reset_server_features(m
);
578 int manager_new(Manager
**ret
) {
579 _cleanup_(manager_freep
) Manager
*m
= NULL
;
584 m
= new0(Manager
, 1);
588 m
->llmnr_ipv4_udp_fd
= m
->llmnr_ipv6_udp_fd
= -1;
589 m
->llmnr_ipv4_tcp_fd
= m
->llmnr_ipv6_tcp_fd
= -1;
590 m
->mdns_ipv4_fd
= m
->mdns_ipv6_fd
= -1;
591 m
->dns_stub_udp_fd
= m
->dns_stub_tcp_fd
= -1;
594 m
->llmnr_support
= RESOLVE_SUPPORT_YES
;
595 m
->mdns_support
= RESOLVE_SUPPORT_YES
;
596 m
->dnssec_mode
= DEFAULT_DNSSEC_MODE
;
597 m
->enable_cache
= true;
598 m
->dns_stub_listener_mode
= DNS_STUB_LISTENER_UDP
;
599 m
->read_resolv_conf
= true;
600 m
->need_builtin_fallbacks
= true;
601 m
->etc_hosts_last
= m
->etc_hosts_mtime
= USEC_INFINITY
;
603 r
= dns_trust_anchor_load(&m
->trust_anchor
);
607 r
= manager_parse_config_file(m
);
609 log_warning_errno(r
, "Failed to parse configuration file: %m");
611 r
= sd_event_default(&m
->event
);
615 sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
616 sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
618 sd_event_set_watchdog(m
->event
, true);
620 r
= manager_watch_hostname(m
);
624 r
= dns_scope_new(m
, &m
->unicast_scope
, NULL
, DNS_PROTOCOL_DNS
, AF_UNSPEC
);
628 r
= manager_network_monitor_listen(m
);
632 r
= manager_rtnl_listen(m
);
636 r
= manager_connect_bus(m
);
640 (void) sd_event_add_signal(m
->event
, &m
->sigusr1_event_source
, SIGUSR1
, manager_sigusr1
, m
);
641 (void) sd_event_add_signal(m
->event
, &m
->sigusr2_event_source
, SIGUSR2
, manager_sigusr2
, m
);
642 (void) sd_event_add_signal(m
->event
, &m
->sigrtmin1_event_source
, SIGRTMIN
+1, manager_sigrtmin1
, m
);
644 manager_cleanup_saved_user(m
);
652 int manager_start(Manager
*m
) {
657 r
= manager_dns_stub_start(m
);
664 Manager
*manager_free(Manager
*m
) {
670 dns_server_unlink_all(m
->dns_servers
);
671 dns_server_unlink_all(m
->fallback_dns_servers
);
672 dns_search_domain_unlink_all(m
->search_domains
);
674 while ((l
= hashmap_first(m
->links
)))
677 while (m
->dns_queries
)
678 dns_query_free(m
->dns_queries
);
680 dns_scope_free(m
->unicast_scope
);
682 /* At this point only orphaned streams should remain. All others should have been freed already by their
684 while (m
->dns_streams
)
685 dns_stream_unref(m
->dns_streams
);
687 hashmap_free(m
->links
);
688 hashmap_free(m
->dns_transactions
);
690 sd_event_source_unref(m
->network_event_source
);
691 sd_network_monitor_unref(m
->network_monitor
);
693 sd_netlink_unref(m
->rtnl
);
694 sd_event_source_unref(m
->rtnl_event_source
);
696 manager_llmnr_stop(m
);
697 manager_mdns_stop(m
);
698 manager_dns_stub_stop(m
);
700 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
701 sd_event_source_unref(m
->bus_retry_event_source
);
702 sd_bus_unref(m
->bus
);
704 sd_event_source_unref(m
->sigusr1_event_source
);
705 sd_event_source_unref(m
->sigusr2_event_source
);
706 sd_event_source_unref(m
->sigrtmin1_event_source
);
708 sd_event_unref(m
->event
);
710 dns_resource_key_unref(m
->llmnr_host_ipv4_key
);
711 dns_resource_key_unref(m
->llmnr_host_ipv6_key
);
712 dns_resource_key_unref(m
->mdns_host_ipv4_key
);
713 dns_resource_key_unref(m
->mdns_host_ipv6_key
);
715 sd_event_source_unref(m
->hostname_event_source
);
716 safe_close(m
->hostname_fd
);
718 free(m
->full_hostname
);
719 free(m
->llmnr_hostname
);
720 free(m
->mdns_hostname
);
722 dns_trust_anchor_flush(&m
->trust_anchor
);
723 manager_etc_hosts_flush(m
);
728 int manager_recv(Manager
*m
, int fd
, DnsProtocol protocol
, DnsPacket
**ret
) {
729 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
731 struct cmsghdr header
; /* For alignment */
732 uint8_t buffer
[CMSG_SPACE(MAXSIZE(struct in_pktinfo
, struct in6_pktinfo
))
733 + CMSG_SPACE(int) /* ttl/hoplimit */
734 + EXTRA_CMSG_SPACE
/* kernel appears to require extra buffer space */];
736 union sockaddr_union sa
;
737 struct msghdr mh
= {};
738 struct cmsghdr
*cmsg
;
747 ms
= next_datagram_size_fd(fd
);
751 r
= dns_packet_new(&p
, protocol
, ms
, DNS_PACKET_SIZE_MAX
);
755 iov
.iov_base
= DNS_PACKET_DATA(p
);
756 iov
.iov_len
= p
->allocated
;
758 mh
.msg_name
= &sa
.sa
;
759 mh
.msg_namelen
= sizeof(sa
);
762 mh
.msg_control
= &control
;
763 mh
.msg_controllen
= sizeof(control
);
765 l
= recvmsg(fd
, &mh
, 0);
769 if (IN_SET(errno
, EAGAIN
, EINTR
))
775 assert(!(mh
.msg_flags
& MSG_CTRUNC
));
776 assert(!(mh
.msg_flags
& MSG_TRUNC
));
778 p
->size
= (size_t) l
;
780 p
->family
= sa
.sa
.sa_family
;
781 p
->ipproto
= IPPROTO_UDP
;
782 if (p
->family
== AF_INET
) {
783 p
->sender
.in
= sa
.in
.sin_addr
;
784 p
->sender_port
= be16toh(sa
.in
.sin_port
);
785 } else if (p
->family
== AF_INET6
) {
786 p
->sender
.in6
= sa
.in6
.sin6_addr
;
787 p
->sender_port
= be16toh(sa
.in6
.sin6_port
);
788 p
->ifindex
= sa
.in6
.sin6_scope_id
;
790 return -EAFNOSUPPORT
;
792 CMSG_FOREACH(cmsg
, &mh
) {
794 if (cmsg
->cmsg_level
== IPPROTO_IPV6
) {
795 assert(p
->family
== AF_INET6
);
797 switch (cmsg
->cmsg_type
) {
800 struct in6_pktinfo
*i
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
803 p
->ifindex
= i
->ipi6_ifindex
;
805 p
->destination
.in6
= i
->ipi6_addr
;
810 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
814 } else if (cmsg
->cmsg_level
== IPPROTO_IP
) {
815 assert(p
->family
== AF_INET
);
817 switch (cmsg
->cmsg_type
) {
820 struct in_pktinfo
*i
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
823 p
->ifindex
= i
->ipi_ifindex
;
825 p
->destination
.in
= i
->ipi_addr
;
830 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
836 /* The Linux kernel sets the interface index to the loopback
837 * device if the packet came from the local host since it
838 * avoids the routing table in such a case. Let's unset the
839 * interface index in such a case. */
840 if (p
->ifindex
== LOOPBACK_IFINDEX
)
843 if (protocol
!= DNS_PROTOCOL_DNS
) {
844 /* If we don't know the interface index still, we look for the
845 * first local interface with a matching address. Yuck! */
847 p
->ifindex
= manager_find_ifindex(m
, p
->family
, &p
->destination
);
856 static int sendmsg_loop(int fd
, struct msghdr
*mh
, int flags
) {
863 if (sendmsg(fd
, mh
, flags
) >= 0)
872 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
880 static int write_loop(int fd
, void *message
, size_t length
) {
887 if (write(fd
, message
, length
) >= 0)
896 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
904 int manager_write(Manager
*m
, int fd
, DnsPacket
*p
) {
907 log_debug("Sending %s packet with id %" PRIu16
".", DNS_PACKET_QR(p
) ? "response" : "query", DNS_PACKET_ID(p
));
909 r
= write_loop(fd
, DNS_PACKET_DATA(p
), p
->size
);
916 static int manager_ipv4_send(
920 const struct in_addr
*destination
,
922 const struct in_addr
*source
,
924 union sockaddr_union sa
= {
925 .in
.sin_family
= AF_INET
,
928 struct cmsghdr header
; /* For alignment */
929 uint8_t buffer
[CMSG_SPACE(sizeof(struct in_pktinfo
))];
931 struct msghdr mh
= {};
940 iov
.iov_base
= DNS_PACKET_DATA(p
);
941 iov
.iov_len
= p
->size
;
943 sa
.in
.sin_addr
= *destination
;
944 sa
.in
.sin_port
= htobe16(port
),
948 mh
.msg_name
= &sa
.sa
;
949 mh
.msg_namelen
= sizeof(sa
.in
);
952 struct cmsghdr
*cmsg
;
953 struct in_pktinfo
*pi
;
957 mh
.msg_control
= &control
;
958 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in_pktinfo
));
960 cmsg
= CMSG_FIRSTHDR(&mh
);
961 cmsg
->cmsg_len
= mh
.msg_controllen
;
962 cmsg
->cmsg_level
= IPPROTO_IP
;
963 cmsg
->cmsg_type
= IP_PKTINFO
;
965 pi
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
966 pi
->ipi_ifindex
= ifindex
;
969 pi
->ipi_spec_dst
= *source
;
972 return sendmsg_loop(fd
, &mh
, 0);
975 static int manager_ipv6_send(
979 const struct in6_addr
*destination
,
981 const struct in6_addr
*source
,
984 union sockaddr_union sa
= {
985 .in6
.sin6_family
= AF_INET6
,
988 struct cmsghdr header
; /* For alignment */
989 uint8_t buffer
[CMSG_SPACE(sizeof(struct in6_pktinfo
))];
991 struct msghdr mh
= {};
1000 iov
.iov_base
= DNS_PACKET_DATA(p
);
1001 iov
.iov_len
= p
->size
;
1003 sa
.in6
.sin6_addr
= *destination
;
1004 sa
.in6
.sin6_port
= htobe16(port
),
1005 sa
.in6
.sin6_scope_id
= ifindex
;
1009 mh
.msg_name
= &sa
.sa
;
1010 mh
.msg_namelen
= sizeof(sa
.in6
);
1013 struct cmsghdr
*cmsg
;
1014 struct in6_pktinfo
*pi
;
1018 mh
.msg_control
= &control
;
1019 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in6_pktinfo
));
1021 cmsg
= CMSG_FIRSTHDR(&mh
);
1022 cmsg
->cmsg_len
= mh
.msg_controllen
;
1023 cmsg
->cmsg_level
= IPPROTO_IPV6
;
1024 cmsg
->cmsg_type
= IPV6_PKTINFO
;
1026 pi
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
1027 pi
->ipi6_ifindex
= ifindex
;
1030 pi
->ipi6_addr
= *source
;
1033 return sendmsg_loop(fd
, &mh
, 0);
1041 const union in_addr_union
*destination
,
1043 const union in_addr_union
*source
,
1048 assert(destination
);
1052 log_debug("Sending %s packet with id %" PRIu16
" on interface %i/%s.", DNS_PACKET_QR(p
) ? "response" : "query", DNS_PACKET_ID(p
), ifindex
, af_to_name(family
));
1054 if (family
== AF_INET
)
1055 return manager_ipv4_send(m
, fd
, ifindex
, &destination
->in
, port
, &source
->in
, p
);
1056 if (family
== AF_INET6
)
1057 return manager_ipv6_send(m
, fd
, ifindex
, &destination
->in6
, port
, &source
->in6
, p
);
1059 return -EAFNOSUPPORT
;
1062 uint32_t manager_find_mtu(Manager
*m
) {
1067 /* If we don't know on which link a DNS packet would be
1068 * delivered, let's find the largest MTU that works on all
1069 * interfaces we know of */
1071 HASHMAP_FOREACH(l
, m
->links
, i
) {
1075 if (mtu
<= 0 || l
->mtu
< mtu
)
1082 int manager_find_ifindex(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1087 a
= manager_find_link_address(m
, family
, in_addr
);
1089 return a
->link
->ifindex
;
1094 void manager_refresh_rrs(Manager
*m
) {
1100 m
->llmnr_host_ipv4_key
= dns_resource_key_unref(m
->llmnr_host_ipv4_key
);
1101 m
->llmnr_host_ipv6_key
= dns_resource_key_unref(m
->llmnr_host_ipv6_key
);
1102 m
->mdns_host_ipv4_key
= dns_resource_key_unref(m
->mdns_host_ipv4_key
);
1103 m
->mdns_host_ipv6_key
= dns_resource_key_unref(m
->mdns_host_ipv6_key
);
1105 HASHMAP_FOREACH(l
, m
->links
, i
) {
1106 link_add_rrs(l
, true);
1107 link_add_rrs(l
, false);
1111 int manager_next_hostname(Manager
*m
) {
1119 p
= strchr(m
->llmnr_hostname
, 0);
1122 while (p
> m
->llmnr_hostname
) {
1123 if (!strchr("0123456789", p
[-1]))
1129 if (*p
== 0 || safe_atou64(p
, &u
) < 0 || u
<= 0)
1132 /* Add a random number to the old value. This way we can avoid
1133 * that two hosts pick the same hostname, win on IPv4 and lose
1134 * on IPv6 (or vice versa), and pick the same hostname
1135 * replacement hostname, ad infinitum. We still want the
1136 * numbers to go up monotonically, hence we just add a random
1139 random_bytes(&a
, sizeof(a
));
1142 if (asprintf(&h
, "%.*s%" PRIu64
, (int) (p
- m
->llmnr_hostname
), m
->llmnr_hostname
, u
) < 0)
1145 r
= dns_name_concat(h
, "local", &k
);
1151 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m
->llmnr_hostname
, h
);
1153 free(m
->llmnr_hostname
);
1154 m
->llmnr_hostname
= h
;
1156 free(m
->mdns_hostname
);
1157 m
->mdns_hostname
= k
;
1159 manager_refresh_rrs(m
);
1164 LinkAddress
* manager_find_link_address(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1170 HASHMAP_FOREACH(l
, m
->links
, i
) {
1173 a
= link_find_address(l
, family
, in_addr
);
1181 bool manager_our_packet(Manager
*m
, DnsPacket
*p
) {
1185 return !!manager_find_link_address(m
, p
->family
, &p
->sender
);
1188 DnsScope
* manager_find_scope(Manager
*m
, DnsPacket
*p
) {
1194 l
= hashmap_get(m
->links
, INT_TO_PTR(p
->ifindex
));
1198 switch (p
->protocol
) {
1199 case DNS_PROTOCOL_LLMNR
:
1200 if (p
->family
== AF_INET
)
1201 return l
->llmnr_ipv4_scope
;
1202 else if (p
->family
== AF_INET6
)
1203 return l
->llmnr_ipv6_scope
;
1207 case DNS_PROTOCOL_MDNS
:
1208 if (p
->family
== AF_INET
)
1209 return l
->mdns_ipv4_scope
;
1210 else if (p
->family
== AF_INET6
)
1211 return l
->mdns_ipv6_scope
;
1222 void manager_verify_all(Manager
*m
) {
1227 LIST_FOREACH(scopes
, s
, m
->dns_scopes
)
1228 dns_zone_verify_all(&s
->zone
);
1231 int manager_is_own_hostname(Manager
*m
, const char *name
) {
1237 if (m
->llmnr_hostname
) {
1238 r
= dns_name_equal(name
, m
->llmnr_hostname
);
1243 if (m
->mdns_hostname
) {
1244 r
= dns_name_equal(name
, m
->mdns_hostname
);
1249 if (m
->full_hostname
)
1250 return dns_name_equal(name
, m
->full_hostname
);
1255 int manager_compile_dns_servers(Manager
*m
, OrderedSet
**dns
) {
1264 r
= ordered_set_ensure_allocated(dns
, &dns_server_hash_ops
);
1268 /* First add the system-wide servers and domains */
1269 LIST_FOREACH(servers
, s
, m
->dns_servers
) {
1270 r
= ordered_set_put(*dns
, s
);
1277 /* Then, add the per-link servers */
1278 HASHMAP_FOREACH(l
, m
->links
, i
) {
1279 LIST_FOREACH(servers
, s
, l
->dns_servers
) {
1280 r
= ordered_set_put(*dns
, s
);
1288 /* If we found nothing, add the fallback servers */
1289 if (ordered_set_isempty(*dns
)) {
1290 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
) {
1291 r
= ordered_set_put(*dns
, s
);
1302 /* filter_route is a tri-state:
1304 * = 0 or false: return only domains which should be used for searching
1305 * > 0 or true: return only domains which are for routing only
1307 int manager_compile_search_domains(Manager
*m
, OrderedSet
**domains
, int filter_route
) {
1316 r
= ordered_set_ensure_allocated(domains
, &dns_name_hash_ops
);
1320 LIST_FOREACH(domains
, d
, m
->search_domains
) {
1322 if (filter_route
>= 0 &&
1323 d
->route_only
!= !!filter_route
)
1326 r
= ordered_set_put(*domains
, d
->name
);
1333 HASHMAP_FOREACH(l
, m
->links
, i
) {
1335 LIST_FOREACH(domains
, d
, l
->search_domains
) {
1337 if (filter_route
>= 0 &&
1338 d
->route_only
!= !!filter_route
)
1341 r
= ordered_set_put(*domains
, d
->name
);
1352 DnssecMode
manager_get_dnssec_mode(Manager
*m
) {
1355 if (m
->dnssec_mode
!= _DNSSEC_MODE_INVALID
)
1356 return m
->dnssec_mode
;
1361 bool manager_dnssec_supported(Manager
*m
) {
1368 if (manager_get_dnssec_mode(m
) == DNSSEC_NO
)
1371 server
= manager_get_dns_server(m
);
1372 if (server
&& !dns_server_dnssec_supported(server
))
1375 HASHMAP_FOREACH(l
, m
->links
, i
)
1376 if (!link_dnssec_supported(l
))
1382 void manager_dnssec_verdict(Manager
*m
, DnssecVerdict verdict
, const DnsResourceKey
*key
) {
1384 assert(verdict
>= 0);
1385 assert(verdict
< _DNSSEC_VERDICT_MAX
);
1387 if (log_get_max_level() >= LOG_DEBUG
) {
1388 char s
[DNS_RESOURCE_KEY_STRING_MAX
];
1390 log_debug("Found verdict for lookup %s: %s",
1391 dns_resource_key_to_string(key
, s
, sizeof s
),
1392 dnssec_verdict_to_string(verdict
));
1395 m
->n_dnssec_verdict
[verdict
]++;
1398 bool manager_routable(Manager
*m
, int family
) {
1404 /* Returns true if the host has at least one interface with a routable address of the specified type */
1406 HASHMAP_FOREACH(l
, m
->links
, i
)
1407 if (link_relevant(l
, family
, false))
1413 void manager_flush_caches(Manager
*m
) {
1418 LIST_FOREACH(scopes
, scope
, m
->dns_scopes
)
1419 dns_cache_flush(&scope
->cache
);
1421 log_info("Flushed all caches.");
1424 void manager_reset_server_features(Manager
*m
) {
1428 dns_server_reset_features_all(m
->dns_servers
);
1429 dns_server_reset_features_all(m
->fallback_dns_servers
);
1431 HASHMAP_FOREACH(l
, m
->links
, i
)
1432 dns_server_reset_features_all(l
->dns_servers
);
1434 log_info("Resetting learnt feature levels on all servers.");
1437 void manager_cleanup_saved_user(Manager
*m
) {
1438 _cleanup_closedir_
DIR *d
= NULL
;
1444 /* Clean up all saved per-link files in /run/systemd/resolve/netif/ that don't have a matching interface
1445 * anymore. These files are created to persist settings pushed in by the user via the bus, so that resolved can
1446 * be restarted without losing this data. */
1448 d
= opendir("/run/systemd/resolve/netif/");
1450 if (errno
== ENOENT
)
1453 log_warning_errno(errno
, "Failed to open interface directory: %m");
1457 FOREACH_DIRENT_ALL(de
, d
, log_error_errno(errno
, "Failed to read interface directory: %m")) {
1458 _cleanup_free_
char *p
= NULL
;
1462 if (!IN_SET(de
->d_type
, DT_UNKNOWN
, DT_REG
))
1465 if (dot_or_dot_dot(de
->d_name
))
1468 r
= parse_ifindex(de
->d_name
, &ifindex
);
1469 if (r
< 0) /* Probably some temporary file from a previous run. Delete it */
1472 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
1473 if (!l
) /* link vanished */
1476 if (l
->is_managed
) /* now managed by networkd, hence the bus settings are useless */
1482 p
= strappend("/run/systemd/resolve/netif/", de
->d_name
);