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