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