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