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 DnsServer* manager_find_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 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));
1086 m->current_dns_server = s;
1088 if (m->unicast_scope)
1089 dns_cache_flush(&m->unicast_scope->cache);
1094 DnsServer *manager_get_dns_server(Manager *m) {
1098 /* Try to read updates resolv.conf */
1099 manager_read_resolv_conf(m);
1101 if (!m->current_dns_server)
1102 manager_set_dns_server(m, m->dns_servers);
1104 if (!m->current_dns_server) {
1108 /* No DNS servers configured, let's see if there are
1109 * any on any links. If not, we use the fallback
1112 HASHMAP_FOREACH(l, m->links, i)
1113 if (l->dns_servers) {
1119 manager_set_dns_server(m, m->fallback_dns_servers);
1122 return m->current_dns_server;
1125 void manager_next_dns_server(Manager *m) {
1128 /* If there's currently no DNS server set, then the next
1129 * manager_get_dns_server() will find one */
1130 if (!m->current_dns_server)
1133 /* Change to the next one */
1134 if (m->current_dns_server->servers_next) {
1135 manager_set_dns_server(m, m->current_dns_server->servers_next);
1139 /* If there was no next one, then start from the beginning of
1141 if (m->current_dns_server->type == DNS_SERVER_FALLBACK)
1142 manager_set_dns_server(m, m->fallback_dns_servers);
1144 manager_set_dns_server(m, m->dns_servers);
1147 uint32_t manager_find_mtu(Manager *m) {
1152 /* If we don't know on which link a DNS packet would be
1153 * delivered, let's find the largest MTU that works on all
1154 * interfaces we know of */
1156 HASHMAP_FOREACH(l, m->links, i) {
1160 if (mtu <= 0 || l->mtu < mtu)
1167 static int on_llmnr_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1168 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
1169 DnsTransaction *t = NULL;
1170 Manager *m = userdata;
1173 r = manager_recv(m, fd, DNS_PROTOCOL_LLMNR, &p);
1177 if (dns_packet_validate_reply(p) > 0) {
1178 log_debug("Got reply packet for id %u", DNS_PACKET_ID(p));
1180 t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
1184 dns_transaction_process_reply(t, p);
1186 } else if (dns_packet_validate_query(p) > 0) {
1189 l = hashmap_get(m->links, INT_TO_PTR(p->ifindex));
1191 DnsScope *scope = NULL;
1193 if (p->family == AF_INET)
1194 scope = l->llmnr_ipv4_scope;
1195 else if (p->family == AF_INET6)
1196 scope = l->llmnr_ipv6_scope;
1199 dns_scope_process_query(scope, NULL, p);
1202 log_debug("Invalid LLMNR packet.");
1207 int manager_llmnr_ipv4_udp_fd(Manager *m) {
1208 union sockaddr_union sa = {
1209 .in.sin_family = AF_INET,
1210 .in.sin_port = htobe16(5355),
1212 static const int one = 1, pmtu = IP_PMTUDISC_DONT, ttl = 255;
1217 if (m->llmnr_ipv4_udp_fd >= 0)
1218 return m->llmnr_ipv4_udp_fd;
1220 m->llmnr_ipv4_udp_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1221 if (m->llmnr_ipv4_udp_fd < 0)
1224 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1225 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
1231 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
1237 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof(one));
1243 r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1249 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1255 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1261 /* Disable Don't-Fragment bit in the IP header */
1262 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1268 r = bind(m->llmnr_ipv4_udp_fd, &sa.sa, sizeof(sa.in));
1274 r = sd_event_add_io(m->event, &m->llmnr_ipv4_udp_event_source, m->llmnr_ipv4_udp_fd, EPOLLIN, on_llmnr_packet, m);
1278 return m->llmnr_ipv4_udp_fd;
1281 m->llmnr_ipv4_udp_fd = safe_close(m->llmnr_ipv4_udp_fd);
1285 int manager_llmnr_ipv6_udp_fd(Manager *m) {
1286 union sockaddr_union sa = {
1287 .in6.sin6_family = AF_INET6,
1288 .in6.sin6_port = htobe16(5355),
1290 static const int one = 1, ttl = 255;
1295 if (m->llmnr_ipv6_udp_fd >= 0)
1296 return m->llmnr_ipv6_udp_fd;
1298 m->llmnr_ipv6_udp_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1299 if (m->llmnr_ipv6_udp_fd < 0)
1302 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl));
1308 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1309 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, sizeof(ttl));
1315 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof(one));
1321 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1327 r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1333 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1339 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1345 r = bind(m->llmnr_ipv6_udp_fd, &sa.sa, sizeof(sa.in6));
1351 r = sd_event_add_io(m->event, &m->llmnr_ipv6_udp_event_source, m->llmnr_ipv6_udp_fd, EPOLLIN, on_llmnr_packet, m);
1357 return m->llmnr_ipv6_udp_fd;
1360 m->llmnr_ipv6_udp_fd = safe_close(m->llmnr_ipv6_udp_fd);
1364 static int on_llmnr_stream_packet(DnsStream *s) {
1367 if (dns_packet_validate_query(s->read_packet) > 0) {
1370 l = hashmap_get(s->manager->links, INT_TO_PTR(s->read_packet->ifindex));
1372 DnsScope *scope = NULL;
1374 if (s->read_packet->family == AF_INET)
1375 scope = l->llmnr_ipv4_scope;
1376 else if (s->read_packet->family == AF_INET6)
1377 scope = l->llmnr_ipv6_scope;
1380 dns_scope_process_query(scope, s, s->read_packet);
1382 /* If no reply packet was set, we free the stream */
1383 if (s->write_packet)
1393 static int on_llmnr_stream(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1395 Manager *m = userdata;
1398 cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
1400 if (errno == EAGAIN || errno == EINTR)
1406 r = dns_stream_new(m, &stream, DNS_PROTOCOL_LLMNR, cfd);
1412 stream->on_packet = on_llmnr_stream_packet;
1416 int manager_llmnr_ipv4_tcp_fd(Manager *m) {
1417 union sockaddr_union sa = {
1418 .in.sin_family = AF_INET,
1419 .in.sin_port = htobe16(5355),
1421 static const int one = 1, pmtu = IP_PMTUDISC_DONT;
1426 if (m->llmnr_ipv4_tcp_fd >= 0)
1427 return m->llmnr_ipv4_tcp_fd;
1429 m->llmnr_ipv4_tcp_fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1430 if (m->llmnr_ipv4_tcp_fd < 0)
1433 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1434 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_TTL, &one, sizeof(one));
1440 r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1446 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1452 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1458 /* Disable Don't-Fragment bit in the IP header */
1459 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1465 r = bind(m->llmnr_ipv4_tcp_fd, &sa.sa, sizeof(sa.in));
1471 r = listen(m->llmnr_ipv4_tcp_fd, SOMAXCONN);
1477 r = sd_event_add_io(m->event, &m->llmnr_ipv4_tcp_event_source, m->llmnr_ipv4_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1481 return m->llmnr_ipv4_tcp_fd;
1484 m->llmnr_ipv4_tcp_fd = safe_close(m->llmnr_ipv4_tcp_fd);
1488 int manager_llmnr_ipv6_tcp_fd(Manager *m) {
1489 union sockaddr_union sa = {
1490 .in6.sin6_family = AF_INET6,
1491 .in6.sin6_port = htobe16(5355),
1493 static const int one = 1;
1498 if (m->llmnr_ipv6_tcp_fd >= 0)
1499 return m->llmnr_ipv6_tcp_fd;
1501 m->llmnr_ipv6_tcp_fd = socket(AF_INET6, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1502 if (m->llmnr_ipv6_tcp_fd < 0)
1505 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1506 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &one, sizeof(one));
1512 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1518 r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1524 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1530 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1536 r = bind(m->llmnr_ipv6_tcp_fd, &sa.sa, sizeof(sa.in6));
1542 r = listen(m->llmnr_ipv6_tcp_fd, SOMAXCONN);
1548 r = sd_event_add_io(m->event, &m->llmnr_ipv6_tcp_event_source, m->llmnr_ipv6_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1554 return m->llmnr_ipv6_tcp_fd;
1557 m->llmnr_ipv6_tcp_fd = safe_close(m->llmnr_ipv6_tcp_fd);
1561 int manager_ifindex_is_loopback(Manager *m, int ifindex) {
1568 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
1569 if (l->flags & IFF_LOOPBACK)
1575 int manager_find_ifindex(Manager *m, int family, const union in_addr_union *in_addr) {
1580 a = manager_find_link_address(m, family, in_addr);
1582 return a->link->ifindex;
1587 void manager_refresh_rrs(Manager *m) {
1593 m->host_ipv4_key = dns_resource_key_unref(m->host_ipv4_key);
1594 m->host_ipv6_key = dns_resource_key_unref(m->host_ipv6_key);
1596 HASHMAP_FOREACH(l, m->links, i) {
1597 link_add_rrs(l, true);
1598 link_add_rrs(l, false);
1602 int manager_next_hostname(Manager *m) {
1609 p = strchr(m->hostname, 0);
1612 while (p > m->hostname) {
1613 if (!strchr("0123456789", p[-1]))
1619 if (*p == 0 || safe_atou64(p, &u) < 0 || u <= 0)
1624 if (asprintf(&h, "%.*s%" PRIu64, (int) (p - m->hostname), m->hostname, u) < 0)
1627 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m->hostname, h);
1632 manager_refresh_rrs(m);
1637 LinkAddress* manager_find_link_address(Manager *m, int family, const union in_addr_union *in_addr) {
1643 HASHMAP_FOREACH(l, m->links, i) {
1646 a = link_find_address(l, family, in_addr);
1654 int manager_our_packet(Manager *m, DnsPacket *p) {
1658 return !!manager_find_link_address(m, p->family, &p->sender);
1661 static const char* const support_table[_SUPPORT_MAX] = {
1662 [SUPPORT_NO] = "no",
1663 [SUPPORT_YES] = "yes",
1664 [SUPPORT_RESOLVE] = "resolve",
1666 DEFINE_STRING_TABLE_LOOKUP(support, Support);