1 /* 2 * dhcpcd - DHCP client daemon 3 * Copyright (c) 2006-2015 Roy Marples <roy (at) marples.name> 4 * All rights reserved 5 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28 #include <sys/param.h> 29 #include <sys/socket.h> 30 #include <sys/stat.h> 31 32 #include <arpa/inet.h> 33 #include <net/if.h> 34 #include <net/route.h> 35 #include <netinet/if_ether.h> 36 #include <netinet/in_systm.h> 37 #include <netinet/in.h> 38 #include <netinet/ip.h> 39 #define __FAVOR_BSD /* Nasty glibc hack so we can use BSD semantics for UDP */ 40 #include <netinet/udp.h> 41 #undef __FAVOR_BSD 42 43 #include <ctype.h> 44 #include <errno.h> 45 #include <fcntl.h> 46 #include <inttypes.h> 47 #include <stddef.h> 48 #include <stdlib.h> 49 #include <string.h> 50 #include <unistd.h> 51 52 #define ELOOP_QUEUE 2 53 #include "config.h" 54 #include "arp.h" 55 #include "common.h" 56 #include "dhcp.h" 57 #include "dhcpcd.h" 58 #include "dhcp-common.h" 59 #include "duid.h" 60 #include "eloop.h" 61 #include "if.h" 62 #include "ipv4.h" 63 #include "ipv4ll.h" 64 #include "rpc-interface.h" 65 #include "script.h" 66 67 #define DAD "Duplicate address detected" 68 #define DHCP_MIN_LEASE 20 69 70 #define IPV4A ADDRIPV4 | ARRAY 71 #define IPV4R ADDRIPV4 | REQUEST 72 73 /* We should define a maximum for the NAK exponential backoff */ 74 #define NAKOFF_MAX 60 75 76 /* Wait N nanoseconds between sending a RELEASE and dropping the address. 77 * This gives the kernel enough time to actually send it. */ 78 #define RELEASE_DELAY_S 0 79 #define RELEASE_DELAY_NS 10000000 80 81 #ifndef IPDEFTTL 82 #define IPDEFTTL 64 /* RFC1340 */ 83 #endif 84 85 struct dhcp_op { 86 uint8_t value; 87 const char *name; 88 }; 89 90 static const struct dhcp_op dhcp_ops[] = { 91 { DHCP_DISCOVER, "DISCOVER" }, 92 { DHCP_OFFER, "OFFER" }, 93 { DHCP_REQUEST, "REQUEST" }, 94 { DHCP_DECLINE, "DECLINE" }, 95 { DHCP_ACK, "ACK" }, 96 { DHCP_NAK, "NAK" }, 97 { DHCP_RELEASE, "RELEASE" }, 98 { DHCP_INFORM, "INFORM" }, 99 { DHCP_FORCERENEW, "DHCP_FORCERENEW"}, 100 { 0, NULL } 101 }; 102 103 static const char * const dhcp_params[] = { 104 "ip_address", 105 "subnet_cidr", 106 "network_number", 107 "filename", 108 "server_name", 109 NULL 110 }; 111 112 struct udp_dhcp_packet 113 { 114 struct ip ip; 115 struct udphdr udp; 116 struct dhcp_message dhcp; 117 }; 118 119 static const size_t udp_dhcp_len = sizeof(struct udp_dhcp_packet); 120 121 static int dhcp_open(struct interface *ifp); 122 123 void 124 dhcp_printoptions(const struct dhcpcd_ctx *ctx, 125 const struct dhcp_opt *opts, size_t opts_len) 126 { 127 const char * const *p; 128 size_t i, j; 129 const struct dhcp_opt *opt, *opt2; 130 int cols; 131 132 for (p = dhcp_params; *p; p++) 133 printf(" %s\n", *p); 134 135 for (i = 0, opt = ctx->dhcp_opts; i < ctx->dhcp_opts_len; i++, opt++) { 136 for (j = 0, opt2 = opts; j < opts_len; j++, opt2++) 137 if (opt->option == opt2->option) 138 break; 139 if (j == opts_len) { 140 cols = printf("%03d %s", opt->option, opt->var); 141 dhcp_print_option_encoding(opt, cols); 142 } 143 } 144 for (i = 0, opt = opts; i < opts_len; i++, opt++) { 145 cols = printf("%03d %s", opt->option, opt->var); 146 dhcp_print_option_encoding(opt, cols); 147 } 148 } 149 150 #define get_option_raw(ctx, dhcp, opt) get_option(ctx, dhcp, opt, NULL) 151 static const uint8_t * 152 get_option(struct dhcpcd_ctx *ctx, 153 const struct dhcp_message *dhcp, unsigned int opt, size_t *len) 154 { 155 const uint8_t *p = dhcp->options; 156 const uint8_t *e = p + sizeof(dhcp->options); 157 uint8_t l, ol = 0; 158 uint8_t o = 0; 159 uint8_t overl = 0; 160 uint8_t *bp = NULL; 161 const uint8_t *op = NULL; 162 size_t bl = 0; 163 164 /* Check we have the magic cookie */ 165 if (dhcp->cookie != htonl(MAGIC_COOKIE)) { 166 errno = ENOTSUP; 167 return NULL; 168 } 169 170 /* DHCP options are in TLV format with T and L each being a single 171 * bytes. In general, here we have p -> T, ol=p+1 -> L, op -> V. 172 * We must make sure there is enough room to read both T and L. 173 */ 174 while (p + 1 < e) { 175 o = *p++; 176 if (o == opt) { 177 if (op) { 178 if (!ctx->opt_buffer) { 179 ctx->opt_buffer = 180 malloc(DHCP_OPTION_LEN + 181 BOOTFILE_LEN + SERVERNAME_LEN); 182 if (ctx->opt_buffer == NULL) 183 return NULL; 184 } 185 if (!bp) 186 bp = ctx->opt_buffer; 187 memcpy(bp, op, ol); 188 bp += ol; 189 } 190 ol = (p + *p < e) ? *p : e - (p + 1); 191 if (p + ol > e) { 192 errno = EINVAL; 193 return NULL; 194 } 195 op = p + 1; 196 bl += ol; 197 } 198 switch (o) { 199 case DHO_PAD: 200 continue; 201 case DHO_END: 202 if (overl & 1) { 203 /* bit 1 set means parse boot file */ 204 overl = (uint8_t)(overl & ~1); 205 p = dhcp->bootfile; 206 e = p + sizeof(dhcp->bootfile); 207 } else if (overl & 2) { 208 /* bit 2 set means parse server name */ 209 overl = (uint8_t)(overl & ~2); 210 p = dhcp->servername; 211 e = p + sizeof(dhcp->servername); 212 } else 213 goto exit; 214 break; 215 case DHO_OPTIONSOVERLOADED: 216 /* Ensure we only get this option once by setting 217 * the last bit as well as the value. 218 * This is valid because only the first two bits 219 * actually mean anything in RFC2132 Section 9.3 */ 220 if (!overl) 221 overl = 0x80 | p[1]; 222 break; 223 } 224 l = *p++; 225 p += l; 226 } 227 228 exit: 229 if (len) 230 *len = bl; 231 if (bp) { 232 memcpy(bp, op, ol); 233 return (const uint8_t *)ctx->opt_buffer; 234 } 235 if (op) 236 return op; 237 errno = ENOENT; 238 return NULL; 239 } 240 241 int 242 get_option_addr(struct dhcpcd_ctx *ctx, 243 struct in_addr *a, const struct dhcp_message *dhcp, 244 uint8_t option) 245 { 246 const uint8_t *p; 247 size_t len; 248 249 p = get_option(ctx, dhcp, option, &len); 250 if (!p || len < (ssize_t)sizeof(a->s_addr)) 251 return -1; 252 memcpy(&a->s_addr, p, sizeof(a->s_addr)); 253 return 0; 254 } 255 256 static int 257 get_option_uint32(struct dhcpcd_ctx *ctx, 258 uint32_t *i, const struct dhcp_message *dhcp, uint8_t option) 259 { 260 const uint8_t *p; 261 size_t len; 262 uint32_t d; 263 264 p = get_option(ctx, dhcp, option, &len); 265 if (!p || len < (ssize_t)sizeof(d)) 266 return -1; 267 memcpy(&d, p, sizeof(d)); 268 if (i) 269 *i = ntohl(d); 270 return 0; 271 } 272 273 static int 274 get_option_uint8(struct dhcpcd_ctx *ctx, 275 uint8_t *i, const struct dhcp_message *dhcp, uint8_t option) 276 { 277 const uint8_t *p; 278 size_t len; 279 280 p = get_option(ctx, dhcp, option, &len); 281 if (!p || len < (ssize_t)sizeof(*p)) 282 return -1; 283 if (i) 284 *i = *(p); 285 return 0; 286 } 287 288 ssize_t 289 decode_rfc3442(char *out, size_t len, const uint8_t *p, size_t pl) 290 { 291 const uint8_t *e; 292 size_t bytes = 0, ocets; 293 int b; 294 uint8_t cidr; 295 struct in_addr addr; 296 char *o = out; 297 298 /* Minimum is 5 -first is CIDR and a router length of 4 */ 299 if (pl < 5) { 300 errno = EINVAL; 301 return -1; 302 } 303 304 e = p + pl; 305 while (p < e) { 306 cidr = *p++; 307 if (cidr > 32) { 308 errno = EINVAL; 309 return -1; 310 } 311 ocets = (size_t)(cidr + 7) / NBBY; 312 if (p + 4 + ocets > e) { 313 errno = ERANGE; 314 return -1; 315 } 316 if (!out) { 317 p += 4 + ocets; 318 bytes += ((4 * 4) * 2) + 4; 319 continue; 320 } 321 if ((((4 * 4) * 2) + 4) > len) { 322 errno = ENOBUFS; 323 return -1; 324 } 325 if (o != out) { 326 *o++ = ' '; 327 len--; 328 } 329 /* If we have ocets then we have a destination and netmask */ 330 if (ocets > 0) { 331 addr.s_addr = 0; 332 memcpy(&addr.s_addr, p, ocets); 333 b = snprintf(o, len, "%s/%d", inet_ntoa(addr), cidr); 334 p += ocets; 335 } else 336 b = snprintf(o, len, "0.0.0.0/0"); 337 o += b; 338 len -= (size_t)b; 339 340 /* Finally, snag the router */ 341 memcpy(&addr.s_addr, p, 4); 342 p += 4; 343 b = snprintf(o, len, " %s", inet_ntoa(addr)); 344 o += b; 345 len -= (size_t)b; 346 } 347 348 if (out) 349 return o - out; 350 return (ssize_t)bytes; 351 } 352 353 static struct rt_head * 354 decode_rfc3442_rt(struct dhcpcd_ctx *ctx, const uint8_t *data, size_t dl) 355 { 356 const uint8_t *p = data; 357 const uint8_t *e; 358 uint8_t cidr; 359 size_t ocets; 360 struct rt_head *routes; 361 struct rt *rt = NULL; 362 363 /* Minimum is 5 -first is CIDR and a router length of 4 */ 364 if (dl < 5) 365 return NULL; 366 367 routes = malloc(sizeof(*routes)); 368 TAILQ_INIT(routes); 369 e = p + dl; 370 while (p < e) { 371 cidr = *p++; 372 if (cidr > 32) { 373 ipv4_freeroutes(routes); 374 errno = EINVAL; 375 return NULL; 376 } 377 378 ocets = (size_t)(cidr + 7) / NBBY; 379 if (p + 4 + ocets > e) { 380 ipv4_freeroutes(routes); 381 errno = ERANGE; 382 return NULL; 383 } 384 385 rt = calloc(1, sizeof(*rt)); 386 if (rt == NULL) { 387 logger(ctx, LOG_ERR, "%s: %m", __func__); 388 ipv4_freeroutes(routes); 389 return NULL; 390 } 391 TAILQ_INSERT_TAIL(routes, rt, next); 392 393 /* If we have ocets then we have a destination and netmask */ 394 if (ocets > 0) { 395 memcpy(&rt->dest.s_addr, p, ocets); 396 p += ocets; 397 rt->net.s_addr = htonl(~0U << (32 - cidr)); 398 } 399 400 /* Finally, snag the router */ 401 memcpy(&rt->gate.s_addr, p, 4); 402 p += 4; 403 } 404 return routes; 405 } 406 407 char * 408 decode_rfc3361(const uint8_t *data, size_t dl) 409 { 410 uint8_t enc; 411 size_t l; 412 ssize_t r; 413 char *sip = NULL; 414 struct in_addr addr; 415 char *p; 416 417 if (dl < 2) { 418 errno = EINVAL; 419 return 0; 420 } 421 422 enc = *data++; 423 dl--; 424 switch (enc) { 425 case 0: 426 if ((r = decode_rfc3397(NULL, 0, data, dl)) > 0) { 427 l = (size_t)r; 428 sip = malloc(l); 429 if (sip == NULL) 430 return 0; 431 decode_rfc3397(sip, l, data, dl); 432 } 433 break; 434 case 1: 435 if (dl == 0 || dl % 4 != 0) { 436 errno = EINVAL; 437 break; 438 } 439 addr.s_addr = INADDR_BROADCAST; 440 l = ((dl / sizeof(addr.s_addr)) * ((4 * 4) + 1)) + 1; 441 sip = p = malloc(l); 442 if (sip == NULL) 443 return 0; 444 while (dl != 0) { 445 memcpy(&addr.s_addr, data, sizeof(addr.s_addr)); 446 data += sizeof(addr.s_addr); 447 p += snprintf(p, l - (size_t)(p - sip), 448 "%s ", inet_ntoa(addr)); 449 dl -= sizeof(addr.s_addr); 450 } 451 *--p = '\0'; 452 break; 453 default: 454 errno = EINVAL; 455 return 0; 456 } 457 458 return sip; 459 } 460 461 /* Decode an RFC5969 6rd order option into a space 462 * separated string. Returns length of string (including 463 * terminating zero) or zero on error. */ 464 ssize_t 465 decode_rfc5969(char *out, size_t len, const uint8_t *p, size_t pl) 466 { 467 uint8_t ipv4masklen, ipv6prefixlen; 468 uint8_t ipv6prefix[16]; 469 uint8_t br[4]; 470 int i; 471 ssize_t b, bytes = 0; 472 473 if (pl < 22) { 474 errno = EINVAL; 475 return 0; 476 } 477 478 ipv4masklen = *p++; 479 pl--; 480 ipv6prefixlen = *p++; 481 pl--; 482 483 for (i = 0; i < 16; i++) { 484 ipv6prefix[i] = *p++; 485 pl--; 486 } 487 if (out) { 488 b= snprintf(out, len, 489 "%d %d " 490 "%02x%02x:%02x%02x:" 491 "%02x%02x:%02x%02x:" 492 "%02x%02x:%02x%02x:" 493 "%02x%02x:%02x%02x", 494 ipv4masklen, ipv6prefixlen, 495 ipv6prefix[0], ipv6prefix[1], ipv6prefix[2], ipv6prefix[3], 496 ipv6prefix[4], ipv6prefix[5], ipv6prefix[6], ipv6prefix[7], 497 ipv6prefix[8], ipv6prefix[9], ipv6prefix[10],ipv6prefix[11], 498 ipv6prefix[12],ipv6prefix[13],ipv6prefix[14], ipv6prefix[15] 499 ); 500 501 len -= (size_t)b; 502 out += b; 503 bytes += b; 504 } else { 505 bytes += 16 * 2 + 8 + 2 + 1 + 2; 506 } 507 508 while (pl >= 4) { 509 br[0] = *p++; 510 br[1] = *p++; 511 br[2] = *p++; 512 br[3] = *p++; 513 pl -= 4; 514 515 if (out) { 516 b= snprintf(out, len, " %d.%d.%d.%d", 517 br[0], br[1], br[2], br[3]); 518 len -= (size_t)b; 519 out += b; 520 bytes += b; 521 } else { 522 bytes += (4 * 4); 523 } 524 } 525 526 return bytes; 527 } 528 529 static char * 530 get_option_string(struct dhcpcd_ctx *ctx, 531 const struct dhcp_message *dhcp, uint8_t option) 532 { 533 size_t len; 534 const uint8_t *p; 535 char *s; 536 537 p = get_option(ctx, dhcp, option, &len); 538 if (!p || len == 0 || *p == '\0') 539 return NULL; 540 541 s = malloc(sizeof(char) * (len + 1)); 542 if (s) { 543 memcpy(s, p, len); 544 s[len] = '\0'; 545 } 546 return s; 547 } 548 549 /* This calculates the netmask that we should use for static routes. 550 * This IS different from the calculation used to calculate the netmask 551 * for an interface address. */ 552 static uint32_t 553 route_netmask(uint32_t ip_in) 554 { 555 /* used to be unsigned long - check if error */ 556 uint32_t p = ntohl(ip_in); 557 uint32_t t; 558 559 if (IN_CLASSA(p)) 560 t = ~IN_CLASSA_NET; 561 else { 562 if (IN_CLASSB(p)) 563 t = ~IN_CLASSB_NET; 564 else { 565 if (IN_CLASSC(p)) 566 t = ~IN_CLASSC_NET; 567 else 568 t = 0; 569 } 570 } 571 572 while (t & p) 573 t >>= 1; 574 575 return (htonl(~t)); 576 } 577 578 /* We need to obey routing options. 579 * If we have a CSR then we only use that. 580 * Otherwise we add static routes and then routers. */ 581 struct rt_head * 582 get_option_routes(struct interface *ifp, const struct dhcp_message *dhcp) 583 { 584 struct if_options *ifo = ifp->options; 585 const uint8_t *p; 586 const uint8_t *e; 587 struct rt_head *routes = NULL; 588 struct rt *route = NULL; 589 size_t len; 590 const char *csr = ""; 591 592 /* If we have CSR's then we MUST use these only */ 593 if (!has_option_mask(ifo->nomask, DHO_CSR)) 594 p = get_option(ifp->ctx, dhcp, DHO_CSR, &len); 595 else 596 p = NULL; 597 /* Check for crappy MS option */ 598 if (!p && !has_option_mask(ifo->nomask, DHO_MSCSR)) { 599 p = get_option(ifp->ctx, dhcp, DHO_MSCSR, &len); 600 if (p) 601 csr = "MS "; 602 } 603 if (p) { 604 routes = decode_rfc3442_rt(ifp->ctx, p, len); 605 if (routes) { 606 const struct dhcp_state *state; 607 608 state = D_CSTATE(ifp); 609 if (!(ifo->options & DHCPCD_CSR_WARNED) && 610 !(state->added & STATE_FAKE)) 611 { 612 logger(ifp->ctx, LOG_DEBUG, 613 "%s: using %sClassless Static Routes", 614 ifp->name, csr); 615 ifo->options |= DHCPCD_CSR_WARNED; 616 } 617 return routes; 618 } 619 } 620 621 /* OK, get our static routes first. */ 622 routes = malloc(sizeof(*routes)); 623 if (routes == NULL) { 624 logger(ifp->ctx, LOG_ERR, "%s: %m", __func__); 625 return NULL; 626 } 627 TAILQ_INIT(routes); 628 if (!has_option_mask(ifo->nomask, DHO_STATICROUTE)) 629 p = get_option(ifp->ctx, dhcp, DHO_STATICROUTE, &len); 630 else 631 p = NULL; 632 /* RFC 2131 Section 5.8 states length MUST be in multiples of 8 */ 633 if (p && len % 8 == 0) { 634 e = p + len; 635 while (p < e) { 636 if ((route = calloc(1, sizeof(*route))) == NULL) { 637 logger(ifp->ctx, LOG_ERR, "%s: %m", __func__); 638 ipv4_freeroutes(routes); 639 return NULL; 640 } 641 memcpy(&route->dest.s_addr, p, 4); 642 p += 4; 643 memcpy(&route->gate.s_addr, p, 4); 644 p += 4; 645 /* RFC 2131 Section 5.8 states default route is 646 * illegal */ 647 if (route->dest.s_addr == htonl(INADDR_ANY)) { 648 errno = EINVAL; 649 free(route); 650 continue; 651 } 652 route->net.s_addr = route_netmask(route->dest.s_addr); 653 TAILQ_INSERT_TAIL(routes, route, next); 654 } 655 } 656 657 /* Now grab our routers */ 658 if (!has_option_mask(ifo->nomask, DHO_ROUTER)) 659 p = get_option(ifp->ctx, dhcp, DHO_ROUTER, &len); 660 else 661 p = NULL; 662 if (p) { 663 e = p + len; 664 while (p < e) { 665 if ((route = calloc(1, sizeof(*route))) == NULL) { 666 logger(ifp->ctx, LOG_ERR, "%s: %m", __func__); 667 ipv4_freeroutes(routes); 668 return NULL; 669 } 670 memcpy(&route->gate.s_addr, p, 4); 671 p += 4; 672 TAILQ_INSERT_TAIL(routes, route, next); 673 } 674 } 675 676 return routes; 677 } 678 679 #define PUTADDR(_type, _val) \ 680 { \ 681 *p++ = _type; \ 682 *p++ = 4; \ 683 memcpy(p, &_val.s_addr, 4); \ 684 p += 4; \ 685 } 686 687 int 688 dhcp_message_add_addr(struct dhcp_message *dhcp, 689 uint8_t type, struct in_addr addr) 690 { 691 uint8_t *p; 692 size_t len; 693 694 p = dhcp->options; 695 while (*p != DHO_END) { 696 p++; 697 p += *p + 1; 698 } 699 700 len = (size_t)(p - (uint8_t *)dhcp); 701 if (len + 6 > sizeof(*dhcp)) { 702 errno = ENOMEM; 703 return -1; 704 } 705 706 PUTADDR(type, addr); 707 *p = DHO_END; 708 return 0; 709 } 710 711 ssize_t 712 make_message(struct dhcp_message **message, 713 const struct interface *ifp, 714 uint8_t type) 715 { 716 struct dhcp_message *dhcp; 717 uint8_t *m, *lp, *p, *auth; 718 uint8_t *n_params = NULL, auth_len; 719 uint32_t ul; 720 uint16_t sz; 721 size_t len, i; 722 const struct dhcp_opt *opt; 723 struct if_options *ifo = ifp->options; 724 const struct dhcp_state *state = D_CSTATE(ifp); 725 const struct dhcp_lease *lease = &state->lease; 726 time_t up = uptime() - state->start_uptime; 727 char hbuf[HOSTNAME_MAX_LEN + 1]; 728 const char *hostname; 729 const struct vivco *vivco; 730 731 dhcp = calloc(1, sizeof (*dhcp)); 732 if (dhcp == NULL) 733 return -1; 734 m = (uint8_t *)dhcp; 735 p = dhcp->options; 736 737 if ((type == DHCP_INFORM || type == DHCP_RELEASE || 738 (type == DHCP_REQUEST && 739 state->net.s_addr == lease->net.s_addr && 740 (state->new == NULL || 741 state->new->cookie == htonl(MAGIC_COOKIE))))) 742 { 743 dhcp->ciaddr = state->addr.s_addr; 744 /* In-case we haven't actually configured the address yet */ 745 if (type == DHCP_INFORM && state->addr.s_addr == 0) 746 dhcp->ciaddr = lease->addr.s_addr; 747 } 748 749 dhcp->op = DHCP_BOOTREQUEST; 750 dhcp->hwtype = (uint8_t)ifp->family; 751 switch (ifp->family) { 752 case ARPHRD_ETHER: 753 case ARPHRD_IEEE802: 754 dhcp->hwlen = (uint8_t)ifp->hwlen; 755 memcpy(&dhcp->chaddr, &ifp->hwaddr, ifp->hwlen); 756 break; 757 } 758 759 if (ifo->options & DHCPCD_BROADCAST && 760 dhcp->ciaddr == 0 && 761 type != DHCP_DECLINE && 762 type != DHCP_RELEASE) 763 dhcp->flags = htons(BROADCAST_FLAG); 764 765 if (type != DHCP_DECLINE && type != DHCP_RELEASE) { 766 if (up < 0 || up > (time_t)UINT16_MAX) 767 dhcp->secs = htons((uint16_t)UINT16_MAX); 768 else 769 dhcp->secs = htons((uint16_t)up); 770 } 771 dhcp->xid = htonl(state->xid); 772 dhcp->cookie = htonl(MAGIC_COOKIE); 773 774 if (!(ifo->options & DHCPCD_BOOTP)) { 775 *p++ = DHO_MESSAGETYPE; 776 *p++ = 1; 777 *p++ = type; 778 } 779 780 if (state->clientid) { 781 *p++ = DHO_CLIENTID; 782 memcpy(p, state->clientid, (size_t)state->clientid[0] + 1); 783 p += state->clientid[0] + 1; 784 } 785 786 if (lease->addr.s_addr && lease->cookie == htonl(MAGIC_COOKIE)) { 787 if (type == DHCP_DECLINE || 788 (type == DHCP_REQUEST && 789 lease->addr.s_addr != state->addr.s_addr)) 790 { 791 PUTADDR(DHO_IPADDRESS, lease->addr); 792 if (lease->server.s_addr) 793 PUTADDR(DHO_SERVERID, lease->server); 794 } 795 796 if (type == DHCP_RELEASE) { 797 if (lease->server.s_addr) 798 PUTADDR(DHO_SERVERID, lease->server); 799 } 800 } 801 802 if (type == DHCP_DECLINE) { 803 *p++ = DHO_MESSAGE; 804 len = strlen(DAD); 805 *p++ = (uint8_t)len; 806 memcpy(p, DAD, len); 807 p += len; 808 } 809 810 if (type == DHCP_DISCOVER && 811 !(ifp->ctx->options & DHCPCD_TEST) && 812 has_option_mask(ifo->requestmask, DHO_RAPIDCOMMIT)) 813 { 814 /* RFC 4039 Section 3 */ 815 *p++ = DHO_RAPIDCOMMIT; 816 *p++ = 0; 817 } 818 819 if (type == DHCP_DISCOVER && ifo->options & DHCPCD_REQUEST) 820 PUTADDR(DHO_IPADDRESS, ifo->req_addr); 821 822 /* RFC 2563 Auto Configure */ 823 if (type == DHCP_DISCOVER && ifo->options & DHCPCD_IPV4LL) { 824 *p++ = DHO_AUTOCONFIGURE; 825 *p++ = 1; 826 *p++ = 1; 827 } 828 829 if (type == DHCP_DISCOVER || 830 type == DHCP_INFORM || 831 type == DHCP_REQUEST) 832 { 833 if (!(ifo->options & DHCPCD_BOOTP)) { 834 int mtu; 835 836 *p++ = DHO_MAXMESSAGESIZE; 837 *p++ = 2; 838 mtu = if_getmtu(ifp->name); 839 if (mtu < MTU_MIN) { 840 if (if_setmtu(ifp->name, MTU_MIN) == 0) 841 sz = MTU_MIN; 842 } else if (mtu > MTU_MAX) { 843 /* Even though our MTU could be greater than 844 * MTU_MAX (1500) dhcpcd does not presently 845 * handle DHCP packets any bigger. */ 846 mtu = MTU_MAX; 847 } 848 sz = htons((uint16_t)mtu); 849 memcpy(p, &sz, 2); 850 p += 2; 851 } 852 853 if (ifo->userclass[0]) { 854 *p++ = DHO_USERCLASS; 855 memcpy(p, ifo->userclass, 856 (size_t)ifo->userclass[0] + 1); 857 p += ifo->userclass[0] + 1; 858 } 859 860 if (ifo->vendorclassid[0]) { 861 *p++ = DHO_VENDORCLASSID; 862 memcpy(p, ifo->vendorclassid, 863 (size_t)ifo->vendorclassid[0] + 1); 864 p += ifo->vendorclassid[0] + 1; 865 } 866 867 if (type != DHCP_INFORM) { 868 if (ifo->leasetime != 0) { 869 *p++ = DHO_LEASETIME; 870 *p++ = 4; 871 ul = htonl(ifo->leasetime); 872 memcpy(p, &ul, 4); 873 p += 4; 874 } 875 } 876 877 if (ifo->hostname[0] == '\0') 878 hostname = get_hostname(hbuf, sizeof(hbuf), 879 ifo->options & DHCPCD_HOSTNAME_SHORT ? 1 : 0); 880 else 881 hostname = ifo->hostname; 882 883 /* 884 * RFC4702 3.1 States that if we send the Client FQDN option 885 * then we MUST NOT also send the Host Name option. 886 * Technically we could, but that is not RFC conformant and 887 * also seems to break some DHCP server implemetations such as 888 * Windows. On the other hand, ISC dhcpd is just as non RFC 889 * conformant by not accepting a partially qualified FQDN. 890 */ 891 if (ifo->fqdn != FQDN_DISABLE) { 892 /* IETF DHC-FQDN option (81), RFC4702 */ 893 *p++ = DHO_FQDN; 894 lp = p; 895 *p++ = 3; 896 /* 897 * Flags: 0000NEOS 898 * S: 1 => Client requests Server to update 899 * a RR in DNS as well as PTR 900 * O: 1 => Server indicates to client that 901 * DNS has been updated 902 * E: 1 => Name data is DNS format 903 * N: 1 => Client requests Server to not 904 * update DNS 905 */ 906 if (hostname) 907 *p++ = (uint8_t)((ifo->fqdn & 0x09) | 0x04); 908 else 909 *p++ = (FQDN_NONE & 0x09) | 0x04; 910 *p++ = 0; /* from server for PTR RR */ 911 *p++ = 0; /* from server for A RR if S=1 */ 912 if (hostname) { 913 i = encode_rfc1035(hostname, p); 914 *lp = (uint8_t)(*lp + i); 915 p += i; 916 } 917 } else if (ifo->options & DHCPCD_HOSTNAME && hostname) { 918 *p++ = DHO_HOSTNAME; 919 len = strlen(hostname); 920 *p++ = (uint8_t)len; 921 memcpy(p, hostname, len); 922 p += len; 923 } 924 925 /* vendor is already encoded correctly, so just add it */ 926 if (ifo->vendor[0]) { 927 *p++ = DHO_VENDOR; 928 memcpy(p, ifo->vendor, (size_t)ifo->vendor[0] + 1); 929 p += ifo->vendor[0] + 1; 930 } 931 932 if ((ifo->auth.options & DHCPCD_AUTH_SENDREQUIRE) != 933 DHCPCD_AUTH_SENDREQUIRE) 934 { 935 /* We support HMAC-MD5 */ 936 *p++ = DHO_FORCERENEW_NONCE; 937 *p++ = 1; 938 *p++ = AUTH_ALG_HMAC_MD5; 939 } 940 941 if (ifo->vivco_len) { 942 *p++ = DHO_VIVCO; 943 lp = p++; 944 *lp = sizeof(ul); 945 ul = htonl(ifo->vivco_en); 946 memcpy(p, &ul, sizeof(ul)); 947 p += sizeof(ul); 948 for (i = 0, vivco = ifo->vivco; 949 i < ifo->vivco_len; 950 i++, vivco++) 951 { 952 len = (size_t)(p - m) + vivco->len + 1; 953 if (len > sizeof(*dhcp)) 954 goto toobig; 955 if (vivco->len + 2 + *lp > 255) { 956 logger(ifp->ctx, LOG_ERR, 957 "%s: VIVCO option too big", 958 ifp->name); 959 free(dhcp); 960 return -1; 961 } 962 *p++ = (uint8_t)vivco->len; 963 memcpy(p, vivco->data, vivco->len); 964 p += vivco->len; 965 *lp = (uint8_t)(*lp + vivco->len + 1); 966 } 967 } 968 969 len = (size_t)((p - m) + 3); 970 if (len > sizeof(*dhcp)) 971 goto toobig; 972 *p++ = DHO_PARAMETERREQUESTLIST; 973 n_params = p; 974 *p++ = 0; 975 for (i = 0, opt = ifp->ctx->dhcp_opts; 976 i < ifp->ctx->dhcp_opts_len; 977 i++, opt++) 978 { 979 if (!(opt->type & REQUEST || 980 has_option_mask(ifo->requestmask, opt->option))) 981 continue; 982 if (opt->type & NOREQ) 983 continue; 984 if (type == DHCP_INFORM && 985 (opt->option == DHO_RENEWALTIME || 986 opt->option == DHO_REBINDTIME)) 987 continue; 988 len = (size_t)((p - m) + 2); 989 if (len > sizeof(*dhcp)) 990 goto toobig; 991 *p++ = (uint8_t)opt->option; 992 } 993 for (i = 0, opt = ifo->dhcp_override; 994 i < ifo->dhcp_override_len; 995 i++, opt++) 996 { 997 /* Check if added above */ 998 for (lp = n_params + 1; lp < p; lp++) 999 if (*lp == (uint8_t)opt->option) 1000 break; 1001 if (lp < p) 1002 continue; 1003 if (!(opt->type & REQUEST || 1004 has_option_mask(ifo->requestmask, opt->option))) 1005 continue; 1006 if (opt->type & NOREQ) 1007 continue; 1008 if (type == DHCP_INFORM && 1009 (opt->option == DHO_RENEWALTIME || 1010 opt->option == DHO_REBINDTIME)) 1011 continue; 1012 len = (size_t)((p - m) + 2); 1013 if (len > sizeof(*dhcp)) 1014 goto toobig; 1015 *p++ = (uint8_t)opt->option; 1016 } 1017 *n_params = (uint8_t)(p - n_params - 1); 1018 } 1019 1020 /* silence GCC */ 1021 auth_len = 0; 1022 auth = NULL; 1023 1024 if (ifo->auth.options & DHCPCD_AUTH_SEND) { 1025 ssize_t alen = dhcp_auth_encode(&ifo->auth, 1026 state->auth.token, 1027 NULL, 0, 4, type, NULL, 0); 1028 if (alen != -1 && alen > UINT8_MAX) { 1029 errno = ERANGE; 1030 alen = -1; 1031 } 1032 if (alen == -1) 1033 logger(ifp->ctx, LOG_ERR, 1034 "%s: dhcp_auth_encode: %m", ifp->name); 1035 else if (alen != 0) { 1036 auth_len = (uint8_t)alen; 1037 len = (size_t)((p + alen) - m); 1038 if (len > sizeof(*dhcp)) 1039 goto toobig; 1040 *p++ = DHO_AUTHENTICATION; 1041 *p++ = auth_len; 1042 auth = p; 1043 p += auth_len; 1044 } 1045 } 1046 1047 *p++ = DHO_END; 1048 1049 /* Pad out to the BOOTP minimum message length. 1050 * Some DHCP servers incorrectly require this. */ 1051 while (p - m < BOOTP_MESSAGE_LENTH_MIN) 1052 *p++ = DHO_PAD; 1053 1054 len = (size_t)(p - m); 1055 if (ifo->auth.options & DHCPCD_AUTH_SEND && auth_len != 0) 1056 dhcp_auth_encode(&ifo->auth, state->auth.token, 1057 m, len, 4, type, auth, auth_len); 1058 1059 *message = dhcp; 1060 return (ssize_t)len; 1061 1062 toobig: 1063 logger(ifp->ctx, LOG_ERR, "%s: DHCP messge too big", ifp->name); 1064 free(dhcp); 1065 return -1; 1066 } 1067 1068 static ssize_t 1069 write_lease(const struct interface *ifp, const struct dhcp_message *dhcp) 1070 { 1071 int fd; 1072 size_t len; 1073 ssize_t bytes; 1074 const uint8_t *e, *p; 1075 uint8_t l; 1076 uint8_t o = 0; 1077 const struct dhcp_state *state = D_CSTATE(ifp); 1078 uint8_t write_buffer[sizeof(*dhcp) + sizeof(state->server_info) + 1]; 1079 uint8_t *w; 1080 1081 /* We don't write BOOTP leases */ 1082 if (IS_BOOTP(ifp, dhcp)) { 1083 unlink(state->leasefile); 1084 return 0; 1085 } 1086 1087 logger(ifp->ctx, LOG_DEBUG, "%s: writing lease `%s'", 1088 ifp->name, state->leasefile); 1089 1090 fd = open(state->leasefile, O_WRONLY | O_CREAT | O_TRUNC, 0600); 1091 if (fd == -1) 1092 return -1; 1093 1094 /* Only write as much as we need */ 1095 p = dhcp->options; 1096 e = p + sizeof(dhcp->options); 1097 len = sizeof(*dhcp); 1098 while (p < e) { 1099 o = *p; 1100 if (o == DHO_END) { 1101 len = (size_t)(p - (const uint8_t *)dhcp); 1102 break; 1103 } 1104 p++; 1105 if (o != DHO_PAD) { 1106 l = *p++; 1107 p += l; 1108 } 1109 } 1110 1111 memcpy(write_buffer, dhcp, len); 1112 w = write_buffer + len; 1113 1114 /* Copy in server info if this is available. */ 1115 if (state->server_info.gw_hwlen != 0) { 1116 *w++ = DHO_END; 1117 memcpy(w, &state->server_info, sizeof(state->server_info)); 1118 len += sizeof(state->server_info) + 1; 1119 } 1120 1121 bytes = write(fd, write_buffer, len); 1122 close(fd); 1123 return bytes; 1124 } 1125 1126 static struct dhcp_message * 1127 read_lease(struct interface *ifp) 1128 { 1129 int fd; 1130 struct dhcp_message *dhcp; 1131 struct dhcp_state *state = D_STATE(ifp); 1132 uint8_t read_buffer[sizeof(*dhcp) + sizeof(state->server_info) + 1]; 1133 const uint8_t *options_startp = 1134 read_buffer + offsetof(struct dhcp_message, options); 1135 const uint8_t *options_endp = options_startp + sizeof(dhcp->options); 1136 uint8_t option_len; 1137 uint8_t option_type = 0; 1138 ssize_t bytes; 1139 const uint8_t *auth; 1140 uint8_t type; 1141 size_t auth_len; 1142 1143 memset(&state->server_info, 0, sizeof(state->server_info)); 1144 fd = open(state->leasefile, O_RDONLY); 1145 if (fd == -1) { 1146 if (errno != ENOENT) 1147 logger(ifp->ctx, LOG_ERR, "%s: open `%s': %m", 1148 ifp->name, state->leasefile); 1149 return NULL; 1150 } 1151 logger(ifp->ctx, LOG_DEBUG, "%s: reading lease `%s'", 1152 ifp->name, state->leasefile); 1153 bytes = read(fd, read_buffer, sizeof(read_buffer)); 1154 close(fd); 1155 1156 /* Lease file should at minimum contain all fields before options. */ 1157 if (read_buffer + bytes < options_startp) 1158 return NULL; 1159 1160 dhcp = calloc(1, sizeof(*dhcp)); 1161 if (dhcp == NULL) { 1162 return NULL; 1163 } 1164 1165 if (options_endp > read_buffer + bytes) 1166 options_endp = read_buffer + bytes; 1167 1168 while (options_startp < options_endp) { 1169 option_type = *options_startp++; 1170 if (option_type == DHO_END) 1171 break; 1172 if (option_type != DHO_PAD) { 1173 option_len = *options_startp++; 1174 options_startp += option_len; 1175 } 1176 } 1177 memcpy(dhcp, read_buffer, options_startp - read_buffer); 1178 1179 /* We may have found a BOOTP server */ 1180 if (get_option_uint8(ifp->ctx, &type, dhcp, DHO_MESSAGETYPE) == -1) 1181 type = 0; 1182 1183 /* Authenticate the message */ 1184 auth = get_option(ifp->ctx, dhcp, DHO_AUTHENTICATION, &auth_len); 1185 if (auth) { 1186 if (dhcp_auth_validate(&state->auth, &ifp->options->auth, 1187 (uint8_t *)dhcp, sizeof(*dhcp), 4, type, 1188 auth, auth_len) == NULL) 1189 { 1190 logger(ifp->ctx, LOG_DEBUG, 1191 "%s: dhcp_auth_validate: %m", ifp->name); 1192 free(dhcp); 1193 return NULL; 1194 } 1195 if (state->auth.token) 1196 logger(ifp->ctx, LOG_DEBUG, 1197 "%s: validated using 0x%08" PRIu32, 1198 ifp->name, state->auth.token->secretid); 1199 else 1200 logger(ifp->ctx, LOG_DEBUG, 1201 "%s: accepted reconfigure key", ifp->name); 1202 } 1203 1204 /* 1205 * DHCP server information is stored after the DHO_END character 1206 * in the lease file. The first byte of the server information 1207 * is the length of the gateway hardware address. 1208 */ 1209 options_endp = read_buffer + bytes; 1210 if (options_startp >= options_endp || 1211 options_startp + sizeof(state->server_info) > options_endp) 1212 return dhcp; 1213 1214 logger(ifp->ctx, LOG_DEBUG, "%s: found server info in lease '%s'", 1215 ifp->name, state->leasefile); 1216 1217 memcpy(&state->server_info, options_startp, sizeof(state->server_info)); 1218 if (state->server_info.gw_hwlen != ifp->hwlen) { 1219 logger(ifp->ctx, LOG_ERR, "%s: lease file %s has incompatible" 1220 "MAC address length %d (expected %zd)", 1221 ifp->name, state->leasefile, 1222 state->server_info.gw_hwlen, ifp->hwlen); 1223 memset(&state->server_info, 0, sizeof(state->server_info)); 1224 } 1225 return dhcp; 1226 } 1227 1228 static const struct dhcp_opt * 1229 dhcp_getoverride(const struct if_options *ifo, unsigned int o) 1230 { 1231 size_t i; 1232 const struct dhcp_opt *opt; 1233 1234 for (i = 0, opt = ifo->dhcp_override; 1235 i < ifo->dhcp_override_len; 1236 i++, opt++) 1237 { 1238 if (opt->option == o) 1239 return opt; 1240 } 1241 return NULL; 1242 } 1243 1244 static const uint8_t * 1245 dhcp_getoption(struct dhcpcd_ctx *ctx, 1246 size_t *os, unsigned int *code, size_t *len, 1247 const uint8_t *od, size_t ol, struct dhcp_opt **oopt) 1248 { 1249 size_t i; 1250 struct dhcp_opt *opt; 1251 1252 if (od) { 1253 if (ol < 2) { 1254 errno = EINVAL; 1255 return NULL; 1256 } 1257 *os = 2; /* code + len */ 1258 *code = (unsigned int)*od++; 1259 *len = (size_t)*od++; 1260 if (*len > ol - *os) { 1261 errno = EINVAL; 1262 return NULL; 1263 } 1264 } 1265 1266 *oopt = NULL; 1267 for (i = 0, opt = ctx->dhcp_opts; i < ctx->dhcp_opts_len; i++, opt++) { 1268 if (opt->option == *code) { 1269 *oopt = opt; 1270 break; 1271 } 1272 } 1273 1274 return od; 1275 } 1276 1277 ssize_t 1278 dhcp_env(char **env, const char *prefix, const struct dhcp_message *dhcp, 1279 const struct interface *ifp) 1280 { 1281 const struct if_options *ifo; 1282 const uint8_t *p; 1283 struct in_addr addr; 1284 struct in_addr net; 1285 struct in_addr brd; 1286 struct dhcp_opt *opt, *vo; 1287 size_t e, i, pl; 1288 char **ep; 1289 char cidr[4], safe[(BOOTFILE_LEN * 4) + 1]; 1290 uint8_t overl = 0; 1291 uint32_t en; 1292 1293 e = 0; 1294 ifo = ifp->options; 1295 get_option_uint8(ifp->ctx, &overl, dhcp, DHO_OPTIONSOVERLOADED); 1296 1297 if (env == NULL) { 1298 if (dhcp->yiaddr || dhcp->ciaddr) 1299 e += 5; 1300 if (*dhcp->bootfile && !(overl & 1)) 1301 e++; 1302 if (*dhcp->servername && !(overl & 2)) 1303 e++; 1304 for (i = 0, opt = ifp->ctx->dhcp_opts; 1305 i < ifp->ctx->dhcp_opts_len; 1306 i++, opt++) 1307 { 1308 if (has_option_mask(ifo->nomask, opt->option)) 1309 continue; 1310 if (dhcp_getoverride(ifo, opt->option)) 1311 continue; 1312 p = get_option(ifp->ctx, dhcp, opt->option, &pl); 1313 if (!p) 1314 continue; 1315 e += dhcp_envoption(ifp->ctx, NULL, NULL, ifp->name, 1316 opt, dhcp_getoption, p, pl); 1317 } 1318 for (i = 0, opt = ifo->dhcp_override; 1319 i < ifo->dhcp_override_len; 1320 i++, opt++) 1321 { 1322 if (has_option_mask(ifo->nomask, opt->option)) 1323 continue; 1324 p = get_option(ifp->ctx, dhcp, opt->option, &pl); 1325 if (!p) 1326 continue; 1327 e += dhcp_envoption(ifp->ctx, NULL, NULL, ifp->name, 1328 opt, dhcp_getoption, p, pl); 1329 } 1330 return (ssize_t)e; 1331 } 1332 1333 ep = env; 1334 if (dhcp->yiaddr || dhcp->ciaddr) { 1335 /* Set some useful variables that we derive from the DHCP 1336 * message but are not necessarily in the options */ 1337 addr.s_addr = dhcp->yiaddr ? dhcp->yiaddr : dhcp->ciaddr; 1338 setvar(ifp->ctx, &ep, prefix, "ip_address", inet_ntoa(addr)); 1339 if (get_option_addr(ifp->ctx, &net, 1340 dhcp, DHO_SUBNETMASK) == -1) { 1341 net.s_addr = ipv4_getnetmask(addr.s_addr); 1342 setvar(ifp->ctx, &ep, prefix, 1343 "subnet_mask", inet_ntoa(net)); 1344 } 1345 snprintf(cidr, sizeof(cidr), "%d", inet_ntocidr(net)); 1346 setvar(ifp->ctx, &ep, prefix, "subnet_cidr", cidr); 1347 if (get_option_addr(ifp->ctx, &brd, 1348 dhcp, DHO_BROADCAST) == -1) { 1349 brd.s_addr = addr.s_addr | ~net.s_addr; 1350 setvar(ifp->ctx, &ep, prefix, 1351 "broadcast_address", inet_ntoa(brd)); 1352 } 1353 addr.s_addr = dhcp->yiaddr & net.s_addr; 1354 setvar(ifp->ctx, &ep, prefix, 1355 "network_number", inet_ntoa(addr)); 1356 } 1357 1358 if (*dhcp->bootfile && !(overl & 1)) { 1359 print_string(safe, sizeof(safe), STRING, 1360 dhcp->bootfile, sizeof(dhcp->bootfile)); 1361 setvar(ifp->ctx, &ep, prefix, "filename", safe); 1362 } 1363 if (*dhcp->servername && !(overl & 2)) { 1364 print_string(safe, sizeof(safe), STRING | DOMAIN, 1365 dhcp->servername, sizeof(dhcp->servername)); 1366 setvar(ifp->ctx, &ep, prefix, "server_name", safe); 1367 } 1368 1369 /* Zero our indexes */ 1370 if (env) { 1371 for (i = 0, opt = ifp->ctx->dhcp_opts; 1372 i < ifp->ctx->dhcp_opts_len; 1373 i++, opt++) 1374 dhcp_zero_index(opt); 1375 for (i = 0, opt = ifp->options->dhcp_override; 1376 i < ifp->options->dhcp_override_len; 1377 i++, opt++) 1378 dhcp_zero_index(opt); 1379 for (i = 0, opt = ifp->ctx->vivso; 1380 i < ifp->ctx->vivso_len; 1381 i++, opt++) 1382 dhcp_zero_index(opt); 1383 } 1384 1385 for (i = 0, opt = ifp->ctx->dhcp_opts; 1386 i < ifp->ctx->dhcp_opts_len; 1387 i++, opt++) 1388 { 1389 if (has_option_mask(ifo->nomask, opt->option)) 1390 continue; 1391 if (dhcp_getoverride(ifo, opt->option)) 1392 continue; 1393 if ((p = get_option(ifp->ctx, dhcp, opt->option, &pl))) { 1394 ep += dhcp_envoption(ifp->ctx, ep, prefix, ifp->name, 1395 opt, dhcp_getoption, p, pl); 1396 if (opt->option == DHO_VIVSO && 1397 pl > (int)sizeof(uint32_t)) 1398 { 1399 memcpy(&en, p, sizeof(en)); 1400 en = ntohl(en); 1401 vo = vivso_find(en, ifp); 1402 if (vo) { 1403 /* Skip over en + total size */ 1404 p += sizeof(en) + 1; 1405 pl -= sizeof(en) + 1; 1406 ep += dhcp_envoption(ifp->ctx, 1407 ep, prefix, ifp->name, 1408 vo, dhcp_getoption, p, pl); 1409 } 1410 } 1411 } 1412 } 1413 1414 for (i = 0, opt = ifo->dhcp_override; 1415 i < ifo->dhcp_override_len; 1416 i++, opt++) 1417 { 1418 if (has_option_mask(ifo->nomask, opt->option)) 1419 continue; 1420 if ((p = get_option(ifp->ctx, dhcp, opt->option, &pl))) 1421 ep += dhcp_envoption(ifp->ctx, ep, prefix, ifp->name, 1422 opt, dhcp_getoption, p, pl); 1423 } 1424 1425 return ep - env; 1426 } 1427 1428 static void 1429 get_lease(struct dhcpcd_ctx *ctx, 1430 struct dhcp_lease *lease, const struct dhcp_message *dhcp) 1431 { 1432 1433 lease->cookie = dhcp->cookie; 1434 /* BOOTP does not set yiaddr for replies when ciaddr is set. */ 1435 if (dhcp->yiaddr) 1436 lease->addr.s_addr = dhcp->yiaddr; 1437 else 1438 lease->addr.s_addr = dhcp->ciaddr; 1439 if (get_option_addr(ctx, &lease->net, dhcp, DHO_SUBNETMASK) == -1) 1440 lease->net.s_addr = ipv4_getnetmask(lease->addr.s_addr); 1441 if (get_option_addr(ctx, &lease->brd, dhcp, DHO_BROADCAST) == -1) 1442 lease->brd.s_addr = lease->addr.s_addr | ~lease->net.s_addr; 1443 if (get_option_uint32(ctx, &lease->leasetime, dhcp, DHO_LEASETIME) != 0) 1444 lease->leasetime = ~0U; /* Default to infinite lease */ 1445 if (get_option_uint32(ctx, &lease->renewaltime, 1446 dhcp, DHO_RENEWALTIME) != 0) 1447 lease->renewaltime = 0; 1448 if (get_option_uint32(ctx, &lease->rebindtime, 1449 dhcp, DHO_REBINDTIME) != 0) 1450 lease->rebindtime = 0; 1451 if (get_option_addr(ctx, &lease->server, dhcp, DHO_SERVERID) != 0) 1452 lease->server.s_addr = INADDR_ANY; 1453 } 1454 1455 static const char * 1456 get_dhcp_op(uint8_t type) 1457 { 1458 const struct dhcp_op *d; 1459 1460 for (d = dhcp_ops; d->name; d++) 1461 if (d->value == type) 1462 return d->name; 1463 return NULL; 1464 } 1465 1466 static void 1467 dhcp_fallback(void *arg) 1468 { 1469 struct interface *iface; 1470 1471 iface = (struct interface *)arg; 1472 dhcpcd_selectprofile(iface, iface->options->fallback); 1473 dhcpcd_startinterface(iface); 1474 } 1475 1476 uint32_t 1477 dhcp_xid(const struct interface *ifp) 1478 { 1479 uint32_t xid; 1480 1481 if (ifp->options->options & DHCPCD_XID_HWADDR && 1482 ifp->hwlen >= sizeof(xid)) 1483 /* The lower bits are probably more unique on the network */ 1484 memcpy(&xid, (ifp->hwaddr + ifp->hwlen) - sizeof(xid), 1485 sizeof(xid)); 1486 else 1487 xid = arc4random(); 1488 1489 return xid; 1490 } 1491 1492 void 1493 dhcp_close(struct interface *ifp) 1494 { 1495 struct dhcp_state *state = D_STATE(ifp); 1496 1497 if (state == NULL) 1498 return; 1499 1500 if (state->raw_fd != -1) { 1501 eloop_event_delete(ifp->ctx->eloop, state->raw_fd, 0); 1502 close(state->raw_fd); 1503 state->raw_fd = -1; 1504 } 1505 1506 state->interval = 0; 1507 } 1508 1509 static int 1510 dhcp_openudp(struct interface *ifp) 1511 { 1512 int s; 1513 struct sockaddr_in sin; 1514 int n; 1515 struct dhcp_state *state; 1516 #ifdef SO_BINDTODEVICE 1517 struct ifreq ifr; 1518 char *p; 1519 #endif 1520 1521 #ifdef SOCK_CLOEXEC 1522 if ((s = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_UDP)) == -1) 1523 return -1; 1524 #else 1525 if ((s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) 1526 return -1; 1527 if ((n = fcntl(s, F_GETFD, 0)) == -1 || 1528 fcntl(s, F_SETFD, n | FD_CLOEXEC) == -1) 1529 { 1530 close(s); 1531 return -1; 1532 } 1533 #endif 1534 1535 n = 1; 1536 if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n)) == -1) 1537 goto eexit; 1538 #ifdef SO_BINDTODEVICE 1539 if (ifp) { 1540 memset(&ifr, 0, sizeof(ifr)); 1541 strlcpy(ifr.ifr_name, ifp->name, sizeof(ifr.ifr_name)); 1542 /* We can only bind to the real device */ 1543 p = strchr(ifr.ifr_name, ':'); 1544 if (p) 1545 *p = '\0'; 1546 if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, &ifr, 1547 sizeof(ifr)) == -1) 1548 goto eexit; 1549 } 1550 #endif 1551 memset(&sin, 0, sizeof(sin)); 1552 sin.sin_family = AF_INET; 1553 sin.sin_port = htons(DHCP_CLIENT_PORT); 1554 if (ifp) { 1555 state = D_STATE(ifp); 1556 sin.sin_addr.s_addr = state->addr.s_addr; 1557 } else 1558 state = NULL; /* appease gcc */ 1559 if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == -1) 1560 goto eexit; 1561 1562 return s; 1563 1564 eexit: 1565 close(s); 1566 return -1; 1567 } 1568 1569 static uint16_t 1570 checksum(const void *data, unsigned int len) 1571 { 1572 const uint8_t *addr = data; 1573 uint32_t sum = 0; 1574 1575 while (len > 1) { 1576 sum += (uint32_t)(addr[0] * 256 + addr[1]); 1577 addr += 2; 1578 len -= 2; 1579 } 1580 1581 if (len == 1) 1582 sum += (uint32_t)(*addr * 256); 1583 1584 sum = (sum >> 16) + (sum & 0xffff); 1585 sum += (sum >> 16); 1586 1587 return (uint16_t)~htons((uint16_t)sum); 1588 } 1589 1590 static struct udp_dhcp_packet * 1591 dhcp_makeudppacket(size_t *sz, const uint8_t *data, size_t length, 1592 struct in_addr source, struct in_addr dest) 1593 { 1594 struct udp_dhcp_packet *udpp; 1595 struct ip *ip; 1596 struct udphdr *udp; 1597 1598 udpp = calloc(1, sizeof(*udpp)); 1599 if (udpp == NULL) 1600 return NULL; 1601 ip = &udpp->ip; 1602 udp = &udpp->udp; 1603 1604 /* OK, this is important :) 1605 * We copy the data to our packet and then create a small part of the 1606 * ip structure and an invalid ip_len (basically udp length). 1607 * We then fill the udp structure and put the checksum 1608 * of the whole packet into the udp checksum. 1609 * Finally we complete the ip structure and ip checksum. 1610 * If we don't do the ordering like so then the udp checksum will be 1611 * broken, so find another way of doing it! */ 1612 1613 memcpy(&udpp->dhcp, data, length); 1614 1615 ip->ip_p = IPPROTO_UDP; 1616 ip->ip_src.s_addr = source.s_addr; 1617 if (dest.s_addr == 0) 1618 ip->ip_dst.s_addr = INADDR_BROADCAST; 1619 else 1620 ip->ip_dst.s_addr = dest.s_addr; 1621 1622 udp->uh_sport = htons(DHCP_CLIENT_PORT); 1623 udp->uh_dport = htons(DHCP_SERVER_PORT); 1624 udp->uh_ulen = htons((uint16_t)(sizeof(*udp) + length)); 1625 ip->ip_len = udp->uh_ulen; 1626 udp->uh_sum = checksum(udpp, sizeof(*udpp)); 1627 1628 ip->ip_v = IPVERSION; 1629 ip->ip_hl = sizeof(*ip) >> 2; 1630 ip->ip_id = (uint16_t)arc4random_uniform(UINT16_MAX); 1631 ip->ip_ttl = IPDEFTTL; 1632 ip->ip_len = htons((uint16_t)(sizeof(*ip) + sizeof(*udp) + length)); 1633 ip->ip_sum = checksum(ip, sizeof(*ip)); 1634 1635 *sz = sizeof(*ip) + sizeof(*udp) + length; 1636 return udpp; 1637 } 1638 1639 static void 1640 send_message(struct interface *ifp, uint8_t type, 1641 void (*callback)(void *)) 1642 { 1643 struct dhcp_state *state = D_STATE(ifp); 1644 struct if_options *ifo = ifp->options; 1645 struct dhcp_message *dhcp; 1646 struct udp_dhcp_packet *udp; 1647 size_t len; 1648 ssize_t r; 1649 struct in_addr from, to; 1650 in_addr_t a = INADDR_ANY; 1651 struct timespec tv; 1652 int s; 1653 #ifdef IN_IFF_NOTUSEABLE 1654 struct ipv4_addr *ia; 1655 #endif 1656 1657 if (!callback) 1658 logger(ifp->ctx, LOG_INFO, "%s: sending %s with xid 0x%x", 1659 ifp->name, 1660 ifo->options & DHCPCD_BOOTP ? "BOOTP" : get_dhcp_op(type), 1661 state->xid); 1662 else { 1663 if (state->interval == 0) 1664 state->interval = DHCP_BASE; 1665 else { 1666 state->interval *= 2; 1667 if (state->interval > DHCP_MAX) 1668 state->interval = DHCP_MAX; 1669 } 1670 tv.tv_sec = state->interval + DHCP_RAND_MIN; 1671 tv.tv_nsec = (suseconds_t)arc4random_uniform( 1672 (DHCP_RAND_MAX - DHCP_RAND_MIN) * NSEC_PER_SEC); 1673 timespecnorm(&tv); 1674 logger(ifp->ctx, LOG_INFO, 1675 "%s: sending %s (xid 0x%x), next in %0.1f seconds", 1676 ifp->name, 1677 ifo->options & DHCPCD_BOOTP ? "BOOTP" : get_dhcp_op(type), 1678 state->xid, 1679 timespec_to_double(&tv)); 1680 } 1681 1682 if (dhcp_open(ifp) == -1) 1683 return; 1684 1685 if (state->added && !(state->added & STATE_FAKE) && 1686 state->addr.s_addr != INADDR_ANY && 1687 state->new != NULL && 1688 #ifdef IN_IFF_NOTUSEABLE 1689 ((ia = ipv4_iffindaddr(ifp, &state->addr, NULL)) && 1690 !(ia->addr_flags & IN_IFF_NOTUSEABLE)) && 1691 #endif 1692 (state->new->cookie == htonl(MAGIC_COOKIE) || 1693 ifp->options->options & DHCPCD_INFORM)) 1694 { 1695 s = dhcp_openudp(ifp); 1696 if (s == -1 && errno != EADDRINUSE) 1697 logger(ifp->ctx, LOG_ERR, 1698 "%s: dhcp_openudp: %m", ifp->name); 1699 } else 1700 s = -1; 1701 1702 /* If we couldn't open a UDP port for our IP address 1703 * then we cannot renew. 1704 * This could happen if our IP was pulled out from underneath us. 1705 * Also, we should not unicast from a BOOTP lease. */ 1706 if (s == -1 || 1707 (!(ifo->options & DHCPCD_INFORM) && 1708 IS_BOOTP(ifp, state->new))) 1709 { 1710 a = state->addr.s_addr; 1711 state->addr.s_addr = INADDR_ANY; 1712 } 1713 r = make_message(&dhcp, ifp, type); 1714 if (r == -1) 1715 goto fail; 1716 len = (size_t)r; 1717 if (a) 1718 state->addr.s_addr = a; 1719 from.s_addr = dhcp->ciaddr; 1720 if (from.s_addr) 1721 to.s_addr = state->lease.server.s_addr; 1722 else 1723 to.s_addr = INADDR_ANY; 1724 if (to.s_addr && to.s_addr != INADDR_BROADCAST) { 1725 struct sockaddr_in sin; 1726 1727 memset(&sin, 0, sizeof(sin)); 1728 sin.sin_family = AF_INET; 1729 sin.sin_addr.s_addr = to.s_addr; 1730 sin.sin_port = htons(DHCP_SERVER_PORT); 1731 r = sendto(s, (uint8_t *)dhcp, len, 0, 1732 (struct sockaddr *)&sin, sizeof(sin)); 1733 if (r == -1) 1734 logger(ifp->ctx, LOG_ERR, 1735 "%s: dhcp_sendpacket: %m", ifp->name); 1736 } else { 1737 size_t ulen; 1738 1739 r = 0; 1740 udp = dhcp_makeudppacket(&ulen, (uint8_t *)dhcp, len, from, to); 1741 if (udp == NULL) { 1742 logger(ifp->ctx, LOG_ERR, "dhcp_makeudppacket: %m"); 1743 } else { 1744 r = if_sendrawpacket(ifp, ETHERTYPE_IP, 1745 (uint8_t *)udp, ulen, NULL); 1746 free(udp); 1747 } 1748 /* If we failed to send a raw packet this normally means 1749 * we don't have the ability to work beneath the IP layer 1750 * for this interface. 1751 * As such we remove it from consideration without actually 1752 * stopping the interface. */ 1753 if (r == -1) { 1754 logger(ifp->ctx, LOG_ERR, 1755 "%s: if_sendrawpacket: %m", ifp->name); 1756 switch(errno) { 1757 case ENETDOWN: 1758 case ENETRESET: 1759 case ENETUNREACH: 1760 break; 1761 default: 1762 if (!(ifp->ctx->options & DHCPCD_TEST)) 1763 dhcp_drop(ifp, "FAIL"); 1764 dhcp_free(ifp); 1765 eloop_timeout_delete(ifp->ctx->eloop, 1766 NULL, ifp); 1767 callback = NULL; 1768 } 1769 } 1770 } 1771 free(dhcp); 1772 1773 fail: 1774 if (s != -1) 1775 close(s); 1776 1777 /* Even if we fail to send a packet we should continue as we are 1778 * as our failure timeouts will change out codepath when needed. */ 1779 if (callback) 1780 eloop_timeout_add_tv(ifp->ctx->eloop, &tv, callback, ifp); 1781 } 1782 1783 static void 1784 send_inform(void *arg) 1785 { 1786 1787 send_message((struct interface *)arg, DHCP_INFORM, send_inform); 1788 } 1789 1790 static void 1791 send_discover(void *arg) 1792 { 1793 1794 send_message((struct interface *)arg, DHCP_DISCOVER, send_discover); 1795 } 1796 1797 static void 1798 send_request(void *arg) 1799 { 1800 1801 send_message((struct interface *)arg, DHCP_REQUEST, send_request); 1802 } 1803 1804 static void 1805 send_renew(void *arg) 1806 { 1807 1808 send_message((struct interface *)arg, DHCP_REQUEST, send_renew); 1809 } 1810 1811 static void 1812 send_rebind(void *arg) 1813 { 1814 1815 send_message((struct interface *)arg, DHCP_REQUEST, send_rebind); 1816 } 1817 1818 void 1819 dhcp_discover(void *arg) 1820 { 1821 struct interface *ifp = arg; 1822 struct dhcp_state *state = D_STATE(ifp); 1823 struct if_options *ifo = ifp->options; 1824 1825 rpc_signal_status("Discover"); 1826 state->state = DHS_DISCOVER; 1827 state->xid = dhcp_xid(ifp); 1828 state->nak_receive_count = 0; 1829 state->failed_address_offer_count = 0; 1830 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp); 1831 if (ifo->fallback) 1832 eloop_timeout_add_sec(ifp->ctx->eloop, 1833 ifo->reboot, dhcp_fallback, ifp); 1834 else if (ifo->options & DHCPCD_IPV4LL && 1835 !IN_LINKLOCAL(htonl(state->addr.s_addr))) 1836 eloop_timeout_add_sec(ifp->ctx->eloop, 1837 ifo->reboot, ipv4ll_start, ifp); 1838 if (ifo->options & DHCPCD_REQUEST) 1839 logger(ifp->ctx, LOG_INFO, 1840 "%s: soliciting a DHCP lease (requesting %s)", 1841 ifp->name, inet_ntoa(ifo->req_addr)); 1842 else 1843 logger(ifp->ctx, LOG_INFO, 1844 "%s: soliciting a %s lease", 1845 ifp->name, ifo->options & DHCPCD_BOOTP ? "BOOTP" : "DHCP"); 1846 send_discover(ifp); 1847 } 1848 1849 static void 1850 dhcp_request(void *arg) 1851 { 1852 struct interface *ifp = arg; 1853 struct dhcp_state *state = D_STATE(ifp); 1854 1855 logger(ifp->ctx, LOG_INFO, "%s: requesting lease of %s", 1856 ifp->name, inet_ntoa(state->lease.addr)); 1857 1858 rpc_signal_status("Request"); 1859 state->state = DHS_REQUEST; 1860 state->nak_receive_count = 0; 1861 send_request(ifp); 1862 } 1863 1864 static void 1865 dhcp_expire(void *arg) 1866 { 1867 struct interface *ifp = arg; 1868 struct dhcp_state *state = D_STATE(ifp); 1869 1870 logger(ifp->ctx, LOG_ERR, "%s: DHCP lease expired", ifp->name); 1871 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp); 1872 dhcp_drop(ifp, "EXPIRE"); 1873 unlink(state->leasefile); 1874 state->interval = 0; 1875 dhcp_discover(ifp); 1876 } 1877 1878 static void 1879 dhcp_decline(struct interface *ifp) 1880 { 1881 1882 send_message(ifp, DHCP_DECLINE, NULL); 1883 } 1884 1885 static void 1886 dhcp_renew(void *arg) 1887 { 1888 struct interface *ifp = arg; 1889 struct dhcp_state *state = D_STATE(ifp); 1890 struct dhcp_lease *lease = &state->lease; 1891 1892 rpc_signal_status("Renew"); 1893 logger(ifp->ctx, LOG_INFO, "%s: renewing lease of %s", 1894 ifp->name, inet_ntoa(lease->addr)); 1895 logger(ifp->ctx, LOG_DEBUG, "%s: rebind in %"PRIu32" seconds," 1896 " expire in %"PRIu32" seconds", 1897 ifp->name, lease->rebindtime - lease->renewaltime, 1898 lease->leasetime - lease->renewaltime); 1899 state->state = DHS_RENEW; 1900 state->xid = dhcp_xid(ifp); 1901 state->nak_receive_count = 0; 1902 send_renew(ifp); 1903 } 1904 1905 #ifndef IN_IFF_TENTATIVE 1906 static void 1907 dhcp_arp_announced(struct arp_state *astate) 1908 { 1909 1910 arp_close(astate->iface); 1911 } 1912 #endif 1913 1914 static void 1915 dhcp_rebind(void *arg) 1916 { 1917 struct interface *ifp = arg; 1918 struct dhcp_state *state = D_STATE(ifp); 1919 struct dhcp_lease *lease = &state->lease; 1920 1921 rpc_signal_status("Rebind"); 1922 logger(ifp->ctx, LOG_WARNING, 1923 "%s: failed to renew DHCP, rebinding", ifp->name); 1924 logger(ifp->ctx, LOG_DEBUG, "%s: expire in %"PRIu32" seconds", 1925 ifp->name, lease->leasetime - lease->rebindtime); 1926 state->state = DHS_REBIND; 1927 eloop_timeout_delete(ifp->ctx->eloop, send_renew, ifp); 1928 state->lease.server.s_addr = 0; 1929 state->nak_receive_count = 0; 1930 ifp->options->options &= ~(DHCPCD_CSR_WARNED | 1931 DHCPCD_ROUTER_HOST_ROUTE_WARNED); 1932 send_rebind(ifp); 1933 } 1934 1935 static void 1936 init_option_iterator(const struct dhcp_message *message, 1937 struct dhcp_option_iterator *iterator) 1938 { 1939 iterator->message = message; 1940 iterator->ptr = message->options; 1941 iterator->end = iterator->ptr + sizeof(message->options); 1942 iterator->extra_option_locations = 0; 1943 iterator->extra_option_locations_set = 0; 1944 } 1945 1946 static int 1947 iterate_next_option(struct dhcp_option_iterator *iterator, 1948 uint8_t *option, uint8_t *length, const uint8_t **value) 1949 { 1950 uint8_t option_code; 1951 uint8_t option_len; 1952 1953 /* Process special DHO_PAD and DHO_END opcodes. */ 1954 while (iterator->ptr < iterator->end) { 1955 if (*iterator->ptr == DHO_PAD) { 1956 iterator->ptr++; 1957 continue; 1958 } 1959 1960 if (*iterator->ptr != DHO_END) 1961 break; 1962 1963 if (iterator->extra_option_locations & 1964 OPTION_OVERLOADED_BOOT_FILE) { 1965 iterator->extra_option_locations &= 1966 ~OPTION_OVERLOADED_BOOT_FILE; 1967 iterator->ptr = iterator->message->bootfile; 1968 iterator->end = iterator->ptr + 1969 sizeof(iterator->message->bootfile); 1970 } else if (iterator->extra_option_locations & 1971 OPTION_OVERLOADED_SERVER_NAME) { 1972 iterator->extra_option_locations &= 1973 ~OPTION_OVERLOADED_SERVER_NAME; 1974 iterator->ptr = iterator->message->servername; 1975 iterator->end = iterator->ptr + 1976 sizeof(iterator->message->servername); 1977 } else 1978 return 0; 1979 } 1980 1981 if (iterator->ptr + 2 > iterator->end) 1982 return 0; 1983 1984 option_code = *iterator->ptr++; 1985 option_len = *iterator->ptr++; 1986 if (iterator->ptr + option_len > iterator->end) 1987 return 0; 1988 1989 if (option_code == DHO_OPTIONSOVERLOADED && option_len > 0 && 1990 !iterator->extra_option_locations_set) { 1991 iterator->extra_option_locations = *iterator->ptr; 1992 iterator->extra_option_locations_set = 1; 1993 } 1994 1995 if (option) 1996 *option = option_code; 1997 if (length) 1998 *length = option_len; 1999 if (value) 2000 *value = iterator->ptr; 2001 2002 iterator->ptr += option_len; 2003 2004 return 1; 2005 } 2006 2007 static void 2008 merge_option_values(const struct dhcp_message *src, 2009 struct dhcp_message *dst, uint8_t *copy_options) 2010 { 2011 uint8_t supplied_options[OPTION_MASK_SIZE]; 2012 struct dhcp_option_iterator dst_iterator; 2013 struct dhcp_option_iterator src_iterator; 2014 uint8_t option; 2015 const uint8_t *option_value; 2016 uint8_t option_length; 2017 uint8_t *out; 2018 const uint8_t *out_end; 2019 int added_options = 0; 2020 2021 /* Traverse the destination message for options already supplied. */ 2022 memset(&supplied_options, 0, sizeof(supplied_options)); 2023 init_option_iterator(dst, &dst_iterator); 2024 while (iterate_next_option(&dst_iterator, &option, NULL, NULL)) { 2025 add_option_mask(supplied_options, option); 2026 } 2027 2028 /* We will start merging options at the end of the last block 2029 * the iterator traversed to. The const cast below is safe since 2030 * this points to data within the (non-const) dst message. */ 2031 out = (uint8_t *) dst_iterator.ptr; 2032 out_end = dst_iterator.end; 2033 2034 init_option_iterator(src, &src_iterator); 2035 while (iterate_next_option(&src_iterator, &option, &option_length, 2036 &option_value)) { 2037 if (has_option_mask(supplied_options, option) || 2038 !has_option_mask(copy_options, option)) 2039 continue; 2040 /* We need space for this option, plus a trailing DHO_END. */ 2041 if (out + option_length + 3 > out_end) { 2042 syslog(LOG_ERR, 2043 "%s: unable to fit option %d (length %d)", 2044 __func__, option, option_length); 2045 continue; 2046 } 2047 *out++ = option; 2048 *out++ = option_length; 2049 memcpy(out, option_value, option_length); 2050 out += option_length; 2051 added_options++; 2052 } 2053 2054 if (added_options) { 2055 *out++ = DHO_END; 2056 syslog(LOG_INFO, "carrying over %d options from original offer", 2057 added_options); 2058 } 2059 } 2060 2061 void 2062 dhcp_bind(struct interface *ifp, struct arp_state *astate) 2063 { 2064 struct dhcp_state *state = D_STATE(ifp); 2065 struct if_options *ifo = ifp->options; 2066 struct dhcp_lease *lease = &state->lease; 2067 uint8_t ipv4ll = 0; 2068 2069 if (state->state == DHS_BOUND) 2070 goto applyaddr; 2071 state->reason = NULL; 2072 free(state->old); 2073 state->old = state->new; 2074 state->new = state->offer; 2075 state->offer = NULL; 2076 get_lease(ifp->ctx, lease, state->new); 2077 if (ifo->options & DHCPCD_STATIC) { 2078 logger(ifp->ctx, LOG_INFO, "%s: using static address %s/%d", 2079 ifp->name, inet_ntoa(lease->addr), 2080 inet_ntocidr(lease->net)); 2081 lease->leasetime = ~0U; 2082 state->reason = "STATIC"; 2083 } else if (state->new->cookie != htonl(MAGIC_COOKIE)) { 2084 logger(ifp->ctx, LOG_INFO, "%s: using IPv4LL address %s", 2085 ifp->name, inet_ntoa(lease->addr)); 2086 lease->leasetime = ~0U; 2087 state->reason = "IPV4LL"; 2088 ipv4ll = 1; 2089 } else if (ifo->options & DHCPCD_INFORM) { 2090 if (ifo->req_addr.s_addr != 0) 2091 lease->addr.s_addr = ifo->req_addr.s_addr; 2092 else 2093 lease->addr.s_addr = state->addr.s_addr; 2094 logger(ifp->ctx, LOG_INFO, "%s: received approval for %s", 2095 ifp->name, inet_ntoa(lease->addr)); 2096 lease->leasetime = ~0U; 2097 state->reason = "INFORM"; 2098 } else { 2099 if (lease->frominfo) 2100 state->reason = "TIMEOUT"; 2101 if (lease->leasetime == ~0U) { 2102 lease->renewaltime = 2103 lease->rebindtime = 2104 lease->leasetime; 2105 logger(ifp->ctx, LOG_INFO, "%s: leased %s for infinity", 2106 ifp->name, inet_ntoa(lease->addr)); 2107 } else { 2108 if (lease->leasetime < DHCP_MIN_LEASE) { 2109 logger(ifp->ctx, LOG_WARNING, 2110 "%s: minimum lease is %d seconds", 2111 ifp->name, DHCP_MIN_LEASE); 2112 lease->leasetime = DHCP_MIN_LEASE; 2113 } 2114 if (lease->rebindtime == 0) 2115 lease->rebindtime = 2116 (uint32_t)(lease->leasetime * T2); 2117 else if (lease->rebindtime >= lease->leasetime) { 2118 lease->rebindtime = 2119 (uint32_t)(lease->leasetime * T2); 2120 logger(ifp->ctx, LOG_WARNING, 2121 "%s: rebind time greater than lease " 2122 "time, forcing to %"PRIu32" seconds", 2123 ifp->name, lease->rebindtime); 2124 } 2125 if (lease->renewaltime == 0) 2126 lease->renewaltime = 2127 (uint32_t)(lease->leasetime * T1); 2128 else if (lease->renewaltime > lease->rebindtime) { 2129 lease->renewaltime = 2130 (uint32_t)(lease->leasetime * T1); 2131 logger(ifp->ctx, LOG_WARNING, 2132 "%s: renewal time greater than rebind " 2133 "time, forcing to %"PRIu32" seconds", 2134 ifp->name, lease->renewaltime); 2135 } 2136 logger(ifp->ctx, 2137 lease->addr.s_addr == state->addr.s_addr && 2138 !(state->added & STATE_FAKE) ? 2139 LOG_DEBUG : LOG_INFO, 2140 "%s: leased %s for %"PRIu32" seconds", ifp->name, 2141 inet_ntoa(lease->addr), lease->leasetime); 2142 } 2143 } 2144 if (ifp->ctx->options & DHCPCD_TEST) { 2145 state->reason = "TEST"; 2146 script_runreason(ifp, state->reason); 2147 eloop_exit(ifp->ctx->eloop, EXIT_SUCCESS); 2148 return; 2149 } 2150 if (state->reason == NULL) { 2151 if (state->old && !(state->added & STATE_FAKE)) { 2152 if (state->old->yiaddr == state->new->yiaddr && 2153 lease->server.s_addr) 2154 state->reason = "RENEW"; 2155 else 2156 state->reason = "REBIND"; 2157 } else if (state->state == DHS_REBOOT) 2158 state->reason = "REBOOT"; 2159 else 2160 state->reason = "BOUND"; 2161 } 2162 2163 if (state->old && state->old->yiaddr == state->new->yiaddr && 2164 (state->state == DHS_REBOOT || state->state == DHS_RENEW || 2165 state->state == DHS_REBIND)) { 2166 /* Some DHCP servers respond to REQUEST with a subset 2167 * of the original requested parameters. If they were not 2168 * supplied in the response to a renewal, we should assume 2169 * that it's reasonable to transfer them forward from the 2170 * original offer. */ 2171 merge_option_values(state->old, state->new, ifo->requestmask); 2172 } 2173 2174 if (lease->leasetime == ~0U) 2175 lease->renewaltime = lease->rebindtime = lease->leasetime; 2176 else { 2177 eloop_timeout_add_sec(ifp->ctx->eloop, 2178 (time_t)lease->renewaltime, dhcp_renew, ifp); 2179 eloop_timeout_add_sec(ifp->ctx->eloop, 2180 (time_t)lease->rebindtime, dhcp_rebind, ifp); 2181 eloop_timeout_add_sec(ifp->ctx->eloop, 2182 (time_t)lease->leasetime, dhcp_expire, ifp); 2183 logger(ifp->ctx, LOG_DEBUG, 2184 "%s: renew in %"PRIu32" seconds, rebind in %"PRIu32 2185 " seconds", 2186 ifp->name, lease->renewaltime, lease->rebindtime); 2187 } 2188 if (!(ifo->options & DHCPCD_STATIC) && 2189 state->new->cookie != htonl(MAGIC_COOKIE)) 2190 state->state = DHS_IPV4LL_BOUND; 2191 else 2192 state->state = DHS_BOUND; 2193 if (!state->lease.frominfo && 2194 !(ifo->options & (DHCPCD_INFORM | DHCPCD_STATIC))) 2195 if (write_lease(ifp, state->new) == -1) 2196 logger(ifp->ctx, LOG_ERR, 2197 "%s: write_lease: %m", __func__); 2198 2199 applyaddr: 2200 ipv4_applyaddr(ifp); 2201 if (ifo->options & DHCPCD_ARP && 2202 !(ifp->ctx->options & DHCPCD_FORKED)) 2203 { 2204 #ifdef IN_IFF_TENTATIVE 2205 if (astate) 2206 arp_free_but(astate); 2207 else if (!ipv4ll) 2208 arp_close(ifp); 2209 #else 2210 if (state->added) { 2211 if (astate == NULL) { 2212 astate = arp_new(ifp, &state->addr); 2213 astate->announced_cb = 2214 dhcp_arp_announced; 2215 } 2216 if (astate) { 2217 arp_announce(astate); 2218 if (!ipv4ll) 2219 arp_free_but(astate); 2220 } 2221 } else if (!ipv4ll) 2222 arp_close(ifp); 2223 #endif 2224 } 2225 } 2226 2227 static void 2228 dhcp_timeout(void *arg) 2229 { 2230 struct interface *ifp = arg; 2231 struct dhcp_state *state = D_STATE(ifp); 2232 2233 dhcp_bind(ifp, NULL); 2234 state->interval = 0; 2235 dhcp_discover(ifp); 2236 } 2237 2238 struct dhcp_message * 2239 dhcp_message_new(const struct in_addr *addr, const struct in_addr *mask) 2240 { 2241 struct dhcp_message *dhcp; 2242 uint8_t *p; 2243 2244 dhcp = calloc(1, sizeof(*dhcp)); 2245 if (dhcp == NULL) 2246 return NULL; 2247 dhcp->yiaddr = addr->s_addr; 2248 p = dhcp->options; 2249 if (mask && mask->s_addr != INADDR_ANY) { 2250 *p++ = DHO_SUBNETMASK; 2251 *p++ = sizeof(mask->s_addr); 2252 memcpy(p, &mask->s_addr, sizeof(mask->s_addr)); 2253 p+= sizeof(mask->s_addr); 2254 } 2255 *p++ = DHO_END; 2256 return dhcp; 2257 } 2258 2259 static void 2260 dhcp_static(struct interface *ifp) 2261 { 2262 struct if_options *ifo; 2263 struct dhcp_state *state; 2264 2265 state = D_STATE(ifp); 2266 ifo = ifp->options; 2267 if (ifo->req_addr.s_addr == INADDR_ANY) { 2268 logger(ifp->ctx, LOG_INFO, 2269 "%s: waiting for 3rd party to " 2270 "configure IP address", 2271 ifp->name); 2272 state->reason = "3RDPARTY"; 2273 script_runreason(ifp, state->reason); 2274 return; 2275 } 2276 state->offer = dhcp_message_new(&ifo->req_addr, &ifo->req_mask); 2277 if (state->offer) { 2278 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp); 2279 dhcp_bind(ifp, NULL); 2280 } 2281 } 2282 2283 void 2284 dhcp_inform(struct interface *ifp) 2285 { 2286 struct dhcp_state *state; 2287 struct if_options *ifo; 2288 struct ipv4_addr *ap; 2289 2290 state = D_STATE(ifp); 2291 ifo = ifp->options; 2292 logger(ifp->ctx, LOG_INFO, "%s: informing peers of local address", 2293 ifp->name); 2294 if (ifp->ctx->options & DHCPCD_TEST) { 2295 state->addr.s_addr = ifo->req_addr.s_addr; 2296 state->net.s_addr = ifo->req_mask.s_addr; 2297 } else { 2298 if (ifo->req_addr.s_addr == INADDR_ANY) { 2299 state = D_STATE(ifp); 2300 ap = ipv4_iffindaddr(ifp, NULL, NULL); 2301 if (ap == NULL) { 2302 logger(ifp->ctx, LOG_INFO, 2303 "%s: waiting for 3rd party to " 2304 "configure IP address", 2305 ifp->name); 2306 state->reason = "3RDPARTY"; 2307 script_runreason(ifp, state->reason); 2308 return; 2309 } 2310 state->offer = 2311 dhcp_message_new(&ap->addr, &ap->net); 2312 } else 2313 state->offer = 2314 dhcp_message_new(&ifo->req_addr, &ifo->req_mask); 2315 if (state->offer) { 2316 ifo->options |= DHCPCD_STATIC; 2317 dhcp_bind(ifp, NULL); 2318 ifo->options &= ~DHCPCD_STATIC; 2319 } 2320 } 2321 2322 rpc_signal_status("Inform"); 2323 state->state = DHS_INFORM; 2324 state->xid = dhcp_xid(ifp); 2325 send_inform(ifp); 2326 } 2327 2328 void 2329 dhcp_reboot_newopts(struct interface *ifp, unsigned long long oldopts) 2330 { 2331 struct if_options *ifo; 2332 struct dhcp_state *state = D_STATE(ifp); 2333 2334 if (state == NULL) 2335 return; 2336 ifo = ifp->options; 2337 if ((ifo->options & (DHCPCD_INFORM | DHCPCD_STATIC) && 2338 state->addr.s_addr != ifo->req_addr.s_addr) || 2339 (oldopts & (DHCPCD_INFORM | DHCPCD_STATIC) && 2340 !(ifo->options & (DHCPCD_INFORM | DHCPCD_STATIC)))) 2341 { 2342 dhcp_drop(ifp, "EXPIRE"); 2343 } 2344 } 2345 2346 static void start_unicast_arp(struct interface *ifp); 2347 2348 static void 2349 dhcp_reboot(struct interface *ifp) 2350 { 2351 struct if_options *ifo; 2352 struct dhcp_state *state = D_STATE(ifp); 2353 2354 if (state == NULL) 2355 return; 2356 rpc_signal_status("Reboot"); 2357 ifo = ifp->options; 2358 state->state = DHS_REBOOT; 2359 state->interval = 0; 2360 2361 if (ifo->options & DHCPCD_LINK && ifp->carrier == LINK_DOWN) { 2362 logger(ifp->ctx, LOG_INFO, 2363 "%s: waiting for carrier", ifp->name); 2364 return; 2365 } 2366 if (ifo->options & DHCPCD_STATIC) { 2367 dhcp_static(ifp); 2368 return; 2369 } 2370 if (ifo->options & DHCPCD_UNICAST_ARP) { 2371 start_unicast_arp(ifp); 2372 } 2373 if (ifo->options & DHCPCD_INFORM) { 2374 logger(ifp->ctx, LOG_INFO, "%s: informing address of %s", 2375 ifp->name, inet_ntoa(state->lease.addr)); 2376 dhcp_inform(ifp); 2377 return; 2378 } 2379 if (ifo->reboot == 0 || state->offer == NULL) { 2380 dhcp_discover(ifp); 2381 return; 2382 } 2383 if (state->offer->cookie == 0) 2384 return; 2385 2386 logger(ifp->ctx, LOG_INFO, "%s: rebinding lease of %s", 2387 ifp->name, inet_ntoa(state->lease.addr)); 2388 state->xid = dhcp_xid(ifp); 2389 state->lease.server.s_addr = 0; 2390 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp); 2391 2392 /* Need to add this before dhcp_expire and friends. */ 2393 if (!ifo->fallback && ifo->options & DHCPCD_IPV4LL && 2394 !IN_LINKLOCAL(htonl(state->addr.s_addr))) 2395 eloop_timeout_add_sec(ifp->ctx->eloop, 2396 ifo->reboot, ipv4ll_start, ifp); 2397 2398 if (ifo->options & DHCPCD_LASTLEASE && state->lease.frominfo) 2399 eloop_timeout_add_sec(ifp->ctx->eloop, 2400 ifo->reboot, dhcp_timeout, ifp); 2401 else if (!(ifo->options & DHCPCD_INFORM)) 2402 eloop_timeout_add_sec(ifp->ctx->eloop, 2403 ifo->reboot, dhcp_expire, ifp); 2404 2405 /* Don't bother ARP checking as the server could NAK us first. 2406 * Don't call dhcp_request as that would change the state */ 2407 send_request(ifp); 2408 } 2409 2410 void 2411 dhcp_drop(struct interface *ifp, const char *reason) 2412 { 2413 struct dhcp_state *state; 2414 #ifdef RELEASE_SLOW 2415 struct timespec ts; 2416 #endif 2417 2418 state = D_STATE(ifp); 2419 /* dhcp_start may just have been called and we don't yet have a state 2420 * but we do have a timeout, so punt it. */ 2421 if (state == NULL) { 2422 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp); 2423 return; 2424 } 2425 /* Don't reset DHCP state if we have an IPv4LL address and link is up, 2426 * unless the interface is departing. */ 2427 if (state->state != DHS_IPV4LL_BOUND || 2428 ifp->carrier != LINK_UP || 2429 ifp->options->options & DHCPCD_DEPARTED) 2430 { 2431 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp); 2432 dhcp_auth_reset(&state->auth); 2433 dhcp_close(ifp); 2434 } 2435 2436 if (ifp->options->options & DHCPCD_RELEASE || 2437 strcmp(reason, "RELEASE") == 0) { 2438 unlink(state->leasefile); 2439 if (ifp->carrier != LINK_DOWN && 2440 state->new != NULL && 2441 state->new->cookie == htonl(MAGIC_COOKIE)) 2442 { 2443 logger(ifp->ctx, LOG_INFO, "%s: releasing lease of %s", 2444 ifp->name, inet_ntoa(state->lease.addr)); 2445 state->xid = dhcp_xid(ifp); 2446 send_message(ifp, DHCP_RELEASE, NULL); 2447 #ifdef RELEASE_SLOW 2448 /* Give the packet a chance to go */ 2449 ts.tv_sec = RELEASE_DELAY_S; 2450 ts.tv_nsec = RELEASE_DELAY_NS; 2451 nanosleep(&ts, NULL); 2452 #endif 2453 } 2454 } 2455 2456 free(state->old); 2457 state->old = state->new; 2458 state->new = NULL; 2459 state->reason = reason; 2460 ipv4_applyaddr(ifp); 2461 free(state->old); 2462 state->old = NULL; 2463 state->lease.addr.s_addr = 0; 2464 ifp->options->options &= ~(DHCPCD_CSR_WARNED | 2465 DHCPCD_ROUTER_HOST_ROUTE_WARNED); 2466 } 2467 2468 static void 2469 log_dhcp1(int lvl, const char *msg, 2470 const struct interface *ifp, const struct dhcp_message *dhcp, 2471 const struct in_addr *from, int ad) 2472 { 2473 const char *tfrom; 2474 char *a, sname[sizeof(dhcp->servername) * 4]; 2475 struct in_addr addr; 2476 int r; 2477 2478 if (strcmp(msg, "NAK:") == 0) { 2479 a = get_option_string(ifp->ctx, dhcp, DHO_MESSAGE); 2480 if (a) { 2481 char *tmp; 2482 size_t al, tmpl; 2483 2484 al = strlen(a); 2485 tmpl = (al * 4) + 1; 2486 tmp = malloc(tmpl); 2487 if (tmp == NULL) { 2488 logger(ifp->ctx, LOG_ERR, "%s: %m", __func__); 2489 free(a); 2490 return; 2491 } 2492 print_string(tmp, tmpl, STRING, (uint8_t *)a, al); 2493 free(a); 2494 a = tmp; 2495 } 2496 } else if (ad && dhcp->yiaddr != 0) { 2497 addr.s_addr = dhcp->yiaddr; 2498 a = strdup(inet_ntoa(addr)); 2499 if (a == NULL) { 2500 logger(ifp->ctx, LOG_ERR, "%s: %m", __func__); 2501 return; 2502 } 2503 } else 2504 a = NULL; 2505 2506 tfrom = "from"; 2507 r = get_option_addr(ifp->ctx, &addr, dhcp, DHO_SERVERID); 2508 if (dhcp->servername[0] && r == 0) { 2509 print_string(sname, sizeof(sname), STRING, 2510 dhcp->servername, strlen((const char *)dhcp->servername)); 2511 if (a == NULL) 2512 logger(ifp->ctx, lvl, "%s: %s %s %s `%s'", 2513 ifp->name, msg, tfrom, inet_ntoa(addr), sname); 2514 else 2515 logger(ifp->ctx, lvl, "%s: %s %s %s %s `%s'", 2516 ifp->name, msg, a, tfrom, inet_ntoa(addr), sname); 2517 } else { 2518 if (r != 0) { 2519 tfrom = "via"; 2520 addr = *from; 2521 } 2522 if (a == NULL) 2523 logger(ifp->ctx, lvl, "%s: %s %s %s", 2524 ifp->name, msg, tfrom, inet_ntoa(addr)); 2525 else 2526 logger(ifp->ctx, lvl, "%s: %s %s %s %s", 2527 ifp->name, msg, a, tfrom, inet_ntoa(addr)); 2528 } 2529 free(a); 2530 } 2531 2532 static void 2533 log_dhcp(int lvl, const char *msg, 2534 const struct interface *ifp, const struct dhcp_message *dhcp, 2535 const struct in_addr *from) 2536 { 2537 2538 log_dhcp1(lvl, msg, ifp, dhcp, from, 1); 2539 } 2540 2541 static int 2542 blacklisted_ip(const struct if_options *ifo, in_addr_t addr) 2543 { 2544 size_t i; 2545 2546 for (i = 0; i < ifo->blacklist_len; i += 2) 2547 if (ifo->blacklist[i] == (addr & ifo->blacklist[i + 1])) 2548 return 1; 2549 return 0; 2550 } 2551 2552 static int 2553 whitelisted_ip(const struct if_options *ifo, in_addr_t addr) 2554 { 2555 size_t i; 2556 2557 if (ifo->whitelist_len == 0) 2558 return -1; 2559 for (i = 0; i < ifo->whitelist_len; i += 2) 2560 if (ifo->whitelist[i] == (addr & ifo->whitelist[i + 1])) 2561 return 1; 2562 return 0; 2563 } 2564 2565 static void 2566 save_gateway_addr(struct interface *ifp, const uint8_t *gw_hwaddr) 2567 { 2568 struct dhcp_state *state = D_STATE(ifp); 2569 memcpy(state->server_info.gw_hwaddr, gw_hwaddr, ifp->hwlen); 2570 state->server_info.gw_hwlen = ifp->hwlen; 2571 } 2572 2573 static void 2574 dhcp_probe_gw_timeout(struct arp_state *astate) 2575 { 2576 struct dhcp_state *state = D_STATE(astate->iface); 2577 2578 /* Ignore unicast ARP failures. */ 2579 if (astate->dest_hwlen) 2580 return; 2581 2582 /* Probegw failure, allow ourselves to fail only once this way */ 2583 logger(astate->iface->ctx, LOG_ERR, 2584 "%s: Probe gateway %s timed out ", 2585 astate->iface->name, inet_ntoa(astate->addr)); 2586 astate->iface->options->options &= ~DHCPCD_ARPGW; 2587 2588 unlink(state->leasefile); 2589 if (!state->lease.frominfo) 2590 dhcp_decline(astate->iface); 2591 #ifdef IN_IFF_DUPLICATED 2592 ia = ipv4_iffindaddr(astate->iface, &astate->addr, NULL); 2593 if (ia) 2594 ipv4_deladdr(astate->iface, &ia->addr, &ia->net); 2595 #endif 2596 eloop_timeout_delete(astate->iface->ctx->eloop, NULL, 2597 astate->iface); 2598 eloop_timeout_add_sec(astate->iface->ctx->eloop, 2599 DHCP_RAND_MAX, dhcp_discover, astate->iface); 2600 } 2601 2602 static void 2603 dhcp_probe_gw_response(struct arp_state *astate, const struct arp_msg *amsg) 2604 { 2605 /* Verify this is a response for the gateway probe. */ 2606 if (astate->src_addr.s_addr != 0 && 2607 amsg && 2608 amsg->tip.s_addr == astate->src_addr.s_addr && 2609 amsg->sip.s_addr == astate->addr.s_addr) { 2610 if (astate->dest_hwlen) { 2611 /* Response to unicast ARP. */ 2612 rpc_notify_unicast_arp(astate->iface); 2613 } else { 2614 /* Response to arpgw request. */ 2615 save_gateway_addr(astate->iface, amsg->sha); 2616 2617 dhcp_close(astate->iface); 2618 eloop_timeout_delete(astate->iface->ctx->eloop, 2619 NULL, astate->iface); 2620 #ifdef IN_IFF_TENTATIVE 2621 ipv4_finaliseaddr(astate->iface); 2622 #else 2623 dhcp_bind(astate->iface, NULL); 2624 #endif 2625 } 2626 arp_close(astate->iface); 2627 } 2628 } 2629 2630 static int 2631 dhcp_probe_gw(struct interface *ifp) 2632 { 2633 struct dhcp_state *state = D_STATE(ifp); 2634 struct arp_state *astate; 2635 struct in_addr gateway_addr; 2636 2637 if (get_option_addr(ifp->ctx, &gateway_addr, 2638 state->offer, DHO_ROUTER) == 0) { 2639 astate = arp_new(ifp, &gateway_addr); 2640 if (astate) { 2641 astate->src_addr.s_addr = state->offer->yiaddr; 2642 astate->probed_cb = dhcp_probe_gw_timeout; 2643 astate->conflicted_cb = dhcp_probe_gw_response; 2644 arp_probe(astate); 2645 return 1; 2646 } 2647 } 2648 return 0; 2649 } 2650 2651 static void 2652 start_unicast_arp(struct interface *ifp) 2653 { 2654 struct dhcp_state *state = D_STATE(ifp); 2655 struct in_addr gwa; 2656 struct in_addr src_addr; 2657 struct arp_state *astate; 2658 2659 if (!state->offer) 2660 return; 2661 2662 if (!state->lease.frominfo) 2663 return; 2664 2665 if (state->server_info.gw_hwlen != ifp->hwlen) 2666 return; 2667 2668 if (get_option_addr(ifp->ctx, &gwa, state->offer, DHO_ROUTER)) 2669 return; 2670 2671 astate = arp_new(ifp, &gwa); 2672 if (!astate) 2673 return; 2674 if (state->offer->yiaddr) 2675 astate->src_addr.s_addr = state->offer->yiaddr; 2676 else 2677 astate->src_addr.s_addr = state->offer->ciaddr; 2678 astate->probed_cb = dhcp_probe_gw_timeout; 2679 astate->conflicted_cb = dhcp_probe_gw_response; 2680 astate->dest_hwlen = state->server_info.gw_hwlen; 2681 memcpy(astate->dest_hwaddr, state->server_info.gw_hwaddr, 2682 state->server_info.gw_hwlen); 2683 2684 arp_probe(astate); 2685 2686 /* Invalidate our gateway address until the next successful PROBEGW. */ 2687 state->server_info.gw_hwlen = 0; 2688 } 2689 2690 static void 2691 dhcp_arp_probed(struct arp_state *astate) 2692 { 2693 struct dhcp_state *state; 2694 struct if_options *ifo; 2695 2696 /* We didn't find a profile for this 2697 * address or hwaddr, so move to the next 2698 * arping profile */ 2699 state = D_STATE(astate->iface); 2700 ifo = astate->iface->options; 2701 if (state->arping_index < ifo->arping_len) { 2702 if (++state->arping_index < ifo->arping_len) { 2703 astate->addr.s_addr = 2704 ifo->arping[state->arping_index - 1]; 2705 arp_probe(astate); 2706 } 2707 dhcpcd_startinterface(astate->iface); 2708 return; 2709 } 2710 2711 /* Probe the gateway specified in the lease offer. */ 2712 if ((ifo->options & DHCPCD_ARPGW) && (dhcp_probe_gw(astate->iface))) { 2713 return; 2714 } 2715 2716 dhcp_close(astate->iface); 2717 eloop_timeout_delete(astate->iface->ctx->eloop, NULL, astate->iface); 2718 #ifdef IN_IFF_TENTATIVE 2719 ipv4_finaliseaddr(astate->iface); 2720 arp_close(astate->iface); 2721 #else 2722 dhcp_bind(astate->iface, astate); 2723 #endif 2724 } 2725 2726 static void 2727 dhcp_arp_conflicted(struct arp_state *astate, const struct arp_msg *amsg) 2728 { 2729 struct dhcp_state *state; 2730 struct if_options *ifo; 2731 2732 state = D_STATE(astate->iface); 2733 ifo = astate->iface->options; 2734 if (state->arping_index && 2735 state->arping_index <= ifo->arping_len && 2736 amsg && 2737 (amsg->sip.s_addr == ifo->arping[state->arping_index - 1] || 2738 (amsg->sip.s_addr == 0 && 2739 amsg->tip.s_addr == ifo->arping[state->arping_index - 1]))) 2740 { 2741 char buf[HWADDR_LEN * 3]; 2742 2743 astate->failed.s_addr = ifo->arping[state->arping_index - 1]; 2744 arp_report_conflicted(astate, amsg); 2745 hwaddr_ntoa(amsg->sha, astate->iface->hwlen, buf, sizeof(buf)); 2746 if (dhcpcd_selectprofile(astate->iface, buf) == -1 && 2747 dhcpcd_selectprofile(astate->iface, 2748 inet_ntoa(astate->failed)) == -1) 2749 { 2750 /* We didn't find a profile for this 2751 * address or hwaddr, so move to the next 2752 * arping profile */ 2753 dhcp_arp_probed(astate); 2754 return; 2755 } 2756 dhcp_close(astate->iface); 2757 arp_close(astate->iface); 2758 eloop_timeout_delete(astate->iface->ctx->eloop, NULL, 2759 astate->iface); 2760 dhcpcd_startinterface(astate->iface); 2761 } 2762 2763 /* RFC 2131 3.1.5, Client-server interaction 2764 * NULL amsg means IN_IFF_DUPLICATED */ 2765 if (amsg == NULL || (state->offer && 2766 (amsg->sip.s_addr == state->offer->yiaddr || 2767 (amsg->sip.s_addr == 0 && 2768 amsg->tip.s_addr == state->offer->yiaddr)))) 2769 { 2770 #ifdef IN_IFF_DUPLICATED 2771 struct ipv4_addr *ia; 2772 #endif 2773 2774 if (amsg) { 2775 astate->failed.s_addr = state->offer->yiaddr; 2776 state->failed.s_addr = state->offer->yiaddr; 2777 } else { 2778 astate->failed = astate->addr; 2779 state->failed = astate->addr; 2780 } 2781 2782 arp_report_conflicted(astate, amsg); 2783 unlink(state->leasefile); 2784 if (!state->lease.frominfo) 2785 dhcp_decline(astate->iface); 2786 #ifdef IN_IFF_DUPLICATED 2787 ia = ipv4_iffindaddr(astate->iface, &astate->addr, NULL); 2788 if (ia) 2789 ipv4_deladdr(astate->iface, &ia->addr, &ia->net); 2790 #endif 2791 arp_close(astate->iface); 2792 eloop_timeout_delete(astate->iface->ctx->eloop, NULL, 2793 astate->iface); 2794 eloop_timeout_add_sec(astate->iface->ctx->eloop, 2795 DHCP_RAND_MAX, dhcp_discover, astate->iface); 2796 } 2797 } 2798 2799 static void 2800 handle_nak(void *arg) 2801 { 2802 struct interface *ifp = arg; 2803 struct dhcp_state *state = D_STATE(ifp); 2804 2805 logger(ifp->ctx, LOG_INFO, "%s: Handling deferred NAK", ifp->name); 2806 if (!(ifp->ctx->options & DHCPCD_TEST)) { 2807 dhcp_drop(ifp, "NAK"); 2808 unlink(state->leasefile); 2809 } 2810 2811 /* If we constantly get NAKS then we should slowly back off */ 2812 eloop_timeout_add_sec(ifp->ctx->eloop, 2813 state->nakoff, dhcp_discover, ifp); 2814 if (state->nakoff == 0) 2815 state->nakoff = 1; 2816 else { 2817 state->nakoff *= 2; 2818 if (state->nakoff > NAKOFF_MAX) 2819 state->nakoff = NAKOFF_MAX; 2820 } 2821 } 2822 2823 static void 2824 dhcp_handledhcp(struct interface *ifp, struct dhcp_message **dhcpp, 2825 const struct in_addr *from) 2826 { 2827 struct dhcp_state *state = D_STATE(ifp); 2828 struct if_options *ifo = ifp->options; 2829 struct dhcp_message *dhcp = *dhcpp; 2830 struct dhcp_lease *lease = &state->lease; 2831 uint8_t type, tmp; 2832 const uint8_t *auth; 2833 struct in_addr addr; 2834 unsigned int i; 2835 size_t auth_len; 2836 char *msg; 2837 struct arp_state *astate; 2838 struct ipv4_addr *ia; 2839 2840 /* We may have found a BOOTP server */ 2841 if (get_option_uint8(ifp->ctx, &type, dhcp, DHO_MESSAGETYPE) == -1) 2842 type = 0; 2843 else if (ifo->options & DHCPCD_BOOTP) { 2844 logger(ifp->ctx, LOG_DEBUG, 2845 "%s: ignoring DHCP reply (excpecting BOOTP)", 2846 ifp->name); 2847 return; 2848 } 2849 2850 logger(ifp->ctx, LOG_INFO, "%s: received %s with xid 0x%x", 2851 ifp->name, get_dhcp_op(type), state->xid); 2852 2853 /* Authenticate the message */ 2854 auth = get_option(ifp->ctx, dhcp, DHO_AUTHENTICATION, &auth_len); 2855 if (auth) { 2856 if (dhcp_auth_validate(&state->auth, &ifo->auth, 2857 (uint8_t *)*dhcpp, sizeof(**dhcpp), 4, type, 2858 auth, auth_len) == NULL) 2859 { 2860 logger(ifp->ctx, LOG_DEBUG, 2861 "%s: dhcp_auth_validate: %m", ifp->name); 2862 log_dhcp1(LOG_ERR, "authentication failed", 2863 ifp, dhcp, from, 0); 2864 return; 2865 } 2866 if (state->auth.token) 2867 logger(ifp->ctx, LOG_DEBUG, 2868 "%s: validated using 0x%08" PRIu32, 2869 ifp->name, state->auth.token->secretid); 2870 else 2871 logger(ifp->ctx, LOG_DEBUG, 2872 "%s: accepted reconfigure key", ifp->name); 2873 } else if (ifo->auth.options & DHCPCD_AUTH_REQUIRE) { 2874 log_dhcp1(LOG_ERR, "no authentication", ifp, dhcp, from, 0); 2875 return; 2876 } else if (ifo->auth.options & DHCPCD_AUTH_SEND) 2877 log_dhcp1(LOG_WARNING, "no authentication", 2878 ifp, dhcp, from, 0); 2879 2880 /* RFC 3203 */ 2881 if (type == DHCP_FORCERENEW) { 2882 if (from->s_addr == INADDR_ANY || 2883 from->s_addr == INADDR_BROADCAST) 2884 { 2885 log_dhcp(LOG_ERR, "discarding Force Renew", 2886 ifp, dhcp, from); 2887 return; 2888 } 2889 if (auth == NULL) { 2890 log_dhcp(LOG_ERR, "unauthenticated Force Renew", 2891 ifp, dhcp, from); 2892 return; 2893 } 2894 if (state->state != DHS_BOUND && state->state != DHS_INFORM) { 2895 log_dhcp(LOG_DEBUG, "not bound, ignoring Force Renew", 2896 ifp, dhcp, from); 2897 return; 2898 } 2899 log_dhcp(LOG_ERR, "Force Renew from", ifp, dhcp, from); 2900 /* The rebind and expire timings are still the same, we just 2901 * enter the renew state early */ 2902 if (state->state == DHS_BOUND) { 2903 eloop_timeout_delete(ifp->ctx->eloop, 2904 dhcp_renew, ifp); 2905 dhcp_renew(ifp); 2906 } else { 2907 eloop_timeout_delete(ifp->ctx->eloop, 2908 send_inform, ifp); 2909 dhcp_inform(ifp); 2910 } 2911 return; 2912 } 2913 2914 if (state->state == DHS_BOUND) { 2915 /* Before we supported FORCERENEW we closed off the raw 2916 * port so we effectively ignored all messages. 2917 * As such we'll not log by default here. */ 2918 //log_dhcp(LOG_DEBUG, "bound, ignoring", iface, dhcp, from); 2919 return; 2920 } 2921 2922 /* Ensure it's the right transaction */ 2923 if (state->xid != ntohl(dhcp->xid)) { 2924 logger(ifp->ctx, LOG_DEBUG, 2925 "%s: wrong xid 0x%x (expecting 0x%x) from %s", 2926 ifp->name, ntohl(dhcp->xid), state->xid, 2927 inet_ntoa(*from)); 2928 return; 2929 } 2930 /* reset the message counter */ 2931 state->interval = 0; 2932 2933 /* Ensure that no reject options are present */ 2934 for (i = 1; i < 255; i++) { 2935 if (has_option_mask(ifo->rejectmask, i) && 2936 get_option_uint8(ifp->ctx, &tmp, dhcp, (uint8_t)i) == 0) 2937 { 2938 log_dhcp(LOG_WARNING, "reject DHCP", ifp, dhcp, from); 2939 return; 2940 } 2941 } 2942 2943 if (type == DHCP_NAK) { 2944 if ((msg = get_option_string(ifp->ctx, dhcp, DHO_MESSAGE))) { 2945 logger(ifp->ctx, LOG_WARNING, "%s: message: %s", 2946 ifp->name, msg); 2947 free(msg); 2948 } 2949 if (state->state == DHS_INFORM) /* INFORM should not be NAKed */ 2950 return; 2951 2952 log_dhcp(LOG_WARNING, "NAK (deferred):", ifp, dhcp, from); 2953 rpc_signal_status("NakDefer"); 2954 if (state->nak_receive_count == 0) 2955 eloop_timeout_add_sec(ifp->ctx->eloop, 2956 DHCP_BASE, handle_nak, ifp); 2957 state->nak_receive_count++; 2958 return; 2959 } 2960 2961 /* Ensure that all required options are present */ 2962 for (i = 1; i < 255; i++) { 2963 if (has_option_mask(ifo->requiremask, i) && 2964 get_option_uint8(ifp->ctx, &tmp, dhcp, (uint8_t)i) != 0) 2965 { 2966 /* If we are BOOTP, then ignore the need for serverid. 2967 * To ignore BOOTP, require dhcp_message_type. 2968 * However, nothing really stops BOOTP from providing 2969 * DHCP style options as well so the above isn't 2970 * always true. */ 2971 if (type == 0 && i == DHO_SERVERID) 2972 continue; 2973 log_dhcp(LOG_WARNING, "reject DHCP", ifp, dhcp, from); 2974 return; 2975 } 2976 } 2977 2978 /* DHCP Auto-Configure, RFC 2563 */ 2979 if (type == DHCP_OFFER && dhcp->yiaddr == 0) { 2980 log_dhcp(LOG_WARNING, "no address given", ifp, dhcp, from); 2981 if ((msg = get_option_string(ifp->ctx, dhcp, DHO_MESSAGE))) { 2982 logger(ifp->ctx, LOG_WARNING, 2983 "%s: message: %s", ifp->name, msg); 2984 free(msg); 2985 } 2986 if ((state->state == DHS_DISCOVER || 2987 state->state == DHS_IPV4LL_BOUND) && 2988 get_option_uint8(ifp->ctx, &tmp, dhcp, 2989 DHO_AUTOCONFIGURE) == 0) 2990 { 2991 switch (tmp) { 2992 case 0: 2993 log_dhcp(LOG_WARNING, "IPv4LL disabled from", 2994 ifp, dhcp, from); 2995 dhcp_drop(ifp, "EXPIRE"); 2996 arp_close(ifp); 2997 eloop_timeout_delete(ifp->ctx->eloop, 2998 NULL, ifp); 2999 eloop_timeout_add_sec(ifp->ctx->eloop, 3000 DHCP_MAX, dhcp_discover, 3001 ifp); 3002 break; 3003 case 1: 3004 log_dhcp(LOG_WARNING, "IPv4LL enabled from", 3005 ifp, dhcp, from); 3006 eloop_timeout_delete(ifp->ctx->eloop, 3007 NULL, ifp); 3008 if (IN_LINKLOCAL(htonl(state->addr.s_addr))) 3009 eloop_timeout_add_sec(ifp->ctx->eloop, 3010 DHCP_MAX, dhcp_discover, ifp); 3011 else 3012 ipv4ll_start(ifp); 3013 break; 3014 default: 3015 logger(ifp->ctx, LOG_ERR, 3016 "%s: unknown auto configuration option %d", 3017 ifp->name, tmp); 3018 break; 3019 } 3020 } 3021 return; 3022 } 3023 3024 /* Ensure that the address offered is valid */ 3025 if ((type == 0 || type == DHCP_OFFER || type == DHCP_ACK) && 3026 (dhcp->ciaddr == INADDR_ANY || dhcp->ciaddr == INADDR_BROADCAST) && 3027 (dhcp->yiaddr == INADDR_ANY || dhcp->yiaddr == INADDR_BROADCAST)) 3028 { 3029 rpc_signal_status("IgnoreInvalidOffer"); 3030 log_dhcp(LOG_WARNING, "reject invalid address", 3031 ifp, dhcp, from); 3032 return; 3033 } 3034 3035 #ifdef IN_IFF_DUPLICATED 3036 ia = ipv4_iffindaddr(ifp, &lease->addr, NULL); 3037 if (ia && ia->addr_flags & IN_IFF_DUPLICATED) { 3038 log_dhcp(LOG_WARNING, "declined duplicate address", 3039 ifp, dhcp, from); 3040 if (type) 3041 dhcp_decline(ifp); 3042 ipv4_deladdr(ifp, &ia->addr, &ia->net); 3043 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp); 3044 eloop_timeout_add_sec(ifp->ctx->eloop, 3045 DHCP_RAND_MAX, dhcp_discover, ifp); 3046 return; 3047 } 3048 #endif 3049 3050 if ((type == 0 || type == DHCP_OFFER) && 3051 (state->state == DHS_DISCOVER || state->state == DHS_IPV4LL_BOUND)) 3052 { 3053 if (dhcp->yiaddr == state->failed.s_addr && 3054 state->failed_address_offer_count == 0) { 3055 log_dhcp(LOG_WARNING, 3056 "reject previously declined address", 3057 ifp, dhcp, from); 3058 rpc_signal_status("IgnoreFailedOffer"); 3059 state->failed_address_offer_count++; 3060 return; 3061 } 3062 lease->frominfo = 0; 3063 lease->addr.s_addr = dhcp->yiaddr; 3064 lease->cookie = dhcp->cookie; 3065 if (type == 0 || 3066 get_option_addr(ifp->ctx, 3067 &lease->server, dhcp, DHO_SERVERID) != 0) 3068 lease->server.s_addr = INADDR_ANY; 3069 log_dhcp(LOG_INFO, "offered", ifp, dhcp, from); 3070 free(state->offer); 3071 state->offer = dhcp; 3072 *dhcpp = NULL; 3073 if (ifp->ctx->options & DHCPCD_TEST) { 3074 free(state->old); 3075 state->old = state->new; 3076 state->new = state->offer; 3077 state->offer = NULL; 3078 state->reason = "TEST"; 3079 script_runreason(ifp, state->reason); 3080 eloop_exit(ifp->ctx->eloop, EXIT_SUCCESS); 3081 return; 3082 } 3083 eloop_timeout_delete(ifp->ctx->eloop, send_discover, ifp); 3084 eloop_timeout_delete(ifp->ctx->eloop, handle_nak, ifp); 3085 /* We don't request BOOTP addresses */ 3086 if (type) { 3087 /* We used to ARP check here, but that seems to be in 3088 * violation of RFC2131 where it only describes 3089 * DECLINE after REQUEST. 3090 * It also seems that some MS DHCP servers actually 3091 * ignore DECLINE if no REQUEST, ie we decline a 3092 * DISCOVER. */ 3093 dhcp_request(ifp); 3094 return; 3095 } 3096 } 3097 3098 if (type) { 3099 if (type == DHCP_OFFER) { 3100 log_dhcp(LOG_WARNING, "ignoring offer of", 3101 ifp, dhcp, from); 3102 rpc_signal_status("IgnoreAdditionalOffer"); 3103 return; 3104 } 3105 3106 /* We should only be dealing with acks */ 3107 if (type != DHCP_ACK) { 3108 log_dhcp(LOG_ERR, "not ACK or OFFER", 3109 ifp, dhcp, from); 3110 rpc_signal_status("IgnoreNonOffer"); 3111 return; 3112 } 3113 3114 if (!(ifo->options & DHCPCD_INFORM)) 3115 log_dhcp(LOG_INFO, "acknowledged", ifp, dhcp, from); 3116 else 3117 ifo->options &= ~DHCPCD_STATIC; 3118 } 3119 3120 3121 /* No NAK, so reset the backoff 3122 * We don't reset on an OFFER message because the server could 3123 * potentially NAK the REQUEST. */ 3124 state->nakoff = 0; 3125 3126 /* BOOTP could have already assigned this above, so check we still 3127 * have a pointer. */ 3128 if (*dhcpp) { 3129 free(state->offer); 3130 state->offer = dhcp; 3131 *dhcpp = NULL; 3132 } 3133 3134 lease->frominfo = 0; 3135 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp); 3136 astate = NULL; 3137 3138 #ifdef IN_IFF_TENTATIVE 3139 addr.s_addr = state->offer->yiaddr; 3140 astate = arp_new(ifp, &addr); 3141 if (astate) { 3142 astate->probed_cb = dhcp_arp_probed; 3143 astate->conflicted_cb = dhcp_arp_conflicted; 3144 /* No need to start the probe as we'll 3145 * listen to the kernel stating DAD or not and 3146 * that action look look for our ARP state for 3147 * what to do. */ 3148 } 3149 #else 3150 if ((ifo->options & DHCPCD_ARP || state->nak_receive_count > 0 || 3151 dhcp->yiaddr == state->failed.s_addr) 3152 && state->addr.s_addr != state->offer->yiaddr) 3153 { 3154 addr.s_addr = state->offer->yiaddr; 3155 /* If the interface already has the address configured 3156 * then we can't ARP for duplicate detection. */ 3157 ia = ipv4_findaddr(ifp->ctx, &addr); 3158 if (ia == NULL) { 3159 astate = arp_new(ifp, &addr); 3160 if (astate) { 3161 astate->probed_cb = dhcp_arp_probed; 3162 astate->conflicted_cb = dhcp_arp_conflicted; 3163 arp_probe(astate); 3164 rpc_signal_status("ArpSelf"); 3165 } 3166 return; 3167 } 3168 } 3169 #endif 3170 3171 if ((ifo->options & DHCPCD_ARPGW) && (dhcp_probe_gw(ifp))) { 3172 rpc_signal_status("ArpGateway"); 3173 return; 3174 } 3175 3176 dhcp_bind(ifp, astate); 3177 } 3178 3179 static size_t 3180 get_udp_data(const uint8_t **data, const uint8_t *udp) 3181 { 3182 struct udp_dhcp_packet p; 3183 3184 memcpy(&p, udp, sizeof(p)); 3185 *data = udp + offsetof(struct udp_dhcp_packet, dhcp); 3186 return ntohs(p.ip.ip_len) - sizeof(p.ip) - sizeof(p.udp); 3187 } 3188 3189 static int 3190 valid_udp_packet(const uint8_t *data, size_t data_len, struct in_addr *from, 3191 int noudpcsum) 3192 { 3193 struct udp_dhcp_packet p; 3194 uint16_t bytes, udpsum; 3195 3196 if (data_len < sizeof(p.ip)) { 3197 syslog(LOG_WARNING, "packet short than an ip header " 3198 "(len=%zd)", data_len); 3199 if (from) 3200 from->s_addr = INADDR_ANY; 3201 errno = EINVAL; 3202 return -1; 3203 } 3204 memcpy(&p, data, MIN(data_len, sizeof(p))); 3205 if (from) 3206 from->s_addr = p.ip.ip_src.s_addr; 3207 if (data_len > sizeof(p)) { 3208 syslog(LOG_WARNING, "packet too long (%zd bytes)", data_len); 3209 errno = EINVAL; 3210 return -1; 3211 } 3212 if (checksum(&p.ip, sizeof(p.ip)) != 0) { 3213 syslog(LOG_WARNING, "packet failed ip header checksum"); 3214 errno = EINVAL; 3215 return -1; 3216 } 3217 3218 bytes = ntohs(p.ip.ip_len); 3219 if (data_len < bytes) { 3220 syslog(LOG_WARNING, "packet appears truncated " 3221 "(len=%zd, ip_len=%zd)", data_len, bytes); 3222 errno = EINVAL; 3223 return -1; 3224 } 3225 3226 if (noudpcsum == 0) { 3227 udpsum = p.udp.uh_sum; 3228 p.udp.uh_sum = 0; 3229 p.ip.ip_hl = 0; 3230 p.ip.ip_v = 0; 3231 p.ip.ip_tos = 0; 3232 p.ip.ip_len = p.udp.uh_ulen; 3233 p.ip.ip_id = 0; 3234 p.ip.ip_off = 0; 3235 p.ip.ip_ttl = 0; 3236 p.ip.ip_sum = 0; 3237 if (udpsum && checksum(&p, bytes) != udpsum) { 3238 syslog(LOG_WARNING, "packet failed udp checksum"); 3239 errno = EINVAL; 3240 return -1; 3241 } 3242 } 3243 3244 return 0; 3245 } 3246 3247 static void 3248 dhcp_handlepacket(void *arg) 3249 { 3250 struct interface *ifp = arg; 3251 struct dhcp_message *dhcp = NULL; 3252 const uint8_t *pp; 3253 size_t bytes; 3254 struct in_addr from; 3255 int i, flags; 3256 const struct dhcp_state *state = D_CSTATE(ifp); 3257 3258 /* Need this API due to BPF */ 3259 flags = 0; 3260 while (!(flags & RAW_EOF)) { 3261 bytes = (size_t)if_readrawpacket(ifp, ETHERTYPE_IP, 3262 ifp->ctx->packet, udp_dhcp_len, &flags); 3263 if ((ssize_t)bytes == -1) { 3264 logger(ifp->ctx, LOG_ERR, 3265 "%s: dhcp if_readrawpacket: %m", ifp->name); 3266 dhcp_close(ifp); 3267 arp_close(ifp); 3268 break; 3269 } 3270 if (valid_udp_packet(ifp->ctx->packet, bytes, 3271 &from, flags & RAW_PARTIALCSUM) == -1) 3272 { 3273 logger(ifp->ctx, LOG_ERR, 3274 "%s: invalid UDP packet from %s", 3275 ifp->name, inet_ntoa(from)); 3276 continue; 3277 } 3278 i = whitelisted_ip(ifp->options, from.s_addr); 3279 if (i == 0) { 3280 logger(ifp->ctx, LOG_WARNING, 3281 "%s: non whitelisted DHCP packet from %s", 3282 ifp->name, inet_ntoa(from)); 3283 continue; 3284 } else if (i != 1 && 3285 blacklisted_ip(ifp->options, from.s_addr) == 1) 3286 { 3287 logger(ifp->ctx, LOG_WARNING, 3288 "%s: blacklisted DHCP packet from %s", 3289 ifp->name, inet_ntoa(from)); 3290 continue; 3291 } 3292 if (ifp->flags & IFF_POINTOPOINT && 3293 state->dst.s_addr != from.s_addr) 3294 { 3295 logger(ifp->ctx, LOG_WARNING, 3296 "%s: server %s is not destination", 3297 ifp->name, inet_ntoa(from)); 3298 } 3299 bytes = get_udp_data(&pp, ifp->ctx->packet); 3300 if (bytes > sizeof(*dhcp)) { 3301 logger(ifp->ctx, LOG_ERR, 3302 "%s: packet greater than DHCP size from %s", 3303 ifp->name, inet_ntoa(from)); 3304 continue; 3305 } 3306 if (dhcp == NULL) { 3307 dhcp = calloc(1, sizeof(*dhcp)); 3308 if (dhcp == NULL) { 3309 logger(ifp->ctx, LOG_ERR, 3310 "%s: calloc: %m", __func__); 3311 break; 3312 } 3313 } 3314 memcpy(dhcp, pp, bytes); 3315 if (dhcp->cookie != htonl(MAGIC_COOKIE)) { 3316 logger(ifp->ctx, LOG_DEBUG, "%s: bogus cookie from %s", 3317 ifp->name, inet_ntoa(from)); 3318 continue; 3319 } 3320 /* Ensure packet is for us */ 3321 if (ifp->hwlen <= sizeof(dhcp->chaddr) && 3322 memcmp(dhcp->chaddr, ifp->hwaddr, ifp->hwlen)) 3323 { 3324 char buf[sizeof(dhcp->chaddr) * 3]; 3325 3326 logger(ifp->ctx, LOG_DEBUG, 3327 "%s: xid 0x%x is for hwaddr %s", 3328 ifp->name, ntohl(dhcp->xid), 3329 hwaddr_ntoa(dhcp->chaddr, sizeof(dhcp->chaddr), 3330 buf, sizeof(buf))); 3331 continue; 3332 } 3333 dhcp_handledhcp(ifp, &dhcp, &from); 3334 if (state->raw_fd == -1) 3335 break; 3336 } 3337 free(dhcp); 3338 } 3339 3340 static void 3341 dhcp_handleudp(void *arg) 3342 { 3343 struct dhcpcd_ctx *ctx; 3344 uint8_t buffer[sizeof(struct dhcp_message)]; 3345 3346 ctx = arg; 3347 3348 /* Just read what's in the UDP fd and discard it as we always read 3349 * from the raw fd */ 3350 if (read(ctx->udp_fd, buffer, sizeof(buffer)) == -1) { 3351 logger(ctx, LOG_ERR, "%s: %m", __func__); 3352 eloop_event_delete(ctx->eloop, ctx->udp_fd, 0); 3353 close(ctx->udp_fd); 3354 ctx->udp_fd = -1; 3355 } 3356 } 3357 3358 static int 3359 dhcp_open(struct interface *ifp) 3360 { 3361 struct dhcp_state *state; 3362 3363 if (ifp->ctx->packet == NULL) { 3364 ifp->ctx->packet = malloc(udp_dhcp_len); 3365 if (ifp->ctx->packet == NULL) { 3366 logger(ifp->ctx, LOG_ERR, "%s: %m", __func__); 3367 return -1; 3368 } 3369 } 3370 3371 state = D_STATE(ifp); 3372 if (state->raw_fd == -1) { 3373 state->raw_fd = if_openrawsocket(ifp, ETHERTYPE_IP); 3374 if (state->raw_fd == -1) { 3375 if (errno == ENOENT) { 3376 logger(ifp->ctx, LOG_ERR, 3377 "%s not found", if_pfname); 3378 /* May as well disable IPv4 entirely at 3379 * this point as we really need it. */ 3380 ifp->options->options &= ~DHCPCD_IPV4; 3381 } else 3382 logger(ifp->ctx, LOG_ERR, "%s: %s: %m", 3383 __func__, ifp->name); 3384 return -1; 3385 } 3386 eloop_event_add(ifp->ctx->eloop, 3387 state->raw_fd, dhcp_handlepacket, ifp, NULL, NULL); 3388 } 3389 return 0; 3390 } 3391 3392 int 3393 dhcp_dump(struct interface *ifp) 3394 { 3395 struct dhcp_state *state; 3396 3397 ifp->if_data[IF_DATA_DHCP] = state = calloc(1, sizeof(*state)); 3398 if (state == NULL) 3399 goto eexit; 3400 state->raw_fd = state->arp_fd = -1; 3401 TAILQ_INIT(&state->arp_states); 3402 dhcp_set_leasefile(state->leasefile, sizeof(state->leasefile), 3403 AF_INET, ifp, ""); 3404 state->new = read_lease(ifp); 3405 if (state->new == NULL) { 3406 logger(ifp->ctx, LOG_ERR, "%s: %s: %m", 3407 *ifp->name ? ifp->name : state->leasefile, __func__); 3408 return -1; 3409 } 3410 state->reason = "DUMP"; 3411 return script_runreason(ifp, state->reason); 3412 3413 eexit: 3414 logger(ifp->ctx, LOG_ERR, "%s: %m", __func__); 3415 return -1; 3416 } 3417 3418 void 3419 dhcp_free(struct interface *ifp) 3420 { 3421 struct dhcp_state *state = D_STATE(ifp); 3422 struct dhcpcd_ctx *ctx; 3423 3424 dhcp_close(ifp); 3425 arp_close(ifp); 3426 if (state) { 3427 free(state->old); 3428 free(state->new); 3429 free(state->offer); 3430 free(state->buffer); 3431 free(state->clientid); 3432 free(state); 3433 ifp->if_data[IF_DATA_DHCP] = NULL; 3434 } 3435 3436 ctx = ifp->ctx; 3437 /* If we don't have any more DHCP enabled interfaces, 3438 * close the global socket and release resources */ 3439 if (ctx->ifaces) { 3440 TAILQ_FOREACH(ifp, ctx->ifaces, next) { 3441 if (D_STATE(ifp)) 3442 break; 3443 } 3444 } 3445 if (ifp == NULL) { 3446 if (ctx->udp_fd != -1) { 3447 eloop_event_delete(ctx->eloop, ctx->udp_fd, 0); 3448 close(ctx->udp_fd); 3449 ctx->udp_fd = -1; 3450 } 3451 3452 free(ctx->packet); 3453 free(ctx->opt_buffer); 3454 ctx->packet = NULL; 3455 ctx->opt_buffer = NULL; 3456 } 3457 } 3458 3459 static int 3460 dhcp_init(struct interface *ifp) 3461 { 3462 struct dhcp_state *state; 3463 const struct if_options *ifo; 3464 uint8_t len; 3465 char buf[(sizeof(ifo->clientid) - 1) * 3]; 3466 3467 state = D_STATE(ifp); 3468 if (state == NULL) { 3469 ifp->if_data[IF_DATA_DHCP] = calloc(1, sizeof(*state)); 3470 state = D_STATE(ifp); 3471 if (state == NULL) 3472 return -1; 3473 /* 0 is a valid fd, so init to -1 */ 3474 state->raw_fd = state->arp_fd = -1; 3475 TAILQ_INIT(&state->arp_states); 3476 3477 /* Now is a good time to find IPv4 routes */ 3478 if_initrt(ifp); 3479 } 3480 3481 state->state = DHS_INIT; 3482 state->reason = "PREINIT"; 3483 state->nakoff = 0; 3484 dhcp_set_leasefile(state->leasefile, sizeof(state->leasefile), 3485 AF_INET, ifp, ""); 3486 3487 ifo = ifp->options; 3488 /* We need to drop the leasefile so that dhcp_start 3489 * doesn't load it. */ 3490 if (ifo->options & DHCPCD_REQUEST) 3491 unlink(state->leasefile); 3492 3493 free(state->clientid); 3494 state->clientid = NULL; 3495 3496 if (*ifo->clientid) { 3497 state->clientid = malloc((size_t)(ifo->clientid[0] + 1)); 3498 if (state->clientid == NULL) 3499 goto eexit; 3500 memcpy(state->clientid, ifo->clientid, 3501 (size_t)(ifo->clientid[0]) + 1); 3502 } else if (ifo->options & DHCPCD_CLIENTID) { 3503 if (ifo->options & DHCPCD_DUID) { 3504 state->clientid = malloc(ifp->ctx->duid_len + 6); 3505 if (state->clientid == NULL) 3506 goto eexit; 3507 state->clientid[0] =(uint8_t)(ifp->ctx->duid_len + 5); 3508 state->clientid[1] = 255; /* RFC 4361 */ 3509 memcpy(state->clientid + 2, ifo->iaid, 4); 3510 memcpy(state->clientid + 6, ifp->ctx->duid, 3511 ifp->ctx->duid_len); 3512 } else { 3513 len = (uint8_t)(ifp->hwlen + 1); 3514 state->clientid = malloc((size_t)len + 1); 3515 if (state->clientid == NULL) 3516 goto eexit; 3517 state->clientid[0] = len; 3518 state->clientid[1] = (uint8_t)ifp->family; 3519 memcpy(state->clientid + 2, ifp->hwaddr, 3520 ifp->hwlen); 3521 } 3522 } 3523 3524 if (ifo->options & DHCPCD_DUID) 3525 /* Don't bother logging as DUID and IAID are reported 3526 * at device start. */ 3527 return 0; 3528 3529 if (ifo->options & DHCPCD_CLIENTID) 3530 logger(ifp->ctx, LOG_DEBUG, "%s: using ClientID %s", ifp->name, 3531 hwaddr_ntoa(state->clientid + 1, state->clientid[0], 3532 buf, sizeof(buf))); 3533 else if (ifp->hwlen) 3534 logger(ifp->ctx, LOG_DEBUG, "%s: using hwaddr %s", ifp->name, 3535 hwaddr_ntoa(ifp->hwaddr, ifp->hwlen, buf, sizeof(buf))); 3536 return 0; 3537 3538 eexit: 3539 logger(ifp->ctx, LOG_ERR, "%s: error making ClientID: %m", __func__); 3540 return -1; 3541 } 3542 3543 static void 3544 dhcp_start1(void *arg) 3545 { 3546 struct interface *ifp = arg; 3547 struct if_options *ifo = ifp->options; 3548 struct dhcp_state *state; 3549 struct stat st; 3550 uint32_t l; 3551 int nolease; 3552 3553 if (!(ifo->options & DHCPCD_IPV4)) 3554 return; 3555 3556 /* Listen on *.*.*.*:bootpc so that the kernel never sends an 3557 * ICMP port unreachable message back to the DHCP server */ 3558 if (ifp->ctx->udp_fd == -1) { 3559 ifp->ctx->udp_fd = dhcp_openudp(NULL); 3560 if (ifp->ctx->udp_fd == -1) { 3561 /* Don't log an error if some other process 3562 * is handling this. */ 3563 if (errno != EADDRINUSE) 3564 logger(ifp->ctx, LOG_ERR, 3565 "%s: dhcp_openudp: %m", __func__); 3566 } else 3567 eloop_event_add(ifp->ctx->eloop, 3568 ifp->ctx->udp_fd, dhcp_handleudp, 3569 ifp->ctx, NULL, NULL); 3570 } 3571 3572 if (dhcp_init(ifp) == -1) { 3573 logger(ifp->ctx, LOG_ERR, "%s: dhcp_init: %m", ifp->name); 3574 return; 3575 } 3576 3577 state = D_STATE(ifp); 3578 state->start_uptime = uptime(); 3579 free(state->offer); 3580 state->offer = NULL; 3581 3582 if (state->arping_index < ifo->arping_len) { 3583 struct arp_state *astate; 3584 3585 astate = arp_new(ifp, NULL); 3586 if (astate) { 3587 astate->probed_cb = dhcp_arp_probed; 3588 astate->conflicted_cb = dhcp_arp_conflicted; 3589 dhcp_arp_probed(astate); 3590 } 3591 return; 3592 } 3593 3594 if (ifo->options & DHCPCD_STATIC) { 3595 dhcp_static(ifp); 3596 return; 3597 } 3598 3599 if (ifo->options & DHCPCD_DHCP && dhcp_open(ifp) == -1) 3600 return; 3601 3602 if (ifo->options & DHCPCD_INFORM) { 3603 dhcp_inform(ifp); 3604 return; 3605 } 3606 if (ifp->hwlen == 0 && ifo->clientid[0] == '\0') { 3607 logger(ifp->ctx, LOG_WARNING, 3608 "%s: needs a clientid to configure", ifp->name); 3609 dhcp_drop(ifp, "FAIL"); 3610 eloop_timeout_delete(ifp->ctx->eloop, NULL, ifp); 3611 return; 3612 } 3613 /* We don't want to read the old lease if we NAK an old test */ 3614 nolease = state->offer && ifp->ctx->options & DHCPCD_TEST; 3615 if (!nolease) { 3616 state->offer = read_lease(ifp); 3617 /* Check the saved lease matches the type we want */ 3618 if (state->offer) { 3619 #ifdef IN_IFF_DUPLICATED 3620 struct in_addr addr; 3621 struct ipv4_addr *ia; 3622 3623 addr.s_addr = state->offer->yiaddr; 3624 ia = ipv4_iffindaddr(ifp, &addr, NULL); 3625 #endif 3626 3627 if ((IS_BOOTP(ifp, state->offer) && 3628 !(ifo->options & DHCPCD_BOOTP)) || 3629 #ifdef IN_IFF_DUPLICATED 3630 (ia && ia->addr_flags & IN_IFF_DUPLICATED) || 3631 #endif 3632 (!IS_BOOTP(ifp, state->offer) && 3633 ifo->options & DHCPCD_BOOTP)) 3634 { 3635 free(state->offer); 3636 state->offer = NULL; 3637 } 3638 } 3639 } 3640 if (state->offer) { 3641 get_lease(ifp->ctx, &state->lease, state->offer); 3642 state->lease.frominfo = 1; 3643 if (state->new == NULL && 3644 ipv4_iffindaddr(ifp, &state->lease.addr, &state->lease.net)) 3645 { 3646 /* We still have the IP address from the last lease. 3647 * Fake add the address and routes from it so the lease 3648 * can be cleaned up. */ 3649 state->new = malloc(sizeof(*state->new)); 3650 if (state->new) { 3651 memcpy(state->new, state->offer, 3652 sizeof(*state->new)); 3653 state->addr = state->lease.addr; 3654 state->net = state->lease.net; 3655 state->added |= STATE_ADDED | STATE_FAKE; 3656 ipv4_buildroutes(ifp->ctx); 3657 } else 3658 logger(ifp->ctx, LOG_ERR, "%s: %m", __func__); 3659 } 3660 if (state->offer->cookie == 0) { 3661 if (state->offer->yiaddr == state->addr.s_addr) { 3662 free(state->offer); 3663 state->offer = NULL; 3664 } 3665 } else if (state->lease.leasetime != ~0U && 3666 stat(state->leasefile, &st) == 0) 3667 { 3668 time_t now; 3669 3670 /* Offset lease times and check expiry */ 3671 now = time(NULL); 3672 if (now == -1 || 3673 (time_t)state->lease.leasetime < now - st.st_mtime) 3674 { 3675 logger(ifp->ctx, LOG_DEBUG, 3676 "%s: discarding expired lease", ifp->name); 3677 free(state->offer); 3678 state->offer = NULL; 3679 state->lease.addr.s_addr = 0; 3680 /* Technically we should discard the lease 3681 * as it's expired, just as DHCPv6 addresses 3682 * would be by the kernel. 3683 * However, this may violate POLA so 3684 * we currently leave it be. 3685 * If we get a totally different lease from 3686 * the DHCP server we'll drop it anyway, as 3687 * we will on any other event which would 3688 * trigger a lease drop. 3689 * This should only happen if dhcpcd stops 3690 * running and the lease expires before 3691 * dhcpcd starts again. */ 3692 #if 0 3693 if (state->new) 3694 dhcp_drop(ifp, "EXPIRE"); 3695 #endif 3696 } else { 3697 l = (uint32_t)(now - st.st_mtime); 3698 state->lease.leasetime -= l; 3699 state->lease.renewaltime -= l; 3700 state->lease.rebindtime -= l; 3701 } 3702 } 3703 } 3704 3705 if (!(ifo->options & DHCPCD_DHCP)) { 3706 if (ifo->options & DHCPCD_IPV4LL) { 3707 if (state->offer && state->offer->cookie != 0) { 3708 free(state->offer); 3709 state->offer = NULL; 3710 } 3711 ipv4ll_start(ifp); 3712 } 3713 return; 3714 } 3715 3716 if (state->offer == NULL || state->offer->cookie == 0) 3717 dhcp_discover(ifp); 3718 else 3719 dhcp_reboot(ifp); 3720 } 3721 3722 void 3723 dhcp_start(struct interface *ifp) 3724 { 3725 struct timespec tv; 3726 3727 if (!(ifp->options->options & DHCPCD_IPV4)) 3728 return; 3729 3730 /* No point in delaying a static configuration */ 3731 tv.tv_sec = DHCP_MIN_DELAY; 3732 tv.tv_nsec = (suseconds_t)arc4random_uniform( 3733 (DHCP_MAX_DELAY - DHCP_MIN_DELAY) * NSEC_PER_SEC); 3734 timespecnorm(&tv); 3735 logger(ifp->ctx, LOG_DEBUG, 3736 "%s: delaying IPv4 for %0.1f seconds", 3737 ifp->name, timespec_to_double(&tv)); 3738 3739 eloop_timeout_add_tv(ifp->ctx->eloop, &tv, dhcp_start1, ifp); 3740 } 3741 3742 void 3743 dhcp_handleifa(int cmd, struct interface *ifp, 3744 const struct in_addr *addr, 3745 const struct in_addr *net, 3746 const struct in_addr *dst, 3747 __unused int flags) 3748 { 3749 struct dhcp_state *state; 3750 struct if_options *ifo; 3751 uint8_t i; 3752 3753 state = D_STATE(ifp); 3754 if (state == NULL) 3755 return; 3756 3757 if (cmd == RTM_DELADDR) { 3758 if (state->addr.s_addr == addr->s_addr && 3759 state->net.s_addr == net->s_addr) 3760 { 3761 logger(ifp->ctx, LOG_INFO, 3762 "%s: removing IP address %s/%d", 3763 ifp->name, inet_ntoa(state->addr), 3764 inet_ntocidr(state->net)); 3765 dhcp_drop(ifp, "EXPIRE"); 3766 } 3767 return; 3768 } 3769 3770 if (cmd != RTM_NEWADDR) 3771 return; 3772 3773 ifo = ifp->options; 3774 if (ifo->options & DHCPCD_INFORM) { 3775 if (state->state != DHS_INFORM) 3776 dhcp_inform(ifp); 3777 return; 3778 } 3779 3780 if (!(ifo->options & DHCPCD_STATIC)) 3781 return; 3782 if (ifo->req_addr.s_addr != INADDR_ANY) 3783 return; 3784 3785 free(state->old); 3786 state->old = state->new; 3787 state->new = dhcp_message_new(addr, net); 3788 if (state->new == NULL) 3789 return; 3790 state->dst.s_addr = dst ? dst->s_addr : INADDR_ANY; 3791 if (dst) { 3792 for (i = 1; i < 255; i++) 3793 if (i != DHO_ROUTER && has_option_mask(ifo->dstmask,i)) 3794 dhcp_message_add_addr(state->new, i, *dst); 3795 } 3796 state->reason = "STATIC"; 3797 ipv4_buildroutes(ifp->ctx); 3798 script_runreason(ifp, state->reason); 3799 if (ifo->options & DHCPCD_INFORM) { 3800 state->state = DHS_INFORM; 3801 state->xid = dhcp_xid(ifp); 3802 state->lease.server.s_addr = dst ? dst->s_addr : INADDR_ANY; 3803 state->addr = *addr; 3804 state->net = *net; 3805 dhcp_inform(ifp); 3806 } 3807 } 3808