]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/resolve/resolved-manager.c
resolved: flush cache each time we change to a different DNS server
[thirdparty/systemd.git] / src / resolve / resolved-manager.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2014 Tom Gundersen <teg@jklm.no>
7
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.
12
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.
17
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/>.
20 ***/
21
22 #include <arpa/inet.h>
23 #include <resolv.h>
24 #include <net/if.h>
25 #include <sys/ioctl.h>
26 #include <sys/poll.h>
27 #include <netinet/in.h>
28
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"
35 #include "af-list.h"
36 #include "utf8.h"
37
38 #include "resolved-dns-domain.h"
39 #include "resolved-conf.h"
40 #include "resolved-bus.h"
41 #include "resolved-manager.h"
42
43 #define SEND_TIMEOUT_USEC (200 * USEC_PER_MSEC)
44
45 static int manager_process_link(sd_rtnl *rtnl, sd_rtnl_message *mm, void *userdata) {
46 Manager *m = userdata;
47 uint16_t type;
48 Link *l;
49 int ifindex, r;
50
51 assert(rtnl);
52 assert(m);
53 assert(mm);
54
55 r = sd_rtnl_message_get_type(mm, &type);
56 if (r < 0)
57 goto fail;
58
59 r = sd_rtnl_message_link_get_ifindex(mm, &ifindex);
60 if (r < 0)
61 goto fail;
62
63 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
64
65 switch (type) {
66
67 case RTM_NEWLINK:{
68 bool is_new = !l;
69
70 if (!l) {
71 r = link_new(m, &l, ifindex);
72 if (r < 0)
73 goto fail;
74 }
75
76 r = link_update_rtnl(l, mm);
77 if (r < 0)
78 goto fail;
79
80 if (is_new)
81 log_debug("Found new link %i/%s", ifindex, l->name);
82
83 break;
84 }
85
86 case RTM_DELLINK:
87 if (l) {
88 log_debug("Removing link %i/%s", l->ifindex, l->name);
89 link_free(l);
90 }
91
92 break;
93 }
94
95 return 0;
96
97 fail:
98 log_warning("Failed to process RTNL link message: %s", strerror(-r));
99 return 0;
100 }
101
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;
105 uint16_t type;
106 int r, ifindex, family;
107 LinkAddress *a;
108 Link *l;
109
110 assert(rtnl);
111 assert(mm);
112 assert(m);
113
114 r = sd_rtnl_message_get_type(mm, &type);
115 if (r < 0)
116 goto fail;
117
118 r = sd_rtnl_message_addr_get_ifindex(mm, &ifindex);
119 if (r < 0)
120 goto fail;
121
122 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
123 if (!l)
124 return 0;
125
126 r = sd_rtnl_message_addr_get_family(mm, &family);
127 if (r < 0)
128 goto fail;
129
130 switch (family) {
131
132 case AF_INET:
133 r = sd_rtnl_message_read_in_addr(mm, IFA_LOCAL, &address.in);
134 if (r < 0) {
135 r = sd_rtnl_message_read_in_addr(mm, IFA_ADDRESS, &address.in);
136 if (r < 0)
137 goto fail;
138 }
139
140 break;
141
142 case AF_INET6:
143 r = sd_rtnl_message_read_in6_addr(mm, IFA_LOCAL, &address.in6);
144 if (r < 0) {
145 r = sd_rtnl_message_read_in6_addr(mm, IFA_ADDRESS, &address.in6);
146 if (r < 0)
147 goto fail;
148 }
149
150 break;
151
152 default:
153 return 0;
154 }
155
156 a = link_find_address(l, family, &address);
157
158 switch (type) {
159
160 case RTM_NEWADDR:
161
162 if (!a) {
163 r = link_address_new(l, &a, family, &address);
164 if (r < 0)
165 return r;
166 }
167
168 r = link_address_update_rtnl(a, mm);
169 if (r < 0)
170 return r;
171
172 break;
173
174 case RTM_DELADDR:
175 if (a)
176 link_address_free(a);
177 break;
178 }
179
180 return 0;
181
182 fail:
183 log_warning("Failed to process RTNL address message: %s", strerror(-r));
184 return 0;
185 }
186
187 static int manager_rtnl_listen(Manager *m) {
188 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL;
189 sd_rtnl_message *i;
190 int r;
191
192 assert(m);
193
194 /* First, subscibe to interfaces coming and going */
195 r = sd_rtnl_open(&m->rtnl, 3, RTNLGRP_LINK, RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV6_IFADDR);
196 if (r < 0)
197 return r;
198
199 r = sd_rtnl_attach_event(m->rtnl, m->event, 0);
200 if (r < 0)
201 return r;
202
203 r = sd_rtnl_add_match(m->rtnl, RTM_NEWLINK, manager_process_link, m);
204 if (r < 0)
205 return r;
206
207 r = sd_rtnl_add_match(m->rtnl, RTM_DELLINK, manager_process_link, m);
208 if (r < 0)
209 return r;
210
211 r = sd_rtnl_add_match(m->rtnl, RTM_NEWADDR, manager_process_address, m);
212 if (r < 0)
213 return r;
214
215 r = sd_rtnl_add_match(m->rtnl, RTM_DELADDR, manager_process_address, m);
216 if (r < 0)
217 return r;
218
219 /* Then, enumerate all links */
220 r = sd_rtnl_message_new_link(m->rtnl, &req, RTM_GETLINK, 0);
221 if (r < 0)
222 return r;
223
224 r = sd_rtnl_message_request_dump(req, true);
225 if (r < 0)
226 return r;
227
228 r = sd_rtnl_call(m->rtnl, req, 0, &reply);
229 if (r < 0)
230 return r;
231
232 for (i = reply; i; i = sd_rtnl_message_next(i)) {
233 r = manager_process_link(m->rtnl, i, m);
234 if (r < 0)
235 return r;
236 }
237
238 req = sd_rtnl_message_unref(req);
239 reply = sd_rtnl_message_unref(reply);
240
241 /* Finally, enumerate all addresses, too */
242 r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, 0, AF_UNSPEC);
243 if (r < 0)
244 return r;
245
246 r = sd_rtnl_message_request_dump(req, true);
247 if (r < 0)
248 return r;
249
250 r = sd_rtnl_call(m->rtnl, req, 0, &reply);
251 if (r < 0)
252 return r;
253
254 for (i = reply; i; i = sd_rtnl_message_next(i)) {
255 r = manager_process_address(m->rtnl, i, m);
256 if (r < 0)
257 return r;
258 }
259
260 return r;
261 }
262
263 static int on_network_event(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
264 Manager *m = userdata;
265 Iterator i;
266 Link *l;
267 int r;
268
269 assert(m);
270
271 sd_network_monitor_flush(m->network_monitor);
272
273 HASHMAP_FOREACH(l, m->links, i) {
274 r = link_update_monitor(l);
275 if (r < 0)
276 log_warning("Failed to update monitor information for %i: %s", l->ifindex, strerror(-r));
277 }
278
279 r = manager_write_resolv_conf(m);
280 if (r < 0)
281 log_warning("Could not update resolv.conf: %s", strerror(-r));
282
283 return 0;
284 }
285
286 static int manager_network_monitor_listen(Manager *m) {
287 int r, fd, events;
288
289 assert(m);
290
291 r = sd_network_monitor_new(&m->network_monitor, NULL);
292 if (r < 0)
293 return r;
294
295 fd = sd_network_monitor_get_fd(m->network_monitor);
296 if (fd < 0)
297 return fd;
298
299 events = sd_network_monitor_get_events(m->network_monitor);
300 if (events < 0)
301 return events;
302
303 r = sd_event_add_io(m->event, &m->network_event_source, fd, events, &on_network_event, m);
304 if (r < 0)
305 return r;
306
307 return 0;
308 }
309
310 static int determine_hostname(char **ret) {
311 _cleanup_free_ char *h = NULL, *n = NULL;
312 int r;
313
314 assert(ret);
315
316 h = gethostname_malloc();
317 if (!h)
318 return log_oom();
319
320 if (!utf8_is_valid(h)) {
321 log_error("System hostname is not UTF-8 clean.");
322 return -EINVAL;
323 }
324
325 r = dns_name_normalize(h, &n);
326 if (r < 0) {
327 log_error("System hostname '%s' cannot be normalized.", h);
328 return r;
329 }
330
331 *ret = n;
332 n = NULL;
333
334 return 0;
335 }
336
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;
340 int r;
341
342 assert(m);
343
344 r = determine_hostname(&h);
345 if (r < 0)
346 return 0; /* ignore invalid hostnames */
347
348 if (streq(h, m->hostname))
349 return 0;
350
351 log_info("System hostname changed to '%s'.", h);
352 free(m->hostname);
353 m->hostname = h;
354 h = NULL;
355
356 manager_refresh_rrs(m);
357
358 return 0;
359 }
360
361 static int manager_watch_hostname(Manager *m) {
362 _cleanup_free_ char *h = NULL;
363 int r;
364
365 assert(m);
366
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");
370 return 0;
371 }
372
373 r = sd_event_add_io(m->event, &m->hostname_event_source, m->hostname_fd, 0, on_hostname_change, m);
374 if (r < 0) {
375 if (r == -EPERM)
376 /* kernels prior to 3.2 don't support polling this file. Ignore the failure. */
377 m->hostname_fd = safe_close(m->hostname_fd);
378 else {
379 log_error("Failed to add hostname event source: %s", strerror(-r));
380 return r;
381 }
382 }
383
384 r = determine_hostname(&m->hostname);
385 if (r < 0) {
386 log_info("Defaulting to hostname 'linux'.");
387 m->hostname = strdup("linux");
388 if (!m->hostname)
389 return log_oom();
390 } else
391 log_info("Using system hostname '%s'.", m->hostname);
392
393 return 0;
394 }
395
396 int manager_new(Manager **ret) {
397 _cleanup_(manager_freep) Manager *m = NULL;
398 int r;
399
400 assert(ret);
401
402 m = new0(Manager, 1);
403 if (!m)
404 return -ENOMEM;
405
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;
409 m->hostname_fd = -1;
410
411 m->llmnr_support = SUPPORT_YES;
412 m->read_resolv_conf = true;
413
414 r = manager_parse_dns_server(m, DNS_SERVER_FALLBACK, DNS_SERVERS);
415 if (r < 0)
416 return r;
417
418 r = sd_event_default(&m->event);
419 if (r < 0)
420 return r;
421
422 sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
423 sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
424
425 sd_event_set_watchdog(m->event, true);
426
427 r = manager_watch_hostname(m);
428 if (r < 0)
429 return r;
430
431 r = dns_scope_new(m, &m->unicast_scope, NULL, DNS_PROTOCOL_DNS, AF_UNSPEC);
432 if (r < 0)
433 return r;
434
435 r = manager_network_monitor_listen(m);
436 if (r < 0)
437 return r;
438
439 r = manager_rtnl_listen(m);
440 if (r < 0)
441 return r;
442
443 r = manager_connect_bus(m);
444 if (r < 0)
445 return r;
446
447 r = manager_llmnr_ipv4_udp_fd(m);
448 if (r < 0)
449 return r;
450 r = manager_llmnr_ipv6_udp_fd(m);
451 if (r < 0)
452 return r;
453 r = manager_llmnr_ipv4_tcp_fd(m);
454 if (r < 0)
455 return r;
456 r = manager_llmnr_ipv6_tcp_fd(m);
457 if (r < 0)
458 return r;
459
460 *ret = m;
461 m = NULL;
462
463 return 0;
464 }
465
466 Manager *manager_free(Manager *m) {
467 Link *l;
468
469 if (!m)
470 return NULL;
471
472 while (m->dns_queries)
473 dns_query_free(m->dns_queries);
474
475 hashmap_free(m->dns_transactions);
476
477 while ((l = hashmap_first(m->links)))
478 link_free(l);
479 hashmap_free(m->links);
480
481 dns_scope_free(m->unicast_scope);
482
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);
487
488 sd_event_source_unref(m->network_event_source);
489 sd_network_monitor_unref(m->network_monitor);
490
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);
495
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);
500
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);
505
506 sd_event_source_unref(m->bus_retry_event_source);
507 sd_bus_unref(m->bus);
508
509 sd_event_unref(m->event);
510
511 dns_resource_key_unref(m->host_ipv4_key);
512 dns_resource_key_unref(m->host_ipv6_key);
513
514 safe_close(m->hostname_fd);
515 sd_event_source_unref(m->hostname_event_source);
516 free(m->hostname);
517
518 free(m);
519
520 return NULL;
521 }
522
523 int manager_read_resolv_conf(Manager *m) {
524 _cleanup_fclose_ FILE *f = NULL;
525 struct stat st, own;
526 char line[LINE_MAX];
527 DnsServer *s, *nx;
528 usec_t t;
529 int r;
530
531 assert(m);
532
533 /* Reads the system /etc/resolv.conf, if it exists and is not
534 * symlinked to our own resolv.conf instance */
535
536 if (!m->read_resolv_conf)
537 return 0;
538
539 r = stat("/etc/resolv.conf", &st);
540 if (r < 0) {
541 if (errno != ENOENT)
542 log_warning("Failed to open /etc/resolv.conf: %m");
543 r = -errno;
544 goto clear;
545 }
546
547 /* Have we already seen the file? */
548 t = timespec_load(&st.st_mtim);
549 if (t == m->resolv_conf_mtime)
550 return 0;
551
552 m->resolv_conf_mtime = t;
553
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) {
558 r = 0;
559 goto clear;
560 }
561
562 f = fopen("/etc/resolv.conf", "re");
563 if (!f) {
564 if (errno != ENOENT)
565 log_warning("Failed to open /etc/resolv.conf: %m");
566 r = -errno;
567 goto clear;
568 }
569
570 if (fstat(fileno(f), &st) < 0) {
571 log_error("Failed to stat open file: %m");
572 r = -errno;
573 goto clear;
574 }
575
576 LIST_FOREACH(servers, s, m->dns_servers)
577 s->marked = true;
578
579 FOREACH_LINE(line, f, r = -errno; goto clear) {
580 union in_addr_union address;
581 int family;
582 char *l;
583 const char *a;
584
585 truncate_nl(line);
586
587 l = strstrip(line);
588 if (*l == '#' || *l == ';')
589 continue;
590
591 a = first_word(l, "nameserver");
592 if (!a)
593 continue;
594
595 r = in_addr_from_string_auto(a, &family, &address);
596 if (r < 0) {
597 log_warning("Failed to parse name server %s.", a);
598 continue;
599 }
600
601 LIST_FOREACH(servers, s, m->dns_servers)
602 if (s->family == family && in_addr_equal(family, &s->address, &address) > 0)
603 break;
604
605 if (s)
606 s->marked = false;
607 else {
608 r = dns_server_new(m, NULL, DNS_SERVER_SYSTEM, NULL, family, &address);
609 if (r < 0)
610 goto clear;
611 }
612 }
613
614 LIST_FOREACH_SAFE(servers, s, nx, m->dns_servers)
615 if (s->marked)
616 dns_server_free(s);
617
618 return 0;
619
620 clear:
621 while (m->dns_servers)
622 dns_server_free(m->dns_servers);
623
624 return r;
625 }
626
627 static void write_resolve_conf_server(DnsServer *s, FILE *f, unsigned *count) {
628 _cleanup_free_ char *t = NULL;
629 int r;
630
631 assert(s);
632 assert(f);
633 assert(count);
634
635 r = in_addr_to_string(s->family, &s->address, &t);
636 if (r < 0) {
637 log_warning("Invalid DNS address. Ignoring: %s", strerror(-r));
638 return;
639 }
640
641 if (*count == MAXNS)
642 fputs("# Too many DNS servers configured, the following entries may be ignored\n", f);
643
644 fprintf(f, "nameserver %s\n", t);
645 (*count) ++;
646 }
647
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;
652 unsigned count = 0;
653 DnsServer *s;
654 Iterator i;
655 Link *l;
656 int r;
657
658 assert(m);
659
660 /* Read the system /etc/resolv.conf first */
661 manager_read_resolv_conf(m);
662
663 r = fopen_temporary(path, &f, &temp_path);
664 if (r < 0)
665 return r;
666
667 fchmod(fileno(f), 0644);
668
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);
674
675 LIST_FOREACH(servers, s, m->dns_servers)
676 write_resolve_conf_server(s, f, &count);
677
678 HASHMAP_FOREACH(l, m->links, i)
679 LIST_FOREACH(servers, s, l->dns_servers)
680 write_resolve_conf_server(s, f, &count);
681
682 if (count == 0) {
683 LIST_FOREACH(servers, s, m->fallback_dns_servers)
684 write_resolve_conf_server(s, f, &count);
685 }
686
687 r = fflush_and_check(f);
688 if (r < 0)
689 goto fail;
690
691 if (rename(temp_path, path) < 0) {
692 r = -errno;
693 goto fail;
694 }
695
696 return 0;
697
698 fail:
699 unlink(path);
700 unlink(temp_path);
701 return r;
702 }
703
704 int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) {
705 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
706 union {
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 */];
711 } control;
712 union sockaddr_union sa;
713 struct msghdr mh = {};
714 struct cmsghdr *cmsg;
715 struct iovec iov;
716 int ms = 0, r;
717 ssize_t l;
718
719 assert(m);
720 assert(fd >= 0);
721 assert(ret);
722
723 r = ioctl(fd, FIONREAD, &ms);
724 if (r < 0)
725 return -errno;
726 if (ms < 0)
727 return -EIO;
728
729 r = dns_packet_new(&p, protocol, ms);
730 if (r < 0)
731 return r;
732
733 iov.iov_base = DNS_PACKET_DATA(p);
734 iov.iov_len = p->allocated;
735
736 mh.msg_name = &sa.sa;
737 mh.msg_namelen = sizeof(sa);
738 mh.msg_iov = &iov;
739 mh.msg_iovlen = 1;
740 mh.msg_control = &control;
741 mh.msg_controllen = sizeof(control);
742
743 l = recvmsg(fd, &mh, 0);
744 if (l < 0) {
745 if (errno == EAGAIN || errno == EINTR)
746 return 0;
747
748 return -errno;
749 }
750
751 if (l <= 0)
752 return -EIO;
753
754 assert(!(mh.msg_flags & MSG_CTRUNC));
755 assert(!(mh.msg_flags & MSG_TRUNC));
756
757 p->size = (size_t) l;
758
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;
768 } else
769 return -EAFNOSUPPORT;
770
771 for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
772
773 if (cmsg->cmsg_level == IPPROTO_IPV6) {
774 assert(p->family == AF_INET6);
775
776 switch (cmsg->cmsg_type) {
777
778 case IPV6_PKTINFO: {
779 struct in6_pktinfo *i = (struct in6_pktinfo*) CMSG_DATA(cmsg);
780
781 if (p->ifindex <= 0)
782 p->ifindex = i->ipi6_ifindex;
783
784 p->destination.in6 = i->ipi6_addr;
785 break;
786 }
787
788 case IPV6_HOPLIMIT:
789 p->ttl = *(int *) CMSG_DATA(cmsg);
790 break;
791
792 }
793 } else if (cmsg->cmsg_level == IPPROTO_IP) {
794 assert(p->family == AF_INET);
795
796 switch (cmsg->cmsg_type) {
797
798 case IP_PKTINFO: {
799 struct in_pktinfo *i = (struct in_pktinfo*) CMSG_DATA(cmsg);
800
801 if (p->ifindex <= 0)
802 p->ifindex = i->ipi_ifindex;
803
804 p->destination.in = i->ipi_addr;
805 break;
806 }
807
808 case IP_TTL:
809 p->ttl = *(int *) CMSG_DATA(cmsg);
810 break;
811 }
812 }
813 }
814
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)
820 p->ifindex = 0;
821
822 /* If we don't know the interface index still, we look for the
823 * first local interface with a matching address. Yuck! */
824 if (p->ifindex <= 0)
825 p->ifindex = manager_find_ifindex(m, p->family, &p->destination);
826
827 *ret = p;
828 p = NULL;
829
830 return 1;
831 }
832
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;
837 int r;
838
839 r = manager_recv(m, fd, DNS_PROTOCOL_DNS, &p);
840 if (r <= 0)
841 return r;
842
843 if (dns_packet_validate_reply(p) > 0) {
844 t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
845 if (!t)
846 return 0;
847
848 dns_transaction_process_reply(t, p);
849
850 } else
851 log_debug("Invalid DNS packet.");
852
853 return 0;
854 }
855
856 int manager_dns_ipv4_fd(Manager *m) {
857 const int one = 1;
858 int r;
859
860 assert(m);
861
862 if (m->dns_ipv4_fd >= 0)
863 return m->dns_ipv4_fd;
864
865 m->dns_ipv4_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
866 if (m->dns_ipv4_fd < 0)
867 return -errno;
868
869 r = setsockopt(m->dns_ipv4_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
870 if (r < 0) {
871 r = -errno;
872 goto fail;
873 }
874
875 r = sd_event_add_io(m->event, &m->dns_ipv4_event_source, m->dns_ipv4_fd, EPOLLIN, on_dns_packet, m);
876 if (r < 0)
877 goto fail;
878
879 return m->dns_ipv4_fd;
880
881 fail:
882 m->dns_ipv4_fd = safe_close(m->dns_ipv4_fd);
883 return r;
884 }
885
886 int manager_dns_ipv6_fd(Manager *m) {
887 const int one = 1;
888 int r;
889
890 assert(m);
891
892 if (m->dns_ipv6_fd >= 0)
893 return m->dns_ipv6_fd;
894
895 m->dns_ipv6_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
896 if (m->dns_ipv6_fd < 0)
897 return -errno;
898
899 r = setsockopt(m->dns_ipv6_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
900 if (r < 0) {
901 r = -errno;
902 goto fail;
903 }
904
905 r = sd_event_add_io(m->event, &m->dns_ipv6_event_source, m->dns_ipv6_fd, EPOLLIN, on_dns_packet, m);
906 if (r < 0)
907 goto fail;
908
909 return m->dns_ipv6_fd;
910
911 fail:
912 m->dns_ipv6_fd = safe_close(m->dns_ipv6_fd);
913 return r;
914 }
915
916 static int sendmsg_loop(int fd, struct msghdr *mh, int flags) {
917 int r;
918
919 assert(fd >= 0);
920 assert(mh);
921
922 for (;;) {
923 if (sendmsg(fd, mh, flags) >= 0)
924 return 0;
925
926 if (errno == EINTR)
927 continue;
928
929 if (errno != EAGAIN)
930 return -errno;
931
932 r = fd_wait_for_event(fd, POLLOUT, SEND_TIMEOUT_USEC);
933 if (r < 0)
934 return r;
935 if (r == 0)
936 return -ETIMEDOUT;
937 }
938 }
939
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,
943 };
944 union {
945 struct cmsghdr header; /* For alignment */
946 uint8_t buffer[CMSG_SPACE(sizeof(struct in_pktinfo))];
947 } control;
948 struct msghdr mh = {};
949 struct iovec iov;
950
951 assert(m);
952 assert(fd >= 0);
953 assert(addr);
954 assert(port > 0);
955 assert(p);
956
957 iov.iov_base = DNS_PACKET_DATA(p);
958 iov.iov_len = p->size;
959
960 sa.in.sin_addr = *addr;
961 sa.in.sin_port = htobe16(port),
962
963 mh.msg_iov = &iov;
964 mh.msg_iovlen = 1;
965 mh.msg_name = &sa.sa;
966 mh.msg_namelen = sizeof(sa.in);
967
968 if (ifindex > 0) {
969 struct cmsghdr *cmsg;
970 struct in_pktinfo *pi;
971
972 zero(control);
973
974 mh.msg_control = &control;
975 mh.msg_controllen = CMSG_LEN(sizeof(struct in_pktinfo));
976
977 cmsg = CMSG_FIRSTHDR(&mh);
978 cmsg->cmsg_len = mh.msg_controllen;
979 cmsg->cmsg_level = IPPROTO_IP;
980 cmsg->cmsg_type = IP_PKTINFO;
981
982 pi = (struct in_pktinfo*) CMSG_DATA(cmsg);
983 pi->ipi_ifindex = ifindex;
984 }
985
986 return sendmsg_loop(fd, &mh, 0);
987 }
988
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,
992 };
993 union {
994 struct cmsghdr header; /* For alignment */
995 uint8_t buffer[CMSG_SPACE(sizeof(struct in6_pktinfo))];
996 } control;
997 struct msghdr mh = {};
998 struct iovec iov;
999
1000 assert(m);
1001 assert(fd >= 0);
1002 assert(addr);
1003 assert(port > 0);
1004 assert(p);
1005
1006 iov.iov_base = DNS_PACKET_DATA(p);
1007 iov.iov_len = p->size;
1008
1009 sa.in6.sin6_addr = *addr;
1010 sa.in6.sin6_port = htobe16(port),
1011 sa.in6.sin6_scope_id = ifindex;
1012
1013 mh.msg_iov = &iov;
1014 mh.msg_iovlen = 1;
1015 mh.msg_name = &sa.sa;
1016 mh.msg_namelen = sizeof(sa.in6);
1017
1018 if (ifindex > 0) {
1019 struct cmsghdr *cmsg;
1020 struct in6_pktinfo *pi;
1021
1022 zero(control);
1023
1024 mh.msg_control = &control;
1025 mh.msg_controllen = CMSG_LEN(sizeof(struct in6_pktinfo));
1026
1027 cmsg = CMSG_FIRSTHDR(&mh);
1028 cmsg->cmsg_len = mh.msg_controllen;
1029 cmsg->cmsg_level = IPPROTO_IPV6;
1030 cmsg->cmsg_type = IPV6_PKTINFO;
1031
1032 pi = (struct in6_pktinfo*) CMSG_DATA(cmsg);
1033 pi->ipi6_ifindex = ifindex;
1034 }
1035
1036 return sendmsg_loop(fd, &mh, 0);
1037 }
1038
1039 int manager_send(Manager *m, int fd, int ifindex, int family, const union in_addr_union *addr, uint16_t port, DnsPacket *p) {
1040 assert(m);
1041 assert(fd >= 0);
1042 assert(addr);
1043 assert(port > 0);
1044 assert(p);
1045
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));
1047
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);
1052
1053 return -EAFNOSUPPORT;
1054 }
1055
1056 DnsServer* manager_find_dns_server(Manager *m, int family, const union in_addr_union *in_addr) {
1057 DnsServer *s;
1058
1059 assert(m);
1060 assert(in_addr);
1061
1062 LIST_FOREACH(servers, s, m->dns_servers)
1063 if (s->family == family && in_addr_equal(family, &s->address, in_addr) > 0)
1064 return s;
1065
1066 LIST_FOREACH(servers, s, m->fallback_dns_servers)
1067 if (s->family == family && in_addr_equal(family, &s->address, in_addr) > 0)
1068 return s;
1069
1070 return NULL;
1071 }
1072
1073 DnsServer *manager_set_dns_server(Manager *m, DnsServer *s) {
1074 assert(m);
1075
1076 if (m->current_dns_server == s)
1077 return s;
1078
1079 if (s) {
1080 _cleanup_free_ char *ip = NULL;
1081
1082 in_addr_to_string(s->family, &s->address, &ip);
1083 log_info("Switching to system DNS server %s.", strna(ip));
1084 }
1085
1086 m->current_dns_server = s;
1087
1088 if (m->unicast_scope)
1089 dns_cache_flush(&m->unicast_scope->cache);
1090
1091 return s;
1092 }
1093
1094 DnsServer *manager_get_dns_server(Manager *m) {
1095 Link *l;
1096 assert(m);
1097
1098 /* Try to read updates resolv.conf */
1099 manager_read_resolv_conf(m);
1100
1101 if (!m->current_dns_server)
1102 manager_set_dns_server(m, m->dns_servers);
1103
1104 if (!m->current_dns_server) {
1105 bool found = false;
1106 Iterator i;
1107
1108 /* No DNS servers configured, let's see if there are
1109 * any on any links. If not, we use the fallback
1110 * servers */
1111
1112 HASHMAP_FOREACH(l, m->links, i)
1113 if (l->dns_servers) {
1114 found = true;
1115 break;
1116 }
1117
1118 if (!found)
1119 manager_set_dns_server(m, m->fallback_dns_servers);
1120 }
1121
1122 return m->current_dns_server;
1123 }
1124
1125 void manager_next_dns_server(Manager *m) {
1126 assert(m);
1127
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)
1131 return;
1132
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);
1136 return;
1137 }
1138
1139 /* If there was no next one, then start from the beginning of
1140 * the list */
1141 if (m->current_dns_server->type == DNS_SERVER_FALLBACK)
1142 manager_set_dns_server(m, m->fallback_dns_servers);
1143 else
1144 manager_set_dns_server(m, m->dns_servers);
1145 }
1146
1147 uint32_t manager_find_mtu(Manager *m) {
1148 uint32_t mtu = 0;
1149 Link *l;
1150 Iterator i;
1151
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 */
1155
1156 HASHMAP_FOREACH(l, m->links, i) {
1157 if (l->mtu <= 0)
1158 continue;
1159
1160 if (mtu <= 0 || l->mtu < mtu)
1161 mtu = l->mtu;
1162 }
1163
1164 return mtu;
1165 }
1166
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;
1171 int r;
1172
1173 r = manager_recv(m, fd, DNS_PROTOCOL_LLMNR, &p);
1174 if (r <= 0)
1175 return r;
1176
1177 if (dns_packet_validate_reply(p) > 0) {
1178 log_debug("Got reply packet for id %u", DNS_PACKET_ID(p));
1179
1180 t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
1181 if (!t)
1182 return 0;
1183
1184 dns_transaction_process_reply(t, p);
1185
1186 } else if (dns_packet_validate_query(p) > 0) {
1187 Link *l;
1188
1189 l = hashmap_get(m->links, INT_TO_PTR(p->ifindex));
1190 if (l) {
1191 DnsScope *scope = NULL;
1192
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;
1197
1198 if (scope)
1199 dns_scope_process_query(scope, NULL, p);
1200 }
1201 } else
1202 log_debug("Invalid LLMNR packet.");
1203
1204 return 0;
1205 }
1206
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),
1211 };
1212 static const int one = 1, pmtu = IP_PMTUDISC_DONT, ttl = 255;
1213 int r;
1214
1215 assert(m);
1216
1217 if (m->llmnr_ipv4_udp_fd >= 0)
1218 return m->llmnr_ipv4_udp_fd;
1219
1220 m->llmnr_ipv4_udp_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1221 if (m->llmnr_ipv4_udp_fd < 0)
1222 return -errno;
1223
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));
1226 if (r < 0) {
1227 r = -errno;
1228 goto fail;
1229 }
1230
1231 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
1232 if (r < 0) {
1233 r = -errno;
1234 goto fail;
1235 }
1236
1237 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof(one));
1238 if (r < 0) {
1239 r = -errno;
1240 goto fail;
1241 }
1242
1243 r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1244 if (r < 0) {
1245 r = -errno;
1246 goto fail;
1247 }
1248
1249 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1250 if (r < 0) {
1251 r = -errno;
1252 goto fail;
1253 }
1254
1255 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1256 if (r < 0) {
1257 r = -errno;
1258 goto fail;
1259 }
1260
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));
1263 if (r < 0) {
1264 r = -errno;
1265 goto fail;
1266 }
1267
1268 r = bind(m->llmnr_ipv4_udp_fd, &sa.sa, sizeof(sa.in));
1269 if (r < 0) {
1270 r = -errno;
1271 goto fail;
1272 }
1273
1274 r = sd_event_add_io(m->event, &m->llmnr_ipv4_udp_event_source, m->llmnr_ipv4_udp_fd, EPOLLIN, on_llmnr_packet, m);
1275 if (r < 0)
1276 goto fail;
1277
1278 return m->llmnr_ipv4_udp_fd;
1279
1280 fail:
1281 m->llmnr_ipv4_udp_fd = safe_close(m->llmnr_ipv4_udp_fd);
1282 return r;
1283 }
1284
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),
1289 };
1290 static const int one = 1, ttl = 255;
1291 int r;
1292
1293 assert(m);
1294
1295 if (m->llmnr_ipv6_udp_fd >= 0)
1296 return m->llmnr_ipv6_udp_fd;
1297
1298 m->llmnr_ipv6_udp_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1299 if (m->llmnr_ipv6_udp_fd < 0)
1300 return -errno;
1301
1302 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl));
1303 if (r < 0) {
1304 r = -errno;
1305 goto fail;
1306 }
1307
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));
1310 if (r < 0) {
1311 r = -errno;
1312 goto fail;
1313 }
1314
1315 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof(one));
1316 if (r < 0) {
1317 r = -errno;
1318 goto fail;
1319 }
1320
1321 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1322 if (r < 0) {
1323 r = -errno;
1324 goto fail;
1325 }
1326
1327 r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1328 if (r < 0) {
1329 r = -errno;
1330 goto fail;
1331 }
1332
1333 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1334 if (r < 0) {
1335 r = -errno;
1336 goto fail;
1337 }
1338
1339 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1340 if (r < 0) {
1341 r = -errno;
1342 goto fail;
1343 }
1344
1345 r = bind(m->llmnr_ipv6_udp_fd, &sa.sa, sizeof(sa.in6));
1346 if (r < 0) {
1347 r = -errno;
1348 goto fail;
1349 }
1350
1351 r = sd_event_add_io(m->event, &m->llmnr_ipv6_udp_event_source, m->llmnr_ipv6_udp_fd, EPOLLIN, on_llmnr_packet, m);
1352 if (r < 0) {
1353 r = -errno;
1354 goto fail;
1355 }
1356
1357 return m->llmnr_ipv6_udp_fd;
1358
1359 fail:
1360 m->llmnr_ipv6_udp_fd = safe_close(m->llmnr_ipv6_udp_fd);
1361 return r;
1362 }
1363
1364 static int on_llmnr_stream_packet(DnsStream *s) {
1365 assert(s);
1366
1367 if (dns_packet_validate_query(s->read_packet) > 0) {
1368 Link *l;
1369
1370 l = hashmap_get(s->manager->links, INT_TO_PTR(s->read_packet->ifindex));
1371 if (l) {
1372 DnsScope *scope = NULL;
1373
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;
1378
1379 if (scope) {
1380 dns_scope_process_query(scope, s, s->read_packet);
1381
1382 /* If no reply packet was set, we free the stream */
1383 if (s->write_packet)
1384 return 0;
1385 }
1386 }
1387 }
1388
1389 dns_stream_free(s);
1390 return 0;
1391 }
1392
1393 static int on_llmnr_stream(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1394 DnsStream *stream;
1395 Manager *m = userdata;
1396 int cfd, r;
1397
1398 cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
1399 if (cfd < 0) {
1400 if (errno == EAGAIN || errno == EINTR)
1401 return 0;
1402
1403 return -errno;
1404 }
1405
1406 r = dns_stream_new(m, &stream, DNS_PROTOCOL_LLMNR, cfd);
1407 if (r < 0) {
1408 safe_close(cfd);
1409 return r;
1410 }
1411
1412 stream->on_packet = on_llmnr_stream_packet;
1413 return 0;
1414 }
1415
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),
1420 };
1421 static const int one = 1, pmtu = IP_PMTUDISC_DONT;
1422 int r;
1423
1424 assert(m);
1425
1426 if (m->llmnr_ipv4_tcp_fd >= 0)
1427 return m->llmnr_ipv4_tcp_fd;
1428
1429 m->llmnr_ipv4_tcp_fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1430 if (m->llmnr_ipv4_tcp_fd < 0)
1431 return -errno;
1432
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));
1435 if (r < 0) {
1436 r = -errno;
1437 goto fail;
1438 }
1439
1440 r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1441 if (r < 0) {
1442 r = -errno;
1443 goto fail;
1444 }
1445
1446 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1447 if (r < 0) {
1448 r = -errno;
1449 goto fail;
1450 }
1451
1452 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1453 if (r < 0) {
1454 r = -errno;
1455 goto fail;
1456 }
1457
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));
1460 if (r < 0) {
1461 r = -errno;
1462 goto fail;
1463 }
1464
1465 r = bind(m->llmnr_ipv4_tcp_fd, &sa.sa, sizeof(sa.in));
1466 if (r < 0) {
1467 r = -errno;
1468 goto fail;
1469 }
1470
1471 r = listen(m->llmnr_ipv4_tcp_fd, SOMAXCONN);
1472 if (r < 0) {
1473 r = -errno;
1474 goto fail;
1475 }
1476
1477 r = sd_event_add_io(m->event, &m->llmnr_ipv4_tcp_event_source, m->llmnr_ipv4_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1478 if (r < 0)
1479 goto fail;
1480
1481 return m->llmnr_ipv4_tcp_fd;
1482
1483 fail:
1484 m->llmnr_ipv4_tcp_fd = safe_close(m->llmnr_ipv4_tcp_fd);
1485 return r;
1486 }
1487
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),
1492 };
1493 static const int one = 1;
1494 int r;
1495
1496 assert(m);
1497
1498 if (m->llmnr_ipv6_tcp_fd >= 0)
1499 return m->llmnr_ipv6_tcp_fd;
1500
1501 m->llmnr_ipv6_tcp_fd = socket(AF_INET6, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1502 if (m->llmnr_ipv6_tcp_fd < 0)
1503 return -errno;
1504
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));
1507 if (r < 0) {
1508 r = -errno;
1509 goto fail;
1510 }
1511
1512 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1513 if (r < 0) {
1514 r = -errno;
1515 goto fail;
1516 }
1517
1518 r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1519 if (r < 0) {
1520 r = -errno;
1521 goto fail;
1522 }
1523
1524 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1525 if (r < 0) {
1526 r = -errno;
1527 goto fail;
1528 }
1529
1530 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1531 if (r < 0) {
1532 r = -errno;
1533 goto fail;
1534 }
1535
1536 r = bind(m->llmnr_ipv6_tcp_fd, &sa.sa, sizeof(sa.in6));
1537 if (r < 0) {
1538 r = -errno;
1539 goto fail;
1540 }
1541
1542 r = listen(m->llmnr_ipv6_tcp_fd, SOMAXCONN);
1543 if (r < 0) {
1544 r = -errno;
1545 goto fail;
1546 }
1547
1548 r = sd_event_add_io(m->event, &m->llmnr_ipv6_tcp_event_source, m->llmnr_ipv6_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1549 if (r < 0) {
1550 r = -errno;
1551 goto fail;
1552 }
1553
1554 return m->llmnr_ipv6_tcp_fd;
1555
1556 fail:
1557 m->llmnr_ipv6_tcp_fd = safe_close(m->llmnr_ipv6_tcp_fd);
1558 return r;
1559 }
1560
1561 int manager_ifindex_is_loopback(Manager *m, int ifindex) {
1562 Link *l;
1563 assert(m);
1564
1565 if (ifindex <= 0)
1566 return -EINVAL;
1567
1568 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
1569 if (l->flags & IFF_LOOPBACK)
1570 return 1;
1571
1572 return 0;
1573 }
1574
1575 int manager_find_ifindex(Manager *m, int family, const union in_addr_union *in_addr) {
1576 LinkAddress *a;
1577
1578 assert(m);
1579
1580 a = manager_find_link_address(m, family, in_addr);
1581 if (a)
1582 return a->link->ifindex;
1583
1584 return 0;
1585 }
1586
1587 void manager_refresh_rrs(Manager *m) {
1588 Iterator i;
1589 Link *l;
1590
1591 assert(m);
1592
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);
1595
1596 HASHMAP_FOREACH(l, m->links, i) {
1597 link_add_rrs(l, true);
1598 link_add_rrs(l, false);
1599 }
1600 }
1601
1602 int manager_next_hostname(Manager *m) {
1603 const char *p;
1604 uint64_t u;
1605 char *h;
1606
1607 assert(m);
1608
1609 p = strchr(m->hostname, 0);
1610 assert(p);
1611
1612 while (p > m->hostname) {
1613 if (!strchr("0123456789", p[-1]))
1614 break;
1615
1616 p--;
1617 }
1618
1619 if (*p == 0 || safe_atou64(p, &u) < 0 || u <= 0)
1620 u = 1;
1621
1622 u++;
1623
1624 if (asprintf(&h, "%.*s%" PRIu64, (int) (p - m->hostname), m->hostname, u) < 0)
1625 return -ENOMEM;
1626
1627 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m->hostname, h);
1628
1629 free(m->hostname);
1630 m->hostname = h;
1631
1632 manager_refresh_rrs(m);
1633
1634 return 0;
1635 }
1636
1637 LinkAddress* manager_find_link_address(Manager *m, int family, const union in_addr_union *in_addr) {
1638 Iterator i;
1639 Link *l;
1640
1641 assert(m);
1642
1643 HASHMAP_FOREACH(l, m->links, i) {
1644 LinkAddress *a;
1645
1646 a = link_find_address(l, family, in_addr);
1647 if (a)
1648 return a;
1649 }
1650
1651 return NULL;
1652 }
1653
1654 int manager_our_packet(Manager *m, DnsPacket *p) {
1655 assert(m);
1656 assert(p);
1657
1658 return !!manager_find_link_address(m, p->family, &p->sender);
1659 }
1660
1661 static const char* const support_table[_SUPPORT_MAX] = {
1662 [SUPPORT_NO] = "no",
1663 [SUPPORT_YES] = "yes",
1664 [SUPPORT_RESOLVE] = "resolve",
1665 };
1666 DEFINE_STRING_TABLE_LOOKUP(support, Support);