chiark / gitweb /
resolved: various fixes regarding encoding of UTF8 characters in DNS RRs
[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 "resolved.h"
37
38 #define SEND_TIMEOUT_USEC (200 * USEC_PER_MSEC)
39
40 static int manager_process_link(sd_rtnl *rtnl, sd_rtnl_message *mm, void *userdata) {
41         Manager *m = userdata;
42         uint16_t type;
43         Link *l;
44         int ifindex, r;
45
46         assert(rtnl);
47         assert(m);
48         assert(mm);
49
50         r = sd_rtnl_message_get_type(mm, &type);
51         if (r < 0)
52                 goto fail;
53
54         r = sd_rtnl_message_link_get_ifindex(mm, &ifindex);
55         if (r < 0)
56                 goto fail;
57
58         l = hashmap_get(m->links, INT_TO_PTR(ifindex));
59
60         switch (type) {
61
62         case RTM_NEWLINK:{
63                 bool is_new = !l;
64
65                 if (!l) {
66                         r = link_new(m, &l, ifindex);
67                         if (r < 0)
68                                 goto fail;
69                 }
70
71                 r = link_update_rtnl(l, mm);
72                 if (r < 0)
73                         goto fail;
74
75                 if (is_new)
76                         log_debug("Found new link %i/%s", ifindex, l->name);
77
78                 break;
79         }
80
81         case RTM_DELLINK:
82                 if (l) {
83                         log_debug("Removing link %i/%s", l->ifindex, l->name);
84                         link_free(l);
85                 }
86
87                 break;
88         }
89
90         return 0;
91
92 fail:
93         log_warning("Failed to process RTNL link message: %s", strerror(-r));
94         return 0;
95 }
96
97 static int manager_process_address(sd_rtnl *rtnl, sd_rtnl_message *mm, void *userdata) {
98         Manager *m = userdata;
99         union in_addr_union address;
100         uint16_t type;
101         int r, ifindex, family;
102         LinkAddress *a;
103         Link *l;
104
105         assert(rtnl);
106         assert(mm);
107         assert(m);
108
109         r = sd_rtnl_message_get_type(mm, &type);
110         if (r < 0)
111                 goto fail;
112
113         r = sd_rtnl_message_addr_get_ifindex(mm, &ifindex);
114         if (r < 0)
115                 goto fail;
116
117         l = hashmap_get(m->links, INT_TO_PTR(ifindex));
118         if (!l)
119                 return 0;
120
121         r = sd_rtnl_message_addr_get_family(mm, &family);
122         if (r < 0)
123                 goto fail;
124
125         switch (family) {
126
127         case AF_INET:
128                 r = sd_rtnl_message_read_in_addr(mm, IFA_LOCAL, &address.in);
129                 if (r < 0) {
130                         r = sd_rtnl_message_read_in_addr(mm, IFA_ADDRESS, &address.in);
131                         if (r < 0)
132                                 goto fail;
133                 }
134
135                 break;
136
137         case AF_INET6:
138                 r = sd_rtnl_message_read_in6_addr(mm, IFA_LOCAL, &address.in6);
139                 if (r < 0) {
140                         r = sd_rtnl_message_read_in6_addr(mm, IFA_ADDRESS, &address.in6);
141                         if (r < 0)
142                                 goto fail;
143                 }
144
145                 break;
146
147         default:
148                 return 0;
149         }
150
151         a = link_find_address(l, family, &address);
152
153         switch (type) {
154
155         case RTM_NEWADDR:
156
157                 if (!a) {
158                         r = link_address_new(l, &a, family, &address);
159                         if (r < 0)
160                                 return r;
161                 }
162
163                 r = link_address_update_rtnl(a, mm);
164                 if (r < 0)
165                         return r;
166
167                 break;
168
169         case RTM_DELADDR:
170                 if (a)
171                         link_address_free(a);
172                 break;
173         }
174
175         return 0;
176
177 fail:
178         log_warning("Failed to process RTNL address message: %s", strerror(-r));
179         return 0;
180 }
181
182
183 static int manager_rtnl_listen(Manager *m) {
184         _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL;
185         sd_rtnl_message *i;
186         int r;
187
188         assert(m);
189
190         /* First, subscibe to interfaces coming and going */
191         r = sd_rtnl_open(&m->rtnl, 3, RTNLGRP_LINK, RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV6_IFADDR);
192         if (r < 0)
193                 return r;
194
195         r = sd_rtnl_attach_event(m->rtnl, m->event, 0);
196         if (r < 0)
197                 return r;
198
199         r = sd_rtnl_add_match(m->rtnl, RTM_NEWLINK, manager_process_link, m);
200         if (r < 0)
201                 return r;
202
203         r = sd_rtnl_add_match(m->rtnl, RTM_DELLINK, manager_process_link, m);
204         if (r < 0)
205                 return r;
206
207         r = sd_rtnl_add_match(m->rtnl, RTM_NEWADDR, manager_process_address, m);
208         if (r < 0)
209                 return r;
210
211         r = sd_rtnl_add_match(m->rtnl, RTM_DELADDR, manager_process_address, m);
212         if (r < 0)
213                 return r;
214
215         /* Then, enumerate all links */
216         r = sd_rtnl_message_new_link(m->rtnl, &req, RTM_GETLINK, 0);
217         if (r < 0)
218                 return r;
219
220         r = sd_rtnl_message_request_dump(req, true);
221         if (r < 0)
222                 return r;
223
224         r = sd_rtnl_call(m->rtnl, req, 0, &reply);
225         if (r < 0)
226                 return r;
227
228         for (i = reply; i; i = sd_rtnl_message_next(i)) {
229                 r = manager_process_link(m->rtnl, i, m);
230                 if (r < 0)
231                         return r;
232         }
233
234         req = sd_rtnl_message_unref(req);
235         reply = sd_rtnl_message_unref(reply);
236
237         /* Finally, enumerate all addresses, too */
238         r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, 0, AF_UNSPEC);
239         if (r < 0)
240                 return r;
241
242         r = sd_rtnl_message_request_dump(req, true);
243         if (r < 0)
244                 return r;
245
246         r = sd_rtnl_call(m->rtnl, req, 0, &reply);
247         if (r < 0)
248                 return r;
249
250         for (i = reply; i; i = sd_rtnl_message_next(i)) {
251                 r = manager_process_address(m->rtnl, i, m);
252                 if (r < 0)
253                         return r;
254         }
255
256         return r;
257 }
258
259 static int on_network_event(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
260         Manager *m = userdata;
261         Iterator i;
262         Link *l;
263         int r;
264
265         assert(m);
266
267         sd_network_monitor_flush(m->network_monitor);
268
269         HASHMAP_FOREACH(l, m->links, i) {
270                 r = link_update_monitor(l);
271                 if (r < 0)
272                         log_warning("Failed to update monitor information for %i: %s", l->ifindex, strerror(-r));
273         }
274
275         r = manager_write_resolv_conf(m);
276         if (r < 0)
277                 log_warning("Could not update resolv.conf: %s", strerror(-r));
278
279         return 0;
280 }
281
282 static int manager_network_monitor_listen(Manager *m) {
283         int r, fd, events;
284
285         assert(m);
286
287         r = sd_network_monitor_new(&m->network_monitor, NULL);
288         if (r < 0)
289                 return r;
290
291         fd = sd_network_monitor_get_fd(m->network_monitor);
292         if (fd < 0)
293                 return fd;
294
295         events = sd_network_monitor_get_events(m->network_monitor);
296         if (events < 0)
297                 return events;
298
299         r = sd_event_add_io(m->event, &m->network_event_source, fd, events, &on_network_event, m);
300         if (r < 0)
301                 return r;
302
303         return 0;
304 }
305
306 static int parse_dns_server_string(Manager *m, const char *string) {
307         const char *word, *state;
308         size_t length;
309         int r;
310
311         assert(m);
312         assert(string);
313
314         FOREACH_WORD_QUOTED(word, length, string, state) {
315                 char buffer[length+1];
316                 int family;
317                 union in_addr_union addr;
318
319                 memcpy(buffer, word, length);
320                 buffer[length] = 0;
321
322                 r = in_addr_from_string_auto(buffer, &family, &addr);
323                 if (r < 0) {
324                         log_warning("Ignoring invalid DNS address '%s'", buffer);
325                         continue;
326                 }
327
328                 /* filter out duplicates */
329                 if (manager_find_dns_server(m, family, &addr))
330                         continue;
331
332                 r = dns_server_new(m, NULL, NULL, family, &addr);
333                 if (r < 0)
334                         return r;
335         }
336         /* do not warn about state here, since probably systemd already did */
337
338         return 0;
339 }
340
341 int config_parse_dnsv(
342                 const char *unit,
343                 const char *filename,
344                 unsigned line,
345                 const char *section,
346                 unsigned section_line,
347                 const char *lvalue,
348                 int ltype,
349                 const char *rvalue,
350                 void *data,
351                 void *userdata) {
352
353         Manager *m = userdata;
354         int r;
355
356         assert(filename);
357         assert(lvalue);
358         assert(rvalue);
359         assert(m);
360
361         /* Empty assignment means clear the list */
362         if (isempty(rvalue)) {
363                 while (m->dns_servers)
364                         dns_server_free(m->dns_servers);
365
366                 return 0;
367         }
368
369         r = parse_dns_server_string(m, rvalue);
370         if (r < 0) {
371                 log_error("Failed to parse DNS server string");
372                 return r;
373         }
374
375         return 0;
376 }
377
378 int manager_parse_config_file(Manager *m) {
379         assert(m);
380
381         return config_parse(NULL, "/etc/systemd/resolved.conf", NULL,
382                             "Resolve\0",
383                             config_item_perf_lookup, resolved_gperf_lookup,
384                             false, false, true, m);
385 }
386
387 int manager_new(Manager **ret) {
388         _cleanup_(manager_freep) Manager *m = NULL;
389         int r;
390
391         assert(ret);
392
393         m = new0(Manager, 1);
394         if (!m)
395                 return -ENOMEM;
396
397         m->dns_ipv4_fd = m->dns_ipv6_fd = -1;
398         m->llmnr_ipv4_udp_fd = m->llmnr_ipv6_udp_fd = -1;
399         m->llmnr_ipv4_tcp_fd = m->llmnr_ipv6_tcp_fd = -1;
400
401         m->use_llmnr = true;
402
403         r = parse_dns_server_string(m, DNS_SERVERS);
404         if (r < 0)
405                 return r;
406
407         m->hostname = gethostname_malloc();
408         if (!m->hostname)
409                 return -ENOMEM;
410
411         r = sd_event_default(&m->event);
412         if (r < 0)
413                 return r;
414
415         sd_event_add_signal(m->event, NULL, SIGTERM, NULL,  NULL);
416         sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
417
418         sd_event_set_watchdog(m->event, true);
419
420         r = dns_scope_new(m, &m->unicast_scope, NULL, DNS_PROTOCOL_DNS, AF_UNSPEC);
421         if (r < 0)
422                 return r;
423
424         r = manager_network_monitor_listen(m);
425         if (r < 0)
426                 return r;
427
428         r = manager_rtnl_listen(m);
429         if (r < 0)
430                 return r;
431
432         r = manager_connect_bus(m);
433         if (r < 0)
434                 return r;
435
436         r = manager_llmnr_ipv4_udp_fd(m);
437         if (r < 0)
438                 return r;
439         r = manager_llmnr_ipv6_udp_fd(m);
440         if (r < 0)
441                 return r;
442         r = manager_llmnr_ipv4_tcp_fd(m);
443         if (r < 0)
444                 return r;
445         r = manager_llmnr_ipv6_tcp_fd(m);
446         if (r < 0)
447                 return r;
448
449         *ret = m;
450         m = NULL;
451
452         return 0;
453 }
454
455 Manager *manager_free(Manager *m) {
456         Link *l;
457
458         if (!m)
459                 return NULL;
460
461         while (m->dns_queries)
462                 dns_query_free(m->dns_queries);
463
464         hashmap_free(m->dns_transactions);
465
466         while ((l = hashmap_first(m->links)))
467                link_free(l);
468         hashmap_free(m->links);
469
470         dns_scope_free(m->unicast_scope);
471
472         while (m->dns_servers)
473                 dns_server_free(m->dns_servers);
474
475         sd_event_source_unref(m->network_event_source);
476         sd_network_monitor_unref(m->network_monitor);
477
478         sd_event_source_unref(m->dns_ipv4_event_source);
479         sd_event_source_unref(m->dns_ipv6_event_source);
480         safe_close(m->dns_ipv4_fd);
481         safe_close(m->dns_ipv6_fd);
482
483         sd_event_source_unref(m->llmnr_ipv4_udp_event_source);
484         sd_event_source_unref(m->llmnr_ipv6_udp_event_source);
485         safe_close(m->llmnr_ipv4_udp_fd);
486         safe_close(m->llmnr_ipv6_udp_fd);
487
488         sd_event_source_unref(m->llmnr_ipv4_tcp_event_source);
489         sd_event_source_unref(m->llmnr_ipv6_tcp_event_source);
490         safe_close(m->llmnr_ipv4_tcp_fd);
491         safe_close(m->llmnr_ipv6_tcp_fd);
492
493         sd_event_source_unref(m->bus_retry_event_source);
494         sd_bus_unref(m->bus);
495
496         sd_event_unref(m->event);
497
498         dns_resource_key_unref(m->host_ipv4_key);
499         dns_resource_key_unref(m->host_ipv6_key);
500         free(m->hostname);
501         free(m);
502
503         return NULL;
504 }
505
506 static void write_resolve_conf_server(DnsServer *s, FILE *f, unsigned *count) {
507         _cleanup_free_ char *t  = NULL;
508         int r;
509
510         assert(s);
511         assert(f);
512         assert(count);
513
514         r = in_addr_to_string(s->family, &s->address, &t);
515        if (r < 0) {
516                 log_warning("Invalid DNS address. Ignoring.");
517                 return;
518         }
519
520         if (*count == MAXNS)
521                 fputs("# Too many DNS servers configured, the following entries may be ignored\n", f);
522
523         fprintf(f, "nameserver %s\n", t);
524         (*count) ++;
525 }
526
527 int manager_write_resolv_conf(Manager *m) {
528         const char *path = "/run/systemd/resolve/resolv.conf";
529         _cleanup_free_ char *temp_path = NULL;
530         _cleanup_fclose_ FILE *f = NULL;
531         unsigned count = 0;
532         DnsServer *s;
533         Iterator i;
534         Link *l;
535         int r;
536
537         assert(m);
538
539         r = fopen_temporary(path, &f, &temp_path);
540         if (r < 0)
541                 return r;
542
543         fchmod(fileno(f), 0644);
544
545         fputs("# This file is managed by systemd-resolved(8). Do not edit.\n#\n"
546               "# Third party programs must not access this file directly, but\n"
547               "# only through the symlink at /etc/resolv.conf. To manage\n"
548               "# resolv.conf(5) in a different way, replace the symlink by a\n"
549               "# static file or a different symlink.\n\n", f);
550
551         HASHMAP_FOREACH(l, m->links, i)
552                 LIST_FOREACH(servers, s, l->dns_servers)
553                         write_resolve_conf_server(s, f, &count);
554
555         LIST_FOREACH(servers, s, m->dns_servers)
556                 write_resolve_conf_server(s, f, &count);
557
558         r = fflush_and_check(f);
559         if (r < 0)
560                 goto fail;
561
562         if (rename(temp_path, path) < 0) {
563                 r = -errno;
564                 goto fail;
565         }
566
567         return 0;
568
569 fail:
570         unlink(path);
571         unlink(temp_path);
572         return r;
573 }
574
575 int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret) {
576         _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
577         union {
578                 struct cmsghdr header; /* For alignment */
579                 uint8_t buffer[CMSG_SPACE(MAX(sizeof(struct in_pktinfo), sizeof(struct in6_pktinfo)))
580                                + CMSG_SPACE(int) /* ttl/hoplimit */
581                                + EXTRA_CMSG_SPACE /* kernel appears to require extra buffer space */];
582         } control;
583         union sockaddr_union sa;
584         struct msghdr mh = {};
585         struct cmsghdr *cmsg;
586         struct iovec iov;
587         int ms = 0, r;
588         ssize_t l;
589
590         assert(m);
591         assert(fd >= 0);
592         assert(ret);
593
594         r = ioctl(fd, FIONREAD, &ms);
595         if (r < 0)
596                 return -errno;
597         if (ms < 0)
598                 return -EIO;
599
600         r = dns_packet_new(&p, protocol, ms);
601         if (r < 0)
602                 return r;
603
604         iov.iov_base = DNS_PACKET_DATA(p);
605         iov.iov_len = p->allocated;
606
607         mh.msg_name = &sa.sa;
608         mh.msg_namelen = sizeof(sa);
609         mh.msg_iov = &iov;
610         mh.msg_iovlen = 1;
611         mh.msg_control = &control;
612         mh.msg_controllen = sizeof(control);
613
614         l = recvmsg(fd, &mh, 0);
615         if (l < 0) {
616                 if (errno == EAGAIN || errno == EINTR)
617                         return 0;
618
619                 return -errno;
620         }
621
622         if (l <= 0)
623                 return -EIO;
624
625         assert(!(mh.msg_flags & MSG_CTRUNC));
626         assert(!(mh.msg_flags & MSG_TRUNC));
627
628         p->size = (size_t) l;
629
630         p->family = sa.sa.sa_family;
631         p->ipproto = IPPROTO_UDP;
632         if (p->family == AF_INET) {
633                 p->sender.in = sa.in.sin_addr;
634                 p->sender_port = be16toh(sa.in.sin_port);
635         } else if (p->family == AF_INET6) {
636                 p->sender.in6 = sa.in6.sin6_addr;
637                 p->sender_port = be16toh(sa.in6.sin6_port);
638                 p->ifindex = sa.in6.sin6_scope_id;
639         } else
640                 return -EAFNOSUPPORT;
641
642         for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
643
644                 if (cmsg->cmsg_level == IPPROTO_IPV6) {
645                         assert(p->family == AF_INET6);
646
647                         switch (cmsg->cmsg_type) {
648
649                         case IPV6_PKTINFO: {
650                                 struct in6_pktinfo *i = (struct in6_pktinfo*) CMSG_DATA(cmsg);
651
652                                 if (p->ifindex <= 0)
653                                         p->ifindex = i->ipi6_ifindex;
654
655                                 p->destination.in6 = i->ipi6_addr;
656                                 break;
657                         }
658
659                         case IPV6_HOPLIMIT:
660                                 p->ttl = *(int *) CMSG_DATA(cmsg);
661                                 break;
662
663                         }
664                 } else if (cmsg->cmsg_level == IPPROTO_IP) {
665                         assert(p->family == AF_INET);
666
667                         switch (cmsg->cmsg_type) {
668
669                         case IP_PKTINFO: {
670                                 struct in_pktinfo *i = (struct in_pktinfo*) CMSG_DATA(cmsg);
671
672                                 if (p->ifindex <= 0)
673                                         p->ifindex = i->ipi_ifindex;
674
675                                 p->destination.in = i->ipi_addr;
676                                 break;
677                         }
678
679                         case IP_TTL:
680                                 p->ttl = *(int *) CMSG_DATA(cmsg);
681                                 break;
682                         }
683                 }
684         }
685
686         /* The Linux kernel sets the interface index to the loopback
687          * device if the packet came from the local host since it
688          * avoids the routing table in such a case. Let's unset the
689          * interface index in such a case. */
690         if (p->ifindex > 0 && manager_ifindex_is_loopback(m, p->ifindex) != 0)
691                 p->ifindex = 0;
692
693         /* If we don't know the interface index still, we look for the
694          * first local interface with a matching address. Yuck! */
695         if (p->ifindex <= 0)
696                 p->ifindex = manager_find_ifindex(m, p->family, &p->destination);
697
698         *ret = p;
699         p = NULL;
700
701         return 1;
702 }
703
704 static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
705         _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
706         DnsTransaction *t = NULL;
707         Manager *m = userdata;
708         int r;
709
710         r = manager_recv(m, fd, DNS_PROTOCOL_DNS, &p);
711         if (r <= 0)
712                 return r;
713
714         if (dns_packet_validate_reply(p) > 0) {
715                 t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
716                 if (!t)
717                         return 0;
718
719                 dns_transaction_process_reply(t, p);
720
721         } else
722                 log_debug("Invalid DNS packet.");
723
724         return 0;
725 }
726
727 int manager_dns_ipv4_fd(Manager *m) {
728         const int one = 1;
729         int r;
730
731         assert(m);
732
733         if (m->dns_ipv4_fd >= 0)
734                 return m->dns_ipv4_fd;
735
736         m->dns_ipv4_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
737         if (m->dns_ipv4_fd < 0)
738                 return -errno;
739
740         r = setsockopt(m->dns_ipv4_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
741         if (r < 0) {
742                 r = -errno;
743                 goto fail;
744         }
745
746         r = sd_event_add_io(m->event, &m->dns_ipv4_event_source, m->dns_ipv4_fd, EPOLLIN, on_dns_packet, m);
747         if (r < 0)
748                 goto fail;
749
750         return m->dns_ipv4_fd;
751
752 fail:
753         m->dns_ipv4_fd = safe_close(m->dns_ipv4_fd);
754         return r;
755 }
756
757 int manager_dns_ipv6_fd(Manager *m) {
758         const int one = 1;
759         int r;
760
761         assert(m);
762
763         if (m->dns_ipv6_fd >= 0)
764                 return m->dns_ipv6_fd;
765
766         m->dns_ipv6_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
767         if (m->dns_ipv6_fd < 0)
768                 return -errno;
769
770         r = setsockopt(m->dns_ipv6_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
771         if (r < 0) {
772                 r = -errno;
773                 goto fail;
774         }
775
776         r = sd_event_add_io(m->event, &m->dns_ipv6_event_source, m->dns_ipv6_fd, EPOLLIN, on_dns_packet, m);
777         if (r < 0)
778                 goto fail;
779
780         return m->dns_ipv6_fd;
781
782 fail:
783         m->dns_ipv6_fd = safe_close(m->dns_ipv6_fd);
784         return r;
785 }
786
787 static int sendmsg_loop(int fd, struct msghdr *mh, int flags) {
788         int r;
789
790         assert(fd >= 0);
791         assert(mh);
792
793         for (;;) {
794                 if (sendmsg(fd, mh, flags) >= 0)
795                         return 0;
796
797                 if (errno == EINTR)
798                         continue;
799
800                 if (errno != EAGAIN)
801                         return -errno;
802
803                 r = fd_wait_for_event(fd, POLLOUT, SEND_TIMEOUT_USEC);
804                 if (r < 0)
805                         return r;
806                 if (r == 0)
807                         return -ETIMEDOUT;
808         }
809 }
810
811 static int manager_ipv4_send(Manager *m, int fd, int ifindex, const struct in_addr *addr, uint16_t port, DnsPacket *p) {
812         union sockaddr_union sa = {
813                 .in.sin_family = AF_INET,
814         };
815         union {
816                 struct cmsghdr header; /* For alignment */
817                 uint8_t buffer[CMSG_SPACE(sizeof(struct in_pktinfo))];
818         } control;
819         struct msghdr mh = {};
820         struct iovec iov;
821
822         assert(m);
823         assert(fd >= 0);
824         assert(addr);
825         assert(port > 0);
826         assert(p);
827
828         iov.iov_base = DNS_PACKET_DATA(p);
829         iov.iov_len = p->size;
830
831         sa.in.sin_addr = *addr;
832         sa.in.sin_port = htobe16(port),
833
834         mh.msg_iov = &iov;
835         mh.msg_iovlen = 1;
836         mh.msg_name = &sa.sa;
837         mh.msg_namelen = sizeof(sa.in);
838
839         if (ifindex > 0) {
840                 struct cmsghdr *cmsg;
841                 struct in_pktinfo *pi;
842
843                 zero(control);
844
845                 mh.msg_control = &control;
846                 mh.msg_controllen = CMSG_LEN(sizeof(struct in_pktinfo));
847
848                 cmsg = CMSG_FIRSTHDR(&mh);
849                 cmsg->cmsg_len = mh.msg_controllen;
850                 cmsg->cmsg_level = IPPROTO_IP;
851                 cmsg->cmsg_type = IP_PKTINFO;
852
853                 pi = (struct in_pktinfo*) CMSG_DATA(cmsg);
854                 pi->ipi_ifindex = ifindex;
855         }
856
857         return sendmsg_loop(fd, &mh, 0);
858 }
859
860 static int manager_ipv6_send(Manager *m, int fd, int ifindex, const struct in6_addr *addr, uint16_t port, DnsPacket *p) {
861         union sockaddr_union sa = {
862                 .in6.sin6_family = AF_INET6,
863         };
864         union {
865                 struct cmsghdr header; /* For alignment */
866                 uint8_t buffer[CMSG_SPACE(sizeof(struct in6_pktinfo))];
867         } control;
868         struct msghdr mh = {};
869         struct iovec iov;
870
871         assert(m);
872         assert(fd >= 0);
873         assert(addr);
874         assert(port > 0);
875         assert(p);
876
877         iov.iov_base = DNS_PACKET_DATA(p);
878         iov.iov_len = p->size;
879
880         sa.in6.sin6_addr = *addr;
881         sa.in6.sin6_port = htobe16(port),
882         sa.in6.sin6_scope_id = ifindex;
883
884         mh.msg_iov = &iov;
885         mh.msg_iovlen = 1;
886         mh.msg_name = &sa.sa;
887         mh.msg_namelen = sizeof(sa.in6);
888
889         if (ifindex > 0) {
890                 struct cmsghdr *cmsg;
891                 struct in6_pktinfo *pi;
892
893                 zero(control);
894
895                 mh.msg_control = &control;
896                 mh.msg_controllen = CMSG_LEN(sizeof(struct in6_pktinfo));
897
898                 cmsg = CMSG_FIRSTHDR(&mh);
899                 cmsg->cmsg_len = mh.msg_controllen;
900                 cmsg->cmsg_level = IPPROTO_IPV6;
901                 cmsg->cmsg_type = IPV6_PKTINFO;
902
903                 pi = (struct in6_pktinfo*) CMSG_DATA(cmsg);
904                 pi->ipi6_ifindex = ifindex;
905         }
906
907         return sendmsg_loop(fd, &mh, 0);
908 }
909
910 int manager_send(Manager *m, int fd, int ifindex, int family, const union in_addr_union *addr, uint16_t port, DnsPacket *p) {
911         assert(m);
912         assert(fd >= 0);
913         assert(addr);
914         assert(port > 0);
915         assert(p);
916
917         log_debug("Sending %s packet with id %u on interface %i/%s", DNS_PACKET_QR(p) ? "response" : "query", DNS_PACKET_ID(p), ifindex, af_to_name(family));
918
919         if (family == AF_INET)
920                 return manager_ipv4_send(m, fd, ifindex, &addr->in, port, p);
921         else if (family == AF_INET6)
922                 return manager_ipv6_send(m, fd, ifindex, &addr->in6, port, p);
923
924         return -EAFNOSUPPORT;
925 }
926
927 DnsServer* manager_find_dns_server(Manager *m, int family, const union in_addr_union *in_addr) {
928         DnsServer *s;
929
930         assert(m);
931         assert(in_addr);
932
933         LIST_FOREACH(servers, s, m->dns_servers) {
934
935                 if (s->family == family &&
936                     in_addr_equal(family, &s->address, in_addr))
937                         return s;
938         }
939
940         return NULL;
941 }
942
943 DnsServer *manager_get_dns_server(Manager *m) {
944         assert(m);
945
946         if (!m->current_dns_server)
947                 m->current_dns_server = m->dns_servers;
948
949         return m->current_dns_server;
950 }
951
952 void manager_next_dns_server(Manager *m) {
953         assert(m);
954
955         if (!m->current_dns_server) {
956                 m->current_dns_server = m->dns_servers;
957                 return;
958         }
959
960         if (!m->current_dns_server)
961                 return;
962
963         if (m->current_dns_server->servers_next) {
964                 m->current_dns_server = m->current_dns_server->servers_next;
965                 return;
966         }
967
968         m->current_dns_server = m->dns_servers;
969 }
970
971 uint32_t manager_find_mtu(Manager *m) {
972         uint32_t mtu = 0;
973         Link *l;
974         Iterator i;
975
976         /* If we don't know on which link a DNS packet would be
977          * delivered, let's find the largest MTU that works on all
978          * interfaces we know of */
979
980         HASHMAP_FOREACH(l, m->links, i) {
981                 if (l->mtu <= 0)
982                         continue;
983
984                 if (mtu <= 0 || l->mtu < mtu)
985                         mtu = l->mtu;
986         }
987
988         return mtu;
989 }
990
991 static int on_llmnr_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
992         _cleanup_(dns_packet_unrefp) DnsPacket *p = NULL;
993         DnsTransaction *t = NULL;
994         Manager *m = userdata;
995         int r;
996
997         r = manager_recv(m, fd, DNS_PROTOCOL_LLMNR, &p);
998         if (r <= 0)
999                 return r;
1000
1001         if (dns_packet_validate_reply(p) > 0) {
1002                 log_debug("Got reply packet for id %u", DNS_PACKET_ID(p));
1003
1004                 t = hashmap_get(m->dns_transactions, UINT_TO_PTR(DNS_PACKET_ID(p)));
1005                 if (!t)
1006                         return 0;
1007
1008                 dns_transaction_process_reply(t, p);
1009
1010         } else if (dns_packet_validate_query(p) > 0) {
1011                 Link *l;
1012
1013                 l = hashmap_get(m->links, INT_TO_PTR(p->ifindex));
1014                 if (l) {
1015                         DnsScope *scope = NULL;
1016
1017                         if (p->family == AF_INET)
1018                                 scope = l->llmnr_ipv4_scope;
1019                         else if (p->family == AF_INET6)
1020                                 scope = l->llmnr_ipv6_scope;
1021
1022                         if (scope)
1023                                 dns_scope_process_query(scope, NULL, p);
1024                 }
1025         } else
1026                 log_debug("Invalid LLMNR packet.");
1027
1028         return 0;
1029 }
1030
1031 int manager_llmnr_ipv4_udp_fd(Manager *m) {
1032         union sockaddr_union sa = {
1033                 .in.sin_family = AF_INET,
1034                 .in.sin_port = htobe16(5355),
1035         };
1036         static const int one = 1, pmtu = IP_PMTUDISC_DONT, ttl = 255;
1037         int r;
1038
1039         assert(m);
1040
1041         if (m->llmnr_ipv4_udp_fd >= 0)
1042                 return m->llmnr_ipv4_udp_fd;
1043
1044         m->llmnr_ipv4_udp_fd = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1045         if (m->llmnr_ipv4_udp_fd < 0)
1046                 return -errno;
1047
1048         /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1049         r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl));
1050         if (r < 0) {
1051                 r = -errno;
1052                 goto fail;
1053         }
1054
1055         r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
1056         if (r < 0) {
1057                 r = -errno;
1058                 goto fail;
1059         }
1060
1061         r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MULTICAST_LOOP, &one, sizeof(one));
1062         if (r < 0) {
1063                 r = -errno;
1064                 goto fail;
1065         }
1066
1067         r = setsockopt(m->llmnr_ipv4_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1068         if (r < 0) {
1069                 r = -errno;
1070                 goto fail;
1071         }
1072
1073         r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1074         if (r < 0) {
1075                 r = -errno;
1076                 goto fail;
1077         }
1078
1079         r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1080         if (r < 0) {
1081                 r = -errno;
1082                 goto fail;
1083         }
1084
1085         /* Disable Don't-Fragment bit in the IP header */
1086         r = setsockopt(m->llmnr_ipv4_udp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1087         if (r < 0) {
1088                 r = -errno;
1089                 goto fail;
1090         }
1091
1092         r = bind(m->llmnr_ipv4_udp_fd, &sa.sa, sizeof(sa.in));
1093         if (r < 0) {
1094                 r = -errno;
1095                 goto fail;
1096         }
1097
1098         r = sd_event_add_io(m->event, &m->llmnr_ipv4_udp_event_source, m->llmnr_ipv4_udp_fd, EPOLLIN, on_llmnr_packet, m);
1099         if (r < 0)
1100                 goto fail;
1101
1102         return m->llmnr_ipv4_udp_fd;
1103
1104 fail:
1105         m->llmnr_ipv4_udp_fd = safe_close(m->llmnr_ipv4_udp_fd);
1106         return r;
1107 }
1108
1109 int manager_llmnr_ipv6_udp_fd(Manager *m) {
1110         union sockaddr_union sa = {
1111                 .in6.sin6_family = AF_INET6,
1112                 .in6.sin6_port = htobe16(5355),
1113         };
1114         static const int one = 1, ttl = 255;
1115         int r;
1116
1117         assert(m);
1118
1119         if (m->llmnr_ipv6_udp_fd >= 0)
1120                 return m->llmnr_ipv6_udp_fd;
1121
1122         m->llmnr_ipv6_udp_fd = socket(AF_INET6, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1123         if (m->llmnr_ipv6_udp_fd < 0)
1124                 return -errno;
1125
1126         r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl, sizeof(ttl));
1127         if (r < 0) {
1128                 r = -errno;
1129                 goto fail;
1130         }
1131
1132         /* RFC 4795, section 2.5 recommends setting the TTL of UDP packets to 255. */
1133         r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, sizeof(ttl));
1134         if (r < 0) {
1135                 r = -errno;
1136                 goto fail;
1137         }
1138
1139         r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &one, sizeof(one));
1140         if (r < 0) {
1141                 r = -errno;
1142                 goto fail;
1143         }
1144
1145         r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1146         if (r < 0) {
1147                 r = -errno;
1148                 goto fail;
1149         }
1150
1151         r = setsockopt(m->llmnr_ipv6_udp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1152         if (r < 0) {
1153                 r = -errno;
1154                 goto fail;
1155         }
1156
1157         r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1158         if (r < 0) {
1159                 r = -errno;
1160                 goto fail;
1161         }
1162
1163         r = setsockopt(m->llmnr_ipv6_udp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1164         if (r < 0) {
1165                 r = -errno;
1166                 goto fail;
1167         }
1168
1169         r = bind(m->llmnr_ipv6_udp_fd, &sa.sa, sizeof(sa.in6));
1170         if (r < 0) {
1171                 r = -errno;
1172                 goto fail;
1173         }
1174
1175         r = sd_event_add_io(m->event, &m->llmnr_ipv6_udp_event_source, m->llmnr_ipv6_udp_fd, EPOLLIN, on_llmnr_packet, m);
1176         if (r < 0)  {
1177                 r = -errno;
1178                 goto fail;
1179         }
1180
1181         return m->llmnr_ipv6_udp_fd;
1182
1183 fail:
1184         m->llmnr_ipv6_udp_fd = safe_close(m->llmnr_ipv6_udp_fd);
1185         return r;
1186 }
1187
1188 static int on_llmnr_stream_packet(DnsStream *s) {
1189         assert(s);
1190
1191         if (dns_packet_validate_query(s->read_packet) > 0) {
1192                 Link *l;
1193
1194                 l = hashmap_get(s->manager->links, INT_TO_PTR(s->read_packet->ifindex));
1195                 if (l) {
1196                         DnsScope *scope = NULL;
1197
1198                         if (s->read_packet->family == AF_INET)
1199                                 scope = l->llmnr_ipv4_scope;
1200                         else if (s->read_packet->family == AF_INET6)
1201                                 scope = l->llmnr_ipv6_scope;
1202
1203                         if (scope) {
1204                                 dns_scope_process_query(scope, s, s->read_packet);
1205
1206                                 /* If no reply packet was set, we free the stream */
1207                                 if (s->write_packet)
1208                                         return 0;
1209                         }
1210                 }
1211         }
1212
1213         dns_stream_free(s);
1214         return 0;
1215 }
1216
1217 static int on_llmnr_stream(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1218         DnsStream *stream;
1219         Manager *m = userdata;
1220         int cfd, r;
1221
1222         cfd = accept4(fd, NULL, NULL, SOCK_NONBLOCK|SOCK_CLOEXEC);
1223         if (cfd < 0) {
1224                 if (errno == EAGAIN || errno == EINTR)
1225                         return 0;
1226
1227                 return -errno;
1228         }
1229
1230         r = dns_stream_new(m, &stream, DNS_PROTOCOL_LLMNR, cfd);
1231         if (r < 0) {
1232                 safe_close(cfd);
1233                 return r;
1234         }
1235
1236         stream->on_packet = on_llmnr_stream_packet;
1237         return 0;
1238 }
1239
1240 int manager_llmnr_ipv4_tcp_fd(Manager *m) {
1241         union sockaddr_union sa = {
1242                 .in.sin_family = AF_INET,
1243                 .in.sin_port = htobe16(5355),
1244         };
1245         static const int one = 1, pmtu = IP_PMTUDISC_DONT;
1246         int r;
1247
1248         assert(m);
1249
1250         if (m->llmnr_ipv4_tcp_fd >= 0)
1251                 return m->llmnr_ipv4_tcp_fd;
1252
1253         m->llmnr_ipv4_tcp_fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1254         if (m->llmnr_ipv4_tcp_fd < 0)
1255                 return -errno;
1256
1257         /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1258         r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_TTL, &one, sizeof(one));
1259         if (r < 0) {
1260                 r = -errno;
1261                 goto fail;
1262         }
1263
1264         r = setsockopt(m->llmnr_ipv4_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1265         if (r < 0) {
1266                 r = -errno;
1267                 goto fail;
1268         }
1269
1270         r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
1271         if (r < 0) {
1272                 r = -errno;
1273                 goto fail;
1274         }
1275
1276         r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_RECVTTL, &one, sizeof(one));
1277         if (r < 0) {
1278                 r = -errno;
1279                 goto fail;
1280         }
1281
1282         /* Disable Don't-Fragment bit in the IP header */
1283         r = setsockopt(m->llmnr_ipv4_tcp_fd, IPPROTO_IP, IP_MTU_DISCOVER, &pmtu, sizeof(pmtu));
1284         if (r < 0) {
1285                 r = -errno;
1286                 goto fail;
1287         }
1288
1289         r = bind(m->llmnr_ipv4_tcp_fd, &sa.sa, sizeof(sa.in));
1290         if (r < 0) {
1291                 r = -errno;
1292                 goto fail;
1293         }
1294
1295         r = listen(m->llmnr_ipv4_tcp_fd, SOMAXCONN);
1296         if (r < 0) {
1297                 r = -errno;
1298                 goto fail;
1299         }
1300
1301         r = sd_event_add_io(m->event, &m->llmnr_ipv4_tcp_event_source, m->llmnr_ipv4_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1302         if (r < 0)
1303                 goto fail;
1304
1305         return m->llmnr_ipv4_tcp_fd;
1306
1307 fail:
1308         m->llmnr_ipv4_tcp_fd = safe_close(m->llmnr_ipv4_tcp_fd);
1309         return r;
1310 }
1311
1312 int manager_llmnr_ipv6_tcp_fd(Manager *m) {
1313         union sockaddr_union sa = {
1314                 .in6.sin6_family = AF_INET6,
1315                 .in6.sin6_port = htobe16(5355),
1316         };
1317         static const int one = 1;
1318         int r;
1319
1320         assert(m);
1321
1322         if (m->llmnr_ipv6_tcp_fd >= 0)
1323                 return m->llmnr_ipv6_tcp_fd;
1324
1325         m->llmnr_ipv6_tcp_fd = socket(AF_INET6, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
1326         if (m->llmnr_ipv6_tcp_fd < 0)
1327                 return -errno;
1328
1329         /* RFC 4795, section 2.5. requires setting the TTL of TCP streams to 1 */
1330         r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &one, sizeof(one));
1331         if (r < 0) {
1332                 r = -errno;
1333                 goto fail;
1334         }
1335
1336         r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));
1337         if (r < 0) {
1338                 r = -errno;
1339                 goto fail;
1340         }
1341
1342         r = setsockopt(m->llmnr_ipv6_tcp_fd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1343         if (r < 0) {
1344                 r = -errno;
1345                 goto fail;
1346         }
1347
1348         r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
1349         if (r < 0) {
1350                 r = -errno;
1351                 goto fail;
1352         }
1353
1354         r = setsockopt(m->llmnr_ipv6_tcp_fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &one, sizeof(one));
1355         if (r < 0) {
1356                 r = -errno;
1357                 goto fail;
1358         }
1359
1360         r = bind(m->llmnr_ipv6_tcp_fd, &sa.sa, sizeof(sa.in6));
1361         if (r < 0) {
1362                 r = -errno;
1363                 goto fail;
1364         }
1365
1366         r = listen(m->llmnr_ipv6_tcp_fd, SOMAXCONN);
1367         if (r < 0) {
1368                 r = -errno;
1369                 goto fail;
1370         }
1371
1372         r = sd_event_add_io(m->event, &m->llmnr_ipv6_tcp_event_source, m->llmnr_ipv6_tcp_fd, EPOLLIN, on_llmnr_stream, m);
1373         if (r < 0)  {
1374                 r = -errno;
1375                 goto fail;
1376         }
1377
1378         return m->llmnr_ipv6_tcp_fd;
1379
1380 fail:
1381         m->llmnr_ipv6_tcp_fd = safe_close(m->llmnr_ipv6_tcp_fd);
1382         return r;
1383 }
1384
1385 int manager_ifindex_is_loopback(Manager *m, int ifindex) {
1386         Link *l;
1387         assert(m);
1388
1389         if (ifindex <= 0)
1390                 return -EINVAL;
1391
1392         l = hashmap_get(m->links, INT_TO_PTR(ifindex));
1393         if (l->flags & IFF_LOOPBACK)
1394                 return 1;
1395
1396         return 0;
1397 }
1398
1399 int manager_find_ifindex(Manager *m, int family, const union in_addr_union *in_addr) {
1400         LinkAddress *a;
1401
1402         assert(m);
1403
1404         a = manager_find_address(m, family, in_addr);
1405         if (a)
1406                 return a->link->ifindex;
1407
1408         return 0;
1409 }
1410
1411 int manager_next_hostname(Manager *m) {
1412         const char *p;
1413         Iterator i;
1414         uint64_t u;
1415         char *h;
1416         Link *l;
1417
1418         assert(m);
1419
1420         p = strchr(m->hostname, 0);
1421         assert(p);
1422
1423         while (p > m->hostname) {
1424                 if (!strchr("0123456789", p[-1]))
1425                         break;
1426
1427                 p--;
1428         }
1429
1430         if (*p == 0 || safe_atou64(p, &u) < 0 || u <= 0)
1431                 u = 1;
1432
1433         u++;
1434
1435         if (asprintf(&h, "%.*s%" PRIu64, (int) (p - m->hostname), m->hostname, u) < 0)
1436                 return -ENOMEM;
1437
1438         log_info("Hostname conflict, changing local hostname from '%s' to '%s'.", m->hostname, h);
1439
1440         free(m->hostname);
1441         m->hostname = h;
1442
1443         m->host_ipv4_key = dns_resource_key_unref(m->host_ipv4_key);
1444         m->host_ipv6_key = dns_resource_key_unref(m->host_ipv6_key);
1445
1446         HASHMAP_FOREACH(l, m->links, i) {
1447                 link_add_rrs(l, true);
1448                 link_add_rrs(l, false);
1449         }
1450
1451         return 0;
1452 }
1453
1454 LinkAddress* manager_find_address(Manager *m, int family, const union in_addr_union *in_addr) {
1455         Iterator i;
1456         Link *l;
1457
1458         assert(m);
1459
1460         HASHMAP_FOREACH(l, m->links, i) {
1461                 LinkAddress *a;
1462
1463                 a = link_find_address(l, family, in_addr);
1464                 if (a)
1465                         return a;
1466         }
1467
1468         return NULL;
1469 }
1470
1471 int manager_our_packet(Manager *m, DnsPacket *p) {
1472         assert(m);
1473         assert(p);
1474
1475         return !!manager_find_address(m, p->family, &p->sender);
1476 }