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