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 #define SEND_TIMEOUT_USEC (200 * USEC_PER_MSEC)
40 static int manager_process_link(sd_rtnl
*rtnl
, sd_rtnl_message
*mm
, void *userdata
) {
41 Manager
*m
= userdata
;
50 r
= sd_rtnl_message_get_type(mm
, &type
);
54 r
= sd_rtnl_message_link_get_ifindex(mm
, &ifindex
);
58 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
66 r
= link_new(m
, &l
, ifindex
);
71 r
= link_update_rtnl(l
, mm
);
76 log_debug("Found new link %i/%s", ifindex
, l
->name
);
83 log_debug("Removing link %i/%s", l
->ifindex
, l
->name
);
93 log_warning("Failed to process RTNL link message: %s", strerror(-r
));
97 static int manager_process_address(sd_rtnl
*rtnl
, sd_rtnl_message
*mm
, void *userdata
) {
98 Manager
*m
= userdata
;
99 union in_addr_union address
;
101 int r
, ifindex
, family
;
109 r
= sd_rtnl_message_get_type(mm
, &type
);
113 r
= sd_rtnl_message_addr_get_ifindex(mm
, &ifindex
);
117 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
121 r
= sd_rtnl_message_addr_get_family(mm
, &family
);
128 r
= sd_rtnl_message_read_in_addr(mm
, IFA_LOCAL
, &address
.in
);
130 r
= sd_rtnl_message_read_in_addr(mm
, IFA_ADDRESS
, &address
.in
);
138 r
= sd_rtnl_message_read_in6_addr(mm
, IFA_LOCAL
, &address
.in6
);
140 r
= sd_rtnl_message_read_in6_addr(mm
, IFA_ADDRESS
, &address
.in6
);
151 a
= link_find_address(l
, family
, &address
);
158 r
= link_address_new(l
, &a
, family
, &address
);
163 r
= link_address_update_rtnl(a
, mm
);
171 link_address_free(a
);
178 log_warning("Failed to process RTNL address message: %s", strerror(-r
));
183 static int manager_rtnl_listen(Manager
*m
) {
184 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
, *reply
= NULL
;
190 /* First, subscibe to interfaces coming and going */
191 r
= sd_rtnl_open(&m
->rtnl
, 3, RTNLGRP_LINK
, RTNLGRP_IPV4_IFADDR
, RTNLGRP_IPV6_IFADDR
);
195 r
= sd_rtnl_attach_event(m
->rtnl
, m
->event
, 0);
199 r
= sd_rtnl_add_match(m
->rtnl
, RTM_NEWLINK
, manager_process_link
, m
);
203 r
= sd_rtnl_add_match(m
->rtnl
, RTM_DELLINK
, manager_process_link
, m
);
207 r
= sd_rtnl_add_match(m
->rtnl
, RTM_NEWADDR
, manager_process_address
, m
);
211 r
= sd_rtnl_add_match(m
->rtnl
, RTM_DELADDR
, manager_process_address
, m
);
215 /* Then, enumerate all links */
216 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
220 r
= sd_rtnl_message_request_dump(req
, true);
224 r
= sd_rtnl_call(m
->rtnl
, req
, 0, &reply
);
228 for (i
= reply
; i
; i
= sd_rtnl_message_next(i
)) {
229 r
= manager_process_link(m
->rtnl
, i
, m
);
234 req
= sd_rtnl_message_unref(req
);
235 reply
= sd_rtnl_message_unref(reply
);
237 /* Finally, enumerate all addresses, too */
238 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, AF_UNSPEC
);
242 r
= sd_rtnl_message_request_dump(req
, true);
246 r
= sd_rtnl_call(m
->rtnl
, req
, 0, &reply
);
250 for (i
= reply
; i
; i
= sd_rtnl_message_next(i
)) {
251 r
= manager_process_address(m
->rtnl
, i
, m
);
259 static int on_network_event(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
260 Manager
*m
= userdata
;
267 sd_network_monitor_flush(m
->network_monitor
);
269 HASHMAP_FOREACH(l
, m
->links
, i
) {
270 r
= link_update_monitor(l
);
272 log_warning("Failed to update monitor information for %i: %s", l
->ifindex
, strerror(-r
));
275 r
= manager_write_resolv_conf(m
);
277 log_warning("Could not update resolv.conf: %s", strerror(-r
));
282 static int manager_network_monitor_listen(Manager
*m
) {
287 r
= sd_network_monitor_new(&m
->network_monitor
, NULL
);
291 fd
= sd_network_monitor_get_fd(m
->network_monitor
);
295 events
= sd_network_monitor_get_events(m
->network_monitor
);
299 r
= sd_event_add_io(m
->event
, &m
->network_event_source
, fd
, events
, &on_network_event
, m
);
306 static int parse_dns_server_string(Manager
*m
, const char *string
) {
307 const char *word
, *state
;
314 FOREACH_WORD_QUOTED(word
, length
, string
, state
) {
315 char buffer
[length
+1];
317 union in_addr_union addr
;
319 memcpy(buffer
, word
, length
);
322 r
= in_addr_from_string_auto(buffer
, &family
, &addr
);
324 log_warning("Ignoring invalid DNS address '%s'", buffer
);
328 /* filter out duplicates */
329 if (manager_find_dns_server(m
, family
, &addr
))
332 r
= dns_server_new(m
, NULL
, NULL
, family
, &addr
);
336 /* do not warn about state here, since probably systemd already did */
341 int config_parse_dnsv(
343 const char *filename
,
346 unsigned section_line
,
353 Manager
*m
= userdata
;
361 /* Empty assignment means clear the list */
362 if (isempty(rvalue
)) {
363 while (m
->dns_servers
)
364 dns_server_free(m
->dns_servers
);
369 r
= parse_dns_server_string(m
, rvalue
);
371 log_error("Failed to parse DNS server string");
378 int manager_parse_config_file(Manager
*m
) {
381 return config_parse(NULL
, "/etc/systemd/resolved.conf", NULL
,
383 config_item_perf_lookup
, resolved_gperf_lookup
,
384 false, false, true, m
);
387 int manager_new(Manager
**ret
) {
388 _cleanup_(manager_freep
) Manager
*m
= NULL
;
393 m
= new0(Manager
, 1);
397 m
->dns_ipv4_fd
= m
->dns_ipv6_fd
= -1;
398 m
->llmnr_ipv4_udp_fd
= m
->llmnr_ipv6_udp_fd
= -1;
399 m
->llmnr_ipv4_tcp_fd
= m
->llmnr_ipv6_tcp_fd
= -1;
403 r
= parse_dns_server_string(m
, DNS_SERVERS
);
407 m
->hostname
= gethostname_malloc();
411 r
= sd_event_default(&m
->event
);
415 sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
416 sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
418 sd_event_set_watchdog(m
->event
, true);
420 r
= dns_scope_new(m
, &m
->unicast_scope
, NULL
, DNS_PROTOCOL_DNS
, AF_UNSPEC
);
424 r
= manager_network_monitor_listen(m
);
428 r
= manager_rtnl_listen(m
);
432 r
= manager_connect_bus(m
);
436 r
= manager_llmnr_ipv4_udp_fd(m
);
439 r
= manager_llmnr_ipv6_udp_fd(m
);
442 r
= manager_llmnr_ipv4_tcp_fd(m
);
445 r
= manager_llmnr_ipv6_tcp_fd(m
);
455 Manager
*manager_free(Manager
*m
) {
461 while (m
->dns_queries
)
462 dns_query_free(m
->dns_queries
);
464 hashmap_free(m
->dns_query_transactions
);
466 while ((l
= hashmap_first(m
->links
)))
468 hashmap_free(m
->links
);
470 dns_scope_free(m
->unicast_scope
);
472 while (m
->dns_servers
)
473 dns_server_free(m
->dns_servers
);
475 sd_event_source_unref(m
->network_event_source
);
476 sd_network_monitor_unref(m
->network_monitor
);
478 sd_event_source_unref(m
->dns_ipv4_event_source
);
479 sd_event_source_unref(m
->dns_ipv6_event_source
);
480 safe_close(m
->dns_ipv4_fd
);
481 safe_close(m
->dns_ipv6_fd
);
483 sd_event_source_unref(m
->llmnr_ipv4_udp_event_source
);
484 sd_event_source_unref(m
->llmnr_ipv6_udp_event_source
);
485 safe_close(m
->llmnr_ipv4_udp_fd
);
486 safe_close(m
->llmnr_ipv6_udp_fd
);
488 sd_event_source_unref(m
->llmnr_ipv4_tcp_event_source
);
489 sd_event_source_unref(m
->llmnr_ipv6_tcp_event_source
);
490 safe_close(m
->llmnr_ipv4_tcp_fd
);
491 safe_close(m
->llmnr_ipv6_tcp_fd
);
493 sd_event_source_unref(m
->bus_retry_event_source
);
494 sd_bus_unref(m
->bus
);
496 sd_event_unref(m
->event
);
498 dns_resource_key_unref(m
->host_ipv4_key
);
499 dns_resource_key_unref(m
->host_ipv6_key
);
506 static void write_resolve_conf_server(DnsServer
*s
, FILE *f
, unsigned *count
) {
507 _cleanup_free_
char *t
= NULL
;
514 r
= in_addr_to_string(s
->family
, &s
->address
, &t
);
516 log_warning("Invalid DNS address. Ignoring.");
521 fputs("# Too many DNS servers configured, the following entries may be ignored\n", f
);
523 fprintf(f
, "nameserver %s\n", t
);
527 int manager_write_resolv_conf(Manager
*m
) {
528 const char *path
= "/run/systemd/resolve/resolv.conf";
529 _cleanup_free_
char *temp_path
= NULL
;
530 _cleanup_fclose_
FILE *f
= NULL
;
539 r
= fopen_temporary(path
, &f
, &temp_path
);
543 fchmod(fileno(f
), 0644);
545 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
546 "# Third party programs must not access this file directly, but\n"
547 "# only through the symlink at /etc/resolv.conf. To manage\n"
548 "# resolv.conf(5) in a different way, replace the symlink by a\n"
549 "# static file or a different symlink.\n\n", f
);
551 HASHMAP_FOREACH(l
, m
->links
, i
)
552 LIST_FOREACH(servers
, s
, l
->dns_servers
)
553 write_resolve_conf_server(s
, f
, &count
);
555 LIST_FOREACH(servers
, s
, m
->dns_servers
)
556 write_resolve_conf_server(s
, f
, &count
);
558 r
= fflush_and_check(f
);
562 if (rename(temp_path
, path
) < 0) {
575 int manager_recv(Manager
*m
, int fd
, DnsProtocol protocol
, DnsPacket
**ret
) {
576 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
578 struct cmsghdr header
; /* For alignment */
579 uint8_t buffer
[CMSG_SPACE(MAX(sizeof(struct in_pktinfo
), sizeof(struct in6_pktinfo
)))
580 + CMSG_SPACE(int) /* ttl/hoplimit */
581 + EXTRA_CMSG_SPACE
/* kernel appears to require extra buffer space */];
583 union sockaddr_union sa
;
584 struct msghdr mh
= {};
585 struct cmsghdr
*cmsg
;
594 r
= ioctl(fd
, FIONREAD
, &ms
);
600 r
= dns_packet_new(&p
, protocol
, ms
);
604 iov
.iov_base
= DNS_PACKET_DATA(p
);
605 iov
.iov_len
= p
->allocated
;
607 mh
.msg_name
= &sa
.sa
;
608 mh
.msg_namelen
= sizeof(sa
);
611 mh
.msg_control
= &control
;
612 mh
.msg_controllen
= sizeof(control
);
614 l
= recvmsg(fd
, &mh
, 0);
616 if (errno
== EAGAIN
|| errno
== EINTR
)
625 assert(!(mh
.msg_flags
& MSG_CTRUNC
));
626 assert(!(mh
.msg_flags
& MSG_TRUNC
));
628 p
->size
= (size_t) l
;
630 p
->family
= sa
.sa
.sa_family
;
631 p
->ipproto
= IPPROTO_UDP
;
632 if (p
->family
== AF_INET
) {
633 p
->sender
.in
= sa
.in
.sin_addr
;
634 p
->sender_port
= be16toh(sa
.in
.sin_port
);
635 } else if (p
->family
== AF_INET6
) {
636 p
->sender
.in6
= sa
.in6
.sin6_addr
;
637 p
->sender_port
= be16toh(sa
.in6
.sin6_port
);
638 p
->ifindex
= sa
.in6
.sin6_scope_id
;
640 return -EAFNOSUPPORT
;
642 for (cmsg
= CMSG_FIRSTHDR(&mh
); cmsg
; cmsg
= CMSG_NXTHDR(&mh
, cmsg
)) {
644 if (cmsg
->cmsg_level
== IPPROTO_IPV6
) {
645 assert(p
->family
== AF_INET6
);
647 switch (cmsg
->cmsg_type
) {
650 struct in6_pktinfo
*i
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
653 p
->ifindex
= i
->ipi6_ifindex
;
655 p
->destination
.in6
= i
->ipi6_addr
;
660 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
664 } else if (cmsg
->cmsg_level
== IPPROTO_IP
) {
665 assert(p
->family
== AF_INET
);
667 switch (cmsg
->cmsg_type
) {
670 struct in_pktinfo
*i
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
673 p
->ifindex
= i
->ipi_ifindex
;
675 p
->destination
.in
= i
->ipi_addr
;
680 p
->ttl
= *(int *) CMSG_DATA(cmsg
);
686 /* The Linux kernel sets the interface index to the loopback
687 * device if the packet came from the local host since it
688 * avoids the routing table in such a case. Let's unset the
689 * interface index in such a case. */
690 if (p
->ifindex
> 0 && manager_ifindex_is_loopback(m
, p
->ifindex
) != 0)
693 /* If we don't know the interface index still, we look for the
694 * first local interface with a matching address. Yuck! */
696 p
->ifindex
= manager_find_ifindex(m
, p
->family
, &p
->destination
);
704 static int on_dns_packet(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
705 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
706 DnsQueryTransaction
*t
= NULL
;
707 Manager
*m
= userdata
;
710 r
= manager_recv(m
, fd
, DNS_PROTOCOL_DNS
, &p
);
714 if (dns_packet_validate_reply(p
) > 0) {
715 t
= hashmap_get(m
->dns_query_transactions
, UINT_TO_PTR(DNS_PACKET_ID(p
)));
719 dns_query_transaction_process_reply(t
, p
);
722 log_debug("Invalid DNS packet.");
727 int manager_dns_ipv4_fd(Manager
*m
) {
733 if (m
->dns_ipv4_fd
>= 0)
734 return m
->dns_ipv4_fd
;
736 m
->dns_ipv4_fd
= socket(AF_INET
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
737 if (m
->dns_ipv4_fd
< 0)
740 r
= setsockopt(m
->dns_ipv4_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
746 r
= sd_event_add_io(m
->event
, &m
->dns_ipv4_event_source
, m
->dns_ipv4_fd
, EPOLLIN
, on_dns_packet
, m
);
750 return m
->dns_ipv4_fd
;
753 m
->dns_ipv4_fd
= safe_close(m
->dns_ipv4_fd
);
757 int manager_dns_ipv6_fd(Manager
*m
) {
763 if (m
->dns_ipv6_fd
>= 0)
764 return m
->dns_ipv6_fd
;
766 m
->dns_ipv6_fd
= socket(AF_INET6
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
767 if (m
->dns_ipv6_fd
< 0)
770 r
= setsockopt(m
->dns_ipv6_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
776 r
= sd_event_add_io(m
->event
, &m
->dns_ipv6_event_source
, m
->dns_ipv6_fd
, EPOLLIN
, on_dns_packet
, m
);
780 return m
->dns_ipv6_fd
;
783 m
->dns_ipv6_fd
= safe_close(m
->dns_ipv6_fd
);
787 static int sendmsg_loop(int fd
, struct msghdr
*mh
, int flags
) {
794 if (sendmsg(fd
, mh
, flags
) >= 0)
803 r
= fd_wait_for_event(fd
, POLLOUT
, SEND_TIMEOUT_USEC
);
811 static int manager_ipv4_send(Manager
*m
, int fd
, int ifindex
, const struct in_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
812 union sockaddr_union sa
= {
813 .in
.sin_family
= AF_INET
,
816 struct cmsghdr header
; /* For alignment */
817 uint8_t buffer
[CMSG_SPACE(sizeof(struct in_pktinfo
))];
819 struct msghdr mh
= {};
828 iov
.iov_base
= DNS_PACKET_DATA(p
);
829 iov
.iov_len
= p
->size
;
831 sa
.in
.sin_addr
= *addr
;
832 sa
.in
.sin_port
= htobe16(port
),
836 mh
.msg_name
= &sa
.sa
;
837 mh
.msg_namelen
= sizeof(sa
.in
);
840 struct cmsghdr
*cmsg
;
841 struct in_pktinfo
*pi
;
845 mh
.msg_control
= &control
;
846 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in_pktinfo
));
848 cmsg
= CMSG_FIRSTHDR(&mh
);
849 cmsg
->cmsg_len
= mh
.msg_controllen
;
850 cmsg
->cmsg_level
= IPPROTO_IP
;
851 cmsg
->cmsg_type
= IP_PKTINFO
;
853 pi
= (struct in_pktinfo
*) CMSG_DATA(cmsg
);
854 pi
->ipi_ifindex
= ifindex
;
857 return sendmsg_loop(fd
, &mh
, 0);
860 static int manager_ipv6_send(Manager
*m
, int fd
, int ifindex
, const struct in6_addr
*addr
, uint16_t port
, DnsPacket
*p
) {
861 union sockaddr_union sa
= {
862 .in6
.sin6_family
= AF_INET6
,
865 struct cmsghdr header
; /* For alignment */
866 uint8_t buffer
[CMSG_SPACE(sizeof(struct in6_pktinfo
))];
868 struct msghdr mh
= {};
877 iov
.iov_base
= DNS_PACKET_DATA(p
);
878 iov
.iov_len
= p
->size
;
880 sa
.in6
.sin6_addr
= *addr
;
881 sa
.in6
.sin6_port
= htobe16(port
),
882 sa
.in6
.sin6_scope_id
= ifindex
;
886 mh
.msg_name
= &sa
.sa
;
887 mh
.msg_namelen
= sizeof(sa
.in6
);
890 struct cmsghdr
*cmsg
;
891 struct in6_pktinfo
*pi
;
895 mh
.msg_control
= &control
;
896 mh
.msg_controllen
= CMSG_LEN(sizeof(struct in6_pktinfo
));
898 cmsg
= CMSG_FIRSTHDR(&mh
);
899 cmsg
->cmsg_len
= mh
.msg_controllen
;
900 cmsg
->cmsg_level
= IPPROTO_IPV6
;
901 cmsg
->cmsg_type
= IPV6_PKTINFO
;
903 pi
= (struct in6_pktinfo
*) CMSG_DATA(cmsg
);
904 pi
->ipi6_ifindex
= ifindex
;
907 return sendmsg_loop(fd
, &mh
, 0);
910 int manager_send(Manager
*m
, int fd
, int ifindex
, int family
, const union in_addr_union
*addr
, uint16_t port
, DnsPacket
*p
) {
917 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
));
919 if (family
== AF_INET
)
920 return manager_ipv4_send(m
, fd
, ifindex
, &addr
->in
, port
, p
);
921 else if (family
== AF_INET6
)
922 return manager_ipv6_send(m
, fd
, ifindex
, &addr
->in6
, port
, p
);
924 return -EAFNOSUPPORT
;
927 DnsServer
* manager_find_dns_server(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
933 LIST_FOREACH(servers
, s
, m
->dns_servers
) {
935 if (s
->family
== family
&&
936 in_addr_equal(family
, &s
->address
, in_addr
))
943 DnsServer
*manager_get_dns_server(Manager
*m
) {
946 if (!m
->current_dns_server
)
947 m
->current_dns_server
= m
->dns_servers
;
949 return m
->current_dns_server
;
952 void manager_next_dns_server(Manager
*m
) {
955 if (!m
->current_dns_server
) {
956 m
->current_dns_server
= m
->dns_servers
;
960 if (!m
->current_dns_server
)
963 if (m
->current_dns_server
->servers_next
) {
964 m
->current_dns_server
= m
->current_dns_server
->servers_next
;
968 m
->current_dns_server
= m
->dns_servers
;
971 uint32_t manager_find_mtu(Manager
*m
) {
976 /* If we don't know on which link a DNS packet would be
977 * delivered, let's find the largest MTU that works on all
978 * interfaces we know of */
980 HASHMAP_FOREACH(l
, m
->links
, i
) {
984 if (mtu
<= 0 || l
->mtu
< mtu
)
991 static int on_llmnr_packet(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
992 _cleanup_(dns_packet_unrefp
) DnsPacket
*p
= NULL
;
993 DnsQueryTransaction
*t
= NULL
;
994 Manager
*m
= userdata
;
997 r
= manager_recv(m
, fd
, DNS_PROTOCOL_LLMNR
, &p
);
1001 if (dns_packet_validate_reply(p
) > 0) {
1002 log_debug("Got reply packet for id %u", DNS_PACKET_ID(p
));
1004 t
= hashmap_get(m
->dns_query_transactions
, UINT_TO_PTR(DNS_PACKET_ID(p
)));
1008 dns_query_transaction_process_reply(t
, p
);
1010 } else if (dns_packet_validate_query(p
) > 0) {
1013 l
= hashmap_get(m
->links
, INT_TO_PTR(p
->ifindex
));
1015 DnsScope
*scope
= NULL
;
1017 if (p
->family
== AF_INET
)
1018 scope
= l
->llmnr_ipv4_scope
;
1019 else if (p
->family
== AF_INET6
)
1020 scope
= l
->llmnr_ipv6_scope
;
1023 dns_scope_process_query(scope
, NULL
, p
);
1026 log_debug("Invalid LLMNR packet.");
1031 int manager_llmnr_ipv4_udp_fd(Manager
*m
) {
1032 union sockaddr_union sa
= {
1033 .in
.sin_family
= AF_INET
,
1034 .in
.sin_port
= htobe16(5355),
1036 static const int one
= 1, pmtu
= IP_PMTUDISC_DONT
, ttl
= 255;
1041 if (m
->llmnr_ipv4_udp_fd
>= 0)
1042 return m
->llmnr_ipv4_udp_fd
;
1044 m
->llmnr_ipv4_udp_fd
= socket(AF_INET
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1045 if (m
->llmnr_ipv4_udp_fd
< 0)
1048 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1049 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_TTL
, &ttl
, sizeof(ttl
));
1055 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MULTICAST_TTL
, &ttl
, sizeof(ttl
));
1061 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MULTICAST_LOOP
, &one
, sizeof(one
));
1067 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1073 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
1079 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_RECVTTL
, &one
, sizeof(one
));
1085 /* Disable Don't-Fragment bit in the IP header */
1086 r
= setsockopt(m
->llmnr_ipv4_udp_fd
, IPPROTO_IP
, IP_MTU_DISCOVER
, &pmtu
, sizeof(pmtu
));
1092 r
= bind(m
->llmnr_ipv4_udp_fd
, &sa
.sa
, sizeof(sa
.in
));
1098 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv4_udp_event_source
, m
->llmnr_ipv4_udp_fd
, EPOLLIN
, on_llmnr_packet
, m
);
1102 return m
->llmnr_ipv4_udp_fd
;
1105 m
->llmnr_ipv4_udp_fd
= safe_close(m
->llmnr_ipv4_udp_fd
);
1109 int manager_llmnr_ipv6_udp_fd(Manager
*m
) {
1110 union sockaddr_union sa
= {
1111 .in6
.sin6_family
= AF_INET6
,
1112 .in6
.sin6_port
= htobe16(5355),
1114 static const int one
= 1, ttl
= 255;
1119 if (m
->llmnr_ipv6_udp_fd
>= 0)
1120 return m
->llmnr_ipv6_udp_fd
;
1122 m
->llmnr_ipv6_udp_fd
= socket(AF_INET6
, SOCK_DGRAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1123 if (m
->llmnr_ipv6_udp_fd
< 0)
1126 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &ttl
, sizeof(ttl
));
1132 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1133 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_MULTICAST_HOPS
, &ttl
, sizeof(ttl
));
1139 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_MULTICAST_LOOP
, &one
, sizeof(one
));
1145 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_V6ONLY
, &one
, sizeof(one
));
1151 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1157 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
1163 r
= setsockopt(m
->llmnr_ipv6_udp_fd
, IPPROTO_IPV6
, IPV6_RECVHOPLIMIT
, &one
, sizeof(one
));
1169 r
= bind(m
->llmnr_ipv6_udp_fd
, &sa
.sa
, sizeof(sa
.in6
));
1175 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv6_udp_event_source
, m
->llmnr_ipv6_udp_fd
, EPOLLIN
, on_llmnr_packet
, m
);
1181 return m
->llmnr_ipv6_udp_fd
;
1184 m
->llmnr_ipv6_udp_fd
= safe_close(m
->llmnr_ipv6_udp_fd
);
1188 static int on_llmnr_stream_packet(DnsStream
*s
) {
1191 if (dns_packet_validate_query(s
->read_packet
) > 0) {
1194 l
= hashmap_get(s
->manager
->links
, INT_TO_PTR(s
->read_packet
->ifindex
));
1196 DnsScope
*scope
= NULL
;
1198 if (s
->read_packet
->family
== AF_INET
)
1199 scope
= l
->llmnr_ipv4_scope
;
1200 else if (s
->read_packet
->family
== AF_INET6
)
1201 scope
= l
->llmnr_ipv6_scope
;
1204 dns_scope_process_query(scope
, s
, s
->read_packet
);
1206 /* If no reply packet was set, we free the stream */
1207 if (s
->write_packet
)
1217 static int on_llmnr_stream(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
1219 Manager
*m
= userdata
;
1222 cfd
= accept4(fd
, NULL
, NULL
, SOCK_NONBLOCK
|SOCK_CLOEXEC
);
1224 if (errno
== EAGAIN
|| errno
== EINTR
)
1230 r
= dns_stream_new(m
, &stream
, DNS_PROTOCOL_LLMNR
, cfd
);
1236 stream
->on_packet
= on_llmnr_stream_packet
;
1240 int manager_llmnr_ipv4_tcp_fd(Manager
*m
) {
1241 union sockaddr_union sa
= {
1242 .in
.sin_family
= AF_INET
,
1243 .in
.sin_port
= htobe16(5355),
1245 static const int one
= 1, pmtu
= IP_PMTUDISC_DONT
;
1250 if (m
->llmnr_ipv4_tcp_fd
>= 0)
1251 return m
->llmnr_ipv4_tcp_fd
;
1253 m
->llmnr_ipv4_tcp_fd
= socket(AF_INET
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1254 if (m
->llmnr_ipv4_tcp_fd
< 0)
1257 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1258 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_TTL
, &one
, sizeof(one
));
1264 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1270 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_PKTINFO
, &one
, sizeof(one
));
1276 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_RECVTTL
, &one
, sizeof(one
));
1282 /* Disable Don't-Fragment bit in the IP header */
1283 r
= setsockopt(m
->llmnr_ipv4_tcp_fd
, IPPROTO_IP
, IP_MTU_DISCOVER
, &pmtu
, sizeof(pmtu
));
1289 r
= bind(m
->llmnr_ipv4_tcp_fd
, &sa
.sa
, sizeof(sa
.in
));
1295 r
= listen(m
->llmnr_ipv4_tcp_fd
, SOMAXCONN
);
1301 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv4_tcp_event_source
, m
->llmnr_ipv4_tcp_fd
, EPOLLIN
, on_llmnr_stream
, m
);
1305 return m
->llmnr_ipv4_tcp_fd
;
1308 m
->llmnr_ipv4_tcp_fd
= safe_close(m
->llmnr_ipv4_tcp_fd
);
1312 int manager_llmnr_ipv6_tcp_fd(Manager
*m
) {
1313 union sockaddr_union sa
= {
1314 .in6
.sin6_family
= AF_INET6
,
1315 .in6
.sin6_port
= htobe16(5355),
1317 static const int one
= 1;
1322 if (m
->llmnr_ipv6_tcp_fd
>= 0)
1323 return m
->llmnr_ipv6_tcp_fd
;
1325 m
->llmnr_ipv6_tcp_fd
= socket(AF_INET6
, SOCK_STREAM
|SOCK_CLOEXEC
|SOCK_NONBLOCK
, 0);
1326 if (m
->llmnr_ipv6_tcp_fd
< 0)
1329 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1330 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_UNICAST_HOPS
, &one
, sizeof(one
));
1336 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_V6ONLY
, &one
, sizeof(one
));
1342 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
1348 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_RECVPKTINFO
, &one
, sizeof(one
));
1354 r
= setsockopt(m
->llmnr_ipv6_tcp_fd
, IPPROTO_IPV6
, IPV6_RECVHOPLIMIT
, &one
, sizeof(one
));
1360 r
= bind(m
->llmnr_ipv6_tcp_fd
, &sa
.sa
, sizeof(sa
.in6
));
1366 r
= listen(m
->llmnr_ipv6_tcp_fd
, SOMAXCONN
);
1372 r
= sd_event_add_io(m
->event
, &m
->llmnr_ipv6_tcp_event_source
, m
->llmnr_ipv6_tcp_fd
, EPOLLIN
, on_llmnr_stream
, m
);
1378 return m
->llmnr_ipv6_tcp_fd
;
1381 m
->llmnr_ipv6_tcp_fd
= safe_close(m
->llmnr_ipv6_tcp_fd
);
1385 int manager_ifindex_is_loopback(Manager
*m
, int ifindex
) {
1392 l
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
1393 if (l
->flags
& IFF_LOOPBACK
)
1399 int manager_find_ifindex(Manager
*m
, int family
, const union in_addr_union
*in_addr
) {
1405 HASHMAP_FOREACH(l
, m
->links
, i
)
1406 if (link_find_address(l
, family
, in_addr
))