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