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 <arpa/inet.h>
25 #include <sys/ioctl.h>
27 #include <netinet/in.h>
29 #include "rtnl-util.h"
30 #include "event-util.h"
31 #include "network-util.h"
32 #include "network-internal.h"
33 #include "conf-parser.h"
34 #include "socket-util.h"
38 #include "resolved-dns-domain.h"
39 #include "resolved-conf.h"
40 #include "resolved-bus.h"
41 #include "resolved-manager.h"
43 #define SEND_TIMEOUT_USEC (200 * USEC_PER_MSEC)
45 static int manager_process_link(sd_rtnl
*rtnl
, sd_rtnl_message
*mm
, void *userdata
) {
46 Manager
*m
= userdata
;
55 r
= sd_rtnl_message_get_type(mm
, &type
);
59 r
= sd_rtnl_message_link_get_ifindex(mm
, &ifindex
);
63 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
71 r
= link_new(m
, &l
, ifindex
);
76 r
= link_update_rtnl(l
, mm
);
81 log_debug("Found new link %i/%s", ifindex
, l
->name
);
88 log_debug("Removing link %i/%s", l
->ifindex
, l
->name
);
98 log_warning("Failed to process RTNL link message: %s", strerror(-r
));
102 static int manager_process_address(sd_rtnl
*rtnl
, sd_rtnl_message
*mm
, void *userdata
) {
103 Manager
*m
= userdata
;
104 union in_addr_union address
;
106 int r
, ifindex
, family
;
114 r
= sd_rtnl_message_get_type(mm
, &type
);
118 r
= sd_rtnl_message_addr_get_ifindex(mm
, &ifindex
);
122 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
126 r
= sd_rtnl_message_addr_get_family(mm
, &family
);
133 r
= sd_rtnl_message_read_in_addr(mm
, IFA_LOCAL
, &address
.in
);
135 r
= sd_rtnl_message_read_in_addr(mm
, IFA_ADDRESS
, &address
.in
);
143 r
= sd_rtnl_message_read_in6_addr(mm
, IFA_LOCAL
, &address
.in6
);
145 r
= sd_rtnl_message_read_in6_addr(mm
, IFA_ADDRESS
, &address
.in6
);
156 a
= link_find_address(l
, family
, &address
);
163 r
= link_address_new(l
, &a
, family
, &address
);
168 r
= link_address_update_rtnl(a
, mm
);
176 link_address_free(a
);
183 log_warning("Failed to process RTNL address message: %s", strerror(-r
));
187 static int manager_rtnl_listen(Manager
*m
) {
188 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
, *reply
= NULL
;
194 /* First, subscibe to interfaces coming and going */
195 r
= sd_rtnl_open(&m
->rtnl
, 3, RTNLGRP_LINK
, RTNLGRP_IPV4_IFADDR
, RTNLGRP_IPV6_IFADDR
);
199 r
= sd_rtnl_attach_event(m
->rtnl
, m
->event
, 0);
203 r
= sd_rtnl_add_match(m
->rtnl
, RTM_NEWLINK
, manager_process_link
, m
);
207 r
= sd_rtnl_add_match(m
->rtnl
, RTM_DELLINK
, manager_process_link
, m
);
211 r
= sd_rtnl_add_match(m
->rtnl
, RTM_NEWADDR
, manager_process_address
, m
);
215 r
= sd_rtnl_add_match(m
->rtnl
, RTM_DELADDR
, manager_process_address
, m
);
219 /* Then, enumerate all links */
220 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
224 r
= sd_rtnl_message_request_dump(req
, true);
228 r
= sd_rtnl_call(m
->rtnl
, req
, 0, &reply
);
232 for (i
= reply
; i
; i
= sd_rtnl_message_next(i
)) {
233 r
= manager_process_link(m
->rtnl
, i
, m
);
238 req
= sd_rtnl_message_unref(req
);
239 reply
= sd_rtnl_message_unref(reply
);
241 /* Finally, enumerate all addresses, too */
242 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, AF_UNSPEC
);
246 r
= sd_rtnl_message_request_dump(req
, true);
250 r
= sd_rtnl_call(m
->rtnl
, req
, 0, &reply
);
254 for (i
= reply
; i
; i
= sd_rtnl_message_next(i
)) {
255 r
= manager_process_address(m
->rtnl
, i
, m
);
263 static int on_network_event(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
264 Manager
*m
= userdata
;
271 sd_network_monitor_flush(m
->network_monitor
);
273 HASHMAP_FOREACH(l
, m
->links
, i
) {
274 r
= link_update_monitor(l
);
276 log_warning("Failed to update monitor information for %i: %s", l
->ifindex
, strerror(-r
));
279 r
= manager_write_resolv_conf(m
);
281 log_warning("Could not update resolv.conf: %s", strerror(-r
));
286 static int manager_network_monitor_listen(Manager
*m
) {
291 r
= sd_network_monitor_new(&m
->network_monitor
, NULL
);
295 fd
= sd_network_monitor_get_fd(m
->network_monitor
);
299 events
= sd_network_monitor_get_events(m
->network_monitor
);
303 r
= sd_event_add_io(m
->event
, &m
->network_event_source
, fd
, events
, &on_network_event
, m
);
310 static int determine_hostname(char **ret
) {
311 _cleanup_free_
char *h
= NULL
, *n
= NULL
;
316 h
= gethostname_malloc();
320 if (!utf8_is_valid(h
)) {
321 log_error("System hostname is not UTF-8 clean.");
325 r
= dns_name_normalize(h
, &n
);
327 log_error("System hostname '%s' cannot be normalized.", h
);
337 static int on_hostname_change(sd_event_source
*es
, int fd
, uint32_t revents
, void *userdata
) {
338 _cleanup_free_
char *h
= NULL
;
339 Manager
*m
= userdata
;
344 r
= determine_hostname(&h
);
346 return 0; /* ignore invalid hostnames */
348 if (streq(h
, m
->hostname
))
351 log_info("System hostname changed to '%s'.", h
);
356 manager_refresh_rrs(m
);
361 static int manager_watch_hostname(Manager
*m
) {
366 m
->hostname_fd
= open("/proc/sys/kernel/hostname", O_RDONLY
|O_CLOEXEC
|O_NDELAY
|O_NOCTTY
);
367 if (m
->hostname_fd
< 0) {
368 log_warning("Failed to watch hostname: %m");
372 r
= sd_event_add_io(m
->event
, &m
->hostname_event_source
, m
->hostname_fd
, 0, on_hostname_change
, m
);
375 /* kernels prior to 3.2 don't support polling this file. Ignore the failure. */
376 m
->hostname_fd
= safe_close(m
->hostname_fd
);
378 log_error("Failed to add hostname event source: %s", strerror(-r
));
383 r
= determine_hostname(&m
->hostname
);
385 log_info("Defaulting to hostname 'linux'.");
386 m
->hostname
= strdup("linux");
390 log_info("Using system hostname '%s'.", m
->hostname
);
395 static void manager_llmnr_stop(Manager
*m
) {
398 m
->llmnr_ipv4_udp_event_source
= sd_event_source_unref(m
->llmnr_ipv4_udp_event_source
);
399 m
->llmnr_ipv4_udp_fd
= safe_close(m
->llmnr_ipv4_udp_fd
);
401 m
->llmnr_ipv6_udp_event_source
= sd_event_source_unref(m
->llmnr_ipv6_udp_event_source
);
402 m
->llmnr_ipv6_udp_fd
= safe_close(m
->llmnr_ipv6_udp_fd
);
404 m
->llmnr_ipv4_tcp_event_source
= sd_event_source_unref(m
->llmnr_ipv4_tcp_event_source
);
405 m
->llmnr_ipv4_tcp_fd
= safe_close(m
->llmnr_ipv4_tcp_fd
);
407 m
->llmnr_ipv6_tcp_event_source
= sd_event_source_unref(m
->llmnr_ipv6_tcp_event_source
);
408 m
->llmnr_ipv6_tcp_fd
= safe_close(m
->llmnr_ipv6_tcp_fd
);
411 static int manager_llmnr_start(Manager
*m
) {
416 if (m
->llmnr_support
== SUPPORT_NO
)
419 r
= manager_llmnr_ipv4_udp_fd(m
);
420 if (r
== -EADDRINUSE
)
425 r
= manager_llmnr_ipv6_udp_fd(m
);
426 if (r
== -EADDRINUSE
)
431 r
= manager_llmnr_ipv4_tcp_fd(m
);
432 if (r
== -EADDRINUSE
)
437 r
= manager_llmnr_ipv6_tcp_fd(m
);
438 if (r
== -EADDRINUSE
)
446 log_warning("There appears to be another LLMNR respondering running. Turning off LLMNR support.");
447 m
->llmnr_support
= SUPPORT_NO
;
448 manager_llmnr_stop(m
);
452 int manager_new(Manager
**ret
) {
453 _cleanup_(manager_freep
) Manager
*m
= NULL
;
458 m
= new0(Manager
, 1);
462 m
->dns_ipv4_fd
= m
->dns_ipv6_fd
= -1;
463 m
->llmnr_ipv4_udp_fd
= m
->llmnr_ipv6_udp_fd
= -1;
464 m
->llmnr_ipv4_tcp_fd
= m
->llmnr_ipv6_tcp_fd
= -1;
467 m
->llmnr_support
= SUPPORT_YES
;
468 m
->read_resolv_conf
= true;
470 r
= manager_parse_dns_server(m
, DNS_SERVER_FALLBACK
, DNS_SERVERS
);
474 r
= sd_event_default(&m
->event
);
478 sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
479 sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
481 sd_event_set_watchdog(m
->event
, true);
483 r
= manager_watch_hostname(m
);
487 r
= dns_scope_new(m
, &m
->unicast_scope
, NULL
, DNS_PROTOCOL_DNS
, AF_UNSPEC
);
491 r
= manager_network_monitor_listen(m
);
495 r
= manager_rtnl_listen(m
);
499 r
= manager_connect_bus(m
);
509 int manager_start(Manager
*m
) {
514 r
= manager_llmnr_start(m
);
521 Manager
*manager_free(Manager
*m
) {
527 while ((l
= hashmap_first(m
->links
)))
530 while (m
->dns_queries
)
531 dns_query_free(m
->dns_queries
);
533 dns_scope_free(m
->unicast_scope
);
535 while (m
->dns_servers
)
536 dns_server_free(m
->dns_servers
);
537 while (m
->fallback_dns_servers
)
538 dns_server_free(m
->fallback_dns_servers
);
540 hashmap_free(m
->links
);
541 hashmap_free(m
->dns_transactions
);
543 sd_event_source_unref(m
->network_event_source
);
544 sd_network_monitor_unref(m
->network_monitor
);
546 sd_event_source_unref(m
->dns_ipv4_event_source
);
547 sd_event_source_unref(m
->dns_ipv6_event_source
);
548 safe_close(m
->dns_ipv4_fd
);
549 safe_close(m
->dns_ipv6_fd
);
551 manager_llmnr_stop(m
);
553 sd_event_source_unref(m
->bus_retry_event_source
);
554 sd_bus_unref(m
->bus
);
556 sd_event_unref(m
->event
);
558 dns_resource_key_unref(m
->host_ipv4_key
);
559 dns_resource_key_unref(m
->host_ipv6_key
);
561 safe_close(m
->hostname_fd
);
562 sd_event_source_unref(m
->hostname_event_source
);
570 int manager_read_resolv_conf(Manager
*m
) {
571 _cleanup_fclose_
FILE *f
= NULL
;
580 /* Reads the system /etc/resolv.conf, if it exists and is not
581 * symlinked to our own resolv.conf instance */
583 if (!m
->read_resolv_conf
)
586 r
= stat("/etc/resolv.conf", &st
);
589 log_warning("Failed to open /etc/resolv.conf: %m");
594 /* Have we already seen the file? */
595 t
= timespec_load(&st
.st_mtim
);
596 if (t
== m
->resolv_conf_mtime
)
599 m
->resolv_conf_mtime
= t
;
601 /* Is it symlinked to our own file? */
602 if (stat("/run/systemd/resolve/resolv.conf", &own
) >= 0 &&
603 st
.st_dev
== own
.st_dev
&&
604 st
.st_ino
== own
.st_ino
) {
609 f
= fopen("/etc/resolv.conf", "re");
612 log_warning("Failed to open /etc/resolv.conf: %m");
617 if (fstat(fileno(f
), &st
) < 0) {
618 log_error("Failed to stat open file: %m");
623 LIST_FOREACH(servers
, s
, m
->dns_servers
)
626 FOREACH_LINE(line
, f
, r
= -errno
; goto clear
) {
627 union in_addr_union address
;
635 if (*l
== '#' || *l
== ';')
638 a
= first_word(l
, "nameserver");
642 r
= in_addr_from_string_auto(a
, &family
, &address
);
644 log_warning("Failed to parse name server %s.", a
);
648 LIST_FOREACH(servers
, s
, m
->dns_servers
)
649 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, &address
) > 0)
655 r
= dns_server_new(m
, NULL
, DNS_SERVER_SYSTEM
, NULL
, family
, &address
);
661 LIST_FOREACH_SAFE(servers
, s
, nx
, m
->dns_servers
)
668 while (m
->dns_servers
)
669 dns_server_free(m
->dns_servers
);
674 static void write_resolve_conf_server(DnsServer
*s
, FILE *f
, unsigned *count
) {
675 _cleanup_free_
char *t
= NULL
;
682 r
= in_addr_to_string(s
->family
, &s
->address
, &t
);
684 log_warning("Invalid DNS address. Ignoring: %s", strerror(-r
));
689 fputs("# Too many DNS servers configured, the following entries may be ignored\n", f
);
691 fprintf(f
, "nameserver %s\n", t
);
695 int manager_write_resolv_conf(Manager
*m
) {
696 static const char path
[] = "/run/systemd/resolve/resolv.conf";
697 _cleanup_free_
char *temp_path
= NULL
;
698 _cleanup_fclose_
FILE *f
= NULL
;
707 /* Read the system /etc/resolv.conf first */
708 manager_read_resolv_conf(m
);
710 r
= fopen_temporary(path
, &f
, &temp_path
);
714 fchmod(fileno(f
), 0644);
716 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
717 "# Third party programs must not access this file directly, but\n"
718 "# only through the symlink at /etc/resolv.conf. To manage\n"
719 "# resolv.conf(5) in a different way, replace the symlink by a\n"
720 "# static file or a different symlink.\n\n", f
);
722 LIST_FOREACH(servers
, s
, m
->dns_servers
)
723 write_resolve_conf_server(s
, f
, &count
);
725 HASHMAP_FOREACH(l
, m
->links
, i
)
726 LIST_FOREACH(servers
, s
, l
->dns_servers
)
727 write_resolve_conf_server(s
, f
, &count
);
730 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
)
731 write_resolve_conf_server(s
, f
, &count
);
734 r
= fflush_and_check(f
);
738 if (rename(temp_path
, path
) < 0) {
751 int manager_recv(Manager
*m
, int fd
, DnsProtocol protocol
, DnsPacket
**ret
) {
752 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
754 struct cmsghdr header
; /* For alignment */
755 uint8_t buffer
[CMSG_SPACE(MAX(sizeof(struct in_pktinfo
), sizeof(struct in6_pktinfo
)))
756 + CMSG_SPACE(int) /* ttl/hoplimit */
757 + EXTRA_CMSG_SPACE
/* kernel appears to require extra buffer space */];
759 union sockaddr_union sa
;
760 struct msghdr mh
= {};
761 struct cmsghdr
*cmsg
;
770 r
= ioctl(fd
, FIONREAD
, &ms
);
776 r
= dns_packet_new(&p
, protocol
, ms
);
780 iov
.iov_base
= DNS_PACKET_DATA(p
);
781 iov
.iov_len
= p
->allocated
;
783 mh
.msg_name
= &sa
.sa
;
784 mh
.msg_namelen
= sizeof(sa
);
787 mh
.msg_control
= &control
;
788 mh
.msg_controllen
= sizeof(control
);
790 l
= recvmsg(fd
, &mh
, 0);
792 if (errno
== EAGAIN
|| errno
== EINTR
)
801 assert(!(mh
.msg_flags
& MSG_CTRUNC
));
802 assert(!(mh
.msg_flags
& MSG_TRUNC
));
804 p
->size
= (size_t) l
;
806 p
->family
= sa
.sa
.sa_family
;
807 p
->ipproto
= IPPROTO_UDP
;
808 if (p
->family
== AF_INET
) {
809 p
->sender
.in
= sa
.in
.sin_addr
;
810 p
->sender_port
= be16toh(sa
.in
.sin_port
);
811 } else if (p
->family
== AF_INET6
) {
812 p
->sender
.in6
= sa
.in6
.sin6_addr
;
813 p
->sender_port
= be16toh(sa
.in6
.sin6_port
);
814 p
->ifindex
= sa
.in6
.sin6_scope_id
;
816 return -EAFNOSUPPORT
;
818 for (cmsg
= CMSG_FIRSTHDR(&mh
); cmsg
; cmsg
= CMSG_NXTHDR(&mh
, cmsg
)) {
820 if (cmsg
->cmsg_level
== IPPROTO_IPV6
) {
821 assert(p
->family
== AF_INET6
);
823 switch (cmsg
->cmsg_type
) {
826 struct in6_pktinfo
*i
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
829 p
->ifindex
= i
->ipi6_ifindex
;
831 p
->destination
.in6
= i
->ipi6_addr
;
836 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
840 } else if (cmsg
->cmsg_level
== IPPROTO_IP
) {
841 assert(p
->family
== AF_INET
);
843 switch (cmsg
->cmsg_type
) {
846 struct in_pktinfo
*i
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
849 p
->ifindex
= i
->ipi_ifindex
;
851 p
->destination
.in
= i
->ipi_addr
;
856 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
862 /* The Linux kernel sets the interface index to the loopback
863 * device if the packet came from the local host since it
864 * avoids the routing table in such a case. Let's unset the
865 * interface index in such a case. */
866 if (p
->ifindex
> 0 && manager_ifindex_is_loopback(m
, p
->ifindex
) != 0)
869 /* If we don't know the interface index still, we look for the
870 * first local interface with a matching address. Yuck! */
872 p
->ifindex
= manager_find_ifindex(m
, p
->family
, &p
->destination
);
880 static int on_dns_packet(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
881 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
882 DnsTransaction
*t
= NULL
;
883 Manager
*m
= userdata
;
886 r
= manager_recv(m
, fd
, DNS_PROTOCOL_DNS
, &p
);
890 if (dns_packet_validate_reply(p
) > 0) {
891 t
= hashmap_get(m
->dns_transactions
, UINT_TO_PTR(DNS_PACKET_ID(p
)));
895 dns_transaction_process_reply(t
, p
);
898 log_debug("Invalid DNS packet.");
903 int manager_dns_ipv4_fd(Manager
*m
) {
909 if (m
->dns_ipv4_fd
>= 0)
910 return m
->dns_ipv4_fd
;
912 m
->dns_ipv4_fd
= socket(AF_INET
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
913 if (m
->dns_ipv4_fd
< 0)
916 r
= setsockopt(m
->dns_ipv4_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
922 r
= sd_event_add_io(m
->event
, &m
->dns_ipv4_event_source
, m
->dns_ipv4_fd
, EPOLLIN
, on_dns_packet
, m
);
926 return m
->dns_ipv4_fd
;
929 m
->dns_ipv4_fd
= safe_close(m
->dns_ipv4_fd
);
933 int manager_dns_ipv6_fd(Manager
*m
) {
939 if (m
->dns_ipv6_fd
>= 0)
940 return m
->dns_ipv6_fd
;
942 m
->dns_ipv6_fd
= socket(AF_INET6
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
943 if (m
->dns_ipv6_fd
< 0)
946 r
= setsockopt(m
->dns_ipv6_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
952 r
= sd_event_add_io(m
->event
, &m
->dns_ipv6_event_source
, m
->dns_ipv6_fd
, EPOLLIN
, on_dns_packet
, m
);
956 return m
->dns_ipv6_fd
;
959 m
->dns_ipv6_fd
= safe_close(m
->dns_ipv6_fd
);
963 static int sendmsg_loop(int fd
, struct msghdr
*mh
, int flags
) {
970 if (sendmsg(fd
, mh
, flags
) >= 0)
979 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
987 static int manager_ipv4_send(Manager
*m
, int fd
, int ifindex
, const struct in_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
988 union sockaddr_union sa
= {
989 .in
.sin_family
= AF_INET
,
992 struct cmsghdr header
; /* For alignment */
993 uint8_t buffer
[CMSG_SPACE(sizeof(struct in_pktinfo
))];
995 struct msghdr mh
= {};
1004 iov
.iov_base
= DNS_PACKET_DATA(p
);
1005 iov
.iov_len
= p
->size
;
1007 sa
.in
.sin_addr
= *addr
;
1008 sa
.in
.sin_port
= htobe16(port
),
1012 mh
.msg_name
= &sa
.sa
;
1013 mh
.msg_namelen
= sizeof(sa
.in
);
1016 struct cmsghdr
*cmsg
;
1017 struct in_pktinfo
*pi
;
1021 mh
.msg_control
= &control
;
1022 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in_pktinfo
));
1024 cmsg
= CMSG_FIRSTHDR(&mh
);
1025 cmsg
->cmsg_len
= mh
.msg_controllen
;
1026 cmsg
->cmsg_level
= IPPROTO_IP
;
1027 cmsg
->cmsg_type
= IP_PKTINFO
;
1029 pi
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
1030 pi
->ipi_ifindex
= ifindex
;
1033 return sendmsg_loop(fd
, &mh
, 0);
1036 static int manager_ipv6_send(Manager
*m
, int fd
, int ifindex
, const struct in6_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
1037 union sockaddr_union sa
= {
1038 .in6
.sin6_family
= AF_INET6
,
1041 struct cmsghdr header
; /* For alignment */
1042 uint8_t buffer
[CMSG_SPACE(sizeof(struct in6_pktinfo
))];
1044 struct msghdr mh
= {};
1053 iov
.iov_base
= DNS_PACKET_DATA(p
);
1054 iov
.iov_len
= p
->size
;
1056 sa
.in6
.sin6_addr
= *addr
;
1057 sa
.in6
.sin6_port
= htobe16(port
),
1058 sa
.in6
.sin6_scope_id
= ifindex
;
1062 mh
.msg_name
= &sa
.sa
;
1063 mh
.msg_namelen
= sizeof(sa
.in6
);
1066 struct cmsghdr
*cmsg
;
1067 struct in6_pktinfo
*pi
;
1071 mh
.msg_control
= &control
;
1072 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in6_pktinfo
));
1074 cmsg
= CMSG_FIRSTHDR(&mh
);
1075 cmsg
->cmsg_len
= mh
.msg_controllen
;
1076 cmsg
->cmsg_level
= IPPROTO_IPV6
;
1077 cmsg
->cmsg_type
= IPV6_PKTINFO
;
1079 pi
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
1080 pi
->ipi6_ifindex
= ifindex
;
1083 return sendmsg_loop(fd
, &mh
, 0);
1086 int manager_send(Manager
*m
, int fd
, int ifindex
, int family
, const union in_addr_union
*addr
, uint16_t port
, DnsPacket
*p
) {
1093 log_debug("Sending %s packet with id %u on interface %i/%s", DNS_PACKET_QR(p
) ? "response" : "query", DNS_PACKET_ID(p
), ifindex
, af_to_name(family
));
1095 if (family
== AF_INET
)
1096 return manager_ipv4_send(m
, fd
, ifindex
, &addr
->in
, port
, p
);
1097 else if (family
== AF_INET6
)
1098 return manager_ipv6_send(m
, fd
, ifindex
, &addr
->in6
, port
, p
);
1100 return -EAFNOSUPPORT
;
1103 DnsServer
* manager_find_dns_server(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1109 LIST_FOREACH(servers
, s
, m
->dns_servers
)
1110 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
) > 0)
1113 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
)
1114 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
) > 0)
1120 DnsServer
*manager_set_dns_server(Manager
*m
, DnsServer
*s
) {
1123 if (m
->current_dns_server
== s
)
1127 _cleanup_free_
char *ip
= NULL
;
1129 in_addr_to_string(s
->family
, &s
->address
, &ip
);
1130 log_info("Switching to system DNS server %s.", strna(ip
));
1133 m
->current_dns_server
= s
;
1135 if (m
->unicast_scope
)
1136 dns_cache_flush(&m
->unicast_scope
->cache
);
1141 DnsServer
*manager_get_dns_server(Manager
*m
) {
1145 /* Try to read updates resolv.conf */
1146 manager_read_resolv_conf(m
);
1148 if (!m
->current_dns_server
)
1149 manager_set_dns_server(m
, m
->dns_servers
);
1151 if (!m
->current_dns_server
) {
1155 /* No DNS servers configured, let's see if there are
1156 * any on any links. If not, we use the fallback
1159 HASHMAP_FOREACH(l
, m
->links
, i
)
1160 if (l
->dns_servers
) {
1166 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1169 return m
->current_dns_server
;
1172 void manager_next_dns_server(Manager
*m
) {
1175 /* If there's currently no DNS server set, then the next
1176 * manager_get_dns_server() will find one */
1177 if (!m
->current_dns_server
)
1180 /* Change to the next one */
1181 if (m
->current_dns_server
->servers_next
) {
1182 manager_set_dns_server(m
, m
->current_dns_server
->servers_next
);
1186 /* If there was no next one, then start from the beginning of
1188 if (m
->current_dns_server
->type
== DNS_SERVER_FALLBACK
)
1189 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1191 manager_set_dns_server(m
, m
->dns_servers
);
1194 uint32_t manager_find_mtu(Manager
*m
) {
1199 /* If we don't know on which link a DNS packet would be
1200 * delivered, let's find the largest MTU that works on all
1201 * interfaces we know of */
1203 HASHMAP_FOREACH(l
, m
->links
, i
) {
1207 if (mtu
<= 0 || l
->mtu
< mtu
)
1214 static int on_llmnr_packet(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
1215 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
1216 DnsTransaction
*t
= NULL
;
1217 Manager
*m
= userdata
;
1220 r
= manager_recv(m
, fd
, DNS_PROTOCOL_LLMNR
, &p
);
1224 if (dns_packet_validate_reply(p
) > 0) {
1225 log_debug("Got reply packet for id %u", DNS_PACKET_ID(p
));
1227 t
= hashmap_get(m
->dns_transactions
, UINT_TO_PTR(DNS_PACKET_ID(p
)));
1231 dns_transaction_process_reply(t
, p
);
1233 } else if (dns_packet_validate_query(p
) > 0) {
1236 l
= hashmap_get(m
->links
, INT_TO_PTR(p
->ifindex
));
1238 DnsScope
*scope
= NULL
;
1240 if (p
->family
== AF_INET
)
1241 scope
= l
->llmnr_ipv4_scope
;
1242 else if (p
->family
== AF_INET6
)
1243 scope
= l
->llmnr_ipv6_scope
;
1246 dns_scope_process_query(scope
, NULL
, p
);
1249 log_debug("Invalid LLMNR packet.");
1254 int manager_llmnr_ipv4_udp_fd(Manager
*m
) {
1255 union sockaddr_union sa
= {
1256 .in
.sin_family
= AF_INET
,
1257 .in
.sin_port
= htobe16(5355),
1259 static const int one
= 1, pmtu
= IP_PMTUDISC_DONT
, ttl
= 255;
1264 if (m
->llmnr_ipv4_udp_fd
>= 0)
1265 return m
->llmnr_ipv4_udp_fd
;
1267 m
->llmnr_ipv4_udp_fd
= socket(AF_INET
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1268 if (m
->llmnr_ipv4_udp_fd
< 0)
1271 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1272 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_TTL
, &ttl
, sizeof(ttl
));
1278 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MULTICAST_TTL
, &ttl
, sizeof(ttl
));
1284 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MULTICAST_LOOP
, &one
, sizeof(one
));
1290 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1296 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
1302 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_RECVTTL
, &one
, sizeof(one
));
1308 /* Disable Don't-Fragment bit in the IP header */
1309 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MTU_DISCOVER
, &pmtu
, sizeof(pmtu
));
1315 r
= bind(m
->llmnr_ipv4_udp_fd
, &sa
.sa
, sizeof(sa
.in
));
1321 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv4_udp_event_source
, m
->llmnr_ipv4_udp_fd
, EPOLLIN
, on_llmnr_packet
, m
);
1325 return m
->llmnr_ipv4_udp_fd
;
1328 m
->llmnr_ipv4_udp_fd
= safe_close(m
->llmnr_ipv4_udp_fd
);
1332 int manager_llmnr_ipv6_udp_fd(Manager
*m
) {
1333 union sockaddr_union sa
= {
1334 .in6
.sin6_family
= AF_INET6
,
1335 .in6
.sin6_port
= htobe16(5355),
1337 static const int one
= 1, ttl
= 255;
1342 if (m
->llmnr_ipv6_udp_fd
>= 0)
1343 return m
->llmnr_ipv6_udp_fd
;
1345 m
->llmnr_ipv6_udp_fd
= socket(AF_INET6
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1346 if (m
->llmnr_ipv6_udp_fd
< 0)
1349 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &ttl
, sizeof(ttl
));
1355 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1356 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_MULTICAST_HOPS
, &ttl
, sizeof(ttl
));
1362 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_MULTICAST_LOOP
, &one
, sizeof(one
));
1368 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_V6ONLY
, &one
, sizeof(one
));
1374 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1380 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
1386 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_RECVHOPLIMIT
, &one
, sizeof(one
));
1392 r
= bind(m
->llmnr_ipv6_udp_fd
, &sa
.sa
, sizeof(sa
.in6
));
1398 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv6_udp_event_source
, m
->llmnr_ipv6_udp_fd
, EPOLLIN
, on_llmnr_packet
, m
);
1404 return m
->llmnr_ipv6_udp_fd
;
1407 m
->llmnr_ipv6_udp_fd
= safe_close(m
->llmnr_ipv6_udp_fd
);
1411 static int on_llmnr_stream_packet(DnsStream
*s
) {
1414 if (dns_packet_validate_query(s
->read_packet
) > 0) {
1417 l
= hashmap_get(s
->manager
->links
, INT_TO_PTR(s
->read_packet
->ifindex
));
1419 DnsScope
*scope
= NULL
;
1421 if (s
->read_packet
->family
== AF_INET
)
1422 scope
= l
->llmnr_ipv4_scope
;
1423 else if (s
->read_packet
->family
== AF_INET6
)
1424 scope
= l
->llmnr_ipv6_scope
;
1427 dns_scope_process_query(scope
, s
, s
->read_packet
);
1429 /* If no reply packet was set, we free the stream */
1430 if (s
->write_packet
)
1440 static int on_llmnr_stream(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
1442 Manager
*m
= userdata
;
1445 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
|SOCK_CLOEXEC
);
1447 if (errno
== EAGAIN
|| errno
== EINTR
)
1453 r
= dns_stream_new(m
, &stream
, DNS_PROTOCOL_LLMNR
, cfd
);
1459 stream
->on_packet
= on_llmnr_stream_packet
;
1463 int manager_llmnr_ipv4_tcp_fd(Manager
*m
) {
1464 union sockaddr_union sa
= {
1465 .in
.sin_family
= AF_INET
,
1466 .in
.sin_port
= htobe16(5355),
1468 static const int one
= 1, pmtu
= IP_PMTUDISC_DONT
;
1473 if (m
->llmnr_ipv4_tcp_fd
>= 0)
1474 return m
->llmnr_ipv4_tcp_fd
;
1476 m
->llmnr_ipv4_tcp_fd
= socket(AF_INET
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1477 if (m
->llmnr_ipv4_tcp_fd
< 0)
1480 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1481 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_TTL
, &one
, sizeof(one
));
1487 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1493 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
1499 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_RECVTTL
, &one
, sizeof(one
));
1505 /* Disable Don't-Fragment bit in the IP header */
1506 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_MTU_DISCOVER
, &pmtu
, sizeof(pmtu
));
1512 r
= bind(m
->llmnr_ipv4_tcp_fd
, &sa
.sa
, sizeof(sa
.in
));
1518 r
= listen(m
->llmnr_ipv4_tcp_fd
, SOMAXCONN
);
1524 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv4_tcp_event_source
, m
->llmnr_ipv4_tcp_fd
, EPOLLIN
, on_llmnr_stream
, m
);
1528 return m
->llmnr_ipv4_tcp_fd
;
1531 m
->llmnr_ipv4_tcp_fd
= safe_close(m
->llmnr_ipv4_tcp_fd
);
1535 int manager_llmnr_ipv6_tcp_fd(Manager
*m
) {
1536 union sockaddr_union sa
= {
1537 .in6
.sin6_family
= AF_INET6
,
1538 .in6
.sin6_port
= htobe16(5355),
1540 static const int one
= 1;
1545 if (m
->llmnr_ipv6_tcp_fd
>= 0)
1546 return m
->llmnr_ipv6_tcp_fd
;
1548 m
->llmnr_ipv6_tcp_fd
= socket(AF_INET6
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1549 if (m
->llmnr_ipv6_tcp_fd
< 0)
1552 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1553 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &one
, sizeof(one
));
1559 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_V6ONLY
, &one
, sizeof(one
));
1565 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1571 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
1577 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_RECVHOPLIMIT
, &one
, sizeof(one
));
1583 r
= bind(m
->llmnr_ipv6_tcp_fd
, &sa
.sa
, sizeof(sa
.in6
));
1589 r
= listen(m
->llmnr_ipv6_tcp_fd
, SOMAXCONN
);
1595 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv6_tcp_event_source
, m
->llmnr_ipv6_tcp_fd
, EPOLLIN
, on_llmnr_stream
, m
);
1601 return m
->llmnr_ipv6_tcp_fd
;
1604 m
->llmnr_ipv6_tcp_fd
= safe_close(m
->llmnr_ipv6_tcp_fd
);
1608 int manager_ifindex_is_loopback(Manager
*m
, int ifindex
) {
1615 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
1616 if (l
->flags
& IFF_LOOPBACK
)
1622 int manager_find_ifindex(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1627 a
= manager_find_link_address(m
, family
, in_addr
);
1629 return a
->link
->ifindex
;
1634 void manager_refresh_rrs(Manager
*m
) {
1640 m
->host_ipv4_key
= dns_resource_key_unref(m
->host_ipv4_key
);
1641 m
->host_ipv6_key
= dns_resource_key_unref(m
->host_ipv6_key
);
1643 HASHMAP_FOREACH(l
, m
->links
, i
) {
1644 link_add_rrs(l
, true);
1645 link_add_rrs(l
, false);
1649 int manager_next_hostname(Manager
*m
) {
1656 p
= strchr(m
->hostname
, 0);
1659 while (p
> m
->hostname
) {
1660 if (!strchr("0123456789", p
[-1]))
1666 if (*p
== 0 || safe_atou64(p
, &u
) < 0 || u
<= 0)
1671 if (asprintf(&h
, "%.*s%" PRIu64
, (int) (p
- m
->hostname
), m
->hostname
, u
) < 0)
1674 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m
->hostname
, h
);
1679 manager_refresh_rrs(m
);
1684 LinkAddress
* manager_find_link_address(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1690 HASHMAP_FOREACH(l
, m
->links
, i
) {
1693 a
= link_find_address(l
, family
, in_addr
);
1701 int manager_our_packet(Manager
*m
, DnsPacket
*p
) {
1705 return !!manager_find_link_address(m
, p
->family
, &p
->sender
);
1708 static const char* const support_table
[_SUPPORT_MAX
] = {
1709 [SUPPORT_NO
] = "no",
1710 [SUPPORT_YES
] = "yes",
1711 [SUPPORT_RESOLVE
] = "resolve",
1713 DEFINE_STRING_TABLE_LOOKUP(support
, Support
);