]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/netinet6/nd6.c
Merge from HEAD
[FreeBSD/FreeBSD.git] / sys / netinet6 / nd6.c
1 /*-
2  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the project nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *      $KAME: nd6.c,v 1.144 2001/05/24 07:44:00 itojun Exp $
30  */
31
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
34
35 #include "opt_inet.h"
36 #include "opt_inet6.h"
37
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/callout.h>
41 #include <sys/malloc.h>
42 #include <sys/mbuf.h>
43 #include <sys/socket.h>
44 #include <sys/sockio.h>
45 #include <sys/time.h>
46 #include <sys/kernel.h>
47 #include <sys/protosw.h>
48 #include <sys/errno.h>
49 #include <sys/syslog.h>
50 #include <sys/lock.h>
51 #include <sys/rwlock.h>
52 #include <sys/queue.h>
53 #include <sys/sdt.h>
54 #include <sys/sysctl.h>
55
56 #include <net/if.h>
57 #include <net/if_var.h>
58 #include <net/if_arc.h>
59 #include <net/if_dl.h>
60 #include <net/if_types.h>
61 #include <net/iso88025.h>
62 #include <net/fddi.h>
63 #include <net/route.h>
64 #include <net/vnet.h>
65
66 #include <netinet/in.h>
67 #include <netinet/in_kdtrace.h>
68 #include <net/if_llatbl.h>
69 #include <netinet/if_ether.h>
70 #include <netinet6/in6_var.h>
71 #include <netinet/ip6.h>
72 #include <netinet6/ip6_var.h>
73 #include <netinet6/scope6_var.h>
74 #include <netinet6/nd6.h>
75 #include <netinet6/in6_ifattach.h>
76 #include <netinet/icmp6.h>
77 #include <netinet6/send.h>
78
79 #include <sys/limits.h>
80
81 #include <security/mac/mac_framework.h>
82
83 #define ND6_SLOWTIMER_INTERVAL (60 * 60) /* 1 hour */
84 #define ND6_RECALC_REACHTM_INTERVAL (60 * 120) /* 2 hours */
85
86 #define SIN6(s) ((const struct sockaddr_in6 *)(s))
87
88 /* timer values */
89 VNET_DEFINE(int, nd6_prune)     = 1;    /* walk list every 1 seconds */
90 VNET_DEFINE(int, nd6_delay)     = 5;    /* delay first probe time 5 second */
91 VNET_DEFINE(int, nd6_umaxtries) = 3;    /* maximum unicast query */
92 VNET_DEFINE(int, nd6_mmaxtries) = 3;    /* maximum multicast query */
93 VNET_DEFINE(int, nd6_useloopback) = 1;  /* use loopback interface for
94                                          * local traffic */
95 VNET_DEFINE(int, nd6_gctimer)   = (60 * 60 * 24); /* 1 day: garbage
96                                          * collection timer */
97
98 /* preventing too many loops in ND option parsing */
99 static VNET_DEFINE(int, nd6_maxndopt) = 10; /* max # of ND options allowed */
100
101 VNET_DEFINE(int, nd6_maxnudhint) = 0;   /* max # of subsequent upper
102                                          * layer hints */
103 static VNET_DEFINE(int, nd6_maxqueuelen) = 1; /* max pkts cached in unresolved
104                                          * ND entries */
105 #define V_nd6_maxndopt                  VNET(nd6_maxndopt)
106 #define V_nd6_maxqueuelen               VNET(nd6_maxqueuelen)
107
108 #ifdef ND6_DEBUG
109 VNET_DEFINE(int, nd6_debug) = 1;
110 #else
111 VNET_DEFINE(int, nd6_debug) = 0;
112 #endif
113
114 static eventhandler_tag lle_event_eh;
115
116 /* for debugging? */
117 #if 0
118 static int nd6_inuse, nd6_allocated;
119 #endif
120
121 VNET_DEFINE(struct nd_drhead, nd_defrouter);
122 VNET_DEFINE(struct nd_prhead, nd_prefix);
123
124 VNET_DEFINE(int, nd6_recalc_reachtm_interval) = ND6_RECALC_REACHTM_INTERVAL;
125 #define V_nd6_recalc_reachtm_interval   VNET(nd6_recalc_reachtm_interval)
126
127 int     (*send_sendso_input_hook)(struct mbuf *, struct ifnet *, int, int);
128
129 static int nd6_is_new_addr_neighbor(struct sockaddr_in6 *,
130         struct ifnet *);
131 static void nd6_setmtu0(struct ifnet *, struct nd_ifinfo *);
132 static void nd6_slowtimo(void *);
133 static int regen_tmpaddr(struct in6_ifaddr *);
134 static struct llentry *nd6_free(struct llentry *, int);
135 static void nd6_llinfo_timer(void *);
136 static void clear_llinfo_pqueue(struct llentry *);
137 static void nd6_rtrequest(int, struct rtentry *, struct rt_addrinfo *);
138 static int nd6_output_lle(struct ifnet *, struct ifnet *, struct mbuf *,
139         struct sockaddr_in6 *);
140 static int nd6_output_ifp(struct ifnet *, struct ifnet *, struct mbuf *,
141     struct sockaddr_in6 *);
142
143 static VNET_DEFINE(struct callout, nd6_slowtimo_ch);
144 #define V_nd6_slowtimo_ch               VNET(nd6_slowtimo_ch)
145
146 VNET_DEFINE(struct callout, nd6_timer_ch);
147
148 static void
149 nd6_lle_event(void *arg __unused, struct llentry *lle, int evt)
150 {
151         struct rt_addrinfo rtinfo;
152         struct sockaddr_in6 dst;
153         struct sockaddr_dl gw;
154         struct ifnet *ifp;
155         int type;
156
157         LLE_WLOCK_ASSERT(lle);
158
159         if (lltable_get_af(lle->lle_tbl) != AF_INET6)
160                 return;
161
162         switch (evt) {
163         case LLENTRY_RESOLVED:
164                 type = RTM_ADD;
165                 KASSERT(lle->la_flags & LLE_VALID,
166                     ("%s: %p resolved but not valid?", __func__, lle));
167                 break;
168         case LLENTRY_EXPIRED:
169                 type = RTM_DELETE;
170                 break;
171         default:
172                 return;
173         }
174
175         ifp = lltable_get_ifp(lle->lle_tbl);
176
177         bzero(&dst, sizeof(dst));
178         bzero(&gw, sizeof(gw));
179         bzero(&rtinfo, sizeof(rtinfo));
180         lltable_fill_sa_entry(lle, (struct sockaddr *)&dst);
181         dst.sin6_scope_id = in6_getscopezone(ifp,
182             in6_addrscope(&dst.sin6_addr));
183         gw.sdl_len = sizeof(struct sockaddr_dl);
184         gw.sdl_family = AF_LINK;
185         gw.sdl_alen = ifp->if_addrlen;
186         gw.sdl_index = ifp->if_index;
187         gw.sdl_type = ifp->if_type;
188         if (evt == LLENTRY_RESOLVED)
189                 bcopy(&lle->ll_addr, gw.sdl_data, ifp->if_addrlen);
190         rtinfo.rti_info[RTAX_DST] = (struct sockaddr *)&dst;
191         rtinfo.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&gw;
192         rtinfo.rti_addrs = RTA_DST | RTA_GATEWAY;
193         rt_missmsg_fib(type, &rtinfo, RTF_HOST | RTF_LLDATA | (
194             type == RTM_ADD ? RTF_UP: 0), 0, RT_DEFAULT_FIB);
195 }
196
197 void
198 nd6_init(void)
199 {
200
201         LIST_INIT(&V_nd_prefix);
202
203         /* initialization of the default router list */
204         TAILQ_INIT(&V_nd_defrouter);
205
206         /* start timer */
207         callout_init(&V_nd6_slowtimo_ch, 0);
208         callout_reset(&V_nd6_slowtimo_ch, ND6_SLOWTIMER_INTERVAL * hz,
209             nd6_slowtimo, curvnet);
210
211         nd6_dad_init();
212         if (IS_DEFAULT_VNET(curvnet))
213                 lle_event_eh = EVENTHANDLER_REGISTER(lle_event, nd6_lle_event,
214                     NULL, EVENTHANDLER_PRI_ANY);
215 }
216
217 #ifdef VIMAGE
218 void
219 nd6_destroy()
220 {
221
222         callout_drain(&V_nd6_slowtimo_ch);
223         callout_drain(&V_nd6_timer_ch);
224         if (IS_DEFAULT_VNET(curvnet))
225                 EVENTHANDLER_DEREGISTER(lle_event, lle_event_eh);
226 }
227 #endif
228
229 struct nd_ifinfo *
230 nd6_ifattach(struct ifnet *ifp)
231 {
232         struct nd_ifinfo *nd;
233
234         nd = (struct nd_ifinfo *)malloc(sizeof(*nd), M_IP6NDP, M_WAITOK|M_ZERO);
235         nd->initialized = 1;
236
237         nd->chlim = IPV6_DEFHLIM;
238         nd->basereachable = REACHABLE_TIME;
239         nd->reachable = ND_COMPUTE_RTIME(nd->basereachable);
240         nd->retrans = RETRANS_TIMER;
241
242         nd->flags = ND6_IFF_PERFORMNUD;
243
244         /* A loopback interface always has ND6_IFF_AUTO_LINKLOCAL.
245          * XXXHRS: Clear ND6_IFF_AUTO_LINKLOCAL on an IFT_BRIDGE interface by
246          * default regardless of the V_ip6_auto_linklocal configuration to
247          * give a reasonable default behavior.
248          */
249         if ((V_ip6_auto_linklocal && ifp->if_type != IFT_BRIDGE) ||
250             (ifp->if_flags & IFF_LOOPBACK))
251                 nd->flags |= ND6_IFF_AUTO_LINKLOCAL;
252         /*
253          * A loopback interface does not need to accept RTADV.
254          * XXXHRS: Clear ND6_IFF_ACCEPT_RTADV on an IFT_BRIDGE interface by
255          * default regardless of the V_ip6_accept_rtadv configuration to
256          * prevent the interface from accepting RA messages arrived
257          * on one of the member interfaces with ND6_IFF_ACCEPT_RTADV.
258          */
259         if (V_ip6_accept_rtadv &&
260             !(ifp->if_flags & IFF_LOOPBACK) &&
261             (ifp->if_type != IFT_BRIDGE))
262                         nd->flags |= ND6_IFF_ACCEPT_RTADV;
263         if (V_ip6_no_radr && !(ifp->if_flags & IFF_LOOPBACK))
264                 nd->flags |= ND6_IFF_NO_RADR;
265
266         /* XXX: we cannot call nd6_setmtu since ifp is not fully initialized */
267         nd6_setmtu0(ifp, nd);
268
269         return nd;
270 }
271
272 void
273 nd6_ifdetach(struct nd_ifinfo *nd)
274 {
275
276         free(nd, M_IP6NDP);
277 }
278
279 /*
280  * Reset ND level link MTU. This function is called when the physical MTU
281  * changes, which means we might have to adjust the ND level MTU.
282  */
283 void
284 nd6_setmtu(struct ifnet *ifp)
285 {
286
287         nd6_setmtu0(ifp, ND_IFINFO(ifp));
288 }
289
290 /* XXX todo: do not maintain copy of ifp->if_mtu in ndi->maxmtu */
291 void
292 nd6_setmtu0(struct ifnet *ifp, struct nd_ifinfo *ndi)
293 {
294         u_int32_t omaxmtu;
295
296         omaxmtu = ndi->maxmtu;
297
298         switch (ifp->if_type) {
299         case IFT_ARCNET:
300                 ndi->maxmtu = MIN(ARC_PHDS_MAXMTU, ifp->if_mtu); /* RFC2497 */
301                 break;
302         case IFT_FDDI:
303                 ndi->maxmtu = MIN(FDDIIPMTU, ifp->if_mtu); /* RFC2467 */
304                 break;
305         case IFT_ISO88025:
306                  ndi->maxmtu = MIN(ISO88025_MAX_MTU, ifp->if_mtu);
307                  break;
308         default:
309                 ndi->maxmtu = ifp->if_mtu;
310                 break;
311         }
312
313         /*
314          * Decreasing the interface MTU under IPV6 minimum MTU may cause
315          * undesirable situation.  We thus notify the operator of the change
316          * explicitly.  The check for omaxmtu is necessary to restrict the
317          * log to the case of changing the MTU, not initializing it.
318          */
319         if (omaxmtu >= IPV6_MMTU && ndi->maxmtu < IPV6_MMTU) {
320                 log(LOG_NOTICE, "nd6_setmtu0: "
321                     "new link MTU on %s (%lu) is too small for IPv6\n",
322                     if_name(ifp), (unsigned long)ndi->maxmtu);
323         }
324
325         if (ndi->maxmtu > V_in6_maxmtu)
326                 in6_setmaxmtu(); /* check all interfaces just in case */
327
328 }
329
330 void
331 nd6_option_init(void *opt, int icmp6len, union nd_opts *ndopts)
332 {
333
334         bzero(ndopts, sizeof(*ndopts));
335         ndopts->nd_opts_search = (struct nd_opt_hdr *)opt;
336         ndopts->nd_opts_last
337                 = (struct nd_opt_hdr *)(((u_char *)opt) + icmp6len);
338
339         if (icmp6len == 0) {
340                 ndopts->nd_opts_done = 1;
341                 ndopts->nd_opts_search = NULL;
342         }
343 }
344
345 /*
346  * Take one ND option.
347  */
348 struct nd_opt_hdr *
349 nd6_option(union nd_opts *ndopts)
350 {
351         struct nd_opt_hdr *nd_opt;
352         int olen;
353
354         KASSERT(ndopts != NULL, ("%s: ndopts == NULL", __func__));
355         KASSERT(ndopts->nd_opts_last != NULL, ("%s: uninitialized ndopts",
356             __func__));
357         if (ndopts->nd_opts_search == NULL)
358                 return NULL;
359         if (ndopts->nd_opts_done)
360                 return NULL;
361
362         nd_opt = ndopts->nd_opts_search;
363
364         /* make sure nd_opt_len is inside the buffer */
365         if ((caddr_t)&nd_opt->nd_opt_len >= (caddr_t)ndopts->nd_opts_last) {
366                 bzero(ndopts, sizeof(*ndopts));
367                 return NULL;
368         }
369
370         olen = nd_opt->nd_opt_len << 3;
371         if (olen == 0) {
372                 /*
373                  * Message validation requires that all included
374                  * options have a length that is greater than zero.
375                  */
376                 bzero(ndopts, sizeof(*ndopts));
377                 return NULL;
378         }
379
380         ndopts->nd_opts_search = (struct nd_opt_hdr *)((caddr_t)nd_opt + olen);
381         if (ndopts->nd_opts_search > ndopts->nd_opts_last) {
382                 /* option overruns the end of buffer, invalid */
383                 bzero(ndopts, sizeof(*ndopts));
384                 return NULL;
385         } else if (ndopts->nd_opts_search == ndopts->nd_opts_last) {
386                 /* reached the end of options chain */
387                 ndopts->nd_opts_done = 1;
388                 ndopts->nd_opts_search = NULL;
389         }
390         return nd_opt;
391 }
392
393 /*
394  * Parse multiple ND options.
395  * This function is much easier to use, for ND routines that do not need
396  * multiple options of the same type.
397  */
398 int
399 nd6_options(union nd_opts *ndopts)
400 {
401         struct nd_opt_hdr *nd_opt;
402         int i = 0;
403
404         KASSERT(ndopts != NULL, ("%s: ndopts == NULL", __func__));
405         KASSERT(ndopts->nd_opts_last != NULL, ("%s: uninitialized ndopts",
406             __func__));
407         if (ndopts->nd_opts_search == NULL)
408                 return 0;
409
410         while (1) {
411                 nd_opt = nd6_option(ndopts);
412                 if (nd_opt == NULL && ndopts->nd_opts_last == NULL) {
413                         /*
414                          * Message validation requires that all included
415                          * options have a length that is greater than zero.
416                          */
417                         ICMP6STAT_INC(icp6s_nd_badopt);
418                         bzero(ndopts, sizeof(*ndopts));
419                         return -1;
420                 }
421
422                 if (nd_opt == NULL)
423                         goto skip1;
424
425                 switch (nd_opt->nd_opt_type) {
426                 case ND_OPT_SOURCE_LINKADDR:
427                 case ND_OPT_TARGET_LINKADDR:
428                 case ND_OPT_MTU:
429                 case ND_OPT_REDIRECTED_HEADER:
430                 case ND_OPT_NONCE:
431                         if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) {
432                                 nd6log((LOG_INFO,
433                                     "duplicated ND6 option found (type=%d)\n",
434                                     nd_opt->nd_opt_type));
435                                 /* XXX bark? */
436                         } else {
437                                 ndopts->nd_opt_array[nd_opt->nd_opt_type]
438                                         = nd_opt;
439                         }
440                         break;
441                 case ND_OPT_PREFIX_INFORMATION:
442                         if (ndopts->nd_opt_array[nd_opt->nd_opt_type] == 0) {
443                                 ndopts->nd_opt_array[nd_opt->nd_opt_type]
444                                         = nd_opt;
445                         }
446                         ndopts->nd_opts_pi_end =
447                                 (struct nd_opt_prefix_info *)nd_opt;
448                         break;
449                 /* What about ND_OPT_ROUTE_INFO? RFC 4191 */
450                 case ND_OPT_RDNSS:      /* RFC 6106 */
451                 case ND_OPT_DNSSL:      /* RFC 6106 */
452                         /*
453                          * Silently ignore options we know and do not care about
454                          * in the kernel.
455                          */
456                         break;
457                 default:
458                         /*
459                          * Unknown options must be silently ignored,
460                          * to accomodate future extension to the protocol.
461                          */
462                         nd6log((LOG_DEBUG,
463                             "nd6_options: unsupported option %d - "
464                             "option ignored\n", nd_opt->nd_opt_type));
465                 }
466
467 skip1:
468                 i++;
469                 if (i > V_nd6_maxndopt) {
470                         ICMP6STAT_INC(icp6s_nd_toomanyopt);
471                         nd6log((LOG_INFO, "too many loop in nd opt\n"));
472                         break;
473                 }
474
475                 if (ndopts->nd_opts_done)
476                         break;
477         }
478
479         return 0;
480 }
481
482 /*
483  * ND6 timer routine to handle ND6 entries
484  */
485 void
486 nd6_llinfo_settimer_locked(struct llentry *ln, long tick)
487 {
488         int canceled;
489
490         LLE_WLOCK_ASSERT(ln);
491
492         if (tick < 0) {
493                 ln->la_expire = 0;
494                 ln->ln_ntick = 0;
495                 canceled = callout_stop(&ln->lle_timer);
496         } else {
497                 ln->la_expire = time_uptime + tick / hz;
498                 LLE_ADDREF(ln);
499                 if (tick > INT_MAX) {
500                         ln->ln_ntick = tick - INT_MAX;
501                         canceled = callout_reset(&ln->lle_timer, INT_MAX,
502                             nd6_llinfo_timer, ln);
503                 } else {
504                         ln->ln_ntick = 0;
505                         canceled = callout_reset(&ln->lle_timer, tick,
506                             nd6_llinfo_timer, ln);
507                 }
508         }
509         if (canceled)
510                 LLE_REMREF(ln);
511 }
512
513 void
514 nd6_llinfo_settimer(struct llentry *ln, long tick)
515 {
516
517         LLE_WLOCK(ln);
518         nd6_llinfo_settimer_locked(ln, tick);
519         LLE_WUNLOCK(ln);
520 }
521
522 static void
523 nd6_llinfo_timer(void *arg)
524 {
525         struct llentry *ln;
526         struct in6_addr *dst;
527         struct ifnet *ifp;
528         struct nd_ifinfo *ndi = NULL;
529
530         KASSERT(arg != NULL, ("%s: arg NULL", __func__));
531         ln = (struct llentry *)arg;
532         LLE_WLOCK(ln);
533         if (callout_pending(&ln->lle_timer)) {
534                 /*
535                  * Here we are a bit odd here in the treatment of 
536                  * active/pending. If the pending bit is set, it got
537                  * rescheduled before I ran. The active
538                  * bit we ignore, since if it was stopped
539                  * in ll_tablefree() and was currently running
540                  * it would have return 0 so the code would
541                  * not have deleted it since the callout could
542                  * not be stopped so we want to go through
543                  * with the delete here now. If the callout
544                  * was restarted, the pending bit will be back on and
545                  * we just want to bail since the callout_reset would
546                  * return 1 and our reference would have been removed
547                  * by nd6_llinfo_settimer_locked above since canceled
548                  * would have been 1.
549                  */
550                 LLE_WUNLOCK(ln);
551                 return;
552         }
553         ifp = ln->lle_tbl->llt_ifp;
554         CURVNET_SET(ifp->if_vnet);
555
556         if (ln->ln_ntick > 0) {
557                 if (ln->ln_ntick > INT_MAX) {
558                         ln->ln_ntick -= INT_MAX;
559                         nd6_llinfo_settimer_locked(ln, INT_MAX);
560                 } else {
561                         ln->ln_ntick = 0;
562                         nd6_llinfo_settimer_locked(ln, ln->ln_ntick);
563                 }
564                 goto done;
565         }
566
567         ndi = ND_IFINFO(ifp);
568         dst = &ln->r_l3addr.addr6;
569         if (ln->la_flags & LLE_STATIC) {
570                 goto done;
571         }
572
573         if (ln->la_flags & LLE_DELETED) {
574                 (void)nd6_free(ln, 0);
575                 ln = NULL;
576                 goto done;
577         }
578
579         switch (ln->ln_state) {
580         case ND6_LLINFO_INCOMPLETE:
581                 if (ln->la_asked < V_nd6_mmaxtries) {
582                         ln->la_asked++;
583                         nd6_llinfo_settimer_locked(ln, (long)ndi->retrans * hz / 1000);
584                         LLE_WUNLOCK(ln);
585                         nd6_ns_output(ifp, NULL, dst, ln, NULL);
586                         LLE_WLOCK(ln);
587                 } else {
588                         struct mbuf *m = ln->la_hold;
589                         if (m) {
590                                 struct mbuf *m0;
591
592                                 /*
593                                  * assuming every packet in la_hold has the
594                                  * same IP header.  Send error after unlock.
595                                  */
596                                 m0 = m->m_nextpkt;
597                                 m->m_nextpkt = NULL;
598                                 ln->la_hold = m0;
599                                 clear_llinfo_pqueue(ln);
600                         }
601                         EVENTHANDLER_INVOKE(lle_event, ln, LLENTRY_TIMEDOUT);
602                         (void)nd6_free(ln, 0);
603                         ln = NULL;
604                         if (m != NULL)
605                                 icmp6_error2(m, ICMP6_DST_UNREACH,
606                                     ICMP6_DST_UNREACH_ADDR, 0, ifp);
607                 }
608                 break;
609         case ND6_LLINFO_REACHABLE:
610                 if (!ND6_LLINFO_PERMANENT(ln)) {
611                         ln->ln_state = ND6_LLINFO_STALE;
612                         nd6_llinfo_settimer_locked(ln, (long)V_nd6_gctimer * hz);
613                 }
614                 break;
615
616         case ND6_LLINFO_STALE:
617                 /* Garbage Collection(RFC 2461 5.3) */
618                 if (!ND6_LLINFO_PERMANENT(ln)) {
619                         EVENTHANDLER_INVOKE(lle_event, ln, LLENTRY_EXPIRED);
620                         (void)nd6_free(ln, 1);
621                         ln = NULL;
622                 }
623                 break;
624
625         case ND6_LLINFO_DELAY:
626                 if (ndi && (ndi->flags & ND6_IFF_PERFORMNUD) != 0) {
627                         /* We need NUD */
628                         ln->la_asked = 1;
629                         ln->ln_state = ND6_LLINFO_PROBE;
630                         nd6_llinfo_settimer_locked(ln, (long)ndi->retrans * hz / 1000);
631                         LLE_WUNLOCK(ln);
632                         nd6_ns_output(ifp, dst, dst, ln, NULL);
633                         LLE_WLOCK(ln);
634                 } else {
635                         ln->ln_state = ND6_LLINFO_STALE; /* XXX */
636                         nd6_llinfo_settimer_locked(ln, (long)V_nd6_gctimer * hz);
637                 }
638                 break;
639         case ND6_LLINFO_PROBE:
640                 if (ln->la_asked < V_nd6_umaxtries) {
641                         ln->la_asked++;
642                         nd6_llinfo_settimer_locked(ln, (long)ndi->retrans * hz / 1000);
643                         LLE_WUNLOCK(ln);
644                         nd6_ns_output(ifp, dst, dst, ln, NULL);
645                         LLE_WLOCK(ln);
646                 } else {
647                         EVENTHANDLER_INVOKE(lle_event, ln, LLENTRY_EXPIRED);
648                         (void)nd6_free(ln, 0);
649                         ln = NULL;
650                 }
651                 break;
652         default:
653                 panic("%s: paths in a dark night can be confusing: %d",
654                     __func__, ln->ln_state);
655         }
656 done:
657         if (ln != NULL)
658                 LLE_FREE_LOCKED(ln);
659         CURVNET_RESTORE();
660 }
661
662
663 /*
664  * ND6 timer routine to expire default route list and prefix list
665  */
666 void
667 nd6_timer(void *arg)
668 {
669         CURVNET_SET((struct vnet *) arg);
670         struct nd_defrouter *dr, *ndr;
671         struct nd_prefix *pr, *npr;
672         struct in6_ifaddr *ia6, *nia6;
673
674         callout_reset(&V_nd6_timer_ch, V_nd6_prune * hz,
675             nd6_timer, curvnet);
676
677         /* expire default router list */
678         TAILQ_FOREACH_SAFE(dr, &V_nd_defrouter, dr_entry, ndr) {
679                 if (dr->expire && dr->expire < time_uptime)
680                         defrtrlist_del(dr);
681         }
682
683         /*
684          * expire interface addresses.
685          * in the past the loop was inside prefix expiry processing.
686          * However, from a stricter speci-confrmance standpoint, we should
687          * rather separate address lifetimes and prefix lifetimes.
688          *
689          * XXXRW: in6_ifaddrhead locking.
690          */
691   addrloop:
692         TAILQ_FOREACH_SAFE(ia6, &V_in6_ifaddrhead, ia_link, nia6) {
693                 /* check address lifetime */
694                 if (IFA6_IS_INVALID(ia6)) {
695                         int regen = 0;
696
697                         /*
698                          * If the expiring address is temporary, try
699                          * regenerating a new one.  This would be useful when
700                          * we suspended a laptop PC, then turned it on after a
701                          * period that could invalidate all temporary
702                          * addresses.  Although we may have to restart the
703                          * loop (see below), it must be after purging the
704                          * address.  Otherwise, we'd see an infinite loop of
705                          * regeneration.
706                          */
707                         if (V_ip6_use_tempaddr &&
708                             (ia6->ia6_flags & IN6_IFF_TEMPORARY) != 0) {
709                                 if (regen_tmpaddr(ia6) == 0)
710                                         regen = 1;
711                         }
712
713                         in6_purgeaddr(&ia6->ia_ifa);
714
715                         if (regen)
716                                 goto addrloop; /* XXX: see below */
717                 } else if (IFA6_IS_DEPRECATED(ia6)) {
718                         int oldflags = ia6->ia6_flags;
719
720                         ia6->ia6_flags |= IN6_IFF_DEPRECATED;
721
722                         /*
723                          * If a temporary address has just become deprecated,
724                          * regenerate a new one if possible.
725                          */
726                         if (V_ip6_use_tempaddr &&
727                             (ia6->ia6_flags & IN6_IFF_TEMPORARY) != 0 &&
728                             (oldflags & IN6_IFF_DEPRECATED) == 0) {
729
730                                 if (regen_tmpaddr(ia6) == 0) {
731                                         /*
732                                          * A new temporary address is
733                                          * generated.
734                                          * XXX: this means the address chain
735                                          * has changed while we are still in
736                                          * the loop.  Although the change
737                                          * would not cause disaster (because
738                                          * it's not a deletion, but an
739                                          * addition,) we'd rather restart the
740                                          * loop just for safety.  Or does this
741                                          * significantly reduce performance??
742                                          */
743                                         goto addrloop;
744                                 }
745                         }
746                 } else {
747                         /*
748                          * A new RA might have made a deprecated address
749                          * preferred.
750                          */
751                         ia6->ia6_flags &= ~IN6_IFF_DEPRECATED;
752                 }
753         }
754
755         /* expire prefix list */
756         LIST_FOREACH_SAFE(pr, &V_nd_prefix, ndpr_entry, npr) {
757                 /*
758                  * check prefix lifetime.
759                  * since pltime is just for autoconf, pltime processing for
760                  * prefix is not necessary.
761                  */
762                 if (pr->ndpr_vltime != ND6_INFINITE_LIFETIME &&
763                     time_uptime - pr->ndpr_lastupdate > pr->ndpr_vltime) {
764
765                         /*
766                          * address expiration and prefix expiration are
767                          * separate.  NEVER perform in6_purgeaddr here.
768                          */
769                         prelist_remove(pr);
770                 }
771         }
772         CURVNET_RESTORE();
773 }
774
775 /*
776  * ia6 - deprecated/invalidated temporary address
777  */
778 static int
779 regen_tmpaddr(struct in6_ifaddr *ia6)
780 {
781         struct ifaddr *ifa;
782         struct ifnet *ifp;
783         struct in6_ifaddr *public_ifa6 = NULL;
784
785         ifp = ia6->ia_ifa.ifa_ifp;
786         IF_ADDR_RLOCK(ifp);
787         TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
788                 struct in6_ifaddr *it6;
789
790                 if (ifa->ifa_addr->sa_family != AF_INET6)
791                         continue;
792
793                 it6 = (struct in6_ifaddr *)ifa;
794
795                 /* ignore no autoconf addresses. */
796                 if ((it6->ia6_flags & IN6_IFF_AUTOCONF) == 0)
797                         continue;
798
799                 /* ignore autoconf addresses with different prefixes. */
800                 if (it6->ia6_ndpr == NULL || it6->ia6_ndpr != ia6->ia6_ndpr)
801                         continue;
802
803                 /*
804                  * Now we are looking at an autoconf address with the same
805                  * prefix as ours.  If the address is temporary and is still
806                  * preferred, do not create another one.  It would be rare, but
807                  * could happen, for example, when we resume a laptop PC after
808                  * a long period.
809                  */
810                 if ((it6->ia6_flags & IN6_IFF_TEMPORARY) != 0 &&
811                     !IFA6_IS_DEPRECATED(it6)) {
812                         public_ifa6 = NULL;
813                         break;
814                 }
815
816                 /*
817                  * This is a public autoconf address that has the same prefix
818                  * as ours.  If it is preferred, keep it.  We can't break the
819                  * loop here, because there may be a still-preferred temporary
820                  * address with the prefix.
821                  */
822                 if (!IFA6_IS_DEPRECATED(it6))
823                         public_ifa6 = it6;
824         }
825         if (public_ifa6 != NULL)
826                 ifa_ref(&public_ifa6->ia_ifa);
827         IF_ADDR_RUNLOCK(ifp);
828
829         if (public_ifa6 != NULL) {
830                 int e;
831
832                 if ((e = in6_tmpifadd(public_ifa6, 0, 0)) != 0) {
833                         ifa_free(&public_ifa6->ia_ifa);
834                         log(LOG_NOTICE, "regen_tmpaddr: failed to create a new"
835                             " tmp addr,errno=%d\n", e);
836                         return (-1);
837                 }
838                 ifa_free(&public_ifa6->ia_ifa);
839                 return (0);
840         }
841
842         return (-1);
843 }
844
845 /*
846  * Nuke neighbor cache/prefix/default router management table, right before
847  * ifp goes away.
848  */
849 void
850 nd6_purge(struct ifnet *ifp)
851 {
852         struct nd_defrouter *dr, *ndr;
853         struct nd_prefix *pr, *npr;
854
855         /*
856          * Nuke default router list entries toward ifp.
857          * We defer removal of default router list entries that is installed
858          * in the routing table, in order to keep additional side effects as
859          * small as possible.
860          */
861         TAILQ_FOREACH_SAFE(dr, &V_nd_defrouter, dr_entry, ndr) {
862                 if (dr->installed)
863                         continue;
864
865                 if (dr->ifp == ifp)
866                         defrtrlist_del(dr);
867         }
868
869         TAILQ_FOREACH_SAFE(dr, &V_nd_defrouter, dr_entry, ndr) {
870                 if (!dr->installed)
871                         continue;
872
873                 if (dr->ifp == ifp)
874                         defrtrlist_del(dr);
875         }
876
877         /* Nuke prefix list entries toward ifp */
878         LIST_FOREACH_SAFE(pr, &V_nd_prefix, ndpr_entry, npr) {
879                 if (pr->ndpr_ifp == ifp) {
880                         /*
881                          * Because if_detach() does *not* release prefixes
882                          * while purging addresses the reference count will
883                          * still be above zero. We therefore reset it to
884                          * make sure that the prefix really gets purged.
885                          */
886                         pr->ndpr_refcnt = 0;
887
888                         /*
889                          * Previously, pr->ndpr_addr is removed as well,
890                          * but I strongly believe we don't have to do it.
891                          * nd6_purge() is only called from in6_ifdetach(),
892                          * which removes all the associated interface addresses
893                          * by itself.
894                          * (jinmei@kame.net 20010129)
895                          */
896                         prelist_remove(pr);
897                 }
898         }
899
900         /* cancel default outgoing interface setting */
901         if (V_nd6_defifindex == ifp->if_index)
902                 nd6_setdefaultiface(0);
903
904         if (ND_IFINFO(ifp)->flags & ND6_IFF_ACCEPT_RTADV) {
905                 /* Refresh default router list. */
906                 defrouter_select();
907         }
908
909         /* XXXXX
910          * We do not nuke the neighbor cache entries here any more
911          * because the neighbor cache is kept in if_afdata[AF_INET6].
912          * nd6_purge() is invoked by in6_ifdetach() which is called
913          * from if_detach() where everything gets purged. So let
914          * in6_domifdetach() do the actual L2 table purging work.
915          */
916 }
917
918 /* 
919  * the caller acquires and releases the lock on the lltbls
920  * Returns the llentry locked
921  */
922 struct llentry *
923 nd6_lookup(struct in6_addr *addr6, int flags, struct ifnet *ifp)
924 {
925         struct sockaddr_in6 sin6;
926         struct llentry *ln;
927         int llflags;
928         
929         bzero(&sin6, sizeof(sin6));
930         sin6.sin6_len = sizeof(struct sockaddr_in6);
931         sin6.sin6_family = AF_INET6;
932         sin6.sin6_addr = *addr6;
933
934         IF_AFDATA_LOCK_ASSERT(ifp);
935
936         llflags = (flags & ND6_EXCLUSIVE) ? LLE_EXCLUSIVE : 0;
937         ln = lla_lookup(LLTABLE6(ifp), llflags, (struct sockaddr *)&sin6);
938
939         return (ln);
940 }
941
942 struct llentry *
943 nd6_alloc(struct in6_addr *addr6, int flags, struct ifnet *ifp)
944 {
945         struct sockaddr_in6 sin6;
946         struct llentry *ln;
947
948         bzero(&sin6, sizeof(sin6));
949         sin6.sin6_len = sizeof(struct sockaddr_in6);
950         sin6.sin6_family = AF_INET6;
951         sin6.sin6_addr = *addr6;
952
953         ln = lltable_alloc_entry(LLTABLE6(ifp), 0, (struct sockaddr *)&sin6);
954         if (ln != NULL)
955                 ln->ln_state = ND6_LLINFO_NOSTATE;
956
957         return (ln);
958 }
959
960 /*
961  * Test whether a given IPv6 address is a neighbor or not, ignoring
962  * the actual neighbor cache.  The neighbor cache is ignored in order
963  * to not reenter the routing code from within itself.
964  */
965 static int
966 nd6_is_new_addr_neighbor(struct sockaddr_in6 *addr, struct ifnet *ifp)
967 {
968         struct nd_prefix *pr;
969         struct ifaddr *dstaddr;
970
971         /*
972          * A link-local address is always a neighbor.
973          * XXX: a link does not necessarily specify a single interface.
974          */
975         if (IN6_IS_ADDR_LINKLOCAL(&addr->sin6_addr)) {
976                 struct sockaddr_in6 sin6_copy;
977                 u_int32_t zone;
978
979                 /*
980                  * We need sin6_copy since sa6_recoverscope() may modify the
981                  * content (XXX).
982                  */
983                 sin6_copy = *addr;
984                 if (sa6_recoverscope(&sin6_copy))
985                         return (0); /* XXX: should be impossible */
986                 if (in6_setscope(&sin6_copy.sin6_addr, ifp, &zone))
987                         return (0);
988                 if (sin6_copy.sin6_scope_id == zone)
989                         return (1);
990                 else
991                         return (0);
992         }
993
994         /*
995          * If the address matches one of our addresses,
996          * it should be a neighbor.
997          * If the address matches one of our on-link prefixes, it should be a
998          * neighbor.
999          */
1000         LIST_FOREACH(pr, &V_nd_prefix, ndpr_entry) {
1001                 if (pr->ndpr_ifp != ifp)
1002                         continue;
1003
1004                 if (!(pr->ndpr_stateflags & NDPRF_ONLINK)) {
1005                         struct rtentry *rt;
1006
1007                         /* Always use the default FIB here. */
1008                         rt = in6_rtalloc1((struct sockaddr *)&pr->ndpr_prefix,
1009                             0, 0, RT_DEFAULT_FIB);
1010                         if (rt == NULL)
1011                                 continue;
1012                         /*
1013                          * This is the case where multiple interfaces
1014                          * have the same prefix, but only one is installed 
1015                          * into the routing table and that prefix entry
1016                          * is not the one being examined here. In the case
1017                          * where RADIX_MPATH is enabled, multiple route
1018                          * entries (of the same rt_key value) will be 
1019                          * installed because the interface addresses all
1020                          * differ.
1021                          */
1022                         if (!IN6_ARE_ADDR_EQUAL(&pr->ndpr_prefix.sin6_addr,
1023                                &((struct sockaddr_in6 *)rt_key(rt))->sin6_addr)) {
1024                                 RTFREE_LOCKED(rt);
1025                                 continue;
1026                         }
1027                         RTFREE_LOCKED(rt);
1028                 }
1029
1030                 if (IN6_ARE_MASKED_ADDR_EQUAL(&pr->ndpr_prefix.sin6_addr,
1031                     &addr->sin6_addr, &pr->ndpr_mask))
1032                         return (1);
1033         }
1034
1035         /*
1036          * If the address is assigned on the node of the other side of
1037          * a p2p interface, the address should be a neighbor.
1038          */
1039         dstaddr = ifa_ifwithdstaddr((struct sockaddr *)addr, RT_ALL_FIBS);
1040         if (dstaddr != NULL) {
1041                 if (dstaddr->ifa_ifp == ifp) {
1042                         ifa_free(dstaddr);
1043                         return (1);
1044                 }
1045                 ifa_free(dstaddr);
1046         }
1047
1048         /*
1049          * If the default router list is empty, all addresses are regarded
1050          * as on-link, and thus, as a neighbor.
1051          */
1052         if (ND_IFINFO(ifp)->flags & ND6_IFF_ACCEPT_RTADV &&
1053             TAILQ_EMPTY(&V_nd_defrouter) &&
1054             V_nd6_defifindex == ifp->if_index) {
1055                 return (1);
1056         }
1057
1058         return (0);
1059 }
1060
1061
1062 /*
1063  * Detect if a given IPv6 address identifies a neighbor on a given link.
1064  * XXX: should take care of the destination of a p2p link?
1065  */
1066 int
1067 nd6_is_addr_neighbor(struct sockaddr_in6 *addr, struct ifnet *ifp)
1068 {
1069         struct llentry *lle;
1070         int rc = 0;
1071
1072         IF_AFDATA_UNLOCK_ASSERT(ifp);
1073         if (nd6_is_new_addr_neighbor(addr, ifp))
1074                 return (1);
1075
1076         /*
1077          * Even if the address matches none of our addresses, it might be
1078          * in the neighbor cache.
1079          */
1080         IF_AFDATA_RLOCK(ifp);
1081         if ((lle = nd6_lookup(&addr->sin6_addr, 0, ifp)) != NULL) {
1082                 LLE_RUNLOCK(lle);
1083                 rc = 1;
1084         }
1085         IF_AFDATA_RUNLOCK(ifp);
1086         return (rc);
1087 }
1088
1089 /*
1090  * Free an nd6 llinfo entry.
1091  * Since the function would cause significant changes in the kernel, DO NOT
1092  * make it global, unless you have a strong reason for the change, and are sure
1093  * that the change is safe.
1094  */
1095 static struct llentry *
1096 nd6_free(struct llentry *ln, int gc)
1097 {
1098         struct llentry *next;
1099         struct nd_defrouter *dr;
1100         struct ifnet *ifp;
1101
1102         LLE_WLOCK_ASSERT(ln);
1103
1104         /*
1105          * we used to have pfctlinput(PRC_HOSTDEAD) here.
1106          * even though it is not harmful, it was not really necessary.
1107          */
1108
1109         /* cancel timer */
1110         nd6_llinfo_settimer_locked(ln, -1);
1111
1112         ifp = ln->lle_tbl->llt_ifp;
1113
1114         if (ND_IFINFO(ifp)->flags & ND6_IFF_ACCEPT_RTADV) {
1115                 dr = defrouter_lookup(&ln->r_l3addr.addr6, ifp);
1116
1117                 if (dr != NULL && dr->expire &&
1118                     ln->ln_state == ND6_LLINFO_STALE && gc) {
1119                         /*
1120                          * If the reason for the deletion is just garbage
1121                          * collection, and the neighbor is an active default
1122                          * router, do not delete it.  Instead, reset the GC
1123                          * timer using the router's lifetime.
1124                          * Simply deleting the entry would affect default
1125                          * router selection, which is not necessarily a good
1126                          * thing, especially when we're using router preference
1127                          * values.
1128                          * XXX: the check for ln_state would be redundant,
1129                          *      but we intentionally keep it just in case.
1130                          */
1131                         if (dr->expire > time_uptime)
1132                                 nd6_llinfo_settimer_locked(ln,
1133                                     (dr->expire - time_uptime) * hz);
1134                         else
1135                                 nd6_llinfo_settimer_locked(ln,
1136                                     (long)V_nd6_gctimer * hz);
1137
1138                         next = LIST_NEXT(ln, lle_next);
1139                         LLE_REMREF(ln);
1140                         LLE_WUNLOCK(ln);
1141                         return (next);
1142                 }
1143
1144                 if (dr) {
1145                         /*
1146                          * Unreachablity of a router might affect the default
1147                          * router selection and on-link detection of advertised
1148                          * prefixes.
1149                          */
1150
1151                         /*
1152                          * Temporarily fake the state to choose a new default
1153                          * router and to perform on-link determination of
1154                          * prefixes correctly.
1155                          * Below the state will be set correctly,
1156                          * or the entry itself will be deleted.
1157                          */
1158                         ln->ln_state = ND6_LLINFO_INCOMPLETE;
1159                 }
1160
1161                 if (ln->ln_router || dr) {
1162
1163                         /*
1164                          * We need to unlock to avoid a LOR with rt6_flush() with the
1165                          * rnh and for the calls to pfxlist_onlink_check() and
1166                          * defrouter_select() in the block further down for calls
1167                          * into nd6_lookup().  We still hold a ref.
1168                          */
1169                         LLE_WUNLOCK(ln);
1170
1171                         /*
1172                          * rt6_flush must be called whether or not the neighbor
1173                          * is in the Default Router List.
1174                          * See a corresponding comment in nd6_na_input().
1175                          */
1176                         rt6_flush(&ln->r_l3addr.addr6, ifp);
1177                 }
1178
1179                 if (dr) {
1180                         /*
1181                          * Since defrouter_select() does not affect the
1182                          * on-link determination and MIP6 needs the check
1183                          * before the default router selection, we perform
1184                          * the check now.
1185                          */
1186                         pfxlist_onlink_check();
1187
1188                         /*
1189                          * Refresh default router list.
1190                          */
1191                         defrouter_select();
1192                 }
1193
1194                 if (ln->ln_router || dr)
1195                         LLE_WLOCK(ln);
1196         }
1197
1198         /*
1199          * Before deleting the entry, remember the next entry as the
1200          * return value.  We need this because pfxlist_onlink_check() above
1201          * might have freed other entries (particularly the old next entry) as
1202          * a side effect (XXX).
1203          */
1204         next = LIST_NEXT(ln, lle_next);
1205
1206         /*
1207          * Save to unlock. We still hold an extra reference and will not
1208          * free(9) in llentry_free() if someone else holds one as well.
1209          */
1210         LLE_WUNLOCK(ln);
1211         IF_AFDATA_LOCK(ifp);
1212         LLE_WLOCK(ln);
1213
1214         /* Guard against race with other llentry_free(). */
1215         if (ln->la_flags & LLE_LINKED) {
1216                 LLE_REMREF(ln);
1217                 llentry_free(ln);
1218         } else
1219                 LLE_FREE_LOCKED(ln);
1220
1221         IF_AFDATA_UNLOCK(ifp);
1222
1223         return (next);
1224 }
1225
1226 /*
1227  * Upper-layer reachability hint for Neighbor Unreachability Detection.
1228  *
1229  * XXX cost-effective methods?
1230  */
1231 void
1232 nd6_nud_hint(struct rtentry *rt, struct in6_addr *dst6, int force)
1233 {
1234         struct llentry *ln;
1235         struct ifnet *ifp;
1236
1237         if ((dst6 == NULL) || (rt == NULL))
1238                 return;
1239
1240         ifp = rt->rt_ifp;
1241         IF_AFDATA_RLOCK(ifp);
1242         ln = nd6_lookup(dst6, ND6_EXCLUSIVE, NULL);
1243         IF_AFDATA_RUNLOCK(ifp);
1244         if (ln == NULL)
1245                 return;
1246
1247         if (ln->ln_state < ND6_LLINFO_REACHABLE)
1248                 goto done;
1249
1250         /*
1251          * if we get upper-layer reachability confirmation many times,
1252          * it is possible we have false information.
1253          */
1254         if (!force) {
1255                 ln->ln_byhint++;
1256                 if (ln->ln_byhint > V_nd6_maxnudhint) {
1257                         goto done;
1258                 }
1259         }
1260
1261         ln->ln_state = ND6_LLINFO_REACHABLE;
1262         if (!ND6_LLINFO_PERMANENT(ln)) {
1263                 nd6_llinfo_settimer_locked(ln,
1264                     (long)ND_IFINFO(rt->rt_ifp)->reachable * hz);
1265         }
1266 done:
1267         LLE_WUNLOCK(ln);
1268 }
1269
1270
1271 /*
1272  * Rejuvenate this function for routing operations related
1273  * processing.
1274  */
1275 void
1276 nd6_rtrequest(int req, struct rtentry *rt, struct rt_addrinfo *info)
1277 {
1278         struct sockaddr_in6 *gateway;
1279         struct nd_defrouter *dr;
1280         struct ifnet *ifp;
1281
1282         gateway = (struct sockaddr_in6 *)rt->rt_gateway;
1283         ifp = rt->rt_ifp;
1284
1285         switch (req) {
1286         case RTM_ADD:
1287                 break;
1288
1289         case RTM_DELETE:
1290                 if (!ifp)
1291                         return;
1292                 /*
1293                  * Only indirect routes are interesting.
1294                  */
1295                 if ((rt->rt_flags & RTF_GATEWAY) == 0)
1296                         return;
1297                 /*
1298                  * check for default route
1299                  */
1300                 if (IN6_ARE_ADDR_EQUAL(&in6addr_any, 
1301                                        &SIN6(rt_key(rt))->sin6_addr)) {
1302
1303                         dr = defrouter_lookup(&gateway->sin6_addr, ifp);
1304                         if (dr != NULL)
1305                                 dr->installed = 0;
1306                 }
1307                 break;
1308         }
1309 }
1310
1311
1312 int
1313 nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp)
1314 {
1315         struct in6_drlist *drl = (struct in6_drlist *)data;
1316         struct in6_oprlist *oprl = (struct in6_oprlist *)data;
1317         struct in6_ndireq *ndi = (struct in6_ndireq *)data;
1318         struct in6_nbrinfo *nbi = (struct in6_nbrinfo *)data;
1319         struct in6_ndifreq *ndif = (struct in6_ndifreq *)data;
1320         struct nd_defrouter *dr;
1321         struct nd_prefix *pr;
1322         int i = 0, error = 0;
1323
1324         if (ifp->if_afdata[AF_INET6] == NULL)
1325                 return (EPFNOSUPPORT);
1326         switch (cmd) {
1327         case SIOCGDRLST_IN6:
1328                 /*
1329                  * obsolete API, use sysctl under net.inet6.icmp6
1330                  */
1331                 bzero(drl, sizeof(*drl));
1332                 TAILQ_FOREACH(dr, &V_nd_defrouter, dr_entry) {
1333                         if (i >= DRLSTSIZ)
1334                                 break;
1335                         drl->defrouter[i].rtaddr = dr->rtaddr;
1336                         in6_clearscope(&drl->defrouter[i].rtaddr);
1337
1338                         drl->defrouter[i].flags = dr->flags;
1339                         drl->defrouter[i].rtlifetime = dr->rtlifetime;
1340                         drl->defrouter[i].expire = dr->expire +
1341                             (time_second - time_uptime);
1342                         drl->defrouter[i].if_index = dr->ifp->if_index;
1343                         i++;
1344                 }
1345                 break;
1346         case SIOCGPRLST_IN6:
1347                 /*
1348                  * obsolete API, use sysctl under net.inet6.icmp6
1349                  *
1350                  * XXX the structure in6_prlist was changed in backward-
1351                  * incompatible manner.  in6_oprlist is used for SIOCGPRLST_IN6,
1352                  * in6_prlist is used for nd6_sysctl() - fill_prlist().
1353                  */
1354                 /*
1355                  * XXX meaning of fields, especialy "raflags", is very
1356                  * differnet between RA prefix list and RR/static prefix list.
1357                  * how about separating ioctls into two?
1358                  */
1359                 bzero(oprl, sizeof(*oprl));
1360                 LIST_FOREACH(pr, &V_nd_prefix, ndpr_entry) {
1361                         struct nd_pfxrouter *pfr;
1362                         int j;
1363
1364                         if (i >= PRLSTSIZ)
1365                                 break;
1366                         oprl->prefix[i].prefix = pr->ndpr_prefix.sin6_addr;
1367                         oprl->prefix[i].raflags = pr->ndpr_raf;
1368                         oprl->prefix[i].prefixlen = pr->ndpr_plen;
1369                         oprl->prefix[i].vltime = pr->ndpr_vltime;
1370                         oprl->prefix[i].pltime = pr->ndpr_pltime;
1371                         oprl->prefix[i].if_index = pr->ndpr_ifp->if_index;
1372                         if (pr->ndpr_vltime == ND6_INFINITE_LIFETIME)
1373                                 oprl->prefix[i].expire = 0;
1374                         else {
1375                                 time_t maxexpire;
1376
1377                                 /* XXX: we assume time_t is signed. */
1378                                 maxexpire = (-1) &
1379                                     ~((time_t)1 <<
1380                                     ((sizeof(maxexpire) * 8) - 1));
1381                                 if (pr->ndpr_vltime <
1382                                     maxexpire - pr->ndpr_lastupdate) {
1383                                         oprl->prefix[i].expire =
1384                                             pr->ndpr_lastupdate +
1385                                             pr->ndpr_vltime +
1386                                             (time_second - time_uptime);
1387                                 } else
1388                                         oprl->prefix[i].expire = maxexpire;
1389                         }
1390
1391                         j = 0;
1392                         LIST_FOREACH(pfr, &pr->ndpr_advrtrs, pfr_entry) {
1393                                 if (j < DRLSTSIZ) {
1394 #define RTRADDR oprl->prefix[i].advrtr[j]
1395                                         RTRADDR = pfr->router->rtaddr;
1396                                         in6_clearscope(&RTRADDR);
1397 #undef RTRADDR
1398                                 }
1399                                 j++;
1400                         }
1401                         oprl->prefix[i].advrtrs = j;
1402                         oprl->prefix[i].origin = PR_ORIG_RA;
1403
1404                         i++;
1405                 }
1406
1407                 break;
1408         case OSIOCGIFINFO_IN6:
1409 #define ND      ndi->ndi
1410                 /* XXX: old ndp(8) assumes a positive value for linkmtu. */
1411                 bzero(&ND, sizeof(ND));
1412                 ND.linkmtu = IN6_LINKMTU(ifp);
1413                 ND.maxmtu = ND_IFINFO(ifp)->maxmtu;
1414                 ND.basereachable = ND_IFINFO(ifp)->basereachable;
1415                 ND.reachable = ND_IFINFO(ifp)->reachable;
1416                 ND.retrans = ND_IFINFO(ifp)->retrans;
1417                 ND.flags = ND_IFINFO(ifp)->flags;
1418                 ND.recalctm = ND_IFINFO(ifp)->recalctm;
1419                 ND.chlim = ND_IFINFO(ifp)->chlim;
1420                 break;
1421         case SIOCGIFINFO_IN6:
1422                 ND = *ND_IFINFO(ifp);
1423                 break;
1424         case SIOCSIFINFO_IN6:
1425                 /*
1426                  * used to change host variables from userland.
1427                  * intented for a use on router to reflect RA configurations.
1428                  */
1429                 /* 0 means 'unspecified' */
1430                 if (ND.linkmtu != 0) {
1431                         if (ND.linkmtu < IPV6_MMTU ||
1432                             ND.linkmtu > IN6_LINKMTU(ifp)) {
1433                                 error = EINVAL;
1434                                 break;
1435                         }
1436                         ND_IFINFO(ifp)->linkmtu = ND.linkmtu;
1437                 }
1438
1439                 if (ND.basereachable != 0) {
1440                         int obasereachable = ND_IFINFO(ifp)->basereachable;
1441
1442                         ND_IFINFO(ifp)->basereachable = ND.basereachable;
1443                         if (ND.basereachable != obasereachable)
1444                                 ND_IFINFO(ifp)->reachable =
1445                                     ND_COMPUTE_RTIME(ND.basereachable);
1446                 }
1447                 if (ND.retrans != 0)
1448                         ND_IFINFO(ifp)->retrans = ND.retrans;
1449                 if (ND.chlim != 0)
1450                         ND_IFINFO(ifp)->chlim = ND.chlim;
1451                 /* FALLTHROUGH */
1452         case SIOCSIFINFO_FLAGS:
1453         {
1454                 struct ifaddr *ifa;
1455                 struct in6_ifaddr *ia;
1456
1457                 if ((ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED) &&
1458                     !(ND.flags & ND6_IFF_IFDISABLED)) {
1459                         /* ifdisabled 1->0 transision */
1460
1461                         /*
1462                          * If the interface is marked as ND6_IFF_IFDISABLED and
1463                          * has an link-local address with IN6_IFF_DUPLICATED,
1464                          * do not clear ND6_IFF_IFDISABLED.
1465                          * See RFC 4862, Section 5.4.5.
1466                          */
1467                         int duplicated_linklocal = 0;
1468
1469                         IF_ADDR_RLOCK(ifp);
1470                         TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1471                                 if (ifa->ifa_addr->sa_family != AF_INET6)
1472                                         continue;
1473                                 ia = (struct in6_ifaddr *)ifa;
1474                                 if ((ia->ia6_flags & IN6_IFF_DUPLICATED) &&
1475                                     IN6_IS_ADDR_LINKLOCAL(IA6_IN6(ia))) {
1476                                         duplicated_linklocal = 1;
1477                                         break;
1478                                 }
1479                         }
1480                         IF_ADDR_RUNLOCK(ifp);
1481
1482                         if (duplicated_linklocal) {
1483                                 ND.flags |= ND6_IFF_IFDISABLED;
1484                                 log(LOG_ERR, "Cannot enable an interface"
1485                                     " with a link-local address marked"
1486                                     " duplicate.\n");
1487                         } else {
1488                                 ND_IFINFO(ifp)->flags &= ~ND6_IFF_IFDISABLED;
1489                                 if (ifp->if_flags & IFF_UP)
1490                                         in6_if_up(ifp);
1491                         }
1492                 } else if (!(ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED) &&
1493                             (ND.flags & ND6_IFF_IFDISABLED)) {
1494                         /* ifdisabled 0->1 transision */
1495                         /* Mark all IPv6 address as tentative. */
1496
1497                         ND_IFINFO(ifp)->flags |= ND6_IFF_IFDISABLED;
1498                         IF_ADDR_RLOCK(ifp);
1499                         TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1500                                 if (ifa->ifa_addr->sa_family != AF_INET6)
1501                                         continue;
1502                                 ia = (struct in6_ifaddr *)ifa;
1503                                 ia->ia6_flags |= IN6_IFF_TENTATIVE;
1504                         }
1505                         IF_ADDR_RUNLOCK(ifp);
1506                 }
1507
1508                 if (ND.flags & ND6_IFF_AUTO_LINKLOCAL) {
1509                         if (!(ND_IFINFO(ifp)->flags & ND6_IFF_AUTO_LINKLOCAL)) {
1510                                 /* auto_linklocal 0->1 transision */
1511
1512                                 /* If no link-local address on ifp, configure */
1513                                 ND_IFINFO(ifp)->flags |= ND6_IFF_AUTO_LINKLOCAL;
1514                                 in6_ifattach(ifp, NULL);
1515                         } else if (!(ND.flags & ND6_IFF_IFDISABLED) &&
1516                             ifp->if_flags & IFF_UP) {
1517                                 /*
1518                                  * When the IF already has
1519                                  * ND6_IFF_AUTO_LINKLOCAL, no link-local
1520                                  * address is assigned, and IFF_UP, try to
1521                                  * assign one.
1522                                  */
1523                                 int haslinklocal = 0;
1524                         
1525                                 IF_ADDR_RLOCK(ifp);
1526                                 TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
1527                                         if (ifa->ifa_addr->sa_family != AF_INET6)
1528                                                 continue;
1529                                         ia = (struct in6_ifaddr *)ifa;
1530                                         if (IN6_IS_ADDR_LINKLOCAL(IA6_IN6(ia))) {
1531                                                 haslinklocal = 1;
1532                                                 break;
1533                                         }
1534                                 }
1535                                 IF_ADDR_RUNLOCK(ifp);
1536                                 if (!haslinklocal)
1537                                         in6_ifattach(ifp, NULL);
1538                         }
1539                 }
1540         }
1541                 ND_IFINFO(ifp)->flags = ND.flags;
1542                 break;
1543 #undef ND
1544         case SIOCSNDFLUSH_IN6:  /* XXX: the ioctl name is confusing... */
1545                 /* sync kernel routing table with the default router list */
1546                 defrouter_reset();
1547                 defrouter_select();
1548                 break;
1549         case SIOCSPFXFLUSH_IN6:
1550         {
1551                 /* flush all the prefix advertised by routers */
1552                 struct nd_prefix *pr, *next;
1553
1554                 LIST_FOREACH_SAFE(pr, &V_nd_prefix, ndpr_entry, next) {
1555                         struct in6_ifaddr *ia, *ia_next;
1556
1557                         if (IN6_IS_ADDR_LINKLOCAL(&pr->ndpr_prefix.sin6_addr))
1558                                 continue; /* XXX */
1559
1560                         /* do we really have to remove addresses as well? */
1561                         /* XXXRW: in6_ifaddrhead locking. */
1562                         TAILQ_FOREACH_SAFE(ia, &V_in6_ifaddrhead, ia_link,
1563                             ia_next) {
1564                                 if ((ia->ia6_flags & IN6_IFF_AUTOCONF) == 0)
1565                                         continue;
1566
1567                                 if (ia->ia6_ndpr == pr)
1568                                         in6_purgeaddr(&ia->ia_ifa);
1569                         }
1570                         prelist_remove(pr);
1571                 }
1572                 break;
1573         }
1574         case SIOCSRTRFLUSH_IN6:
1575         {
1576                 /* flush all the default routers */
1577                 struct nd_defrouter *dr, *next;
1578
1579                 defrouter_reset();
1580                 TAILQ_FOREACH_SAFE(dr, &V_nd_defrouter, dr_entry, next) {
1581                         defrtrlist_del(dr);
1582                 }
1583                 defrouter_select();
1584                 break;
1585         }
1586         case SIOCGNBRINFO_IN6:
1587         {
1588                 struct llentry *ln;
1589                 struct in6_addr nb_addr = nbi->addr; /* make local for safety */
1590
1591                 if ((error = in6_setscope(&nb_addr, ifp, NULL)) != 0)
1592                         return (error);
1593
1594                 IF_AFDATA_RLOCK(ifp);
1595                 ln = nd6_lookup(&nb_addr, 0, ifp);
1596                 IF_AFDATA_RUNLOCK(ifp);
1597
1598                 if (ln == NULL) {
1599                         error = EINVAL;
1600                         break;
1601                 }
1602                 nbi->state = ln->ln_state;
1603                 nbi->asked = ln->la_asked;
1604                 nbi->isrouter = ln->ln_router;
1605                 if (ln->la_expire == 0)
1606                         nbi->expire = 0;
1607                 else
1608                         nbi->expire = ln->la_expire +
1609                             (time_second - time_uptime);
1610                 LLE_RUNLOCK(ln);
1611                 break;
1612         }
1613         case SIOCGDEFIFACE_IN6: /* XXX: should be implemented as a sysctl? */
1614                 ndif->ifindex = V_nd6_defifindex;
1615                 break;
1616         case SIOCSDEFIFACE_IN6: /* XXX: should be implemented as a sysctl? */
1617                 return (nd6_setdefaultiface(ndif->ifindex));
1618         }
1619         return (error);
1620 }
1621
1622 /*
1623  * Create neighbor cache entry and cache link-layer address,
1624  * on reception of inbound ND6 packets.  (RS/RA/NS/redirect)
1625  *
1626  * type - ICMP6 type
1627  * code - type dependent information
1628  *
1629  * XXXXX
1630  *  The caller of this function already acquired the ndp 
1631  *  cache table lock because the cache entry is returned.
1632  */
1633 struct llentry *
1634 nd6_cache_lladdr(struct ifnet *ifp, struct in6_addr *from, char *lladdr,
1635     int lladdrlen, int type, int code)
1636 {
1637         struct llentry *ln = NULL, *ln_tmp;
1638         int is_newentry;
1639         int do_update;
1640         int olladdr;
1641         int llchange;
1642         int flags;
1643         int newstate = 0;
1644         uint16_t router = 0;
1645         struct sockaddr_in6 sin6;
1646         struct mbuf *chain = NULL;
1647         int static_route = 0;
1648
1649         IF_AFDATA_UNLOCK_ASSERT(ifp);
1650
1651         KASSERT(ifp != NULL, ("%s: ifp == NULL", __func__));
1652         KASSERT(from != NULL, ("%s: from == NULL", __func__));
1653
1654         /* nothing must be updated for unspecified address */
1655         if (IN6_IS_ADDR_UNSPECIFIED(from))
1656                 return NULL;
1657
1658         /*
1659          * Validation about ifp->if_addrlen and lladdrlen must be done in
1660          * the caller.
1661          *
1662          * XXX If the link does not have link-layer adderss, what should
1663          * we do? (ifp->if_addrlen == 0)
1664          * Spec says nothing in sections for RA, RS and NA.  There's small
1665          * description on it in NS section (RFC 2461 7.2.3).
1666          */
1667         flags = lladdr ? ND6_EXCLUSIVE : 0;
1668         IF_AFDATA_RLOCK(ifp);
1669         ln = nd6_lookup(from, flags, ifp);
1670         IF_AFDATA_RUNLOCK(ifp);
1671         is_newentry = 0;
1672         if (ln == NULL) {
1673                 flags |= ND6_EXCLUSIVE;
1674                 ln = nd6_alloc(from, 0, ifp);
1675                 if (ln == NULL)
1676                         return (NULL);
1677                 IF_AFDATA_WLOCK(ifp);
1678                 LLE_WLOCK(ln);
1679                 /* Prefer any existing lle over newly-created one */
1680                 ln_tmp = nd6_lookup(from, ND6_EXCLUSIVE, ifp);
1681                 if (ln_tmp == NULL)
1682                         lltable_link_entry(LLTABLE6(ifp), ln);
1683                 IF_AFDATA_WUNLOCK(ifp);
1684                 if (ln_tmp == NULL)
1685                         /* No existing lle, mark as new entry */
1686                         is_newentry = 1;
1687                 else {
1688                         lltable_free_entry(LLTABLE6(ifp), ln);
1689                         ln = ln_tmp;
1690                         ln_tmp = NULL;
1691                 }
1692         } 
1693         /* do nothing if static ndp is set */
1694         if ((ln->la_flags & LLE_STATIC)) {
1695                         static_route = 1;
1696                         goto done;
1697         }
1698
1699         olladdr = (ln->la_flags & LLE_VALID) ? 1 : 0;
1700         if (olladdr && lladdr) {
1701                 llchange = bcmp(lladdr, &ln->ll_addr,
1702                     ifp->if_addrlen);
1703         } else
1704                 llchange = 0;
1705
1706         /*
1707          * newentry olladdr  lladdr  llchange   (*=record)
1708          *      0       n       n       --      (1)
1709          *      0       y       n       --      (2)
1710          *      0       n       y       --      (3) * STALE
1711          *      0       y       y       n       (4) *
1712          *      0       y       y       y       (5) * STALE
1713          *      1       --      n       --      (6)   NOSTATE(= PASSIVE)
1714          *      1       --      y       --      (7) * STALE
1715          */
1716
1717         if (lladdr) {           /* (3-5) and (7) */
1718                 /*
1719                  * Record source link-layer address
1720                  * XXX is it dependent to ifp->if_type?
1721                  */
1722                 bcopy(lladdr, &ln->ll_addr, ifp->if_addrlen);
1723                 ln->la_flags |= LLE_VALID;
1724                 EVENTHANDLER_INVOKE(lle_event, ln, LLENTRY_RESOLVED);
1725         }
1726
1727         if (!is_newentry) {
1728                 if ((!olladdr && lladdr != NULL) ||     /* (3) */
1729                     (olladdr && lladdr != NULL && llchange)) {  /* (5) */
1730                         do_update = 1;
1731                         newstate = ND6_LLINFO_STALE;
1732                 } else                                  /* (1-2,4) */
1733                         do_update = 0;
1734         } else {
1735                 do_update = 1;
1736                 if (lladdr == NULL)                     /* (6) */
1737                         newstate = ND6_LLINFO_NOSTATE;
1738                 else                                    /* (7) */
1739                         newstate = ND6_LLINFO_STALE;
1740         }
1741
1742         if (do_update) {
1743                 /*
1744                  * Update the state of the neighbor cache.
1745                  */
1746                 ln->ln_state = newstate;
1747
1748                 if (ln->ln_state == ND6_LLINFO_STALE) {
1749                         if (ln->la_hold != NULL)
1750                                 nd6_grab_holdchain(ln, &chain, &sin6);
1751                 } else if (ln->ln_state == ND6_LLINFO_INCOMPLETE) {
1752                         /* probe right away */
1753                         nd6_llinfo_settimer_locked((void *)ln, 0);
1754                 }
1755         }
1756
1757         /*
1758          * ICMP6 type dependent behavior.
1759          *
1760          * NS: clear IsRouter if new entry
1761          * RS: clear IsRouter
1762          * RA: set IsRouter if there's lladdr
1763          * redir: clear IsRouter if new entry
1764          *
1765          * RA case, (1):
1766          * The spec says that we must set IsRouter in the following cases:
1767          * - If lladdr exist, set IsRouter.  This means (1-5).
1768          * - If it is old entry (!newentry), set IsRouter.  This means (7).
1769          * So, based on the spec, in (1-5) and (7) cases we must set IsRouter.
1770          * A quetion arises for (1) case.  (1) case has no lladdr in the
1771          * neighbor cache, this is similar to (6).
1772          * This case is rare but we figured that we MUST NOT set IsRouter.
1773          *
1774          * newentry olladdr  lladdr  llchange       NS  RS  RA  redir
1775          *                                                      D R
1776          *      0       n       n       --      (1)     c   ?     s
1777          *      0       y       n       --      (2)     c   s     s
1778          *      0       n       y       --      (3)     c   s     s
1779          *      0       y       y       n       (4)     c   s     s
1780          *      0       y       y       y       (5)     c   s     s
1781          *      1       --      n       --      (6) c   c       c s
1782          *      1       --      y       --      (7) c   c   s   c s
1783          *
1784          *                                      (c=clear s=set)
1785          */
1786         switch (type & 0xff) {
1787         case ND_NEIGHBOR_SOLICIT:
1788                 /*
1789                  * New entry must have is_router flag cleared.
1790                  */
1791                 if (is_newentry)        /* (6-7) */
1792                         ln->ln_router = 0;
1793                 break;
1794         case ND_REDIRECT:
1795                 /*
1796                  * If the icmp is a redirect to a better router, always set the
1797                  * is_router flag.  Otherwise, if the entry is newly created,
1798                  * clear the flag.  [RFC 2461, sec 8.3]
1799                  */
1800                 if (code == ND_REDIRECT_ROUTER)
1801                         ln->ln_router = 1;
1802                 else if (is_newentry) /* (6-7) */
1803                         ln->ln_router = 0;
1804                 break;
1805         case ND_ROUTER_SOLICIT:
1806                 /*
1807                  * is_router flag must always be cleared.
1808                  */
1809                 ln->ln_router = 0;
1810                 break;
1811         case ND_ROUTER_ADVERT:
1812                 /*
1813                  * Mark an entry with lladdr as a router.
1814                  */
1815                 if ((!is_newentry && (olladdr || lladdr)) ||    /* (2-5) */
1816                     (is_newentry && lladdr)) {                  /* (7) */
1817                         ln->ln_router = 1;
1818                 }
1819                 break;
1820         }
1821
1822         if (ln != NULL) {
1823                 static_route = (ln->la_flags & LLE_STATIC);
1824                 router = ln->ln_router;
1825
1826                 if (flags & ND6_EXCLUSIVE)
1827                         LLE_WUNLOCK(ln);
1828                 else
1829                         LLE_RUNLOCK(ln);
1830                 if (static_route)
1831                         ln = NULL;
1832         }
1833         if (chain != NULL)
1834                 nd6_flush_holdchain(ifp, ifp, chain, &sin6);
1835         
1836         /*
1837          * When the link-layer address of a router changes, select the
1838          * best router again.  In particular, when the neighbor entry is newly
1839          * created, it might affect the selection policy.
1840          * Question: can we restrict the first condition to the "is_newentry"
1841          * case?
1842          * XXX: when we hear an RA from a new router with the link-layer
1843          * address option, defrouter_select() is called twice, since
1844          * defrtrlist_update called the function as well.  However, I believe
1845          * we can compromise the overhead, since it only happens the first
1846          * time.
1847          * XXX: although defrouter_select() should not have a bad effect
1848          * for those are not autoconfigured hosts, we explicitly avoid such
1849          * cases for safety.
1850          */
1851         if (do_update && router &&
1852             ND_IFINFO(ifp)->flags & ND6_IFF_ACCEPT_RTADV) {
1853                 /*
1854                  * guaranteed recursion
1855                  */
1856                 defrouter_select();
1857         }
1858         
1859         return (ln);
1860 done:   
1861         if (ln != NULL) {
1862                 if (flags & ND6_EXCLUSIVE)
1863                         LLE_WUNLOCK(ln);
1864                 else
1865                         LLE_RUNLOCK(ln);
1866                 if (static_route)
1867                         ln = NULL;
1868         }
1869         return (ln);
1870 }
1871
1872 static void
1873 nd6_slowtimo(void *arg)
1874 {
1875         CURVNET_SET((struct vnet *) arg);
1876         struct nd_ifinfo *nd6if;
1877         struct ifnet *ifp;
1878
1879         callout_reset(&V_nd6_slowtimo_ch, ND6_SLOWTIMER_INTERVAL * hz,
1880             nd6_slowtimo, curvnet);
1881         IFNET_RLOCK_NOSLEEP();
1882         TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
1883                 if (ifp->if_afdata[AF_INET6] == NULL)
1884                         continue;
1885                 nd6if = ND_IFINFO(ifp);
1886                 if (nd6if->basereachable && /* already initialized */
1887                     (nd6if->recalctm -= ND6_SLOWTIMER_INTERVAL) <= 0) {
1888                         /*
1889                          * Since reachable time rarely changes by router
1890                          * advertisements, we SHOULD insure that a new random
1891                          * value gets recomputed at least once every few hours.
1892                          * (RFC 2461, 6.3.4)
1893                          */
1894                         nd6if->recalctm = V_nd6_recalc_reachtm_interval;
1895                         nd6if->reachable = ND_COMPUTE_RTIME(nd6if->basereachable);
1896                 }
1897         }
1898         IFNET_RUNLOCK_NOSLEEP();
1899         CURVNET_RESTORE();
1900 }
1901
1902 void
1903 nd6_grab_holdchain(struct llentry *ln, struct mbuf **chain,
1904     struct sockaddr_in6 *sin6)
1905 {
1906
1907         LLE_WLOCK_ASSERT(ln);
1908
1909         *chain = ln->la_hold;
1910         ln->la_hold = NULL;
1911         lltable_fill_sa_entry(ln, (struct sockaddr *)sin6);
1912
1913         if (ln->ln_state == ND6_LLINFO_STALE) {
1914
1915                 /*
1916                  * The first time we send a packet to a
1917                  * neighbor whose entry is STALE, we have
1918                  * to change the state to DELAY and a sets
1919                  * a timer to expire in DELAY_FIRST_PROBE_TIME
1920                  * seconds to ensure do neighbor unreachability
1921                  * detection on expiration.
1922                  * (RFC 2461 7.3.3)
1923                  */
1924                 ln->la_asked = 0;
1925                 ln->ln_state = ND6_LLINFO_DELAY;
1926                 nd6_llinfo_settimer_locked(ln, (long)V_nd6_delay * hz);
1927         }
1928 }
1929
1930 static int
1931 nd6_output_ifp(struct ifnet *ifp, struct ifnet *origifp, struct mbuf *m,
1932     struct sockaddr_in6 *dst)
1933 {
1934         int error;
1935         int ip6len;
1936         struct ip6_hdr *ip6;
1937         struct m_tag *mtag;
1938
1939 #ifdef MAC
1940         mac_netinet6_nd6_send(ifp, m);
1941 #endif
1942
1943         /*
1944          * If called from nd6_ns_output() (NS), nd6_na_output() (NA),
1945          * icmp6_redirect_output() (REDIRECT) or from rip6_output() (RS, RA
1946          * as handled by rtsol and rtadvd), mbufs will be tagged for SeND
1947          * to be diverted to user space.  When re-injected into the kernel,
1948          * send_output() will directly dispatch them to the outgoing interface.
1949          */
1950         if (send_sendso_input_hook != NULL) {
1951                 mtag = m_tag_find(m, PACKET_TAG_ND_OUTGOING, NULL);
1952                 if (mtag != NULL) {
1953                         ip6 = mtod(m, struct ip6_hdr *);
1954                         ip6len = sizeof(struct ip6_hdr) + ntohs(ip6->ip6_plen);
1955                         /* Use the SEND socket */
1956                         error = send_sendso_input_hook(m, ifp, SND_OUT,
1957                             ip6len);
1958                         /* -1 == no app on SEND socket */
1959                         if (error == 0 || error != -1)
1960                             return (error);
1961                 }
1962         }
1963
1964         m_clrprotoflags(m);     /* Avoid confusing lower layers. */
1965         IP_PROBE(send, NULL, NULL, mtod(m, struct ip6_hdr *), ifp, NULL,
1966             mtod(m, struct ip6_hdr *));
1967
1968         if ((ifp->if_flags & IFF_LOOPBACK) == 0)
1969                 origifp = ifp;
1970
1971         error = (*ifp->if_output)(origifp, m, (struct sockaddr *)dst, NULL);
1972         return (error);
1973 }
1974
1975 /*
1976  * IPv6 packet output - light version.
1977  * Checks if destination LLE exists and is in proper state
1978  * (e.g no modification required). If not true, fall back to
1979  * "heavy" version.
1980  */
1981 int
1982 nd6_output(struct ifnet *ifp, struct ifnet *origifp, struct mbuf *m,
1983     struct sockaddr_in6 *dst, struct rtentry *rt0)
1984 {
1985         struct llentry *ln = NULL;
1986
1987         /* discard the packet if IPv6 operation is disabled on the interface */
1988         if ((ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED)) {
1989                 m_freem(m);
1990                 return (ENETDOWN); /* better error? */
1991         }
1992
1993         if (IN6_IS_ADDR_MULTICAST(&dst->sin6_addr))
1994                 goto sendpkt;
1995
1996         if (nd6_need_cache(ifp) == 0)
1997                 goto sendpkt;
1998
1999         IF_AFDATA_RLOCK(ifp);
2000         ln = nd6_lookup(&dst->sin6_addr, 0, ifp);
2001         IF_AFDATA_RUNLOCK(ifp);
2002
2003         /*
2004          * Perform fast path for the following cases:
2005          * 1) lle state is REACHABLE
2006          * 2) lle state is DELAY (NS message sentNS message sent)
2007          *
2008          * Every other case involves lle modification, so we handle
2009          * them separately.
2010          */
2011         if (ln == NULL || (ln->ln_state != ND6_LLINFO_REACHABLE &&
2012             ln->ln_state != ND6_LLINFO_DELAY)) {
2013                 /* Fall back to slow processing path */
2014                 if (ln != NULL)
2015                         LLE_RUNLOCK(ln);
2016                 return (nd6_output_lle(ifp, origifp, m, dst));
2017         }
2018
2019 sendpkt:
2020         if (ln != NULL)
2021                 LLE_RUNLOCK(ln);
2022
2023         return (nd6_output_ifp(ifp, origifp, m, dst));
2024 }
2025
2026
2027 /*
2028  * Output IPv6 packet - heavy version.
2029  * Function assume that either
2030  * 1) destination LLE does not exist, is invalid or stale, so
2031  *   ND6_EXCLUSIVE lock needs to be acquired
2032  * 2) destination lle is provided (with ND6_EXCLUSIVE lock),
2033  *   in that case packets are queued in &chain.
2034  *
2035  */
2036 static int
2037 nd6_output_lle(struct ifnet *ifp, struct ifnet *origifp, struct mbuf *m,
2038     struct sockaddr_in6 *dst)
2039 {
2040         struct llentry *lle = NULL, *lle_tmp;
2041
2042         KASSERT(m != NULL, ("NULL mbuf, nothing to send"));
2043         /* discard the packet if IPv6 operation is disabled on the interface */
2044         if ((ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED)) {
2045                 m_freem(m);
2046                 return (ENETDOWN); /* better error? */
2047         }
2048
2049         if (IN6_IS_ADDR_MULTICAST(&dst->sin6_addr))
2050                 goto sendpkt;
2051
2052         if (nd6_need_cache(ifp) == 0)
2053                 goto sendpkt;
2054
2055         /*
2056          * Address resolution or Neighbor Unreachability Detection
2057          * for the next hop.
2058          * At this point, the destination of the packet must be a unicast
2059          * or an anycast address(i.e. not a multicast).
2060          */
2061         if (lle == NULL) {
2062                 IF_AFDATA_RLOCK(ifp);
2063                 lle = nd6_lookup(&dst->sin6_addr, ND6_EXCLUSIVE, ifp);
2064                 IF_AFDATA_RUNLOCK(ifp);
2065                 if ((lle == NULL) && nd6_is_addr_neighbor(dst, ifp))  {
2066                         /*
2067                          * Since nd6_is_addr_neighbor() internally calls nd6_lookup(),
2068                          * the condition below is not very efficient.  But we believe
2069                          * it is tolerable, because this should be a rare case.
2070                          */
2071                         lle = nd6_alloc(&dst->sin6_addr, 0, ifp);
2072                         if (lle == NULL) {
2073                                 char ip6buf[INET6_ADDRSTRLEN];
2074                                 log(LOG_DEBUG,
2075                                     "nd6_output: can't allocate llinfo for %s "
2076                                     "(ln=%p)\n",
2077                                     ip6_sprintf(ip6buf, &dst->sin6_addr), lle);
2078                                 m_freem(m);
2079                                 return (ENOBUFS);
2080                         }
2081                         lle->ln_state = ND6_LLINFO_NOSTATE;
2082
2083                         IF_AFDATA_WLOCK(ifp);
2084                         LLE_WLOCK(lle);
2085                         /* Prefer any existing entry over newly-created one */
2086                         lle_tmp = nd6_lookup(&dst->sin6_addr, ND6_EXCLUSIVE, ifp);
2087                         if (lle_tmp == NULL)
2088                                 lltable_link_entry(LLTABLE6(ifp), lle);
2089                         IF_AFDATA_WUNLOCK(ifp);
2090                         if (lle_tmp != NULL) {
2091                                 lltable_free_entry(LLTABLE6(ifp), lle);
2092                                 lle = lle_tmp;
2093                                 lle_tmp = NULL;
2094                         }
2095                 }
2096         } 
2097         if (lle == NULL) {
2098                 if ((ifp->if_flags & IFF_POINTOPOINT) == 0 &&
2099                     !(ND_IFINFO(ifp)->flags & ND6_IFF_PERFORMNUD)) {
2100                         m_freem(m);
2101                         return (ENOBUFS);
2102                 }
2103                 goto sendpkt;   /* send anyway */
2104         }
2105
2106         LLE_WLOCK_ASSERT(lle);
2107
2108         /* We don't have to do link-layer address resolution on a p2p link. */
2109         if ((ifp->if_flags & IFF_POINTOPOINT) != 0 &&
2110             lle->ln_state < ND6_LLINFO_REACHABLE) {
2111                 lle->ln_state = ND6_LLINFO_STALE;
2112                 nd6_llinfo_settimer_locked(lle, (long)V_nd6_gctimer * hz);
2113         }
2114
2115         /*
2116          * The first time we send a packet to a neighbor whose entry is
2117          * STALE, we have to change the state to DELAY and a sets a timer to
2118          * expire in DELAY_FIRST_PROBE_TIME seconds to ensure do
2119          * neighbor unreachability detection on expiration.
2120          * (RFC 2461 7.3.3)
2121          */
2122         if (lle->ln_state == ND6_LLINFO_STALE) {
2123                 lle->la_asked = 0;
2124                 lle->ln_state = ND6_LLINFO_DELAY;
2125                 nd6_llinfo_settimer_locked(lle, (long)V_nd6_delay * hz);
2126         }
2127
2128         /*
2129          * If the neighbor cache entry has a state other than INCOMPLETE
2130          * (i.e. its link-layer address is already resolved), just
2131          * send the packet.
2132          */
2133         if (lle->ln_state > ND6_LLINFO_INCOMPLETE)
2134                 goto sendpkt;
2135
2136         /*
2137          * There is a neighbor cache entry, but no ethernet address
2138          * response yet.  Append this latest packet to the end of the
2139          * packet queue in the mbuf, unless the number of the packet
2140          * does not exceed nd6_maxqueuelen.  When it exceeds nd6_maxqueuelen,
2141          * the oldest packet in the queue will be removed.
2142          */
2143         if (lle->ln_state == ND6_LLINFO_NOSTATE)
2144                 lle->ln_state = ND6_LLINFO_INCOMPLETE;
2145
2146         if (lle->la_hold != NULL) {
2147                 struct mbuf *m_hold;
2148                 int i;
2149                 
2150                 i = 0;
2151                 for (m_hold = lle->la_hold; m_hold; m_hold = m_hold->m_nextpkt){
2152                         i++;
2153                         if (m_hold->m_nextpkt == NULL) {
2154                                 m_hold->m_nextpkt = m;
2155                                 break;
2156                         }
2157                 }
2158                 while (i >= V_nd6_maxqueuelen) {
2159                         m_hold = lle->la_hold;
2160                         lle->la_hold = lle->la_hold->m_nextpkt;
2161                         m_freem(m_hold);
2162                         i--;
2163                 }
2164         } else {
2165                 lle->la_hold = m;
2166         }
2167
2168         /*
2169          * If there has been no NS for the neighbor after entering the
2170          * INCOMPLETE state, send the first solicitation.
2171          */
2172         if (!ND6_LLINFO_PERMANENT(lle) && lle->la_asked == 0) {
2173                 lle->la_asked++;
2174                 
2175                 nd6_llinfo_settimer_locked(lle,
2176                     (long)ND_IFINFO(ifp)->retrans * hz / 1000);
2177                 LLE_WUNLOCK(lle);
2178                 nd6_ns_output(ifp, NULL, &dst->sin6_addr, lle, NULL);
2179         } else {
2180                 /* We did the lookup so we need to do the unlock here. */
2181                 LLE_WUNLOCK(lle);
2182         }
2183
2184         return (0);
2185
2186   sendpkt:
2187         if (lle != NULL)
2188                 LLE_WUNLOCK(lle);
2189
2190         return (nd6_output_ifp(ifp, origifp, m, dst));
2191 }
2192
2193
2194 int
2195 nd6_flush_holdchain(struct ifnet *ifp, struct ifnet *origifp, struct mbuf *chain,
2196     struct sockaddr_in6 *dst)
2197 {
2198         struct mbuf *m, *m_head;
2199         struct ifnet *outifp;
2200         int error = 0;
2201
2202         m_head = chain;
2203         if ((ifp->if_flags & IFF_LOOPBACK) != 0)
2204                 outifp = origifp;
2205         else
2206                 outifp = ifp;
2207         
2208         while (m_head) {
2209                 m = m_head;
2210                 m_head = m_head->m_nextpkt;
2211                 error = nd6_output_ifp(ifp, origifp, m, dst);
2212         }
2213
2214         /*
2215          * XXX
2216          * note that intermediate errors are blindly ignored - but this is 
2217          * the same convention as used with nd6_output when called by
2218          * nd6_cache_lladdr
2219          */
2220         return (error);
2221 }       
2222
2223
2224 int
2225 nd6_need_cache(struct ifnet *ifp)
2226 {
2227         /*
2228          * XXX: we currently do not make neighbor cache on any interface
2229          * other than ARCnet, Ethernet, FDDI and GIF.
2230          *
2231          * RFC2893 says:
2232          * - unidirectional tunnels needs no ND
2233          */
2234         switch (ifp->if_type) {
2235         case IFT_ARCNET:
2236         case IFT_ETHER:
2237         case IFT_FDDI:
2238         case IFT_IEEE1394:
2239         case IFT_L2VLAN:
2240         case IFT_IEEE80211:
2241         case IFT_INFINIBAND:
2242         case IFT_BRIDGE:
2243         case IFT_PROPVIRTUAL:
2244                 return (1);
2245         default:
2246                 return (0);
2247         }
2248 }
2249
2250 /*
2251  * Add pernament ND6 link-layer record for given
2252  * interface address.
2253  *
2254  * Very similar to IPv4 arp_ifinit(), but:
2255  * 1) IPv6 DAD is performed in different place
2256  * 2) It is called by IPv6 protocol stack in contrast to
2257  * arp_ifinit() which is typically called in SIOCSIFADDR
2258  * driver ioctl handler.
2259  *
2260  */
2261 int
2262 nd6_add_ifa_lle(struct in6_ifaddr *ia)
2263 {
2264         struct ifnet *ifp;
2265         struct llentry *ln, *ln_tmp;
2266         struct sockaddr *dst;
2267
2268         ifp = ia->ia_ifa.ifa_ifp;
2269         if (nd6_need_cache(ifp) == 0)
2270                 return (0);
2271
2272         ia->ia_ifa.ifa_rtrequest = nd6_rtrequest;
2273         dst = (struct sockaddr *)&ia->ia_addr;
2274         ln = lltable_alloc_entry(LLTABLE6(ifp), LLE_IFADDR, dst);
2275         if (ln == NULL)
2276                 return (ENOBUFS);
2277
2278         ln->la_expire = 0;  /* for IPv6 this means permanent */
2279         ln->ln_state = ND6_LLINFO_REACHABLE;
2280
2281         IF_AFDATA_WLOCK(ifp);
2282         LLE_WLOCK(ln);
2283         /* Unlink any entry if exists */
2284         ln_tmp = lla_lookup(LLTABLE6(ifp), LLE_EXCLUSIVE, dst);
2285         if (ln_tmp != NULL)
2286                 lltable_unlink_entry(LLTABLE6(ifp), ln_tmp);
2287         lltable_link_entry(LLTABLE6(ifp), ln);
2288         IF_AFDATA_WUNLOCK(ifp);
2289
2290         if (ln_tmp != NULL)
2291                 EVENTHANDLER_INVOKE(lle_event, ln_tmp, LLENTRY_EXPIRED);
2292         EVENTHANDLER_INVOKE(lle_event, ln, LLENTRY_RESOLVED);
2293
2294         LLE_WUNLOCK(ln);
2295         if (ln_tmp != NULL)
2296                 llentry_free(ln_tmp);
2297
2298         return (0);
2299 }
2300
2301 /*
2302  * Removes ALL lle records for interface address prefix.
2303  * XXXME: That's probably not we really want to do, we need
2304  * to remove address record only and keep other records
2305  * until we determine if given prefix is really going 
2306  * to be removed.
2307  */
2308 void
2309 nd6_rem_ifa_lle(struct in6_ifaddr *ia)
2310 {
2311         struct sockaddr_in6 mask, addr;
2312         struct ifnet *ifp;
2313
2314         ifp = ia->ia_ifa.ifa_ifp;
2315         memcpy(&addr, &ia->ia_addr, sizeof(ia->ia_addr));
2316         memcpy(&mask, &ia->ia_prefixmask, sizeof(ia->ia_prefixmask));
2317         lltable_prefix_free(AF_INET6, (struct sockaddr *)&addr,
2318                     (struct sockaddr *)&mask, LLE_STATIC);
2319 }
2320
2321 /*
2322  * the callers of this function need to be re-worked to drop
2323  * the lle lock, drop here for now
2324  */
2325 int
2326 nd6_storelladdr(struct ifnet *ifp, struct mbuf *m,
2327     const struct sockaddr *dst, u_char *desten, uint32_t *pflags)
2328 {
2329         struct llentry *ln;
2330
2331         if (pflags != NULL)
2332                 *pflags = 0;
2333         IF_AFDATA_UNLOCK_ASSERT(ifp);
2334         if (m != NULL && m->m_flags & M_MCAST) {
2335                 switch (ifp->if_type) {
2336                 case IFT_ETHER:
2337                 case IFT_FDDI:
2338                 case IFT_L2VLAN:
2339                 case IFT_IEEE80211:
2340                 case IFT_BRIDGE:
2341                 case IFT_ISO88025:
2342                         ETHER_MAP_IPV6_MULTICAST(&SIN6(dst)->sin6_addr,
2343                                                  desten);
2344                         return (0);
2345                 default:
2346                         m_freem(m);
2347                         return (EAFNOSUPPORT);
2348                 }
2349         }
2350
2351
2352         /*
2353          * the entry should have been created in nd6_store_lladdr
2354          */
2355         IF_AFDATA_RLOCK(ifp);
2356         ln = lla_lookup(LLTABLE6(ifp), 0, dst);
2357         IF_AFDATA_RUNLOCK(ifp);
2358         if ((ln == NULL) || !(ln->la_flags & LLE_VALID)) {
2359                 if (ln != NULL)
2360                         LLE_RUNLOCK(ln);
2361                 /* this could happen, if we could not allocate memory */
2362                 m_freem(m);
2363                 return (1);
2364         }
2365
2366         bcopy(&ln->ll_addr, desten, ifp->if_addrlen);
2367         if (pflags != NULL)
2368                 *pflags = ln->la_flags;
2369         LLE_RUNLOCK(ln);
2370         /*
2371          * A *small* use after free race exists here
2372          */
2373         return (0);
2374 }
2375
2376 static void 
2377 clear_llinfo_pqueue(struct llentry *ln)
2378 {
2379         struct mbuf *m_hold, *m_hold_next;
2380
2381         for (m_hold = ln->la_hold; m_hold; m_hold = m_hold_next) {
2382                 m_hold_next = m_hold->m_nextpkt;
2383                 m_freem(m_hold);
2384         }
2385
2386         ln->la_hold = NULL;
2387         return;
2388 }
2389
2390 static int nd6_sysctl_drlist(SYSCTL_HANDLER_ARGS);
2391 static int nd6_sysctl_prlist(SYSCTL_HANDLER_ARGS);
2392 #ifdef SYSCTL_DECL
2393 SYSCTL_DECL(_net_inet6_icmp6);
2394 #endif
2395 SYSCTL_NODE(_net_inet6_icmp6, ICMPV6CTL_ND6_DRLIST, nd6_drlist,
2396         CTLFLAG_RD, nd6_sysctl_drlist, "");
2397 SYSCTL_NODE(_net_inet6_icmp6, ICMPV6CTL_ND6_PRLIST, nd6_prlist,
2398         CTLFLAG_RD, nd6_sysctl_prlist, "");
2399 SYSCTL_INT(_net_inet6_icmp6, ICMPV6CTL_ND6_MAXQLEN, nd6_maxqueuelen,
2400         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_maxqueuelen), 1, "");
2401 SYSCTL_INT(_net_inet6_icmp6, OID_AUTO, nd6_gctimer,
2402         CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(nd6_gctimer), (60 * 60 * 24), "");
2403
2404 static int
2405 nd6_sysctl_drlist(SYSCTL_HANDLER_ARGS)
2406 {
2407         struct in6_defrouter d;
2408         struct nd_defrouter *dr;
2409         int error;
2410
2411         if (req->newptr)
2412                 return (EPERM);
2413
2414         bzero(&d, sizeof(d));
2415         d.rtaddr.sin6_family = AF_INET6;
2416         d.rtaddr.sin6_len = sizeof(d.rtaddr);
2417
2418         /*
2419          * XXX locking
2420          */
2421         TAILQ_FOREACH(dr, &V_nd_defrouter, dr_entry) {
2422                 d.rtaddr.sin6_addr = dr->rtaddr;
2423                 error = sa6_recoverscope(&d.rtaddr);
2424                 if (error != 0)
2425                         return (error);
2426                 d.flags = dr->flags;
2427                 d.rtlifetime = dr->rtlifetime;
2428                 d.expire = dr->expire + (time_second - time_uptime);
2429                 d.if_index = dr->ifp->if_index;
2430                 error = SYSCTL_OUT(req, &d, sizeof(d));
2431                 if (error != 0)
2432                         return (error);
2433         }
2434         return (0);
2435 }
2436
2437 static int
2438 nd6_sysctl_prlist(SYSCTL_HANDLER_ARGS)
2439 {
2440         struct in6_prefix p;
2441         struct sockaddr_in6 s6;
2442         struct nd_prefix *pr;
2443         struct nd_pfxrouter *pfr;
2444         time_t maxexpire;
2445         int error;
2446         char ip6buf[INET6_ADDRSTRLEN];
2447
2448         if (req->newptr)
2449                 return (EPERM);
2450
2451         bzero(&p, sizeof(p));
2452         p.origin = PR_ORIG_RA;
2453         bzero(&s6, sizeof(s6));
2454         s6.sin6_family = AF_INET6;
2455         s6.sin6_len = sizeof(s6);
2456
2457         /*
2458          * XXX locking
2459          */
2460         LIST_FOREACH(pr, &V_nd_prefix, ndpr_entry) {
2461                 p.prefix = pr->ndpr_prefix;
2462                 if (sa6_recoverscope(&p.prefix)) {
2463                         log(LOG_ERR, "scope error in prefix list (%s)\n",
2464                             ip6_sprintf(ip6buf, &p.prefix.sin6_addr));
2465                         /* XXX: press on... */
2466                 }
2467                 p.raflags = pr->ndpr_raf;
2468                 p.prefixlen = pr->ndpr_plen;
2469                 p.vltime = pr->ndpr_vltime;
2470                 p.pltime = pr->ndpr_pltime;
2471                 p.if_index = pr->ndpr_ifp->if_index;
2472                 if (pr->ndpr_vltime == ND6_INFINITE_LIFETIME)
2473                         p.expire = 0;
2474                 else {
2475                         /* XXX: we assume time_t is signed. */
2476                         maxexpire = (-1) &
2477                             ~((time_t)1 << ((sizeof(maxexpire) * 8) - 1));
2478                         if (pr->ndpr_vltime < maxexpire - pr->ndpr_lastupdate)
2479                                 p.expire = pr->ndpr_lastupdate +
2480                                     pr->ndpr_vltime +
2481                                     (time_second - time_uptime);
2482                         else
2483                                 p.expire = maxexpire;
2484                 }
2485                 p.refcnt = pr->ndpr_refcnt;
2486                 p.flags = pr->ndpr_stateflags;
2487                 p.advrtrs = 0;
2488                 LIST_FOREACH(pfr, &pr->ndpr_advrtrs, pfr_entry)
2489                         p.advrtrs++;
2490                 error = SYSCTL_OUT(req, &p, sizeof(p));
2491                 if (error != 0)
2492                         return (error);
2493                 LIST_FOREACH(pfr, &pr->ndpr_advrtrs, pfr_entry) {
2494                         s6.sin6_addr = pfr->router->rtaddr;
2495                         if (sa6_recoverscope(&s6))
2496                                 log(LOG_ERR,
2497                                     "scope error in prefix list (%s)\n",
2498                                     ip6_sprintf(ip6buf, &pfr->router->rtaddr));
2499                         error = SYSCTL_OUT(req, &s6, sizeof(s6));
2500                         if (error != 0)
2501                                 return (error);
2502                 }
2503         }
2504         return (0);
2505 }