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