]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/resolve/resolved-manager.c
resolved: when there's already somebody listening on the LLMNR ports, simple disable...
[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 int r;
363
364 assert(m);
365
366 m->hostname_fd = open("/proc/sys/kernel/hostname", O_RDONLY|O_CLOEXEC|O_NDELAY|O_NOCTTY);
367 if (m->hostname_fd < 0) {
368 log_warning("Failed to watch hostname: %m");
369 return 0;
370 }
371
372 r = sd_event_add_io(m->event, &m->hostname_event_source, m->hostname_fd, 0, on_hostname_change, m);
373 if (r < 0) {
374 if (r == -EPERM)
375 /* kernels prior to 3.2 don't support polling this file. Ignore the failure. */
376 m->hostname_fd = safe_close(m->hostname_fd);
377 else {
378 log_error("Failed to add hostname event source: %s", strerror(-r));
379 return r;
380 }
381 }
382
383 r = determine_hostname(&m->hostname);
384 if (r < 0) {
385 log_info("Defaulting to hostname 'linux'.");
386 m->hostname = strdup("linux");
387 if (!m->hostname)
388 return log_oom();
389 } else
390 log_info("Using system hostname '%s'.", m->hostname);
391
392 return 0;
393 }
394
395 static void manager_llmnr_stop(Manager *m) {
396 assert(m);
397
398 m->llmnr_ipv4_udp_event_source = sd_event_source_unref(m->llmnr_ipv4_udp_event_source);
399 m->llmnr_ipv4_udp_fd = safe_close(m->llmnr_ipv4_udp_fd);
400
401 m->llmnr_ipv6_udp_event_source = sd_event_source_unref(m->llmnr_ipv6_udp_event_source);
402 m->llmnr_ipv6_udp_fd = safe_close(m->llmnr_ipv6_udp_fd);
403
404 m->llmnr_ipv4_tcp_event_source = sd_event_source_unref(m->llmnr_ipv4_tcp_event_source);
405 m->llmnr_ipv4_tcp_fd = safe_close(m->llmnr_ipv4_tcp_fd);
406
407 m->llmnr_ipv6_tcp_event_source = sd_event_source_unref(m->llmnr_ipv6_tcp_event_source);
408 m->llmnr_ipv6_tcp_fd = safe_close(m->llmnr_ipv6_tcp_fd);
409 }
410
411 static int manager_llmnr_start(Manager *m) {
412 int r;
413
414 assert(m);
415
416 if (m->llmnr_support == SUPPORT_NO)
417 return 0;
418
419 r = manager_llmnr_ipv4_udp_fd(m);
420 if (r == -EADDRINUSE)
421 goto eaddrinuse;
422 if (r < 0)
423 return r;
424
425 r = manager_llmnr_ipv6_udp_fd(m);
426 if (r == -EADDRINUSE)
427 goto eaddrinuse;
428 if (r < 0)
429 return r;
430
431 r = manager_llmnr_ipv4_tcp_fd(m);
432 if (r == -EADDRINUSE)
433 goto eaddrinuse;
434 if (r < 0)
435 return r;
436
437 r = manager_llmnr_ipv6_tcp_fd(m);
438 if (r == -EADDRINUSE)
439 goto eaddrinuse;
440 if (r < 0)
441 return r;
442
443 return 0;
444
445 eaddrinuse:
446 log_warning("There appears to be another LLMNR respondering running. Turning off LLMNR support.");
447 m->llmnr_support = SUPPORT_NO;
448 manager_llmnr_stop(m);
449 return 0;
450 }
451
452 int manager_new(Manager **ret) {
453 _cleanup_(manager_freep) Manager *m = NULL;
454 int r;
455
456 assert(ret);
457
458 m = new0(Manager, 1);
459 if (!m)
460 return -ENOMEM;
461
462 m->dns_ipv4_fd = m->dns_ipv6_fd = -1;
463 m->llmnr_ipv4_udp_fd = m->llmnr_ipv6_udp_fd = -1;
464 m->llmnr_ipv4_tcp_fd = m->llmnr_ipv6_tcp_fd = -1;
465 m->hostname_fd = -1;
466
467 m->llmnr_support = SUPPORT_YES;
468 m->read_resolv_conf = true;
469
470 r = manager_parse_dns_server(m, DNS_SERVER_FALLBACK, DNS_SERVERS);
471 if (r < 0)
472 return r;
473
474 r = sd_event_default(&m->event);
475 if (r < 0)
476 return r;
477
478 sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
479 sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
480
481 sd_event_set_watchdog(m->event, true);
482
483 r = manager_watch_hostname(m);
484 if (r < 0)
485 return r;
486
487 r = dns_scope_new(m, &m->unicast_scope, NULL, DNS_PROTOCOL_DNS, AF_UNSPEC);
488 if (r < 0)
489 return r;
490
491 r = manager_network_monitor_listen(m);
492 if (r < 0)
493 return r;
494
495 r = manager_rtnl_listen(m);
496 if (r < 0)
497 return r;
498
499 r = manager_connect_bus(m);
500 if (r < 0)
501 return r;
502
503 *ret = m;
504 m = NULL;
505
506 return 0;
507 }
508
509 int manager_start(Manager *m) {
510 int r;
511
512 assert(m);
513
514 r = manager_llmnr_start(m);
515 if (r < 0)
516 return r;
517
518 return 0;
519 }
520
521 Manager *manager_free(Manager *m) {
522 Link *l;
523
524 if (!m)
525 return NULL;
526
527 while (m->dns_queries)
528 dns_query_free(m->dns_queries);
529
530 hashmap_free(m->dns_transactions);
531
532 while ((l = hashmap_first(m->links)))
533 link_free(l);
534 hashmap_free(m->links);
535
536 dns_scope_free(m->unicast_scope);
537
538 while (m->dns_servers)
539 dns_server_free(m->dns_servers);
540 while (m->fallback_dns_servers)
541 dns_server_free(m->fallback_dns_servers);
542
543 sd_event_source_unref(m->network_event_source);
544 sd_network_monitor_unref(m->network_monitor);
545
546 sd_event_source_unref(m->dns_ipv4_event_source);
547 sd_event_source_unref(m->dns_ipv6_event_source);
548 safe_close(m->dns_ipv4_fd);
549 safe_close(m->dns_ipv6_fd);
550
551 manager_llmnr_stop(m);
552
553 sd_event_source_unref(m->bus_retry_event_source);
554 sd_bus_unref(m->bus);
555
556 sd_event_unref(m->event);
557
558 dns_resource_key_unref(m->host_ipv4_key);
559 dns_resource_key_unref(m->host_ipv6_key);
560
561 safe_close(m->hostname_fd);
562 sd_event_source_unref(m->hostname_event_source);
563 free(m->hostname);
564
565 free(m);
566
567 return NULL;
568 }
569
570 int manager_read_resolv_conf(Manager *m) {
571 _cleanup_fclose_ FILE *f = NULL;
572 struct stat st, own;
573 char line[LINE_MAX];
574 DnsServer *s, *nx;
575 usec_t t;
576 int r;
577
578 assert(m);
579
580 /* Reads the system /etc/resolv.conf, if it exists and is not
581 * symlinked to our own resolv.conf instance */
582
583 if (!m->read_resolv_conf)
584 return 0;
585
586 r = stat("/etc/resolv.conf", &st);
587 if (r < 0) {
588 if (errno != ENOENT)
589 log_warning("Failed to open /etc/resolv.conf: %m");
590 r = -errno;
591 goto clear;
592 }
593
594 /* Have we already seen the file? */
595 t = timespec_load(&st.st_mtim);
596 if (t == m->resolv_conf_mtime)
597 return 0;
598
599 m->resolv_conf_mtime = t;
600
601 /* Is it symlinked to our own file? */
602 if (stat("/run/systemd/resolve/resolv.conf", &own) >= 0 &&
603 st.st_dev == own.st_dev &&
604 st.st_ino == own.st_ino) {
605 r = 0;
606 goto clear;
607 }
608
609 f = fopen("/etc/resolv.conf", "re");
610 if (!f) {
611 if (errno != ENOENT)
612 log_warning("Failed to open /etc/resolv.conf: %m");
613 r = -errno;
614 goto clear;
615 }
616
617 if (fstat(fileno(f), &st) < 0) {
618 log_error("Failed to stat open file: %m");
619 r = -errno;
620 goto clear;
621 }
622
623 LIST_FOREACH(servers, s, m->dns_servers)
624 s->marked = true;
625
626 FOREACH_LINE(line, f, r = -errno; goto clear) {
627 union in_addr_union address;
628 int family;
629 char *l;
630 const char *a;
631
632 truncate_nl(line);
633
634 l = strstrip(line);
635 if (*l == '#' || *l == ';')
636 continue;
637
638 a = first_word(l, "nameserver");
639 if (!a)
640 continue;
641
642 r = in_addr_from_string_auto(a, &family, &address);
643 if (r < 0) {
644 log_warning("Failed to parse name server %s.", a);
645 continue;
646 }
647
648 LIST_FOREACH(servers, s, m->dns_servers)
649 if (s->family == family && in_addr_equal(family, &s->address, &address) > 0)
650 break;
651
652 if (s)
653 s->marked = false;
654 else {
655 r = dns_server_new(m, NULL, DNS_SERVER_SYSTEM, NULL, family, &address);
656 if (r < 0)
657 goto clear;
658 }
659 }
660
661 LIST_FOREACH_SAFE(servers, s, nx, m->dns_servers)
662 if (s->marked)
663 dns_server_free(s);
664
665 return 0;
666
667 clear:
668 while (m->dns_servers)
669 dns_server_free(m->dns_servers);
670
671 return r;
672 }
673
674 static void write_resolve_conf_server(DnsServer *s, FILE *f, unsigned *count) {
675 _cleanup_free_ char *t = NULL;
676 int r;
677
678 assert(s);
679 assert(f);
680 assert(count);
681
682 r = in_addr_to_string(s->family, &s->address, &t);
683 if (r < 0) {
684 log_warning("Invalid DNS address. Ignoring: %s", strerror(-r));
685 return;
686 }
687
688 if (*count == MAXNS)
689 fputs("# Too many DNS servers configured, the following entries may be ignored\n", f);
690
691 fprintf(f, "nameserver %s\n", t);
692 (*count) ++;
693 }
694
695 int manager_write_resolv_conf(Manager *m) {
696 static const char path[] = "/run/systemd/resolve/resolv.conf";
697 _cleanup_free_ char *temp_path = NULL;
698 _cleanup_fclose_ FILE *f = NULL;
699 unsigned count = 0;
700 DnsServer *s;
701 Iterator i;
702 Link *l;
703 int r;
704
705 assert(m);
706
707 /* Read the system /etc/resolv.conf first */
708 manager_read_resolv_conf(m);
709
710 r = fopen_temporary(path, &f, &temp_path);
711 if (r < 0)
712 return r;
713
714 fchmod(fileno(f), 0644);
715
716 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
717 "# Third party programs must not access this file directly, but\n"
718 "# only through the symlink at /etc/resolv.conf. To manage\n"
719 "# resolv.conf(5) in a different way, replace the symlink by a\n"
720 "# static file or a different symlink.\n\n", f);
721
722 LIST_FOREACH(servers, s, m->dns_servers)
723 write_resolve_conf_server(s, f, &count);
724
725 HASHMAP_FOREACH(l, m->links, i)
726 LIST_FOREACH(servers, s, l->dns_servers)
727 write_resolve_conf_server(s, f, &count);
728
729 if (count == 0) {
730 LIST_FOREACH(servers, s, m->fallback_dns_servers)
731 write_resolve_conf_server(s, f, &count);
732 }
733
734 r = fflush_and_check(f);
735 if (r < 0)
736 goto fail;
737
738 if (rename(temp_path, path) < 0) {
739 r = -errno;
740 goto fail;
741 }
742
743 return 0;
744
745 fail:
746 unlink(path);
747 unlink(temp_path);
748 return r;
749 }
750
751 int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) {
752 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
753 union {
754 struct cmsghdr header; /* For alignment */
755 uint8_t buffer[CMSG_SPACE(MAX(sizeof(struct in_pktinfo), sizeof(struct in6_pktinfo)))
756 + CMSG_SPACE(int) /* ttl/hoplimit */
757 + EXTRA_CMSG_SPACE /* kernel appears to require extra buffer space */];
758 } control;
759 union sockaddr_union sa;
760 struct msghdr mh = {};
761 struct cmsghdr *cmsg;
762 struct iovec iov;
763 int ms = 0, r;
764 ssize_t l;
765
766 assert(m);
767 assert(fd >= 0);
768 assert(ret);
769
770 r = ioctl(fd, FIONREAD, &ms);
771 if (r < 0)
772 return -errno;
773 if (ms < 0)
774 return -EIO;
775
776 r = dns_packet_new(&p, protocol, ms);
777 if (r < 0)
778 return r;
779
780 iov.iov_base = DNS_PACKET_DATA(p);
781 iov.iov_len = p->allocated;
782
783 mh.msg_name = &sa.sa;
784 mh.msg_namelen = sizeof(sa);
785 mh.msg_iov = &iov;
786 mh.msg_iovlen = 1;
787 mh.msg_control = &control;
788 mh.msg_controllen = sizeof(control);
789
790 l = recvmsg(fd, &mh, 0);
791 if (l < 0) {
792 if (errno == EAGAIN || errno == EINTR)
793 return 0;
794
795 return -errno;
796 }
797
798 if (l <= 0)
799 return -EIO;
800
801 assert(!(mh.msg_flags & MSG_CTRUNC));
802 assert(!(mh.msg_flags & MSG_TRUNC));
803
804 p->size = (size_t) l;
805
806 p->family = sa.sa.sa_family;
807 p->ipproto = IPPROTO_UDP;
808 if (p->family == AF_INET) {
809 p->sender.in = sa.in.sin_addr;
810 p->sender_port = be16toh(sa.in.sin_port);
811 } else if (p->family == AF_INET6) {
812 p->sender.in6 = sa.in6.sin6_addr;
813 p->sender_port = be16toh(sa.in6.sin6_port);
814 p->ifindex = sa.in6.sin6_scope_id;
815 } else
816 return -EAFNOSUPPORT;
817
818 for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
819
820 if (cmsg->cmsg_level == IPPROTO_IPV6) {
821 assert(p->family == AF_INET6);
822
823 switch (cmsg->cmsg_type) {
824
825 case IPV6_PKTINFO: {
826 struct in6_pktinfo *i = (struct in6_pktinfo*) CMSG_DATA(cmsg);
827
828 if (p->ifindex <= 0)
829 p->ifindex = i->ipi6_ifindex;
830
831 p->destination.in6 = i->ipi6_addr;
832 break;
833 }
834
835 case IPV6_HOPLIMIT:
836 p->ttl = *(int *) CMSG_DATA(cmsg);
837 break;
838
839 }
840 } else if (cmsg->cmsg_level == IPPROTO_IP) {
841 assert(p->family == AF_INET);
842
843 switch (cmsg->cmsg_type) {
844
845 case IP_PKTINFO: {
846 struct in_pktinfo *i = (struct in_pktinfo*) CMSG_DATA(cmsg);
847
848 if (p->ifindex <= 0)
849 p->ifindex = i->ipi_ifindex;
850
851 p->destination.in = i->ipi_addr;
852 break;
853 }
854
855 case IP_TTL:
856 p->ttl = *(int *) CMSG_DATA(cmsg);
857 break;
858 }
859 }
860 }
861
862 /* The Linux kernel sets the interface index to the loopback
863 * device if the packet came from the local host since it
864 * avoids the routing table in such a case. Let's unset the
865 * interface index in such a case. */
866 if (p->ifindex > 0 && manager_ifindex_is_loopback(m, p->ifindex) != 0)
867 p->ifindex = 0;
868
869 /* If we don't know the interface index still, we look for the
870 * first local interface with a matching address. Yuck! */
871 if (p->ifindex <= 0)
872 p->ifindex = manager_find_ifindex(m, p->family, &p->destination);
873
874 *ret = p;
875 p = NULL;
876
877 return 1;
878 }
879
880 static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
881 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
882 DnsTransaction *t = NULL;
883 Manager *m = userdata;
884 int r;
885
886 r = manager_recv(m, fd, DNS_PROTOCOL_DNS, &p);
887 if (r <= 0)
888 return r;
889
890 if (dns_packet_validate_reply(p) > 0) {
891 t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
892 if (!t)
893 return 0;
894
895 dns_transaction_process_reply(t, p);
896
897 } else
898 log_debug("Invalid DNS packet.");
899
900 return 0;
901 }
902
903 int manager_dns_ipv4_fd(Manager *m) {
904 const int one = 1;
905 int r;
906
907 assert(m);
908
909 if (m->dns_ipv4_fd >= 0)
910 return m->dns_ipv4_fd;
911
912 m->dns_ipv4_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
913 if (m->dns_ipv4_fd < 0)
914 return -errno;
915
916 r = setsockopt(m->dns_ipv4_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
917 if (r < 0) {
918 r = -errno;
919 goto fail;
920 }
921
922 r = sd_event_add_io(m->event, &m->dns_ipv4_event_source, m->dns_ipv4_fd, EPOLLIN, on_dns_packet, m);
923 if (r < 0)
924 goto fail;
925
926 return m->dns_ipv4_fd;
927
928 fail:
929 m->dns_ipv4_fd = safe_close(m->dns_ipv4_fd);
930 return r;
931 }
932
933 int manager_dns_ipv6_fd(Manager *m) {
934 const int one = 1;
935 int r;
936
937 assert(m);
938
939 if (m->dns_ipv6_fd >= 0)
940 return m->dns_ipv6_fd;
941
942 m->dns_ipv6_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
943 if (m->dns_ipv6_fd < 0)
944 return -errno;
945
946 r = setsockopt(m->dns_ipv6_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
947 if (r < 0) {
948 r = -errno;
949 goto fail;
950 }
951
952 r = sd_event_add_io(m->event, &m->dns_ipv6_event_source, m->dns_ipv6_fd, EPOLLIN, on_dns_packet, m);
953 if (r < 0)
954 goto fail;
955
956 return m->dns_ipv6_fd;
957
958 fail:
959 m->dns_ipv6_fd = safe_close(m->dns_ipv6_fd);
960 return r;
961 }
962
963 static int sendmsg_loop(int fd, struct msghdr *mh, int flags) {
964 int r;
965
966 assert(fd >= 0);
967 assert(mh);
968
969 for (;;) {
970 if (sendmsg(fd, mh, flags) >= 0)
971 return 0;
972
973 if (errno == EINTR)
974 continue;
975
976 if (errno != EAGAIN)
977 return -errno;
978
979 r = fd_wait_for_event(fd, POLLOUT, SEND_TIMEOUT_USEC);
980 if (r < 0)
981 return r;
982 if (r == 0)
983 return -ETIMEDOUT;
984 }
985 }
986
987 static int manager_ipv4_send(Manager *m, int fd, int ifindex, const struct in_addr *addr, uint16_t port, DnsPacket *p) {
988 union sockaddr_union sa = {
989 .in.sin_family = AF_INET,
990 };
991 union {
992 struct cmsghdr header; /* For alignment */
993 uint8_t buffer[CMSG_SPACE(sizeof(struct in_pktinfo))];
994 } control;
995 struct msghdr mh = {};
996 struct iovec iov;
997
998 assert(m);
999 assert(fd >= 0);
1000 assert(addr);
1001 assert(port > 0);
1002 assert(p);
1003
1004 iov.iov_base = DNS_PACKET_DATA(p);
1005 iov.iov_len = p->size;
1006
1007 sa.in.sin_addr = *addr;
1008 sa.in.sin_port = htobe16(port),
1009
1010 mh.msg_iov = &iov;
1011 mh.msg_iovlen = 1;
1012 mh.msg_name = &sa.sa;
1013 mh.msg_namelen = sizeof(sa.in);
1014
1015 if (ifindex > 0) {
1016 struct cmsghdr *cmsg;
1017 struct in_pktinfo *pi;
1018
1019 zero(control);
1020
1021 mh.msg_control = &control;
1022 mh.msg_controllen = CMSG_LEN(sizeof(struct in_pktinfo));
1023
1024 cmsg = CMSG_FIRSTHDR(&mh);
1025 cmsg->cmsg_len = mh.msg_controllen;
1026 cmsg->cmsg_level = IPPROTO_IP;
1027 cmsg->cmsg_type = IP_PKTINFO;
1028
1029 pi = (struct in_pktinfo*) CMSG_DATA(cmsg);
1030 pi->ipi_ifindex = ifindex;
1031 }
1032
1033 return sendmsg_loop(fd, &mh, 0);
1034 }
1035
1036 static int manager_ipv6_send(Manager *m, int fd, int ifindex, const struct in6_addr *addr, uint16_t port, DnsPacket *p) {
1037 union sockaddr_union sa = {
1038 .in6.sin6_family = AF_INET6,
1039 };
1040 union {
1041 struct cmsghdr header; /* For alignment */
1042 uint8_t buffer[CMSG_SPACE(sizeof(struct in6_pktinfo))];
1043 } control;
1044 struct msghdr mh = {};
1045 struct iovec iov;
1046
1047 assert(m);
1048 assert(fd >= 0);
1049 assert(addr);
1050 assert(port > 0);
1051 assert(p);
1052
1053 iov.iov_base = DNS_PACKET_DATA(p);
1054 iov.iov_len = p->size;
1055
1056 sa.in6.sin6_addr = *addr;
1057 sa.in6.sin6_port = htobe16(port),
1058 sa.in6.sin6_scope_id = ifindex;
1059
1060 mh.msg_iov = &iov;
1061 mh.msg_iovlen = 1;
1062 mh.msg_name = &sa.sa;
1063 mh.msg_namelen = sizeof(sa.in6);
1064
1065 if (ifindex > 0) {
1066 struct cmsghdr *cmsg;
1067 struct in6_pktinfo *pi;
1068
1069 zero(control);
1070
1071 mh.msg_control = &control;
1072 mh.msg_controllen = CMSG_LEN(sizeof(struct in6_pktinfo));
1073
1074 cmsg = CMSG_FIRSTHDR(&mh);
1075 cmsg->cmsg_len = mh.msg_controllen;
1076 cmsg->cmsg_level = IPPROTO_IPV6;
1077 cmsg->cmsg_type = IPV6_PKTINFO;
1078
1079 pi = (struct in6_pktinfo*) CMSG_DATA(cmsg);
1080 pi->ipi6_ifindex = ifindex;
1081 }
1082
1083 return sendmsg_loop(fd, &mh, 0);
1084 }
1085
1086 int manager_send(Manager *m, int fd, int ifindex, int family, const union in_addr_union *addr, uint16_t port, DnsPacket *p) {
1087 assert(m);
1088 assert(fd >= 0);
1089 assert(addr);
1090 assert(port > 0);
1091 assert(p);
1092
1093 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));
1094
1095 if (family == AF_INET)
1096 return manager_ipv4_send(m, fd, ifindex, &addr->in, port, p);
1097 else if (family == AF_INET6)
1098 return manager_ipv6_send(m, fd, ifindex, &addr->in6, port, p);
1099
1100 return -EAFNOSUPPORT;
1101 }
1102
1103 DnsServer* manager_find_dns_server(Manager *m, int family, const union in_addr_union *in_addr) {
1104 DnsServer *s;
1105
1106 assert(m);
1107 assert(in_addr);
1108
1109 LIST_FOREACH(servers, s, m->dns_servers)
1110 if (s->family == family && in_addr_equal(family, &s->address, in_addr) > 0)
1111 return s;
1112
1113 LIST_FOREACH(servers, s, m->fallback_dns_servers)
1114 if (s->family == family && in_addr_equal(family, &s->address, in_addr) > 0)
1115 return s;
1116
1117 return NULL;
1118 }
1119
1120 DnsServer *manager_set_dns_server(Manager *m, DnsServer *s) {
1121 assert(m);
1122
1123 if (m->current_dns_server == s)
1124 return s;
1125
1126 if (s) {
1127 _cleanup_free_ char *ip = NULL;
1128
1129 in_addr_to_string(s->family, &s->address, &ip);
1130 log_info("Switching to system DNS server %s.", strna(ip));
1131 }
1132
1133 m->current_dns_server = s;
1134
1135 if (m->unicast_scope)
1136 dns_cache_flush(&m->unicast_scope->cache);
1137
1138 return s;
1139 }
1140
1141 DnsServer *manager_get_dns_server(Manager *m) {
1142 Link *l;
1143 assert(m);
1144
1145 /* Try to read updates resolv.conf */
1146 manager_read_resolv_conf(m);
1147
1148 if (!m->current_dns_server)
1149 manager_set_dns_server(m, m->dns_servers);
1150
1151 if (!m->current_dns_server) {
1152 bool found = false;
1153 Iterator i;
1154
1155 /* No DNS servers configured, let's see if there are
1156 * any on any links. If not, we use the fallback
1157 * servers */
1158
1159 HASHMAP_FOREACH(l, m->links, i)
1160 if (l->dns_servers) {
1161 found = true;
1162 break;
1163 }
1164
1165 if (!found)
1166 manager_set_dns_server(m, m->fallback_dns_servers);
1167 }
1168
1169 return m->current_dns_server;
1170 }
1171
1172 void manager_next_dns_server(Manager *m) {
1173 assert(m);
1174
1175 /* If there's currently no DNS server set, then the next
1176 * manager_get_dns_server() will find one */
1177 if (!m->current_dns_server)
1178 return;
1179
1180 /* Change to the next one */
1181 if (m->current_dns_server->servers_next) {
1182 manager_set_dns_server(m, m->current_dns_server->servers_next);
1183 return;
1184 }
1185
1186 /* If there was no next one, then start from the beginning of
1187 * the list */
1188 if (m->current_dns_server->type == DNS_SERVER_FALLBACK)
1189 manager_set_dns_server(m, m->fallback_dns_servers);
1190 else
1191 manager_set_dns_server(m, m->dns_servers);
1192 }
1193
1194 uint32_t manager_find_mtu(Manager *m) {
1195 uint32_t mtu = 0;
1196 Link *l;
1197 Iterator i;
1198
1199 /* If we don't know on which link a DNS packet would be
1200 * delivered, let's find the largest MTU that works on all
1201 * interfaces we know of */
1202
1203 HASHMAP_FOREACH(l, m->links, i) {
1204 if (l->mtu <= 0)
1205 continue;
1206
1207 if (mtu <= 0 || l->mtu < mtu)
1208 mtu = l->mtu;
1209 }
1210
1211 return mtu;
1212 }
1213
1214 static int on_llmnr_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1215 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
1216 DnsTransaction *t = NULL;
1217 Manager *m = userdata;
1218 int r;
1219
1220 r = manager_recv(m, fd, DNS_PROTOCOL_LLMNR, &p);
1221 if (r <= 0)
1222 return r;
1223
1224 if (dns_packet_validate_reply(p) > 0) {
1225 log_debug("Got reply packet for id %u", DNS_PACKET_ID(p));
1226
1227 t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
1228 if (!t)
1229 return 0;
1230
1231 dns_transaction_process_reply(t, p);
1232
1233 } else if (dns_packet_validate_query(p) > 0) {
1234 Link *l;
1235
1236 l = hashmap_get(m->links, INT_TO_PTR(p->ifindex));
1237 if (l) {
1238 DnsScope *scope = NULL;
1239
1240 if (p->family == AF_INET)
1241 scope = l->llmnr_ipv4_scope;
1242 else if (p->family == AF_INET6)
1243 scope = l->llmnr_ipv6_scope;
1244
1245 if (scope)
1246 dns_scope_process_query(scope, NULL, p);
1247 }
1248 } else
1249 log_debug("Invalid LLMNR packet.");
1250
1251 return 0;
1252 }
1253
1254 int manager_llmnr_ipv4_udp_fd(Manager *m) {
1255 union sockaddr_union sa = {
1256 .in.sin_family = AF_INET,
1257 .in.sin_port = htobe16(5355),
1258 };
1259 static const int one = 1, pmtu = IP_PMTUDISC_DONT, ttl = 255;
1260 int r;
1261
1262 assert(m);
1263
1264 if (m->llmnr_ipv4_udp_fd >= 0)
1265 return m->llmnr_ipv4_udp_fd;
1266
1267 m->llmnr_ipv4_udp_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1268 if (m->llmnr_ipv4_udp_fd < 0)
1269 return -errno;
1270
1271 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1272 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
1273 if (r < 0) {
1274 r = -errno;
1275 goto fail;
1276 }
1277
1278 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
1279 if (r < 0) {
1280 r = -errno;
1281 goto fail;
1282 }
1283
1284 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof(one));
1285 if (r < 0) {
1286 r = -errno;
1287 goto fail;
1288 }
1289
1290 r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1291 if (r < 0) {
1292 r = -errno;
1293 goto fail;
1294 }
1295
1296 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1297 if (r < 0) {
1298 r = -errno;
1299 goto fail;
1300 }
1301
1302 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1303 if (r < 0) {
1304 r = -errno;
1305 goto fail;
1306 }
1307
1308 /* Disable Don't-Fragment bit in the IP header */
1309 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1310 if (r < 0) {
1311 r = -errno;
1312 goto fail;
1313 }
1314
1315 r = bind(m->llmnr_ipv4_udp_fd, &sa.sa, sizeof(sa.in));
1316 if (r < 0) {
1317 r = -errno;
1318 goto fail;
1319 }
1320
1321 r = sd_event_add_io(m->event, &m->llmnr_ipv4_udp_event_source, m->llmnr_ipv4_udp_fd, EPOLLIN, on_llmnr_packet, m);
1322 if (r < 0)
1323 goto fail;
1324
1325 return m->llmnr_ipv4_udp_fd;
1326
1327 fail:
1328 m->llmnr_ipv4_udp_fd = safe_close(m->llmnr_ipv4_udp_fd);
1329 return r;
1330 }
1331
1332 int manager_llmnr_ipv6_udp_fd(Manager *m) {
1333 union sockaddr_union sa = {
1334 .in6.sin6_family = AF_INET6,
1335 .in6.sin6_port = htobe16(5355),
1336 };
1337 static const int one = 1, ttl = 255;
1338 int r;
1339
1340 assert(m);
1341
1342 if (m->llmnr_ipv6_udp_fd >= 0)
1343 return m->llmnr_ipv6_udp_fd;
1344
1345 m->llmnr_ipv6_udp_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1346 if (m->llmnr_ipv6_udp_fd < 0)
1347 return -errno;
1348
1349 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl));
1350 if (r < 0) {
1351 r = -errno;
1352 goto fail;
1353 }
1354
1355 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1356 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, sizeof(ttl));
1357 if (r < 0) {
1358 r = -errno;
1359 goto fail;
1360 }
1361
1362 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof(one));
1363 if (r < 0) {
1364 r = -errno;
1365 goto fail;
1366 }
1367
1368 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1369 if (r < 0) {
1370 r = -errno;
1371 goto fail;
1372 }
1373
1374 r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1375 if (r < 0) {
1376 r = -errno;
1377 goto fail;
1378 }
1379
1380 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1381 if (r < 0) {
1382 r = -errno;
1383 goto fail;
1384 }
1385
1386 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1387 if (r < 0) {
1388 r = -errno;
1389 goto fail;
1390 }
1391
1392 r = bind(m->llmnr_ipv6_udp_fd, &sa.sa, sizeof(sa.in6));
1393 if (r < 0) {
1394 r = -errno;
1395 goto fail;
1396 }
1397
1398 r = sd_event_add_io(m->event, &m->llmnr_ipv6_udp_event_source, m->llmnr_ipv6_udp_fd, EPOLLIN, on_llmnr_packet, m);
1399 if (r < 0) {
1400 r = -errno;
1401 goto fail;
1402 }
1403
1404 return m->llmnr_ipv6_udp_fd;
1405
1406 fail:
1407 m->llmnr_ipv6_udp_fd = safe_close(m->llmnr_ipv6_udp_fd);
1408 return r;
1409 }
1410
1411 static int on_llmnr_stream_packet(DnsStream *s) {
1412 assert(s);
1413
1414 if (dns_packet_validate_query(s->read_packet) > 0) {
1415 Link *l;
1416
1417 l = hashmap_get(s->manager->links, INT_TO_PTR(s->read_packet->ifindex));
1418 if (l) {
1419 DnsScope *scope = NULL;
1420
1421 if (s->read_packet->family == AF_INET)
1422 scope = l->llmnr_ipv4_scope;
1423 else if (s->read_packet->family == AF_INET6)
1424 scope = l->llmnr_ipv6_scope;
1425
1426 if (scope) {
1427 dns_scope_process_query(scope, s, s->read_packet);
1428
1429 /* If no reply packet was set, we free the stream */
1430 if (s->write_packet)
1431 return 0;
1432 }
1433 }
1434 }
1435
1436 dns_stream_free(s);
1437 return 0;
1438 }
1439
1440 static int on_llmnr_stream(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1441 DnsStream *stream;
1442 Manager *m = userdata;
1443 int cfd, r;
1444
1445 cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
1446 if (cfd < 0) {
1447 if (errno == EAGAIN || errno == EINTR)
1448 return 0;
1449
1450 return -errno;
1451 }
1452
1453 r = dns_stream_new(m, &stream, DNS_PROTOCOL_LLMNR, cfd);
1454 if (r < 0) {
1455 safe_close(cfd);
1456 return r;
1457 }
1458
1459 stream->on_packet = on_llmnr_stream_packet;
1460 return 0;
1461 }
1462
1463 int manager_llmnr_ipv4_tcp_fd(Manager *m) {
1464 union sockaddr_union sa = {
1465 .in.sin_family = AF_INET,
1466 .in.sin_port = htobe16(5355),
1467 };
1468 static const int one = 1, pmtu = IP_PMTUDISC_DONT;
1469 int r;
1470
1471 assert(m);
1472
1473 if (m->llmnr_ipv4_tcp_fd >= 0)
1474 return m->llmnr_ipv4_tcp_fd;
1475
1476 m->llmnr_ipv4_tcp_fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1477 if (m->llmnr_ipv4_tcp_fd < 0)
1478 return -errno;
1479
1480 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1481 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_TTL, &one, sizeof(one));
1482 if (r < 0) {
1483 r = -errno;
1484 goto fail;
1485 }
1486
1487 r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1488 if (r < 0) {
1489 r = -errno;
1490 goto fail;
1491 }
1492
1493 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1494 if (r < 0) {
1495 r = -errno;
1496 goto fail;
1497 }
1498
1499 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1500 if (r < 0) {
1501 r = -errno;
1502 goto fail;
1503 }
1504
1505 /* Disable Don't-Fragment bit in the IP header */
1506 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1507 if (r < 0) {
1508 r = -errno;
1509 goto fail;
1510 }
1511
1512 r = bind(m->llmnr_ipv4_tcp_fd, &sa.sa, sizeof(sa.in));
1513 if (r < 0) {
1514 r = -errno;
1515 goto fail;
1516 }
1517
1518 r = listen(m->llmnr_ipv4_tcp_fd, SOMAXCONN);
1519 if (r < 0) {
1520 r = -errno;
1521 goto fail;
1522 }
1523
1524 r = sd_event_add_io(m->event, &m->llmnr_ipv4_tcp_event_source, m->llmnr_ipv4_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1525 if (r < 0)
1526 goto fail;
1527
1528 return m->llmnr_ipv4_tcp_fd;
1529
1530 fail:
1531 m->llmnr_ipv4_tcp_fd = safe_close(m->llmnr_ipv4_tcp_fd);
1532 return r;
1533 }
1534
1535 int manager_llmnr_ipv6_tcp_fd(Manager *m) {
1536 union sockaddr_union sa = {
1537 .in6.sin6_family = AF_INET6,
1538 .in6.sin6_port = htobe16(5355),
1539 };
1540 static const int one = 1;
1541 int r;
1542
1543 assert(m);
1544
1545 if (m->llmnr_ipv6_tcp_fd >= 0)
1546 return m->llmnr_ipv6_tcp_fd;
1547
1548 m->llmnr_ipv6_tcp_fd = socket(AF_INET6, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1549 if (m->llmnr_ipv6_tcp_fd < 0)
1550 return -errno;
1551
1552 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1553 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &one, sizeof(one));
1554 if (r < 0) {
1555 r = -errno;
1556 goto fail;
1557 }
1558
1559 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1560 if (r < 0) {
1561 r = -errno;
1562 goto fail;
1563 }
1564
1565 r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1566 if (r < 0) {
1567 r = -errno;
1568 goto fail;
1569 }
1570
1571 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1572 if (r < 0) {
1573 r = -errno;
1574 goto fail;
1575 }
1576
1577 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1578 if (r < 0) {
1579 r = -errno;
1580 goto fail;
1581 }
1582
1583 r = bind(m->llmnr_ipv6_tcp_fd, &sa.sa, sizeof(sa.in6));
1584 if (r < 0) {
1585 r = -errno;
1586 goto fail;
1587 }
1588
1589 r = listen(m->llmnr_ipv6_tcp_fd, SOMAXCONN);
1590 if (r < 0) {
1591 r = -errno;
1592 goto fail;
1593 }
1594
1595 r = sd_event_add_io(m->event, &m->llmnr_ipv6_tcp_event_source, m->llmnr_ipv6_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1596 if (r < 0) {
1597 r = -errno;
1598 goto fail;
1599 }
1600
1601 return m->llmnr_ipv6_tcp_fd;
1602
1603 fail:
1604 m->llmnr_ipv6_tcp_fd = safe_close(m->llmnr_ipv6_tcp_fd);
1605 return r;
1606 }
1607
1608 int manager_ifindex_is_loopback(Manager *m, int ifindex) {
1609 Link *l;
1610 assert(m);
1611
1612 if (ifindex <= 0)
1613 return -EINVAL;
1614
1615 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
1616 if (l->flags & IFF_LOOPBACK)
1617 return 1;
1618
1619 return 0;
1620 }
1621
1622 int manager_find_ifindex(Manager *m, int family, const union in_addr_union *in_addr) {
1623 LinkAddress *a;
1624
1625 assert(m);
1626
1627 a = manager_find_link_address(m, family, in_addr);
1628 if (a)
1629 return a->link->ifindex;
1630
1631 return 0;
1632 }
1633
1634 void manager_refresh_rrs(Manager *m) {
1635 Iterator i;
1636 Link *l;
1637
1638 assert(m);
1639
1640 m->host_ipv4_key = dns_resource_key_unref(m->host_ipv4_key);
1641 m->host_ipv6_key = dns_resource_key_unref(m->host_ipv6_key);
1642
1643 HASHMAP_FOREACH(l, m->links, i) {
1644 link_add_rrs(l, true);
1645 link_add_rrs(l, false);
1646 }
1647 }
1648
1649 int manager_next_hostname(Manager *m) {
1650 const char *p;
1651 uint64_t u;
1652 char *h;
1653
1654 assert(m);
1655
1656 p = strchr(m->hostname, 0);
1657 assert(p);
1658
1659 while (p > m->hostname) {
1660 if (!strchr("0123456789", p[-1]))
1661 break;
1662
1663 p--;
1664 }
1665
1666 if (*p == 0 || safe_atou64(p, &u) < 0 || u <= 0)
1667 u = 1;
1668
1669 u++;
1670
1671 if (asprintf(&h, "%.*s%" PRIu64, (int) (p - m->hostname), m->hostname, u) < 0)
1672 return -ENOMEM;
1673
1674 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m->hostname, h);
1675
1676 free(m->hostname);
1677 m->hostname = h;
1678
1679 manager_refresh_rrs(m);
1680
1681 return 0;
1682 }
1683
1684 LinkAddress* manager_find_link_address(Manager *m, int family, const union in_addr_union *in_addr) {
1685 Iterator i;
1686 Link *l;
1687
1688 assert(m);
1689
1690 HASHMAP_FOREACH(l, m->links, i) {
1691 LinkAddress *a;
1692
1693 a = link_find_address(l, family, in_addr);
1694 if (a)
1695 return a;
1696 }
1697
1698 return NULL;
1699 }
1700
1701 int manager_our_packet(Manager *m, DnsPacket *p) {
1702 assert(m);
1703 assert(p);
1704
1705 return !!manager_find_link_address(m, p->family, &p->sender);
1706 }
1707
1708 static const char* const support_table[_SUPPORT_MAX] = {
1709 [SUPPORT_NO] = "no",
1710 [SUPPORT_YES] = "yes",
1711 [SUPPORT_RESOLVE] = "resolve",
1712 };
1713 DEFINE_STRING_TABLE_LOOKUP(support, Support);