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 int manager_new(Manager
**ret
) {
396 _cleanup_(manager_freep
) Manager
*m
= NULL
;
401 m
= new0(Manager
, 1);
405 m
->dns_ipv4_fd
= m
->dns_ipv6_fd
= -1;
406 m
->llmnr_ipv4_udp_fd
= m
->llmnr_ipv6_udp_fd
= -1;
407 m
->llmnr_ipv4_tcp_fd
= m
->llmnr_ipv6_tcp_fd
= -1;
410 m
->llmnr_support
= SUPPORT_YES
;
411 m
->read_resolv_conf
= true;
413 r
= manager_parse_dns_server(m
, DNS_SERVER_FALLBACK
, DNS_SERVERS
);
417 r
= sd_event_default(&m
->event
);
421 sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
422 sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
424 sd_event_set_watchdog(m
->event
, true);
426 r
= manager_watch_hostname(m
);
430 r
= dns_scope_new(m
, &m
->unicast_scope
, NULL
, DNS_PROTOCOL_DNS
, AF_UNSPEC
);
434 r
= manager_network_monitor_listen(m
);
438 r
= manager_rtnl_listen(m
);
442 r
= manager_connect_bus(m
);
446 r
= manager_llmnr_ipv4_udp_fd(m
);
449 r
= manager_llmnr_ipv6_udp_fd(m
);
452 r
= manager_llmnr_ipv4_tcp_fd(m
);
455 r
= manager_llmnr_ipv6_tcp_fd(m
);
465 Manager
*manager_free(Manager
*m
) {
471 while (m
->dns_queries
)
472 dns_query_free(m
->dns_queries
);
474 hashmap_free(m
->dns_transactions
);
476 while ((l
= hashmap_first(m
->links
)))
478 hashmap_free(m
->links
);
480 dns_scope_free(m
->unicast_scope
);
482 while (m
->dns_servers
)
483 dns_server_free(m
->dns_servers
);
484 while (m
->fallback_dns_servers
)
485 dns_server_free(m
->fallback_dns_servers
);
487 sd_event_source_unref(m
->network_event_source
);
488 sd_network_monitor_unref(m
->network_monitor
);
490 sd_event_source_unref(m
->dns_ipv4_event_source
);
491 sd_event_source_unref(m
->dns_ipv6_event_source
);
492 safe_close(m
->dns_ipv4_fd
);
493 safe_close(m
->dns_ipv6_fd
);
495 sd_event_source_unref(m
->llmnr_ipv4_udp_event_source
);
496 sd_event_source_unref(m
->llmnr_ipv6_udp_event_source
);
497 safe_close(m
->llmnr_ipv4_udp_fd
);
498 safe_close(m
->llmnr_ipv6_udp_fd
);
500 sd_event_source_unref(m
->llmnr_ipv4_tcp_event_source
);
501 sd_event_source_unref(m
->llmnr_ipv6_tcp_event_source
);
502 safe_close(m
->llmnr_ipv4_tcp_fd
);
503 safe_close(m
->llmnr_ipv6_tcp_fd
);
505 sd_event_source_unref(m
->bus_retry_event_source
);
506 sd_bus_unref(m
->bus
);
508 sd_event_unref(m
->event
);
510 dns_resource_key_unref(m
->host_ipv4_key
);
511 dns_resource_key_unref(m
->host_ipv6_key
);
513 safe_close(m
->hostname_fd
);
514 sd_event_source_unref(m
->hostname_event_source
);
522 int manager_read_resolv_conf(Manager
*m
) {
523 _cleanup_fclose_
FILE *f
= NULL
;
532 /* Reads the system /etc/resolv.conf, if it exists and is not
533 * symlinked to our own resolv.conf instance */
535 if (!m
->read_resolv_conf
)
538 r
= stat("/etc/resolv.conf", &st
);
541 log_warning("Failed to open /etc/resolv.conf: %m");
546 /* Have we already seen the file? */
547 t
= timespec_load(&st
.st_mtim
);
548 if (t
== m
->resolv_conf_mtime
)
551 m
->resolv_conf_mtime
= t
;
553 /* Is it symlinked to our own file? */
554 if (stat("/run/systemd/resolve/resolv.conf", &own
) >= 0 &&
555 st
.st_dev
== own
.st_dev
&&
556 st
.st_ino
== own
.st_ino
) {
561 f
= fopen("/etc/resolv.conf", "re");
564 log_warning("Failed to open /etc/resolv.conf: %m");
569 if (fstat(fileno(f
), &st
) < 0) {
570 log_error("Failed to stat open file: %m");
575 LIST_FOREACH(servers
, s
, m
->dns_servers
)
578 FOREACH_LINE(line
, f
, r
= -errno
; goto clear
) {
579 union in_addr_union address
;
587 if (*l
== '#' || *l
== ';')
590 a
= first_word(l
, "nameserver");
594 r
= in_addr_from_string_auto(a
, &family
, &address
);
596 log_warning("Failed to parse name server %s.", a
);
600 LIST_FOREACH(servers
, s
, m
->dns_servers
)
601 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, &address
) > 0)
607 r
= dns_server_new(m
, NULL
, DNS_SERVER_SYSTEM
, NULL
, family
, &address
);
613 LIST_FOREACH_SAFE(servers
, s
, nx
, m
->dns_servers
)
620 while (m
->dns_servers
)
621 dns_server_free(m
->dns_servers
);
626 static void write_resolve_conf_server(DnsServer
*s
, FILE *f
, unsigned *count
) {
627 _cleanup_free_
char *t
= NULL
;
634 r
= in_addr_to_string(s
->family
, &s
->address
, &t
);
636 log_warning("Invalid DNS address. Ignoring: %s", strerror(-r
));
641 fputs("# Too many DNS servers configured, the following entries may be ignored\n", f
);
643 fprintf(f
, "nameserver %s\n", t
);
647 int manager_write_resolv_conf(Manager
*m
) {
648 static const char path
[] = "/run/systemd/resolve/resolv.conf";
649 _cleanup_free_
char *temp_path
= NULL
;
650 _cleanup_fclose_
FILE *f
= NULL
;
659 /* Read the system /etc/resolv.conf first */
660 manager_read_resolv_conf(m
);
662 r
= fopen_temporary(path
, &f
, &temp_path
);
666 fchmod(fileno(f
), 0644);
668 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
669 "# Third party programs must not access this file directly, but\n"
670 "# only through the symlink at /etc/resolv.conf. To manage\n"
671 "# resolv.conf(5) in a different way, replace the symlink by a\n"
672 "# static file or a different symlink.\n\n", f
);
674 LIST_FOREACH(servers
, s
, m
->dns_servers
)
675 write_resolve_conf_server(s
, f
, &count
);
677 HASHMAP_FOREACH(l
, m
->links
, i
)
678 LIST_FOREACH(servers
, s
, l
->dns_servers
)
679 write_resolve_conf_server(s
, f
, &count
);
682 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
)
683 write_resolve_conf_server(s
, f
, &count
);
686 r
= fflush_and_check(f
);
690 if (rename(temp_path
, path
) < 0) {
703 int manager_recv(Manager
*m
, int fd
, DnsProtocol protocol
, DnsPacket
**ret
) {
704 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
706 struct cmsghdr header
; /* For alignment */
707 uint8_t buffer
[CMSG_SPACE(MAX(sizeof(struct in_pktinfo
), sizeof(struct in6_pktinfo
)))
708 + CMSG_SPACE(int) /* ttl/hoplimit */
709 + EXTRA_CMSG_SPACE
/* kernel appears to require extra buffer space */];
711 union sockaddr_union sa
;
712 struct msghdr mh
= {};
713 struct cmsghdr
*cmsg
;
722 r
= ioctl(fd
, FIONREAD
, &ms
);
728 r
= dns_packet_new(&p
, protocol
, ms
);
732 iov
.iov_base
= DNS_PACKET_DATA(p
);
733 iov
.iov_len
= p
->allocated
;
735 mh
.msg_name
= &sa
.sa
;
736 mh
.msg_namelen
= sizeof(sa
);
739 mh
.msg_control
= &control
;
740 mh
.msg_controllen
= sizeof(control
);
742 l
= recvmsg(fd
, &mh
, 0);
744 if (errno
== EAGAIN
|| errno
== EINTR
)
753 assert(!(mh
.msg_flags
& MSG_CTRUNC
));
754 assert(!(mh
.msg_flags
& MSG_TRUNC
));
756 p
->size
= (size_t) l
;
758 p
->family
= sa
.sa
.sa_family
;
759 p
->ipproto
= IPPROTO_UDP
;
760 if (p
->family
== AF_INET
) {
761 p
->sender
.in
= sa
.in
.sin_addr
;
762 p
->sender_port
= be16toh(sa
.in
.sin_port
);
763 } else if (p
->family
== AF_INET6
) {
764 p
->sender
.in6
= sa
.in6
.sin6_addr
;
765 p
->sender_port
= be16toh(sa
.in6
.sin6_port
);
766 p
->ifindex
= sa
.in6
.sin6_scope_id
;
768 return -EAFNOSUPPORT
;
770 for (cmsg
= CMSG_FIRSTHDR(&mh
); cmsg
; cmsg
= CMSG_NXTHDR(&mh
, cmsg
)) {
772 if (cmsg
->cmsg_level
== IPPROTO_IPV6
) {
773 assert(p
->family
== AF_INET6
);
775 switch (cmsg
->cmsg_type
) {
778 struct in6_pktinfo
*i
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
781 p
->ifindex
= i
->ipi6_ifindex
;
783 p
->destination
.in6
= i
->ipi6_addr
;
788 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
792 } else if (cmsg
->cmsg_level
== IPPROTO_IP
) {
793 assert(p
->family
== AF_INET
);
795 switch (cmsg
->cmsg_type
) {
798 struct in_pktinfo
*i
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
801 p
->ifindex
= i
->ipi_ifindex
;
803 p
->destination
.in
= i
->ipi_addr
;
808 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
814 /* The Linux kernel sets the interface index to the loopback
815 * device if the packet came from the local host since it
816 * avoids the routing table in such a case. Let's unset the
817 * interface index in such a case. */
818 if (p
->ifindex
> 0 && manager_ifindex_is_loopback(m
, p
->ifindex
) != 0)
821 /* If we don't know the interface index still, we look for the
822 * first local interface with a matching address. Yuck! */
824 p
->ifindex
= manager_find_ifindex(m
, p
->family
, &p
->destination
);
832 static int on_dns_packet(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
833 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
834 DnsTransaction
*t
= NULL
;
835 Manager
*m
= userdata
;
838 r
= manager_recv(m
, fd
, DNS_PROTOCOL_DNS
, &p
);
842 if (dns_packet_validate_reply(p
) > 0) {
843 t
= hashmap_get(m
->dns_transactions
, UINT_TO_PTR(DNS_PACKET_ID(p
)));
847 dns_transaction_process_reply(t
, p
);
850 log_debug("Invalid DNS packet.");
855 int manager_dns_ipv4_fd(Manager
*m
) {
861 if (m
->dns_ipv4_fd
>= 0)
862 return m
->dns_ipv4_fd
;
864 m
->dns_ipv4_fd
= socket(AF_INET
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
865 if (m
->dns_ipv4_fd
< 0)
868 r
= setsockopt(m
->dns_ipv4_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
874 r
= sd_event_add_io(m
->event
, &m
->dns_ipv4_event_source
, m
->dns_ipv4_fd
, EPOLLIN
, on_dns_packet
, m
);
878 return m
->dns_ipv4_fd
;
881 m
->dns_ipv4_fd
= safe_close(m
->dns_ipv4_fd
);
885 int manager_dns_ipv6_fd(Manager
*m
) {
891 if (m
->dns_ipv6_fd
>= 0)
892 return m
->dns_ipv6_fd
;
894 m
->dns_ipv6_fd
= socket(AF_INET6
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
895 if (m
->dns_ipv6_fd
< 0)
898 r
= setsockopt(m
->dns_ipv6_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
904 r
= sd_event_add_io(m
->event
, &m
->dns_ipv6_event_source
, m
->dns_ipv6_fd
, EPOLLIN
, on_dns_packet
, m
);
908 return m
->dns_ipv6_fd
;
911 m
->dns_ipv6_fd
= safe_close(m
->dns_ipv6_fd
);
915 static int sendmsg_loop(int fd
, struct msghdr
*mh
, int flags
) {
922 if (sendmsg(fd
, mh
, flags
) >= 0)
931 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
939 static int manager_ipv4_send(Manager
*m
, int fd
, int ifindex
, const struct in_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
940 union sockaddr_union sa
= {
941 .in
.sin_family
= AF_INET
,
944 struct cmsghdr header
; /* For alignment */
945 uint8_t buffer
[CMSG_SPACE(sizeof(struct in_pktinfo
))];
947 struct msghdr mh
= {};
956 iov
.iov_base
= DNS_PACKET_DATA(p
);
957 iov
.iov_len
= p
->size
;
959 sa
.in
.sin_addr
= *addr
;
960 sa
.in
.sin_port
= htobe16(port
),
964 mh
.msg_name
= &sa
.sa
;
965 mh
.msg_namelen
= sizeof(sa
.in
);
968 struct cmsghdr
*cmsg
;
969 struct in_pktinfo
*pi
;
973 mh
.msg_control
= &control
;
974 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in_pktinfo
));
976 cmsg
= CMSG_FIRSTHDR(&mh
);
977 cmsg
->cmsg_len
= mh
.msg_controllen
;
978 cmsg
->cmsg_level
= IPPROTO_IP
;
979 cmsg
->cmsg_type
= IP_PKTINFO
;
981 pi
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
982 pi
->ipi_ifindex
= ifindex
;
985 return sendmsg_loop(fd
, &mh
, 0);
988 static int manager_ipv6_send(Manager
*m
, int fd
, int ifindex
, const struct in6_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
989 union sockaddr_union sa
= {
990 .in6
.sin6_family
= AF_INET6
,
993 struct cmsghdr header
; /* For alignment */
994 uint8_t buffer
[CMSG_SPACE(sizeof(struct in6_pktinfo
))];
996 struct msghdr mh
= {};
1005 iov
.iov_base
= DNS_PACKET_DATA(p
);
1006 iov
.iov_len
= p
->size
;
1008 sa
.in6
.sin6_addr
= *addr
;
1009 sa
.in6
.sin6_port
= htobe16(port
),
1010 sa
.in6
.sin6_scope_id
= ifindex
;
1014 mh
.msg_name
= &sa
.sa
;
1015 mh
.msg_namelen
= sizeof(sa
.in6
);
1018 struct cmsghdr
*cmsg
;
1019 struct in6_pktinfo
*pi
;
1023 mh
.msg_control
= &control
;
1024 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in6_pktinfo
));
1026 cmsg
= CMSG_FIRSTHDR(&mh
);
1027 cmsg
->cmsg_len
= mh
.msg_controllen
;
1028 cmsg
->cmsg_level
= IPPROTO_IPV6
;
1029 cmsg
->cmsg_type
= IPV6_PKTINFO
;
1031 pi
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
1032 pi
->ipi6_ifindex
= ifindex
;
1035 return sendmsg_loop(fd
, &mh
, 0);
1038 int manager_send(Manager
*m
, int fd
, int ifindex
, int family
, const union in_addr_union
*addr
, uint16_t port
, DnsPacket
*p
) {
1045 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
));
1047 if (family
== AF_INET
)
1048 return manager_ipv4_send(m
, fd
, ifindex
, &addr
->in
, port
, p
);
1049 else if (family
== AF_INET6
)
1050 return manager_ipv6_send(m
, fd
, ifindex
, &addr
->in6
, port
, p
);
1052 return -EAFNOSUPPORT
;
1055 DnsServer
* manager_find_dns_server(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1061 LIST_FOREACH(servers
, s
, m
->dns_servers
)
1062 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
) > 0)
1065 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
)
1066 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
) > 0)
1072 DnsServer
*manager_set_dns_server(Manager
*m
, DnsServer
*s
) {
1075 if (m
->current_dns_server
== s
)
1079 _cleanup_free_
char *ip
= NULL
;
1081 in_addr_to_string(s
->family
, &s
->address
, &ip
);
1082 log_info("Switching to system DNS server %s.", strna(ip
));
1085 m
->current_dns_server
= s
;
1087 if (m
->unicast_scope
)
1088 dns_cache_flush(&m
->unicast_scope
->cache
);
1093 DnsServer
*manager_get_dns_server(Manager
*m
) {
1097 /* Try to read updates resolv.conf */
1098 manager_read_resolv_conf(m
);
1100 if (!m
->current_dns_server
)
1101 manager_set_dns_server(m
, m
->dns_servers
);
1103 if (!m
->current_dns_server
) {
1107 /* No DNS servers configured, let's see if there are
1108 * any on any links. If not, we use the fallback
1111 HASHMAP_FOREACH(l
, m
->links
, i
)
1112 if (l
->dns_servers
) {
1118 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1121 return m
->current_dns_server
;
1124 void manager_next_dns_server(Manager
*m
) {
1127 /* If there's currently no DNS server set, then the next
1128 * manager_get_dns_server() will find one */
1129 if (!m
->current_dns_server
)
1132 /* Change to the next one */
1133 if (m
->current_dns_server
->servers_next
) {
1134 manager_set_dns_server(m
, m
->current_dns_server
->servers_next
);
1138 /* If there was no next one, then start from the beginning of
1140 if (m
->current_dns_server
->type
== DNS_SERVER_FALLBACK
)
1141 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1143 manager_set_dns_server(m
, m
->dns_servers
);
1146 uint32_t manager_find_mtu(Manager
*m
) {
1151 /* If we don't know on which link a DNS packet would be
1152 * delivered, let's find the largest MTU that works on all
1153 * interfaces we know of */
1155 HASHMAP_FOREACH(l
, m
->links
, i
) {
1159 if (mtu
<= 0 || l
->mtu
< mtu
)
1166 static int on_llmnr_packet(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
1167 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
1168 DnsTransaction
*t
= NULL
;
1169 Manager
*m
= userdata
;
1172 r
= manager_recv(m
, fd
, DNS_PROTOCOL_LLMNR
, &p
);
1176 if (dns_packet_validate_reply(p
) > 0) {
1177 log_debug("Got reply packet for id %u", DNS_PACKET_ID(p
));
1179 t
= hashmap_get(m
->dns_transactions
, UINT_TO_PTR(DNS_PACKET_ID(p
)));
1183 dns_transaction_process_reply(t
, p
);
1185 } else if (dns_packet_validate_query(p
) > 0) {
1188 l
= hashmap_get(m
->links
, INT_TO_PTR(p
->ifindex
));
1190 DnsScope
*scope
= NULL
;
1192 if (p
->family
== AF_INET
)
1193 scope
= l
->llmnr_ipv4_scope
;
1194 else if (p
->family
== AF_INET6
)
1195 scope
= l
->llmnr_ipv6_scope
;
1198 dns_scope_process_query(scope
, NULL
, p
);
1201 log_debug("Invalid LLMNR packet.");
1206 int manager_llmnr_ipv4_udp_fd(Manager
*m
) {
1207 union sockaddr_union sa
= {
1208 .in
.sin_family
= AF_INET
,
1209 .in
.sin_port
= htobe16(5355),
1211 static const int one
= 1, pmtu
= IP_PMTUDISC_DONT
, ttl
= 255;
1216 if (m
->llmnr_ipv4_udp_fd
>= 0)
1217 return m
->llmnr_ipv4_udp_fd
;
1219 m
->llmnr_ipv4_udp_fd
= socket(AF_INET
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1220 if (m
->llmnr_ipv4_udp_fd
< 0)
1223 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1224 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_TTL
, &ttl
, sizeof(ttl
));
1230 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MULTICAST_TTL
, &ttl
, sizeof(ttl
));
1236 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MULTICAST_LOOP
, &one
, sizeof(one
));
1242 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1248 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
1254 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_RECVTTL
, &one
, sizeof(one
));
1260 /* Disable Don't-Fragment bit in the IP header */
1261 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MTU_DISCOVER
, &pmtu
, sizeof(pmtu
));
1267 r
= bind(m
->llmnr_ipv4_udp_fd
, &sa
.sa
, sizeof(sa
.in
));
1273 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv4_udp_event_source
, m
->llmnr_ipv4_udp_fd
, EPOLLIN
, on_llmnr_packet
, m
);
1277 return m
->llmnr_ipv4_udp_fd
;
1280 m
->llmnr_ipv4_udp_fd
= safe_close(m
->llmnr_ipv4_udp_fd
);
1284 int manager_llmnr_ipv6_udp_fd(Manager
*m
) {
1285 union sockaddr_union sa
= {
1286 .in6
.sin6_family
= AF_INET6
,
1287 .in6
.sin6_port
= htobe16(5355),
1289 static const int one
= 1, ttl
= 255;
1294 if (m
->llmnr_ipv6_udp_fd
>= 0)
1295 return m
->llmnr_ipv6_udp_fd
;
1297 m
->llmnr_ipv6_udp_fd
= socket(AF_INET6
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1298 if (m
->llmnr_ipv6_udp_fd
< 0)
1301 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &ttl
, sizeof(ttl
));
1307 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1308 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_MULTICAST_HOPS
, &ttl
, sizeof(ttl
));
1314 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_MULTICAST_LOOP
, &one
, sizeof(one
));
1320 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_V6ONLY
, &one
, sizeof(one
));
1326 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1332 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
1338 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_RECVHOPLIMIT
, &one
, sizeof(one
));
1344 r
= bind(m
->llmnr_ipv6_udp_fd
, &sa
.sa
, sizeof(sa
.in6
));
1350 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv6_udp_event_source
, m
->llmnr_ipv6_udp_fd
, EPOLLIN
, on_llmnr_packet
, m
);
1356 return m
->llmnr_ipv6_udp_fd
;
1359 m
->llmnr_ipv6_udp_fd
= safe_close(m
->llmnr_ipv6_udp_fd
);
1363 static int on_llmnr_stream_packet(DnsStream
*s
) {
1366 if (dns_packet_validate_query(s
->read_packet
) > 0) {
1369 l
= hashmap_get(s
->manager
->links
, INT_TO_PTR(s
->read_packet
->ifindex
));
1371 DnsScope
*scope
= NULL
;
1373 if (s
->read_packet
->family
== AF_INET
)
1374 scope
= l
->llmnr_ipv4_scope
;
1375 else if (s
->read_packet
->family
== AF_INET6
)
1376 scope
= l
->llmnr_ipv6_scope
;
1379 dns_scope_process_query(scope
, s
, s
->read_packet
);
1381 /* If no reply packet was set, we free the stream */
1382 if (s
->write_packet
)
1392 static int on_llmnr_stream(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
1394 Manager
*m
= userdata
;
1397 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
|SOCK_CLOEXEC
);
1399 if (errno
== EAGAIN
|| errno
== EINTR
)
1405 r
= dns_stream_new(m
, &stream
, DNS_PROTOCOL_LLMNR
, cfd
);
1411 stream
->on_packet
= on_llmnr_stream_packet
;
1415 int manager_llmnr_ipv4_tcp_fd(Manager
*m
) {
1416 union sockaddr_union sa
= {
1417 .in
.sin_family
= AF_INET
,
1418 .in
.sin_port
= htobe16(5355),
1420 static const int one
= 1, pmtu
= IP_PMTUDISC_DONT
;
1425 if (m
->llmnr_ipv4_tcp_fd
>= 0)
1426 return m
->llmnr_ipv4_tcp_fd
;
1428 m
->llmnr_ipv4_tcp_fd
= socket(AF_INET
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1429 if (m
->llmnr_ipv4_tcp_fd
< 0)
1432 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1433 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_TTL
, &one
, sizeof(one
));
1439 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1445 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
1451 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_RECVTTL
, &one
, sizeof(one
));
1457 /* Disable Don't-Fragment bit in the IP header */
1458 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_MTU_DISCOVER
, &pmtu
, sizeof(pmtu
));
1464 r
= bind(m
->llmnr_ipv4_tcp_fd
, &sa
.sa
, sizeof(sa
.in
));
1470 r
= listen(m
->llmnr_ipv4_tcp_fd
, SOMAXCONN
);
1476 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv4_tcp_event_source
, m
->llmnr_ipv4_tcp_fd
, EPOLLIN
, on_llmnr_stream
, m
);
1480 return m
->llmnr_ipv4_tcp_fd
;
1483 m
->llmnr_ipv4_tcp_fd
= safe_close(m
->llmnr_ipv4_tcp_fd
);
1487 int manager_llmnr_ipv6_tcp_fd(Manager
*m
) {
1488 union sockaddr_union sa
= {
1489 .in6
.sin6_family
= AF_INET6
,
1490 .in6
.sin6_port
= htobe16(5355),
1492 static const int one
= 1;
1497 if (m
->llmnr_ipv6_tcp_fd
>= 0)
1498 return m
->llmnr_ipv6_tcp_fd
;
1500 m
->llmnr_ipv6_tcp_fd
= socket(AF_INET6
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1501 if (m
->llmnr_ipv6_tcp_fd
< 0)
1504 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1505 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &one
, sizeof(one
));
1511 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_V6ONLY
, &one
, sizeof(one
));
1517 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1523 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
1529 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_RECVHOPLIMIT
, &one
, sizeof(one
));
1535 r
= bind(m
->llmnr_ipv6_tcp_fd
, &sa
.sa
, sizeof(sa
.in6
));
1541 r
= listen(m
->llmnr_ipv6_tcp_fd
, SOMAXCONN
);
1547 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv6_tcp_event_source
, m
->llmnr_ipv6_tcp_fd
, EPOLLIN
, on_llmnr_stream
, m
);
1553 return m
->llmnr_ipv6_tcp_fd
;
1556 m
->llmnr_ipv6_tcp_fd
= safe_close(m
->llmnr_ipv6_tcp_fd
);
1560 int manager_ifindex_is_loopback(Manager
*m
, int ifindex
) {
1567 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
1568 if (l
->flags
& IFF_LOOPBACK
)
1574 int manager_find_ifindex(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1579 a
= manager_find_link_address(m
, family
, in_addr
);
1581 return a
->link
->ifindex
;
1586 void manager_refresh_rrs(Manager
*m
) {
1592 m
->host_ipv4_key
= dns_resource_key_unref(m
->host_ipv4_key
);
1593 m
->host_ipv6_key
= dns_resource_key_unref(m
->host_ipv6_key
);
1595 HASHMAP_FOREACH(l
, m
->links
, i
) {
1596 link_add_rrs(l
, true);
1597 link_add_rrs(l
, false);
1601 int manager_next_hostname(Manager
*m
) {
1608 p
= strchr(m
->hostname
, 0);
1611 while (p
> m
->hostname
) {
1612 if (!strchr("0123456789", p
[-1]))
1618 if (*p
== 0 || safe_atou64(p
, &u
) < 0 || u
<= 0)
1623 if (asprintf(&h
, "%.*s%" PRIu64
, (int) (p
- m
->hostname
), m
->hostname
, u
) < 0)
1626 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m
->hostname
, h
);
1631 manager_refresh_rrs(m
);
1636 LinkAddress
* manager_find_link_address(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1642 HASHMAP_FOREACH(l
, m
->links
, i
) {
1645 a
= link_find_address(l
, family
, in_addr
);
1653 int manager_our_packet(Manager
*m
, DnsPacket
*p
) {
1657 return !!manager_find_link_address(m
, p
->family
, &p
->sender
);
1660 static const char* const support_table
[_SUPPORT_MAX
] = {
1661 [SUPPORT_NO
] = "no",
1662 [SUPPORT_YES
] = "yes",
1663 [SUPPORT_RESOLVE
] = "resolve",
1665 DEFINE_STRING_TABLE_LOOKUP(support
, Support
);