1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 * 21 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 22 * Use is subject to license terms. 23 */ 24 25 #include "defs.h" 26 #include "tables.h" 27 #include <fcntl.h> 28 #include <sys/un.h> 29 30 static void initlog(void); 31 static void run_timeouts(void); 32 33 static void advertise(struct sockaddr_in6 *sin6, struct phyint *pi, 34 boolean_t no_prefixes); 35 static void solicit(struct sockaddr_in6 *sin6, struct phyint *pi); 36 static void initifs(boolean_t first); 37 static void check_if_removed(struct phyint *pi); 38 static void loopback_ra_enqueue(struct phyint *pi, 39 struct nd_router_advert *ra, int len); 40 static void loopback_ra_dequeue(void); 41 static void check_daemonize(void); 42 43 struct in6_addr all_nodes_mcast = { { 0xff, 0x2, 0x0, 0x0, 44 0x0, 0x0, 0x0, 0x0, 45 0x0, 0x0, 0x0, 0x0, 46 0x0, 0x0, 0x0, 0x1 } }; 47 48 struct in6_addr all_routers_mcast = { { 0xff, 0x2, 0x0, 0x0, 49 0x0, 0x0, 0x0, 0x0, 50 0x0, 0x0, 0x0, 0x0, 51 0x0, 0x0, 0x0, 0x2 } }; 52 53 static struct sockaddr_in6 v6allnodes = { AF_INET6, 0, 0, 54 { 0xff, 0x2, 0x0, 0x0, 55 0x0, 0x0, 0x0, 0x0, 56 0x0, 0x0, 0x0, 0x0, 57 0x0, 0x0, 0x0, 0x1 } }; 58 59 static struct sockaddr_in6 v6allrouters = { AF_INET6, 0, 0, 60 { 0xff, 0x2, 0x0, 0x0, 61 0x0, 0x0, 0x0, 0x0, 62 0x0, 0x0, 0x0, 0x0, 63 0x0, 0x0, 0x0, 0x2 } }; 64 65 static char **argv0; /* Saved for re-exec on SIGHUP */ 66 67 static uint64_t packet[(IP_MAXPACKET + 1)/8]; 68 69 static int show_ifs = 0; 70 static boolean_t already_daemonized = _B_FALSE; 71 int debug = 0; 72 int no_loopback = 0; /* Do not send RA packets to ourselves */ 73 74 /* 75 * Size of routing socket message used by in.ndpd which includes the header, 76 * space for the RTA_DST, RTA_GATEWAY and RTA_NETMASK (each a sockaddr_in6) 77 * plus space for the RTA_IFP (a sockaddr_dl). 78 */ 79 #define NDP_RTM_MSGLEN sizeof (struct rt_msghdr) + \ 80 sizeof (struct sockaddr_in6) + \ 81 sizeof (struct sockaddr_in6) + \ 82 sizeof (struct sockaddr_in6) + \ 83 sizeof (struct sockaddr_dl) 84 85 /* 86 * These are referenced externally in tables.c in order to fill in the 87 * dynamic portions of the routing socket message and then to send the message 88 * itself. 89 */ 90 int rtsock = -1; /* Routing socket */ 91 struct rt_msghdr *rt_msg; /* Routing socket message */ 92 struct sockaddr_in6 *rta_gateway; /* RTA_GATEWAY sockaddr */ 93 struct sockaddr_dl *rta_ifp; /* RTA_IFP sockaddr */ 94 int mibsock = -1; /* mib request socket */ 95 96 /* 97 * Return the current time in milliseconds truncated to 98 * fit in an integer. 99 */ 100 uint_t 101 getcurrenttime(void) 102 { 103 struct timeval tp; 104 105 if (gettimeofday(&tp, NULL) < 0) { 106 logperror("getcurrenttime: gettimeofday failed"); 107 exit(1); 108 } 109 return (tp.tv_sec * 1000 + tp.tv_usec / 1000); 110 } 111 112 /* 113 * Output a preformated packet from the packet[] buffer. 114 */ 115 static void 116 sendpacket(struct sockaddr_in6 *sin6, int sock, int size, int flags) 117 { 118 int cc; 119 char abuf[INET6_ADDRSTRLEN]; 120 121 cc = sendto(sock, (char *)packet, size, flags, 122 (struct sockaddr *)sin6, sizeof (*sin6)); 123 if (cc < 0 || cc != size) { 124 if (cc < 0) { 125 logperror("sendpacket: sendto"); 126 } 127 logmsg(LOG_ERR, "sendpacket: wrote %s %d chars, ret=%d\n", 128 inet_ntop(sin6->sin6_family, 129 (void *)&sin6->sin6_addr, 130 abuf, sizeof (abuf)), 131 size, cc); 132 } 133 } 134 135 /* 136 * If possible, place an ND_OPT_SOURCE_LINKADDR option at `optp'. 137 * Return the number of bytes placed in the option. 138 */ 139 static uint_t 140 add_opt_lla(struct phyint *pi, struct nd_opt_lla *optp) 141 { 142 uint_t optlen; 143 uint_t hwaddrlen; 144 struct lifreq lifr; 145 146 /* If this phyint doesn't have a link-layer address, bail */ 147 if (phyint_get_lla(pi, &lifr) == -1) 148 return (0); 149 150 hwaddrlen = lifr.lifr_nd.lnr_hdw_len; 151 /* roundup to multiple of 8 and make padding zero */ 152 optlen = ((sizeof (struct nd_opt_hdr) + hwaddrlen + 7) / 8) * 8; 153 bzero(optp, optlen); 154 optp->nd_opt_lla_type = ND_OPT_SOURCE_LINKADDR; 155 optp->nd_opt_lla_len = optlen / 8; 156 bcopy(lifr.lifr_nd.lnr_hdw_addr, optp->nd_opt_lla_hdw_addr, hwaddrlen); 157 158 return (optlen); 159 } 160 161 /* Send a Router Solicitation */ 162 static void 163 solicit(struct sockaddr_in6 *sin6, struct phyint *pi) 164 { 165 int packetlen = 0; 166 struct nd_router_solicit *rs = (struct nd_router_solicit *)packet; 167 char *pptr = (char *)packet; 168 169 rs->nd_rs_type = ND_ROUTER_SOLICIT; 170 rs->nd_rs_code = 0; 171 rs->nd_rs_cksum = htons(0); 172 rs->nd_rs_reserved = htonl(0); 173 174 packetlen += sizeof (*rs); 175 pptr += sizeof (*rs); 176 177 /* add options */ 178 packetlen += add_opt_lla(pi, (struct nd_opt_lla *)pptr); 179 180 if (debug & D_PKTOUT) { 181 print_route_sol("Sending solicitation to ", pi, rs, packetlen, 182 sin6); 183 } 184 sendpacket(sin6, pi->pi_sock, packetlen, 0); 185 } 186 187 /* 188 * Send a (set of) Router Advertisements and feed them back to ourselves 189 * for processing. Unless no_prefixes is set all prefixes are included. 190 * If there are too many prefix options to fit in one packet multiple 191 * packets will be sent - each containing a subset of the prefix options. 192 */ 193 static void 194 advertise(struct sockaddr_in6 *sin6, struct phyint *pi, boolean_t no_prefixes) 195 { 196 struct nd_opt_prefix_info *po; 197 char *pptr = (char *)packet; 198 struct nd_router_advert *ra; 199 struct adv_prefix *adv_pr; 200 int packetlen = 0; 201 202 ra = (struct nd_router_advert *)pptr; 203 ra->nd_ra_type = ND_ROUTER_ADVERT; 204 ra->nd_ra_code = 0; 205 ra->nd_ra_cksum = htons(0); 206 ra->nd_ra_curhoplimit = pi->pi_AdvCurHopLimit; 207 ra->nd_ra_flags_reserved = 0; 208 if (pi->pi_AdvManagedFlag) 209 ra->nd_ra_flags_reserved |= ND_RA_FLAG_MANAGED; 210 if (pi->pi_AdvOtherConfigFlag) 211 ra->nd_ra_flags_reserved |= ND_RA_FLAG_OTHER; 212 213 if (pi->pi_adv_state == FINAL_ADV) 214 ra->nd_ra_router_lifetime = htons(0); 215 else 216 ra->nd_ra_router_lifetime = htons(pi->pi_AdvDefaultLifetime); 217 ra->nd_ra_reachable = htonl(pi->pi_AdvReachableTime); 218 ra->nd_ra_retransmit = htonl(pi->pi_AdvRetransTimer); 219 220 packetlen = sizeof (*ra); 221 pptr += sizeof (*ra); 222 223 if (pi->pi_adv_state == FINAL_ADV) { 224 if (debug & D_PKTOUT) { 225 print_route_adv("Sending advert (FINAL) to ", pi, 226 ra, packetlen, sin6); 227 } 228 sendpacket(sin6, pi->pi_sock, packetlen, 0); 229 /* Feed packet back in for router operation */ 230 loopback_ra_enqueue(pi, ra, packetlen); 231 return; 232 } 233 234 /* add options */ 235 packetlen += add_opt_lla(pi, (struct nd_opt_lla *)pptr); 236 pptr = (char *)packet + packetlen; 237 238 if (pi->pi_AdvLinkMTU != 0) { 239 struct nd_opt_mtu *mo = (struct nd_opt_mtu *)pptr; 240 241 mo->nd_opt_mtu_type = ND_OPT_MTU; 242 mo->nd_opt_mtu_len = sizeof (struct nd_opt_mtu) / 8; 243 mo->nd_opt_mtu_reserved = 0; 244 mo->nd_opt_mtu_mtu = htonl(pi->pi_AdvLinkMTU); 245 246 packetlen += sizeof (struct nd_opt_mtu); 247 pptr += sizeof (struct nd_opt_mtu); 248 } 249 250 if (no_prefixes) { 251 if (debug & D_PKTOUT) { 252 print_route_adv("Sending advert to ", pi, 253 ra, packetlen, sin6); 254 } 255 sendpacket(sin6, pi->pi_sock, packetlen, 0); 256 /* Feed packet back in for router operation */ 257 loopback_ra_enqueue(pi, ra, packetlen); 258 return; 259 } 260 261 po = (struct nd_opt_prefix_info *)pptr; 262 for (adv_pr = pi->pi_adv_prefix_list; adv_pr != NULL; 263 adv_pr = adv_pr->adv_pr_next) { 264 if (!adv_pr->adv_pr_AdvOnLinkFlag && 265 !adv_pr->adv_pr_AdvAutonomousFlag) { 266 continue; 267 } 268 269 /* 270 * If the prefix doesn't fit in packet send 271 * what we have so far and start with new packet. 272 */ 273 if (packetlen + sizeof (*po) > 274 pi->pi_LinkMTU - sizeof (struct ip6_hdr)) { 275 if (debug & D_PKTOUT) { 276 print_route_adv("Sending advert " 277 "(FRAG) to ", 278 pi, ra, packetlen, sin6); 279 } 280 sendpacket(sin6, pi->pi_sock, packetlen, 0); 281 /* Feed packet back in for router operation */ 282 loopback_ra_enqueue(pi, ra, packetlen); 283 packetlen = sizeof (*ra); 284 pptr = (char *)packet + sizeof (*ra); 285 po = (struct nd_opt_prefix_info *)pptr; 286 } 287 po->nd_opt_pi_type = ND_OPT_PREFIX_INFORMATION; 288 po->nd_opt_pi_len = sizeof (*po)/8; 289 po->nd_opt_pi_flags_reserved = 0; 290 if (adv_pr->adv_pr_AdvOnLinkFlag) { 291 po->nd_opt_pi_flags_reserved |= 292 ND_OPT_PI_FLAG_ONLINK; 293 } 294 if (adv_pr->adv_pr_AdvAutonomousFlag) { 295 po->nd_opt_pi_flags_reserved |= 296 ND_OPT_PI_FLAG_AUTO; 297 } 298 po->nd_opt_pi_prefix_len = adv_pr->adv_pr_prefix_len; 299 /* 300 * If both Adv*Expiration and Adv*Lifetime are 301 * set we prefer the former and make the lifetime 302 * decrement in real time. 303 */ 304 if (adv_pr->adv_pr_AdvValidRealTime) { 305 po->nd_opt_pi_valid_time = 306 htonl(adv_pr->adv_pr_AdvValidExpiration); 307 } else { 308 po->nd_opt_pi_valid_time = 309 htonl(adv_pr->adv_pr_AdvValidLifetime); 310 } 311 if (adv_pr->adv_pr_AdvPreferredRealTime) { 312 po->nd_opt_pi_preferred_time = 313 htonl(adv_pr->adv_pr_AdvPreferredExpiration); 314 } else { 315 po->nd_opt_pi_preferred_time = 316 htonl(adv_pr->adv_pr_AdvPreferredLifetime); 317 } 318 po->nd_opt_pi_reserved2 = htonl(0); 319 po->nd_opt_pi_prefix = adv_pr->adv_pr_prefix; 320 321 po++; 322 packetlen += sizeof (*po); 323 } 324 if (debug & D_PKTOUT) { 325 print_route_adv("Sending advert to ", pi, 326 ra, packetlen, sin6); 327 } 328 sendpacket(sin6, pi->pi_sock, packetlen, 0); 329 /* Feed packet back in for router operation */ 330 loopback_ra_enqueue(pi, ra, packetlen); 331 } 332 333 /* Poll support */ 334 static int pollfd_num = 0; /* Allocated and initialized */ 335 static struct pollfd *pollfds = NULL; 336 337 /* 338 * Add fd to the set being polled. Returns 0 if ok; -1 if failed. 339 */ 340 int 341 poll_add(int fd) 342 { 343 int i; 344 int new_num; 345 struct pollfd *newfds; 346 347 /* Check if already present */ 348 for (i = 0; i < pollfd_num; i++) { 349 if (pollfds[i].fd == fd) 350 return (0); 351 } 352 /* Check for empty spot already present */ 353 for (i = 0; i < pollfd_num; i++) { 354 if (pollfds[i].fd == -1) { 355 pollfds[i].fd = fd; 356 return (0); 357 } 358 } 359 360 /* Allocate space for 32 more fds and initialize to -1 */ 361 new_num = pollfd_num + 32; 362 newfds = realloc(pollfds, new_num * sizeof (struct pollfd)); 363 if (newfds == NULL) { 364 logperror("poll_add: realloc"); 365 return (-1); 366 } 367 368 newfds[pollfd_num].fd = fd; 369 newfds[pollfd_num++].events = POLLIN; 370 371 for (i = pollfd_num; i < new_num; i++) { 372 newfds[i].fd = -1; 373 newfds[i].events = POLLIN; 374 } 375 pollfd_num = new_num; 376 pollfds = newfds; 377 return (0); 378 } 379 380 /* 381 * Remove fd from the set being polled. Returns 0 if ok; -1 if failed. 382 */ 383 int 384 poll_remove(int fd) 385 { 386 int i; 387 388 /* Check if already present */ 389 for (i = 0; i < pollfd_num; i++) { 390 if (pollfds[i].fd == fd) { 391 pollfds[i].fd = -1; 392 return (0); 393 } 394 } 395 return (-1); 396 } 397 398 /* 399 * Extract information about the ifname (either a physical interface and 400 * the ":0" logical interface or just a logical interface). 401 * If the interface (still) exists in kernel set pr_in_use 402 * for caller to be able to detect interfaces that are removed. 403 * Starts sending advertisements/solicitations when new physical interfaces 404 * are detected. 405 */ 406 static void 407 if_process(int s, char *ifname, boolean_t first) 408 { 409 struct lifreq lifr; 410 struct phyint *pi; 411 struct prefix *pr; 412 char *cp; 413 char phyintname[LIFNAMSIZ + 1]; 414 415 if (debug & D_IFSCAN) 416 logmsg(LOG_DEBUG, "if_process(%s)\n", ifname); 417 418 (void) strncpy(lifr.lifr_name, ifname, sizeof (lifr.lifr_name)); 419 lifr.lifr_name[sizeof (lifr.lifr_name) - 1] = '\0'; 420 if (ioctl(s, SIOCGLIFFLAGS, (char *)&lifr) < 0) { 421 if (errno == ENXIO) { 422 /* 423 * Interface has disappeared 424 */ 425 return; 426 } 427 logperror("if_process: ioctl (get interface flags)"); 428 return; 429 } 430 431 /* 432 * Ignore loopback and point-to-multipoint interfaces. 433 * Point-to-point interfaces always have IFF_MULTICAST set. 434 */ 435 if (!(lifr.lifr_flags & IFF_MULTICAST) || 436 (lifr.lifr_flags & IFF_LOOPBACK)) { 437 return; 438 } 439 440 if (!(lifr.lifr_flags & IFF_IPV6)) 441 return; 442 443 (void) strncpy(phyintname, ifname, sizeof (phyintname)); 444 phyintname[sizeof (phyintname) - 1] = '\0'; 445 if ((cp = strchr(phyintname, IF_SEPARATOR)) != NULL) { 446 *cp = '\0'; 447 } 448 449 pi = phyint_lookup(phyintname); 450 if (pi == NULL) { 451 /* 452 * Do not add anything for new interfaces until they are UP. 453 * For existing interfaces we track the up flag. 454 */ 455 if (!(lifr.lifr_flags & IFF_UP)) 456 return; 457 458 pi = phyint_create(phyintname); 459 if (pi == NULL) { 460 logmsg(LOG_ERR, "if_process: out of memory\n"); 461 return; 462 } 463 } 464 (void) phyint_init_from_k(pi); 465 if (pi->pi_sock == -1 && !(pi->pi_kernel_state & PI_PRESENT)) { 466 /* Interface is not yet present */ 467 if (debug & D_PHYINT) { 468 logmsg(LOG_DEBUG, "if_process: interface not yet " 469 "present %s\n", pi->pi_name); 470 } 471 return; 472 } 473 474 if (pi->pi_sock != -1) { 475 if (poll_add(pi->pi_sock) == -1) { 476 /* 477 * reset state. 478 */ 479 phyint_cleanup(pi); 480 } 481 } 482 483 /* 484 * Check if IFF_ROUTER has been turned off in kernel in which 485 * case we have to turn off AdvSendAdvertisements. 486 * The kernel will automatically turn off IFF_ROUTER if 487 * ip6_forwarding is turned off. 488 * Note that we do not switch back should IFF_ROUTER be turned on. 489 */ 490 if (!first && 491 pi->pi_AdvSendAdvertisements && !(pi->pi_flags & IFF_ROUTER)) { 492 logmsg(LOG_INFO, "No longer a router on %s\n", pi->pi_name); 493 check_to_advertise(pi, START_FINAL_ADV); 494 495 pi->pi_AdvSendAdvertisements = 0; 496 pi->pi_sol_state = NO_SOLICIT; 497 } 498 499 /* 500 * Send advertisments and solicitation only if the interface is 501 * present in the kernel. 502 */ 503 if (pi->pi_kernel_state & PI_PRESENT) { 504 505 if (pi->pi_AdvSendAdvertisements) { 506 if (pi->pi_adv_state == NO_ADV) 507 check_to_advertise(pi, START_INIT_ADV); 508 } else { 509 if (pi->pi_sol_state == NO_SOLICIT) 510 check_to_solicit(pi, START_INIT_SOLICIT); 511 } 512 } 513 514 /* 515 * Track static kernel prefixes to prevent in.ndpd from clobbering 516 * them by creating a struct prefix for each prefix detected in the 517 * kernel. 518 */ 519 pr = prefix_lookup_name(pi, ifname); 520 if (pr == NULL) { 521 pr = prefix_create_name(pi, ifname); 522 if (pr == NULL) { 523 logmsg(LOG_ERR, "if_process: out of memory\n"); 524 return; 525 } 526 if (prefix_init_from_k(pr) == -1) { 527 prefix_delete(pr); 528 return; 529 } 530 } 531 /* Detect prefixes which are removed */ 532 if (pr->pr_kernel_state != 0) 533 pr->pr_in_use = _B_TRUE; 534 535 if ((lifr.lifr_flags & IFF_DUPLICATE) && 536 !(lifr.lifr_flags & IFF_DHCPRUNNING) && 537 (pr->pr_flags & IFF_TEMPORARY)) { 538 in6_addr_t *token; 539 int i; 540 char abuf[INET6_ADDRSTRLEN]; 541 542 if (++pr->pr_attempts >= MAX_DAD_FAILURES) { 543 logmsg(LOG_ERR, "%s: token %s is duplicate after %d " 544 "attempts; disabling temporary addresses on %s", 545 pr->pr_name, inet_ntop(AF_INET6, 546 (void *)&pi->pi_tmp_token, abuf, sizeof (abuf)), 547 pr->pr_attempts, pi->pi_name); 548 pi->pi_TmpAddrsEnabled = 0; 549 tmptoken_delete(pi); 550 prefix_delete(pr); 551 return; 552 } 553 logmsg(LOG_WARNING, "%s: token %s is duplicate; trying again", 554 pr->pr_name, inet_ntop(AF_INET6, (void *)&pi->pi_tmp_token, 555 abuf, sizeof (abuf))); 556 if (!tmptoken_create(pi)) { 557 prefix_delete(pr); 558 return; 559 } 560 token = &pi->pi_tmp_token; 561 for (i = 0; i < 16; i++) { 562 /* 563 * prefix_create ensures that pr_prefix has all-zero 564 * bits after prefixlen. 565 */ 566 pr->pr_address.s6_addr[i] = pr->pr_prefix.s6_addr[i] | 567 token->s6_addr[i]; 568 } 569 if (prefix_lookup_addr_match(pr) != NULL) { 570 prefix_delete(pr); 571 return; 572 } 573 pr->pr_CreateTime = getcurrenttime() / MILLISEC; 574 /* 575 * We've got a new token. Clearing PR_AUTO causes 576 * prefix_update_k to bring the interface up and set the 577 * address. 578 */ 579 pr->pr_kernel_state &= ~PR_AUTO; 580 prefix_update_k(pr); 581 } 582 } 583 584 static int ifsock = -1; 585 586 /* 587 * Scan all interfaces to detect changes as well as new and deleted intefaces 588 * 'first' is set for the initial call only. Do not effect anything. 589 */ 590 static void 591 initifs(boolean_t first) 592 { 593 char *buf; 594 int bufsize; 595 int numifs; 596 int n; 597 struct lifnum lifn; 598 struct lifconf lifc; 599 struct lifreq *lifr; 600 struct phyint *pi; 601 struct phyint *next_pi; 602 struct prefix *pr; 603 604 if (debug & D_IFSCAN) 605 logmsg(LOG_DEBUG, "Reading interface configuration\n"); 606 if (ifsock < 0) { 607 ifsock = socket(AF_INET6, SOCK_DGRAM, 0); 608 if (ifsock < 0) { 609 logperror("initifs: socket"); 610 return; 611 } 612 } 613 lifn.lifn_family = AF_INET6; 614 lifn.lifn_flags = LIFC_NOXMIT | LIFC_TEMPORARY; 615 if (ioctl(ifsock, SIOCGLIFNUM, (char *)&lifn) < 0) { 616 logperror("initifs: ioctl (get interface numbers)"); 617 return; 618 } 619 numifs = lifn.lifn_count; 620 bufsize = numifs * sizeof (struct lifreq); 621 622 buf = (char *)malloc(bufsize); 623 if (buf == NULL) { 624 logmsg(LOG_ERR, "initifs: out of memory\n"); 625 return; 626 } 627 628 /* 629 * Mark the interfaces so that we can find phyints and prefixes 630 * which have disappeared from the kernel. 631 * if_process will set pr_in_use when it finds the interface 632 * in the kernel. 633 */ 634 for (pi = phyints; pi != NULL; pi = pi->pi_next) { 635 /* 636 * Before re-examining the state of the interfaces, 637 * PI_PRESENT should be cleared from pi_kernel_state. 638 */ 639 pi->pi_kernel_state &= ~PI_PRESENT; 640 for (pr = pi->pi_prefix_list; pr != NULL; pr = pr->pr_next) { 641 pr->pr_in_use = _B_FALSE; 642 } 643 } 644 645 lifc.lifc_family = AF_INET6; 646 lifc.lifc_flags = LIFC_NOXMIT | LIFC_TEMPORARY; 647 lifc.lifc_len = bufsize; 648 lifc.lifc_buf = buf; 649 650 if (ioctl(ifsock, SIOCGLIFCONF, (char *)&lifc) < 0) { 651 logperror("initifs: ioctl (get interface configuration)"); 652 free(buf); 653 return; 654 } 655 656 lifr = (struct lifreq *)lifc.lifc_req; 657 for (n = lifc.lifc_len / sizeof (struct lifreq); n > 0; n--, lifr++) 658 if_process(ifsock, lifr->lifr_name, first); 659 free(buf); 660 661 /* 662 * Detect phyints that have been removed from the kernel. 663 * Since we can't recreate it here (would require ifconfig plumb 664 * logic) we just terminate use of that phyint. 665 */ 666 for (pi = phyints; pi != NULL; pi = next_pi) { 667 next_pi = pi->pi_next; 668 /* 669 * If interface (still) exists in kernel, set 670 * pi_state to indicate that. 671 */ 672 if (pi->pi_kernel_state & PI_PRESENT) { 673 pi->pi_state |= PI_PRESENT; 674 } 675 676 check_if_removed(pi); 677 } 678 if (show_ifs) 679 phyint_print_all(); 680 } 681 682 683 /* 684 * Router advertisement state machine. Used for everything but timer 685 * events which use advertise_event directly. 686 */ 687 void 688 check_to_advertise(struct phyint *pi, enum adv_events event) 689 { 690 uint_t delay; 691 enum adv_states old_state = pi->pi_adv_state; 692 693 if (debug & D_STATE) { 694 logmsg(LOG_DEBUG, "check_to_advertise(%s, %d) state %d\n", 695 pi->pi_name, (int)event, (int)old_state); 696 } 697 delay = advertise_event(pi, event, 0); 698 if (delay != TIMER_INFINITY) { 699 /* Make sure the global next event is updated */ 700 timer_schedule(delay); 701 } 702 703 if (debug & D_STATE) { 704 logmsg(LOG_DEBUG, "check_to_advertise(%s, %d) state %d -> %d\n", 705 pi->pi_name, (int)event, (int)old_state, 706 (int)pi->pi_adv_state); 707 } 708 } 709 710 /* 711 * Router advertisement state machine. 712 * Return the number of milliseconds until next timeout (TIMER_INFINITY 713 * if never). 714 * For the ADV_TIMER event the caller passes in the number of milliseconds 715 * since the last timer event in the 'elapsed' parameter. 716 */ 717 uint_t 718 advertise_event(struct phyint *pi, enum adv_events event, uint_t elapsed) 719 { 720 uint_t delay; 721 722 if (debug & D_STATE) { 723 logmsg(LOG_DEBUG, "advertise_event(%s, %d, %d) state %d\n", 724 pi->pi_name, (int)event, elapsed, (int)pi->pi_adv_state); 725 } 726 check_daemonize(); 727 if (!pi->pi_AdvSendAdvertisements) 728 return (TIMER_INFINITY); 729 if (pi->pi_flags & IFF_NORTEXCH) { 730 if (debug & D_PKTOUT) { 731 logmsg(LOG_DEBUG, "Suppress sending RA packet on %s " 732 "(no route exchange on interface)\n", 733 pi->pi_name); 734 } 735 return (TIMER_INFINITY); 736 } 737 738 switch (event) { 739 case ADV_OFF: 740 pi->pi_adv_state = NO_ADV; 741 return (TIMER_INFINITY); 742 743 case START_INIT_ADV: 744 if (pi->pi_adv_state == INIT_ADV) 745 return (pi->pi_adv_time_left); 746 pi->pi_adv_count = ND_MAX_INITIAL_RTR_ADVERTISEMENTS; 747 pi->pi_adv_time_left = 0; 748 pi->pi_adv_state = INIT_ADV; 749 break; /* send advertisement */ 750 751 case START_FINAL_ADV: 752 if (pi->pi_adv_state == NO_ADV) 753 return (TIMER_INFINITY); 754 if (pi->pi_adv_state == FINAL_ADV) 755 return (pi->pi_adv_time_left); 756 pi->pi_adv_count = ND_MAX_FINAL_RTR_ADVERTISEMENTS; 757 pi->pi_adv_time_left = 0; 758 pi->pi_adv_state = FINAL_ADV; 759 break; /* send advertisement */ 760 761 case RECEIVED_SOLICIT: 762 if (pi->pi_adv_state == NO_ADV) 763 return (TIMER_INFINITY); 764 if (pi->pi_adv_state == SOLICIT_ADV) { 765 if (pi->pi_adv_time_left != 0) 766 return (pi->pi_adv_time_left); 767 break; 768 } 769 delay = GET_RANDOM(0, ND_MAX_RA_DELAY_TIME); 770 if (delay < pi->pi_adv_time_left) 771 pi->pi_adv_time_left = delay; 772 if (pi->pi_adv_time_since_sent < ND_MIN_DELAY_BETWEEN_RAS) { 773 /* 774 * Send an advertisement (ND_MIN_DELAY_BETWEEN_RAS 775 * plus random delay) after the previous 776 * advertisement was sent. 777 */ 778 pi->pi_adv_time_left = delay + 779 ND_MIN_DELAY_BETWEEN_RAS - 780 pi->pi_adv_time_since_sent; 781 } 782 pi->pi_adv_state = SOLICIT_ADV; 783 break; 784 785 case ADV_TIMER: 786 if (pi->pi_adv_state == NO_ADV) 787 return (TIMER_INFINITY); 788 /* Decrease time left */ 789 if (pi->pi_adv_time_left >= elapsed) 790 pi->pi_adv_time_left -= elapsed; 791 else 792 pi->pi_adv_time_left = 0; 793 794 /* Increase time since last advertisement was sent */ 795 pi->pi_adv_time_since_sent += elapsed; 796 break; 797 default: 798 logmsg(LOG_ERR, "advertise_event: Unknown event %d\n", 799 (int)event); 800 return (TIMER_INFINITY); 801 } 802 803 if (pi->pi_adv_time_left != 0) 804 return (pi->pi_adv_time_left); 805 806 /* Send advertisement and calculate next time to send */ 807 if (pi->pi_adv_state == FINAL_ADV) { 808 /* Omit the prefixes */ 809 advertise(&v6allnodes, pi, _B_TRUE); 810 } else { 811 advertise(&v6allnodes, pi, _B_FALSE); 812 } 813 pi->pi_adv_time_since_sent = 0; 814 815 switch (pi->pi_adv_state) { 816 case SOLICIT_ADV: 817 /* 818 * The solicited advertisement has been sent. 819 * Revert to periodic advertisements. 820 */ 821 pi->pi_adv_state = REG_ADV; 822 /* FALLTHRU */ 823 case REG_ADV: 824 pi->pi_adv_time_left = 825 GET_RANDOM(1000 * pi->pi_MinRtrAdvInterval, 826 1000 * pi->pi_MaxRtrAdvInterval); 827 break; 828 829 case INIT_ADV: 830 if (--pi->pi_adv_count > 0) { 831 delay = GET_RANDOM(1000 * pi->pi_MinRtrAdvInterval, 832 1000 * pi->pi_MaxRtrAdvInterval); 833 if (delay > ND_MAX_INITIAL_RTR_ADVERT_INTERVAL) 834 delay = ND_MAX_INITIAL_RTR_ADVERT_INTERVAL; 835 pi->pi_adv_time_left = delay; 836 } else { 837 pi->pi_adv_time_left = 838 GET_RANDOM(1000 * pi->pi_MinRtrAdvInterval, 839 1000 * pi->pi_MaxRtrAdvInterval); 840 pi->pi_adv_state = REG_ADV; 841 } 842 break; 843 844 case FINAL_ADV: 845 if (--pi->pi_adv_count > 0) { 846 pi->pi_adv_time_left = 847 ND_MAX_INITIAL_RTR_ADVERT_INTERVAL; 848 } else { 849 pi->pi_adv_state = NO_ADV; 850 } 851 break; 852 } 853 if (pi->pi_adv_state != NO_ADV) 854 return (pi->pi_adv_time_left); 855 else 856 return (TIMER_INFINITY); 857 } 858 859 /* 860 * Router solicitation state machine. Used for everything but timer 861 * events which use solicit_event directly. 862 */ 863 void 864 check_to_solicit(struct phyint *pi, enum solicit_events event) 865 { 866 uint_t delay; 867 enum solicit_states old_state = pi->pi_sol_state; 868 869 if (debug & D_STATE) { 870 logmsg(LOG_DEBUG, "check_to_solicit(%s, %d) state %d\n", 871 pi->pi_name, (int)event, (int)old_state); 872 } 873 delay = solicit_event(pi, event, 0); 874 if (delay != TIMER_INFINITY) { 875 /* Make sure the global next event is updated */ 876 timer_schedule(delay); 877 } 878 879 if (debug & D_STATE) { 880 logmsg(LOG_DEBUG, "check_to_solicit(%s, %d) state %d -> %d\n", 881 pi->pi_name, (int)event, (int)old_state, 882 (int)pi->pi_sol_state); 883 } 884 } 885 886 static void 887 daemonize_ndpd(void) 888 { 889 FILE *pidfp; 890 mode_t pidmode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); /* 0644 */ 891 struct itimerval it; 892 boolean_t timerval = _B_TRUE; 893 894 /* 895 * Need to get current timer settings so they can be restored 896 * after the fork(), as the it_value and it_interval values for 897 * the ITIMER_REAL timer are reset to 0 in the child process. 898 */ 899 if (getitimer(ITIMER_REAL, &it) < 0) { 900 if (debug & D_TIMER) 901 logmsg(LOG_DEBUG, 902 "daemonize_ndpd: failed to get itimerval\n"); 903 timerval = _B_FALSE; 904 } 905 906 /* Daemonize. */ 907 switch (fork()) { 908 case 0: 909 /* Child */ 910 break; 911 case -1: 912 logperror("fork"); 913 exit(1); 914 default: 915 /* Parent */ 916 _exit(0); 917 } 918 919 /* Store our process id, blow away any existing file if it exists. */ 920 if ((pidfp = fopen(PATH_PID, "w")) == NULL) { 921 (void) fprintf(stderr, "%s: unable to open " PATH_PID ": %s\n", 922 argv0[0], strerror(errno)); 923 } else { 924 (void) fprintf(pidfp, "%ld\n", getpid()); 925 (void) fclose(pidfp); 926 (void) chmod(PATH_PID, pidmode); 927 } 928 929 (void) close(0); 930 (void) close(1); 931 (void) close(2); 932 933 (void) chdir("/"); 934 (void) open("/dev/null", O_RDWR); 935 (void) dup2(0, 1); 936 (void) dup2(0, 2); 937 (void) setsid(); 938 939 already_daemonized = _B_TRUE; 940 941 /* 942 * Restore timer values, if we were able to save them; if not, 943 * check and set the right value by calling run_timeouts(). 944 */ 945 if (timerval) { 946 if (setitimer(ITIMER_REAL, &it, NULL) < 0) { 947 logperror("daemonize_ndpd: setitimer"); 948 exit(2); 949 } 950 } else { 951 run_timeouts(); 952 } 953 } 954 955 /* 956 * Check to see if the time is right to daemonize. The right time is when: 957 * 958 * 1. We haven't already daemonized. 959 * 2. We are not in debug mode. 960 * 3. All interfaces are marked IFF_NOXMIT. 961 * 4. All non-router interfaces have their prefixes set up and we're 962 * done sending router solicitations on those interfaces without 963 * prefixes. 964 */ 965 static void 966 check_daemonize(void) 967 { 968 struct phyint *pi; 969 970 if (already_daemonized || debug != 0) 971 return; 972 973 for (pi = phyints; pi != NULL; pi = pi->pi_next) { 974 if (!(pi->pi_flags & IFF_NOXMIT)) 975 break; 976 } 977 978 /* 979 * If we can't transmit on any of the interfaces there is no reason 980 * to hold up progress. 981 */ 982 if (pi == NULL) { 983 daemonize_ndpd(); 984 return; 985 } 986 987 /* Check all interfaces. If any are still soliciting, just return. */ 988 for (pi = phyints; pi != NULL; pi = pi->pi_next) { 989 if (pi->pi_AdvSendAdvertisements || 990 !(pi->pi_kernel_state & PI_PRESENT)) 991 continue; 992 993 if (pi->pi_sol_state == INIT_SOLICIT) 994 return; 995 } 996 997 daemonize_ndpd(); 998 } 999 1000 /* 1001 * Router solicitation state machine. 1002 * Return the number of milliseconds until next timeout (TIMER_INFINITY 1003 * if never). 1004 * For the SOL_TIMER event the caller passes in the number of milliseconds 1005 * since the last timer event in the 'elapsed' parameter. 1006 */ 1007 uint_t 1008 solicit_event(struct phyint *pi, enum solicit_events event, uint_t elapsed) 1009 { 1010 if (debug & D_STATE) { 1011 logmsg(LOG_DEBUG, "solicit_event(%s, %d, %d) state %d\n", 1012 pi->pi_name, (int)event, elapsed, (int)pi->pi_sol_state); 1013 } 1014 1015 if (pi->pi_AdvSendAdvertisements) 1016 return (TIMER_INFINITY); 1017 if (pi->pi_flags & IFF_NORTEXCH) { 1018 if (debug & D_PKTOUT) { 1019 logmsg(LOG_DEBUG, "Suppress sending RS packet on %s " 1020 "(no route exchange on interface)\n", 1021 pi->pi_name); 1022 } 1023 return (TIMER_INFINITY); 1024 } 1025 1026 switch (event) { 1027 case SOLICIT_OFF: 1028 pi->pi_sol_state = NO_SOLICIT; 1029 check_daemonize(); 1030 return (TIMER_INFINITY); 1031 1032 case SOLICIT_DONE: 1033 pi->pi_sol_state = DONE_SOLICIT; 1034 check_daemonize(); 1035 return (TIMER_INFINITY); 1036 1037 case RESTART_INIT_SOLICIT: 1038 /* 1039 * This event allows us to start solicitation over again 1040 * without losing the RA flags. We start solicitation over 1041 * when we are missing an interface prefix for a newly- 1042 * encountered DHCP interface. 1043 */ 1044 if (pi->pi_sol_state == INIT_SOLICIT) 1045 return (pi->pi_sol_time_left); 1046 pi->pi_sol_count = ND_MAX_RTR_SOLICITATIONS; 1047 pi->pi_sol_time_left = 1048 GET_RANDOM(0, ND_MAX_RTR_SOLICITATION_DELAY); 1049 pi->pi_sol_state = INIT_SOLICIT; 1050 break; 1051 1052 case START_INIT_SOLICIT: 1053 if (pi->pi_sol_state == INIT_SOLICIT) 1054 return (pi->pi_sol_time_left); 1055 pi->pi_ra_flags = 0; 1056 pi->pi_sol_count = ND_MAX_RTR_SOLICITATIONS; 1057 pi->pi_sol_time_left = 1058 GET_RANDOM(0, ND_MAX_RTR_SOLICITATION_DELAY); 1059 pi->pi_sol_state = INIT_SOLICIT; 1060 break; 1061 1062 case SOL_TIMER: 1063 if (pi->pi_sol_state == NO_SOLICIT) 1064 return (TIMER_INFINITY); 1065 /* Decrease time left */ 1066 if (pi->pi_sol_time_left >= elapsed) 1067 pi->pi_sol_time_left -= elapsed; 1068 else 1069 pi->pi_sol_time_left = 0; 1070 break; 1071 default: 1072 logmsg(LOG_ERR, "solicit_event: Unknown event %d\n", 1073 (int)event); 1074 return (TIMER_INFINITY); 1075 } 1076 1077 if (pi->pi_sol_time_left != 0) 1078 return (pi->pi_sol_time_left); 1079 1080 /* Send solicitation and calculate next time */ 1081 switch (pi->pi_sol_state) { 1082 case INIT_SOLICIT: 1083 solicit(&v6allrouters, pi); 1084 if (--pi->pi_sol_count == 0) { 1085 if (debug & D_STATE) { 1086 logmsg(LOG_DEBUG, "solicit_event: no routers " 1087 "found on %s; assuming default flags\n", 1088 pi->pi_name); 1089 } 1090 if (pi->pi_StatefulAddrConf) { 1091 pi->pi_ra_flags |= ND_RA_FLAG_MANAGED | 1092 ND_RA_FLAG_OTHER; 1093 start_dhcp(pi); 1094 } 1095 pi->pi_sol_state = DONE_SOLICIT; 1096 check_daemonize(); 1097 return (TIMER_INFINITY); 1098 } 1099 pi->pi_sol_time_left = ND_RTR_SOLICITATION_INTERVAL; 1100 return (pi->pi_sol_time_left); 1101 case NO_SOLICIT: 1102 case DONE_SOLICIT: 1103 return (TIMER_INFINITY); 1104 default: 1105 return (pi->pi_sol_time_left); 1106 } 1107 } 1108 1109 /* 1110 * Timer mechanism using relative time (in milliseconds) from the 1111 * previous timer event. Timers exceeding TIMER_INFINITY milliseconds 1112 * will fire after TIMER_INFINITY milliseconds. 1113 */ 1114 static uint_t timer_previous; /* When last SIGALRM occurred */ 1115 static uint_t timer_next; /* Currently scheduled timeout */ 1116 1117 static void 1118 timer_init(void) 1119 { 1120 timer_previous = getcurrenttime(); 1121 timer_next = TIMER_INFINITY; 1122 run_timeouts(); 1123 } 1124 1125 /* 1126 * Make sure the next SIGALRM occurs delay milliseconds from the current 1127 * time if not earlier. 1128 * Handles getcurrenttime (32 bit integer holding milliseconds) wraparound 1129 * by treating differences greater than 0x80000000 as negative. 1130 */ 1131 void 1132 timer_schedule(uint_t delay) 1133 { 1134 uint_t now; 1135 struct itimerval itimerval; 1136 1137 now = getcurrenttime(); 1138 if (debug & D_TIMER) { 1139 logmsg(LOG_DEBUG, "timer_schedule(%u): now %u next %u\n", 1140 delay, now, timer_next); 1141 } 1142 /* Will this timer occur before the currently scheduled SIGALRM? */ 1143 if (delay >= timer_next - now) { 1144 if (debug & D_TIMER) { 1145 logmsg(LOG_DEBUG, "timer_schedule(%u): no action - " 1146 "next in %u ms\n", 1147 delay, timer_next - now); 1148 } 1149 return; 1150 } 1151 if (delay == 0) { 1152 /* Minimum allowed delay */ 1153 delay = 1; 1154 } 1155 timer_next = now + delay; 1156 1157 itimerval.it_value.tv_sec = delay / 1000; 1158 itimerval.it_value.tv_usec = (delay % 1000) * 1000; 1159 itimerval.it_interval.tv_sec = 0; 1160 itimerval.it_interval.tv_usec = 0; 1161 if (debug & D_TIMER) { 1162 logmsg(LOG_DEBUG, "timer_schedule(%u): sec %lu usec %lu\n", 1163 delay, 1164 itimerval.it_value.tv_sec, itimerval.it_value.tv_usec); 1165 } 1166 if (setitimer(ITIMER_REAL, &itimerval, NULL) < 0) { 1167 logperror("timer_schedule: setitimer"); 1168 exit(2); 1169 } 1170 } 1171 1172 /* 1173 * Conditional running of timer. If more than 'minimal_time' millseconds 1174 * since the timer routines were last run we run them. 1175 * Used when packets arrive. 1176 */ 1177 static void 1178 conditional_run_timeouts(uint_t minimal_time) 1179 { 1180 uint_t now; 1181 uint_t elapsed; 1182 1183 now = getcurrenttime(); 1184 elapsed = now - timer_previous; 1185 if (elapsed > minimal_time) { 1186 if (debug & D_TIMER) { 1187 logmsg(LOG_DEBUG, "conditional_run_timeouts: " 1188 "elapsed %d\n", elapsed); 1189 } 1190 run_timeouts(); 1191 } 1192 } 1193 1194 /* 1195 * Timer has fired. 1196 * Determine when the next timer event will occur by asking all 1197 * the timer routines. 1198 * Should not be called from a timer routine but in some cases this is 1199 * done because the code doesn't know that e.g. it was called from 1200 * ifconfig_timer(). In this case the nested run_timeouts will just return but 1201 * the running run_timeouts will ensure to call all the timer functions by 1202 * looping once more. 1203 */ 1204 static void 1205 run_timeouts(void) 1206 { 1207 uint_t now; 1208 uint_t elapsed; 1209 uint_t next; 1210 uint_t nexti; 1211 struct phyint *pi; 1212 struct phyint *next_pi; 1213 struct prefix *pr; 1214 struct prefix *next_pr; 1215 struct adv_prefix *adv_pr; 1216 struct adv_prefix *next_adv_pr; 1217 struct router *dr; 1218 struct router *next_dr; 1219 static boolean_t timeout_running; 1220 static boolean_t do_retry; 1221 1222 if (timeout_running) { 1223 if (debug & D_TIMER) 1224 logmsg(LOG_DEBUG, "run_timeouts: nested call\n"); 1225 do_retry = _B_TRUE; 1226 return; 1227 } 1228 timeout_running = _B_TRUE; 1229 retry: 1230 /* How much time since the last time we were called? */ 1231 now = getcurrenttime(); 1232 elapsed = now - timer_previous; 1233 timer_previous = now; 1234 1235 if (debug & D_TIMER) 1236 logmsg(LOG_DEBUG, "run_timeouts: elapsed %d\n", elapsed); 1237 1238 next = TIMER_INFINITY; 1239 for (pi = phyints; pi != NULL; pi = next_pi) { 1240 next_pi = pi->pi_next; 1241 nexti = phyint_timer(pi, elapsed); 1242 if (nexti != TIMER_INFINITY && nexti < next) 1243 next = nexti; 1244 if (debug & D_TIMER) { 1245 logmsg(LOG_DEBUG, "run_timeouts (pi %s): %d -> %u ms\n", 1246 pi->pi_name, nexti, next); 1247 } 1248 for (pr = pi->pi_prefix_list; pr != NULL; pr = next_pr) { 1249 next_pr = pr->pr_next; 1250 nexti = prefix_timer(pr, elapsed); 1251 if (nexti != TIMER_INFINITY && nexti < next) 1252 next = nexti; 1253 if (debug & D_TIMER) { 1254 logmsg(LOG_DEBUG, "run_timeouts (pr %s): " 1255 "%d -> %u ms\n", pr->pr_name, nexti, next); 1256 } 1257 } 1258 for (adv_pr = pi->pi_adv_prefix_list; adv_pr != NULL; 1259 adv_pr = next_adv_pr) { 1260 next_adv_pr = adv_pr->adv_pr_next; 1261 nexti = adv_prefix_timer(adv_pr, elapsed); 1262 if (nexti != TIMER_INFINITY && nexti < next) 1263 next = nexti; 1264 if (debug & D_TIMER) { 1265 logmsg(LOG_DEBUG, "run_timeouts " 1266 "(adv pr on %s): %d -> %u ms\n", 1267 adv_pr->adv_pr_physical->pi_name, 1268 nexti, next); 1269 } 1270 } 1271 for (dr = pi->pi_router_list; dr != NULL; dr = next_dr) { 1272 next_dr = dr->dr_next; 1273 nexti = router_timer(dr, elapsed); 1274 if (nexti != TIMER_INFINITY && nexti < next) 1275 next = nexti; 1276 if (debug & D_TIMER) { 1277 logmsg(LOG_DEBUG, "run_timeouts (dr): " 1278 "%d -> %u ms\n", nexti, next); 1279 } 1280 } 1281 if (pi->pi_TmpAddrsEnabled) { 1282 nexti = tmptoken_timer(pi, elapsed); 1283 if (nexti != TIMER_INFINITY && nexti < next) 1284 next = nexti; 1285 if (debug & D_TIMER) { 1286 logmsg(LOG_DEBUG, "run_timeouts (tmp on %s): " 1287 "%d -> %u ms\n", pi->pi_name, nexti, next); 1288 } 1289 } 1290 } 1291 /* 1292 * Make sure the timer functions are run at least once 1293 * an hour. 1294 */ 1295 if (next == TIMER_INFINITY) 1296 next = 3600 * 1000; /* 1 hour */ 1297 1298 if (debug & D_TIMER) 1299 logmsg(LOG_DEBUG, "run_timeouts: %u ms\n", next); 1300 timer_schedule(next); 1301 if (do_retry) { 1302 if (debug & D_TIMER) 1303 logmsg(LOG_DEBUG, "run_timeouts: retry\n"); 1304 do_retry = _B_FALSE; 1305 goto retry; 1306 } 1307 timeout_running = _B_FALSE; 1308 } 1309 1310 static int eventpipe_read = -1; /* Used for synchronous signal delivery */ 1311 static int eventpipe_write = -1; 1312 1313 /* 1314 * Ensure that signals are processed synchronously with the rest of 1315 * the code by just writing a one character signal number on the pipe. 1316 * The poll loop will pick this up and process the signal event. 1317 */ 1318 static void 1319 sig_handler(int signo) 1320 { 1321 uchar_t buf = (uchar_t)signo; 1322 1323 if (eventpipe_write == -1) { 1324 logmsg(LOG_ERR, "sig_handler: no pipe\n"); 1325 return; 1326 } 1327 if (write(eventpipe_write, &buf, sizeof (buf)) < 0) 1328 logperror("sig_handler: write"); 1329 } 1330 1331 /* 1332 * Pick up a signal "byte" from the pipe and process it. 1333 */ 1334 static void 1335 in_signal(int fd) 1336 { 1337 uchar_t buf; 1338 struct phyint *pi; 1339 struct phyint *next_pi; 1340 1341 switch (read(fd, &buf, sizeof (buf))) { 1342 case -1: 1343 logperror("in_signal: read"); 1344 exit(1); 1345 /* NOTREACHED */ 1346 case 1: 1347 break; 1348 case 0: 1349 logmsg(LOG_ERR, "in_signal: read eof\n"); 1350 exit(1); 1351 /* NOTREACHED */ 1352 default: 1353 logmsg(LOG_ERR, "in_signal: read > 1\n"); 1354 exit(1); 1355 } 1356 1357 if (debug & D_TIMER) 1358 logmsg(LOG_DEBUG, "in_signal() got %d\n", buf); 1359 1360 switch (buf) { 1361 case SIGALRM: 1362 if (debug & D_TIMER) { 1363 uint_t now = getcurrenttime(); 1364 1365 logmsg(LOG_DEBUG, "in_signal(SIGALRM) delta %u\n", 1366 now - timer_next); 1367 } 1368 timer_next = TIMER_INFINITY; 1369 run_timeouts(); 1370 break; 1371 case SIGHUP: 1372 /* Re-read config file by exec'ing ourselves */ 1373 for (pi = phyints; pi != NULL; pi = next_pi) { 1374 next_pi = pi->pi_next; 1375 if (pi->pi_AdvSendAdvertisements) 1376 check_to_advertise(pi, START_FINAL_ADV); 1377 1378 phyint_delete(pi); 1379 } 1380 1381 /* 1382 * Prevent fd leaks. Everything gets re-opened at start-up 1383 * time. 0, 1, and 2 are closed and re-opened as 1384 * /dev/null, so we'll leave those open. 1385 */ 1386 closefrom(3); 1387 1388 logmsg(LOG_ERR, "SIGHUP: restart and reread config file\n"); 1389 (void) execv(argv0[0], argv0); 1390 (void) unlink(PATH_PID); 1391 _exit(0177); 1392 /* NOTREACHED */ 1393 case SIGUSR1: 1394 logmsg(LOG_DEBUG, "Printing configuration:\n"); 1395 phyint_print_all(); 1396 break; 1397 case SIGINT: 1398 case SIGTERM: 1399 case SIGQUIT: 1400 for (pi = phyints; pi != NULL; pi = next_pi) { 1401 next_pi = pi->pi_next; 1402 if (pi->pi_AdvSendAdvertisements) 1403 check_to_advertise(pi, START_FINAL_ADV); 1404 1405 phyint_delete(pi); 1406 } 1407 (void) unlink(NDPD_SNMP_SOCKET); 1408 (void) unlink(PATH_PID); 1409 exit(0); 1410 /* NOTREACHED */ 1411 case 255: 1412 /* 1413 * Special "signal" from looback_ra_enqueue. 1414 * Handle any queued loopback router advertisements. 1415 */ 1416 loopback_ra_dequeue(); 1417 break; 1418 default: 1419 logmsg(LOG_ERR, "in_signal: unknown signal: %d\n", buf); 1420 } 1421 } 1422 1423 /* 1424 * Create pipe for signal delivery and set up signal handlers. 1425 */ 1426 static void 1427 setup_eventpipe(void) 1428 { 1429 int fds[2]; 1430 struct sigaction act; 1431 1432 if ((pipe(fds)) < 0) { 1433 logperror("setup_eventpipe: pipe"); 1434 exit(1); 1435 } 1436 eventpipe_read = fds[0]; 1437 eventpipe_write = fds[1]; 1438 if (poll_add(eventpipe_read) == -1) { 1439 exit(1); 1440 } 1441 act.sa_handler = sig_handler; 1442 act.sa_flags = SA_RESTART; 1443 (void) sigaction(SIGALRM, &act, NULL); 1444 1445 (void) sigset(SIGHUP, sig_handler); 1446 (void) sigset(SIGUSR1, sig_handler); 1447 (void) sigset(SIGTERM, sig_handler); 1448 (void) sigset(SIGINT, sig_handler); 1449 (void) sigset(SIGQUIT, sig_handler); 1450 } 1451 1452 /* 1453 * Create a routing socket for receiving RTM_IFINFO messages and initialize 1454 * the routing socket message header and as much of the sockaddrs as possible. 1455 */ 1456 static int 1457 setup_rtsock(void) 1458 { 1459 int s; 1460 int ret; 1461 char *cp; 1462 struct sockaddr_in6 *sin6; 1463 1464 s = socket(PF_ROUTE, SOCK_RAW, AF_INET6); 1465 if (s == -1) { 1466 logperror("socket(PF_ROUTE)"); 1467 exit(1); 1468 } 1469 ret = fcntl(s, F_SETFL, O_NDELAY|O_NONBLOCK); 1470 if (ret < 0) { 1471 logperror("fcntl(O_NDELAY)"); 1472 exit(1); 1473 } 1474 if (poll_add(s) == -1) { 1475 exit(1); 1476 } 1477 1478 /* 1479 * Allocate storage for the routing socket message. 1480 */ 1481 rt_msg = (struct rt_msghdr *)malloc(NDP_RTM_MSGLEN); 1482 if (rt_msg == NULL) { 1483 logperror("malloc"); 1484 exit(1); 1485 } 1486 1487 /* 1488 * Initialize the routing socket message by zero-filling it and then 1489 * setting the fields where are constant through the lifetime of the 1490 * process. 1491 */ 1492 bzero(rt_msg, NDP_RTM_MSGLEN); 1493 rt_msg->rtm_msglen = NDP_RTM_MSGLEN; 1494 rt_msg->rtm_version = RTM_VERSION; 1495 rt_msg->rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK | RTA_IFP; 1496 rt_msg->rtm_pid = getpid(); 1497 if (rt_msg->rtm_pid < 0) { 1498 logperror("getpid"); 1499 exit(1); 1500 } 1501 1502 /* 1503 * The RTA_DST sockaddr does not change during the lifetime of the 1504 * process so it can be completely initialized at this time. 1505 */ 1506 cp = (char *)rt_msg + sizeof (struct rt_msghdr); 1507 sin6 = (struct sockaddr_in6 *)cp; 1508 sin6->sin6_family = AF_INET6; 1509 sin6->sin6_addr = in6addr_any; 1510 1511 /* 1512 * Initialize the constant portion of the RTA_GATEWAY sockaddr. 1513 */ 1514 cp += sizeof (struct sockaddr_in6); 1515 rta_gateway = (struct sockaddr_in6 *)cp; 1516 rta_gateway->sin6_family = AF_INET6; 1517 1518 /* 1519 * The RTA_NETMASK sockaddr does not change during the lifetime of the 1520 * process so it can be completely initialized at this time. 1521 */ 1522 cp += sizeof (struct sockaddr_in6); 1523 sin6 = (struct sockaddr_in6 *)cp; 1524 sin6->sin6_family = AF_INET6; 1525 sin6->sin6_addr = in6addr_any; 1526 1527 /* 1528 * Initialize the constant portion of the RTA_IFP sockaddr. 1529 */ 1530 cp += sizeof (struct sockaddr_in6); 1531 rta_ifp = (struct sockaddr_dl *)cp; 1532 rta_ifp->sdl_family = AF_LINK; 1533 1534 return (s); 1535 } 1536 1537 static int 1538 setup_mibsock(void) 1539 { 1540 int sock; 1541 int ret; 1542 int len; 1543 struct sockaddr_un laddr; 1544 1545 sock = socket(AF_UNIX, SOCK_DGRAM, 0); 1546 if (sock == -1) { 1547 logperror("setup_mibsock: socket(AF_UNIX)"); 1548 exit(1); 1549 } 1550 1551 bzero(&laddr, sizeof (laddr)); 1552 laddr.sun_family = AF_UNIX; 1553 1554 (void) strncpy(laddr.sun_path, NDPD_SNMP_SOCKET, 1555 sizeof (laddr.sun_path)); 1556 len = sizeof (struct sockaddr_un); 1557 1558 (void) unlink(NDPD_SNMP_SOCKET); 1559 ret = bind(sock, (struct sockaddr *)&laddr, len); 1560 if (ret < 0) { 1561 logperror("setup_mibsock: bind\n"); 1562 exit(1); 1563 } 1564 1565 ret = fcntl(sock, F_SETFL, O_NONBLOCK); 1566 if (ret < 0) { 1567 logperror("fcntl(O_NONBLOCK)"); 1568 exit(1); 1569 } 1570 if (poll_add(sock) == -1) { 1571 exit(1); 1572 } 1573 return (sock); 1574 } 1575 1576 /* 1577 * Retrieve one routing socket message. If RTM_IFINFO indicates 1578 * new phyint do a full scan of the interfaces. If RTM_IFINFO 1579 * indicates an existing phyint, only scan that phyint and associated 1580 * prefixes. 1581 */ 1582 static void 1583 process_rtsock(int rtsock) 1584 { 1585 int n; 1586 #define MSG_SIZE 2048/8 1587 int64_t msg[MSG_SIZE]; 1588 struct rt_msghdr *rtm; 1589 struct if_msghdr *ifm; 1590 struct phyint *pi; 1591 struct prefix *pr; 1592 boolean_t need_initifs = _B_FALSE; 1593 boolean_t need_ifscan = _B_FALSE; 1594 int64_t ifscan_msg[10][MSG_SIZE]; 1595 int ifscan_index = 0; 1596 int i; 1597 1598 /* Empty the rtsock and coealesce all the work that we have */ 1599 while (ifscan_index < 10) { 1600 n = read(rtsock, msg, sizeof (msg)); 1601 if (n <= 0) { 1602 /* No more messages */ 1603 break; 1604 } 1605 rtm = (struct rt_msghdr *)msg; 1606 if (rtm->rtm_version != RTM_VERSION) { 1607 logmsg(LOG_ERR, 1608 "process_rtsock: version %d not understood\n", 1609 rtm->rtm_version); 1610 return; 1611 } 1612 switch (rtm->rtm_type) { 1613 case RTM_NEWADDR: 1614 case RTM_DELADDR: 1615 /* 1616 * Some logical interface has changed - have to scan 1617 * everything to determine what actually changed. 1618 */ 1619 if (debug & D_IFSCAN) { 1620 logmsg(LOG_DEBUG, "process_rtsock: " 1621 "message %d\n", rtm->rtm_type); 1622 } 1623 need_initifs = _B_TRUE; 1624 break; 1625 case RTM_IFINFO: 1626 need_ifscan = _B_TRUE; 1627 (void) memcpy(ifscan_msg[ifscan_index], rtm, 1628 sizeof (msg)); 1629 ifscan_index++; 1630 /* Handled below */ 1631 break; 1632 default: 1633 /* Not interesting */ 1634 break; 1635 } 1636 } 1637 /* 1638 * If we do full scan i.e initifs, we don't need to 1639 * scan a particular interface as we should have 1640 * done that as part of initifs. 1641 */ 1642 if (need_initifs) { 1643 initifs(_B_FALSE); 1644 return; 1645 } 1646 1647 if (!need_ifscan) 1648 return; 1649 1650 for (i = 0; i < ifscan_index; i++) { 1651 ifm = (struct if_msghdr *)ifscan_msg[i]; 1652 if (debug & D_IFSCAN) 1653 logmsg(LOG_DEBUG, "process_rtsock: index %d\n", 1654 ifm->ifm_index); 1655 1656 pi = phyint_lookup_on_index(ifm->ifm_index); 1657 if (pi == NULL) { 1658 /* 1659 * A new physical interface. Do a full scan of the 1660 * to catch any new logical interfaces. 1661 */ 1662 initifs(_B_FALSE); 1663 return; 1664 } 1665 1666 if (ifm->ifm_flags != (uint_t)pi->pi_flags) { 1667 if (debug & D_IFSCAN) { 1668 logmsg(LOG_DEBUG, "process_rtsock: clr for " 1669 "%s old flags 0x%llx new flags 0x%x\n", 1670 pi->pi_name, pi->pi_flags, ifm->ifm_flags); 1671 } 1672 } 1673 1674 1675 /* 1676 * Mark the interfaces so that we can find phyints and prefixes 1677 * which have disappeared from the kernel. 1678 * if_process will set pr_in_use when it finds the 1679 * interface in the kernel. 1680 * Before re-examining the state of the interfaces, 1681 * PI_PRESENT should be cleared from pi_kernel_state. 1682 */ 1683 pi->pi_kernel_state &= ~PI_PRESENT; 1684 for (pr = pi->pi_prefix_list; pr != NULL; pr = pr->pr_next) { 1685 pr->pr_in_use = _B_FALSE; 1686 } 1687 1688 if (ifsock < 0) { 1689 ifsock = socket(AF_INET6, SOCK_DGRAM, 0); 1690 if (ifsock < 0) { 1691 logperror("process_rtsock: socket"); 1692 return; 1693 } 1694 } 1695 if_process(ifsock, pi->pi_name, _B_FALSE); 1696 for (pr = pi->pi_prefix_list; pr != NULL; pr = pr->pr_next) { 1697 if_process(ifsock, pr->pr_name, _B_FALSE); 1698 } 1699 /* 1700 * If interface (still) exists in kernel, set 1701 * pi_state to indicate that. 1702 */ 1703 if (pi->pi_kernel_state & PI_PRESENT) { 1704 pi->pi_state |= PI_PRESENT; 1705 } 1706 check_if_removed(pi); 1707 if (show_ifs) 1708 phyint_print_all(); 1709 } 1710 } 1711 1712 static void 1713 process_mibsock(int mibsock) 1714 { 1715 struct phyint *pi; 1716 socklen_t fromlen; 1717 struct sockaddr_un from; 1718 ndpd_info_t ndpd_info; 1719 ssize_t len; 1720 int command; 1721 1722 fromlen = (socklen_t)sizeof (from); 1723 len = recvfrom(mibsock, &command, sizeof (int), 0, 1724 (struct sockaddr *)&from, &fromlen); 1725 1726 if (len < sizeof (int) || command != NDPD_SNMP_INFO_REQ) { 1727 logperror("process_mibsock: bad command \n"); 1728 return; 1729 } 1730 1731 ndpd_info.info_type = NDPD_SNMP_INFO_RESPONSE; 1732 ndpd_info.info_version = NDPD_SNMP_INFO_VER; 1733 ndpd_info.info_num_of_phyints = num_of_phyints; 1734 1735 (void) sendto(mibsock, &ndpd_info, sizeof (ndpd_info_t), 0, 1736 (struct sockaddr *)&from, fromlen); 1737 1738 for (pi = phyints; pi != NULL; pi = pi->pi_next) { 1739 int prefixes; 1740 int routers; 1741 struct prefix *prefix_list; 1742 struct router *router_list; 1743 ndpd_phyint_info_t phyint; 1744 ndpd_prefix_info_t prefix; 1745 ndpd_router_info_t router; 1746 /* 1747 * get number of prefixes 1748 */ 1749 routers = 0; 1750 prefixes = 0; 1751 prefix_list = pi->pi_prefix_list; 1752 while (prefix_list != NULL) { 1753 prefixes++; 1754 prefix_list = prefix_list->pr_next; 1755 } 1756 1757 /* 1758 * get number of routers 1759 */ 1760 router_list = pi->pi_router_list; 1761 while (router_list != NULL) { 1762 routers++; 1763 router_list = router_list->dr_next; 1764 } 1765 1766 phyint.phyint_info_type = NDPD_PHYINT_INFO; 1767 phyint.phyint_info_version = NDPD_PHYINT_INFO_VER; 1768 phyint.phyint_index = pi->pi_index; 1769 bcopy(pi->pi_config, 1770 phyint.phyint_config, I_IFSIZE); 1771 phyint.phyint_num_of_prefixes = prefixes; 1772 phyint.phyint_num_of_routers = routers; 1773 (void) sendto(mibsock, &phyint, sizeof (phyint), 0, 1774 (struct sockaddr *)&from, fromlen); 1775 1776 /* 1777 * Copy prefix information 1778 */ 1779 1780 prefix_list = pi->pi_prefix_list; 1781 while (prefix_list != NULL) { 1782 prefix.prefix_info_type = NDPD_PREFIX_INFO; 1783 prefix.prefix_info_version = NDPD_PREFIX_INFO_VER; 1784 prefix.prefix_prefix = prefix_list->pr_prefix; 1785 prefix.prefix_len = prefix_list->pr_prefix_len; 1786 prefix.prefix_flags = prefix_list->pr_flags; 1787 prefix.prefix_phyint_index = pi->pi_index; 1788 prefix.prefix_ValidLifetime = 1789 prefix_list->pr_ValidLifetime; 1790 prefix.prefix_PreferredLifetime = 1791 prefix_list->pr_PreferredLifetime; 1792 prefix.prefix_OnLinkLifetime = 1793 prefix_list->pr_OnLinkLifetime; 1794 prefix.prefix_OnLinkFlag = 1795 prefix_list->pr_OnLinkFlag; 1796 prefix.prefix_AutonomousFlag = 1797 prefix_list->pr_AutonomousFlag; 1798 (void) sendto(mibsock, &prefix, sizeof (prefix), 0, 1799 (struct sockaddr *)&from, fromlen); 1800 prefix_list = prefix_list->pr_next; 1801 } 1802 /* 1803 * Copy router information 1804 */ 1805 router_list = pi->pi_router_list; 1806 while (router_list != NULL) { 1807 router.router_info_type = NDPD_ROUTER_INFO; 1808 router.router_info_version = NDPD_ROUTER_INFO_VER; 1809 router.router_address = router_list->dr_address; 1810 router.router_lifetime = router_list->dr_lifetime; 1811 router.router_phyint_index = pi->pi_index; 1812 (void) sendto(mibsock, &router, sizeof (router), 0, 1813 (struct sockaddr *)&from, fromlen); 1814 router_list = router_list->dr_next; 1815 } 1816 } 1817 } 1818 1819 /* 1820 * Look if the phyint or one of its prefixes have been removed from 1821 * the kernel and take appropriate action. 1822 * Uses pr_in_use and pi{,_kernel}_state. 1823 */ 1824 static void 1825 check_if_removed(struct phyint *pi) 1826 { 1827 struct prefix *pr, *next_pr; 1828 1829 /* 1830 * Detect prefixes which are removed. 1831 * Static prefixes are just removed from our tables. 1832 * Non-static prefixes are recreated i.e. in.ndpd takes precedence 1833 * over manually removing prefixes via ifconfig. 1834 */ 1835 for (pr = pi->pi_prefix_list; pr != NULL; pr = next_pr) { 1836 next_pr = pr->pr_next; 1837 if (!pr->pr_in_use) { 1838 /* Clear everything except PR_STATIC */ 1839 pr->pr_kernel_state &= PR_STATIC; 1840 pr->pr_name[0] = '\0'; 1841 if (pr->pr_state & PR_STATIC) { 1842 prefix_delete(pr); 1843 } else if (!(pi->pi_kernel_state & PI_PRESENT)) { 1844 /* 1845 * Ensure that there are no future attempts to 1846 * run prefix_update_k since the phyint is gone. 1847 */ 1848 pr->pr_state = pr->pr_kernel_state; 1849 } else if (pr->pr_state != pr->pr_kernel_state) { 1850 logmsg(LOG_INFO, "Prefix manually removed " 1851 "on %s; recreating\n", pi->pi_name); 1852 prefix_update_k(pr); 1853 } 1854 } 1855 } 1856 1857 /* 1858 * Detect phyints that have been removed from the kernel, and tear 1859 * down any prefixes we created that are associated with that phyint. 1860 * (NOTE: IPMP depends on in.ndpd tearing down these prefixes so an 1861 * administrator can easily place an IP interface with ADDRCONF'd 1862 * addresses into an IPMP group.) 1863 */ 1864 if (!(pi->pi_kernel_state & PI_PRESENT) && 1865 (pi->pi_state & PI_PRESENT)) { 1866 logmsg(LOG_ERR, "Interface %s has been removed from kernel. " 1867 "in.ndpd will no longer use it\n", pi->pi_name); 1868 1869 for (pr = pi->pi_prefix_list; pr != NULL; pr = next_pr) { 1870 next_pr = pr->pr_next; 1871 if (pr->pr_state & PR_AUTO) 1872 prefix_delete(pr); 1873 } 1874 1875 /* 1876 * Clear state so that should the phyint reappear we will 1877 * start with initial advertisements or solicitations. 1878 */ 1879 phyint_cleanup(pi); 1880 } 1881 } 1882 1883 1884 /* 1885 * Queuing mechanism for router advertisements that are sent by in.ndpd 1886 * and that also need to be processed by in.ndpd. 1887 * Uses "signal number" 255 to indicate to the main poll loop 1888 * that there is something to dequeue and send to incomining_ra(). 1889 */ 1890 struct raq { 1891 struct raq *raq_next; 1892 struct phyint *raq_pi; 1893 int raq_packetlen; 1894 uchar_t *raq_packet; 1895 }; 1896 static struct raq *raq_head = NULL; 1897 1898 /* 1899 * Allocate a struct raq and memory for the packet. 1900 * Send signal 255 to have poll dequeue. 1901 */ 1902 static void 1903 loopback_ra_enqueue(struct phyint *pi, struct nd_router_advert *ra, int len) 1904 { 1905 struct raq *raq; 1906 struct raq **raqp; 1907 1908 if (no_loopback) 1909 return; 1910 1911 if (debug & D_PKTOUT) 1912 logmsg(LOG_DEBUG, "loopback_ra_enqueue for %s\n", pi->pi_name); 1913 1914 raq = calloc(sizeof (struct raq), 1); 1915 if (raq == NULL) { 1916 logmsg(LOG_ERR, "loopback_ra_enqueue: out of memory\n"); 1917 return; 1918 } 1919 raq->raq_packet = malloc(len); 1920 if (raq->raq_packet == NULL) { 1921 free(raq); 1922 logmsg(LOG_ERR, "loopback_ra_enqueue: out of memory\n"); 1923 return; 1924 } 1925 bcopy(ra, raq->raq_packet, len); 1926 raq->raq_packetlen = len; 1927 raq->raq_pi = pi; 1928 1929 /* Tail insert */ 1930 raqp = &raq_head; 1931 while (*raqp != NULL) 1932 raqp = &((*raqp)->raq_next); 1933 *raqp = raq; 1934 1935 /* Signal for poll loop */ 1936 sig_handler(255); 1937 } 1938 1939 /* 1940 * Dequeue and process all queued advertisements. 1941 */ 1942 static void 1943 loopback_ra_dequeue(void) 1944 { 1945 struct sockaddr_in6 from = IN6ADDR_LOOPBACK_INIT; 1946 struct raq *raq; 1947 1948 if (debug & D_PKTIN) 1949 logmsg(LOG_DEBUG, "loopback_ra_dequeue()\n"); 1950 1951 while ((raq = raq_head) != NULL) { 1952 raq_head = raq->raq_next; 1953 raq->raq_next = NULL; 1954 1955 if (debug & D_PKTIN) { 1956 logmsg(LOG_DEBUG, "loopback_ra_dequeue for %s\n", 1957 raq->raq_pi->pi_name); 1958 } 1959 1960 incoming_ra(raq->raq_pi, 1961 (struct nd_router_advert *)raq->raq_packet, 1962 raq->raq_packetlen, &from, _B_TRUE); 1963 free(raq->raq_packet); 1964 free(raq); 1965 } 1966 } 1967 1968 1969 static void 1970 usage(char *cmd) 1971 { 1972 (void) fprintf(stderr, 1973 "usage: %s [ -adt ] [-f <config file>]\n", cmd); 1974 } 1975 1976 int 1977 main(int argc, char *argv[]) 1978 { 1979 int i; 1980 struct phyint *pi; 1981 int c; 1982 char *config_file = PATH_NDPD_CONF; 1983 boolean_t file_required = _B_FALSE; 1984 1985 argv0 = argv; 1986 srandom(gethostid()); 1987 (void) umask(0022); 1988 1989 while ((c = getopt(argc, argv, "adD:ntIf:")) != EOF) { 1990 switch (c) { 1991 case 'a': 1992 /* 1993 * The StatelessAddrConf variable in ndpd.conf, if 1994 * present, will override this setting. 1995 */ 1996 ifdefaults[I_StatelessAddrConf].cf_value = 0; 1997 break; 1998 case 'd': 1999 debug = D_ALL; 2000 break; 2001 case 'D': 2002 i = strtol((char *)optarg, NULL, 0); 2003 if (i == 0) { 2004 (void) fprintf(stderr, "Bad debug flags: %s\n", 2005 (char *)optarg); 2006 exit(1); 2007 } 2008 debug |= i; 2009 break; 2010 case 'n': 2011 no_loopback = 1; 2012 break; 2013 case 'I': 2014 show_ifs = 1; 2015 break; 2016 case 't': 2017 debug |= D_PKTIN | D_PKTOUT | D_PKTBAD; 2018 break; 2019 case 'f': 2020 config_file = (char *)optarg; 2021 file_required = _B_TRUE; 2022 break; 2023 case '?': 2024 usage(argv[0]); 2025 exit(1); 2026 } 2027 } 2028 2029 if (parse_config(config_file, file_required) == -1) 2030 exit(2); 2031 2032 if (show_ifs) 2033 phyint_print_all(); 2034 2035 if (debug == 0) { 2036 initlog(); 2037 } 2038 2039 setup_eventpipe(); 2040 rtsock = setup_rtsock(); 2041 mibsock = setup_mibsock(); 2042 timer_init(); 2043 initifs(_B_TRUE); 2044 2045 check_daemonize(); 2046 2047 for (;;) { 2048 if (poll(pollfds, pollfd_num, -1) < 0) { 2049 if (errno == EINTR) 2050 continue; 2051 logperror("main: poll"); 2052 exit(1); 2053 } 2054 for (i = 0; i < pollfd_num; i++) { 2055 if (!(pollfds[i].revents & POLLIN)) 2056 continue; 2057 if (pollfds[i].fd == eventpipe_read) { 2058 in_signal(eventpipe_read); 2059 break; 2060 } 2061 if (pollfds[i].fd == rtsock) { 2062 process_rtsock(rtsock); 2063 break; 2064 } 2065 if (pollfds[i].fd == mibsock) { 2066 process_mibsock(mibsock); 2067 break; 2068 } 2069 /* 2070 * Run timer routine to advance clock if more than 2071 * half a second since the clock was advanced. 2072 * This limits CPU usage under severe packet 2073 * arrival rates but it creates a slight inaccuracy 2074 * in the timer mechanism. 2075 */ 2076 conditional_run_timeouts(500U); 2077 for (pi = phyints; pi != NULL; pi = pi->pi_next) { 2078 if (pollfds[i].fd == pi->pi_sock) { 2079 in_data(pi); 2080 break; 2081 } 2082 } 2083 } 2084 } 2085 /* NOTREACHED */ 2086 return (0); 2087 } 2088 2089 /* 2090 * LOGGER 2091 */ 2092 2093 static boolean_t logging = _B_FALSE; 2094 2095 static void 2096 initlog(void) 2097 { 2098 logging = _B_TRUE; 2099 openlog("in.ndpd", LOG_PID | LOG_CONS, LOG_DAEMON); 2100 } 2101 2102 /* Print the date/time without a trailing carridge return */ 2103 static void 2104 fprintdate(FILE *file) 2105 { 2106 char buf[BUFSIZ]; 2107 struct tm tms; 2108 time_t now; 2109 2110 now = time(NULL); 2111 (void) localtime_r(&now, &tms); 2112 (void) strftime(buf, sizeof (buf), "%h %d %X", &tms); 2113 (void) fprintf(file, "%s ", buf); 2114 } 2115 2116 /* PRINTFLIKE2 */ 2117 void 2118 logmsg(int level, const char *fmt, ...) 2119 { 2120 va_list ap; 2121 va_start(ap, fmt); 2122 2123 if (logging) { 2124 vsyslog(level, fmt, ap); 2125 } else { 2126 fprintdate(stderr); 2127 (void) vfprintf(stderr, fmt, ap); 2128 } 2129 va_end(ap); 2130 } 2131 2132 void 2133 logperror(const char *str) 2134 { 2135 if (logging) { 2136 syslog(LOG_ERR, "%s: %m\n", str); 2137 } else { 2138 fprintdate(stderr); 2139 (void) fprintf(stderr, "%s: %s\n", str, strerror(errno)); 2140 } 2141 } 2142 2143 void 2144 logperror_pi(const struct phyint *pi, const char *str) 2145 { 2146 if (logging) { 2147 syslog(LOG_ERR, "%s (interface %s): %m\n", 2148 str, pi->pi_name); 2149 } else { 2150 fprintdate(stderr); 2151 (void) fprintf(stderr, "%s (interface %s): %s\n", 2152 str, pi->pi_name, strerror(errno)); 2153 } 2154 } 2155 2156 void 2157 logperror_pr(const struct prefix *pr, const char *str) 2158 { 2159 if (logging) { 2160 syslog(LOG_ERR, "%s (prefix %s if %s): %m\n", 2161 str, pr->pr_name, pr->pr_physical->pi_name); 2162 } else { 2163 fprintdate(stderr); 2164 (void) fprintf(stderr, "%s (prefix %s if %s): %s\n", 2165 str, pr->pr_name, pr->pr_physical->pi_name, 2166 strerror(errno)); 2167 } 2168 } 2169