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"
40 #define SEND_TIMEOUT_USEC (200 * USEC_PER_MSEC)
42 static int manager_process_link(sd_rtnl *rtnl, sd_rtnl_message *mm, void *userdata) {
43 Manager *m = userdata;
52 r = sd_rtnl_message_get_type(mm, &type);
56 r = sd_rtnl_message_link_get_ifindex(mm, &ifindex);
60 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
68 r = link_new(m, &l, ifindex);
73 r = link_update_rtnl(l, mm);
78 log_debug("Found new link %i/%s", ifindex, l->name);
85 log_debug("Removing link %i/%s", l->ifindex, l->name);
95 log_warning("Failed to process RTNL link message: %s", strerror(-r));
99 static int manager_process_address(sd_rtnl *rtnl, sd_rtnl_message *mm, void *userdata) {
100 Manager *m = userdata;
101 union in_addr_union address;
103 int r, ifindex, family;
111 r = sd_rtnl_message_get_type(mm, &type);
115 r = sd_rtnl_message_addr_get_ifindex(mm, &ifindex);
119 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
123 r = sd_rtnl_message_addr_get_family(mm, &family);
130 r = sd_rtnl_message_read_in_addr(mm, IFA_LOCAL, &address.in);
132 r = sd_rtnl_message_read_in_addr(mm, IFA_ADDRESS, &address.in);
140 r = sd_rtnl_message_read_in6_addr(mm, IFA_LOCAL, &address.in6);
142 r = sd_rtnl_message_read_in6_addr(mm, IFA_ADDRESS, &address.in6);
153 a = link_find_address(l, family, &address);
160 r = link_address_new(l, &a, family, &address);
165 r = link_address_update_rtnl(a, mm);
173 link_address_free(a);
180 log_warning("Failed to process RTNL address message: %s", strerror(-r));
185 static int manager_rtnl_listen(Manager *m) {
186 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL;
192 /* First, subscibe to interfaces coming and going */
193 r = sd_rtnl_open(&m->rtnl, 3, RTNLGRP_LINK, RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV6_IFADDR);
197 r = sd_rtnl_attach_event(m->rtnl, m->event, 0);
201 r = sd_rtnl_add_match(m->rtnl, RTM_NEWLINK, manager_process_link, m);
205 r = sd_rtnl_add_match(m->rtnl, RTM_DELLINK, manager_process_link, m);
209 r = sd_rtnl_add_match(m->rtnl, RTM_NEWADDR, manager_process_address, m);
213 r = sd_rtnl_add_match(m->rtnl, RTM_DELADDR, manager_process_address, m);
217 /* Then, enumerate all links */
218 r = sd_rtnl_message_new_link(m->rtnl, &req, RTM_GETLINK, 0);
222 r = sd_rtnl_message_request_dump(req, true);
226 r = sd_rtnl_call(m->rtnl, req, 0, &reply);
230 for (i = reply; i; i = sd_rtnl_message_next(i)) {
231 r = manager_process_link(m->rtnl, i, m);
236 req = sd_rtnl_message_unref(req);
237 reply = sd_rtnl_message_unref(reply);
239 /* Finally, enumerate all addresses, too */
240 r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, 0, AF_UNSPEC);
244 r = sd_rtnl_message_request_dump(req, true);
248 r = sd_rtnl_call(m->rtnl, req, 0, &reply);
252 for (i = reply; i; i = sd_rtnl_message_next(i)) {
253 r = manager_process_address(m->rtnl, i, m);
261 static int on_network_event(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
262 Manager *m = userdata;
269 sd_network_monitor_flush(m->network_monitor);
271 HASHMAP_FOREACH(l, m->links, i) {
272 r = link_update_monitor(l);
274 log_warning("Failed to update monitor information for %i: %s", l->ifindex, strerror(-r));
277 r = manager_write_resolv_conf(m);
279 log_warning("Could not update resolv.conf: %s", strerror(-r));
284 static int manager_network_monitor_listen(Manager *m) {
289 r = sd_network_monitor_new(&m->network_monitor, NULL);
293 fd = sd_network_monitor_get_fd(m->network_monitor);
297 events = sd_network_monitor_get_events(m->network_monitor);
301 r = sd_event_add_io(m->event, &m->network_event_source, fd, events, &on_network_event, m);
308 static int parse_dns_server_string(Manager *m, const char *string) {
309 const char *word, *state;
316 FOREACH_WORD_QUOTED(word, length, string, state) {
317 char buffer[length+1];
319 union in_addr_union addr;
321 memcpy(buffer, word, length);
324 r = in_addr_from_string_auto(buffer, &family, &addr);
326 log_warning("Ignoring invalid DNS address '%s'", buffer);
330 /* filter out duplicates */
331 if (manager_find_dns_server(m, family, &addr))
334 r = dns_server_new(m, NULL, NULL, family, &addr);
338 /* do not warn about state here, since probably systemd already did */
343 int config_parse_dnsv(
345 const char *filename,
348 unsigned section_line,
355 Manager *m = userdata;
363 /* Empty assignment means clear the list */
364 if (isempty(rvalue)) {
365 while (m->dns_servers)
366 dns_server_free(m->dns_servers);
371 r = parse_dns_server_string(m, rvalue);
373 log_error("Failed to parse DNS server string");
380 int manager_parse_config_file(Manager *m) {
383 return config_parse(NULL, "/etc/systemd/resolved.conf", NULL,
385 config_item_perf_lookup, resolved_gperf_lookup,
386 false, false, true, m);
389 static int determine_hostname(char **ret) {
390 _cleanup_free_ char *h = NULL, *n = NULL;
395 h = gethostname_malloc();
399 if (!utf8_is_valid(h)) {
400 log_error("System hostname is not UTF-8 clean.");
404 r = dns_name_normalize(h, &n);
406 log_error("System hostname '%s' cannot be normalized.", h);
416 static int on_hostname_change(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
417 _cleanup_free_ char *h = NULL;
418 Manager *m = userdata;
423 r = determine_hostname(&h);
425 return 0; /* ignore invalid hostnames */
427 if (streq(h, m->hostname))
430 log_info("System hostname changed to '%s'.", h);
435 manager_refresh_rrs(m);
440 static int manager_watch_hostname(Manager *m) {
441 _cleanup_free_ char *h = NULL;
446 m->hostname_fd = open("/proc/sys/kernel/hostname", O_RDONLY|O_CLOEXEC|O_NDELAY|O_NOCTTY);
447 if (m->hostname_fd < 0) {
448 log_warning("Failed to watch hostname: %m");
452 r = sd_event_add_io(m->event, &m->hostname_event_source, m->hostname_fd, 0, on_hostname_change, m);
455 /* kernels prior to 3.2 don't support polling this file. Ignore the failure. */
456 m->hostname_fd = safe_close(m->hostname_fd);
458 log_error("Failed to add hostname event source: %s", strerror(-r));
463 r = determine_hostname(&m->hostname);
465 log_info("Defaulting to hostname 'linux'.");
466 m->hostname = strdup("linux");
470 log_info("Using system hostname '%s'.", m->hostname);
475 int manager_new(Manager **ret) {
476 _cleanup_(manager_freep) Manager *m = NULL;
481 m = new0(Manager, 1);
485 m->dns_ipv4_fd = m->dns_ipv6_fd = -1;
486 m->llmnr_ipv4_udp_fd = m->llmnr_ipv6_udp_fd = -1;
487 m->llmnr_ipv4_tcp_fd = m->llmnr_ipv6_tcp_fd = -1;
492 r = parse_dns_server_string(m, DNS_SERVERS);
496 r = sd_event_default(&m->event);
500 sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
501 sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
503 sd_event_set_watchdog(m->event, true);
505 r = manager_watch_hostname(m);
509 r = dns_scope_new(m, &m->unicast_scope, NULL, DNS_PROTOCOL_DNS, AF_UNSPEC);
513 r = manager_network_monitor_listen(m);
517 r = manager_rtnl_listen(m);
521 r = manager_connect_bus(m);
525 r = manager_llmnr_ipv4_udp_fd(m);
528 r = manager_llmnr_ipv6_udp_fd(m);
531 r = manager_llmnr_ipv4_tcp_fd(m);
534 r = manager_llmnr_ipv6_tcp_fd(m);
544 Manager *manager_free(Manager *m) {
550 while (m->dns_queries)
551 dns_query_free(m->dns_queries);
553 hashmap_free(m->dns_transactions);
555 while ((l = hashmap_first(m->links)))
557 hashmap_free(m->links);
559 dns_scope_free(m->unicast_scope);
561 while (m->dns_servers)
562 dns_server_free(m->dns_servers);
564 sd_event_source_unref(m->network_event_source);
565 sd_network_monitor_unref(m->network_monitor);
567 sd_event_source_unref(m->dns_ipv4_event_source);
568 sd_event_source_unref(m->dns_ipv6_event_source);
569 safe_close(m->dns_ipv4_fd);
570 safe_close(m->dns_ipv6_fd);
572 sd_event_source_unref(m->llmnr_ipv4_udp_event_source);
573 sd_event_source_unref(m->llmnr_ipv6_udp_event_source);
574 safe_close(m->llmnr_ipv4_udp_fd);
575 safe_close(m->llmnr_ipv6_udp_fd);
577 sd_event_source_unref(m->llmnr_ipv4_tcp_event_source);
578 sd_event_source_unref(m->llmnr_ipv6_tcp_event_source);
579 safe_close(m->llmnr_ipv4_tcp_fd);
580 safe_close(m->llmnr_ipv6_tcp_fd);
582 sd_event_source_unref(m->bus_retry_event_source);
583 sd_bus_unref(m->bus);
585 sd_event_unref(m->event);
587 dns_resource_key_unref(m->host_ipv4_key);
588 dns_resource_key_unref(m->host_ipv6_key);
590 safe_close(m->hostname_fd);
591 sd_event_source_unref(m->hostname_event_source);
599 static void write_resolve_conf_server(DnsServer *s, FILE *f, unsigned *count) {
600 _cleanup_free_ char *t = NULL;
607 r = in_addr_to_string(s->family, &s->address, &t);
609 log_warning("Invalid DNS address. Ignoring.");
614 fputs("# Too many DNS servers configured, the following entries may be ignored\n", f);
616 fprintf(f, "nameserver %s\n", t);
620 int manager_write_resolv_conf(Manager *m) {
621 const char *path = "/run/systemd/resolve/resolv.conf";
622 _cleanup_free_ char *temp_path = NULL;
623 _cleanup_fclose_ FILE *f = NULL;
632 r = fopen_temporary(path, &f, &temp_path);
636 fchmod(fileno(f), 0644);
638 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
639 "# Third party programs must not access this file directly, but\n"
640 "# only through the symlink at /etc/resolv.conf. To manage\n"
641 "# resolv.conf(5) in a different way, replace the symlink by a\n"
642 "# static file or a different symlink.\n\n", f);
644 HASHMAP_FOREACH(l, m->links, i)
645 LIST_FOREACH(servers, s, l->dns_servers)
646 write_resolve_conf_server(s, f, &count);
648 LIST_FOREACH(servers, s, m->dns_servers)
649 write_resolve_conf_server(s, f, &count);
651 r = fflush_and_check(f);
655 if (rename(temp_path, path) < 0) {
668 int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) {
669 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
671 struct cmsghdr header; /* For alignment */
672 uint8_t buffer[CMSG_SPACE(MAX(sizeof(struct in_pktinfo), sizeof(struct in6_pktinfo)))
673 + CMSG_SPACE(int) /* ttl/hoplimit */
674 + EXTRA_CMSG_SPACE /* kernel appears to require extra buffer space */];
676 union sockaddr_union sa;
677 struct msghdr mh = {};
678 struct cmsghdr *cmsg;
687 r = ioctl(fd, FIONREAD, &ms);
693 r = dns_packet_new(&p, protocol, ms);
697 iov.iov_base = DNS_PACKET_DATA(p);
698 iov.iov_len = p->allocated;
700 mh.msg_name = &sa.sa;
701 mh.msg_namelen = sizeof(sa);
704 mh.msg_control = &control;
705 mh.msg_controllen = sizeof(control);
707 l = recvmsg(fd, &mh, 0);
709 if (errno == EAGAIN || errno == EINTR)
718 assert(!(mh.msg_flags & MSG_CTRUNC));
719 assert(!(mh.msg_flags & MSG_TRUNC));
721 p->size = (size_t) l;
723 p->family = sa.sa.sa_family;
724 p->ipproto = IPPROTO_UDP;
725 if (p->family == AF_INET) {
726 p->sender.in = sa.in.sin_addr;
727 p->sender_port = be16toh(sa.in.sin_port);
728 } else if (p->family == AF_INET6) {
729 p->sender.in6 = sa.in6.sin6_addr;
730 p->sender_port = be16toh(sa.in6.sin6_port);
731 p->ifindex = sa.in6.sin6_scope_id;
733 return -EAFNOSUPPORT;
735 for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
737 if (cmsg->cmsg_level == IPPROTO_IPV6) {
738 assert(p->family == AF_INET6);
740 switch (cmsg->cmsg_type) {
743 struct in6_pktinfo *i = (struct in6_pktinfo*) CMSG_DATA(cmsg);
746 p->ifindex = i->ipi6_ifindex;
748 p->destination.in6 = i->ipi6_addr;
753 p->ttl = *(int *) CMSG_DATA(cmsg);
757 } else if (cmsg->cmsg_level == IPPROTO_IP) {
758 assert(p->family == AF_INET);
760 switch (cmsg->cmsg_type) {
763 struct in_pktinfo *i = (struct in_pktinfo*) CMSG_DATA(cmsg);
766 p->ifindex = i->ipi_ifindex;
768 p->destination.in = i->ipi_addr;
773 p->ttl = *(int *) CMSG_DATA(cmsg);
779 /* The Linux kernel sets the interface index to the loopback
780 * device if the packet came from the local host since it
781 * avoids the routing table in such a case. Let's unset the
782 * interface index in such a case. */
783 if (p->ifindex > 0 && manager_ifindex_is_loopback(m, p->ifindex) != 0)
786 /* If we don't know the interface index still, we look for the
787 * first local interface with a matching address. Yuck! */
789 p->ifindex = manager_find_ifindex(m, p->family, &p->destination);
797 static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
798 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
799 DnsTransaction *t = NULL;
800 Manager *m = userdata;
803 r = manager_recv(m, fd, DNS_PROTOCOL_DNS, &p);
807 if (dns_packet_validate_reply(p) > 0) {
808 t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
812 dns_transaction_process_reply(t, p);
815 log_debug("Invalid DNS packet.");
820 int manager_dns_ipv4_fd(Manager *m) {
826 if (m->dns_ipv4_fd >= 0)
827 return m->dns_ipv4_fd;
829 m->dns_ipv4_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
830 if (m->dns_ipv4_fd < 0)
833 r = setsockopt(m->dns_ipv4_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
839 r = sd_event_add_io(m->event, &m->dns_ipv4_event_source, m->dns_ipv4_fd, EPOLLIN, on_dns_packet, m);
843 return m->dns_ipv4_fd;
846 m->dns_ipv4_fd = safe_close(m->dns_ipv4_fd);
850 int manager_dns_ipv6_fd(Manager *m) {
856 if (m->dns_ipv6_fd >= 0)
857 return m->dns_ipv6_fd;
859 m->dns_ipv6_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
860 if (m->dns_ipv6_fd < 0)
863 r = setsockopt(m->dns_ipv6_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
869 r = sd_event_add_io(m->event, &m->dns_ipv6_event_source, m->dns_ipv6_fd, EPOLLIN, on_dns_packet, m);
873 return m->dns_ipv6_fd;
876 m->dns_ipv6_fd = safe_close(m->dns_ipv6_fd);
880 static int sendmsg_loop(int fd, struct msghdr *mh, int flags) {
887 if (sendmsg(fd, mh, flags) >= 0)
896 r = fd_wait_for_event(fd, POLLOUT, SEND_TIMEOUT_USEC);
904 static int manager_ipv4_send(Manager *m, int fd, int ifindex, const struct in_addr *addr, uint16_t port, DnsPacket *p) {
905 union sockaddr_union sa = {
906 .in.sin_family = AF_INET,
909 struct cmsghdr header; /* For alignment */
910 uint8_t buffer[CMSG_SPACE(sizeof(struct in_pktinfo))];
912 struct msghdr mh = {};
921 iov.iov_base = DNS_PACKET_DATA(p);
922 iov.iov_len = p->size;
924 sa.in.sin_addr = *addr;
925 sa.in.sin_port = htobe16(port),
929 mh.msg_name = &sa.sa;
930 mh.msg_namelen = sizeof(sa.in);
933 struct cmsghdr *cmsg;
934 struct in_pktinfo *pi;
938 mh.msg_control = &control;
939 mh.msg_controllen = CMSG_LEN(sizeof(struct in_pktinfo));
941 cmsg = CMSG_FIRSTHDR(&mh);
942 cmsg->cmsg_len = mh.msg_controllen;
943 cmsg->cmsg_level = IPPROTO_IP;
944 cmsg->cmsg_type = IP_PKTINFO;
946 pi = (struct in_pktinfo*) CMSG_DATA(cmsg);
947 pi->ipi_ifindex = ifindex;
950 return sendmsg_loop(fd, &mh, 0);
953 static int manager_ipv6_send(Manager *m, int fd, int ifindex, const struct in6_addr *addr, uint16_t port, DnsPacket *p) {
954 union sockaddr_union sa = {
955 .in6.sin6_family = AF_INET6,
958 struct cmsghdr header; /* For alignment */
959 uint8_t buffer[CMSG_SPACE(sizeof(struct in6_pktinfo))];
961 struct msghdr mh = {};
970 iov.iov_base = DNS_PACKET_DATA(p);
971 iov.iov_len = p->size;
973 sa.in6.sin6_addr = *addr;
974 sa.in6.sin6_port = htobe16(port),
975 sa.in6.sin6_scope_id = ifindex;
979 mh.msg_name = &sa.sa;
980 mh.msg_namelen = sizeof(sa.in6);
983 struct cmsghdr *cmsg;
984 struct in6_pktinfo *pi;
988 mh.msg_control = &control;
989 mh.msg_controllen = CMSG_LEN(sizeof(struct in6_pktinfo));
991 cmsg = CMSG_FIRSTHDR(&mh);
992 cmsg->cmsg_len = mh.msg_controllen;
993 cmsg->cmsg_level = IPPROTO_IPV6;
994 cmsg->cmsg_type = IPV6_PKTINFO;
996 pi = (struct in6_pktinfo*) CMSG_DATA(cmsg);
997 pi->ipi6_ifindex = ifindex;
1000 return sendmsg_loop(fd, &mh, 0);
1003 int manager_send(Manager *m, int fd, int ifindex, int family, const union in_addr_union *addr, uint16_t port, DnsPacket *p) {
1010 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));
1012 if (family == AF_INET)
1013 return manager_ipv4_send(m, fd, ifindex, &addr->in, port, p);
1014 else if (family == AF_INET6)
1015 return manager_ipv6_send(m, fd, ifindex, &addr->in6, port, p);
1017 return -EAFNOSUPPORT;
1020 DnsServer* manager_find_dns_server(Manager *m, int family, const union in_addr_union *in_addr) {
1026 LIST_FOREACH(servers, s, m->dns_servers) {
1028 if (s->family == family &&
1029 in_addr_equal(family, &s->address, in_addr))
1036 DnsServer *manager_get_dns_server(Manager *m) {
1039 if (!m->current_dns_server)
1040 m->current_dns_server = m->dns_servers;
1042 return m->current_dns_server;
1045 void manager_next_dns_server(Manager *m) {
1048 if (!m->current_dns_server) {
1049 m->current_dns_server = m->dns_servers;
1053 if (!m->current_dns_server)
1056 if (m->current_dns_server->servers_next) {
1057 m->current_dns_server = m->current_dns_server->servers_next;
1061 m->current_dns_server = m->dns_servers;
1064 uint32_t manager_find_mtu(Manager *m) {
1069 /* If we don't know on which link a DNS packet would be
1070 * delivered, let's find the largest MTU that works on all
1071 * interfaces we know of */
1073 HASHMAP_FOREACH(l, m->links, i) {
1077 if (mtu <= 0 || l->mtu < mtu)
1084 static int on_llmnr_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1085 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
1086 DnsTransaction *t = NULL;
1087 Manager *m = userdata;
1090 r = manager_recv(m, fd, DNS_PROTOCOL_LLMNR, &p);
1094 if (dns_packet_validate_reply(p) > 0) {
1095 log_debug("Got reply packet for id %u", DNS_PACKET_ID(p));
1097 t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
1101 dns_transaction_process_reply(t, p);
1103 } else if (dns_packet_validate_query(p) > 0) {
1106 l = hashmap_get(m->links, INT_TO_PTR(p->ifindex));
1108 DnsScope *scope = NULL;
1110 if (p->family == AF_INET)
1111 scope = l->llmnr_ipv4_scope;
1112 else if (p->family == AF_INET6)
1113 scope = l->llmnr_ipv6_scope;
1116 dns_scope_process_query(scope, NULL, p);
1119 log_debug("Invalid LLMNR packet.");
1124 int manager_llmnr_ipv4_udp_fd(Manager *m) {
1125 union sockaddr_union sa = {
1126 .in.sin_family = AF_INET,
1127 .in.sin_port = htobe16(5355),
1129 static const int one = 1, pmtu = IP_PMTUDISC_DONT, ttl = 255;
1134 if (m->llmnr_ipv4_udp_fd >= 0)
1135 return m->llmnr_ipv4_udp_fd;
1137 m->llmnr_ipv4_udp_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1138 if (m->llmnr_ipv4_udp_fd < 0)
1141 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1142 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
1148 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
1154 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof(one));
1160 r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1166 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1172 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1178 /* Disable Don't-Fragment bit in the IP header */
1179 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1185 r = bind(m->llmnr_ipv4_udp_fd, &sa.sa, sizeof(sa.in));
1191 r = sd_event_add_io(m->event, &m->llmnr_ipv4_udp_event_source, m->llmnr_ipv4_udp_fd, EPOLLIN, on_llmnr_packet, m);
1195 return m->llmnr_ipv4_udp_fd;
1198 m->llmnr_ipv4_udp_fd = safe_close(m->llmnr_ipv4_udp_fd);
1202 int manager_llmnr_ipv6_udp_fd(Manager *m) {
1203 union sockaddr_union sa = {
1204 .in6.sin6_family = AF_INET6,
1205 .in6.sin6_port = htobe16(5355),
1207 static const int one = 1, ttl = 255;
1212 if (m->llmnr_ipv6_udp_fd >= 0)
1213 return m->llmnr_ipv6_udp_fd;
1215 m->llmnr_ipv6_udp_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1216 if (m->llmnr_ipv6_udp_fd < 0)
1219 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl));
1225 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1226 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, sizeof(ttl));
1232 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof(one));
1238 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1244 r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1250 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1256 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1262 r = bind(m->llmnr_ipv6_udp_fd, &sa.sa, sizeof(sa.in6));
1268 r = sd_event_add_io(m->event, &m->llmnr_ipv6_udp_event_source, m->llmnr_ipv6_udp_fd, EPOLLIN, on_llmnr_packet, m);
1274 return m->llmnr_ipv6_udp_fd;
1277 m->llmnr_ipv6_udp_fd = safe_close(m->llmnr_ipv6_udp_fd);
1281 static int on_llmnr_stream_packet(DnsStream *s) {
1284 if (dns_packet_validate_query(s->read_packet) > 0) {
1287 l = hashmap_get(s->manager->links, INT_TO_PTR(s->read_packet->ifindex));
1289 DnsScope *scope = NULL;
1291 if (s->read_packet->family == AF_INET)
1292 scope = l->llmnr_ipv4_scope;
1293 else if (s->read_packet->family == AF_INET6)
1294 scope = l->llmnr_ipv6_scope;
1297 dns_scope_process_query(scope, s, s->read_packet);
1299 /* If no reply packet was set, we free the stream */
1300 if (s->write_packet)
1310 static int on_llmnr_stream(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1312 Manager *m = userdata;
1315 cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
1317 if (errno == EAGAIN || errno == EINTR)
1323 r = dns_stream_new(m, &stream, DNS_PROTOCOL_LLMNR, cfd);
1329 stream->on_packet = on_llmnr_stream_packet;
1333 int manager_llmnr_ipv4_tcp_fd(Manager *m) {
1334 union sockaddr_union sa = {
1335 .in.sin_family = AF_INET,
1336 .in.sin_port = htobe16(5355),
1338 static const int one = 1, pmtu = IP_PMTUDISC_DONT;
1343 if (m->llmnr_ipv4_tcp_fd >= 0)
1344 return m->llmnr_ipv4_tcp_fd;
1346 m->llmnr_ipv4_tcp_fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1347 if (m->llmnr_ipv4_tcp_fd < 0)
1350 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1351 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_TTL, &one, sizeof(one));
1357 r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1363 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1369 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1375 /* Disable Don't-Fragment bit in the IP header */
1376 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1382 r = bind(m->llmnr_ipv4_tcp_fd, &sa.sa, sizeof(sa.in));
1388 r = listen(m->llmnr_ipv4_tcp_fd, SOMAXCONN);
1394 r = sd_event_add_io(m->event, &m->llmnr_ipv4_tcp_event_source, m->llmnr_ipv4_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1398 return m->llmnr_ipv4_tcp_fd;
1401 m->llmnr_ipv4_tcp_fd = safe_close(m->llmnr_ipv4_tcp_fd);
1405 int manager_llmnr_ipv6_tcp_fd(Manager *m) {
1406 union sockaddr_union sa = {
1407 .in6.sin6_family = AF_INET6,
1408 .in6.sin6_port = htobe16(5355),
1410 static const int one = 1;
1415 if (m->llmnr_ipv6_tcp_fd >= 0)
1416 return m->llmnr_ipv6_tcp_fd;
1418 m->llmnr_ipv6_tcp_fd = socket(AF_INET6, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1419 if (m->llmnr_ipv6_tcp_fd < 0)
1422 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1423 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &one, sizeof(one));
1429 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1435 r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1441 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1447 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1453 r = bind(m->llmnr_ipv6_tcp_fd, &sa.sa, sizeof(sa.in6));
1459 r = listen(m->llmnr_ipv6_tcp_fd, SOMAXCONN);
1465 r = sd_event_add_io(m->event, &m->llmnr_ipv6_tcp_event_source, m->llmnr_ipv6_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1471 return m->llmnr_ipv6_tcp_fd;
1474 m->llmnr_ipv6_tcp_fd = safe_close(m->llmnr_ipv6_tcp_fd);
1478 int manager_ifindex_is_loopback(Manager *m, int ifindex) {
1485 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
1486 if (l->flags & IFF_LOOPBACK)
1492 int manager_find_ifindex(Manager *m, int family, const union in_addr_union *in_addr) {
1497 a = manager_find_address(m, family, in_addr);
1499 return a->link->ifindex;
1504 void manager_refresh_rrs(Manager *m) {
1510 m->host_ipv4_key = dns_resource_key_unref(m->host_ipv4_key);
1511 m->host_ipv6_key = dns_resource_key_unref(m->host_ipv6_key);
1513 HASHMAP_FOREACH(l, m->links, i) {
1514 link_add_rrs(l, true);
1515 link_add_rrs(l, false);
1519 int manager_next_hostname(Manager *m) {
1526 p = strchr(m->hostname, 0);
1529 while (p > m->hostname) {
1530 if (!strchr("0123456789", p[-1]))
1536 if (*p == 0 || safe_atou64(p, &u) < 0 || u <= 0)
1541 if (asprintf(&h, "%.*s%" PRIu64, (int) (p - m->hostname), m->hostname, u) < 0)
1544 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m->hostname, h);
1549 manager_refresh_rrs(m);
1554 LinkAddress* manager_find_address(Manager *m, int family, const union in_addr_union *in_addr) {
1560 HASHMAP_FOREACH(l, m->links, i) {
1563 a = link_find_address(l, family, in_addr);
1571 int manager_our_packet(Manager *m, DnsPacket *p) {
1575 return !!manager_find_address(m, p->family, &p->sender);