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"
39 #include "resolved-conf.h"
40 #include "resolved-dns-domain.h"
42 #define SEND_TIMEOUT_USEC (200 * USEC_PER_MSEC)
44 static int manager_process_link(sd_rtnl
*rtnl
, sd_rtnl_message
*mm
, void *userdata
) {
45 Manager
*m
= userdata
;
54 r
= sd_rtnl_message_get_type(mm
, &type
);
58 r
= sd_rtnl_message_link_get_ifindex(mm
, &ifindex
);
62 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
70 r
= link_new(m
, &l
, ifindex
);
75 r
= link_update_rtnl(l
, mm
);
80 log_debug("Found new link %i/%s", ifindex
, l
->name
);
87 log_debug("Removing link %i/%s", l
->ifindex
, l
->name
);
97 log_warning("Failed to process RTNL link message: %s", strerror(-r
));
101 static int manager_process_address(sd_rtnl
*rtnl
, sd_rtnl_message
*mm
, void *userdata
) {
102 Manager
*m
= userdata
;
103 union in_addr_union address
;
105 int r
, ifindex
, family
;
113 r
= sd_rtnl_message_get_type(mm
, &type
);
117 r
= sd_rtnl_message_addr_get_ifindex(mm
, &ifindex
);
121 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
125 r
= sd_rtnl_message_addr_get_family(mm
, &family
);
132 r
= sd_rtnl_message_read_in_addr(mm
, IFA_LOCAL
, &address
.in
);
134 r
= sd_rtnl_message_read_in_addr(mm
, IFA_ADDRESS
, &address
.in
);
142 r
= sd_rtnl_message_read_in6_addr(mm
, IFA_LOCAL
, &address
.in6
);
144 r
= sd_rtnl_message_read_in6_addr(mm
, IFA_ADDRESS
, &address
.in6
);
155 a
= link_find_address(l
, family
, &address
);
162 r
= link_address_new(l
, &a
, family
, &address
);
167 r
= link_address_update_rtnl(a
, mm
);
175 link_address_free(a
);
182 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
) {
362 _cleanup_free_
char *h
= NULL
;
367 m
->hostname_fd
= open("/proc/sys/kernel/hostname", O_RDONLY
|O_CLOEXEC
|O_NDELAY
|O_NOCTTY
);
368 if (m
->hostname_fd
< 0) {
369 log_warning("Failed to watch hostname: %m");
373 r
= sd_event_add_io(m
->event
, &m
->hostname_event_source
, m
->hostname_fd
, 0, on_hostname_change
, m
);
376 /* kernels prior to 3.2 don't support polling this file. Ignore the failure. */
377 m
->hostname_fd
= safe_close(m
->hostname_fd
);
379 log_error("Failed to add hostname event source: %s", strerror(-r
));
384 r
= determine_hostname(&m
->hostname
);
386 log_info("Defaulting to hostname 'linux'.");
387 m
->hostname
= strdup("linux");
391 log_info("Using system hostname '%s'.", m
->hostname
);
396 int manager_new(Manager
**ret
) {
397 _cleanup_(manager_freep
) Manager
*m
= NULL
;
402 m
= new0(Manager
, 1);
406 m
->dns_ipv4_fd
= m
->dns_ipv6_fd
= -1;
407 m
->llmnr_ipv4_udp_fd
= m
->llmnr_ipv6_udp_fd
= -1;
408 m
->llmnr_ipv4_tcp_fd
= m
->llmnr_ipv6_tcp_fd
= -1;
411 m
->llmnr_support
= SUPPORT_YES
;
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 static void write_resolve_conf_server(DnsServer
*s
, FILE *f
, unsigned *count
) {
523 _cleanup_free_
char *t
= NULL
;
530 r
= in_addr_to_string(s
->family
, &s
->address
, &t
);
532 log_warning("Invalid DNS address. Ignoring: %s", strerror(-r
));
537 fputs("# Too many DNS servers configured, the following entries may be ignored\n", f
);
539 fprintf(f
, "nameserver %s\n", t
);
543 int manager_write_resolv_conf(Manager
*m
) {
544 static const char path
[] = "/run/systemd/resolve/resolv.conf";
545 _cleanup_free_
char *temp_path
= NULL
;
546 _cleanup_fclose_
FILE *f
= NULL
;
555 r
= fopen_temporary(path
, &f
, &temp_path
);
559 fchmod(fileno(f
), 0644);
561 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
562 "# Third party programs must not access this file directly, but\n"
563 "# only through the symlink at /etc/resolv.conf. To manage\n"
564 "# resolv.conf(5) in a different way, replace the symlink by a\n"
565 "# static file or a different symlink.\n\n", f
);
567 LIST_FOREACH(servers
, s
, m
->dns_servers
)
568 write_resolve_conf_server(s
, f
, &count
);
570 HASHMAP_FOREACH(l
, m
->links
, i
)
571 LIST_FOREACH(servers
, s
, l
->dns_servers
)
572 write_resolve_conf_server(s
, f
, &count
);
575 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
)
576 write_resolve_conf_server(s
, f
, &count
);
579 r
= fflush_and_check(f
);
583 if (rename(temp_path
, path
) < 0) {
596 int manager_recv(Manager
*m
, int fd
, DnsProtocol protocol
, DnsPacket
**ret
) {
597 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
599 struct cmsghdr header
; /* For alignment */
600 uint8_t buffer
[CMSG_SPACE(MAX(sizeof(struct in_pktinfo
), sizeof(struct in6_pktinfo
)))
601 + CMSG_SPACE(int) /* ttl/hoplimit */
602 + EXTRA_CMSG_SPACE
/* kernel appears to require extra buffer space */];
604 union sockaddr_union sa
;
605 struct msghdr mh
= {};
606 struct cmsghdr
*cmsg
;
615 r
= ioctl(fd
, FIONREAD
, &ms
);
621 r
= dns_packet_new(&p
, protocol
, ms
);
625 iov
.iov_base
= DNS_PACKET_DATA(p
);
626 iov
.iov_len
= p
->allocated
;
628 mh
.msg_name
= &sa
.sa
;
629 mh
.msg_namelen
= sizeof(sa
);
632 mh
.msg_control
= &control
;
633 mh
.msg_controllen
= sizeof(control
);
635 l
= recvmsg(fd
, &mh
, 0);
637 if (errno
== EAGAIN
|| errno
== EINTR
)
646 assert(!(mh
.msg_flags
& MSG_CTRUNC
));
647 assert(!(mh
.msg_flags
& MSG_TRUNC
));
649 p
->size
= (size_t) l
;
651 p
->family
= sa
.sa
.sa_family
;
652 p
->ipproto
= IPPROTO_UDP
;
653 if (p
->family
== AF_INET
) {
654 p
->sender
.in
= sa
.in
.sin_addr
;
655 p
->sender_port
= be16toh(sa
.in
.sin_port
);
656 } else if (p
->family
== AF_INET6
) {
657 p
->sender
.in6
= sa
.in6
.sin6_addr
;
658 p
->sender_port
= be16toh(sa
.in6
.sin6_port
);
659 p
->ifindex
= sa
.in6
.sin6_scope_id
;
661 return -EAFNOSUPPORT
;
663 for (cmsg
= CMSG_FIRSTHDR(&mh
); cmsg
; cmsg
= CMSG_NXTHDR(&mh
, cmsg
)) {
665 if (cmsg
->cmsg_level
== IPPROTO_IPV6
) {
666 assert(p
->family
== AF_INET6
);
668 switch (cmsg
->cmsg_type
) {
671 struct in6_pktinfo
*i
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
674 p
->ifindex
= i
->ipi6_ifindex
;
676 p
->destination
.in6
= i
->ipi6_addr
;
681 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
685 } else if (cmsg
->cmsg_level
== IPPROTO_IP
) {
686 assert(p
->family
== AF_INET
);
688 switch (cmsg
->cmsg_type
) {
691 struct in_pktinfo
*i
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
694 p
->ifindex
= i
->ipi_ifindex
;
696 p
->destination
.in
= i
->ipi_addr
;
701 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
707 /* The Linux kernel sets the interface index to the loopback
708 * device if the packet came from the local host since it
709 * avoids the routing table in such a case. Let's unset the
710 * interface index in such a case. */
711 if (p
->ifindex
> 0 && manager_ifindex_is_loopback(m
, p
->ifindex
) != 0)
714 /* If we don't know the interface index still, we look for the
715 * first local interface with a matching address. Yuck! */
717 p
->ifindex
= manager_find_ifindex(m
, p
->family
, &p
->destination
);
725 static int on_dns_packet(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
726 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
727 DnsTransaction
*t
= NULL
;
728 Manager
*m
= userdata
;
731 r
= manager_recv(m
, fd
, DNS_PROTOCOL_DNS
, &p
);
735 if (dns_packet_validate_reply(p
) > 0) {
736 t
= hashmap_get(m
->dns_transactions
, UINT_TO_PTR(DNS_PACKET_ID(p
)));
740 dns_transaction_process_reply(t
, p
);
743 log_debug("Invalid DNS packet.");
748 int manager_dns_ipv4_fd(Manager
*m
) {
754 if (m
->dns_ipv4_fd
>= 0)
755 return m
->dns_ipv4_fd
;
757 m
->dns_ipv4_fd
= socket(AF_INET
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
758 if (m
->dns_ipv4_fd
< 0)
761 r
= setsockopt(m
->dns_ipv4_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
767 r
= sd_event_add_io(m
->event
, &m
->dns_ipv4_event_source
, m
->dns_ipv4_fd
, EPOLLIN
, on_dns_packet
, m
);
771 return m
->dns_ipv4_fd
;
774 m
->dns_ipv4_fd
= safe_close(m
->dns_ipv4_fd
);
778 int manager_dns_ipv6_fd(Manager
*m
) {
784 if (m
->dns_ipv6_fd
>= 0)
785 return m
->dns_ipv6_fd
;
787 m
->dns_ipv6_fd
= socket(AF_INET6
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
788 if (m
->dns_ipv6_fd
< 0)
791 r
= setsockopt(m
->dns_ipv6_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
797 r
= sd_event_add_io(m
->event
, &m
->dns_ipv6_event_source
, m
->dns_ipv6_fd
, EPOLLIN
, on_dns_packet
, m
);
801 return m
->dns_ipv6_fd
;
804 m
->dns_ipv6_fd
= safe_close(m
->dns_ipv6_fd
);
808 static int sendmsg_loop(int fd
, struct msghdr
*mh
, int flags
) {
815 if (sendmsg(fd
, mh
, flags
) >= 0)
824 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
832 static int manager_ipv4_send(Manager
*m
, int fd
, int ifindex
, const struct in_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
833 union sockaddr_union sa
= {
834 .in
.sin_family
= AF_INET
,
837 struct cmsghdr header
; /* For alignment */
838 uint8_t buffer
[CMSG_SPACE(sizeof(struct in_pktinfo
))];
840 struct msghdr mh
= {};
849 iov
.iov_base
= DNS_PACKET_DATA(p
);
850 iov
.iov_len
= p
->size
;
852 sa
.in
.sin_addr
= *addr
;
853 sa
.in
.sin_port
= htobe16(port
),
857 mh
.msg_name
= &sa
.sa
;
858 mh
.msg_namelen
= sizeof(sa
.in
);
861 struct cmsghdr
*cmsg
;
862 struct in_pktinfo
*pi
;
866 mh
.msg_control
= &control
;
867 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in_pktinfo
));
869 cmsg
= CMSG_FIRSTHDR(&mh
);
870 cmsg
->cmsg_len
= mh
.msg_controllen
;
871 cmsg
->cmsg_level
= IPPROTO_IP
;
872 cmsg
->cmsg_type
= IP_PKTINFO
;
874 pi
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
875 pi
->ipi_ifindex
= ifindex
;
878 return sendmsg_loop(fd
, &mh
, 0);
881 static int manager_ipv6_send(Manager
*m
, int fd
, int ifindex
, const struct in6_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
882 union sockaddr_union sa
= {
883 .in6
.sin6_family
= AF_INET6
,
886 struct cmsghdr header
; /* For alignment */
887 uint8_t buffer
[CMSG_SPACE(sizeof(struct in6_pktinfo
))];
889 struct msghdr mh
= {};
898 iov
.iov_base
= DNS_PACKET_DATA(p
);
899 iov
.iov_len
= p
->size
;
901 sa
.in6
.sin6_addr
= *addr
;
902 sa
.in6
.sin6_port
= htobe16(port
),
903 sa
.in6
.sin6_scope_id
= ifindex
;
907 mh
.msg_name
= &sa
.sa
;
908 mh
.msg_namelen
= sizeof(sa
.in6
);
911 struct cmsghdr
*cmsg
;
912 struct in6_pktinfo
*pi
;
916 mh
.msg_control
= &control
;
917 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in6_pktinfo
));
919 cmsg
= CMSG_FIRSTHDR(&mh
);
920 cmsg
->cmsg_len
= mh
.msg_controllen
;
921 cmsg
->cmsg_level
= IPPROTO_IPV6
;
922 cmsg
->cmsg_type
= IPV6_PKTINFO
;
924 pi
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
925 pi
->ipi6_ifindex
= ifindex
;
928 return sendmsg_loop(fd
, &mh
, 0);
931 int manager_send(Manager
*m
, int fd
, int ifindex
, int family
, const union in_addr_union
*addr
, uint16_t port
, DnsPacket
*p
) {
938 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
));
940 if (family
== AF_INET
)
941 return manager_ipv4_send(m
, fd
, ifindex
, &addr
->in
, port
, p
);
942 else if (family
== AF_INET6
)
943 return manager_ipv6_send(m
, fd
, ifindex
, &addr
->in6
, port
, p
);
945 return -EAFNOSUPPORT
;
948 bool manager_known_dns_server(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
954 LIST_FOREACH(servers
, s
, m
->dns_servers
)
955 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
))
958 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
)
959 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
))
965 static DnsServer
*manager_set_dns_server(Manager
*m
, DnsServer
*s
) {
968 if (m
->current_dns_server
== s
)
972 _cleanup_free_
char *ip
= NULL
;
974 in_addr_to_string(s
->family
, &s
->address
, &ip
);
975 log_info("Switching to system DNS server %s.", strna(ip
));
977 log_info("No system DNS server set.");
979 m
->current_dns_server
= s
;
983 DnsServer
*manager_get_dns_server(Manager
*m
) {
987 if (!m
->current_dns_server
)
988 manager_set_dns_server(m
, m
->dns_servers
);
990 if (!m
->current_dns_server
) {
994 /* No DNS servers configured, let's see if there are
995 * any on any links. If not, we use the fallback
998 HASHMAP_FOREACH(l
, m
->links
, i
)
999 if (l
->dns_servers
) {
1005 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1008 return m
->current_dns_server
;
1011 void manager_next_dns_server(Manager
*m
) {
1014 /* If there's currently no DNS server set, then the next
1015 * manager_get_dns_server() will find one */
1016 if (!m
->current_dns_server
)
1019 /* Change to the next one */
1020 if (m
->current_dns_server
->servers_next
) {
1021 manager_set_dns_server(m
, m
->current_dns_server
->servers_next
);
1025 /* If there was no next one, then start from the beginning of
1027 if (m
->current_dns_server
->type
== DNS_SERVER_FALLBACK
)
1028 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1030 manager_set_dns_server(m
, m
->dns_servers
);
1033 uint32_t manager_find_mtu(Manager
*m
) {
1038 /* If we don't know on which link a DNS packet would be
1039 * delivered, let's find the largest MTU that works on all
1040 * interfaces we know of */
1042 HASHMAP_FOREACH(l
, m
->links
, i
) {
1046 if (mtu
<= 0 || l
->mtu
< mtu
)
1053 static int on_llmnr_packet(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
1054 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
1055 DnsTransaction
*t
= NULL
;
1056 Manager
*m
= userdata
;
1059 r
= manager_recv(m
, fd
, DNS_PROTOCOL_LLMNR
, &p
);
1063 if (dns_packet_validate_reply(p
) > 0) {
1064 log_debug("Got reply packet for id %u", DNS_PACKET_ID(p
));
1066 t
= hashmap_get(m
->dns_transactions
, UINT_TO_PTR(DNS_PACKET_ID(p
)));
1070 dns_transaction_process_reply(t
, p
);
1072 } else if (dns_packet_validate_query(p
) > 0) {
1075 l
= hashmap_get(m
->links
, INT_TO_PTR(p
->ifindex
));
1077 DnsScope
*scope
= NULL
;
1079 if (p
->family
== AF_INET
)
1080 scope
= l
->llmnr_ipv4_scope
;
1081 else if (p
->family
== AF_INET6
)
1082 scope
= l
->llmnr_ipv6_scope
;
1085 dns_scope_process_query(scope
, NULL
, p
);
1088 log_debug("Invalid LLMNR packet.");
1093 int manager_llmnr_ipv4_udp_fd(Manager
*m
) {
1094 union sockaddr_union sa
= {
1095 .in
.sin_family
= AF_INET
,
1096 .in
.sin_port
= htobe16(5355),
1098 static const int one
= 1, pmtu
= IP_PMTUDISC_DONT
, ttl
= 255;
1103 if (m
->llmnr_ipv4_udp_fd
>= 0)
1104 return m
->llmnr_ipv4_udp_fd
;
1106 m
->llmnr_ipv4_udp_fd
= socket(AF_INET
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1107 if (m
->llmnr_ipv4_udp_fd
< 0)
1110 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1111 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_TTL
, &ttl
, sizeof(ttl
));
1117 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MULTICAST_TTL
, &ttl
, sizeof(ttl
));
1123 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MULTICAST_LOOP
, &one
, sizeof(one
));
1129 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1135 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
1141 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_RECVTTL
, &one
, sizeof(one
));
1147 /* Disable Don't-Fragment bit in the IP header */
1148 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MTU_DISCOVER
, &pmtu
, sizeof(pmtu
));
1154 r
= bind(m
->llmnr_ipv4_udp_fd
, &sa
.sa
, sizeof(sa
.in
));
1160 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv4_udp_event_source
, m
->llmnr_ipv4_udp_fd
, EPOLLIN
, on_llmnr_packet
, m
);
1164 return m
->llmnr_ipv4_udp_fd
;
1167 m
->llmnr_ipv4_udp_fd
= safe_close(m
->llmnr_ipv4_udp_fd
);
1171 int manager_llmnr_ipv6_udp_fd(Manager
*m
) {
1172 union sockaddr_union sa
= {
1173 .in6
.sin6_family
= AF_INET6
,
1174 .in6
.sin6_port
= htobe16(5355),
1176 static const int one
= 1, ttl
= 255;
1181 if (m
->llmnr_ipv6_udp_fd
>= 0)
1182 return m
->llmnr_ipv6_udp_fd
;
1184 m
->llmnr_ipv6_udp_fd
= socket(AF_INET6
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1185 if (m
->llmnr_ipv6_udp_fd
< 0)
1188 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &ttl
, sizeof(ttl
));
1194 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1195 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_MULTICAST_HOPS
, &ttl
, sizeof(ttl
));
1201 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_MULTICAST_LOOP
, &one
, sizeof(one
));
1207 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_V6ONLY
, &one
, sizeof(one
));
1213 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1219 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
1225 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_RECVHOPLIMIT
, &one
, sizeof(one
));
1231 r
= bind(m
->llmnr_ipv6_udp_fd
, &sa
.sa
, sizeof(sa
.in6
));
1237 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv6_udp_event_source
, m
->llmnr_ipv6_udp_fd
, EPOLLIN
, on_llmnr_packet
, m
);
1243 return m
->llmnr_ipv6_udp_fd
;
1246 m
->llmnr_ipv6_udp_fd
= safe_close(m
->llmnr_ipv6_udp_fd
);
1250 static int on_llmnr_stream_packet(DnsStream
*s
) {
1253 if (dns_packet_validate_query(s
->read_packet
) > 0) {
1256 l
= hashmap_get(s
->manager
->links
, INT_TO_PTR(s
->read_packet
->ifindex
));
1258 DnsScope
*scope
= NULL
;
1260 if (s
->read_packet
->family
== AF_INET
)
1261 scope
= l
->llmnr_ipv4_scope
;
1262 else if (s
->read_packet
->family
== AF_INET6
)
1263 scope
= l
->llmnr_ipv6_scope
;
1266 dns_scope_process_query(scope
, s
, s
->read_packet
);
1268 /* If no reply packet was set, we free the stream */
1269 if (s
->write_packet
)
1279 static int on_llmnr_stream(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
1281 Manager
*m
= userdata
;
1284 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
|SOCK_CLOEXEC
);
1286 if (errno
== EAGAIN
|| errno
== EINTR
)
1292 r
= dns_stream_new(m
, &stream
, DNS_PROTOCOL_LLMNR
, cfd
);
1298 stream
->on_packet
= on_llmnr_stream_packet
;
1302 int manager_llmnr_ipv4_tcp_fd(Manager
*m
) {
1303 union sockaddr_union sa
= {
1304 .in
.sin_family
= AF_INET
,
1305 .in
.sin_port
= htobe16(5355),
1307 static const int one
= 1, pmtu
= IP_PMTUDISC_DONT
;
1312 if (m
->llmnr_ipv4_tcp_fd
>= 0)
1313 return m
->llmnr_ipv4_tcp_fd
;
1315 m
->llmnr_ipv4_tcp_fd
= socket(AF_INET
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1316 if (m
->llmnr_ipv4_tcp_fd
< 0)
1319 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1320 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_TTL
, &one
, sizeof(one
));
1326 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1332 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
1338 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_RECVTTL
, &one
, sizeof(one
));
1344 /* Disable Don't-Fragment bit in the IP header */
1345 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_MTU_DISCOVER
, &pmtu
, sizeof(pmtu
));
1351 r
= bind(m
->llmnr_ipv4_tcp_fd
, &sa
.sa
, sizeof(sa
.in
));
1357 r
= listen(m
->llmnr_ipv4_tcp_fd
, SOMAXCONN
);
1363 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv4_tcp_event_source
, m
->llmnr_ipv4_tcp_fd
, EPOLLIN
, on_llmnr_stream
, m
);
1367 return m
->llmnr_ipv4_tcp_fd
;
1370 m
->llmnr_ipv4_tcp_fd
= safe_close(m
->llmnr_ipv4_tcp_fd
);
1374 int manager_llmnr_ipv6_tcp_fd(Manager
*m
) {
1375 union sockaddr_union sa
= {
1376 .in6
.sin6_family
= AF_INET6
,
1377 .in6
.sin6_port
= htobe16(5355),
1379 static const int one
= 1;
1384 if (m
->llmnr_ipv6_tcp_fd
>= 0)
1385 return m
->llmnr_ipv6_tcp_fd
;
1387 m
->llmnr_ipv6_tcp_fd
= socket(AF_INET6
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1388 if (m
->llmnr_ipv6_tcp_fd
< 0)
1391 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1392 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &one
, sizeof(one
));
1398 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_V6ONLY
, &one
, sizeof(one
));
1404 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1410 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
1416 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_RECVHOPLIMIT
, &one
, sizeof(one
));
1422 r
= bind(m
->llmnr_ipv6_tcp_fd
, &sa
.sa
, sizeof(sa
.in6
));
1428 r
= listen(m
->llmnr_ipv6_tcp_fd
, SOMAXCONN
);
1434 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv6_tcp_event_source
, m
->llmnr_ipv6_tcp_fd
, EPOLLIN
, on_llmnr_stream
, m
);
1440 return m
->llmnr_ipv6_tcp_fd
;
1443 m
->llmnr_ipv6_tcp_fd
= safe_close(m
->llmnr_ipv6_tcp_fd
);
1447 int manager_ifindex_is_loopback(Manager
*m
, int ifindex
) {
1454 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
1455 if (l
->flags
& IFF_LOOPBACK
)
1461 int manager_find_ifindex(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1466 a
= manager_find_link_address(m
, family
, in_addr
);
1468 return a
->link
->ifindex
;
1473 void manager_refresh_rrs(Manager
*m
) {
1479 m
->host_ipv4_key
= dns_resource_key_unref(m
->host_ipv4_key
);
1480 m
->host_ipv6_key
= dns_resource_key_unref(m
->host_ipv6_key
);
1482 HASHMAP_FOREACH(l
, m
->links
, i
) {
1483 link_add_rrs(l
, true);
1484 link_add_rrs(l
, false);
1488 int manager_next_hostname(Manager
*m
) {
1495 p
= strchr(m
->hostname
, 0);
1498 while (p
> m
->hostname
) {
1499 if (!strchr("0123456789", p
[-1]))
1505 if (*p
== 0 || safe_atou64(p
, &u
) < 0 || u
<= 0)
1510 if (asprintf(&h
, "%.*s%" PRIu64
, (int) (p
- m
->hostname
), m
->hostname
, u
) < 0)
1513 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m
->hostname
, h
);
1518 manager_refresh_rrs(m
);
1523 LinkAddress
* manager_find_link_address(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1529 HASHMAP_FOREACH(l
, m
->links
, i
) {
1532 a
= link_find_address(l
, family
, in_addr
);
1540 int manager_our_packet(Manager
*m
, DnsPacket
*p
) {
1544 return !!manager_find_link_address(m
, p
->family
, &p
->sender
);
1547 static const char* const support_table
[_SUPPORT_MAX
] = {
1548 [SUPPORT_NO
] = "no",
1549 [SUPPORT_YES
] = "yes",
1550 [SUPPORT_RESOLVE
] = "resolve",
1552 DEFINE_STRING_TABLE_LOOKUP(support
, Support
);