Merge branch 'vendor/OPENBSD_LIBM'
[dragonfly.git] / contrib / dhcpcd / src / ipv6.c
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3  * dhcpcd - DHCP client daemon
4  * Copyright (c) 2006-2019 Roy Marples <roy@marples.name>
5  * All rights reserved
6
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28
29 #include <sys/param.h>
30 #include <sys/types.h>
31 #include <sys/socket.h>
32 #include <sys/stat.h>
33
34 #include <arpa/inet.h>
35 #include <net/if.h>
36 #include <net/route.h>
37 #include <netinet/in.h>
38 #include <netinet/if_ether.h>
39
40 #include "config.h"
41
42 #ifdef HAVE_SYS_BITOPS_H
43 #include <sys/bitops.h>
44 #else
45 #include "compat/bitops.h"
46 #endif
47
48 #ifdef BSD
49 /* Purely for the ND6_IFF_AUTO_LINKLOCAL #define which is solely used
50  * to generate our CAN_ADD_LLADDR #define. */
51 #  include <netinet6/in6_var.h>
52 #  include <netinet6/nd6.h>
53 #endif
54
55 #include <errno.h>
56 #include <ifaddrs.h>
57 #include <inttypes.h>
58 #include <stdlib.h>
59 #include <string.h>
60 #include <unistd.h>
61
62 #define ELOOP_QUEUE 7
63 #include "common.h"
64 #include "if.h"
65 #include "dhcpcd.h"
66 #include "dhcp6.h"
67 #include "eloop.h"
68 #include "ipv6.h"
69 #include "ipv6nd.h"
70 #include "logerr.h"
71 #include "sa.h"
72 #include "script.h"
73
74 #ifdef HAVE_MD5_H
75 #  ifndef DEPGEN
76 #    include <md5.h>
77 #  endif
78 #endif
79
80 #ifdef SHA2_H
81 #  include SHA2_H
82 #endif
83
84 #ifndef SHA256_DIGEST_LENGTH
85 #  define SHA256_DIGEST_LENGTH          32
86 #endif
87
88 #ifdef IPV6_POLLADDRFLAG
89 #  warning kernel does not report IPv6 address flag changes
90 #  warning polling tentative address flags periodically
91 #endif
92
93 /* Hackery at it's finest. */
94 #ifndef s6_addr32
95 #  ifdef __sun
96 #    define s6_addr32   _S6_un._S6_u32
97 #  else
98 #    define s6_addr32   __u6_addr.__u6_addr32
99 #  endif
100 #endif
101
102 #if defined(HAVE_IN6_ADDR_GEN_MODE_NONE) || defined(ND6_IFF_AUTO_LINKLOCAL) || \
103     defined(IFF_NOLINKLOCAL)
104 /* Only add the LL address if we have a carrier, so DaD works. */
105 #define CAN_ADD_LLADDR(ifp) \
106     (!((ifp)->options->options & DHCPCD_LINK) || (ifp)->carrier != LINK_DOWN)
107 #ifdef __sun
108 /* Although we can add our own LL address, we cannot drop it
109  * without unplumbing the if which is a lot of code.
110  * So just keep it for the time being. */
111 #define CAN_DROP_LLADDR(ifp)    (0)
112 #else
113 #define CAN_DROP_LLADDR(ifp)    (1)
114 #endif
115 #else
116 /* We have no control over the OS adding the LLADDR, so just let it do it
117  * as we cannot force our own view on it. */
118 #define CAN_ADD_LLADDR(ifp)     (0)
119 #define CAN_DROP_LLADDR(ifp)    (0)
120 #endif
121
122 #ifdef IPV6_MANAGETEMPADDR
123 static void ipv6_regentempifid(void *);
124 static void ipv6_regentempaddr(void *);
125 #else
126 #define ipv6_regentempifid(a) {}
127 #endif
128
129 int
130 ipv6_init(struct dhcpcd_ctx *ctx)
131 {
132
133         if (ctx->ra_routers != NULL)
134                 return 0;
135
136         ctx->ra_routers = malloc(sizeof(*ctx->ra_routers));
137         if (ctx->ra_routers == NULL)
138                 return -1;
139         TAILQ_INIT(ctx->ra_routers);
140
141 #ifndef __sun
142         ctx->nd_fd = -1;
143 #endif
144         ctx->dhcp6_fd = -1;
145         return 0;
146 }
147
148 static ssize_t
149 ipv6_readsecret(struct dhcpcd_ctx *ctx)
150 {
151         FILE *fp;
152         char line[1024];
153         unsigned char *p;
154         size_t len;
155         uint32_t r;
156         int x;
157
158         if ((ctx->secret_len = read_hwaddr_aton(&ctx->secret, SECRET)) != 0)
159                 return (ssize_t)ctx->secret_len;
160
161         if (errno != ENOENT)
162                 logerr("%s: %s", __func__, SECRET);
163
164         /* Chaining arc4random should be good enough.
165          * RFC7217 section 5.1 states the key SHOULD be at least 128 bits.
166          * To attempt and future proof ourselves, we'll generate a key of
167          * 512 bits (64 bytes). */
168         if (ctx->secret_len < 64) {
169                 if ((ctx->secret = malloc(64)) == NULL) {
170                         logerr(__func__);
171                         return -1;
172                 }
173                 ctx->secret_len = 64;
174         }
175         p = ctx->secret;
176         for (len = 0; len < 512 / NBBY; len += sizeof(r)) {
177                 r = arc4random();
178                 memcpy(p, &r, sizeof(r));
179                 p += sizeof(r);
180         }
181
182         /* Ensure that only the dhcpcd user can read the secret.
183          * Write permission is also denied as chaning it would remove
184          * it's stability. */
185         if ((fp = fopen(SECRET, "w")) == NULL ||
186             chmod(SECRET, S_IRUSR) == -1)
187                 goto eexit;
188         x = fprintf(fp, "%s\n",
189             hwaddr_ntoa(ctx->secret, ctx->secret_len, line, sizeof(line)));
190         if (fclose(fp) == EOF)
191                 x = -1;
192         fp = NULL;
193         if (x > 0)
194                 return (ssize_t)ctx->secret_len;
195
196 eexit:
197         logerr("%s: %s", __func__, SECRET);
198         if (fp != NULL)
199                 fclose(fp);
200         unlink(SECRET);
201         ctx->secret_len = 0;
202         return -1;
203 }
204
205 /* http://www.iana.org/assignments/ipv6-interface-ids/ipv6-interface-ids.xhtml
206  * RFC5453 */
207 static const struct reslowhigh {
208         const uint8_t high[8];
209         const uint8_t low[8];
210 } reslowhigh[] = {
211         /* RFC4291 + RFC6543 */
212         { { 0x02, 0x00, 0x5e, 0xff, 0xfe, 0x00, 0x00, 0x00 },
213           { 0x02, 0x00, 0x5e, 0xff, 0xfe, 0xff, 0xff, 0xff } },
214         /* RFC2526 */
215         { { 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80 },
216           { 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } }
217 };
218
219 static int
220 ipv6_reserved(const struct in6_addr *addr)
221 {
222         uint64_t id, low, high;
223         size_t i;
224         const struct reslowhigh *r;
225
226         id = be64dec(addr->s6_addr + sizeof(id));
227         if (id == 0) /* RFC4291 */
228                 return 1;
229         for (i = 0; i < sizeof(reslowhigh) / sizeof(reslowhigh[0]); i++) {
230                 r = &reslowhigh[i];
231                 low = be64dec(r->low);
232                 high = be64dec(r->high);
233                 if (id >= low && id <= high)
234                         return 1;
235         }
236         return 0;
237 }
238
239 /* RFC7217 */
240 static int
241 ipv6_makestableprivate1(struct in6_addr *addr,
242     const struct in6_addr *prefix, int prefix_len,
243     const unsigned char *netiface, size_t netiface_len,
244     const unsigned char *netid, size_t netid_len,
245     unsigned short vlanid,
246     uint32_t *dad_counter,
247     const unsigned char *secret, size_t secret_len)
248 {
249         unsigned char buf[2048], *p, digest[SHA256_DIGEST_LENGTH];
250         size_t len, l;
251         SHA256_CTX ctx;
252
253         if (prefix_len < 0 || prefix_len > 120) {
254                 errno = EINVAL;
255                 return -1;
256         }
257
258         l = (size_t)(ROUNDUP8(prefix_len) / NBBY);
259         len = l + netiface_len + netid_len + sizeof(*dad_counter) + secret_len;
260         if (vlanid != 0)
261                 len += sizeof(vlanid);
262         if (len > sizeof(buf)) {
263                 errno = ENOBUFS;
264                 return -1;
265         }
266
267         for (;; (*dad_counter)++) {
268                 /* Combine all parameters into one buffer */
269                 p = buf;
270                 memcpy(p, prefix, l);
271                 p += l;
272                 memcpy(p, netiface, netiface_len);
273                 p += netiface_len;
274                 memcpy(p, netid, netid_len);
275                 p += netid_len;
276                 /* Don't use a vlanid if not set.
277                  * This ensures prior versions have the same unique address. */
278                 if (vlanid != 0) {
279                         memcpy(p, &vlanid, sizeof(vlanid));
280                         p += sizeof(vlanid);
281                 }
282                 memcpy(p, dad_counter, sizeof(*dad_counter));
283                 p += sizeof(*dad_counter);
284                 memcpy(p, secret, secret_len);
285
286                 /* Make an address using the digest of the above.
287                  * RFC7217 Section 5.1 states that we shouldn't use MD5.
288                  * Pity as we use that for HMAC-MD5 which is still deemed OK.
289                  * SHA-256 is recommended */
290                 SHA256_Init(&ctx);
291                 SHA256_Update(&ctx, buf, len);
292                 SHA256_Final(digest, &ctx);
293
294                 p = addr->s6_addr;
295                 memcpy(p, prefix, l);
296                 /* RFC7217 section 5.2 says we need to start taking the id from
297                  * the least significant bit */
298                 len = sizeof(addr->s6_addr) - l;
299                 memcpy(p + l, digest + (sizeof(digest) - len), len);
300
301                 /* Ensure that the Interface ID does not match a reserved one,
302                  * if it does then treat it as a DAD failure.
303                  * RFC7217 section 5.2 */
304                 if (prefix_len != 64)
305                         break;
306                 if (!ipv6_reserved(addr))
307                         break;
308         }
309
310         return 0;
311 }
312
313 int
314 ipv6_makestableprivate(struct in6_addr *addr,
315     const struct in6_addr *prefix, int prefix_len,
316     const struct interface *ifp,
317     int *dad_counter)
318 {
319         uint32_t dad;
320         int r;
321
322         if (ifp->ctx->secret_len == 0) {
323                 if (ipv6_readsecret(ifp->ctx) == -1)
324                         return -1;
325         }
326
327         dad = (uint32_t)*dad_counter;
328
329         /* For our implementation, we shall set the hardware address
330          * as the interface identifier */
331         r = ipv6_makestableprivate1(addr, prefix, prefix_len,
332             ifp->hwaddr, ifp->hwlen,
333             ifp->ssid, ifp->ssid_len,
334             ifp->vlanid, &dad,
335             ifp->ctx->secret, ifp->ctx->secret_len);
336
337         if (r == 0)
338                 *dad_counter = (int)dad;
339         return r;
340 }
341
342 int
343 ipv6_makeaddr(struct in6_addr *addr, struct interface *ifp,
344     const struct in6_addr *prefix, int prefix_len)
345 {
346         const struct ipv6_addr *ap;
347         int dad;
348
349         if (prefix_len < 0 || prefix_len > 120) {
350                 errno = EINVAL;
351                 return -1;
352         }
353
354         if (ifp->options->options & DHCPCD_SLAACPRIVATE) {
355                 dad = 0;
356                 if (ipv6_makestableprivate(addr,
357                     prefix, prefix_len, ifp, &dad) == -1)
358                         return -1;
359                 return dad;
360         }
361
362         if (prefix_len > 64) {
363                 errno = EINVAL;
364                 return -1;
365         }
366         if ((ap = ipv6_linklocal(ifp)) == NULL) {
367                 /* We delay a few functions until we get a local-link address
368                  * so this should never be hit. */
369                 errno = ENOENT;
370                 return -1;
371         }
372
373         /* Make the address from the first local-link address */
374         memcpy(addr, prefix, sizeof(*prefix));
375         addr->s6_addr32[2] = ap->addr.s6_addr32[2];
376         addr->s6_addr32[3] = ap->addr.s6_addr32[3];
377         return 0;
378 }
379
380 static int
381 ipv6_makeprefix(struct in6_addr *prefix, const struct in6_addr *addr, int len)
382 {
383         int bytes, bits;
384
385         if (len < 0 || len > 128) {
386                 errno = EINVAL;
387                 return -1;
388         }
389
390         bytes = len / NBBY;
391         bits = len % NBBY;
392         memcpy(&prefix->s6_addr, &addr->s6_addr, (size_t)bytes);
393         if (bits != 0) {
394                 /* Coverify false positive.
395                  * bytelen cannot be 16 if bitlen is non zero */
396                 /* coverity[overrun-local] */
397                 prefix->s6_addr[bytes] =
398                     (uint8_t)(prefix->s6_addr[bytes] >> (NBBY - bits));
399         }
400         memset((char *)prefix->s6_addr + bytes, 0,
401             sizeof(prefix->s6_addr) - (size_t)bytes);
402         return 0;
403 }
404
405 int
406 ipv6_mask(struct in6_addr *mask, int len)
407 {
408         static const unsigned char masks[NBBY] =
409             { 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff };
410         int bytes, bits, i;
411
412         if (len < 0 || len > 128) {
413                 errno = EINVAL;
414                 return -1;
415         }
416
417         memset(mask, 0, sizeof(*mask));
418         bytes = len / NBBY;
419         bits = len % NBBY;
420         for (i = 0; i < bytes; i++)
421                 mask->s6_addr[i] = 0xff;
422         if (bits != 0) {
423                 /* Coverify false positive.
424                  * bytelen cannot be 16 if bitlen is non zero */
425                 /* coverity[overrun-local] */
426                 mask->s6_addr[bytes] = masks[bits - 1];
427         }
428         return 0;
429 }
430
431 uint8_t
432 ipv6_prefixlen(const struct in6_addr *mask)
433 {
434         int x = 0, y;
435         const unsigned char *lim, *p;
436
437         lim = (const unsigned char *)mask + sizeof(*mask);
438         for (p = (const unsigned char *)mask; p < lim; x++, p++) {
439                 if (*p != 0xff)
440                         break;
441         }
442         y = 0;
443         if (p < lim) {
444                 for (y = 0; y < NBBY; y++) {
445                         if ((*p & (0x80 >> y)) == 0)
446                                 break;
447                 }
448         }
449
450         /*
451          * when the limit pointer is given, do a stricter check on the
452          * remaining bits.
453          */
454         if (p < lim) {
455                 if (y != 0 && (*p & (0x00ff >> y)) != 0)
456                         return 0;
457                 for (p = p + 1; p < lim; p++)
458                         if (*p != 0)
459                                 return 0;
460         }
461
462         return (uint8_t)(x * NBBY + y);
463 }
464
465 static void
466 in6_to_h64(uint64_t *vhigh, uint64_t *vlow, const struct in6_addr *addr)
467 {
468
469         *vhigh = be64dec(addr->s6_addr);
470         *vlow = be64dec(addr->s6_addr + 8);
471 }
472
473 static void
474 h64_to_in6(struct in6_addr *addr, uint64_t vhigh, uint64_t vlow)
475 {
476
477         be64enc(addr->s6_addr, vhigh);
478         be64enc(addr->s6_addr + 8, vlow);
479 }
480
481 int
482 ipv6_userprefix(
483         const struct in6_addr *prefix,  // prefix from router
484         short prefix_len,               // length of prefix received
485         uint64_t user_number,           // "random" number from user
486         struct in6_addr *result,        // resultant prefix
487         short result_len)               // desired prefix length
488 {
489         uint64_t vh, vl, user_low, user_high;
490
491         if (prefix_len < 1 || prefix_len > 128 ||
492             result_len < 1 || result_len > 128)
493         {
494                 errno = EINVAL;
495                 return -1;
496         }
497
498         /* Check that the user_number fits inside result_len less prefix_len */
499         if (result_len < prefix_len ||
500             fls64(user_number) > result_len - prefix_len)
501         {
502                errno = ERANGE;
503                return -1;
504         }
505
506         /* If user_number is zero, just copy the prefix into the result. */
507         if (user_number == 0) {
508                 *result = *prefix;
509                 return 0;
510         }
511
512         /* Shift user_number so it fit's just inside result_len.
513          * Shifting by 0 or sizeof(user_number) is undefined,
514          * so we cater for that. */
515         if (result_len == 128) {
516                 user_high = 0;
517                 user_low = user_number;
518         } else if (result_len > 64) {
519                 if (prefix_len >= 64)
520                         user_high = 0;
521                 else
522                         user_high = user_number >> (result_len - prefix_len);
523                 user_low = user_number << (128 - result_len);
524         } else if (result_len == 64) {
525                 user_high = user_number;
526                 user_low = 0;
527         } else {
528                 user_high = user_number << (64 - result_len);
529                 user_low = 0;
530         }
531
532         /* convert to two 64bit host order values */
533         in6_to_h64(&vh, &vl, prefix);
534
535         vh |= user_high;
536         vl |= user_low;
537
538         /* copy back result */
539         h64_to_in6(result, vh, vl);
540
541         return 0;
542 }
543
544 #ifdef IPV6_POLLADDRFLAG
545 void
546 ipv6_checkaddrflags(void *arg)
547 {
548         struct ipv6_addr *ia;
549         int flags;
550         const char *alias;
551
552         ia = arg;
553 #ifdef ALIAS_ADDR
554         alias = ia->alias;
555 #else
556         alias = NULL;
557 #endif
558         if ((flags = if_addrflags6(ia->iface, &ia->addr, alias)) == -1) {
559                 if (errno != EEXIST && errno != EADDRNOTAVAIL)
560                         logerr("%s: if_addrflags6", __func__);
561                 return;
562         }
563
564         if (!(flags & IN6_IFF_TENTATIVE)) {
565                 /* Simulate the kernel announcing the new address. */
566                 ipv6_handleifa(ia->iface->ctx, RTM_NEWADDR,
567                     ia->iface->ctx->ifaces, ia->iface->name,
568                     &ia->addr, ia->prefix_len, flags, 0);
569         } else {
570                 /* Still tentative? Check again in a bit. */
571                 struct timespec tv;
572
573                 ms_to_ts(&tv, RETRANS_TIMER / 2);
574                 eloop_timeout_add_tv(ia->iface->ctx->eloop, &tv,
575                     ipv6_checkaddrflags, ia);
576         }
577 }
578 #endif
579
580 static void
581 ipv6_deletedaddr(struct ipv6_addr *ia)
582 {
583
584 #ifdef SMALL
585         UNUSED(ia);
586 #else
587         /* NOREJECT is set if we delegated exactly the prefix to another
588          * address.
589          * This can only be one address, so just clear the flag.
590          * This should ensure the reject route will be restored. */
591         if (ia->delegating_prefix != NULL)
592                 ia->delegating_prefix->flags &= ~IPV6_AF_NOREJECT;
593 #endif
594 }
595
596 void
597 ipv6_deleteaddr(struct ipv6_addr *ia)
598 {
599         struct ipv6_state *state;
600         struct ipv6_addr *ap;
601
602         loginfox("%s: deleting address %s", ia->iface->name, ia->saddr);
603         if (if_address6(RTM_DELADDR, ia) == -1 &&
604             errno != EADDRNOTAVAIL && errno != ESRCH &&
605             errno != ENXIO && errno != ENODEV)
606                 logerr(__func__);
607
608         ipv6_deletedaddr(ia);
609
610         state = IPV6_STATE(ia->iface);
611         TAILQ_FOREACH(ap, &state->addrs, next) {
612                 if (IN6_ARE_ADDR_EQUAL(&ap->addr, &ia->addr)) {
613                         TAILQ_REMOVE(&state->addrs, ap, next);
614                         ipv6_freeaddr(ap);
615                         break;
616                 }
617         }
618
619 #ifdef ND6_ADVERTISE
620         /* Advertise the address if it exists on another interface. */
621         ipv6nd_advertise(ia);
622 #endif
623 }
624
625 static int
626 ipv6_addaddr1(struct ipv6_addr *ia, const struct timespec *now)
627 {
628         struct interface *ifp;
629         uint32_t pltime, vltime;
630         __printflike(1, 2) void (*logfunc)(const char *, ...);
631 #ifdef ND6_ADVERTISE
632         bool vltime_was_zero = ia->prefix_vltime == 0;
633 #endif
634 #ifdef __sun
635         struct ipv6_state *state;
636         struct ipv6_addr *ia2;
637
638         /* If we re-add then address on Solaris then the prefix
639          * route will be scrubbed and re-added. Something might
640          * be using it, so let's avoid it. */
641         if (ia->flags & IPV6_AF_DADCOMPLETED) {
642                 logdebugx("%s: IP address %s already exists",
643                     ia->iface->name, ia->saddr);
644 #ifdef ND6_ADVERTISE
645                 goto advertise;
646 #else
647                 return 0;
648 #endif
649         }
650 #endif
651
652         /* Remember the interface of the address. */
653         ifp = ia->iface;
654
655         if (!(ia->flags & IPV6_AF_DADCOMPLETED) &&
656             ipv6_iffindaddr(ifp, &ia->addr, IN6_IFF_NOTUSEABLE))
657                 ia->flags |= IPV6_AF_DADCOMPLETED;
658
659         /* Adjust plftime and vltime based on acquired time */
660         pltime = ia->prefix_pltime;
661         vltime = ia->prefix_vltime;
662         if (timespecisset(&ia->acquired) &&
663             (ia->prefix_pltime != ND6_INFINITE_LIFETIME ||
664             ia->prefix_vltime != ND6_INFINITE_LIFETIME))
665         {
666                 struct timespec n;
667
668                 if (now == NULL) {
669                         clock_gettime(CLOCK_MONOTONIC, &n);
670                         now = &n;
671                 }
672                 timespecsub(now, &ia->acquired, &n);
673                 if (ia->prefix_pltime != ND6_INFINITE_LIFETIME) {
674                         ia->prefix_pltime -= (uint32_t)n.tv_sec;
675                         /* This can happen when confirming a
676                          * deprecated but still valid lease. */
677                         if (ia->prefix_pltime > pltime)
678                                 ia->prefix_pltime = 0;
679                 }
680                 if (ia->prefix_vltime != ND6_INFINITE_LIFETIME) {
681                         ia->prefix_vltime -= (uint32_t)n.tv_sec;
682                         /* This should never happen. */
683                         if (ia->prefix_vltime > vltime) {
684                                 logerrx("%s: %s: lifetime overflow",
685                                     ifp->name, ia->saddr);
686                                 ia->prefix_vltime = ia->prefix_pltime = 0;
687                         }
688                 }
689         }
690
691         logfunc = ia->flags & IPV6_AF_NEW ? loginfox : logdebugx;
692         logfunc("%s: adding %saddress %s", ifp->name,
693 #ifdef IPV6_AF_TEMPORARY
694             ia->flags & IPV6_AF_TEMPORARY ? "temporary " : "",
695 #else
696             "",
697 #endif
698             ia->saddr);
699         if (ia->prefix_pltime == ND6_INFINITE_LIFETIME &&
700             ia->prefix_vltime == ND6_INFINITE_LIFETIME)
701                 logdebugx("%s: pltime infinity, vltime infinity",
702                     ifp->name);
703         else if (ia->prefix_pltime == ND6_INFINITE_LIFETIME)
704                 logdebugx("%s: pltime infinity, vltime %"PRIu32" seconds",
705                     ifp->name, ia->prefix_vltime);
706         else if (ia->prefix_vltime == ND6_INFINITE_LIFETIME)
707                 logdebugx("%s: pltime %"PRIu32"seconds, vltime infinity",
708                     ifp->name, ia->prefix_pltime);
709         else
710                 logdebugx("%s: pltime %"PRIu32" seconds, vltime %"PRIu32
711                     " seconds",
712                     ifp->name, ia->prefix_pltime, ia->prefix_vltime);
713
714         if (if_address6(RTM_NEWADDR, ia) == -1) {
715                 logerr(__func__);
716                 /* Restore real pltime and vltime */
717                 ia->prefix_pltime = pltime;
718                 ia->prefix_vltime = vltime;
719                 return -1;
720         }
721
722 #ifdef IPV6_MANAGETEMPADDR
723         /* RFC4941 Section 3.4 */
724         if (ia->flags & IPV6_AF_TEMPORARY &&
725             ia->prefix_pltime &&
726             ia->prefix_vltime &&
727             ip6_use_tempaddr(ifp->name))
728                 eloop_timeout_add_sec(ifp->ctx->eloop,
729                     (time_t)ia->prefix_pltime - REGEN_ADVANCE,
730                     ipv6_regentempaddr, ia);
731 #endif
732
733         /* Restore real pltime and vltime */
734         ia->prefix_pltime = pltime;
735         ia->prefix_vltime = vltime;
736
737         ia->flags &= ~IPV6_AF_NEW;
738         ia->flags |= IPV6_AF_ADDED;
739 #ifndef SMALL
740         if (ia->delegating_prefix != NULL)
741                 ia->flags |= IPV6_AF_DELEGATED;
742 #endif
743
744 #ifdef IPV6_POLLADDRFLAG
745         eloop_timeout_delete(ifp->ctx->eloop,
746                 ipv6_checkaddrflags, ia);
747         if (!(ia->flags & IPV6_AF_DADCOMPLETED)) {
748                 struct timespec tv;
749
750                 ms_to_ts(&tv, RETRANS_TIMER / 2);
751                 eloop_timeout_add_tv(ifp->ctx->eloop,
752                     &tv, ipv6_checkaddrflags, ia);
753         }
754 #endif
755
756 #ifdef __sun
757         /* Solaris does not announce new addresses which need DaD
758          * so we need to take a copy and add it to our list.
759          * Otherwise aliasing gets confused if we add another
760          * address during DaD. */
761
762         state = IPV6_STATE(ifp);
763         TAILQ_FOREACH(ia2, &state->addrs, next) {
764                 if (IN6_ARE_ADDR_EQUAL(&ia2->addr, &ia->addr))
765                         break;
766         }
767         if (ia2 == NULL) {
768                 if ((ia2 = malloc(sizeof(*ia2))) == NULL) {
769                         logerr(__func__);
770                         return 0; /* Well, we did add the address */
771                 }
772                 memcpy(ia2, ia, sizeof(*ia2));
773                 TAILQ_INSERT_TAIL(&state->addrs, ia2, next);
774         }
775 #endif
776
777 #ifdef ND6_ADVERTISE
778 #ifdef __sun
779 advertise:
780 #endif
781         /* Re-advertise the preferred address to be safe. */
782         if (!vltime_was_zero)
783                 ipv6nd_advertise(ia);
784 #endif
785
786         return 0;
787 }
788
789 #ifdef ALIAS_ADDR
790 /* Find the next logical alias address we can use. */
791 static int
792 ipv6_aliasaddr(struct ipv6_addr *ia, struct ipv6_addr **repl)
793 {
794         struct ipv6_state *state;
795         struct ipv6_addr *iap;
796         unsigned int lun;
797         char alias[IF_NAMESIZE];
798
799         if (ia->alias[0] != '\0')
800                 return 0;
801         state = IPV6_STATE(ia->iface);
802
803         /* First find an existng address.
804          * This can happen when dhcpcd restarts as ND and DHCPv6
805          * maintain their own lists of addresses. */
806         TAILQ_FOREACH(iap, &state->addrs, next) {
807                 if (iap->alias[0] != '\0' &&
808                     IN6_ARE_ADDR_EQUAL(&iap->addr, &ia->addr))
809                 {
810                         strlcpy(ia->alias, iap->alias, sizeof(ia->alias));
811                         return 0;
812                 }
813         }
814
815         lun = 0;
816 find_unit:
817         if (if_makealias(alias, IF_NAMESIZE, ia->iface->name, lun) >=
818             IF_NAMESIZE)
819         {
820                 errno = ENOMEM;
821                 return -1;
822         }
823         TAILQ_FOREACH(iap, &state->addrs, next) {
824                 if (iap->alias[0] == '\0')
825                         continue;
826                 if (IN6_IS_ADDR_UNSPECIFIED(&iap->addr)) {
827                         /* No address assigned? Lets use it. */
828                         strlcpy(ia->alias, iap->alias, sizeof(ia->alias));
829                         if (repl)
830                                 *repl = iap;
831                         return 1;
832                 }
833                 if (strcmp(iap->alias, alias) == 0)
834                         break;
835         }
836
837         if (iap != NULL) {
838                 if (lun == UINT_MAX) {
839                         errno = ERANGE;
840                         return -1;
841                 }
842                 lun++;
843                 goto find_unit;
844         }
845
846         strlcpy(ia->alias, alias, sizeof(ia->alias));
847         return 0;
848 }
849 #endif
850
851 int
852 ipv6_addaddr(struct ipv6_addr *ia, const struct timespec *now)
853 {
854         int r;
855 #ifdef ALIAS_ADDR
856         int replaced, blank;
857         struct ipv6_addr *replaced_ia;
858
859         blank = (ia->alias[0] == '\0');
860         if ((replaced = ipv6_aliasaddr(ia, &replaced_ia)) == -1)
861                 return -1;
862         if (blank)
863                 logdebugx("%s: aliased %s", ia->alias, ia->saddr);
864 #endif
865
866         if ((r = ipv6_addaddr1(ia, now)) == 0) {
867 #ifdef ALIAS_ADDR
868                 if (replaced) {
869                         struct ipv6_state *state;
870
871                         state = IPV6_STATE(ia->iface);
872                         TAILQ_REMOVE(&state->addrs, replaced_ia, next);
873                         ipv6_freeaddr(replaced_ia);
874                 }
875 #endif
876         }
877         return r;
878 }
879
880 int
881 ipv6_findaddrmatch(const struct ipv6_addr *addr, const struct in6_addr *match,
882     unsigned int flags)
883 {
884
885         if (match == NULL) {
886                 if ((addr->flags &
887                     (IPV6_AF_ADDED | IPV6_AF_DADCOMPLETED)) ==
888                     (IPV6_AF_ADDED | IPV6_AF_DADCOMPLETED))
889                         return 1;
890         } else if (addr->prefix_vltime &&
891             IN6_ARE_ADDR_EQUAL(&addr->addr, match) &&
892             (!flags || addr->flags & flags))
893                 return 1;
894
895         return 0;
896 }
897
898 struct ipv6_addr *
899 ipv6_findaddr(struct dhcpcd_ctx *ctx, const struct in6_addr *addr, unsigned int flags)
900 {
901         struct ipv6_addr *nap;
902 #ifdef DHCP6
903         struct ipv6_addr *dap;
904 #endif
905
906         nap = ipv6nd_findaddr(ctx, addr, flags);
907 #ifdef DHCP6
908         dap = dhcp6_findaddr(ctx, addr, flags);
909         if (!dap && !nap)
910                 return NULL;
911         if (dap && !nap)
912                 return dap;
913         if (nap && !dap)
914                 return nap;
915         if (nap->iface->metric < dap->iface->metric)
916                 return nap;
917         return dap;
918 #else
919         return nap;
920 #endif
921 }
922
923 int
924 ipv6_doaddr(struct ipv6_addr *ia, struct timespec *now)
925 {
926
927         /* A delegated prefix is not an address. */
928         if (ia->flags & IPV6_AF_DELEGATEDPFX)
929                 return 0;
930
931         if (ia->prefix_vltime == 0) {
932                 if (ia->flags & IPV6_AF_ADDED)
933                         ipv6_deleteaddr(ia);
934                 eloop_q_timeout_delete(ia->iface->ctx->eloop,
935                     0, NULL, ia);
936                 if (ia->flags & IPV6_AF_REQUEST) {
937                         ia->flags &= ~IPV6_AF_ADDED;
938                         return 0;
939                 }
940                 return -1;
941         }
942
943         if (ia->flags & IPV6_AF_STALE ||
944             IN6_IS_ADDR_UNSPECIFIED(&ia->addr))
945                 return 0;
946
947         if (!timespecisset(now))
948                 clock_gettime(CLOCK_MONOTONIC, now);
949         ipv6_addaddr(ia, now);
950         return ia->flags & IPV6_AF_NEW ? 1 : 0;
951 }
952
953 ssize_t
954 ipv6_addaddrs(struct ipv6_addrhead *iaddrs)
955 {
956         struct timespec now;
957         struct ipv6_addr *ia, *ian;
958         ssize_t i, r;
959
960         i = 0;
961         timespecclear(&now);
962         TAILQ_FOREACH_SAFE(ia, iaddrs, next, ian) {
963                 r = ipv6_doaddr(ia, &now);
964                 if (r != 0)
965                         i++;
966                 if (r == -1) {
967                         TAILQ_REMOVE(iaddrs, ia, next);
968                         ipv6_freeaddr(ia);
969                 }
970         }
971         return i;
972 }
973
974 void
975 ipv6_freeaddr(struct ipv6_addr *ia)
976 {
977 #ifndef SMALL
978         struct ipv6_addr *iad;
979
980         /* Forget the reference */
981         if (ia->flags & IPV6_AF_DELEGATEDPFX) {
982                 TAILQ_FOREACH(iad, &ia->pd_pfxs, pd_next) {
983                         iad->delegating_prefix = NULL;
984                 }
985         } else if (ia->delegating_prefix != NULL) {
986                 TAILQ_REMOVE(&ia->delegating_prefix->pd_pfxs, ia, pd_next);
987         }
988 #endif
989
990         if (ia->dhcp6_fd != -1) {
991                 close(ia->dhcp6_fd);
992                 eloop_event_delete(ia->iface->ctx->eloop, ia->dhcp6_fd);
993         }
994
995         eloop_q_timeout_delete(ia->iface->ctx->eloop, 0, NULL, ia);
996         free(ia->na);
997         free(ia);
998 }
999
1000 void
1001 ipv6_freedrop_addrs(struct ipv6_addrhead *addrs, int drop,
1002     const struct interface *ifd)
1003 {
1004         struct ipv6_addr *ap, *apn, *apf;
1005         struct timespec now;
1006
1007 #ifdef SMALL
1008         UNUSED(ifd);
1009 #endif
1010         timespecclear(&now);
1011         TAILQ_FOREACH_SAFE(ap, addrs, next, apn) {
1012 #ifndef SMALL
1013                 if (ifd != NULL &&
1014                     (ap->delegating_prefix == NULL ||
1015                     ap->delegating_prefix->iface != ifd))
1016                         continue;
1017 #endif
1018                 if (drop != 2)
1019                         TAILQ_REMOVE(addrs, ap, next);
1020                 if (drop && ap->flags & IPV6_AF_ADDED &&
1021                     (ap->iface->options->options &
1022                     (DHCPCD_EXITING | DHCPCD_PERSISTENT)) !=
1023                     (DHCPCD_EXITING | DHCPCD_PERSISTENT))
1024                 {
1025                         /* Don't drop link-local addresses. */
1026                         if (!IN6_IS_ADDR_LINKLOCAL(&ap->addr) ||
1027                             CAN_DROP_LLADDR(ap->iface))
1028                         {
1029                                 if (drop == 2)
1030                                         TAILQ_REMOVE(addrs, ap, next);
1031                                 /* Find the same address somewhere else */
1032                                 apf = ipv6_findaddr(ap->iface->ctx, &ap->addr,
1033                                     0);
1034                                 if ((apf == NULL ||
1035                                     (apf->iface != ap->iface)))
1036                                         ipv6_deleteaddr(ap);
1037                                 if (!(ap->iface->options->options &
1038                                     DHCPCD_EXITING) && apf)
1039                                 {
1040                                         if (!timespecisset(&now))
1041                                                 clock_gettime(CLOCK_MONOTONIC,
1042                                                     &now);
1043                                         ipv6_addaddr(apf, &now);
1044                                 }
1045                                 if (drop == 2)
1046                                         ipv6_freeaddr(ap);
1047                         }
1048                 }
1049                 if (drop != 2)
1050                         ipv6_freeaddr(ap);
1051         }
1052 }
1053
1054 static struct ipv6_state *
1055 ipv6_getstate(struct interface *ifp)
1056 {
1057         struct ipv6_state *state;
1058
1059         state = IPV6_STATE(ifp);
1060         if (state == NULL) {
1061                 ifp->if_data[IF_DATA_IPV6] = calloc(1, sizeof(*state));
1062                 state = IPV6_STATE(ifp);
1063                 if (state == NULL) {
1064                         logerr(__func__);
1065                         return NULL;
1066                 }
1067                 TAILQ_INIT(&state->addrs);
1068                 TAILQ_INIT(&state->ll_callbacks);
1069
1070                 /* Regenerate new ids */
1071                 if (ifp->options &&
1072                     ip6_use_tempaddr(ifp->name))
1073                         ipv6_regentempifid(ifp);
1074         }
1075         return state;
1076 }
1077
1078 struct ipv6_addr *
1079 ipv6_anyglobal(struct interface *sifp)
1080 {
1081         struct interface *ifp;
1082         struct ipv6_state *state;
1083         struct ipv6_addr *ia;
1084
1085         TAILQ_FOREACH(ifp, sifp->ctx->ifaces, next) {
1086                 if (ifp != sifp && ip6_forwarding(ifp->name) != 1)
1087                         continue;
1088
1089                 state = IPV6_STATE(ifp);
1090                 if (state == NULL)
1091                         continue;
1092
1093                 TAILQ_FOREACH(ia, &state->addrs, next) {
1094                         if (IN6_IS_ADDR_LINKLOCAL(&ia->addr))
1095                                 continue;
1096                         /* Let's be optimistic.
1097                          * Any decent OS won't forward or accept traffic
1098                          * from/to tentative or detached addresses. */
1099                         if (!(ia->addr_flags & IN6_IFF_DUPLICATED))
1100                                 return ia;
1101                 }
1102         }
1103         return NULL;
1104 }
1105
1106 void
1107 ipv6_handleifa(struct dhcpcd_ctx *ctx,
1108     int cmd, struct if_head *ifs, const char *ifname,
1109     const struct in6_addr *addr, uint8_t prefix_len, int addrflags, pid_t pid)
1110 {
1111         struct interface *ifp;
1112         struct ipv6_state *state;
1113         struct ipv6_addr *ia;
1114         struct ll_callback *cb;
1115         bool anyglobal;
1116
1117 #ifdef __sun
1118         struct sockaddr_in6 subnet;
1119
1120         /* Solaris on-link route is an unspecified address! */
1121         if (IN6_IS_ADDR_UNSPECIFIED(addr)) {
1122                 if (if_getsubnet(ctx, ifname, AF_INET6,
1123                     &subnet, sizeof(subnet)) == -1)
1124                 {
1125                         logerr(__func__);
1126                         return;
1127                 }
1128                 addr = &subnet.sin6_addr;
1129         }
1130 #endif
1131
1132 #if 0
1133         char dbuf[INET6_ADDRSTRLEN];
1134         const char *dbp;
1135
1136         dbp = inet_ntop(AF_INET6, &addr->s6_addr,
1137             dbuf, INET6_ADDRSTRLEN);
1138         loginfox("%s: cmd %d addr %s addrflags %d",
1139             ifname, cmd, dbp, addrflags);
1140 #endif
1141
1142         if (ifs == NULL)
1143                 ifs = ctx->ifaces;
1144         if (ifs == NULL)
1145                 return;
1146         if ((ifp = if_find(ifs, ifname)) == NULL)
1147                 return;
1148         if ((state = ipv6_getstate(ifp)) == NULL)
1149                 return;
1150         anyglobal = ipv6_anyglobal(ifp) != NULL;
1151
1152         TAILQ_FOREACH(ia, &state->addrs, next) {
1153                 if (IN6_ARE_ADDR_EQUAL(&ia->addr, addr))
1154                         break;
1155         }
1156
1157         switch (cmd) {
1158         case RTM_DELADDR:
1159                 if (ia != NULL) {
1160                         TAILQ_REMOVE(&state->addrs, ia, next);
1161 #ifdef ND6_ADVERTISE
1162                         /* Advertise the address if it exists on
1163                          * another interface. */
1164                         ipv6nd_advertise(ia);
1165 #endif
1166                         /* We'll free it at the end of the function. */
1167                 }
1168                 break;
1169         case RTM_NEWADDR:
1170                 if (ia == NULL) {
1171                         ia = ipv6_newaddr(ifp, addr, prefix_len, 0);
1172 #ifdef ALIAS_ADDR
1173                         strlcpy(ia->alias, ifname, sizeof(ia->alias));
1174 #endif
1175                         if (if_getlifetime6(ia) == -1) {
1176                                 /* No support or address vanished.
1177                                  * Either way, just set a deprecated
1178                                  * infinite time lifetime and continue.
1179                                  * This is fine because we only want
1180                                  * to know this when trying to extend
1181                                  * temporary addresses.
1182                                  * As we can't extend infinite, we'll
1183                                  * create a new temporary address. */
1184                                 ia->prefix_pltime = 0;
1185                                 ia->prefix_vltime =
1186                                     ND6_INFINITE_LIFETIME;
1187                         }
1188                         /* This is a minor regression against RFC 4941
1189                          * because the kernel only knows when the
1190                          * lifetimes were last updated, not when the
1191                          * address was initially created.
1192                          * Provided dhcpcd is not restarted, this
1193                          * won't be a problem.
1194                          * If we don't like it, we can always
1195                          * pretend lifetimes are infinite and always
1196                          * generate a new temporary address on
1197                          * restart. */
1198                         ia->acquired = ia->created;
1199                         TAILQ_INSERT_TAIL(&state->addrs, ia, next);
1200                 }
1201                 ia->addr_flags = addrflags;
1202                 ia->flags &= ~IPV6_AF_STALE;
1203 #ifdef IPV6_MANAGETEMPADDR
1204                 if (ia->addr_flags & IN6_IFF_TEMPORARY)
1205                         ia->flags |= IPV6_AF_TEMPORARY;
1206 #endif
1207                 if (IN6_IS_ADDR_LINKLOCAL(&ia->addr) || ia->dadcallback) {
1208 #ifdef IPV6_POLLADDRFLAG
1209                         if (ia->addr_flags & IN6_IFF_TENTATIVE) {
1210                                 struct timespec tv;
1211
1212                                 ms_to_ts(&tv, RETRANS_TIMER / 2);
1213                                 eloop_timeout_add_tv(
1214                                     ia->iface->ctx->eloop,
1215                                     &tv, ipv6_checkaddrflags, ia);
1216                                 break;
1217                         }
1218 #endif
1219
1220                         if (ia->dadcallback) {
1221                                 ia->dadcallback(ia);
1222                                 if (ctx->options & DHCPCD_FORKED)
1223                                         goto out;
1224                         }
1225
1226                         if (IN6_IS_ADDR_LINKLOCAL(&ia->addr) &&
1227                             !(ia->addr_flags & IN6_IFF_NOTUSEABLE))
1228                         {
1229                                 /* Now run any callbacks.
1230                                  * Typically IPv6RS or DHCPv6 */
1231                                 while ((cb =
1232                                     TAILQ_FIRST(&state->ll_callbacks)))
1233                                 {
1234                                         TAILQ_REMOVE(
1235                                             &state->ll_callbacks,
1236                                             cb, next);
1237                                         cb->callback(cb->arg);
1238                                         free(cb);
1239                                         if (ctx->options & DHCPCD_FORKED)
1240                                                 goto out;
1241                                 }
1242                         }
1243                 }
1244                 break;
1245         }
1246
1247         if (ia == NULL)
1248                 return;
1249
1250         ctx->options &= ~DHCPCD_RTBUILD;
1251         ipv6nd_handleifa(cmd, ia, pid);
1252 #ifdef DHCP6
1253         dhcp6_handleifa(cmd, ia, pid);
1254 #endif
1255
1256 out:
1257         /* Done with the ia now, so free it. */
1258         if (cmd == RTM_DELADDR)
1259                 ipv6_freeaddr(ia);
1260         else if (!(ia->addr_flags & IN6_IFF_NOTUSEABLE))
1261                 ia->flags |= IPV6_AF_DADCOMPLETED;
1262
1263         /* If we've not already called rt_build via the IPv6ND
1264          * or DHCP6 handlers and the existance of any useable
1265          * global address on the interface has changed,
1266          * call rt_build to add/remove the default route. */
1267         if (ifp->active &&
1268             ((ifp->options != NULL && ifp->options->options & DHCPCD_IPV6) ||
1269              (ifp->options == NULL && ctx->options & DHCPCD_IPV6)) &&
1270             !(ctx->options & DHCPCD_RTBUILD) &&
1271             (ipv6_anyglobal(ifp) != NULL) != anyglobal)
1272                 rt_build(ctx, AF_INET6);
1273 }
1274
1275 int
1276 ipv6_hasaddr(const struct interface *ifp)
1277 {
1278
1279         if (ipv6nd_iffindaddr(ifp, NULL, 0) != NULL)
1280                 return 1;
1281 #ifdef DHCP6
1282         if (dhcp6_iffindaddr(ifp, NULL, 0) != NULL)
1283                 return 1;
1284 #endif
1285         return 0;
1286 }
1287
1288 struct ipv6_addr *
1289 ipv6_iffindaddr(struct interface *ifp, const struct in6_addr *addr,
1290     int revflags)
1291 {
1292         struct ipv6_state *state;
1293         struct ipv6_addr *ap;
1294
1295         state = IPV6_STATE(ifp);
1296         if (state) {
1297                 TAILQ_FOREACH(ap, &state->addrs, next) {
1298                         if (addr == NULL) {
1299                                 if (IN6_IS_ADDR_LINKLOCAL(&ap->addr) &&
1300                                     (!revflags || !(ap->addr_flags & revflags)))
1301                                         return ap;
1302                         } else {
1303                                 if (IN6_ARE_ADDR_EQUAL(&ap->addr, addr) &&
1304                                     (!revflags || !(ap->addr_flags & revflags)))
1305                                         return ap;
1306                         }
1307                 }
1308         }
1309         return NULL;
1310 }
1311
1312 static struct ipv6_addr *
1313 ipv6_iffindmaskaddr(const struct interface *ifp, const struct in6_addr *addr)
1314 {
1315         struct ipv6_state *state;
1316         struct ipv6_addr *ap;
1317         struct in6_addr mask;
1318
1319         state = IPV6_STATE(ifp);
1320         if (state) {
1321                 TAILQ_FOREACH(ap, &state->addrs, next) {
1322                         if (ipv6_mask(&mask, ap->prefix_len) == -1)
1323                                 continue;
1324                         if (IN6_ARE_MASKED_ADDR_EQUAL(&ap->addr, addr, &mask))
1325                                 return ap;
1326                 }
1327         }
1328         return NULL;
1329 }
1330
1331 struct ipv6_addr *
1332 ipv6_findmaskaddr(struct dhcpcd_ctx *ctx, const struct in6_addr *addr)
1333 {
1334         struct interface *ifp;
1335         struct ipv6_addr *ap;
1336
1337         TAILQ_FOREACH(ifp, ctx->ifaces, next) {
1338                 ap = ipv6_iffindmaskaddr(ifp, addr);
1339                 if (ap != NULL)
1340                         return ap;
1341         }
1342         return NULL;
1343 }
1344
1345 int
1346 ipv6_addlinklocalcallback(struct interface *ifp,
1347     void (*callback)(void *), void *arg)
1348 {
1349         struct ipv6_state *state;
1350         struct ll_callback *cb;
1351
1352         state = ipv6_getstate(ifp);
1353         TAILQ_FOREACH(cb, &state->ll_callbacks, next) {
1354                 if (cb->callback == callback && cb->arg == arg)
1355                         break;
1356         }
1357         if (cb == NULL) {
1358                 cb = malloc(sizeof(*cb));
1359                 if (cb == NULL) {
1360                         logerr(__func__);
1361                         return -1;
1362                 }
1363                 cb->callback = callback;
1364                 cb->arg = arg;
1365                 TAILQ_INSERT_TAIL(&state->ll_callbacks, cb, next);
1366         }
1367         return 0;
1368 }
1369
1370 static struct ipv6_addr *
1371 ipv6_newlinklocal(struct interface *ifp)
1372 {
1373         struct ipv6_addr *ia;
1374         struct in6_addr in6;
1375
1376         memset(&in6, 0, sizeof(in6));
1377         in6.s6_addr32[0] = htonl(0xfe800000);
1378         ia = ipv6_newaddr(ifp, &in6, 64, 0);
1379         if (ia != NULL) {
1380                 ia->prefix_pltime = ND6_INFINITE_LIFETIME;
1381                 ia->prefix_vltime = ND6_INFINITE_LIFETIME;
1382         }
1383         return ia;
1384 }
1385
1386 static const uint8_t allzero[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
1387 static const uint8_t allone[8] =
1388     { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1389
1390 static int
1391 ipv6_addlinklocal(struct interface *ifp)
1392 {
1393         struct ipv6_state *state;
1394         struct ipv6_addr *ap, *ap2;
1395         int dadcounter;
1396
1397         /* Check sanity before malloc */
1398         if (!(ifp->options->options & DHCPCD_SLAACPRIVATE)) {
1399                 switch (ifp->family) {
1400                 case ARPHRD_ETHER:
1401                         /* Check for a valid hardware address */
1402                         if (ifp->hwlen != 6 && ifp->hwlen != 8) {
1403                                 errno = ENOTSUP;
1404                                 return -1;
1405                         }
1406                         if (memcmp(ifp->hwaddr, allzero, ifp->hwlen) == 0 ||
1407                             memcmp(ifp->hwaddr, allone, ifp->hwlen) == 0)
1408                         {
1409                                 errno = EINVAL;
1410                                 return -1;
1411                         }
1412                         break;
1413                 default:
1414                         errno = ENOTSUP;
1415                         return -1;
1416                 }
1417         }
1418
1419         state = ipv6_getstate(ifp);
1420         if (state == NULL)
1421                 return -1;
1422
1423         ap = ipv6_newlinklocal(ifp);
1424         if (ap == NULL)
1425                 return -1;
1426
1427         dadcounter = 0;
1428         if (ifp->options->options & DHCPCD_SLAACPRIVATE) {
1429 nextslaacprivate:
1430                 if (ipv6_makestableprivate(&ap->addr,
1431                         &ap->prefix, ap->prefix_len, ifp, &dadcounter) == -1)
1432                 {
1433                         free(ap);
1434                         return -1;
1435                 }
1436                 ap->dadcounter = dadcounter;
1437         } else {
1438                 memcpy(ap->addr.s6_addr, ap->prefix.s6_addr, 8);
1439                 switch (ifp->family) {
1440                 case ARPHRD_ETHER:
1441                         if (ifp->hwlen == 6) {
1442                                 ap->addr.s6_addr[ 8] = ifp->hwaddr[0];
1443                                 ap->addr.s6_addr[ 9] = ifp->hwaddr[1];
1444                                 ap->addr.s6_addr[10] = ifp->hwaddr[2];
1445                                 ap->addr.s6_addr[11] = 0xff;
1446                                 ap->addr.s6_addr[12] = 0xfe;
1447                                 ap->addr.s6_addr[13] = ifp->hwaddr[3];
1448                                 ap->addr.s6_addr[14] = ifp->hwaddr[4];
1449                                 ap->addr.s6_addr[15] = ifp->hwaddr[5];
1450                         } else if (ifp->hwlen == 8)
1451                                 memcpy(&ap->addr.s6_addr[8], ifp->hwaddr, 8);
1452                         else {
1453                                 free(ap);
1454                                 errno = ENOTSUP;
1455                                 return -1;
1456                         }
1457                         break;
1458                 }
1459
1460                 /* Sanity check: g bit must not indciate "group" */
1461                 if (EUI64_GROUP(&ap->addr)) {
1462                         free(ap);
1463                         errno = EINVAL;
1464                         return -1;
1465                 }
1466                 EUI64_TO_IFID(&ap->addr);
1467         }
1468
1469         /* Do we already have this address? */
1470         TAILQ_FOREACH(ap2, &state->addrs, next) {
1471                 if (IN6_ARE_ADDR_EQUAL(&ap->addr, &ap2->addr)) {
1472                         if (ap2->addr_flags & IN6_IFF_DUPLICATED) {
1473                                 if (ifp->options->options &
1474                                     DHCPCD_SLAACPRIVATE)
1475                                 {
1476                                         dadcounter++;
1477                                         goto nextslaacprivate;
1478                                 }
1479                                 free(ap);
1480                                 errno = EADDRNOTAVAIL;
1481                                 return -1;
1482                         }
1483
1484                         logwarnx("%s: waiting for %s to complete",
1485                             ap2->iface->name, ap2->saddr);
1486                         free(ap);
1487                         errno = EEXIST;
1488                         return 0;
1489                 }
1490         }
1491
1492         inet_ntop(AF_INET6, &ap->addr, ap->saddr, sizeof(ap->saddr));
1493         TAILQ_INSERT_TAIL(&state->addrs, ap, next);
1494         ipv6_addaddr(ap, NULL);
1495         return 1;
1496 }
1497
1498 static int
1499 ipv6_tryaddlinklocal(struct interface *ifp)
1500 {
1501         struct ipv6_addr *ia;
1502
1503         /* We can't assign a link-locak address to this,
1504          * the ppp process has to. */
1505         if (ifp->flags & IFF_POINTOPOINT)
1506                 return 0;
1507
1508         ia = ipv6_iffindaddr(ifp, NULL, IN6_IFF_DUPLICATED);
1509         if (ia != NULL) {
1510 #ifdef IPV6_POLLADDRFLAG
1511                 if (ia->addr_flags & IN6_IFF_TENTATIVE) {
1512                         struct timespec tv;
1513
1514                         ms_to_ts(&tv, RETRANS_TIMER / 2);
1515                         eloop_timeout_add_tv(
1516                             ia->iface->ctx->eloop,
1517                             &tv, ipv6_checkaddrflags, ia);
1518                 }
1519 #endif
1520                 return 0;
1521         }
1522         if (!CAN_ADD_LLADDR(ifp))
1523                 return 0;
1524
1525         return ipv6_addlinklocal(ifp);
1526 }
1527
1528 struct ipv6_addr *
1529 ipv6_newaddr(struct interface *ifp, const struct in6_addr *addr,
1530     uint8_t prefix_len, unsigned int flags)
1531 {
1532         struct ipv6_addr *ia;
1533         char buf[INET6_ADDRSTRLEN];
1534         const char *cbp;
1535         bool tempaddr;
1536         int addr_flags;
1537
1538         /* If adding a new DHCP / RA derived address, check current flags
1539          * from an existing address. */
1540         ia = ipv6_iffindaddr(ifp, addr, 0);
1541         if (ia != NULL)
1542                 addr_flags = ia->addr_flags;
1543         else
1544                 addr_flags = IN6_IFF_TENTATIVE;
1545
1546         ia = calloc(1, sizeof(*ia));
1547         if (ia == NULL)
1548                 goto err;
1549
1550         ia->iface = ifp;
1551         ia->addr_flags = addr_flags;
1552         ia->flags = IPV6_AF_NEW | flags;
1553         if (!(ia->addr_flags & IN6_IFF_NOTUSEABLE))
1554                 ia->flags |= IPV6_AF_DADCOMPLETED;
1555         ia->prefix_len = prefix_len;
1556         ia->dhcp6_fd = -1;
1557
1558 #ifndef SMALL
1559         TAILQ_INIT(&ia->pd_pfxs);
1560 #endif
1561
1562 #ifdef IPV6_AF_TEMPORARY
1563         tempaddr = ia->flags & IPV6_AF_TEMPORARY;
1564 #else
1565         tempaddr = false;
1566 #endif
1567
1568         if (ia->flags & IPV6_AF_AUTOCONF && !tempaddr) {
1569                 ia->prefix = *addr;
1570                 ia->dadcounter = ipv6_makeaddr(&ia->addr, ifp,
1571                                                &ia->prefix,
1572                                                ia->prefix_len);
1573                 if (ia->dadcounter == -1)
1574                         goto err;
1575         } else if (ia->flags & IPV6_AF_RAPFX) {
1576                 ia->prefix = *addr;
1577 #ifdef __sun
1578                 ia->addr = *addr;
1579                 cbp = inet_ntop(AF_INET6, &ia->addr, buf, sizeof(buf));
1580                 goto paddr;
1581 #else
1582                 return ia;
1583 #endif
1584         } else if (ia->flags & (IPV6_AF_REQUEST | IPV6_AF_DELEGATEDPFX) &&
1585                    prefix_len != 128)
1586         {
1587                 ia->prefix = *addr;
1588                 cbp = inet_ntop(AF_INET6, &ia->prefix, buf, sizeof(buf));
1589                 goto paddr;
1590         } else {
1591                 ia->addr = *addr;
1592                 if (ipv6_makeprefix(&ia->prefix,
1593                                     &ia->addr, ia->prefix_len) == -1)
1594                         goto err;
1595         }
1596
1597         cbp = inet_ntop(AF_INET6, &ia->addr, buf, sizeof(buf));
1598 paddr:
1599         if (cbp == NULL)
1600                 goto err;
1601         snprintf(ia->saddr, sizeof(ia->saddr), "%s/%d", cbp, ia->prefix_len);
1602
1603         return ia;
1604
1605 err:
1606         logerr(__func__);
1607         free(ia);
1608         return NULL;
1609 }
1610
1611 static void
1612 ipv6_staticdadcallback(void *arg)
1613 {
1614         struct ipv6_addr *ia = arg;
1615         int wascompleted;
1616
1617         wascompleted = (ia->flags & IPV6_AF_DADCOMPLETED);
1618         ia->flags |= IPV6_AF_DADCOMPLETED;
1619         if (ia->flags & IPV6_AF_DUPLICATED)
1620                 logwarnx("%s: DAD detected %s", ia->iface->name,
1621                     ia->saddr);
1622         else if (!wascompleted) {
1623                 logdebugx("%s: IPv6 static DAD completed",
1624                     ia->iface->name);
1625         }
1626
1627 #define FINISHED (IPV6_AF_ADDED | IPV6_AF_DADCOMPLETED)
1628         if (!wascompleted) {
1629                 struct interface *ifp;
1630                 struct ipv6_state *state;
1631
1632                 ifp = ia->iface;
1633                 state = IPV6_STATE(ifp);
1634                 TAILQ_FOREACH(ia, &state->addrs, next) {
1635                         if (ia->flags & IPV6_AF_STATIC &&
1636                             (ia->flags & FINISHED) != FINISHED)
1637                         {
1638                                 wascompleted = 1;
1639                                 break;
1640                         }
1641                 }
1642                 if (!wascompleted)
1643                         script_runreason(ifp, "STATIC6");
1644         }
1645 #undef FINISHED
1646 }
1647
1648 ssize_t
1649 ipv6_env(FILE *fp, const char *prefix, const struct interface *ifp)
1650 {
1651         struct ipv6_addr *ia;
1652
1653         ia = ipv6_iffindaddr(UNCONST(ifp), &ifp->options->req_addr6,
1654             IN6_IFF_NOTUSEABLE);
1655         if (ia == NULL)
1656                 return 0;
1657         if (efprintf(fp, "%s_ip6_address=%s", prefix, ia->saddr) == -1)
1658                 return -1;
1659         return 1;
1660 }
1661
1662 int
1663 ipv6_staticdadcompleted(const struct interface *ifp)
1664 {
1665         const struct ipv6_state *state;
1666         const struct ipv6_addr *ia;
1667         int n;
1668
1669         if ((state = IPV6_CSTATE(ifp)) == NULL)
1670                 return 0;
1671         n = 0;
1672 #define COMPLETED (IPV6_AF_STATIC | IPV6_AF_ADDED | IPV6_AF_DADCOMPLETED)
1673         TAILQ_FOREACH(ia, &state->addrs, next) {
1674                 if ((ia->flags & COMPLETED) == COMPLETED &&
1675                     !(ia->addr_flags & IN6_IFF_NOTUSEABLE))
1676                         n++;
1677         }
1678         return n;
1679 }
1680
1681 int
1682 ipv6_startstatic(struct interface *ifp)
1683 {
1684         struct ipv6_addr *ia;
1685         int run_script;
1686
1687         if (IN6_IS_ADDR_UNSPECIFIED(&ifp->options->req_addr6))
1688                 return 0;
1689
1690         ia = ipv6_iffindaddr(ifp, &ifp->options->req_addr6, 0);
1691         if (ia != NULL &&
1692             (ia->prefix_len != ifp->options->req_prefix_len ||
1693             ia->addr_flags & IN6_IFF_NOTUSEABLE))
1694         {
1695                 ipv6_deleteaddr(ia);
1696                 ia = NULL;
1697         }
1698         if (ia == NULL) {
1699                 struct ipv6_state *state;
1700
1701                 ia = ipv6_newaddr(ifp, &ifp->options->req_addr6,
1702                     ifp->options->req_prefix_len, 0);
1703                 if (ia == NULL)
1704                         return -1;
1705                 state = IPV6_STATE(ifp);
1706                 TAILQ_INSERT_TAIL(&state->addrs, ia, next);
1707                 run_script = 0;
1708         } else
1709                 run_script = 1;
1710         ia->flags |= IPV6_AF_STATIC | IPV6_AF_ONLINK;
1711         ia->prefix_vltime = ND6_INFINITE_LIFETIME;
1712         ia->prefix_pltime = ND6_INFINITE_LIFETIME;
1713         ia->dadcallback = ipv6_staticdadcallback;
1714         ipv6_addaddr(ia, NULL);
1715         rt_build(ifp->ctx, AF_INET6);
1716         if (run_script)
1717                 script_runreason(ifp, "STATIC6");
1718         return 1;
1719 }
1720
1721 /* Ensure the interface has a link-local address */
1722 int
1723 ipv6_start(struct interface *ifp)
1724 {
1725 #ifdef IPV6_POLLADDRFLAG
1726         struct ipv6_state *state;
1727
1728         /* We need to update the address flags. */
1729         if ((state = IPV6_STATE(ifp)) != NULL) {
1730                 struct ipv6_addr *ia;
1731                 const char *alias;
1732                 int flags;
1733
1734                 TAILQ_FOREACH(ia, &state->addrs, next) {
1735 #ifdef ALIAS_ADDR
1736                         alias = ia->alias;
1737 #else
1738                         alias = NULL;
1739 #endif
1740                         flags = if_addrflags6(ia->iface, &ia->addr, alias);
1741                         if (flags != -1)
1742                                 ia->addr_flags = flags;
1743                 }
1744         }
1745 #endif
1746
1747         if (ipv6_tryaddlinklocal(ifp) == -1)
1748                 return -1;
1749
1750         if (IPV6_CSTATE(ifp)) {
1751                 /* Regenerate new ids */
1752                 if (ip6_use_tempaddr(ifp->name))
1753                         ipv6_regentempifid(ifp);
1754         }
1755
1756         return 0;
1757 }
1758
1759 void
1760 ipv6_freedrop(struct interface *ifp, int drop)
1761 {
1762         struct ipv6_state *state;
1763         struct ll_callback *cb;
1764
1765         if (ifp == NULL)
1766                 return;
1767
1768         if ((state = IPV6_STATE(ifp)) == NULL)
1769                 return;
1770
1771         /* If we got here, we can get rid of any LL callbacks. */
1772         while ((cb = TAILQ_FIRST(&state->ll_callbacks))) {
1773                 TAILQ_REMOVE(&state->ll_callbacks, cb, next);
1774                 free(cb);
1775         }
1776
1777         ipv6_freedrop_addrs(&state->addrs, drop ? 2 : 0, NULL);
1778         if (drop) {
1779                 if (ifp->ctx->ra_routers != NULL)
1780                         rt_build(ifp->ctx, AF_INET6);
1781         } else {
1782                 /* Because we need to cache the addresses we don't control,
1783                  * we only free the state on when NOT dropping addresses. */
1784                 free(state);
1785                 ifp->if_data[IF_DATA_IPV6] = NULL;
1786                 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp);
1787         }
1788 }
1789
1790 void
1791 ipv6_ctxfree(struct dhcpcd_ctx *ctx)
1792 {
1793
1794         free(ctx->ra_routers);
1795         free(ctx->secret);
1796 }
1797
1798 int
1799 ipv6_handleifa_addrs(int cmd,
1800     struct ipv6_addrhead *addrs, const struct ipv6_addr *addr, pid_t pid)
1801 {
1802         struct ipv6_addr *ia, *ian;
1803         uint8_t found, alldadcompleted;
1804
1805         alldadcompleted = 1;
1806         found = 0;
1807         TAILQ_FOREACH_SAFE(ia, addrs, next, ian) {
1808                 if (!IN6_ARE_ADDR_EQUAL(&addr->addr, &ia->addr)) {
1809                         if (ia->flags & IPV6_AF_ADDED &&
1810                             !(ia->flags & IPV6_AF_DADCOMPLETED))
1811                                 alldadcompleted = 0;
1812                         continue;
1813                 }
1814                 switch (cmd) {
1815                 case RTM_DELADDR:
1816                         if (ia->flags & IPV6_AF_ADDED) {
1817                                 logwarnx("%s: pid %d deleted address %s",
1818                                     ia->iface->name, pid, ia->saddr);
1819                                 ia->flags &= ~IPV6_AF_ADDED;
1820                         }
1821                         if (ia->flags & IPV6_AF_DELEGATED) {
1822                                 TAILQ_REMOVE(addrs, ia, next);
1823                                 ipv6_deletedaddr(ia);
1824                                 ipv6_freeaddr(ia);
1825                         }
1826                         break;
1827                 case RTM_NEWADDR:
1828                         /* Safety - ignore tentative announcements */
1829                         if (addr->addr_flags &
1830                             (IN6_IFF_DETACHED | IN6_IFF_TENTATIVE))
1831                                 break;
1832                         if ((ia->flags & IPV6_AF_DADCOMPLETED) == 0) {
1833                                 found++;
1834                                 if (addr->addr_flags & IN6_IFF_DUPLICATED)
1835                                         ia->flags |= IPV6_AF_DUPLICATED;
1836                                 else
1837                                         ia->flags &= ~IPV6_AF_DUPLICATED;
1838                                 if (ia->dadcallback)
1839                                         ia->dadcallback(ia);
1840                                 /* We need to set this here in-case the
1841                                  * dadcallback function checks it */
1842                                 ia->flags |= IPV6_AF_DADCOMPLETED;
1843                         }
1844                         break;
1845                 }
1846         }
1847
1848         return alldadcompleted ? found : 0;
1849 }
1850
1851 #ifdef IPV6_MANAGETEMPADDR
1852 static const struct ipv6_addr *
1853 ipv6_findaddrid(struct dhcpcd_ctx *ctx, uint8_t *addr)
1854 {
1855         const struct interface *ifp;
1856         const struct ipv6_state *state;
1857         const struct ipv6_addr *ia;
1858
1859         TAILQ_FOREACH(ifp, ctx->ifaces, next) {
1860                 if ((state = IPV6_CSTATE(ifp))) {
1861                         TAILQ_FOREACH(ia, &state->addrs, next) {
1862                                 if (memcmp(&ia->addr.s6_addr[8], addr, 8) == 0)
1863                                         return ia;
1864                         }
1865                 }
1866         }
1867         return NULL;
1868 }
1869
1870 static const uint8_t nullid[8];
1871 static const uint8_t anycastid[8] = {
1872     0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80 };
1873 static const uint8_t isatapid[4] = { 0x00, 0x00, 0x5e, 0xfe };
1874
1875 static void
1876 ipv6_regen_desync(struct interface *ifp, int force)
1877 {
1878         struct ipv6_state *state;
1879         time_t max;
1880
1881         state = IPV6_STATE(ifp);
1882
1883         /* RFC4941 Section 5 states that DESYNC_FACTOR must never be
1884          * greater than TEMP_VALID_LIFETIME - REGEN_ADVANCE.
1885          * I believe this is an error and it should be never be greateter than
1886          * TEMP_PREFERRED_LIFETIME - REGEN_ADVANCE. */
1887         max = ip6_temp_preferred_lifetime(ifp->name) - REGEN_ADVANCE;
1888         if (state->desync_factor && !force && state->desync_factor < max)
1889                 return;
1890         if (state->desync_factor == 0)
1891                 state->desync_factor =
1892                     (time_t)arc4random_uniform(MIN(MAX_DESYNC_FACTOR,
1893                     (uint32_t)max));
1894         max = ip6_temp_preferred_lifetime(ifp->name) -
1895             state->desync_factor - REGEN_ADVANCE;
1896         eloop_timeout_add_sec(ifp->ctx->eloop, max, ipv6_regentempifid, ifp);
1897 }
1898
1899 void
1900 ipv6_gentempifid(struct interface *ifp)
1901 {
1902         struct ipv6_state *state;
1903         MD5_CTX md5;
1904         uint8_t seed[16], digest[16];
1905         int retry;
1906
1907         if ((state = IPV6_STATE(ifp)) == NULL)
1908                 return;
1909
1910         retry = 0;
1911         if (memcmp(nullid, state->randomseed0, sizeof(nullid)) == 0) {
1912                 uint32_t r;
1913
1914                 r = arc4random();
1915                 memcpy(seed, &r, sizeof(r));
1916                 r = arc4random();
1917                 memcpy(seed + sizeof(r), &r, sizeof(r));
1918         } else
1919                 memcpy(seed, state->randomseed0, sizeof(state->randomseed0));
1920
1921         memcpy(seed + sizeof(state->randomseed0),
1922             state->randomseed1, sizeof(state->randomseed1));
1923
1924 again:
1925         MD5Init(&md5);
1926         MD5Update(&md5, seed, sizeof(seed));
1927         MD5Final(digest, &md5);
1928
1929         /* RFC4941 Section 3.2.1.1
1930          * Take the left-most 64bits and set bit 6 to zero */
1931         memcpy(state->randomid, digest, sizeof(state->randomid));
1932         state->randomid[0] = (uint8_t)(state->randomid[0] & ~EUI64_UBIT);
1933
1934         /* RFC4941 Section 3.2.1.4
1935          * Reject reserved or existing id's */
1936         if (memcmp(nullid, state->randomid, sizeof(nullid)) == 0 ||
1937             (memcmp(anycastid, state->randomid, 7) == 0 &&
1938             (anycastid[7] & state->randomid[7]) == anycastid[7]) ||
1939             memcmp(isatapid, state->randomid, sizeof(isatapid)) == 0 ||
1940             ipv6_findaddrid(ifp->ctx, state->randomid))
1941         {
1942                 if (++retry < GEN_TEMPID_RETRY_MAX) {
1943                         memcpy(seed, digest + 8, 8);
1944                         goto again;
1945                 }
1946                 memset(state->randomid, 0, sizeof(state->randomid));
1947         }
1948
1949         /* RFC4941 Section 3.2.1.6
1950          * Save the right-most 64bits of the digest */
1951         memcpy(state->randomseed0, digest + 8,
1952             sizeof(state->randomseed0));
1953 }
1954
1955 /* RFC4941 Section 3.3.7 */
1956 static void
1957 ipv6_tempdadcallback(void *arg)
1958 {
1959         struct ipv6_addr *ia = arg;
1960
1961         if (ia->flags & IPV6_AF_DUPLICATED) {
1962                 struct ipv6_addr *ia1;
1963                 struct timespec tv;
1964
1965                 if (++ia->dadcounter == TEMP_IDGEN_RETRIES) {
1966                         logerrx("%s: too many duplicate temporary addresses",
1967                             ia->iface->name);
1968                         return;
1969                 }
1970                 clock_gettime(CLOCK_MONOTONIC, &tv);
1971                 if ((ia1 = ipv6_createtempaddr(ia, &tv)) == NULL)
1972                         logerr(__func__);
1973                 else
1974                         ia1->dadcounter = ia->dadcounter;
1975                 ipv6_deleteaddr(ia);
1976                 if (ia1)
1977                         ipv6_addaddr(ia1, &ia1->acquired);
1978         }
1979 }
1980
1981 struct ipv6_addr *
1982 ipv6_createtempaddr(struct ipv6_addr *ia0, const struct timespec *now)
1983 {
1984         struct ipv6_state *state;
1985         const struct ipv6_state *cstate;
1986         int genid;
1987         struct in6_addr addr, mask;
1988         uint32_t randid[2];
1989         const struct interface *ifp;
1990         const struct ipv6_addr *ap;
1991         struct ipv6_addr *ia;
1992         uint32_t i, trylimit;
1993
1994         trylimit = TEMP_IDGEN_RETRIES;
1995         state = IPV6_STATE(ia0->iface);
1996         genid = 0;
1997
1998         addr = ia0->addr;
1999         ipv6_mask(&mask, ia0->prefix_len);
2000         /* clear the old ifid */
2001         for (i = 0; i < 4; i++)
2002                 addr.s6_addr32[i] &= mask.s6_addr32[i];
2003
2004 again:
2005         if (memcmp(state->randomid, nullid, sizeof(nullid)) == 0)
2006                 genid = 1;
2007         if (genid) {
2008                 memcpy(state->randomseed1, &ia0->addr.s6_addr[8],
2009                     sizeof(state->randomseed1));
2010                 ipv6_gentempifid(ia0->iface);
2011                 if (memcmp(state->randomid, nullid, sizeof(nullid)) == 0) {
2012                         errno = EFAULT;
2013                         return NULL;
2014                 }
2015         }
2016         memcpy(&randid[0], state->randomid, sizeof(randid[0]));
2017         memcpy(&randid[1], state->randomid + sizeof(randid[1]),
2018             sizeof(randid[2]));
2019         addr.s6_addr32[2] |= randid[0] & ~mask.s6_addr32[2];
2020         addr.s6_addr32[3] |= randid[1] & ~mask.s6_addr32[3];
2021
2022         /* Ensure we don't already have it */
2023         TAILQ_FOREACH(ifp, ia0->iface->ctx->ifaces, next) {
2024                 cstate = IPV6_CSTATE(ifp);
2025                 if (cstate) {
2026                         TAILQ_FOREACH(ap, &cstate->addrs, next) {
2027                                 if (IN6_ARE_ADDR_EQUAL(&ap->addr, &addr)) {
2028                                         if (--trylimit == 0) {
2029                                                 errno = EEXIST;
2030                                                 return NULL;
2031                                         }
2032                                         genid = 1;
2033                                         goto again;
2034                                 }
2035                         }
2036                 }
2037         }
2038
2039         ia = ipv6_newaddr(ia0->iface, &addr, ia0->prefix_len,
2040             IPV6_AF_AUTOCONF | IPV6_AF_TEMPORARY);
2041         /* Must be made tentative, for our DaD to work */
2042         ia->addr_flags = IN6_IFF_TENTATIVE;
2043         ia->dadcallback = ipv6_tempdadcallback;
2044         ia->created = ia->acquired = now ? *now : ia0->acquired;
2045
2046         /* Ensure desync is still valid */
2047         ipv6_regen_desync(ia->iface, 0);
2048
2049         /* RFC4941 Section 3.3.4 */
2050         i = (uint32_t)(ip6_temp_preferred_lifetime(ia0->iface->name) -
2051             state->desync_factor);
2052         ia->prefix_pltime = MIN(ia0->prefix_pltime, i);
2053         i = (uint32_t)ip6_temp_valid_lifetime(ia0->iface->name);
2054         ia->prefix_vltime = MIN(ia0->prefix_vltime, i);
2055         if (ia->prefix_pltime <= REGEN_ADVANCE ||
2056             ia->prefix_pltime > ia0->prefix_vltime)
2057         {
2058                 errno = EINVAL;
2059                 free(ia);
2060                 return NULL;
2061         }
2062
2063         TAILQ_INSERT_TAIL(&state->addrs, ia, next);
2064         return ia;
2065 }
2066
2067 struct ipv6_addr *
2068 ipv6_settemptime(struct ipv6_addr *ia, int flags)
2069 {
2070         struct ipv6_state *state;
2071         struct ipv6_addr *ap, *first;
2072
2073         state = IPV6_STATE(ia->iface);
2074         first = NULL;
2075         TAILQ_FOREACH_REVERSE(ap, &state->addrs, ipv6_addrhead, next) {
2076                 if (ap->flags & IPV6_AF_TEMPORARY &&
2077                     ap->prefix_pltime &&
2078                     IN6_ARE_ADDR_EQUAL(&ia->prefix, &ap->prefix))
2079                 {
2080                         time_t max, ext;
2081
2082                         if (flags == 0) {
2083                                 if (ap->prefix_pltime -
2084                                     (uint32_t)(ia->acquired.tv_sec -
2085                                     ap->acquired.tv_sec)
2086                                     < REGEN_ADVANCE)
2087                                         continue;
2088
2089                                 return ap;
2090                         }
2091
2092                         if (!(ap->flags & IPV6_AF_ADDED))
2093                                 ap->flags |= IPV6_AF_NEW | IPV6_AF_AUTOCONF;
2094                         ap->flags &= ~IPV6_AF_STALE;
2095
2096                         /* RFC4941 Section 3.4
2097                          * Deprecated prefix, deprecate the temporary address */
2098                         if (ia->prefix_pltime == 0) {
2099                                 ap->prefix_pltime = 0;
2100                                 goto valid;
2101                         }
2102
2103                         /* Ensure desync is still valid */
2104                         ipv6_regen_desync(ap->iface, 0);
2105
2106                         /* RFC4941 Section 3.3.2
2107                          * Extend temporary times, but ensure that they
2108                          * never last beyond the system limit. */
2109                         ext = ia->acquired.tv_sec + (time_t)ia->prefix_pltime;
2110                         max = ap->created.tv_sec +
2111                             ip6_temp_preferred_lifetime(ap->iface->name) -
2112                             state->desync_factor;
2113                         if (ext < max)
2114                                 ap->prefix_pltime = ia->prefix_pltime;
2115                         else
2116                                 ap->prefix_pltime =
2117                                     (uint32_t)(max - ia->acquired.tv_sec);
2118
2119 valid:
2120                         ext = ia->acquired.tv_sec + (time_t)ia->prefix_vltime;
2121                         max = ap->created.tv_sec +
2122                             ip6_temp_valid_lifetime(ap->iface->name);
2123                         if (ext < max)
2124                                 ap->prefix_vltime = ia->prefix_vltime;
2125                         else
2126                                 ap->prefix_vltime =
2127                                     (uint32_t)(max - ia->acquired.tv_sec);
2128
2129                         /* Just extend the latest matching prefix */
2130                         ap->acquired = ia->acquired;
2131
2132                         /* If extending return the last match as
2133                          * it's the most current.
2134                          * If deprecating, deprecate any other addresses we
2135                          * may have, although this should not be needed */
2136                         if (ia->prefix_pltime)
2137                                 return ap;
2138                         if (first == NULL)
2139                                 first = ap;
2140                 }
2141         }
2142         return first;
2143 }
2144
2145 void
2146 ipv6_addtempaddrs(struct interface *ifp, const struct timespec *now)
2147 {
2148         struct ipv6_state *state;
2149         struct ipv6_addr *ia;
2150
2151         state = IPV6_STATE(ifp);
2152         TAILQ_FOREACH(ia, &state->addrs, next) {
2153                 if (ia->flags & IPV6_AF_TEMPORARY &&
2154                     !(ia->flags & IPV6_AF_STALE))
2155                         ipv6_addaddr(ia, now);
2156         }
2157 }
2158
2159 static void
2160 ipv6_regentempaddr(void *arg)
2161 {
2162         struct ipv6_addr *ia = arg, *ia1;
2163         struct timespec tv;
2164
2165         logdebugx("%s: regen temp addr %s", ia->iface->name, ia->saddr);
2166         clock_gettime(CLOCK_MONOTONIC, &tv);
2167         ia1 = ipv6_createtempaddr(ia, &tv);
2168         if (ia1)
2169                 ipv6_addaddr(ia1, &tv);
2170         else
2171                 logerr(__func__);
2172 }
2173
2174 static void
2175 ipv6_regentempifid(void *arg)
2176 {
2177         struct interface *ifp = arg;
2178         struct ipv6_state *state;
2179
2180         state = IPV6_STATE(ifp);
2181         if (memcmp(state->randomid, nullid, sizeof(state->randomid)))
2182                 ipv6_gentempifid(ifp);
2183
2184         ipv6_regen_desync(ifp, 1);
2185 }
2186 #endif /* IPV6_MANAGETEMPADDR */
2187
2188 void
2189 ipv6_markaddrsstale(struct interface *ifp, unsigned int flags)
2190 {
2191         struct ipv6_state *state;
2192         struct ipv6_addr *ia;
2193
2194         state = IPV6_STATE(ifp);
2195         if (state == NULL)
2196                 return;
2197
2198         TAILQ_FOREACH(ia, &state->addrs, next) {
2199                 if (flags == 0 || ia->flags & flags)
2200                         ia->flags |= IPV6_AF_STALE;
2201         }
2202 }
2203
2204 void
2205 ipv6_deletestaleaddrs(struct interface *ifp)
2206 {
2207         struct ipv6_state *state;
2208         struct ipv6_addr *ia, *ia1;
2209
2210         state = IPV6_STATE(ifp);
2211         if (state == NULL)
2212                 return;
2213
2214         TAILQ_FOREACH_SAFE(ia, &state->addrs, next, ia1) {
2215                 if (ia->flags & IPV6_AF_STALE)
2216                         ipv6_handleifa(ifp->ctx, RTM_DELADDR,
2217                             ifp->ctx->ifaces, ifp->name,
2218                             &ia->addr, ia->prefix_len, 0, getpid());
2219         }
2220 }
2221
2222
2223 static struct rt *
2224 inet6_makeroute(struct interface *ifp, const struct ra *rap)
2225 {
2226         struct rt *rt;
2227
2228         if ((rt = rt_new(ifp)) == NULL)
2229                 return NULL;
2230
2231 #ifdef HAVE_ROUTE_METRIC
2232         rt->rt_metric = ifp->metric;
2233 #endif
2234         if (rap != NULL)
2235                 rt->rt_mtu = rap->mtu;
2236         return rt;
2237 }
2238
2239 static struct rt *
2240 inet6_makeprefix(struct interface *ifp, const struct ra *rap,
2241     const struct ipv6_addr *addr)
2242 {
2243         struct rt *rt;
2244         struct in6_addr netmask;
2245
2246         if (addr == NULL || addr->prefix_len > 128) {
2247                 errno = EINVAL;
2248                 return NULL;
2249         }
2250
2251         /* There is no point in trying to manage a /128 prefix,
2252          * ones without a lifetime.  */
2253         if (addr->prefix_len == 128 || addr->prefix_vltime == 0)
2254                 return NULL;
2255
2256         /* Don't install a reject route when not creating bigger prefixes. */
2257         if (addr->flags & IPV6_AF_NOREJECT)
2258                 return NULL;
2259
2260         /* This address is the delegated prefix, so add a reject route for
2261          * it via the loopback interface. */
2262         if (addr->flags & IPV6_AF_DELEGATEDPFX) {
2263                 struct interface *lo0;
2264
2265                 TAILQ_FOREACH(lo0, ifp->ctx->ifaces, next) {
2266                         if (lo0->flags & IFF_LOOPBACK)
2267                                 break;
2268                 }
2269                 if (lo0 == NULL)
2270                         logwarnx("cannot find a loopback interface "
2271                             "to reject via");
2272                 else
2273                         ifp = lo0;
2274         }
2275
2276         if ((rt = inet6_makeroute(ifp, rap)) == NULL)
2277                 return NULL;
2278
2279         sa_in6_init(&rt->rt_dest, &addr->prefix);
2280         ipv6_mask(&netmask, addr->prefix_len);
2281         sa_in6_init(&rt->rt_netmask, &netmask);
2282         if (addr->flags & IPV6_AF_DELEGATEDPFX) {
2283                 rt->rt_flags |= RTF_REJECT;
2284                 /* Linux does not like a gateway for a reject route. */
2285 #ifndef __linux__
2286                 sa_in6_init(&rt->rt_gateway, &in6addr_loopback);
2287 #endif
2288         } else if (!(addr->flags & IPV6_AF_ONLINK))
2289                 sa_in6_init(&rt->rt_gateway, &rap->from);
2290         else
2291                 rt->rt_gateway.sa_family = AF_UNSPEC;
2292         sa_in6_init(&rt->rt_ifa, &addr->addr);
2293         return rt;
2294 }
2295
2296 static struct rt *
2297 inet6_makerouter(struct ra *rap)
2298 {
2299         struct rt *rt;
2300
2301         if ((rt = inet6_makeroute(rap->iface, rap)) == NULL)
2302                 return NULL;
2303         sa_in6_init(&rt->rt_dest, &in6addr_any);
2304         sa_in6_init(&rt->rt_netmask, &in6addr_any);
2305         sa_in6_init(&rt->rt_gateway, &rap->from);
2306         return rt;
2307 }
2308
2309 #define RT_IS_DEFAULT(rtp) \
2310         (IN6_ARE_ADDR_EQUAL(&((rtp)->dest), &in6addr_any) &&                  \
2311             IN6_ARE_ADDR_EQUAL(&((rtp)->mask), &in6addr_any))
2312
2313 static int
2314 inet6_staticroutes(rb_tree_t *routes, struct dhcpcd_ctx *ctx)
2315 {
2316         struct interface *ifp;
2317         struct ipv6_state *state;
2318         struct ipv6_addr *ia;
2319         struct rt *rt;
2320
2321         TAILQ_FOREACH(ifp, ctx->ifaces, next) {
2322                 if ((state = IPV6_STATE(ifp)) == NULL)
2323                         continue;
2324                 TAILQ_FOREACH(ia, &state->addrs, next) {
2325                         if ((ia->flags & (IPV6_AF_ADDED | IPV6_AF_STATIC)) ==
2326                             (IPV6_AF_ADDED | IPV6_AF_STATIC))
2327                         {
2328                                 rt = inet6_makeprefix(ifp, NULL, ia);
2329                                 if (rt)
2330                                         rt_proto_add(routes, rt);
2331                         }
2332                 }
2333         }
2334         return 0;
2335 }
2336
2337 static int
2338 inet6_raroutes(rb_tree_t *routes, struct dhcpcd_ctx *ctx)
2339 {
2340         struct rt *rt;
2341         struct ra *rap;
2342         const struct ipv6_addr *addr;
2343
2344         TAILQ_FOREACH(rap, ctx->ra_routers, next) {
2345                 if (rap->expired)
2346                         continue;
2347                 TAILQ_FOREACH(addr, &rap->addrs, next) {
2348                         if (addr->prefix_vltime == 0)
2349                                 continue;
2350                         rt = inet6_makeprefix(rap->iface, rap, addr);
2351                         if (rt) {
2352                                 rt->rt_dflags |= RTDF_RA;
2353                                 rt_proto_add(routes, rt);
2354                         }
2355                 }
2356                 if (rap->lifetime == 0)
2357                         continue;
2358                 if (ipv6_anyglobal(rap->iface) == NULL)
2359                         continue;
2360                 rt = inet6_makerouter(rap);
2361                 if (rt == NULL)
2362                         continue;
2363                 rt->rt_dflags |= RTDF_RA;
2364                 rt_proto_add(routes, rt);
2365         }
2366         return 0;
2367 }
2368
2369 #ifdef DHCP6
2370 static int
2371 inet6_dhcproutes(rb_tree_t *routes, struct dhcpcd_ctx *ctx,
2372     enum DH6S dstate)
2373 {
2374         struct interface *ifp;
2375         const struct dhcp6_state *d6_state;
2376         const struct ipv6_addr *addr;
2377         struct rt *rt;
2378
2379         TAILQ_FOREACH(ifp, ctx->ifaces, next) {
2380                 d6_state = D6_CSTATE(ifp);
2381                 if (d6_state && d6_state->state == dstate) {
2382                         TAILQ_FOREACH(addr, &d6_state->addrs, next) {
2383                                 rt = inet6_makeprefix(ifp, NULL, addr);
2384                                 if (rt == NULL)
2385                                         continue;
2386                                 rt->rt_dflags |= RTDF_DHCP;
2387                                 rt_proto_add(routes, rt);
2388                         }
2389                 }
2390         }
2391         return 0;
2392 }
2393 #endif
2394
2395 bool
2396 inet6_getroutes(struct dhcpcd_ctx *ctx, rb_tree_t *routes)
2397 {
2398
2399         /* Should static take priority? */
2400         if (inet6_staticroutes(routes, ctx) == -1)
2401                 return false;
2402
2403         /* First add reachable routers and their prefixes */
2404         if (inet6_raroutes(routes, ctx) == -1)
2405                 return false;
2406
2407 #ifdef DHCP6
2408         /* We have no way of knowing if prefixes added by DHCP are reachable
2409          * or not, so we have to assume they are.
2410          * Add bound before delegated so we can prefer interfaces better. */
2411         if (inet6_dhcproutes(routes, ctx, DH6S_BOUND) == -1)
2412                 return false;
2413         if (inet6_dhcproutes(routes, ctx, DH6S_DELEGATED) == -1)
2414                 return false;
2415 #endif
2416
2417         return true;
2418 }