]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/resolve/resolved-manager.c
resolved: unify logic how we flush out DNS servers we learnt
[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 r = link_update_monitor(l);
81 if (r < 0)
82 goto fail;
83
84 if (is_new)
85 log_debug("Found new link %i/%s", ifindex, l->name);
86
87 break;
88 }
89
90 case RTM_DELLINK:
91 if (l) {
92 log_debug("Removing link %i/%s", l->ifindex, l->name);
93 link_free(l);
94 }
95
96 break;
97 }
98
99 return 0;
100
101 fail:
102 log_warning("Failed to process RTNL link message: %s", strerror(-r));
103 return 0;
104 }
105
106 static int manager_process_address(sd_rtnl *rtnl, sd_rtnl_message *mm, void *userdata) {
107 Manager *m = userdata;
108 union in_addr_union address;
109 uint16_t type;
110 int r, ifindex, family;
111 LinkAddress *a;
112 Link *l;
113
114 assert(rtnl);
115 assert(mm);
116 assert(m);
117
118 r = sd_rtnl_message_get_type(mm, &type);
119 if (r < 0)
120 goto fail;
121
122 r = sd_rtnl_message_addr_get_ifindex(mm, &ifindex);
123 if (r < 0)
124 goto fail;
125
126 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
127 if (!l)
128 return 0;
129
130 r = sd_rtnl_message_addr_get_family(mm, &family);
131 if (r < 0)
132 goto fail;
133
134 switch (family) {
135
136 case AF_INET:
137 r = sd_rtnl_message_read_in_addr(mm, IFA_LOCAL, &address.in);
138 if (r < 0) {
139 r = sd_rtnl_message_read_in_addr(mm, IFA_ADDRESS, &address.in);
140 if (r < 0)
141 goto fail;
142 }
143
144 break;
145
146 case AF_INET6:
147 r = sd_rtnl_message_read_in6_addr(mm, IFA_LOCAL, &address.in6);
148 if (r < 0) {
149 r = sd_rtnl_message_read_in6_addr(mm, IFA_ADDRESS, &address.in6);
150 if (r < 0)
151 goto fail;
152 }
153
154 break;
155
156 default:
157 return 0;
158 }
159
160 a = link_find_address(l, family, &address);
161
162 switch (type) {
163
164 case RTM_NEWADDR:
165
166 if (!a) {
167 r = link_address_new(l, &a, family, &address);
168 if (r < 0)
169 return r;
170 }
171
172 r = link_address_update_rtnl(a, mm);
173 if (r < 0)
174 return r;
175
176 break;
177
178 case RTM_DELADDR:
179 if (a)
180 link_address_free(a);
181 break;
182 }
183
184 return 0;
185
186 fail:
187 log_warning("Failed to process RTNL address message: %s", strerror(-r));
188 return 0;
189 }
190
191 static int manager_rtnl_listen(Manager *m) {
192 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL;
193 sd_rtnl_message *i;
194 int r;
195
196 assert(m);
197
198 /* First, subscibe to interfaces coming and going */
199 r = sd_rtnl_open(&m->rtnl, 3, RTNLGRP_LINK, RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV6_IFADDR);
200 if (r < 0)
201 return r;
202
203 r = sd_rtnl_attach_event(m->rtnl, m->event, 0);
204 if (r < 0)
205 return r;
206
207 r = sd_rtnl_add_match(m->rtnl, RTM_NEWLINK, manager_process_link, m);
208 if (r < 0)
209 return r;
210
211 r = sd_rtnl_add_match(m->rtnl, RTM_DELLINK, manager_process_link, m);
212 if (r < 0)
213 return r;
214
215 r = sd_rtnl_add_match(m->rtnl, RTM_NEWADDR, manager_process_address, m);
216 if (r < 0)
217 return r;
218
219 r = sd_rtnl_add_match(m->rtnl, RTM_DELADDR, manager_process_address, m);
220 if (r < 0)
221 return r;
222
223 /* Then, enumerate all links */
224 r = sd_rtnl_message_new_link(m->rtnl, &req, RTM_GETLINK, 0);
225 if (r < 0)
226 return r;
227
228 r = sd_rtnl_message_request_dump(req, true);
229 if (r < 0)
230 return r;
231
232 r = sd_rtnl_call(m->rtnl, req, 0, &reply);
233 if (r < 0)
234 return r;
235
236 for (i = reply; i; i = sd_rtnl_message_next(i)) {
237 r = manager_process_link(m->rtnl, i, m);
238 if (r < 0)
239 return r;
240 }
241
242 req = sd_rtnl_message_unref(req);
243 reply = sd_rtnl_message_unref(reply);
244
245 /* Finally, enumerate all addresses, too */
246 r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, 0, AF_UNSPEC);
247 if (r < 0)
248 return r;
249
250 r = sd_rtnl_message_request_dump(req, true);
251 if (r < 0)
252 return r;
253
254 r = sd_rtnl_call(m->rtnl, req, 0, &reply);
255 if (r < 0)
256 return r;
257
258 for (i = reply; i; i = sd_rtnl_message_next(i)) {
259 r = manager_process_address(m->rtnl, i, m);
260 if (r < 0)
261 return r;
262 }
263
264 return r;
265 }
266
267 static int on_network_event(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
268 Manager *m = userdata;
269 Iterator i;
270 Link *l;
271 int r;
272
273 assert(m);
274
275 sd_network_monitor_flush(m->network_monitor);
276
277 HASHMAP_FOREACH(l, m->links, i) {
278 r = link_update_monitor(l);
279 if (r < 0)
280 log_warning("Failed to update monitor information for %i: %s", l->ifindex, strerror(-r));
281 }
282
283 r = manager_write_resolv_conf(m);
284 if (r < 0)
285 log_warning("Could not update resolv.conf: %s", strerror(-r));
286
287 return 0;
288 }
289
290 static int manager_network_monitor_listen(Manager *m) {
291 int r, fd, events;
292
293 assert(m);
294
295 r = sd_network_monitor_new(&m->network_monitor, NULL);
296 if (r < 0)
297 return r;
298
299 fd = sd_network_monitor_get_fd(m->network_monitor);
300 if (fd < 0)
301 return fd;
302
303 events = sd_network_monitor_get_events(m->network_monitor);
304 if (events < 0)
305 return events;
306
307 r = sd_event_add_io(m->event, &m->network_event_source, fd, events, &on_network_event, m);
308 if (r < 0)
309 return r;
310
311 return 0;
312 }
313
314 static int determine_hostname(char **ret) {
315 _cleanup_free_ char *h = NULL, *n = NULL;
316 int r;
317
318 assert(ret);
319
320 h = gethostname_malloc();
321 if (!h)
322 return log_oom();
323
324 if (!utf8_is_valid(h)) {
325 log_error("System hostname is not UTF-8 clean.");
326 return -EINVAL;
327 }
328
329 r = dns_name_normalize(h, &n);
330 if (r < 0) {
331 log_error("System hostname '%s' cannot be normalized.", h);
332 return r;
333 }
334
335 *ret = n;
336 n = NULL;
337
338 return 0;
339 }
340
341 static int on_hostname_change(sd_event_source *es, int fd, uint32_t revents, void *userdata) {
342 _cleanup_free_ char *h = NULL;
343 Manager *m = userdata;
344 int r;
345
346 assert(m);
347
348 r = determine_hostname(&h);
349 if (r < 0)
350 return 0; /* ignore invalid hostnames */
351
352 if (streq(h, m->hostname))
353 return 0;
354
355 log_info("System hostname changed to '%s'.", h);
356 free(m->hostname);
357 m->hostname = h;
358 h = NULL;
359
360 manager_refresh_rrs(m);
361
362 return 0;
363 }
364
365 static int manager_watch_hostname(Manager *m) {
366 int r;
367
368 assert(m);
369
370 m->hostname_fd = open("/proc/sys/kernel/hostname", O_RDONLY|O_CLOEXEC|O_NDELAY|O_NOCTTY);
371 if (m->hostname_fd < 0) {
372 log_warning("Failed to watch hostname: %m");
373 return 0;
374 }
375
376 r = sd_event_add_io(m->event, &m->hostname_event_source, m->hostname_fd, 0, on_hostname_change, m);
377 if (r < 0) {
378 if (r == -EPERM)
379 /* kernels prior to 3.2 don't support polling this file. Ignore the failure. */
380 m->hostname_fd = safe_close(m->hostname_fd);
381 else {
382 log_error("Failed to add hostname event source: %s", strerror(-r));
383 return r;
384 }
385 }
386
387 r = determine_hostname(&m->hostname);
388 if (r < 0) {
389 log_info("Defaulting to hostname 'linux'.");
390 m->hostname = strdup("linux");
391 if (!m->hostname)
392 return log_oom();
393 } else
394 log_info("Using system hostname '%s'.", m->hostname);
395
396 return 0;
397 }
398
399 static void manager_llmnr_stop(Manager *m) {
400 assert(m);
401
402 m->llmnr_ipv4_udp_event_source = sd_event_source_unref(m->llmnr_ipv4_udp_event_source);
403 m->llmnr_ipv4_udp_fd = safe_close(m->llmnr_ipv4_udp_fd);
404
405 m->llmnr_ipv6_udp_event_source = sd_event_source_unref(m->llmnr_ipv6_udp_event_source);
406 m->llmnr_ipv6_udp_fd = safe_close(m->llmnr_ipv6_udp_fd);
407
408 m->llmnr_ipv4_tcp_event_source = sd_event_source_unref(m->llmnr_ipv4_tcp_event_source);
409 m->llmnr_ipv4_tcp_fd = safe_close(m->llmnr_ipv4_tcp_fd);
410
411 m->llmnr_ipv6_tcp_event_source = sd_event_source_unref(m->llmnr_ipv6_tcp_event_source);
412 m->llmnr_ipv6_tcp_fd = safe_close(m->llmnr_ipv6_tcp_fd);
413 }
414
415 static int manager_llmnr_start(Manager *m) {
416 int r;
417
418 assert(m);
419
420 if (m->llmnr_support == SUPPORT_NO)
421 return 0;
422
423 r = manager_llmnr_ipv4_udp_fd(m);
424 if (r == -EADDRINUSE)
425 goto eaddrinuse;
426 if (r < 0)
427 return r;
428
429 r = manager_llmnr_ipv6_udp_fd(m);
430 if (r == -EADDRINUSE)
431 goto eaddrinuse;
432 if (r < 0)
433 return r;
434
435 r = manager_llmnr_ipv4_tcp_fd(m);
436 if (r == -EADDRINUSE)
437 goto eaddrinuse;
438 if (r < 0)
439 return r;
440
441 r = manager_llmnr_ipv6_tcp_fd(m);
442 if (r == -EADDRINUSE)
443 goto eaddrinuse;
444 if (r < 0)
445 return r;
446
447 return 0;
448
449 eaddrinuse:
450 log_warning("There appears to be another LLMNR respondering running. Turning off LLMNR support.");
451 m->llmnr_support = SUPPORT_NO;
452 manager_llmnr_stop(m);
453 return 0;
454 }
455
456 int manager_new(Manager **ret) {
457 _cleanup_(manager_freep) Manager *m = NULL;
458 int r;
459
460 assert(ret);
461
462 m = new0(Manager, 1);
463 if (!m)
464 return -ENOMEM;
465
466 m->dns_ipv4_fd = m->dns_ipv6_fd = -1;
467 m->llmnr_ipv4_udp_fd = m->llmnr_ipv6_udp_fd = -1;
468 m->llmnr_ipv4_tcp_fd = m->llmnr_ipv6_tcp_fd = -1;
469 m->hostname_fd = -1;
470
471 m->llmnr_support = SUPPORT_YES;
472 m->read_resolv_conf = true;
473
474 r = manager_parse_dns_server(m, DNS_SERVER_FALLBACK, DNS_SERVERS);
475 if (r < 0)
476 return r;
477
478 r = sd_event_default(&m->event);
479 if (r < 0)
480 return r;
481
482 sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
483 sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
484
485 sd_event_set_watchdog(m->event, true);
486
487 r = manager_watch_hostname(m);
488 if (r < 0)
489 return r;
490
491 r = dns_scope_new(m, &m->unicast_scope, NULL, DNS_PROTOCOL_DNS, AF_UNSPEC);
492 if (r < 0)
493 return r;
494
495 r = manager_network_monitor_listen(m);
496 if (r < 0)
497 return r;
498
499 r = manager_rtnl_listen(m);
500 if (r < 0)
501 return r;
502
503 r = manager_connect_bus(m);
504 if (r < 0)
505 return r;
506
507 *ret = m;
508 m = NULL;
509
510 return 0;
511 }
512
513 int manager_start(Manager *m) {
514 int r;
515
516 assert(m);
517
518 r = manager_llmnr_start(m);
519 if (r < 0)
520 return r;
521
522 return 0;
523 }
524
525 Manager *manager_free(Manager *m) {
526 Link *l;
527
528 if (!m)
529 return NULL;
530
531 while ((l = hashmap_first(m->links)))
532 link_free(l);
533
534 while (m->dns_queries)
535 dns_query_free(m->dns_queries);
536
537 dns_scope_free(m->unicast_scope);
538
539 manager_flush_dns_servers(m, DNS_SERVER_SYSTEM);
540 manager_flush_dns_servers(m, DNS_SERVER_FALLBACK);
541
542 hashmap_free(m->links);
543 hashmap_free(m->dns_transactions);
544
545 sd_event_source_unref(m->network_event_source);
546 sd_network_monitor_unref(m->network_monitor);
547
548 sd_event_source_unref(m->dns_ipv4_event_source);
549 sd_event_source_unref(m->dns_ipv6_event_source);
550 safe_close(m->dns_ipv4_fd);
551 safe_close(m->dns_ipv6_fd);
552
553 manager_llmnr_stop(m);
554
555 sd_bus_slot_unref(m->prepare_for_sleep_slot);
556 sd_event_source_unref(m->bus_retry_event_source);
557 sd_bus_unref(m->bus);
558
559 sd_event_unref(m->event);
560
561 dns_resource_key_unref(m->host_ipv4_key);
562 dns_resource_key_unref(m->host_ipv6_key);
563
564 safe_close(m->hostname_fd);
565 sd_event_source_unref(m->hostname_event_source);
566 free(m->hostname);
567
568 free(m);
569
570 return NULL;
571 }
572
573 int manager_read_resolv_conf(Manager *m) {
574 _cleanup_fclose_ FILE *f = NULL;
575 struct stat st, own;
576 char line[LINE_MAX];
577 DnsServer *s, *nx;
578 usec_t t;
579 int r;
580
581 assert(m);
582
583 /* Reads the system /etc/resolv.conf, if it exists and is not
584 * symlinked to our own resolv.conf instance */
585
586 if (!m->read_resolv_conf)
587 return 0;
588
589 r = stat("/etc/resolv.conf", &st);
590 if (r < 0) {
591 if (errno != ENOENT)
592 log_warning("Failed to open /etc/resolv.conf: %m");
593 r = -errno;
594 goto clear;
595 }
596
597 /* Have we already seen the file? */
598 t = timespec_load(&st.st_mtim);
599 if (t == m->resolv_conf_mtime)
600 return 0;
601
602 m->resolv_conf_mtime = t;
603
604 /* Is it symlinked to our own file? */
605 if (stat("/run/systemd/resolve/resolv.conf", &own) >= 0 &&
606 st.st_dev == own.st_dev &&
607 st.st_ino == own.st_ino) {
608 r = 0;
609 goto clear;
610 }
611
612 f = fopen("/etc/resolv.conf", "re");
613 if (!f) {
614 if (errno != ENOENT)
615 log_warning("Failed to open /etc/resolv.conf: %m");
616 r = -errno;
617 goto clear;
618 }
619
620 if (fstat(fileno(f), &st) < 0) {
621 log_error("Failed to stat open file: %m");
622 r = -errno;
623 goto clear;
624 }
625
626 LIST_FOREACH(servers, s, m->dns_servers)
627 s->marked = true;
628
629 FOREACH_LINE(line, f, r = -errno; goto clear) {
630 union in_addr_union address;
631 int family;
632 char *l;
633 const char *a;
634
635 truncate_nl(line);
636
637 l = strstrip(line);
638 if (*l == '#' || *l == ';')
639 continue;
640
641 a = first_word(l, "nameserver");
642 if (!a)
643 continue;
644
645 r = in_addr_from_string_auto(a, &family, &address);
646 if (r < 0) {
647 log_warning("Failed to parse name server %s.", a);
648 continue;
649 }
650
651 LIST_FOREACH(servers, s, m->dns_servers)
652 if (s->family == family && in_addr_equal(family, &s->address, &address) > 0)
653 break;
654
655 if (s)
656 s->marked = false;
657 else {
658 r = dns_server_new(m, NULL, DNS_SERVER_SYSTEM, NULL, family, &address);
659 if (r < 0)
660 goto clear;
661 }
662 }
663
664 LIST_FOREACH_SAFE(servers, s, nx, m->dns_servers)
665 if (s->marked)
666 dns_server_free(s);
667
668 return 0;
669
670 clear:
671 while (m->dns_servers)
672 dns_server_free(m->dns_servers);
673
674 return r;
675 }
676
677 static void write_resolve_conf_server(DnsServer *s, FILE *f, unsigned *count) {
678 _cleanup_free_ char *t = NULL;
679 int r;
680
681 assert(s);
682 assert(f);
683 assert(count);
684
685 r = in_addr_to_string(s->family, &s->address, &t);
686 if (r < 0) {
687 log_warning("Invalid DNS address. Ignoring: %s", strerror(-r));
688 return;
689 }
690
691 if (*count == MAXNS)
692 fputs("# Too many DNS servers configured, the following entries may be ignored.\n", f);
693
694 fprintf(f, "nameserver %s\n", t);
695 (*count) ++;
696 }
697
698 int manager_write_resolv_conf(Manager *m) {
699 static const char path[] = "/run/systemd/resolve/resolv.conf";
700 _cleanup_free_ char *temp_path = NULL;
701 _cleanup_fclose_ FILE *f = NULL;
702 _cleanup_set_free_ Set *dns = NULL;
703 unsigned count = 0;
704 DnsServer *s;
705 Iterator i;
706 Link *l;
707 int r;
708
709 assert(m);
710
711 /* Read the system /etc/resolv.conf first */
712 manager_read_resolv_conf(m);
713
714 /* Add the full list to a set, to filter out duplicates */
715 dns = set_new(dns_server_hash_func, dns_server_compare_func);
716 if (!dns)
717 return -ENOMEM;
718
719 /* First add the system-wide servers */
720 LIST_FOREACH(servers, s, m->dns_servers) {
721 r = set_put(dns, s);
722 if (r == -EEXIST)
723 continue;
724 if (r < 0)
725 return r;
726 }
727
728 /* Then, add the per-link servers */
729 HASHMAP_FOREACH(l, m->links, i)
730 LIST_FOREACH(servers, s, l->dns_servers) {
731 r = set_put(dns, s);
732 if (r == -EEXIST)
733 continue;
734 if (r < 0)
735 return r;
736 }
737
738 /* If we found nothing, add the fallback servers */
739 if (set_isempty(dns)) {
740 LIST_FOREACH(servers, s, m->fallback_dns_servers) {
741 r = set_put(dns, s);
742 if (r == -EEXIST)
743 continue;
744 if (r < 0)
745 return r;
746 }
747 }
748
749 r = fopen_temporary(path, &f, &temp_path);
750 if (r < 0)
751 return r;
752
753 fchmod(fileno(f), 0644);
754
755 fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
756 "# Third party programs must not access this file directly, but\n"
757 "# only through the symlink at /etc/resolv.conf. To manage\n"
758 "# resolv.conf(5) in a different way, replace the symlink by a\n"
759 "# static file or a different symlink.\n\n", f);
760
761 if (set_isempty(dns))
762 fputs("# No DNS servers known.\n", f);
763 else {
764 SET_FOREACH(s, dns, i)
765 write_resolve_conf_server(s, f, &count);
766 }
767
768 r = fflush_and_check(f);
769 if (r < 0)
770 goto fail;
771
772 if (rename(temp_path, path) < 0) {
773 r = -errno;
774 goto fail;
775 }
776
777 return 0;
778
779 fail:
780 unlink(path);
781 unlink(temp_path);
782 return r;
783 }
784
785 int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) {
786 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
787 union {
788 struct cmsghdr header; /* For alignment */
789 uint8_t buffer[CMSG_SPACE(MAX(sizeof(struct in_pktinfo), sizeof(struct in6_pktinfo)))
790 + CMSG_SPACE(int) /* ttl/hoplimit */
791 + EXTRA_CMSG_SPACE /* kernel appears to require extra buffer space */];
792 } control;
793 union sockaddr_union sa;
794 struct msghdr mh = {};
795 struct cmsghdr *cmsg;
796 struct iovec iov;
797 int ms = 0, r;
798 ssize_t l;
799
800 assert(m);
801 assert(fd >= 0);
802 assert(ret);
803
804 r = ioctl(fd, FIONREAD, &ms);
805 if (r < 0)
806 return -errno;
807 if (ms < 0)
808 return -EIO;
809
810 r = dns_packet_new(&p, protocol, ms);
811 if (r < 0)
812 return r;
813
814 iov.iov_base = DNS_PACKET_DATA(p);
815 iov.iov_len = p->allocated;
816
817 mh.msg_name = &sa.sa;
818 mh.msg_namelen = sizeof(sa);
819 mh.msg_iov = &iov;
820 mh.msg_iovlen = 1;
821 mh.msg_control = &control;
822 mh.msg_controllen = sizeof(control);
823
824 l = recvmsg(fd, &mh, 0);
825 if (l < 0) {
826 if (errno == EAGAIN || errno == EINTR)
827 return 0;
828
829 return -errno;
830 }
831
832 if (l <= 0)
833 return -EIO;
834
835 assert(!(mh.msg_flags & MSG_CTRUNC));
836 assert(!(mh.msg_flags & MSG_TRUNC));
837
838 p->size = (size_t) l;
839
840 p->family = sa.sa.sa_family;
841 p->ipproto = IPPROTO_UDP;
842 if (p->family == AF_INET) {
843 p->sender.in = sa.in.sin_addr;
844 p->sender_port = be16toh(sa.in.sin_port);
845 } else if (p->family == AF_INET6) {
846 p->sender.in6 = sa.in6.sin6_addr;
847 p->sender_port = be16toh(sa.in6.sin6_port);
848 p->ifindex = sa.in6.sin6_scope_id;
849 } else
850 return -EAFNOSUPPORT;
851
852 for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
853
854 if (cmsg->cmsg_level == IPPROTO_IPV6) {
855 assert(p->family == AF_INET6);
856
857 switch (cmsg->cmsg_type) {
858
859 case IPV6_PKTINFO: {
860 struct in6_pktinfo *i = (struct in6_pktinfo*) CMSG_DATA(cmsg);
861
862 if (p->ifindex <= 0)
863 p->ifindex = i->ipi6_ifindex;
864
865 p->destination.in6 = i->ipi6_addr;
866 break;
867 }
868
869 case IPV6_HOPLIMIT:
870 p->ttl = *(int *) CMSG_DATA(cmsg);
871 break;
872
873 }
874 } else if (cmsg->cmsg_level == IPPROTO_IP) {
875 assert(p->family == AF_INET);
876
877 switch (cmsg->cmsg_type) {
878
879 case IP_PKTINFO: {
880 struct in_pktinfo *i = (struct in_pktinfo*) CMSG_DATA(cmsg);
881
882 if (p->ifindex <= 0)
883 p->ifindex = i->ipi_ifindex;
884
885 p->destination.in = i->ipi_addr;
886 break;
887 }
888
889 case IP_TTL:
890 p->ttl = *(int *) CMSG_DATA(cmsg);
891 break;
892 }
893 }
894 }
895
896 /* The Linux kernel sets the interface index to the loopback
897 * device if the packet came from the local host since it
898 * avoids the routing table in such a case. Let's unset the
899 * interface index in such a case. */
900 if (p->ifindex > 0 && manager_ifindex_is_loopback(m, p->ifindex) != 0)
901 p->ifindex = 0;
902
903 /* If we don't know the interface index still, we look for the
904 * first local interface with a matching address. Yuck! */
905 if (p->ifindex <= 0)
906 p->ifindex = manager_find_ifindex(m, p->family, &p->destination);
907
908 *ret = p;
909 p = NULL;
910
911 return 1;
912 }
913
914 static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
915 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
916 DnsTransaction *t = NULL;
917 Manager *m = userdata;
918 int r;
919
920 r = manager_recv(m, fd, DNS_PROTOCOL_DNS, &p);
921 if (r <= 0)
922 return r;
923
924 if (dns_packet_validate_reply(p) > 0) {
925 t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
926 if (!t)
927 return 0;
928
929 dns_transaction_process_reply(t, p);
930
931 } else
932 log_debug("Invalid DNS packet.");
933
934 return 0;
935 }
936
937 int manager_dns_ipv4_fd(Manager *m) {
938 const int one = 1;
939 int r;
940
941 assert(m);
942
943 if (m->dns_ipv4_fd >= 0)
944 return m->dns_ipv4_fd;
945
946 m->dns_ipv4_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
947 if (m->dns_ipv4_fd < 0)
948 return -errno;
949
950 r = setsockopt(m->dns_ipv4_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
951 if (r < 0) {
952 r = -errno;
953 goto fail;
954 }
955
956 r = sd_event_add_io(m->event, &m->dns_ipv4_event_source, m->dns_ipv4_fd, EPOLLIN, on_dns_packet, m);
957 if (r < 0)
958 goto fail;
959
960 return m->dns_ipv4_fd;
961
962 fail:
963 m->dns_ipv4_fd = safe_close(m->dns_ipv4_fd);
964 return r;
965 }
966
967 int manager_dns_ipv6_fd(Manager *m) {
968 const int one = 1;
969 int r;
970
971 assert(m);
972
973 if (m->dns_ipv6_fd >= 0)
974 return m->dns_ipv6_fd;
975
976 m->dns_ipv6_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
977 if (m->dns_ipv6_fd < 0)
978 return -errno;
979
980 r = setsockopt(m->dns_ipv6_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
981 if (r < 0) {
982 r = -errno;
983 goto fail;
984 }
985
986 r = sd_event_add_io(m->event, &m->dns_ipv6_event_source, m->dns_ipv6_fd, EPOLLIN, on_dns_packet, m);
987 if (r < 0)
988 goto fail;
989
990 return m->dns_ipv6_fd;
991
992 fail:
993 m->dns_ipv6_fd = safe_close(m->dns_ipv6_fd);
994 return r;
995 }
996
997 static int sendmsg_loop(int fd, struct msghdr *mh, int flags) {
998 int r;
999
1000 assert(fd >= 0);
1001 assert(mh);
1002
1003 for (;;) {
1004 if (sendmsg(fd, mh, flags) >= 0)
1005 return 0;
1006
1007 if (errno == EINTR)
1008 continue;
1009
1010 if (errno != EAGAIN)
1011 return -errno;
1012
1013 r = fd_wait_for_event(fd, POLLOUT, SEND_TIMEOUT_USEC);
1014 if (r < 0)
1015 return r;
1016 if (r == 0)
1017 return -ETIMEDOUT;
1018 }
1019 }
1020
1021 static int manager_ipv4_send(Manager *m, int fd, int ifindex, const struct in_addr *addr, uint16_t port, DnsPacket *p) {
1022 union sockaddr_union sa = {
1023 .in.sin_family = AF_INET,
1024 };
1025 union {
1026 struct cmsghdr header; /* For alignment */
1027 uint8_t buffer[CMSG_SPACE(sizeof(struct in_pktinfo))];
1028 } control;
1029 struct msghdr mh = {};
1030 struct iovec iov;
1031
1032 assert(m);
1033 assert(fd >= 0);
1034 assert(addr);
1035 assert(port > 0);
1036 assert(p);
1037
1038 iov.iov_base = DNS_PACKET_DATA(p);
1039 iov.iov_len = p->size;
1040
1041 sa.in.sin_addr = *addr;
1042 sa.in.sin_port = htobe16(port),
1043
1044 mh.msg_iov = &iov;
1045 mh.msg_iovlen = 1;
1046 mh.msg_name = &sa.sa;
1047 mh.msg_namelen = sizeof(sa.in);
1048
1049 if (ifindex > 0) {
1050 struct cmsghdr *cmsg;
1051 struct in_pktinfo *pi;
1052
1053 zero(control);
1054
1055 mh.msg_control = &control;
1056 mh.msg_controllen = CMSG_LEN(sizeof(struct in_pktinfo));
1057
1058 cmsg = CMSG_FIRSTHDR(&mh);
1059 cmsg->cmsg_len = mh.msg_controllen;
1060 cmsg->cmsg_level = IPPROTO_IP;
1061 cmsg->cmsg_type = IP_PKTINFO;
1062
1063 pi = (struct in_pktinfo*) CMSG_DATA(cmsg);
1064 pi->ipi_ifindex = ifindex;
1065 }
1066
1067 return sendmsg_loop(fd, &mh, 0);
1068 }
1069
1070 static int manager_ipv6_send(Manager *m, int fd, int ifindex, const struct in6_addr *addr, uint16_t port, DnsPacket *p) {
1071 union sockaddr_union sa = {
1072 .in6.sin6_family = AF_INET6,
1073 };
1074 union {
1075 struct cmsghdr header; /* For alignment */
1076 uint8_t buffer[CMSG_SPACE(sizeof(struct in6_pktinfo))];
1077 } control;
1078 struct msghdr mh = {};
1079 struct iovec iov;
1080
1081 assert(m);
1082 assert(fd >= 0);
1083 assert(addr);
1084 assert(port > 0);
1085 assert(p);
1086
1087 iov.iov_base = DNS_PACKET_DATA(p);
1088 iov.iov_len = p->size;
1089
1090 sa.in6.sin6_addr = *addr;
1091 sa.in6.sin6_port = htobe16(port),
1092 sa.in6.sin6_scope_id = ifindex;
1093
1094 mh.msg_iov = &iov;
1095 mh.msg_iovlen = 1;
1096 mh.msg_name = &sa.sa;
1097 mh.msg_namelen = sizeof(sa.in6);
1098
1099 if (ifindex > 0) {
1100 struct cmsghdr *cmsg;
1101 struct in6_pktinfo *pi;
1102
1103 zero(control);
1104
1105 mh.msg_control = &control;
1106 mh.msg_controllen = CMSG_LEN(sizeof(struct in6_pktinfo));
1107
1108 cmsg = CMSG_FIRSTHDR(&mh);
1109 cmsg->cmsg_len = mh.msg_controllen;
1110 cmsg->cmsg_level = IPPROTO_IPV6;
1111 cmsg->cmsg_type = IPV6_PKTINFO;
1112
1113 pi = (struct in6_pktinfo*) CMSG_DATA(cmsg);
1114 pi->ipi6_ifindex = ifindex;
1115 }
1116
1117 return sendmsg_loop(fd, &mh, 0);
1118 }
1119
1120 int manager_send(Manager *m, int fd, int ifindex, int family, const union in_addr_union *addr, uint16_t port, DnsPacket *p) {
1121 assert(m);
1122 assert(fd >= 0);
1123 assert(addr);
1124 assert(port > 0);
1125 assert(p);
1126
1127 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));
1128
1129 if (family == AF_INET)
1130 return manager_ipv4_send(m, fd, ifindex, &addr->in, port, p);
1131 else if (family == AF_INET6)
1132 return manager_ipv6_send(m, fd, ifindex, &addr->in6, port, p);
1133
1134 return -EAFNOSUPPORT;
1135 }
1136
1137 DnsServer* manager_find_dns_server(Manager *m, int family, const union in_addr_union *in_addr) {
1138 DnsServer *s;
1139
1140 assert(m);
1141 assert(in_addr);
1142
1143 LIST_FOREACH(servers, s, m->dns_servers)
1144 if (s->family == family && in_addr_equal(family, &s->address, in_addr) > 0)
1145 return s;
1146
1147 LIST_FOREACH(servers, s, m->fallback_dns_servers)
1148 if (s->family == family && in_addr_equal(family, &s->address, in_addr) > 0)
1149 return s;
1150
1151 return NULL;
1152 }
1153
1154 DnsServer *manager_set_dns_server(Manager *m, DnsServer *s) {
1155 assert(m);
1156
1157 if (m->current_dns_server == s)
1158 return s;
1159
1160 if (s) {
1161 _cleanup_free_ char *ip = NULL;
1162
1163 in_addr_to_string(s->family, &s->address, &ip);
1164 log_info("Switching to system DNS server %s.", strna(ip));
1165 }
1166
1167 m->current_dns_server = s;
1168
1169 if (m->unicast_scope)
1170 dns_cache_flush(&m->unicast_scope->cache);
1171
1172 return s;
1173 }
1174
1175 DnsServer *manager_get_dns_server(Manager *m) {
1176 Link *l;
1177 assert(m);
1178
1179 /* Try to read updates resolv.conf */
1180 manager_read_resolv_conf(m);
1181
1182 if (!m->current_dns_server)
1183 manager_set_dns_server(m, m->dns_servers);
1184
1185 if (!m->current_dns_server) {
1186 bool found = false;
1187 Iterator i;
1188
1189 /* No DNS servers configured, let's see if there are
1190 * any on any links. If not, we use the fallback
1191 * servers */
1192
1193 HASHMAP_FOREACH(l, m->links, i)
1194 if (l->dns_servers) {
1195 found = true;
1196 break;
1197 }
1198
1199 if (!found)
1200 manager_set_dns_server(m, m->fallback_dns_servers);
1201 }
1202
1203 return m->current_dns_server;
1204 }
1205
1206 void manager_next_dns_server(Manager *m) {
1207 assert(m);
1208
1209 /* If there's currently no DNS server set, then the next
1210 * manager_get_dns_server() will find one */
1211 if (!m->current_dns_server)
1212 return;
1213
1214 /* Change to the next one */
1215 if (m->current_dns_server->servers_next) {
1216 manager_set_dns_server(m, m->current_dns_server->servers_next);
1217 return;
1218 }
1219
1220 /* If there was no next one, then start from the beginning of
1221 * the list */
1222 if (m->current_dns_server->type == DNS_SERVER_FALLBACK)
1223 manager_set_dns_server(m, m->fallback_dns_servers);
1224 else
1225 manager_set_dns_server(m, m->dns_servers);
1226 }
1227
1228 uint32_t manager_find_mtu(Manager *m) {
1229 uint32_t mtu = 0;
1230 Link *l;
1231 Iterator i;
1232
1233 /* If we don't know on which link a DNS packet would be
1234 * delivered, let's find the largest MTU that works on all
1235 * interfaces we know of */
1236
1237 HASHMAP_FOREACH(l, m->links, i) {
1238 if (l->mtu <= 0)
1239 continue;
1240
1241 if (mtu <= 0 || l->mtu < mtu)
1242 mtu = l->mtu;
1243 }
1244
1245 return mtu;
1246 }
1247
1248 static int on_llmnr_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1249 _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
1250 DnsTransaction *t = NULL;
1251 Manager *m = userdata;
1252 DnsScope *scope;
1253 int r;
1254
1255 r = manager_recv(m, fd, DNS_PROTOCOL_LLMNR, &p);
1256 if (r <= 0)
1257 return r;
1258
1259 scope = manager_find_scope(m, p);
1260 if (!scope) {
1261 log_warning("Got LLMNR UDP packet on unknown scope. Ignoring.");
1262 return 0;
1263 }
1264
1265 if (dns_packet_validate_reply(p) > 0) {
1266 log_debug("Got reply packet for id %u", DNS_PACKET_ID(p));
1267
1268 dns_scope_check_conflicts(scope, p);
1269
1270 t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
1271 if (t)
1272 dns_transaction_process_reply(t, p);
1273
1274 } else if (dns_packet_validate_query(p) > 0) {
1275 log_debug("Got query packet for id %u", DNS_PACKET_ID(p));
1276
1277 dns_scope_process_query(scope, NULL, p);
1278 } else
1279 log_debug("Invalid LLMNR UDP packet.");
1280
1281 return 0;
1282 }
1283
1284 int manager_llmnr_ipv4_udp_fd(Manager *m) {
1285 union sockaddr_union sa = {
1286 .in.sin_family = AF_INET,
1287 .in.sin_port = htobe16(5355),
1288 };
1289 static const int one = 1, pmtu = IP_PMTUDISC_DONT, ttl = 255;
1290 int r;
1291
1292 assert(m);
1293
1294 if (m->llmnr_ipv4_udp_fd >= 0)
1295 return m->llmnr_ipv4_udp_fd;
1296
1297 m->llmnr_ipv4_udp_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1298 if (m->llmnr_ipv4_udp_fd < 0)
1299 return -errno;
1300
1301 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1302 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
1303 if (r < 0) {
1304 r = -errno;
1305 goto fail;
1306 }
1307
1308 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
1309 if (r < 0) {
1310 r = -errno;
1311 goto fail;
1312 }
1313
1314 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof(one));
1315 if (r < 0) {
1316 r = -errno;
1317 goto fail;
1318 }
1319
1320 r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1321 if (r < 0) {
1322 r = -errno;
1323 goto fail;
1324 }
1325
1326 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1327 if (r < 0) {
1328 r = -errno;
1329 goto fail;
1330 }
1331
1332 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1333 if (r < 0) {
1334 r = -errno;
1335 goto fail;
1336 }
1337
1338 /* Disable Don't-Fragment bit in the IP header */
1339 r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1340 if (r < 0) {
1341 r = -errno;
1342 goto fail;
1343 }
1344
1345 r = bind(m->llmnr_ipv4_udp_fd, &sa.sa, sizeof(sa.in));
1346 if (r < 0) {
1347 r = -errno;
1348 goto fail;
1349 }
1350
1351 r = sd_event_add_io(m->event, &m->llmnr_ipv4_udp_event_source, m->llmnr_ipv4_udp_fd, EPOLLIN, on_llmnr_packet, m);
1352 if (r < 0)
1353 goto fail;
1354
1355 return m->llmnr_ipv4_udp_fd;
1356
1357 fail:
1358 m->llmnr_ipv4_udp_fd = safe_close(m->llmnr_ipv4_udp_fd);
1359 return r;
1360 }
1361
1362 int manager_llmnr_ipv6_udp_fd(Manager *m) {
1363 union sockaddr_union sa = {
1364 .in6.sin6_family = AF_INET6,
1365 .in6.sin6_port = htobe16(5355),
1366 };
1367 static const int one = 1, ttl = 255;
1368 int r;
1369
1370 assert(m);
1371
1372 if (m->llmnr_ipv6_udp_fd >= 0)
1373 return m->llmnr_ipv6_udp_fd;
1374
1375 m->llmnr_ipv6_udp_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1376 if (m->llmnr_ipv6_udp_fd < 0)
1377 return -errno;
1378
1379 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl));
1380 if (r < 0) {
1381 r = -errno;
1382 goto fail;
1383 }
1384
1385 /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1386 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, sizeof(ttl));
1387 if (r < 0) {
1388 r = -errno;
1389 goto fail;
1390 }
1391
1392 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof(one));
1393 if (r < 0) {
1394 r = -errno;
1395 goto fail;
1396 }
1397
1398 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1399 if (r < 0) {
1400 r = -errno;
1401 goto fail;
1402 }
1403
1404 r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1405 if (r < 0) {
1406 r = -errno;
1407 goto fail;
1408 }
1409
1410 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1411 if (r < 0) {
1412 r = -errno;
1413 goto fail;
1414 }
1415
1416 r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1417 if (r < 0) {
1418 r = -errno;
1419 goto fail;
1420 }
1421
1422 r = bind(m->llmnr_ipv6_udp_fd, &sa.sa, sizeof(sa.in6));
1423 if (r < 0) {
1424 r = -errno;
1425 goto fail;
1426 }
1427
1428 r = sd_event_add_io(m->event, &m->llmnr_ipv6_udp_event_source, m->llmnr_ipv6_udp_fd, EPOLLIN, on_llmnr_packet, m);
1429 if (r < 0) {
1430 r = -errno;
1431 goto fail;
1432 }
1433
1434 return m->llmnr_ipv6_udp_fd;
1435
1436 fail:
1437 m->llmnr_ipv6_udp_fd = safe_close(m->llmnr_ipv6_udp_fd);
1438 return r;
1439 }
1440
1441 static int on_llmnr_stream_packet(DnsStream *s) {
1442 DnsScope *scope;
1443
1444 assert(s);
1445
1446 scope = manager_find_scope(s->manager, s->read_packet);
1447 if (!scope) {
1448 log_warning("Got LLMNR TCP packet on unknown scope. Ignroing.");
1449 return 0;
1450 }
1451
1452 if (dns_packet_validate_query(s->read_packet) > 0) {
1453 log_debug("Got query packet for id %u", DNS_PACKET_ID(s->read_packet));
1454
1455 dns_scope_process_query(scope, s, s->read_packet);
1456
1457 /* If no reply packet was set, we free the stream */
1458 if (s->write_packet)
1459 return 0;
1460 } else
1461 log_debug("Invalid LLMNR TCP packet.");
1462
1463 dns_stream_free(s);
1464 return 0;
1465 }
1466
1467 static int on_llmnr_stream(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1468 DnsStream *stream;
1469 Manager *m = userdata;
1470 int cfd, r;
1471
1472 cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
1473 if (cfd < 0) {
1474 if (errno == EAGAIN || errno == EINTR)
1475 return 0;
1476
1477 return -errno;
1478 }
1479
1480 r = dns_stream_new(m, &stream, DNS_PROTOCOL_LLMNR, cfd);
1481 if (r < 0) {
1482 safe_close(cfd);
1483 return r;
1484 }
1485
1486 stream->on_packet = on_llmnr_stream_packet;
1487 return 0;
1488 }
1489
1490 int manager_llmnr_ipv4_tcp_fd(Manager *m) {
1491 union sockaddr_union sa = {
1492 .in.sin_family = AF_INET,
1493 .in.sin_port = htobe16(5355),
1494 };
1495 static const int one = 1, pmtu = IP_PMTUDISC_DONT;
1496 int r;
1497
1498 assert(m);
1499
1500 if (m->llmnr_ipv4_tcp_fd >= 0)
1501 return m->llmnr_ipv4_tcp_fd;
1502
1503 m->llmnr_ipv4_tcp_fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1504 if (m->llmnr_ipv4_tcp_fd < 0)
1505 return -errno;
1506
1507 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1508 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_TTL, &one, sizeof(one));
1509 if (r < 0) {
1510 r = -errno;
1511 goto fail;
1512 }
1513
1514 r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1515 if (r < 0) {
1516 r = -errno;
1517 goto fail;
1518 }
1519
1520 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1521 if (r < 0) {
1522 r = -errno;
1523 goto fail;
1524 }
1525
1526 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1527 if (r < 0) {
1528 r = -errno;
1529 goto fail;
1530 }
1531
1532 /* Disable Don't-Fragment bit in the IP header */
1533 r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1534 if (r < 0) {
1535 r = -errno;
1536 goto fail;
1537 }
1538
1539 r = bind(m->llmnr_ipv4_tcp_fd, &sa.sa, sizeof(sa.in));
1540 if (r < 0) {
1541 r = -errno;
1542 goto fail;
1543 }
1544
1545 r = listen(m->llmnr_ipv4_tcp_fd, SOMAXCONN);
1546 if (r < 0) {
1547 r = -errno;
1548 goto fail;
1549 }
1550
1551 r = sd_event_add_io(m->event, &m->llmnr_ipv4_tcp_event_source, m->llmnr_ipv4_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1552 if (r < 0)
1553 goto fail;
1554
1555 return m->llmnr_ipv4_tcp_fd;
1556
1557 fail:
1558 m->llmnr_ipv4_tcp_fd = safe_close(m->llmnr_ipv4_tcp_fd);
1559 return r;
1560 }
1561
1562 int manager_llmnr_ipv6_tcp_fd(Manager *m) {
1563 union sockaddr_union sa = {
1564 .in6.sin6_family = AF_INET6,
1565 .in6.sin6_port = htobe16(5355),
1566 };
1567 static const int one = 1;
1568 int r;
1569
1570 assert(m);
1571
1572 if (m->llmnr_ipv6_tcp_fd >= 0)
1573 return m->llmnr_ipv6_tcp_fd;
1574
1575 m->llmnr_ipv6_tcp_fd = socket(AF_INET6, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1576 if (m->llmnr_ipv6_tcp_fd < 0)
1577 return -errno;
1578
1579 /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1580 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &one, sizeof(one));
1581 if (r < 0) {
1582 r = -errno;
1583 goto fail;
1584 }
1585
1586 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1587 if (r < 0) {
1588 r = -errno;
1589 goto fail;
1590 }
1591
1592 r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1593 if (r < 0) {
1594 r = -errno;
1595 goto fail;
1596 }
1597
1598 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1599 if (r < 0) {
1600 r = -errno;
1601 goto fail;
1602 }
1603
1604 r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1605 if (r < 0) {
1606 r = -errno;
1607 goto fail;
1608 }
1609
1610 r = bind(m->llmnr_ipv6_tcp_fd, &sa.sa, sizeof(sa.in6));
1611 if (r < 0) {
1612 r = -errno;
1613 goto fail;
1614 }
1615
1616 r = listen(m->llmnr_ipv6_tcp_fd, SOMAXCONN);
1617 if (r < 0) {
1618 r = -errno;
1619 goto fail;
1620 }
1621
1622 r = sd_event_add_io(m->event, &m->llmnr_ipv6_tcp_event_source, m->llmnr_ipv6_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1623 if (r < 0) {
1624 r = -errno;
1625 goto fail;
1626 }
1627
1628 return m->llmnr_ipv6_tcp_fd;
1629
1630 fail:
1631 m->llmnr_ipv6_tcp_fd = safe_close(m->llmnr_ipv6_tcp_fd);
1632 return r;
1633 }
1634
1635 int manager_ifindex_is_loopback(Manager *m, int ifindex) {
1636 Link *l;
1637 assert(m);
1638
1639 if (ifindex <= 0)
1640 return -EINVAL;
1641
1642 l = hashmap_get(m->links, INT_TO_PTR(ifindex));
1643 if (l->flags & IFF_LOOPBACK)
1644 return 1;
1645
1646 return 0;
1647 }
1648
1649 int manager_find_ifindex(Manager *m, int family, const union in_addr_union *in_addr) {
1650 LinkAddress *a;
1651
1652 assert(m);
1653
1654 a = manager_find_link_address(m, family, in_addr);
1655 if (a)
1656 return a->link->ifindex;
1657
1658 return 0;
1659 }
1660
1661 void manager_refresh_rrs(Manager *m) {
1662 Iterator i;
1663 Link *l;
1664
1665 assert(m);
1666
1667 m->host_ipv4_key = dns_resource_key_unref(m->host_ipv4_key);
1668 m->host_ipv6_key = dns_resource_key_unref(m->host_ipv6_key);
1669
1670 HASHMAP_FOREACH(l, m->links, i) {
1671 link_add_rrs(l, true);
1672 link_add_rrs(l, false);
1673 }
1674 }
1675
1676 int manager_next_hostname(Manager *m) {
1677 const char *p;
1678 uint64_t u, a;
1679 char *h;
1680
1681 assert(m);
1682
1683 p = strchr(m->hostname, 0);
1684 assert(p);
1685
1686 while (p > m->hostname) {
1687 if (!strchr("0123456789", p[-1]))
1688 break;
1689
1690 p--;
1691 }
1692
1693 if (*p == 0 || safe_atou64(p, &u) < 0 || u <= 0)
1694 u = 1;
1695
1696 /* Add a random number to the old value. This way we can avoid
1697 * that two hosts pick the same hostname, win on IPv4 and lose
1698 * on IPv6 (or vice versa), and pick the same hostname
1699 * replacement hostname, ad infinitum. We still want the
1700 * numbers to go up monotonically, hence we just add a random
1701 * value 1..10 */
1702
1703 random_bytes(&a, sizeof(a));
1704 u += 1 + a % 10;
1705
1706 if (asprintf(&h, "%.*s%" PRIu64, (int) (p - m->hostname), m->hostname, u) < 0)
1707 return -ENOMEM;
1708
1709 log_info("Hostname conflict, changing published hostname from '%s' to '%s'.", m->hostname, h);
1710
1711 free(m->hostname);
1712 m->hostname = h;
1713
1714 manager_refresh_rrs(m);
1715
1716 return 0;
1717 }
1718
1719 LinkAddress* manager_find_link_address(Manager *m, int family, const union in_addr_union *in_addr) {
1720 Iterator i;
1721 Link *l;
1722
1723 assert(m);
1724
1725 HASHMAP_FOREACH(l, m->links, i) {
1726 LinkAddress *a;
1727
1728 a = link_find_address(l, family, in_addr);
1729 if (a)
1730 return a;
1731 }
1732
1733 return NULL;
1734 }
1735
1736 bool manager_our_packet(Manager *m, DnsPacket *p) {
1737 assert(m);
1738 assert(p);
1739
1740 return !!manager_find_link_address(m, p->family, &p->sender);
1741 }
1742
1743 DnsScope* manager_find_scope(Manager *m, DnsPacket *p) {
1744 Link *l;
1745
1746 assert(m);
1747 assert(p);
1748
1749 l = hashmap_get(m->links, INT_TO_PTR(p->ifindex));
1750 if (!l)
1751 return NULL;
1752
1753 if (p->protocol == DNS_PROTOCOL_LLMNR) {
1754 if (p->family == AF_INET)
1755 return l->llmnr_ipv4_scope;
1756 else if (p->family == AF_INET6)
1757 return l->llmnr_ipv6_scope;
1758 }
1759
1760 return NULL;
1761 }
1762
1763 void manager_verify_all(Manager *m) {
1764 DnsScope *s;
1765
1766 assert(m);
1767
1768 LIST_FOREACH(scopes, s, m->dns_scopes)
1769 dns_zone_verify_all(&s->zone);
1770 }
1771
1772 void manager_flush_dns_servers(Manager *m, DnsServerType t) {
1773 assert(m);
1774
1775 if (t == DNS_SERVER_SYSTEM)
1776 while (m->dns_servers)
1777 dns_server_free(m->dns_servers);
1778
1779 if (t == DNS_SERVER_FALLBACK)
1780 while (m->fallback_dns_servers)
1781 dns_server_free(m->fallback_dns_servers);
1782 }
1783
1784 static const char* const support_table[_SUPPORT_MAX] = {
1785 [SUPPORT_NO] = "no",
1786 [SUPPORT_YES] = "yes",
1787 [SUPPORT_RESOLVE] = "resolve",
1788 };
1789 DEFINE_STRING_TABLE_LOOKUP(support, Support);