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