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"
37 #define SEND_TIMEOUT_USEC (200 * USEC_PER_MSEC)
39 static int manager_process_link(sd_rtnl *rtnl, sd_rtnl_message *mm, void *userdata) {
40 Manager *m = userdata;
49 r = sd_rtnl_message_get_type(mm, &type);
53 r = sd_rtnl_message_link_get_ifindex(mm, &ifindex);
57 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
63 log_debug("Found link %i", ifindex);
65 r = link_new(m, &l, ifindex);
70 r = link_update_rtnl(l, mm);
78 log_debug("Removing link %i", l->ifindex);
88 log_warning("Failed to process RTNL link message: %s", strerror(-r));
92 static int manager_process_address(sd_rtnl *rtnl, sd_rtnl_message *mm, void *userdata) {
93 Manager *m = userdata;
94 union in_addr_union address;
96 int r, ifindex, family;
104 r = sd_rtnl_message_get_type(mm, &type);
108 r = sd_rtnl_message_addr_get_ifindex(mm, &ifindex);
112 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
116 r = sd_rtnl_message_addr_get_family(mm, &family);
123 r = sd_rtnl_message_read_in_addr(mm, IFA_LOCAL, &address.in);
125 r = sd_rtnl_message_read_in_addr(mm, IFA_ADDRESS, &address.in);
133 r = sd_rtnl_message_read_in6_addr(mm, IFA_LOCAL, &address.in6);
135 r = sd_rtnl_message_read_in6_addr(mm, IFA_ADDRESS, &address.in6);
146 a = link_find_address(l, family, &address);
153 r = link_address_new(l, &a, family, &address);
158 r = link_address_update_rtnl(a, mm);
166 link_address_free(a);
173 log_warning("Failed to process RTNL address message: %s", strerror(-r));
178 static int manager_rtnl_listen(Manager *m) {
179 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL;
185 /* First, subscibe to interfaces coming and going */
186 r = sd_rtnl_open(&m->rtnl, 3, RTNLGRP_LINK, RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV6_IFADDR);
190 r = sd_rtnl_attach_event(m->rtnl, m->event, 0);
194 r = sd_rtnl_add_match(m->rtnl, RTM_NEWLINK, manager_process_link, m);
198 r = sd_rtnl_add_match(m->rtnl, RTM_DELLINK, manager_process_link, m);
202 r = sd_rtnl_add_match(m->rtnl, RTM_NEWADDR, manager_process_address, m);
206 r = sd_rtnl_add_match(m->rtnl, RTM_DELADDR, manager_process_address, m);
210 /* Then, enumerate all links */
211 r = sd_rtnl_message_new_link(m->rtnl, &req, RTM_GETLINK, 0);
215 r = sd_rtnl_message_request_dump(req, true);
219 r = sd_rtnl_call(m->rtnl, req, 0, &reply);
223 for (i = reply; i; i = sd_rtnl_message_next(i)) {
224 r = manager_process_link(m->rtnl, i, m);
229 req = sd_rtnl_message_unref(req);
230 reply = sd_rtnl_message_unref(reply);
232 /* Finally, enumerate all addresses, too */
233 r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, 0, AF_UNSPEC);
237 r = sd_rtnl_message_request_dump(req, true);
241 r = sd_rtnl_call(m->rtnl, req, 0, &reply);
245 for (i = reply; i; i = sd_rtnl_message_next(i)) {
246 r = manager_process_address(m->rtnl, i, m);
254 static int on_network_event(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
255 Manager *m = userdata;
262 sd_network_monitor_flush(m->network_monitor);
264 HASHMAP_FOREACH(l, m->links, i) {
265 r = link_update_monitor(l);
267 log_warning("Failed to update monitor information for %i: %s", l->ifindex, strerror(-r));
270 r = manager_write_resolv_conf(m);
272 log_warning("Could not update resolv.conf: %s", strerror(-r));
277 static int manager_network_monitor_listen(Manager *m) {
282 r = sd_network_monitor_new(&m->network_monitor, NULL);
286 fd = sd_network_monitor_get_fd(m->network_monitor);
290 events = sd_network_monitor_get_events(m->network_monitor);
294 r = sd_event_add_io(m->event, &m->network_event_source, fd, events, &on_network_event, m);
301 static int parse_dns_server_string(Manager *m, const char *string) {
309 FOREACH_WORD_QUOTED(word, length, string, state) {
310 char buffer[length+1];
312 union in_addr_union addr;
314 memcpy(buffer, word, length);
317 r = in_addr_from_string_auto(buffer, &family, &addr);
319 log_warning("Ignoring invalid DNS address '%s'", buffer);
323 /* filter out duplicates */
324 if (manager_find_dns_server(m, family, &addr))
327 r = dns_server_new(m, NULL, NULL, family, &addr);
335 int config_parse_dnsv(
337 const char *filename,
340 unsigned section_line,
347 Manager *m = userdata;
355 /* Empty assignment means clear the list */
356 if (isempty(rvalue)) {
357 while (m->dns_servers)
358 dns_server_free(m->dns_servers);
363 r = parse_dns_server_string(m, rvalue);
365 log_error("Failed to parse DNS server string");
372 int manager_parse_config_file(Manager *m) {
375 return config_parse(NULL, "/etc/systemd/resolved.conf", NULL,
377 config_item_perf_lookup, resolved_gperf_lookup,
378 false, false, true, m);
381 int manager_new(Manager **ret) {
382 _cleanup_(manager_freep) Manager *m = NULL;
387 m = new0(Manager, 1);
391 m->dns_ipv4_fd = m->dns_ipv6_fd = -1;
392 m->llmnr_ipv4_udp_fd = m->llmnr_ipv6_udp_fd = -1;
393 m->llmnr_ipv4_tcp_fd = m->llmnr_ipv6_tcp_fd = -1;
397 r = parse_dns_server_string(m, DNS_SERVERS);
401 m->hostname = gethostname_malloc();
405 r = sd_event_default(&m->event);
409 sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
410 sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
412 sd_event_set_watchdog(m->event, true);
414 r = dns_scope_new(m, &m->unicast_scope, NULL, DNS_PROTOCOL_DNS, AF_UNSPEC);
418 r = manager_network_monitor_listen(m);
422 r = manager_rtnl_listen(m);
426 r = manager_connect_bus(m);
430 r = manager_llmnr_ipv4_udp_fd(m);
433 r = manager_llmnr_ipv6_udp_fd(m);
436 r = manager_llmnr_ipv4_tcp_fd(m);
439 r = manager_llmnr_ipv6_tcp_fd(m);
449 Manager *manager_free(Manager *m) {
455 while (m->dns_queries)
456 dns_query_free(m->dns_queries);
458 hashmap_free(m->dns_query_transactions);
460 while ((l = hashmap_first(m->links)))
462 hashmap_free(m->links);
464 dns_scope_free(m->unicast_scope);
466 while (m->dns_servers)
467 dns_server_free(m->dns_servers);
469 sd_event_source_unref(m->network_event_source);
470 sd_network_monitor_unref(m->network_monitor);
472 sd_event_source_unref(m->dns_ipv4_event_source);
473 sd_event_source_unref(m->dns_ipv6_event_source);
474 safe_close(m->dns_ipv4_fd);
475 safe_close(m->dns_ipv6_fd);
477 sd_event_source_unref(m->llmnr_ipv4_udp_event_source);
478 sd_event_source_unref(m->llmnr_ipv6_udp_event_source);
479 safe_close(m->llmnr_ipv4_udp_fd);
480 safe_close(m->llmnr_ipv6_udp_fd);
482 sd_event_source_unref(m->llmnr_ipv4_tcp_event_source);
483 sd_event_source_unref(m->llmnr_ipv6_tcp_event_source);
484 safe_close(m->llmnr_ipv4_tcp_fd);
485 safe_close(m->llmnr_ipv6_tcp_fd);
487 sd_event_source_unref(m->bus_retry_event_source);
488 sd_bus_unref(m->bus);
490 sd_event_unref(m->event);
492 dns_resource_key_unref(m->host_ipv4_key);
493 dns_resource_key_unref(m->host_ipv6_key);
500 static void write_resolve_conf_server(DnsServer *s, FILE *f, unsigned *count) {
501 _cleanup_free_ char *t = NULL;
508 r = in_addr_to_string(s->family, &s->address, &t);
510 log_warning("Invalid DNS address. Ignoring.");
515 fputs("# Too many DNS servers configured, the following entries may be ignored\n", f);
517 fprintf(f, "nameserver %s\n", t);
521 int manager_write_resolv_conf(Manager *m) {
522 const char *path = "/run/systemd/resolve/resolv.conf";
523 _cleanup_free_ char *temp_path = NULL;
524 _cleanup_fclose_ FILE *f = NULL;
533 r = fopen_temporary(path, &f, &temp_path);
537 fchmod(fileno(f), 0644);
539 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
540 "# Third party programs must not access this file directly, but\n"
541 "# only through the symlink at /etc/resolv.conf. To manage\n"
542 "# resolv.conf(5) in a different way, replace the symlink by a\n"
543 "# static file or a different symlink.\n\n", f);
545 HASHMAP_FOREACH(l, m->links, i)
546 LIST_FOREACH(servers, s, l->dns_servers)
547 write_resolve_conf_server(s, f, &count);
549 LIST_FOREACH(servers, s, m->dns_servers)
550 write_resolve_conf_server(s, f, &count);
552 r = fflush_and_check(f);
556 if (rename(temp_path, path) < 0) {
569 int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) {
570 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
572 struct cmsghdr header; /* For alignment */
573 uint8_t buffer[CMSG_SPACE(MAX(sizeof(struct in_pktinfo), sizeof(struct in6_pktinfo)))
574 + CMSG_SPACE(int) /* ttl/hoplimit */
575 + EXTRA_CMSG_SPACE /* kernel appears to require extra buffer space */];
577 union sockaddr_union sa;
578 struct msghdr mh = {};
579 struct cmsghdr *cmsg;
588 r = ioctl(fd, FIONREAD, &ms);
594 r = dns_packet_new(&p, protocol, ms);
598 iov.iov_base = DNS_PACKET_DATA(p);
599 iov.iov_len = p->allocated;
601 mh.msg_name = &sa.sa;
602 mh.msg_namelen = sizeof(sa);
605 mh.msg_control = &control;
606 mh.msg_controllen = sizeof(control);
608 l = recvmsg(fd, &mh, 0);
610 if (errno == EAGAIN || errno == EINTR)
619 assert(!(mh.msg_flags & MSG_CTRUNC));
620 assert(!(mh.msg_flags & MSG_TRUNC));
622 p->size = (size_t) l;
624 p->family = sa.sa.sa_family;
625 p->ipproto = IPPROTO_UDP;
626 if (p->family == AF_INET) {
627 p->sender.in = sa.in.sin_addr;
628 p->sender_port = be16toh(sa.in.sin_port);
629 } else if (p->family == AF_INET6) {
630 p->sender.in6 = sa.in6.sin6_addr;
631 p->sender_port = be16toh(sa.in6.sin6_port);
632 p->ifindex = sa.in6.sin6_scope_id;
634 return -EAFNOSUPPORT;
636 for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
638 if (cmsg->cmsg_level == IPPROTO_IPV6) {
639 assert(p->family == AF_INET6);
641 switch (cmsg->cmsg_type) {
644 struct in6_pktinfo *i = (struct in6_pktinfo*) CMSG_DATA(cmsg);
647 p->ifindex = i->ipi6_ifindex;
649 p->destination.in6 = i->ipi6_addr;
654 p->ttl = *(int *) CMSG_DATA(cmsg);
658 } else if (cmsg->cmsg_level == IPPROTO_IP) {
659 assert(p->family == AF_INET);
661 switch (cmsg->cmsg_type) {
664 struct in_pktinfo *i = (struct in_pktinfo*) CMSG_DATA(cmsg);
667 p->ifindex = i->ipi_ifindex;
669 p->destination.in = i->ipi_addr;
674 p->ttl = *(int *) CMSG_DATA(cmsg);
680 /* The Linux kernel sets the interface index to the loopback
681 * device if the packet came from the local host since it
682 * avoids the routing table in such a case. Let's unset the
683 * interface index in such a case. */
684 if (p->ifindex > 0 && manager_ifindex_is_loopback(m, p->ifindex) != 0)
687 /* If we don't know the interface index still, we look for the
688 * first local interface with a matching address. Yuck! */
690 p->ifindex = manager_find_ifindex(m, p->family, &p->destination);
698 static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
699 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
700 DnsQueryTransaction *t = NULL;
701 Manager *m = userdata;
704 r = manager_recv(m, fd, DNS_PROTOCOL_DNS, &p);
708 if (dns_packet_validate_reply(p) > 0) {
709 t = hashmap_get(m->dns_query_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
713 dns_query_transaction_process_reply(t, p);
716 log_debug("Invalid DNS packet.");
721 int manager_dns_ipv4_fd(Manager *m) {
727 if (m->dns_ipv4_fd >= 0)
728 return m->dns_ipv4_fd;
730 m->dns_ipv4_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
731 if (m->dns_ipv4_fd < 0)
734 r = setsockopt(m->dns_ipv4_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
740 r = sd_event_add_io(m->event, &m->dns_ipv4_event_source, m->dns_ipv4_fd, EPOLLIN, on_dns_packet, m);
744 return m->dns_ipv4_fd;
747 m->dns_ipv4_fd = safe_close(m->dns_ipv4_fd);
751 int manager_dns_ipv6_fd(Manager *m) {
757 if (m->dns_ipv6_fd >= 0)
758 return m->dns_ipv6_fd;
760 m->dns_ipv6_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
761 if (m->dns_ipv6_fd < 0)
764 r = setsockopt(m->dns_ipv6_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
770 r = sd_event_add_io(m->event, &m->dns_ipv6_event_source, m->dns_ipv6_fd, EPOLLIN, on_dns_packet, m);
774 return m->dns_ipv6_fd;
777 m->dns_ipv6_fd = safe_close(m->dns_ipv6_fd);
781 static int sendmsg_loop(int fd, struct msghdr *mh, int flags) {
788 if (sendmsg(fd, mh, flags) >= 0)
797 r = fd_wait_for_event(fd, POLLOUT, SEND_TIMEOUT_USEC);
805 static int manager_ipv4_send(Manager *m, int fd, int ifindex, const struct in_addr *addr, uint16_t port, DnsPacket *p) {
806 union sockaddr_union sa = {
807 .in.sin_family = AF_INET,
810 struct cmsghdr header; /* For alignment */
811 uint8_t buffer[CMSG_SPACE(sizeof(struct in_pktinfo))];
813 struct msghdr mh = {};
822 iov.iov_base = DNS_PACKET_DATA(p);
823 iov.iov_len = p->size;
825 sa.in.sin_addr = *addr;
826 sa.in.sin_port = htobe16(port),
830 mh.msg_name = &sa.sa;
831 mh.msg_namelen = sizeof(sa.in);
834 struct cmsghdr *cmsg;
835 struct in_pktinfo *pi;
839 mh.msg_control = &control;
840 mh.msg_controllen = CMSG_LEN(sizeof(struct in_pktinfo));
842 cmsg = CMSG_FIRSTHDR(&mh);
843 cmsg->cmsg_len = mh.msg_controllen;
844 cmsg->cmsg_level = IPPROTO_IP;
845 cmsg->cmsg_type = IP_PKTINFO;
847 pi = (struct in_pktinfo*) CMSG_DATA(cmsg);
848 pi->ipi_ifindex = ifindex;
851 return sendmsg_loop(fd, &mh, 0);
854 static int manager_ipv6_send(Manager *m, int fd, int ifindex, const struct in6_addr *addr, uint16_t port, DnsPacket *p) {
855 union sockaddr_union sa = {
856 .in6.sin6_family = AF_INET6,
859 struct cmsghdr header; /* For alignment */
860 uint8_t buffer[CMSG_SPACE(sizeof(struct in6_pktinfo))];
862 struct msghdr mh = {};
871 iov.iov_base = DNS_PACKET_DATA(p);
872 iov.iov_len = p->size;
874 sa.in6.sin6_addr = *addr;
875 sa.in6.sin6_port = htobe16(port),
876 sa.in6.sin6_scope_id = ifindex;
880 mh.msg_name = &sa.sa;
881 mh.msg_namelen = sizeof(sa.in6);
884 struct cmsghdr *cmsg;
885 struct in6_pktinfo *pi;
889 mh.msg_control = &control;
890 mh.msg_controllen = CMSG_LEN(sizeof(struct in6_pktinfo));
892 cmsg = CMSG_FIRSTHDR(&mh);
893 cmsg->cmsg_len = mh.msg_controllen;
894 cmsg->cmsg_level = IPPROTO_IPV6;
895 cmsg->cmsg_type = IPV6_PKTINFO;
897 pi = (struct in6_pktinfo*) CMSG_DATA(cmsg);
898 pi->ipi6_ifindex = ifindex;
901 return sendmsg_loop(fd, &mh, 0);
904 int manager_send(Manager *m, int fd, int ifindex, int family, const union in_addr_union *addr, uint16_t port, DnsPacket *p) {
911 if (family == AF_INET)
912 return manager_ipv4_send(m, fd, ifindex, &addr->in, port, p);
913 else if (family == AF_INET6)
914 return manager_ipv6_send(m, fd, ifindex, &addr->in6, port, p);
916 return -EAFNOSUPPORT;
920 DnsServer* manager_find_dns_server(Manager *m, int family, const union in_addr_union *in_addr) {
926 LIST_FOREACH(servers, s, m->dns_servers) {
928 if (s->family == family &&
929 in_addr_equal(family, &s->address, in_addr))
936 DnsServer *manager_get_dns_server(Manager *m) {
939 if (!m->current_dns_server)
940 m->current_dns_server = m->dns_servers;
942 return m->current_dns_server;
945 void manager_next_dns_server(Manager *m) {
948 if (!m->current_dns_server) {
949 m->current_dns_server = m->dns_servers;
953 if (!m->current_dns_server)
956 if (m->current_dns_server->servers_next) {
957 m->current_dns_server = m->current_dns_server->servers_next;
961 m->current_dns_server = m->dns_servers;
964 uint32_t manager_find_mtu(Manager *m) {
969 /* If we don't know on which link a DNS packet would be
970 * delivered, let's find the largest MTU that works on all
971 * interfaces we know of */
973 HASHMAP_FOREACH(l, m->links, i) {
977 if (mtu <= 0 || l->mtu < mtu)
984 static int on_llmnr_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
985 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
986 DnsQueryTransaction *t = NULL;
987 Manager *m = userdata;
990 r = manager_recv(m, fd, DNS_PROTOCOL_LLMNR, &p);
994 if (dns_packet_validate_reply(p) > 0) {
995 t = hashmap_get(m->dns_query_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
999 dns_query_transaction_process_reply(t, p);
1001 } else if (dns_packet_validate_query(p) > 0) {
1004 l = hashmap_get(m->links, INT_TO_PTR(p->ifindex));
1006 DnsScope *scope = NULL;
1008 if (p->family == AF_INET)
1009 scope = l->llmnr_ipv4_scope;
1010 else if (p->family == AF_INET6)
1011 scope = l->llmnr_ipv6_scope;
1014 dns_scope_process_query(scope, NULL, p);
1017 log_debug("Invalid LLMNR packet.");
1022 int manager_llmnr_ipv4_udp_fd(Manager *m) {
1023 union sockaddr_union sa = {
1024 .in.sin_family = AF_INET,
1025 .in.sin_port = htobe16(5355),
1027 static const int one = 1, pmtu = IP_PMTUDISC_DONT;
1032 if (m->llmnr_ipv4_udp_fd >= 0)
1033 return m->llmnr_ipv4_udp_fd;
1035 m->llmnr_ipv4_udp_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1036 if (m->llmnr_ipv4_udp_fd < 0)
1039 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_TTL, &one, sizeof(one));
1045 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_TTL, &one, sizeof(one));
1051 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof(one));
1057 r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1063 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1069 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1075 /* Disable Don't-Fragment bit in the IP header */
1076 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1082 r = bind(m->llmnr_ipv4_udp_fd, &sa.sa, sizeof(sa.in));
1088 r = sd_event_add_io(m->event, &m->llmnr_ipv4_udp_event_source, m->llmnr_ipv4_udp_fd, EPOLLIN, on_llmnr_packet, m);
1092 return m->llmnr_ipv4_udp_fd;
1095 m->llmnr_ipv4_udp_fd = safe_close(m->llmnr_ipv4_udp_fd);
1099 int manager_llmnr_ipv6_udp_fd(Manager *m) {
1100 union sockaddr_union sa = {
1101 .in6.sin6_family = AF_INET6,
1102 .in6.sin6_port = htobe16(5355),
1104 static const int one = 1;
1109 if (m->llmnr_ipv6_udp_fd >= 0)
1110 return m->llmnr_ipv6_udp_fd;
1112 m->llmnr_ipv6_udp_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1113 if (m->llmnr_ipv6_udp_fd < 0)
1116 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &one, sizeof(one));
1122 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &one, sizeof(one));
1128 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof(one));
1134 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1140 r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1146 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1152 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1158 r = bind(m->llmnr_ipv6_udp_fd, &sa.sa, sizeof(sa.in6));
1164 r = sd_event_add_io(m->event, &m->llmnr_ipv6_udp_event_source, m->llmnr_ipv6_udp_fd, EPOLLIN, on_llmnr_packet, m);
1170 return m->llmnr_ipv6_udp_fd;
1173 m->llmnr_ipv6_udp_fd = safe_close(m->llmnr_ipv6_udp_fd);
1177 static int on_llmnr_stream_packet(DnsStream *s) {
1180 if (dns_packet_validate_query(s->read_packet) > 0) {
1183 l = hashmap_get(s->manager->links, INT_TO_PTR(s->read_packet->ifindex));
1185 DnsScope *scope = NULL;
1187 if (s->read_packet->family == AF_INET)
1188 scope = l->llmnr_ipv4_scope;
1189 else if (s->read_packet->family == AF_INET6)
1190 scope = l->llmnr_ipv6_scope;
1193 dns_scope_process_query(scope, s, s->read_packet);
1195 /* If no reply packet was set, we free the stream */
1196 if (s->write_packet)
1206 static int on_llmnr_stream(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1208 Manager *m = userdata;
1211 cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
1213 if (errno == EAGAIN || errno == EINTR)
1219 r = dns_stream_new(m, &stream, DNS_PROTOCOL_LLMNR, cfd);
1225 stream->on_packet = on_llmnr_stream_packet;
1229 int manager_llmnr_ipv4_tcp_fd(Manager *m) {
1230 union sockaddr_union sa = {
1231 .in.sin_family = AF_INET,
1232 .in.sin_port = htobe16(5355),
1234 static const int one = 1, pmtu = IP_PMTUDISC_DONT;
1239 if (m->llmnr_ipv4_tcp_fd >= 0)
1240 return m->llmnr_ipv4_tcp_fd;
1242 m->llmnr_ipv4_tcp_fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1243 if (m->llmnr_ipv4_tcp_fd < 0)
1246 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_TTL, &one, sizeof(one));
1252 r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1258 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1264 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1270 /* Disable Don't-Fragment bit in the IP header */
1271 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1277 r = bind(m->llmnr_ipv4_tcp_fd, &sa.sa, sizeof(sa.in));
1283 r = listen(m->llmnr_ipv4_tcp_fd, SOMAXCONN);
1289 r = sd_event_add_io(m->event, &m->llmnr_ipv4_tcp_event_source, m->llmnr_ipv4_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1293 return m->llmnr_ipv4_tcp_fd;
1296 m->llmnr_ipv4_tcp_fd = safe_close(m->llmnr_ipv4_tcp_fd);
1300 int manager_llmnr_ipv6_tcp_fd(Manager *m) {
1301 union sockaddr_union sa = {
1302 .in6.sin6_family = AF_INET6,
1303 .in6.sin6_port = htobe16(5355),
1305 static const int one = 1;
1310 if (m->llmnr_ipv6_tcp_fd >= 0)
1311 return m->llmnr_ipv6_tcp_fd;
1313 m->llmnr_ipv6_tcp_fd = socket(AF_INET6, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1314 if (m->llmnr_ipv6_tcp_fd < 0)
1317 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &one, sizeof(one));
1323 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1329 r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1335 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1341 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1347 r = bind(m->llmnr_ipv6_tcp_fd, &sa.sa, sizeof(sa.in6));
1353 r = listen(m->llmnr_ipv6_tcp_fd, SOMAXCONN);
1359 r = sd_event_add_io(m->event, &m->llmnr_ipv6_tcp_event_source, m->llmnr_ipv6_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1365 return m->llmnr_ipv6_tcp_fd;
1368 m->llmnr_ipv6_tcp_fd = safe_close(m->llmnr_ipv6_tcp_fd);
1372 int manager_ifindex_is_loopback(Manager *m, int ifindex) {
1379 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
1380 if (l->flags & IFF_LOOPBACK)
1386 int manager_find_ifindex(Manager *m, int family, const union in_addr_union *in_addr) {
1392 HASHMAP_FOREACH(l, m->links, i)
1393 if (link_find_address(l, family, in_addr))