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
));
188 static int manager_rtnl_listen(Manager
*m
) {
189 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
, *reply
= NULL
;
195 /* First, subscibe to interfaces coming and going */
196 r
= sd_rtnl_open(&m
->rtnl
, 3, RTNLGRP_LINK
, RTNLGRP_IPV4_IFADDR
, RTNLGRP_IPV6_IFADDR
);
200 r
= sd_rtnl_attach_event(m
->rtnl
, m
->event
, 0);
204 r
= sd_rtnl_add_match(m
->rtnl
, RTM_NEWLINK
, manager_process_link
, m
);
208 r
= sd_rtnl_add_match(m
->rtnl
, RTM_DELLINK
, manager_process_link
, m
);
212 r
= sd_rtnl_add_match(m
->rtnl
, RTM_NEWADDR
, manager_process_address
, m
);
216 r
= sd_rtnl_add_match(m
->rtnl
, RTM_DELADDR
, manager_process_address
, m
);
220 /* Then, enumerate all links */
221 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
225 r
= sd_rtnl_message_request_dump(req
, true);
229 r
= sd_rtnl_call(m
->rtnl
, req
, 0, &reply
);
233 for (i
= reply
; i
; i
= sd_rtnl_message_next(i
)) {
234 r
= manager_process_link(m
->rtnl
, i
, m
);
239 req
= sd_rtnl_message_unref(req
);
240 reply
= sd_rtnl_message_unref(reply
);
242 /* Finally, enumerate all addresses, too */
243 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, AF_UNSPEC
);
247 r
= sd_rtnl_message_request_dump(req
, true);
251 r
= sd_rtnl_call(m
->rtnl
, req
, 0, &reply
);
255 for (i
= reply
; i
; i
= sd_rtnl_message_next(i
)) {
256 r
= manager_process_address(m
->rtnl
, i
, m
);
264 static int on_network_event(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
265 Manager
*m
= userdata
;
272 sd_network_monitor_flush(m
->network_monitor
);
274 HASHMAP_FOREACH(l
, m
->links
, i
) {
275 r
= link_update_monitor(l
);
277 log_warning("Failed to update monitor information for %i: %s", l
->ifindex
, strerror(-r
));
280 r
= manager_write_resolv_conf(m
);
282 log_warning("Could not update resolv.conf: %s", strerror(-r
));
287 static int manager_network_monitor_listen(Manager
*m
) {
292 r
= sd_network_monitor_new(&m
->network_monitor
, NULL
);
296 fd
= sd_network_monitor_get_fd(m
->network_monitor
);
300 events
= sd_network_monitor_get_events(m
->network_monitor
);
304 r
= sd_event_add_io(m
->event
, &m
->network_event_source
, fd
, events
, &on_network_event
, m
);
311 static int determine_hostname(char **ret
) {
312 _cleanup_free_
char *h
= NULL
, *n
= NULL
;
317 h
= gethostname_malloc();
321 if (!utf8_is_valid(h
)) {
322 log_error("System hostname is not UTF-8 clean.");
326 r
= dns_name_normalize(h
, &n
);
328 log_error("System hostname '%s' cannot be normalized.", h
);
338 static int on_hostname_change(sd_event_source
*es
, int fd
, uint32_t revents
, void *userdata
) {
339 _cleanup_free_
char *h
= NULL
;
340 Manager
*m
= userdata
;
345 r
= determine_hostname(&h
);
347 return 0; /* ignore invalid hostnames */
349 if (streq(h
, m
->hostname
))
352 log_info("System hostname changed to '%s'.", h
);
357 manager_refresh_rrs(m
);
362 static int manager_watch_hostname(Manager
*m
) {
363 _cleanup_free_
char *h
= NULL
;
368 m
->hostname_fd
= open("/proc/sys/kernel/hostname", O_RDONLY
|O_CLOEXEC
|O_NDELAY
|O_NOCTTY
);
369 if (m
->hostname_fd
< 0) {
370 log_warning("Failed to watch hostname: %m");
374 r
= sd_event_add_io(m
->event
, &m
->hostname_event_source
, m
->hostname_fd
, 0, on_hostname_change
, m
);
377 /* kernels prior to 3.2 don't support polling this file. Ignore the failure. */
378 m
->hostname_fd
= safe_close(m
->hostname_fd
);
380 log_error("Failed to add hostname event source: %s", strerror(-r
));
385 r
= determine_hostname(&m
->hostname
);
387 log_info("Defaulting to hostname 'linux'.");
388 m
->hostname
= strdup("linux");
392 log_info("Using system hostname '%s'.", m
->hostname
);
397 int manager_new(Manager
**ret
) {
398 _cleanup_(manager_freep
) Manager
*m
= NULL
;
403 m
= new0(Manager
, 1);
407 m
->dns_ipv4_fd
= m
->dns_ipv6_fd
= -1;
408 m
->llmnr_ipv4_udp_fd
= m
->llmnr_ipv6_udp_fd
= -1;
409 m
->llmnr_ipv4_tcp_fd
= m
->llmnr_ipv6_tcp_fd
= -1;
412 m
->llmnr_support
= SUPPORT_YES
;
414 r
= manager_parse_dns_server(m
, DNS_SERVER_FALLBACK
, DNS_SERVERS
);
418 r
= sd_event_default(&m
->event
);
422 sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
423 sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
425 sd_event_set_watchdog(m
->event
, true);
427 r
= manager_watch_hostname(m
);
431 r
= dns_scope_new(m
, &m
->unicast_scope
, NULL
, DNS_PROTOCOL_DNS
, AF_UNSPEC
);
435 r
= manager_network_monitor_listen(m
);
439 r
= manager_rtnl_listen(m
);
443 r
= manager_connect_bus(m
);
447 r
= manager_llmnr_ipv4_udp_fd(m
);
450 r
= manager_llmnr_ipv6_udp_fd(m
);
453 r
= manager_llmnr_ipv4_tcp_fd(m
);
456 r
= manager_llmnr_ipv6_tcp_fd(m
);
466 Manager
*manager_free(Manager
*m
) {
472 while (m
->dns_queries
)
473 dns_query_free(m
->dns_queries
);
475 hashmap_free(m
->dns_transactions
);
477 while ((l
= hashmap_first(m
->links
)))
479 hashmap_free(m
->links
);
481 dns_scope_free(m
->unicast_scope
);
483 while (m
->dns_servers
)
484 dns_server_free(m
->dns_servers
);
485 while (m
->fallback_dns_servers
)
486 dns_server_free(m
->fallback_dns_servers
);
488 sd_event_source_unref(m
->network_event_source
);
489 sd_network_monitor_unref(m
->network_monitor
);
491 sd_event_source_unref(m
->dns_ipv4_event_source
);
492 sd_event_source_unref(m
->dns_ipv6_event_source
);
493 safe_close(m
->dns_ipv4_fd
);
494 safe_close(m
->dns_ipv6_fd
);
496 sd_event_source_unref(m
->llmnr_ipv4_udp_event_source
);
497 sd_event_source_unref(m
->llmnr_ipv6_udp_event_source
);
498 safe_close(m
->llmnr_ipv4_udp_fd
);
499 safe_close(m
->llmnr_ipv6_udp_fd
);
501 sd_event_source_unref(m
->llmnr_ipv4_tcp_event_source
);
502 sd_event_source_unref(m
->llmnr_ipv6_tcp_event_source
);
503 safe_close(m
->llmnr_ipv4_tcp_fd
);
504 safe_close(m
->llmnr_ipv6_tcp_fd
);
506 sd_event_source_unref(m
->bus_retry_event_source
);
507 sd_bus_unref(m
->bus
);
509 sd_event_unref(m
->event
);
511 dns_resource_key_unref(m
->host_ipv4_key
);
512 dns_resource_key_unref(m
->host_ipv6_key
);
514 safe_close(m
->hostname_fd
);
515 sd_event_source_unref(m
->hostname_event_source
);
523 static void write_resolve_conf_server(DnsServer
*s
, FILE *f
, unsigned *count
) {
524 _cleanup_free_
char *t
= NULL
;
531 r
= in_addr_to_string(s
->family
, &s
->address
, &t
);
533 log_warning("Invalid DNS address. Ignoring: %s", strerror(-r
));
538 fputs("# Too many DNS servers configured, the following entries may be ignored\n", f
);
540 fprintf(f
, "nameserver %s\n", t
);
544 int manager_write_resolv_conf(Manager
*m
) {
545 static const char path
[] = "/run/systemd/resolve/resolv.conf";
546 _cleanup_free_
char *temp_path
= NULL
;
547 _cleanup_fclose_
FILE *f
= NULL
;
556 r
= fopen_temporary(path
, &f
, &temp_path
);
560 fchmod(fileno(f
), 0644);
562 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
563 "# Third party programs must not access this file directly, but\n"
564 "# only through the symlink at /etc/resolv.conf. To manage\n"
565 "# resolv.conf(5) in a different way, replace the symlink by a\n"
566 "# static file or a different symlink.\n\n", f
);
568 LIST_FOREACH(servers
, s
, m
->dns_servers
)
569 write_resolve_conf_server(s
, f
, &count
);
571 HASHMAP_FOREACH(l
, m
->links
, i
)
572 LIST_FOREACH(servers
, s
, l
->dns_servers
)
573 write_resolve_conf_server(s
, f
, &count
);
576 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
)
577 write_resolve_conf_server(s
, f
, &count
);
580 r
= fflush_and_check(f
);
584 if (rename(temp_path
, path
) < 0) {
597 int manager_recv(Manager
*m
, int fd
, DnsProtocol protocol
, DnsPacket
**ret
) {
598 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
600 struct cmsghdr header
; /* For alignment */
601 uint8_t buffer
[CMSG_SPACE(MAX(sizeof(struct in_pktinfo
), sizeof(struct in6_pktinfo
)))
602 + CMSG_SPACE(int) /* ttl/hoplimit */
603 + EXTRA_CMSG_SPACE
/* kernel appears to require extra buffer space */];
605 union sockaddr_union sa
;
606 struct msghdr mh
= {};
607 struct cmsghdr
*cmsg
;
616 r
= ioctl(fd
, FIONREAD
, &ms
);
622 r
= dns_packet_new(&p
, protocol
, ms
);
626 iov
.iov_base
= DNS_PACKET_DATA(p
);
627 iov
.iov_len
= p
->allocated
;
629 mh
.msg_name
= &sa
.sa
;
630 mh
.msg_namelen
= sizeof(sa
);
633 mh
.msg_control
= &control
;
634 mh
.msg_controllen
= sizeof(control
);
636 l
= recvmsg(fd
, &mh
, 0);
638 if (errno
== EAGAIN
|| errno
== EINTR
)
647 assert(!(mh
.msg_flags
& MSG_CTRUNC
));
648 assert(!(mh
.msg_flags
& MSG_TRUNC
));
650 p
->size
= (size_t) l
;
652 p
->family
= sa
.sa
.sa_family
;
653 p
->ipproto
= IPPROTO_UDP
;
654 if (p
->family
== AF_INET
) {
655 p
->sender
.in
= sa
.in
.sin_addr
;
656 p
->sender_port
= be16toh(sa
.in
.sin_port
);
657 } else if (p
->family
== AF_INET6
) {
658 p
->sender
.in6
= sa
.in6
.sin6_addr
;
659 p
->sender_port
= be16toh(sa
.in6
.sin6_port
);
660 p
->ifindex
= sa
.in6
.sin6_scope_id
;
662 return -EAFNOSUPPORT
;
664 for (cmsg
= CMSG_FIRSTHDR(&mh
); cmsg
; cmsg
= CMSG_NXTHDR(&mh
, cmsg
)) {
666 if (cmsg
->cmsg_level
== IPPROTO_IPV6
) {
667 assert(p
->family
== AF_INET6
);
669 switch (cmsg
->cmsg_type
) {
672 struct in6_pktinfo
*i
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
675 p
->ifindex
= i
->ipi6_ifindex
;
677 p
->destination
.in6
= i
->ipi6_addr
;
682 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
686 } else if (cmsg
->cmsg_level
== IPPROTO_IP
) {
687 assert(p
->family
== AF_INET
);
689 switch (cmsg
->cmsg_type
) {
692 struct in_pktinfo
*i
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
695 p
->ifindex
= i
->ipi_ifindex
;
697 p
->destination
.in
= i
->ipi_addr
;
702 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
708 /* The Linux kernel sets the interface index to the loopback
709 * device if the packet came from the local host since it
710 * avoids the routing table in such a case. Let's unset the
711 * interface index in such a case. */
712 if (p
->ifindex
> 0 && manager_ifindex_is_loopback(m
, p
->ifindex
) != 0)
715 /* If we don't know the interface index still, we look for the
716 * first local interface with a matching address. Yuck! */
718 p
->ifindex
= manager_find_ifindex(m
, p
->family
, &p
->destination
);
726 static int on_dns_packet(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
727 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
728 DnsTransaction
*t
= NULL
;
729 Manager
*m
= userdata
;
732 r
= manager_recv(m
, fd
, DNS_PROTOCOL_DNS
, &p
);
736 if (dns_packet_validate_reply(p
) > 0) {
737 t
= hashmap_get(m
->dns_transactions
, UINT_TO_PTR(DNS_PACKET_ID(p
)));
741 dns_transaction_process_reply(t
, p
);
744 log_debug("Invalid DNS packet.");
749 int manager_dns_ipv4_fd(Manager
*m
) {
755 if (m
->dns_ipv4_fd
>= 0)
756 return m
->dns_ipv4_fd
;
758 m
->dns_ipv4_fd
= socket(AF_INET
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
759 if (m
->dns_ipv4_fd
< 0)
762 r
= setsockopt(m
->dns_ipv4_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
768 r
= sd_event_add_io(m
->event
, &m
->dns_ipv4_event_source
, m
->dns_ipv4_fd
, EPOLLIN
, on_dns_packet
, m
);
772 return m
->dns_ipv4_fd
;
775 m
->dns_ipv4_fd
= safe_close(m
->dns_ipv4_fd
);
779 int manager_dns_ipv6_fd(Manager
*m
) {
785 if (m
->dns_ipv6_fd
>= 0)
786 return m
->dns_ipv6_fd
;
788 m
->dns_ipv6_fd
= socket(AF_INET6
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
789 if (m
->dns_ipv6_fd
< 0)
792 r
= setsockopt(m
->dns_ipv6_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
798 r
= sd_event_add_io(m
->event
, &m
->dns_ipv6_event_source
, m
->dns_ipv6_fd
, EPOLLIN
, on_dns_packet
, m
);
802 return m
->dns_ipv6_fd
;
805 m
->dns_ipv6_fd
= safe_close(m
->dns_ipv6_fd
);
809 static int sendmsg_loop(int fd
, struct msghdr
*mh
, int flags
) {
816 if (sendmsg(fd
, mh
, flags
) >= 0)
825 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
833 static int manager_ipv4_send(Manager
*m
, int fd
, int ifindex
, const struct in_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
834 union sockaddr_union sa
= {
835 .in
.sin_family
= AF_INET
,
838 struct cmsghdr header
; /* For alignment */
839 uint8_t buffer
[CMSG_SPACE(sizeof(struct in_pktinfo
))];
841 struct msghdr mh
= {};
850 iov
.iov_base
= DNS_PACKET_DATA(p
);
851 iov
.iov_len
= p
->size
;
853 sa
.in
.sin_addr
= *addr
;
854 sa
.in
.sin_port
= htobe16(port
),
858 mh
.msg_name
= &sa
.sa
;
859 mh
.msg_namelen
= sizeof(sa
.in
);
862 struct cmsghdr
*cmsg
;
863 struct in_pktinfo
*pi
;
867 mh
.msg_control
= &control
;
868 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in_pktinfo
));
870 cmsg
= CMSG_FIRSTHDR(&mh
);
871 cmsg
->cmsg_len
= mh
.msg_controllen
;
872 cmsg
->cmsg_level
= IPPROTO_IP
;
873 cmsg
->cmsg_type
= IP_PKTINFO
;
875 pi
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
876 pi
->ipi_ifindex
= ifindex
;
879 return sendmsg_loop(fd
, &mh
, 0);
882 static int manager_ipv6_send(Manager
*m
, int fd
, int ifindex
, const struct in6_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
883 union sockaddr_union sa
= {
884 .in6
.sin6_family
= AF_INET6
,
887 struct cmsghdr header
; /* For alignment */
888 uint8_t buffer
[CMSG_SPACE(sizeof(struct in6_pktinfo
))];
890 struct msghdr mh
= {};
899 iov
.iov_base
= DNS_PACKET_DATA(p
);
900 iov
.iov_len
= p
->size
;
902 sa
.in6
.sin6_addr
= *addr
;
903 sa
.in6
.sin6_port
= htobe16(port
),
904 sa
.in6
.sin6_scope_id
= ifindex
;
908 mh
.msg_name
= &sa
.sa
;
909 mh
.msg_namelen
= sizeof(sa
.in6
);
912 struct cmsghdr
*cmsg
;
913 struct in6_pktinfo
*pi
;
917 mh
.msg_control
= &control
;
918 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in6_pktinfo
));
920 cmsg
= CMSG_FIRSTHDR(&mh
);
921 cmsg
->cmsg_len
= mh
.msg_controllen
;
922 cmsg
->cmsg_level
= IPPROTO_IPV6
;
923 cmsg
->cmsg_type
= IPV6_PKTINFO
;
925 pi
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
926 pi
->ipi6_ifindex
= ifindex
;
929 return sendmsg_loop(fd
, &mh
, 0);
932 int manager_send(Manager
*m
, int fd
, int ifindex
, int family
, const union in_addr_union
*addr
, uint16_t port
, DnsPacket
*p
) {
939 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
));
941 if (family
== AF_INET
)
942 return manager_ipv4_send(m
, fd
, ifindex
, &addr
->in
, port
, p
);
943 else if (family
== AF_INET6
)
944 return manager_ipv6_send(m
, fd
, ifindex
, &addr
->in6
, port
, p
);
946 return -EAFNOSUPPORT
;
949 bool manager_known_dns_server(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
955 LIST_FOREACH(servers
, s
, m
->dns_servers
)
956 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
))
959 LIST_FOREACH(servers
, s
, m
->fallback_dns_servers
)
960 if (s
->family
== family
&& in_addr_equal(family
, &s
->address
, in_addr
))
966 static DnsServer
*manager_set_dns_server(Manager
*m
, DnsServer
*s
) {
969 if (m
->current_dns_server
== s
)
973 _cleanup_free_
char *ip
= NULL
;
975 in_addr_to_string(s
->family
, &s
->address
, &ip
);
976 log_info("Switching to system DNS server %s.", strna(ip
));
978 log_info("No system DNS server set.");
980 m
->current_dns_server
= s
;
984 DnsServer
*manager_get_dns_server(Manager
*m
) {
988 if (!m
->current_dns_server
)
989 manager_set_dns_server(m
, m
->dns_servers
);
991 if (!m
->current_dns_server
) {
995 /* No DNS servers configured, let's see if there are
996 * any on any links. If not, we use the fallback
999 HASHMAP_FOREACH(l
, m
->links
, i
)
1000 if (l
->dns_servers
) {
1006 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1009 return m
->current_dns_server
;
1012 void manager_next_dns_server(Manager
*m
) {
1015 /* If there's currently no DNS server set, then the next
1016 * manager_get_dns_server() will find one */
1017 if (!m
->current_dns_server
)
1020 /* Change to the next one */
1021 if (m
->current_dns_server
->servers_next
) {
1022 manager_set_dns_server(m
, m
->current_dns_server
->servers_next
);
1026 /* If there was no next one, then start from the beginning of
1028 if (m
->current_dns_server
->type
== DNS_SERVER_FALLBACK
)
1029 manager_set_dns_server(m
, m
->fallback_dns_servers
);
1031 manager_set_dns_server(m
, m
->dns_servers
);
1034 uint32_t manager_find_mtu(Manager
*m
) {
1039 /* If we don't know on which link a DNS packet would be
1040 * delivered, let's find the largest MTU that works on all
1041 * interfaces we know of */
1043 HASHMAP_FOREACH(l
, m
->links
, i
) {
1047 if (mtu
<= 0 || l
->mtu
< mtu
)
1054 static int on_llmnr_packet(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
1055 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
1056 DnsTransaction
*t
= NULL
;
1057 Manager
*m
= userdata
;
1060 r
= manager_recv(m
, fd
, DNS_PROTOCOL_LLMNR
, &p
);
1064 if (dns_packet_validate_reply(p
) > 0) {
1065 log_debug("Got reply packet for id %u", DNS_PACKET_ID(p
));
1067 t
= hashmap_get(m
->dns_transactions
, UINT_TO_PTR(DNS_PACKET_ID(p
)));
1071 dns_transaction_process_reply(t
, p
);
1073 } else if (dns_packet_validate_query(p
) > 0) {
1076 l
= hashmap_get(m
->links
, INT_TO_PTR(p
->ifindex
));
1078 DnsScope
*scope
= NULL
;
1080 if (p
->family
== AF_INET
)
1081 scope
= l
->llmnr_ipv4_scope
;
1082 else if (p
->family
== AF_INET6
)
1083 scope
= l
->llmnr_ipv6_scope
;
1086 dns_scope_process_query(scope
, NULL
, p
);
1089 log_debug("Invalid LLMNR packet.");
1094 int manager_llmnr_ipv4_udp_fd(Manager
*m
) {
1095 union sockaddr_union sa
= {
1096 .in
.sin_family
= AF_INET
,
1097 .in
.sin_port
= htobe16(5355),
1099 static const int one
= 1, pmtu
= IP_PMTUDISC_DONT
, ttl
= 255;
1104 if (m
->llmnr_ipv4_udp_fd
>= 0)
1105 return m
->llmnr_ipv4_udp_fd
;
1107 m
->llmnr_ipv4_udp_fd
= socket(AF_INET
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1108 if (m
->llmnr_ipv4_udp_fd
< 0)
1111 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1112 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_TTL
, &ttl
, sizeof(ttl
));
1118 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MULTICAST_TTL
, &ttl
, sizeof(ttl
));
1124 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MULTICAST_LOOP
, &one
, sizeof(one
));
1130 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1136 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
1142 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_RECVTTL
, &one
, sizeof(one
));
1148 /* Disable Don't-Fragment bit in the IP header */
1149 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MTU_DISCOVER
, &pmtu
, sizeof(pmtu
));
1155 r
= bind(m
->llmnr_ipv4_udp_fd
, &sa
.sa
, sizeof(sa
.in
));
1161 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv4_udp_event_source
, m
->llmnr_ipv4_udp_fd
, EPOLLIN
, on_llmnr_packet
, m
);
1165 return m
->llmnr_ipv4_udp_fd
;
1168 m
->llmnr_ipv4_udp_fd
= safe_close(m
->llmnr_ipv4_udp_fd
);
1172 int manager_llmnr_ipv6_udp_fd(Manager
*m
) {
1173 union sockaddr_union sa
= {
1174 .in6
.sin6_family
= AF_INET6
,
1175 .in6
.sin6_port
= htobe16(5355),
1177 static const int one
= 1, ttl
= 255;
1182 if (m
->llmnr_ipv6_udp_fd
>= 0)
1183 return m
->llmnr_ipv6_udp_fd
;
1185 m
->llmnr_ipv6_udp_fd
= socket(AF_INET6
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1186 if (m
->llmnr_ipv6_udp_fd
< 0)
1189 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &ttl
, sizeof(ttl
));
1195 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1196 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_MULTICAST_HOPS
, &ttl
, sizeof(ttl
));
1202 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_MULTICAST_LOOP
, &one
, sizeof(one
));
1208 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_V6ONLY
, &one
, sizeof(one
));
1214 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1220 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
1226 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_RECVHOPLIMIT
, &one
, sizeof(one
));
1232 r
= bind(m
->llmnr_ipv6_udp_fd
, &sa
.sa
, sizeof(sa
.in6
));
1238 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv6_udp_event_source
, m
->llmnr_ipv6_udp_fd
, EPOLLIN
, on_llmnr_packet
, m
);
1244 return m
->llmnr_ipv6_udp_fd
;
1247 m
->llmnr_ipv6_udp_fd
= safe_close(m
->llmnr_ipv6_udp_fd
);
1251 static int on_llmnr_stream_packet(DnsStream
*s
) {
1254 if (dns_packet_validate_query(s
->read_packet
) > 0) {
1257 l
= hashmap_get(s
->manager
->links
, INT_TO_PTR(s
->read_packet
->ifindex
));
1259 DnsScope
*scope
= NULL
;
1261 if (s
->read_packet
->family
== AF_INET
)
1262 scope
= l
->llmnr_ipv4_scope
;
1263 else if (s
->read_packet
->family
== AF_INET6
)
1264 scope
= l
->llmnr_ipv6_scope
;
1267 dns_scope_process_query(scope
, s
, s
->read_packet
);
1269 /* If no reply packet was set, we free the stream */
1270 if (s
->write_packet
)
1280 static int on_llmnr_stream(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
1282 Manager
*m
= userdata
;
1285 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
|SOCK_CLOEXEC
);
1287 if (errno
== EAGAIN
|| errno
== EINTR
)
1293 r
= dns_stream_new(m
, &stream
, DNS_PROTOCOL_LLMNR
, cfd
);
1299 stream
->on_packet
= on_llmnr_stream_packet
;
1303 int manager_llmnr_ipv4_tcp_fd(Manager
*m
) {
1304 union sockaddr_union sa
= {
1305 .in
.sin_family
= AF_INET
,
1306 .in
.sin_port
= htobe16(5355),
1308 static const int one
= 1, pmtu
= IP_PMTUDISC_DONT
;
1313 if (m
->llmnr_ipv4_tcp_fd
>= 0)
1314 return m
->llmnr_ipv4_tcp_fd
;
1316 m
->llmnr_ipv4_tcp_fd
= socket(AF_INET
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1317 if (m
->llmnr_ipv4_tcp_fd
< 0)
1320 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1321 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_TTL
, &one
, sizeof(one
));
1327 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1333 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
1339 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_RECVTTL
, &one
, sizeof(one
));
1345 /* Disable Don't-Fragment bit in the IP header */
1346 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_MTU_DISCOVER
, &pmtu
, sizeof(pmtu
));
1352 r
= bind(m
->llmnr_ipv4_tcp_fd
, &sa
.sa
, sizeof(sa
.in
));
1358 r
= listen(m
->llmnr_ipv4_tcp_fd
, SOMAXCONN
);
1364 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv4_tcp_event_source
, m
->llmnr_ipv4_tcp_fd
, EPOLLIN
, on_llmnr_stream
, m
);
1368 return m
->llmnr_ipv4_tcp_fd
;
1371 m
->llmnr_ipv4_tcp_fd
= safe_close(m
->llmnr_ipv4_tcp_fd
);
1375 int manager_llmnr_ipv6_tcp_fd(Manager
*m
) {
1376 union sockaddr_union sa
= {
1377 .in6
.sin6_family
= AF_INET6
,
1378 .in6
.sin6_port
= htobe16(5355),
1380 static const int one
= 1;
1385 if (m
->llmnr_ipv6_tcp_fd
>= 0)
1386 return m
->llmnr_ipv6_tcp_fd
;
1388 m
->llmnr_ipv6_tcp_fd
= socket(AF_INET6
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1389 if (m
->llmnr_ipv6_tcp_fd
< 0)
1392 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1393 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &one
, sizeof(one
));
1399 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_V6ONLY
, &one
, sizeof(one
));
1405 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1411 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
1417 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_RECVHOPLIMIT
, &one
, sizeof(one
));
1423 r
= bind(m
->llmnr_ipv6_tcp_fd
, &sa
.sa
, sizeof(sa
.in6
));
1429 r
= listen(m
->llmnr_ipv6_tcp_fd
, SOMAXCONN
);
1435 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv6_tcp_event_source
, m
->llmnr_ipv6_tcp_fd
, EPOLLIN
, on_llmnr_stream
, m
);
1441 return m
->llmnr_ipv6_tcp_fd
;
1444 m
->llmnr_ipv6_tcp_fd
= safe_close(m
->llmnr_ipv6_tcp_fd
);
1448 int manager_ifindex_is_loopback(Manager
*m
, int ifindex
) {
1455 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
1456 if (l
->flags
& IFF_LOOPBACK
)
1462 int manager_find_ifindex(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1467 a
= manager_find_link_address(m
, family
, in_addr
);
1469 return a
->link
->ifindex
;
1474 void manager_refresh_rrs(Manager
*m
) {
1480 m
->host_ipv4_key
= dns_resource_key_unref(m
->host_ipv4_key
);
1481 m
->host_ipv6_key
= dns_resource_key_unref(m
->host_ipv6_key
);
1483 HASHMAP_FOREACH(l
, m
->links
, i
) {
1484 link_add_rrs(l
, true);
1485 link_add_rrs(l
, false);
1489 int manager_next_hostname(Manager
*m
) {
1496 p
= strchr(m
->hostname
, 0);
1499 while (p
> m
->hostname
) {
1500 if (!strchr("0123456789", p
[-1]))
1506 if (*p
== 0 || safe_atou64(p
, &u
) < 0 || u
<= 0)
1511 if (asprintf(&h
, "%.*s%" PRIu64
, (int) (p
- m
->hostname
), m
->hostname
, u
) < 0)
1514 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m
->hostname
, h
);
1519 manager_refresh_rrs(m
);
1524 LinkAddress
* manager_find_link_address(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1530 HASHMAP_FOREACH(l
, m
->links
, i
) {
1533 a
= link_find_address(l
, family
, in_addr
);
1541 int manager_our_packet(Manager
*m
, DnsPacket
*p
) {
1545 return !!manager_find_link_address(m
, p
->family
, &p
->sender
);
1548 static const char* const support_table
[_SUPPORT_MAX
] = {
1549 [SUPPORT_NO
] = "no",
1550 [SUPPORT_YES
] = "yes",
1551 [SUPPORT_RESOLVE
] = "resolve",
1553 DEFINE_STRING_TABLE_LOOKUP(support
, Support
);