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) {
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;
412 m->read_resolv_conf = true;
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 int manager_read_resolv_conf(Manager *m) {
524 _cleanup_fclose_ FILE *f = NULL;
533 /* Reads the system /etc/resolv.conf, if it exists and is not
534 * symlinked to our own resolv.conf instance */
536 if (!m->read_resolv_conf)
539 r = stat("/etc/resolv.conf", &st);
542 log_warning("Failed to open /etc/resolv.conf: %m");
547 /* Have we already seen the file? */
548 t = timespec_load(&st.st_mtim);
549 if (t == m->resolv_conf_mtime)
552 m->resolv_conf_mtime = t;
554 /* Is it symlinked to our own file? */
555 if (stat("/run/systemd/resolve/resolv.conf", &own) >= 0 &&
556 st.st_dev == own.st_dev &&
557 st.st_ino == own.st_ino) {
562 f = fopen("/etc/resolv.conf", "re");
565 log_warning("Failed to open /etc/resolv.conf: %m");
570 if (fstat(fileno(f), &st) < 0) {
571 log_error("Failed to stat open file: %m");
576 LIST_FOREACH(servers, s, m->dns_servers)
579 FOREACH_LINE(line, f, r = -errno; goto clear) {
580 union in_addr_union address;
588 if (*l == '#' || *l == ';')
591 a = first_word(l, "nameserver");
595 r = in_addr_from_string_auto(a, &family, &address);
597 log_warning("Failed to parse name server %s.", a);
601 LIST_FOREACH(servers, s, m->dns_servers)
602 if (s->family == family && in_addr_equal(family, &s->address, &address) > 0)
608 r = dns_server_new(m, NULL, DNS_SERVER_SYSTEM, NULL, family, &address);
614 LIST_FOREACH_SAFE(servers, s, nx, m->dns_servers)
621 while (m->dns_servers)
622 dns_server_free(m->dns_servers);
627 static void write_resolve_conf_server(DnsServer *s, FILE *f, unsigned *count) {
628 _cleanup_free_ char *t = NULL;
635 r = in_addr_to_string(s->family, &s->address, &t);
637 log_warning("Invalid DNS address. Ignoring: %s", strerror(-r));
642 fputs("# Too many DNS servers configured, the following entries may be ignored\n", f);
644 fprintf(f, "nameserver %s\n", t);
648 int manager_write_resolv_conf(Manager *m) {
649 static const char path[] = "/run/systemd/resolve/resolv.conf";
650 _cleanup_free_ char *temp_path = NULL;
651 _cleanup_fclose_ FILE *f = NULL;
660 /* Read the system /etc/resolv.conf first */
661 manager_read_resolv_conf(m);
663 r = fopen_temporary(path, &f, &temp_path);
667 fchmod(fileno(f), 0644);
669 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
670 "# Third party programs must not access this file directly, but\n"
671 "# only through the symlink at /etc/resolv.conf. To manage\n"
672 "# resolv.conf(5) in a different way, replace the symlink by a\n"
673 "# static file or a different symlink.\n\n", f);
675 LIST_FOREACH(servers, s, m->dns_servers)
676 write_resolve_conf_server(s, f, &count);
678 HASHMAP_FOREACH(l, m->links, i)
679 LIST_FOREACH(servers, s, l->dns_servers)
680 write_resolve_conf_server(s, f, &count);
683 LIST_FOREACH(servers, s, m->fallback_dns_servers)
684 write_resolve_conf_server(s, f, &count);
687 r = fflush_and_check(f);
691 if (rename(temp_path, path) < 0) {
704 int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) {
705 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
707 struct cmsghdr header; /* For alignment */
708 uint8_t buffer[CMSG_SPACE(MAX(sizeof(struct in_pktinfo), sizeof(struct in6_pktinfo)))
709 + CMSG_SPACE(int) /* ttl/hoplimit */
710 + EXTRA_CMSG_SPACE /* kernel appears to require extra buffer space */];
712 union sockaddr_union sa;
713 struct msghdr mh = {};
714 struct cmsghdr *cmsg;
723 r = ioctl(fd, FIONREAD, &ms);
729 r = dns_packet_new(&p, protocol, ms);
733 iov.iov_base = DNS_PACKET_DATA(p);
734 iov.iov_len = p->allocated;
736 mh.msg_name = &sa.sa;
737 mh.msg_namelen = sizeof(sa);
740 mh.msg_control = &control;
741 mh.msg_controllen = sizeof(control);
743 l = recvmsg(fd, &mh, 0);
745 if (errno == EAGAIN || errno == EINTR)
754 assert(!(mh.msg_flags & MSG_CTRUNC));
755 assert(!(mh.msg_flags & MSG_TRUNC));
757 p->size = (size_t) l;
759 p->family = sa.sa.sa_family;
760 p->ipproto = IPPROTO_UDP;
761 if (p->family == AF_INET) {
762 p->sender.in = sa.in.sin_addr;
763 p->sender_port = be16toh(sa.in.sin_port);
764 } else if (p->family == AF_INET6) {
765 p->sender.in6 = sa.in6.sin6_addr;
766 p->sender_port = be16toh(sa.in6.sin6_port);
767 p->ifindex = sa.in6.sin6_scope_id;
769 return -EAFNOSUPPORT;
771 for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
773 if (cmsg->cmsg_level == IPPROTO_IPV6) {
774 assert(p->family == AF_INET6);
776 switch (cmsg->cmsg_type) {
779 struct in6_pktinfo *i = (struct in6_pktinfo*) CMSG_DATA(cmsg);
782 p->ifindex = i->ipi6_ifindex;
784 p->destination.in6 = i->ipi6_addr;
789 p->ttl = *(int *) CMSG_DATA(cmsg);
793 } else if (cmsg->cmsg_level == IPPROTO_IP) {
794 assert(p->family == AF_INET);
796 switch (cmsg->cmsg_type) {
799 struct in_pktinfo *i = (struct in_pktinfo*) CMSG_DATA(cmsg);
802 p->ifindex = i->ipi_ifindex;
804 p->destination.in = i->ipi_addr;
809 p->ttl = *(int *) CMSG_DATA(cmsg);
815 /* The Linux kernel sets the interface index to the loopback
816 * device if the packet came from the local host since it
817 * avoids the routing table in such a case. Let's unset the
818 * interface index in such a case. */
819 if (p->ifindex > 0 && manager_ifindex_is_loopback(m, p->ifindex) != 0)
822 /* If we don't know the interface index still, we look for the
823 * first local interface with a matching address. Yuck! */
825 p->ifindex = manager_find_ifindex(m, p->family, &p->destination);
833 static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
834 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
835 DnsTransaction *t = NULL;
836 Manager *m = userdata;
839 r = manager_recv(m, fd, DNS_PROTOCOL_DNS, &p);
843 if (dns_packet_validate_reply(p) > 0) {
844 t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
848 dns_transaction_process_reply(t, p);
851 log_debug("Invalid DNS packet.");
856 int manager_dns_ipv4_fd(Manager *m) {
862 if (m->dns_ipv4_fd >= 0)
863 return m->dns_ipv4_fd;
865 m->dns_ipv4_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
866 if (m->dns_ipv4_fd < 0)
869 r = setsockopt(m->dns_ipv4_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
875 r = sd_event_add_io(m->event, &m->dns_ipv4_event_source, m->dns_ipv4_fd, EPOLLIN, on_dns_packet, m);
879 return m->dns_ipv4_fd;
882 m->dns_ipv4_fd = safe_close(m->dns_ipv4_fd);
886 int manager_dns_ipv6_fd(Manager *m) {
892 if (m->dns_ipv6_fd >= 0)
893 return m->dns_ipv6_fd;
895 m->dns_ipv6_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
896 if (m->dns_ipv6_fd < 0)
899 r = setsockopt(m->dns_ipv6_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
905 r = sd_event_add_io(m->event, &m->dns_ipv6_event_source, m->dns_ipv6_fd, EPOLLIN, on_dns_packet, m);
909 return m->dns_ipv6_fd;
912 m->dns_ipv6_fd = safe_close(m->dns_ipv6_fd);
916 static int sendmsg_loop(int fd, struct msghdr *mh, int flags) {
923 if (sendmsg(fd, mh, flags) >= 0)
932 r = fd_wait_for_event(fd, POLLOUT, SEND_TIMEOUT_USEC);
940 static int manager_ipv4_send(Manager *m, int fd, int ifindex, const struct in_addr *addr, uint16_t port, DnsPacket *p) {
941 union sockaddr_union sa = {
942 .in.sin_family = AF_INET,
945 struct cmsghdr header; /* For alignment */
946 uint8_t buffer[CMSG_SPACE(sizeof(struct in_pktinfo))];
948 struct msghdr mh = {};
957 iov.iov_base = DNS_PACKET_DATA(p);
958 iov.iov_len = p->size;
960 sa.in.sin_addr = *addr;
961 sa.in.sin_port = htobe16(port),
965 mh.msg_name = &sa.sa;
966 mh.msg_namelen = sizeof(sa.in);
969 struct cmsghdr *cmsg;
970 struct in_pktinfo *pi;
974 mh.msg_control = &control;
975 mh.msg_controllen = CMSG_LEN(sizeof(struct in_pktinfo));
977 cmsg = CMSG_FIRSTHDR(&mh);
978 cmsg->cmsg_len = mh.msg_controllen;
979 cmsg->cmsg_level = IPPROTO_IP;
980 cmsg->cmsg_type = IP_PKTINFO;
982 pi = (struct in_pktinfo*) CMSG_DATA(cmsg);
983 pi->ipi_ifindex = ifindex;
986 return sendmsg_loop(fd, &mh, 0);
989 static int manager_ipv6_send(Manager *m, int fd, int ifindex, const struct in6_addr *addr, uint16_t port, DnsPacket *p) {
990 union sockaddr_union sa = {
991 .in6.sin6_family = AF_INET6,
994 struct cmsghdr header; /* For alignment */
995 uint8_t buffer[CMSG_SPACE(sizeof(struct in6_pktinfo))];
997 struct msghdr mh = {};
1006 iov.iov_base = DNS_PACKET_DATA(p);
1007 iov.iov_len = p->size;
1009 sa.in6.sin6_addr = *addr;
1010 sa.in6.sin6_port = htobe16(port),
1011 sa.in6.sin6_scope_id = ifindex;
1015 mh.msg_name = &sa.sa;
1016 mh.msg_namelen = sizeof(sa.in6);
1019 struct cmsghdr *cmsg;
1020 struct in6_pktinfo *pi;
1024 mh.msg_control = &control;
1025 mh.msg_controllen = CMSG_LEN(sizeof(struct in6_pktinfo));
1027 cmsg = CMSG_FIRSTHDR(&mh);
1028 cmsg->cmsg_len = mh.msg_controllen;
1029 cmsg->cmsg_level = IPPROTO_IPV6;
1030 cmsg->cmsg_type = IPV6_PKTINFO;
1032 pi = (struct in6_pktinfo*) CMSG_DATA(cmsg);
1033 pi->ipi6_ifindex = ifindex;
1036 return sendmsg_loop(fd, &mh, 0);
1039 int manager_send(Manager *m, int fd, int ifindex, int family, const union in_addr_union *addr, uint16_t port, DnsPacket *p) {
1046 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));
1048 if (family == AF_INET)
1049 return manager_ipv4_send(m, fd, ifindex, &addr->in, port, p);
1050 else if (family == AF_INET6)
1051 return manager_ipv6_send(m, fd, ifindex, &addr->in6, port, p);
1053 return -EAFNOSUPPORT;
1056 bool manager_known_dns_server(Manager *m, int family, const union in_addr_union *in_addr) {
1062 LIST_FOREACH(servers, s, m->dns_servers)
1063 if (s->family == family && in_addr_equal(family, &s->address, in_addr) > 0)
1066 LIST_FOREACH(servers, s, m->fallback_dns_servers)
1067 if (s->family == family && in_addr_equal(family, &s->address, in_addr) > 0)
1073 static DnsServer *manager_set_dns_server(Manager *m, DnsServer *s) {
1076 if (m->current_dns_server == s)
1080 _cleanup_free_ char *ip = NULL;
1082 in_addr_to_string(s->family, &s->address, &ip);
1083 log_info("Switching to system DNS server %s.", strna(ip));
1085 log_info("No system DNS server set.");
1087 m->current_dns_server = s;
1091 DnsServer *manager_get_dns_server(Manager *m) {
1095 /* Try to read updates resolv.conf */
1096 manager_read_resolv_conf(m);
1098 if (!m->current_dns_server)
1099 manager_set_dns_server(m, m->dns_servers);
1101 if (!m->current_dns_server) {
1105 /* No DNS servers configured, let's see if there are
1106 * any on any links. If not, we use the fallback
1109 HASHMAP_FOREACH(l, m->links, i)
1110 if (l->dns_servers) {
1116 manager_set_dns_server(m, m->fallback_dns_servers);
1119 return m->current_dns_server;
1122 void manager_next_dns_server(Manager *m) {
1125 /* If there's currently no DNS server set, then the next
1126 * manager_get_dns_server() will find one */
1127 if (!m->current_dns_server)
1130 /* Change to the next one */
1131 if (m->current_dns_server->servers_next) {
1132 manager_set_dns_server(m, m->current_dns_server->servers_next);
1136 /* If there was no next one, then start from the beginning of
1138 if (m->current_dns_server->type == DNS_SERVER_FALLBACK)
1139 manager_set_dns_server(m, m->fallback_dns_servers);
1141 manager_set_dns_server(m, m->dns_servers);
1144 uint32_t manager_find_mtu(Manager *m) {
1149 /* If we don't know on which link a DNS packet would be
1150 * delivered, let's find the largest MTU that works on all
1151 * interfaces we know of */
1153 HASHMAP_FOREACH(l, m->links, i) {
1157 if (mtu <= 0 || l->mtu < mtu)
1164 static int on_llmnr_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1165 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
1166 DnsTransaction *t = NULL;
1167 Manager *m = userdata;
1170 r = manager_recv(m, fd, DNS_PROTOCOL_LLMNR, &p);
1174 if (dns_packet_validate_reply(p) > 0) {
1175 log_debug("Got reply packet for id %u", DNS_PACKET_ID(p));
1177 t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
1181 dns_transaction_process_reply(t, p);
1183 } else if (dns_packet_validate_query(p) > 0) {
1186 l = hashmap_get(m->links, INT_TO_PTR(p->ifindex));
1188 DnsScope *scope = NULL;
1190 if (p->family == AF_INET)
1191 scope = l->llmnr_ipv4_scope;
1192 else if (p->family == AF_INET6)
1193 scope = l->llmnr_ipv6_scope;
1196 dns_scope_process_query(scope, NULL, p);
1199 log_debug("Invalid LLMNR packet.");
1204 int manager_llmnr_ipv4_udp_fd(Manager *m) {
1205 union sockaddr_union sa = {
1206 .in.sin_family = AF_INET,
1207 .in.sin_port = htobe16(5355),
1209 static const int one = 1, pmtu = IP_PMTUDISC_DONT, ttl = 255;
1214 if (m->llmnr_ipv4_udp_fd >= 0)
1215 return m->llmnr_ipv4_udp_fd;
1217 m->llmnr_ipv4_udp_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1218 if (m->llmnr_ipv4_udp_fd < 0)
1221 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1222 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
1228 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
1234 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof(one));
1240 r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1246 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1252 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1258 /* Disable Don't-Fragment bit in the IP header */
1259 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1265 r = bind(m->llmnr_ipv4_udp_fd, &sa.sa, sizeof(sa.in));
1271 r = sd_event_add_io(m->event, &m->llmnr_ipv4_udp_event_source, m->llmnr_ipv4_udp_fd, EPOLLIN, on_llmnr_packet, m);
1275 return m->llmnr_ipv4_udp_fd;
1278 m->llmnr_ipv4_udp_fd = safe_close(m->llmnr_ipv4_udp_fd);
1282 int manager_llmnr_ipv6_udp_fd(Manager *m) {
1283 union sockaddr_union sa = {
1284 .in6.sin6_family = AF_INET6,
1285 .in6.sin6_port = htobe16(5355),
1287 static const int one = 1, ttl = 255;
1292 if (m->llmnr_ipv6_udp_fd >= 0)
1293 return m->llmnr_ipv6_udp_fd;
1295 m->llmnr_ipv6_udp_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1296 if (m->llmnr_ipv6_udp_fd < 0)
1299 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl));
1305 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1306 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, sizeof(ttl));
1312 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof(one));
1318 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1324 r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1330 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1336 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1342 r = bind(m->llmnr_ipv6_udp_fd, &sa.sa, sizeof(sa.in6));
1348 r = sd_event_add_io(m->event, &m->llmnr_ipv6_udp_event_source, m->llmnr_ipv6_udp_fd, EPOLLIN, on_llmnr_packet, m);
1354 return m->llmnr_ipv6_udp_fd;
1357 m->llmnr_ipv6_udp_fd = safe_close(m->llmnr_ipv6_udp_fd);
1361 static int on_llmnr_stream_packet(DnsStream *s) {
1364 if (dns_packet_validate_query(s->read_packet) > 0) {
1367 l = hashmap_get(s->manager->links, INT_TO_PTR(s->read_packet->ifindex));
1369 DnsScope *scope = NULL;
1371 if (s->read_packet->family == AF_INET)
1372 scope = l->llmnr_ipv4_scope;
1373 else if (s->read_packet->family == AF_INET6)
1374 scope = l->llmnr_ipv6_scope;
1377 dns_scope_process_query(scope, s, s->read_packet);
1379 /* If no reply packet was set, we free the stream */
1380 if (s->write_packet)
1390 static int on_llmnr_stream(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1392 Manager *m = userdata;
1395 cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
1397 if (errno == EAGAIN || errno == EINTR)
1403 r = dns_stream_new(m, &stream, DNS_PROTOCOL_LLMNR, cfd);
1409 stream->on_packet = on_llmnr_stream_packet;
1413 int manager_llmnr_ipv4_tcp_fd(Manager *m) {
1414 union sockaddr_union sa = {
1415 .in.sin_family = AF_INET,
1416 .in.sin_port = htobe16(5355),
1418 static const int one = 1, pmtu = IP_PMTUDISC_DONT;
1423 if (m->llmnr_ipv4_tcp_fd >= 0)
1424 return m->llmnr_ipv4_tcp_fd;
1426 m->llmnr_ipv4_tcp_fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1427 if (m->llmnr_ipv4_tcp_fd < 0)
1430 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1431 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_TTL, &one, sizeof(one));
1437 r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1443 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1449 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1455 /* Disable Don't-Fragment bit in the IP header */
1456 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1462 r = bind(m->llmnr_ipv4_tcp_fd, &sa.sa, sizeof(sa.in));
1468 r = listen(m->llmnr_ipv4_tcp_fd, SOMAXCONN);
1474 r = sd_event_add_io(m->event, &m->llmnr_ipv4_tcp_event_source, m->llmnr_ipv4_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1478 return m->llmnr_ipv4_tcp_fd;
1481 m->llmnr_ipv4_tcp_fd = safe_close(m->llmnr_ipv4_tcp_fd);
1485 int manager_llmnr_ipv6_tcp_fd(Manager *m) {
1486 union sockaddr_union sa = {
1487 .in6.sin6_family = AF_INET6,
1488 .in6.sin6_port = htobe16(5355),
1490 static const int one = 1;
1495 if (m->llmnr_ipv6_tcp_fd >= 0)
1496 return m->llmnr_ipv6_tcp_fd;
1498 m->llmnr_ipv6_tcp_fd = socket(AF_INET6, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1499 if (m->llmnr_ipv6_tcp_fd < 0)
1502 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1503 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &one, sizeof(one));
1509 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1515 r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1521 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1527 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1533 r = bind(m->llmnr_ipv6_tcp_fd, &sa.sa, sizeof(sa.in6));
1539 r = listen(m->llmnr_ipv6_tcp_fd, SOMAXCONN);
1545 r = sd_event_add_io(m->event, &m->llmnr_ipv6_tcp_event_source, m->llmnr_ipv6_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1551 return m->llmnr_ipv6_tcp_fd;
1554 m->llmnr_ipv6_tcp_fd = safe_close(m->llmnr_ipv6_tcp_fd);
1558 int manager_ifindex_is_loopback(Manager *m, int ifindex) {
1565 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
1566 if (l->flags & IFF_LOOPBACK)
1572 int manager_find_ifindex(Manager *m, int family, const union in_addr_union *in_addr) {
1577 a = manager_find_link_address(m, family, in_addr);
1579 return a->link->ifindex;
1584 void manager_refresh_rrs(Manager *m) {
1590 m->host_ipv4_key = dns_resource_key_unref(m->host_ipv4_key);
1591 m->host_ipv6_key = dns_resource_key_unref(m->host_ipv6_key);
1593 HASHMAP_FOREACH(l, m->links, i) {
1594 link_add_rrs(l, true);
1595 link_add_rrs(l, false);
1599 int manager_next_hostname(Manager *m) {
1606 p = strchr(m->hostname, 0);
1609 while (p > m->hostname) {
1610 if (!strchr("0123456789", p[-1]))
1616 if (*p == 0 || safe_atou64(p, &u) < 0 || u <= 0)
1621 if (asprintf(&h, "%.*s%" PRIu64, (int) (p - m->hostname), m->hostname, u) < 0)
1624 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m->hostname, h);
1629 manager_refresh_rrs(m);
1634 LinkAddress* manager_find_link_address(Manager *m, int family, const union in_addr_union *in_addr) {
1640 HASHMAP_FOREACH(l, m->links, i) {
1643 a = link_find_address(l, family, in_addr);
1651 int manager_our_packet(Manager *m, DnsPacket *p) {
1655 return !!manager_find_link_address(m, p->family, &p->sender);
1658 static const char* const support_table[_SUPPORT_MAX] = {
1659 [SUPPORT_NO] = "no",
1660 [SUPPORT_YES] = "yes",
1661 [SUPPORT_RESOLVE] = "resolve",
1663 DEFINE_STRING_TABLE_LOOKUP(support, Support);