]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/netinet6/nd6_nbr.c
Store addresses instead of sockaddrs inside llentry.
[FreeBSD/FreeBSD.git] / sys / netinet6 / nd6_nbr.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_nbr.c,v 1.86 2002/01/21 02:33:04 jinmei Exp $
30  */
31
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
34
35 #include "opt_inet.h"
36 #include "opt_inet6.h"
37 #include "opt_ipsec.h"
38 #include "opt_mpath.h"
39
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/malloc.h>
43 #include <sys/libkern.h>
44 #include <sys/lock.h>
45 #include <sys/rwlock.h>
46 #include <sys/mbuf.h>
47 #include <sys/socket.h>
48 #include <sys/sockio.h>
49 #include <sys/time.h>
50 #include <sys/kernel.h>
51 #include <sys/errno.h>
52 #include <sys/sysctl.h>
53 #include <sys/syslog.h>
54 #include <sys/queue.h>
55 #include <sys/callout.h>
56 #include <sys/refcount.h>
57
58 #include <net/if.h>
59 #include <net/if_types.h>
60 #include <net/if_dl.h>
61 #include <net/if_var.h>
62 #include <net/route.h>
63 #ifdef RADIX_MPATH
64 #include <net/radix_mpath.h>
65 #endif
66 #include <net/vnet.h>
67
68 #include <netinet/in.h>
69 #include <netinet/in_var.h>
70 #include <net/if_llatbl.h>
71 #include <netinet6/in6_var.h>
72 #include <netinet6/in6_ifattach.h>
73 #include <netinet/ip6.h>
74 #include <netinet6/ip6_var.h>
75 #include <netinet6/scope6_var.h>
76 #include <netinet6/nd6.h>
77 #include <netinet/icmp6.h>
78 #include <netinet/ip_carp.h>
79 #include <netinet6/send.h>
80
81 #define SDL(s) ((struct sockaddr_dl *)s)
82
83 struct dadq;
84 static struct dadq *nd6_dad_find(struct ifaddr *, struct nd_opt_nonce *);
85 static void nd6_dad_add(struct dadq *dp);
86 static void nd6_dad_del(struct dadq *dp);
87 static void nd6_dad_rele(struct dadq *);
88 static void nd6_dad_starttimer(struct dadq *, int);
89 static void nd6_dad_stoptimer(struct dadq *);
90 static void nd6_dad_timer(struct dadq *);
91 static void nd6_dad_duplicated(struct ifaddr *, struct dadq *);
92 static void nd6_dad_ns_output(struct dadq *, struct ifaddr *);
93 static void nd6_dad_ns_input(struct ifaddr *, struct nd_opt_nonce *);
94 static void nd6_dad_na_input(struct ifaddr *);
95 static void nd6_na_output_fib(struct ifnet *, const struct in6_addr *,
96     const struct in6_addr *, u_long, int, struct sockaddr *, u_int);
97 static void nd6_ns_output_fib(struct ifnet *, const struct in6_addr *,
98     const struct in6_addr *, struct llentry *, uint8_t *, u_int);
99
100 static VNET_DEFINE(int, dad_enhanced) = 1;
101 #define V_dad_enhanced                  VNET(dad_enhanced)
102
103 SYSCTL_DECL(_net_inet6_ip6);
104 SYSCTL_INT(_net_inet6_ip6, OID_AUTO, dad_enhanced, CTLFLAG_VNET | CTLFLAG_RW,
105     &VNET_NAME(dad_enhanced), 0,
106     "Enable Enhanced DAD, which adds a random nonce to NS messages for DAD.");
107
108 static VNET_DEFINE(int, dad_maxtry) = 15;       /* max # of *tries* to
109                                                    transmit DAD packet */
110 #define V_dad_maxtry                    VNET(dad_maxtry)
111
112 /*
113  * Input a Neighbor Solicitation Message.
114  *
115  * Based on RFC 2461
116  * Based on RFC 2462 (duplicate address detection)
117  */
118 void
119 nd6_ns_input(struct mbuf *m, int off, int icmp6len)
120 {
121         struct ifnet *ifp = m->m_pkthdr.rcvif;
122         struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
123         struct nd_neighbor_solicit *nd_ns;
124         struct in6_addr saddr6 = ip6->ip6_src;
125         struct in6_addr daddr6 = ip6->ip6_dst;
126         struct in6_addr taddr6;
127         struct in6_addr myaddr6;
128         char *lladdr = NULL;
129         struct ifaddr *ifa = NULL;
130         int lladdrlen = 0;
131         int anycast = 0, proxy = 0, tentative = 0;
132         int tlladdr;
133         int rflag;
134         union nd_opts ndopts;
135         struct sockaddr_dl proxydl;
136         char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN];
137
138         rflag = (V_ip6_forwarding) ? ND_NA_FLAG_ROUTER : 0;
139         if (ND_IFINFO(ifp)->flags & ND6_IFF_ACCEPT_RTADV && V_ip6_norbit_raif)
140                 rflag = 0;
141 #ifndef PULLDOWN_TEST
142         IP6_EXTHDR_CHECK(m, off, icmp6len,);
143         nd_ns = (struct nd_neighbor_solicit *)((caddr_t)ip6 + off);
144 #else
145         IP6_EXTHDR_GET(nd_ns, struct nd_neighbor_solicit *, m, off, icmp6len);
146         if (nd_ns == NULL) {
147                 ICMP6STAT_INC(icp6s_tooshort);
148                 return;
149         }
150 #endif
151         ip6 = mtod(m, struct ip6_hdr *); /* adjust pointer for safety */
152         taddr6 = nd_ns->nd_ns_target;
153         if (in6_setscope(&taddr6, ifp, NULL) != 0)
154                 goto bad;
155
156         if (ip6->ip6_hlim != 255) {
157                 nd6log((LOG_ERR,
158                     "nd6_ns_input: invalid hlim (%d) from %s to %s on %s\n",
159                     ip6->ip6_hlim, ip6_sprintf(ip6bufs, &ip6->ip6_src),
160                     ip6_sprintf(ip6bufd, &ip6->ip6_dst), if_name(ifp)));
161                 goto bad;
162         }
163
164         if (IN6_IS_ADDR_UNSPECIFIED(&saddr6)) {
165                 /* dst has to be a solicited node multicast address. */
166                 if (daddr6.s6_addr16[0] == IPV6_ADDR_INT16_MLL &&
167                     /* don't check ifindex portion */
168                     daddr6.s6_addr32[1] == 0 &&
169                     daddr6.s6_addr32[2] == IPV6_ADDR_INT32_ONE &&
170                     daddr6.s6_addr8[12] == 0xff) {
171                         ; /* good */
172                 } else {
173                         nd6log((LOG_INFO, "nd6_ns_input: bad DAD packet "
174                             "(wrong ip6 dst)\n"));
175                         goto bad;
176                 }
177         } else if (!V_nd6_onlink_ns_rfc4861) {
178                 struct sockaddr_in6 src_sa6;
179
180                 /*
181                  * According to recent IETF discussions, it is not a good idea
182                  * to accept a NS from an address which would not be deemed
183                  * to be a neighbor otherwise.  This point is expected to be
184                  * clarified in future revisions of the specification.
185                  */
186                 bzero(&src_sa6, sizeof(src_sa6));
187                 src_sa6.sin6_family = AF_INET6;
188                 src_sa6.sin6_len = sizeof(src_sa6);
189                 src_sa6.sin6_addr = saddr6;
190                 if (nd6_is_addr_neighbor(&src_sa6, ifp) == 0) {
191                         nd6log((LOG_INFO, "nd6_ns_input: "
192                                 "NS packet from non-neighbor\n"));
193                         goto bad;
194                 }
195         }
196
197         if (IN6_IS_ADDR_MULTICAST(&taddr6)) {
198                 nd6log((LOG_INFO, "nd6_ns_input: bad NS target (multicast)\n"));
199                 goto bad;
200         }
201
202         icmp6len -= sizeof(*nd_ns);
203         nd6_option_init(nd_ns + 1, icmp6len, &ndopts);
204         if (nd6_options(&ndopts) < 0) {
205                 nd6log((LOG_INFO,
206                     "nd6_ns_input: invalid ND option, ignored\n"));
207                 /* nd6_options have incremented stats */
208                 goto freeit;
209         }
210
211         if (ndopts.nd_opts_src_lladdr) {
212                 lladdr = (char *)(ndopts.nd_opts_src_lladdr + 1);
213                 lladdrlen = ndopts.nd_opts_src_lladdr->nd_opt_len << 3;
214         }
215
216         if (IN6_IS_ADDR_UNSPECIFIED(&ip6->ip6_src) && lladdr) {
217                 nd6log((LOG_INFO, "nd6_ns_input: bad DAD packet "
218                     "(link-layer address option)\n"));
219                 goto bad;
220         }
221
222         /*
223          * Attaching target link-layer address to the NA?
224          * (RFC 2461 7.2.4)
225          *
226          * NS IP dst is unicast/anycast                 MUST NOT add
227          * NS IP dst is solicited-node multicast        MUST add
228          *
229          * In implementation, we add target link-layer address by default.
230          * We do not add one in MUST NOT cases.
231          */
232         if (!IN6_IS_ADDR_MULTICAST(&daddr6))
233                 tlladdr = 0;
234         else
235                 tlladdr = 1;
236
237         /*
238          * Target address (taddr6) must be either:
239          * (1) Valid unicast/anycast address for my receiving interface,
240          * (2) Unicast address for which I'm offering proxy service, or
241          * (3) "tentative" address on which DAD is being performed.
242          */
243         /* (1) and (3) check. */
244         if (ifp->if_carp)
245                 ifa = (*carp_iamatch6_p)(ifp, &taddr6);
246         else
247                 ifa = (struct ifaddr *)in6ifa_ifpwithaddr(ifp, &taddr6);
248
249         /* (2) check. */
250         if (ifa == NULL) {
251                 struct route_in6 ro;
252                 int need_proxy;
253
254                 bzero(&ro, sizeof(ro));
255                 ro.ro_dst.sin6_len = sizeof(struct sockaddr_in6);
256                 ro.ro_dst.sin6_family = AF_INET6;
257                 ro.ro_dst.sin6_addr = taddr6;
258
259                 /* Always use the default FIB. */
260 #ifdef RADIX_MPATH
261                 rtalloc_mpath_fib((struct route *)&ro, ntohl(taddr6.s6_addr32[3]),
262                     RT_DEFAULT_FIB);
263 #else
264                 in6_rtalloc(&ro, RT_DEFAULT_FIB);
265 #endif
266                 need_proxy = (ro.ro_rt &&
267                     (ro.ro_rt->rt_flags & RTF_ANNOUNCE) != 0 &&
268                     ro.ro_rt->rt_gateway->sa_family == AF_LINK);
269                 if (ro.ro_rt != NULL) {
270                         if (need_proxy)
271                                 proxydl = *SDL(ro.ro_rt->rt_gateway);
272                         RTFREE(ro.ro_rt);
273                 }
274                 if (need_proxy) {
275                         /*
276                          * proxy NDP for single entry
277                          */
278                         ifa = (struct ifaddr *)in6ifa_ifpforlinklocal(ifp,
279                                 IN6_IFF_NOTREADY|IN6_IFF_ANYCAST);
280                         if (ifa)
281                                 proxy = 1;
282                 }
283         }
284         if (ifa == NULL) {
285                 /*
286                  * We've got an NS packet, and we don't have that adddress
287                  * assigned for us.  We MUST silently ignore it.
288                  * See RFC2461 7.2.3.
289                  */
290                 goto freeit;
291         }
292         myaddr6 = *IFA_IN6(ifa);
293         anycast = ((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_ANYCAST;
294         tentative = ((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_TENTATIVE;
295         if (((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_DUPLICATED)
296                 goto freeit;
297
298         if (lladdr && ((ifp->if_addrlen + 2 + 7) & ~7) != lladdrlen) {
299                 nd6log((LOG_INFO, "nd6_ns_input: lladdrlen mismatch for %s "
300                     "(if %d, NS packet %d)\n",
301                     ip6_sprintf(ip6bufs, &taddr6),
302                     ifp->if_addrlen, lladdrlen - 2));
303                 goto bad;
304         }
305
306         if (IN6_ARE_ADDR_EQUAL(&myaddr6, &saddr6)) {
307                 nd6log((LOG_INFO, "nd6_ns_input: duplicate IP6 address %s\n",
308                     ip6_sprintf(ip6bufs, &saddr6)));
309                 goto freeit;
310         }
311
312         /*
313          * We have neighbor solicitation packet, with target address equals to
314          * one of my tentative address.
315          *
316          * src addr     how to process?
317          * ---          ---
318          * multicast    of course, invalid (rejected in ip6_input)
319          * unicast      somebody is doing address resolution -> ignore
320          * unspec       dup address detection
321          *
322          * The processing is defined in RFC 2462.
323          */
324         if (tentative) {
325                 /*
326                  * If source address is unspecified address, it is for
327                  * duplicate address detection.
328                  *
329                  * If not, the packet is for addess resolution;
330                  * silently ignore it.
331                  */
332                 if (IN6_IS_ADDR_UNSPECIFIED(&saddr6))
333                         nd6_dad_ns_input(ifa, ndopts.nd_opts_nonce);
334
335                 goto freeit;
336         }
337
338         /*
339          * If the source address is unspecified address, entries must not
340          * be created or updated.
341          * It looks that sender is performing DAD.  Output NA toward
342          * all-node multicast address, to tell the sender that I'm using
343          * the address.
344          * S bit ("solicited") must be zero.
345          */
346         if (IN6_IS_ADDR_UNSPECIFIED(&saddr6)) {
347                 struct in6_addr in6_all;
348
349                 in6_all = in6addr_linklocal_allnodes;
350                 if (in6_setscope(&in6_all, ifp, NULL) != 0)
351                         goto bad;
352                 nd6_na_output_fib(ifp, &in6_all, &taddr6,
353                     ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
354                     rflag, tlladdr, proxy ? (struct sockaddr *)&proxydl : NULL,
355                     M_GETFIB(m));
356                 goto freeit;
357         }
358
359         nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen,
360             ND_NEIGHBOR_SOLICIT, 0);
361
362         nd6_na_output_fib(ifp, &saddr6, &taddr6,
363             ((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
364             rflag | ND_NA_FLAG_SOLICITED, tlladdr,
365             proxy ? (struct sockaddr *)&proxydl : NULL, M_GETFIB(m));
366  freeit:
367         if (ifa != NULL)
368                 ifa_free(ifa);
369         m_freem(m);
370         return;
371
372  bad:
373         nd6log((LOG_ERR, "nd6_ns_input: src=%s\n",
374                 ip6_sprintf(ip6bufs, &saddr6)));
375         nd6log((LOG_ERR, "nd6_ns_input: dst=%s\n",
376                 ip6_sprintf(ip6bufs, &daddr6)));
377         nd6log((LOG_ERR, "nd6_ns_input: tgt=%s\n",
378                 ip6_sprintf(ip6bufs, &taddr6)));
379         ICMP6STAT_INC(icp6s_badns);
380         if (ifa != NULL)
381                 ifa_free(ifa);
382         m_freem(m);
383 }
384
385 /*
386  * Output a Neighbor Solicitation Message. Caller specifies:
387  *      - ICMP6 header source IP6 address
388  *      - ND6 header target IP6 address
389  *      - ND6 header source datalink address
390  *
391  * Based on RFC 2461
392  * Based on RFC 2462 (duplicate address detection)
393  *
394  *    ln - for source address determination
395  * nonce - If non-NULL, NS is used for duplicate address detection and
396  *         the value (length is ND_OPT_NONCE_LEN) is used as a random nonce.
397  */
398 static void
399 nd6_ns_output_fib(struct ifnet *ifp, const struct in6_addr *daddr6,
400     const struct in6_addr *taddr6, struct llentry *ln, uint8_t *nonce,
401     u_int fibnum)
402 {
403         struct mbuf *m;
404         struct m_tag *mtag;
405         struct ip6_hdr *ip6;
406         struct nd_neighbor_solicit *nd_ns;
407         struct ip6_moptions im6o;
408         int icmp6len;
409         int maxlen;
410         caddr_t mac;
411         struct route_in6 ro;
412
413         if (IN6_IS_ADDR_MULTICAST(taddr6))
414                 return;
415
416         /* estimate the size of message */
417         maxlen = sizeof(*ip6) + sizeof(*nd_ns);
418         maxlen += (sizeof(struct nd_opt_hdr) + ifp->if_addrlen + 7) & ~7;
419         KASSERT(max_linkhdr + maxlen <= MCLBYTES, (
420             "%s: max_linkhdr + maxlen > MCLBYTES (%d + %d > %d)",
421             __func__, max_linkhdr, maxlen, MCLBYTES));
422
423         if (max_linkhdr + maxlen > MHLEN)
424                 m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
425         else
426                 m = m_gethdr(M_NOWAIT, MT_DATA);
427         if (m == NULL)
428                 return;
429         M_SETFIB(m, fibnum);
430
431         bzero(&ro, sizeof(ro));
432
433         if (daddr6 == NULL || IN6_IS_ADDR_MULTICAST(daddr6)) {
434                 m->m_flags |= M_MCAST;
435                 im6o.im6o_multicast_ifp = ifp;
436                 im6o.im6o_multicast_hlim = 255;
437                 im6o.im6o_multicast_loop = 0;
438         }
439
440         icmp6len = sizeof(*nd_ns);
441         m->m_pkthdr.len = m->m_len = sizeof(*ip6) + icmp6len;
442         m->m_data += max_linkhdr;       /* or M_ALIGN() equivalent? */
443
444         /* fill neighbor solicitation packet */
445         ip6 = mtod(m, struct ip6_hdr *);
446         ip6->ip6_flow = 0;
447         ip6->ip6_vfc &= ~IPV6_VERSION_MASK;
448         ip6->ip6_vfc |= IPV6_VERSION;
449         /* ip6->ip6_plen will be set later */
450         ip6->ip6_nxt = IPPROTO_ICMPV6;
451         ip6->ip6_hlim = 255;
452         if (daddr6)
453                 ip6->ip6_dst = *daddr6;
454         else {
455                 ip6->ip6_dst.s6_addr16[0] = IPV6_ADDR_INT16_MLL;
456                 ip6->ip6_dst.s6_addr16[1] = 0;
457                 ip6->ip6_dst.s6_addr32[1] = 0;
458                 ip6->ip6_dst.s6_addr32[2] = IPV6_ADDR_INT32_ONE;
459                 ip6->ip6_dst.s6_addr32[3] = taddr6->s6_addr32[3];
460                 ip6->ip6_dst.s6_addr8[12] = 0xff;
461                 if (in6_setscope(&ip6->ip6_dst, ifp, NULL) != 0)
462                         goto bad;
463         }
464         if (nonce == NULL) {
465                 struct ifaddr *ifa;
466
467                 /*
468                  * RFC2461 7.2.2:
469                  * "If the source address of the packet prompting the
470                  * solicitation is the same as one of the addresses assigned
471                  * to the outgoing interface, that address SHOULD be placed
472                  * in the IP Source Address of the outgoing solicitation.
473                  * Otherwise, any one of the addresses assigned to the
474                  * interface should be used."
475                  *
476                  * We use the source address for the prompting packet
477                  * (saddr6), if:
478                  * - saddr6 is given from the caller (by giving "ln"), and
479                  * - saddr6 belongs to the outgoing interface.
480                  * Otherwise, we perform the source address selection as usual.
481                  */
482                 struct in6_addr *hsrc;
483
484                 hsrc = NULL;
485                 if (ln != NULL) {
486                         LLE_RLOCK(ln);
487                         if (ln->la_hold != NULL) {
488                                 struct ip6_hdr *hip6;           /* hold ip6 */
489
490                                 /*
491                                  * assuming every packet in la_hold has the same IP
492                                  * header
493                                  */
494                                 hip6 = mtod(ln->la_hold, struct ip6_hdr *);
495                                 /* XXX pullup? */
496                                 if (sizeof(*hip6) < ln->la_hold->m_len) {
497                                         ip6->ip6_src = hip6->ip6_src;
498                                         hsrc = &hip6->ip6_src;
499                                 }
500                         }
501                         LLE_RUNLOCK(ln);
502                 }
503                 if (hsrc && (ifa = (struct ifaddr *)in6ifa_ifpwithaddr(ifp,
504                     hsrc)) != NULL) {
505                         /* ip6_src set already. */
506                         ifa_free(ifa);
507                 } else {
508                         int error;
509                         struct sockaddr_in6 dst_sa;
510                         struct in6_addr src_in;
511                         struct ifnet *oifp;
512
513                         bzero(&dst_sa, sizeof(dst_sa));
514                         dst_sa.sin6_family = AF_INET6;
515                         dst_sa.sin6_len = sizeof(dst_sa);
516                         dst_sa.sin6_addr = ip6->ip6_dst;
517
518                         oifp = ifp;
519                         error = in6_selectsrc(&dst_sa, NULL,
520                             NULL, &ro, NULL, &oifp, &src_in);
521                         if (error) {
522                                 char ip6buf[INET6_ADDRSTRLEN];
523                                 nd6log((LOG_DEBUG, "%s: source can't be "
524                                     "determined: dst=%s, error=%d\n", __func__,
525                                     ip6_sprintf(ip6buf, &dst_sa.sin6_addr),
526                                     error));
527                                 goto bad;
528                         }
529                         ip6->ip6_src = src_in;
530                 }
531         } else {
532                 /*
533                  * Source address for DAD packet must always be IPv6
534                  * unspecified address. (0::0)
535                  * We actually don't have to 0-clear the address (we did it
536                  * above), but we do so here explicitly to make the intention
537                  * clearer.
538                  */
539                 bzero(&ip6->ip6_src, sizeof(ip6->ip6_src));
540         }
541         nd_ns = (struct nd_neighbor_solicit *)(ip6 + 1);
542         nd_ns->nd_ns_type = ND_NEIGHBOR_SOLICIT;
543         nd_ns->nd_ns_code = 0;
544         nd_ns->nd_ns_reserved = 0;
545         nd_ns->nd_ns_target = *taddr6;
546         in6_clearscope(&nd_ns->nd_ns_target); /* XXX */
547
548         /*
549          * Add source link-layer address option.
550          *
551          *                              spec            implementation
552          *                              ---             ---
553          * DAD packet                   MUST NOT        do not add the option
554          * there's no link layer address:
555          *                              impossible      do not add the option
556          * there's link layer address:
557          *      Multicast NS            MUST add one    add the option
558          *      Unicast NS              SHOULD add one  add the option
559          */
560         if (nonce == NULL && (mac = nd6_ifptomac(ifp))) {
561                 int optlen = sizeof(struct nd_opt_hdr) + ifp->if_addrlen;
562                 struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)(nd_ns + 1);
563                 /* 8 byte alignments... */
564                 optlen = (optlen + 7) & ~7;
565
566                 m->m_pkthdr.len += optlen;
567                 m->m_len += optlen;
568                 icmp6len += optlen;
569                 bzero((caddr_t)nd_opt, optlen);
570                 nd_opt->nd_opt_type = ND_OPT_SOURCE_LINKADDR;
571                 nd_opt->nd_opt_len = optlen >> 3;
572                 bcopy(mac, (caddr_t)(nd_opt + 1), ifp->if_addrlen);
573         }
574         /*
575          * Add a Nonce option (RFC 3971) to detect looped back NS messages.
576          * This behavior is documented as Enhanced Duplicate Address
577          * Detection in draft-ietf-6man-enhanced-dad-13.
578          * net.inet6.ip6.dad_enhanced=0 disables this.
579          */
580         if (V_dad_enhanced != 0 && nonce != NULL) {
581                 int optlen = sizeof(struct nd_opt_hdr) + ND_OPT_NONCE_LEN;
582                 struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)(nd_ns + 1);
583                 /* 8-byte alignment is required. */
584                 optlen = (optlen + 7) & ~7;
585
586                 m->m_pkthdr.len += optlen;
587                 m->m_len += optlen;
588                 icmp6len += optlen;
589                 bzero((caddr_t)nd_opt, optlen);
590                 nd_opt->nd_opt_type = ND_OPT_NONCE;
591                 nd_opt->nd_opt_len = optlen >> 3;
592                 bcopy(nonce, (caddr_t)(nd_opt + 1), ND_OPT_NONCE_LEN);
593         }
594         ip6->ip6_plen = htons((u_short)icmp6len);
595         nd_ns->nd_ns_cksum = 0;
596         nd_ns->nd_ns_cksum =
597             in6_cksum(m, IPPROTO_ICMPV6, sizeof(*ip6), icmp6len);
598
599         if (send_sendso_input_hook != NULL) {
600                 mtag = m_tag_get(PACKET_TAG_ND_OUTGOING,
601                         sizeof(unsigned short), M_NOWAIT);
602                 if (mtag == NULL)
603                         goto bad;
604                 *(unsigned short *)(mtag + 1) = nd_ns->nd_ns_type;
605                 m_tag_prepend(m, mtag);
606         }
607
608         ip6_output(m, NULL, &ro, (nonce != NULL) ? IPV6_UNSPECSRC : 0,
609             &im6o, NULL, NULL);
610         icmp6_ifstat_inc(ifp, ifs6_out_msg);
611         icmp6_ifstat_inc(ifp, ifs6_out_neighborsolicit);
612         ICMP6STAT_INC(icp6s_outhist[ND_NEIGHBOR_SOLICIT]);
613
614         /* We don't cache this route. */
615         RO_RTFREE(&ro);
616
617         return;
618
619   bad:
620         if (ro.ro_rt) {
621                 RTFREE(ro.ro_rt);
622         }
623         m_freem(m);
624         return;
625 }
626
627 #ifndef BURN_BRIDGES
628 void
629 nd6_ns_output(struct ifnet *ifp, const struct in6_addr *daddr6,
630     const struct in6_addr *taddr6, struct llentry *ln, uint8_t *nonce)
631 {
632
633         nd6_ns_output_fib(ifp, daddr6, taddr6, ln, nonce, RT_DEFAULT_FIB);
634 }
635 #endif
636 /*
637  * Neighbor advertisement input handling.
638  *
639  * Based on RFC 2461
640  * Based on RFC 2462 (duplicate address detection)
641  *
642  * the following items are not implemented yet:
643  * - proxy advertisement delay rule (RFC2461 7.2.8, last paragraph, SHOULD)
644  * - anycast advertisement delay rule (RFC2461 7.2.7, SHOULD)
645  */
646 void
647 nd6_na_input(struct mbuf *m, int off, int icmp6len)
648 {
649         struct ifnet *ifp = m->m_pkthdr.rcvif;
650         struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
651         struct nd_neighbor_advert *nd_na;
652         struct in6_addr daddr6 = ip6->ip6_dst;
653         struct in6_addr taddr6;
654         int flags;
655         int is_router;
656         int is_solicited;
657         int is_override;
658         char *lladdr = NULL;
659         int lladdrlen = 0;
660         int checklink = 0;
661         struct ifaddr *ifa;
662         struct llentry *ln = NULL;
663         union nd_opts ndopts;
664         struct mbuf *chain = NULL;
665         struct sockaddr_in6 sin6;
666         char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN];
667
668         if (ip6->ip6_hlim != 255) {
669                 nd6log((LOG_ERR,
670                     "nd6_na_input: invalid hlim (%d) from %s to %s on %s\n",
671                     ip6->ip6_hlim, ip6_sprintf(ip6bufs, &ip6->ip6_src),
672                     ip6_sprintf(ip6bufd, &ip6->ip6_dst), if_name(ifp)));
673                 goto bad;
674         }
675
676 #ifndef PULLDOWN_TEST
677         IP6_EXTHDR_CHECK(m, off, icmp6len,);
678         nd_na = (struct nd_neighbor_advert *)((caddr_t)ip6 + off);
679 #else
680         IP6_EXTHDR_GET(nd_na, struct nd_neighbor_advert *, m, off, icmp6len);
681         if (nd_na == NULL) {
682                 ICMP6STAT_INC(icp6s_tooshort);
683                 return;
684         }
685 #endif
686
687         flags = nd_na->nd_na_flags_reserved;
688         is_router = ((flags & ND_NA_FLAG_ROUTER) != 0);
689         is_solicited = ((flags & ND_NA_FLAG_SOLICITED) != 0);
690         is_override = ((flags & ND_NA_FLAG_OVERRIDE) != 0);
691         memset(&sin6, 0, sizeof(sin6));
692
693         taddr6 = nd_na->nd_na_target;
694         if (in6_setscope(&taddr6, ifp, NULL))
695                 goto bad;       /* XXX: impossible */
696
697         if (IN6_IS_ADDR_MULTICAST(&taddr6)) {
698                 nd6log((LOG_ERR,
699                     "nd6_na_input: invalid target address %s\n",
700                     ip6_sprintf(ip6bufs, &taddr6)));
701                 goto bad;
702         }
703         if (IN6_IS_ADDR_MULTICAST(&daddr6))
704                 if (is_solicited) {
705                         nd6log((LOG_ERR,
706                             "nd6_na_input: a solicited adv is multicasted\n"));
707                         goto bad;
708                 }
709
710         icmp6len -= sizeof(*nd_na);
711         nd6_option_init(nd_na + 1, icmp6len, &ndopts);
712         if (nd6_options(&ndopts) < 0) {
713                 nd6log((LOG_INFO,
714                     "nd6_na_input: invalid ND option, ignored\n"));
715                 /* nd6_options have incremented stats */
716                 goto freeit;
717         }
718
719         if (ndopts.nd_opts_tgt_lladdr) {
720                 lladdr = (char *)(ndopts.nd_opts_tgt_lladdr + 1);
721                 lladdrlen = ndopts.nd_opts_tgt_lladdr->nd_opt_len << 3;
722         }
723
724         /*
725          * This effectively disables the DAD check on a non-master CARP
726          * address.
727          */
728         if (ifp->if_carp)
729                 ifa = (*carp_iamatch6_p)(ifp, &taddr6);
730         else
731                 ifa = (struct ifaddr *)in6ifa_ifpwithaddr(ifp, &taddr6);
732
733         /*
734          * Target address matches one of my interface address.
735          *
736          * If my address is tentative, this means that there's somebody
737          * already using the same address as mine.  This indicates DAD failure.
738          * This is defined in RFC 2462.
739          *
740          * Otherwise, process as defined in RFC 2461.
741          */
742         if (ifa
743          && (((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_TENTATIVE)) {
744                 nd6_dad_na_input(ifa);
745                 ifa_free(ifa);
746                 goto freeit;
747         }
748
749         /* Just for safety, maybe unnecessary. */
750         if (ifa) {
751                 ifa_free(ifa);
752                 log(LOG_ERR,
753                     "nd6_na_input: duplicate IP6 address %s\n",
754                     ip6_sprintf(ip6bufs, &taddr6));
755                 goto freeit;
756         }
757
758         if (lladdr && ((ifp->if_addrlen + 2 + 7) & ~7) != lladdrlen) {
759                 nd6log((LOG_INFO, "nd6_na_input: lladdrlen mismatch for %s "
760                     "(if %d, NA packet %d)\n", ip6_sprintf(ip6bufs, &taddr6),
761                     ifp->if_addrlen, lladdrlen - 2));
762                 goto bad;
763         }
764
765         /*
766          * If no neighbor cache entry is found, NA SHOULD silently be
767          * discarded.
768          */
769         IF_AFDATA_RLOCK(ifp);
770         ln = nd6_lookup(&taddr6, LLE_EXCLUSIVE, ifp);
771         IF_AFDATA_RUNLOCK(ifp);
772         if (ln == NULL) {
773                 goto freeit;
774         }
775
776         if (ln->ln_state == ND6_LLINFO_INCOMPLETE) {
777                 /*
778                  * If the link-layer has address, and no lladdr option came,
779                  * discard the packet.
780                  */
781                 if (ifp->if_addrlen && lladdr == NULL) {
782                         goto freeit;
783                 }
784
785                 /*
786                  * Record link-layer address, and update the state.
787                  */
788                 bcopy(lladdr, &ln->ll_addr, ifp->if_addrlen);
789                 ln->la_flags |= LLE_VALID;
790                 EVENTHANDLER_INVOKE(lle_event, ln, LLENTRY_RESOLVED);
791                 if (is_solicited) {
792                         ln->ln_state = ND6_LLINFO_REACHABLE;
793                         ln->ln_byhint = 0;
794                         if (!ND6_LLINFO_PERMANENT(ln)) {
795                                 nd6_llinfo_settimer_locked(ln,
796                                     (long)ND_IFINFO(ln->lle_tbl->llt_ifp)->reachable * hz);
797                         }
798                 } else {
799                         ln->ln_state = ND6_LLINFO_STALE;
800                         nd6_llinfo_settimer_locked(ln, (long)V_nd6_gctimer * hz);
801                 }
802                 if ((ln->ln_router = is_router) != 0) {
803                         /*
804                          * This means a router's state has changed from
805                          * non-reachable to probably reachable, and might
806                          * affect the status of associated prefixes..
807                          */
808                         checklink = 1;
809                 }
810         } else {
811                 int llchange;
812
813                 /*
814                  * Check if the link-layer address has changed or not.
815                  */
816                 if (lladdr == NULL)
817                         llchange = 0;
818                 else {
819                         if (ln->la_flags & LLE_VALID) {
820                                 if (bcmp(lladdr, &ln->ll_addr, ifp->if_addrlen))
821                                         llchange = 1;
822                                 else
823                                         llchange = 0;
824                         } else
825                                 llchange = 1;
826                 }
827
828                 /*
829                  * This is VERY complex.  Look at it with care.
830                  *
831                  * override solicit lladdr llchange     action
832                  *                                      (L: record lladdr)
833                  *
834                  *      0       0       n       --      (2c)
835                  *      0       0       y       n       (2b) L
836                  *      0       0       y       y       (1)    REACHABLE->STALE
837                  *      0       1       n       --      (2c)   *->REACHABLE
838                  *      0       1       y       n       (2b) L *->REACHABLE
839                  *      0       1       y       y       (1)    REACHABLE->STALE
840                  *      1       0       n       --      (2a)
841                  *      1       0       y       n       (2a) L
842                  *      1       0       y       y       (2a) L *->STALE
843                  *      1       1       n       --      (2a)   *->REACHABLE
844                  *      1       1       y       n       (2a) L *->REACHABLE
845                  *      1       1       y       y       (2a) L *->REACHABLE
846                  */
847                 if (!is_override && (lladdr != NULL && llchange)) {  /* (1) */
848                         /*
849                          * If state is REACHABLE, make it STALE.
850                          * no other updates should be done.
851                          */
852                         if (ln->ln_state == ND6_LLINFO_REACHABLE) {
853                                 ln->ln_state = ND6_LLINFO_STALE;
854                                 nd6_llinfo_settimer_locked(ln, (long)V_nd6_gctimer * hz);
855                         }
856                         goto freeit;
857                 } else if (is_override                             /* (2a) */
858                         || (!is_override && (lladdr != NULL && !llchange)) /* (2b) */
859                         || lladdr == NULL) {                       /* (2c) */
860                         /*
861                          * Update link-local address, if any.
862                          */
863                         if (lladdr != NULL) {
864                                 bcopy(lladdr, &ln->ll_addr, ifp->if_addrlen);
865                                 ln->la_flags |= LLE_VALID;
866                                 EVENTHANDLER_INVOKE(lle_event, ln,
867                                     LLENTRY_RESOLVED);
868                         }
869
870                         /*
871                          * If solicited, make the state REACHABLE.
872                          * If not solicited and the link-layer address was
873                          * changed, make it STALE.
874                          */
875                         if (is_solicited) {
876                                 ln->ln_state = ND6_LLINFO_REACHABLE;
877                                 ln->ln_byhint = 0;
878                                 if (!ND6_LLINFO_PERMANENT(ln)) {
879                                         nd6_llinfo_settimer_locked(ln,
880                                             (long)ND_IFINFO(ifp)->reachable * hz);
881                                 }
882                         } else {
883                                 if (lladdr != NULL && llchange) {
884                                         ln->ln_state = ND6_LLINFO_STALE;
885                                         nd6_llinfo_settimer_locked(ln,
886                                             (long)V_nd6_gctimer * hz);
887                                 }
888                         }
889                 }
890
891                 if (ln->ln_router && !is_router) {
892                         /*
893                          * The peer dropped the router flag.
894                          * Remove the sender from the Default Router List and
895                          * update the Destination Cache entries.
896                          */
897                         struct nd_defrouter *dr;
898                         struct in6_addr *in6;
899
900                         in6 = &ln->r_l3addr.addr6;
901
902                         /*
903                          * Lock to protect the default router list.
904                          * XXX: this might be unnecessary, since this function
905                          * is only called under the network software interrupt
906                          * context.  However, we keep it just for safety.
907                          */
908                         dr = defrouter_lookup(in6, ln->lle_tbl->llt_ifp);
909                         if (dr)
910                                 defrtrlist_del(dr);
911                         else if (ND_IFINFO(ln->lle_tbl->llt_ifp)->flags &
912                             ND6_IFF_ACCEPT_RTADV) {
913                                 /*
914                                  * Even if the neighbor is not in the default
915                                  * router list, the neighbor may be used
916                                  * as a next hop for some destinations
917                                  * (e.g. redirect case). So we must
918                                  * call rt6_flush explicitly.
919                                  */
920                                 rt6_flush(&ip6->ip6_src, ifp);
921                         }
922                 }
923                 ln->ln_router = is_router;
924         }
925         /* XXX - QL
926          *  Does this matter?
927          *  rt->rt_flags &= ~RTF_REJECT;
928          */
929         ln->la_asked = 0;
930         if (ln->la_hold != NULL)
931                 nd6_grab_holdchain(ln, &chain, &sin6);
932  freeit:
933         if (ln != NULL)
934                 LLE_WUNLOCK(ln);
935
936         if (chain != NULL)
937                 nd6_flush_holdchain(ifp, ifp, chain, &sin6);
938
939         if (checklink)
940                 pfxlist_onlink_check();
941
942         m_freem(m);
943         return;
944
945  bad:
946         if (ln != NULL)
947                 LLE_WUNLOCK(ln);
948
949         ICMP6STAT_INC(icp6s_badna);
950         m_freem(m);
951 }
952
953 /*
954  * Neighbor advertisement output handling.
955  *
956  * Based on RFC 2461
957  *
958  * the following items are not implemented yet:
959  * - proxy advertisement delay rule (RFC2461 7.2.8, last paragraph, SHOULD)
960  * - anycast advertisement delay rule (RFC2461 7.2.7, SHOULD)
961  *
962  * tlladdr - 1 if include target link-layer address
963  * sdl0 - sockaddr_dl (= proxy NA) or NULL
964  */
965 static void
966 nd6_na_output_fib(struct ifnet *ifp, const struct in6_addr *daddr6_0,
967     const struct in6_addr *taddr6, u_long flags, int tlladdr,
968     struct sockaddr *sdl0, u_int fibnum)
969 {
970         struct mbuf *m;
971         struct m_tag *mtag;
972         struct ifnet *oifp;
973         struct ip6_hdr *ip6;
974         struct nd_neighbor_advert *nd_na;
975         struct ip6_moptions im6o;
976         struct in6_addr src, daddr6;
977         struct sockaddr_in6 dst_sa;
978         int icmp6len, maxlen, error;
979         caddr_t mac = NULL;
980         struct route_in6 ro;
981
982         bzero(&ro, sizeof(ro));
983
984         daddr6 = *daddr6_0;     /* make a local copy for modification */
985
986         /* estimate the size of message */
987         maxlen = sizeof(*ip6) + sizeof(*nd_na);
988         maxlen += (sizeof(struct nd_opt_hdr) + ifp->if_addrlen + 7) & ~7;
989         KASSERT(max_linkhdr + maxlen <= MCLBYTES, (
990             "%s: max_linkhdr + maxlen > MCLBYTES (%d + %d > %d)",
991             __func__, max_linkhdr, maxlen, MCLBYTES));
992
993         if (max_linkhdr + maxlen > MHLEN)
994                 m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
995         else
996                 m = m_gethdr(M_NOWAIT, MT_DATA);
997         if (m == NULL)
998                 return;
999         M_SETFIB(m, fibnum);
1000
1001         if (IN6_IS_ADDR_MULTICAST(&daddr6)) {
1002                 m->m_flags |= M_MCAST;
1003                 im6o.im6o_multicast_ifp = ifp;
1004                 im6o.im6o_multicast_hlim = 255;
1005                 im6o.im6o_multicast_loop = 0;
1006         }
1007
1008         icmp6len = sizeof(*nd_na);
1009         m->m_pkthdr.len = m->m_len = sizeof(struct ip6_hdr) + icmp6len;
1010         m->m_data += max_linkhdr;       /* or M_ALIGN() equivalent? */
1011
1012         /* fill neighbor advertisement packet */
1013         ip6 = mtod(m, struct ip6_hdr *);
1014         ip6->ip6_flow = 0;
1015         ip6->ip6_vfc &= ~IPV6_VERSION_MASK;
1016         ip6->ip6_vfc |= IPV6_VERSION;
1017         ip6->ip6_nxt = IPPROTO_ICMPV6;
1018         ip6->ip6_hlim = 255;
1019         if (IN6_IS_ADDR_UNSPECIFIED(&daddr6)) {
1020                 /* reply to DAD */
1021                 daddr6.s6_addr16[0] = IPV6_ADDR_INT16_MLL;
1022                 daddr6.s6_addr16[1] = 0;
1023                 daddr6.s6_addr32[1] = 0;
1024                 daddr6.s6_addr32[2] = 0;
1025                 daddr6.s6_addr32[3] = IPV6_ADDR_INT32_ONE;
1026                 if (in6_setscope(&daddr6, ifp, NULL))
1027                         goto bad;
1028
1029                 flags &= ~ND_NA_FLAG_SOLICITED;
1030         }
1031         ip6->ip6_dst = daddr6;
1032         bzero(&dst_sa, sizeof(struct sockaddr_in6));
1033         dst_sa.sin6_family = AF_INET6;
1034         dst_sa.sin6_len = sizeof(struct sockaddr_in6);
1035         dst_sa.sin6_addr = daddr6;
1036
1037         /*
1038          * Select a source whose scope is the same as that of the dest.
1039          */
1040         bcopy(&dst_sa, &ro.ro_dst, sizeof(dst_sa));
1041         oifp = ifp;
1042         error = in6_selectsrc(&dst_sa, NULL, NULL, &ro, NULL, &oifp, &src);
1043         if (error) {
1044                 char ip6buf[INET6_ADDRSTRLEN];
1045                 nd6log((LOG_DEBUG, "nd6_na_output: source can't be "
1046                     "determined: dst=%s, error=%d\n",
1047                     ip6_sprintf(ip6buf, &dst_sa.sin6_addr), error));
1048                 goto bad;
1049         }
1050         ip6->ip6_src = src;
1051         nd_na = (struct nd_neighbor_advert *)(ip6 + 1);
1052         nd_na->nd_na_type = ND_NEIGHBOR_ADVERT;
1053         nd_na->nd_na_code = 0;
1054         nd_na->nd_na_target = *taddr6;
1055         in6_clearscope(&nd_na->nd_na_target); /* XXX */
1056
1057         /*
1058          * "tlladdr" indicates NS's condition for adding tlladdr or not.
1059          * see nd6_ns_input() for details.
1060          * Basically, if NS packet is sent to unicast/anycast addr,
1061          * target lladdr option SHOULD NOT be included.
1062          */
1063         if (tlladdr) {
1064                 /*
1065                  * sdl0 != NULL indicates proxy NA.  If we do proxy, use
1066                  * lladdr in sdl0.  If we are not proxying (sending NA for
1067                  * my address) use lladdr configured for the interface.
1068                  */
1069                 if (sdl0 == NULL) {
1070                         if (ifp->if_carp)
1071                                 mac = (*carp_macmatch6_p)(ifp, m, taddr6);
1072                         if (mac == NULL)
1073                                 mac = nd6_ifptomac(ifp);
1074                 } else if (sdl0->sa_family == AF_LINK) {
1075                         struct sockaddr_dl *sdl;
1076                         sdl = (struct sockaddr_dl *)sdl0;
1077                         if (sdl->sdl_alen == ifp->if_addrlen)
1078                                 mac = LLADDR(sdl);
1079                 }
1080         }
1081         if (tlladdr && mac) {
1082                 int optlen = sizeof(struct nd_opt_hdr) + ifp->if_addrlen;
1083                 struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)(nd_na + 1);
1084
1085                 /* roundup to 8 bytes alignment! */
1086                 optlen = (optlen + 7) & ~7;
1087
1088                 m->m_pkthdr.len += optlen;
1089                 m->m_len += optlen;
1090                 icmp6len += optlen;
1091                 bzero((caddr_t)nd_opt, optlen);
1092                 nd_opt->nd_opt_type = ND_OPT_TARGET_LINKADDR;
1093                 nd_opt->nd_opt_len = optlen >> 3;
1094                 bcopy(mac, (caddr_t)(nd_opt + 1), ifp->if_addrlen);
1095         } else
1096                 flags &= ~ND_NA_FLAG_OVERRIDE;
1097
1098         ip6->ip6_plen = htons((u_short)icmp6len);
1099         nd_na->nd_na_flags_reserved = flags;
1100         nd_na->nd_na_cksum = 0;
1101         nd_na->nd_na_cksum =
1102             in6_cksum(m, IPPROTO_ICMPV6, sizeof(struct ip6_hdr), icmp6len);
1103
1104         if (send_sendso_input_hook != NULL) {
1105                 mtag = m_tag_get(PACKET_TAG_ND_OUTGOING,
1106                     sizeof(unsigned short), M_NOWAIT);
1107                 if (mtag == NULL)
1108                         goto bad;
1109                 *(unsigned short *)(mtag + 1) = nd_na->nd_na_type;
1110                 m_tag_prepend(m, mtag);
1111         }
1112
1113         ip6_output(m, NULL, &ro, 0, &im6o, NULL, NULL);
1114         icmp6_ifstat_inc(ifp, ifs6_out_msg);
1115         icmp6_ifstat_inc(ifp, ifs6_out_neighboradvert);
1116         ICMP6STAT_INC(icp6s_outhist[ND_NEIGHBOR_ADVERT]);
1117
1118         /* We don't cache this route. */
1119         RO_RTFREE(&ro);
1120
1121         return;
1122
1123   bad:
1124         if (ro.ro_rt) {
1125                 RTFREE(ro.ro_rt);
1126         }
1127         m_freem(m);
1128         return;
1129 }
1130
1131 #ifndef BURN_BRIDGES
1132 void
1133 nd6_na_output(struct ifnet *ifp, const struct in6_addr *daddr6_0,
1134     const struct in6_addr *taddr6, u_long flags, int tlladdr,
1135     struct sockaddr *sdl0)
1136 {
1137
1138         nd6_na_output_fib(ifp, daddr6_0, taddr6, flags, tlladdr, sdl0,
1139             RT_DEFAULT_FIB);
1140 }
1141 #endif
1142
1143 caddr_t
1144 nd6_ifptomac(struct ifnet *ifp)
1145 {
1146         switch (ifp->if_type) {
1147         case IFT_ARCNET:
1148         case IFT_ETHER:
1149         case IFT_FDDI:
1150         case IFT_IEEE1394:
1151         case IFT_L2VLAN:
1152         case IFT_IEEE80211:
1153         case IFT_INFINIBAND:
1154         case IFT_BRIDGE:
1155         case IFT_ISO88025:
1156                 return IF_LLADDR(ifp);
1157         default:
1158                 return NULL;
1159         }
1160 }
1161
1162 struct dadq {
1163         TAILQ_ENTRY(dadq) dad_list;
1164         struct ifaddr *dad_ifa;
1165         int dad_count;          /* max NS to send */
1166         int dad_ns_tcount;      /* # of trials to send NS */
1167         int dad_ns_ocount;      /* NS sent so far */
1168         int dad_ns_icount;
1169         int dad_na_icount;
1170         int dad_ns_lcount;      /* looped back NS */
1171         int dad_loopbackprobe;  /* probing state for loopback detection */
1172         struct callout dad_timer_ch;
1173         struct vnet *dad_vnet;
1174         u_int dad_refcnt;
1175 #define ND_OPT_NONCE_LEN32 \
1176                 ((ND_OPT_NONCE_LEN + sizeof(uint32_t) - 1)/sizeof(uint32_t))
1177         uint32_t dad_nonce[ND_OPT_NONCE_LEN32];
1178 };
1179
1180 static VNET_DEFINE(TAILQ_HEAD(, dadq), dadq);
1181 static VNET_DEFINE(struct rwlock, dad_rwlock);
1182 #define V_dadq                  VNET(dadq)
1183 #define V_dad_rwlock            VNET(dad_rwlock)
1184
1185 #define DADQ_RLOCK()            rw_rlock(&V_dad_rwlock) 
1186 #define DADQ_RUNLOCK()          rw_runlock(&V_dad_rwlock)       
1187 #define DADQ_WLOCK()            rw_wlock(&V_dad_rwlock) 
1188 #define DADQ_WUNLOCK()          rw_wunlock(&V_dad_rwlock)       
1189
1190 static void
1191 nd6_dad_add(struct dadq *dp)
1192 {
1193
1194         DADQ_WLOCK();
1195         TAILQ_INSERT_TAIL(&V_dadq, dp, dad_list);
1196         DADQ_WUNLOCK();
1197 }
1198
1199 static void
1200 nd6_dad_del(struct dadq *dp)
1201 {
1202
1203         DADQ_WLOCK();
1204         TAILQ_REMOVE(&V_dadq, dp, dad_list);
1205         DADQ_WUNLOCK();
1206         nd6_dad_rele(dp);
1207 }
1208
1209 static struct dadq *
1210 nd6_dad_find(struct ifaddr *ifa, struct nd_opt_nonce *n)
1211 {
1212         struct dadq *dp;
1213
1214         DADQ_RLOCK();
1215         TAILQ_FOREACH(dp, &V_dadq, dad_list) {
1216                 if (dp->dad_ifa != ifa)
1217                         continue;
1218                 /*
1219                  * Skip if the nonce matches the received one.
1220                  * +2 in the length is required because of type and
1221                  * length fields are included in a header.
1222                  */
1223                 if (n != NULL &&
1224                     n->nd_opt_nonce_len == (ND_OPT_NONCE_LEN + 2) / 8 &&
1225                     memcmp(&n->nd_opt_nonce[0], &dp->dad_nonce[0],
1226                         ND_OPT_NONCE_LEN) == 0) {
1227                         dp->dad_ns_lcount++;
1228                         continue;
1229                 }
1230                 refcount_acquire(&dp->dad_refcnt);
1231                 break;
1232         }
1233         DADQ_RUNLOCK();
1234
1235         return (dp);
1236 }
1237
1238 static void
1239 nd6_dad_starttimer(struct dadq *dp, int ticks)
1240 {
1241
1242         callout_reset(&dp->dad_timer_ch, ticks,
1243             (void (*)(void *))nd6_dad_timer, (void *)dp);
1244 }
1245
1246 static void
1247 nd6_dad_stoptimer(struct dadq *dp)
1248 {
1249
1250         callout_drain(&dp->dad_timer_ch);
1251 }
1252
1253 static void
1254 nd6_dad_rele(struct dadq *dp)
1255 {
1256
1257         if (refcount_release(&dp->dad_refcnt)) {
1258                 ifa_free(dp->dad_ifa);
1259                 free(dp, M_IP6NDP);
1260         }
1261 }
1262
1263 void
1264 nd6_dad_init(void)
1265 {
1266
1267         rw_init(&V_dad_rwlock, "nd6 DAD queue");
1268         TAILQ_INIT(&V_dadq);
1269 }
1270
1271 /*
1272  * Start Duplicate Address Detection (DAD) for specified interface address.
1273  */
1274 void
1275 nd6_dad_start(struct ifaddr *ifa, int delay)
1276 {
1277         struct in6_ifaddr *ia = (struct in6_ifaddr *)ifa;
1278         struct dadq *dp;
1279         char ip6buf[INET6_ADDRSTRLEN];
1280
1281         /*
1282          * If we don't need DAD, don't do it.
1283          * There are several cases:
1284          * - DAD is disabled (ip6_dad_count == 0)
1285          * - the interface address is anycast
1286          */
1287         if (!(ia->ia6_flags & IN6_IFF_TENTATIVE)) {
1288                 log(LOG_DEBUG,
1289                         "nd6_dad_start: called with non-tentative address "
1290                         "%s(%s)\n",
1291                         ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr),
1292                         ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???");
1293                 return;
1294         }
1295         if (ia->ia6_flags & IN6_IFF_ANYCAST) {
1296                 ia->ia6_flags &= ~IN6_IFF_TENTATIVE;
1297                 return;
1298         }
1299         if (!V_ip6_dad_count) {
1300                 ia->ia6_flags &= ~IN6_IFF_TENTATIVE;
1301                 return;
1302         }
1303         if (ifa->ifa_ifp == NULL)
1304                 panic("nd6_dad_start: ifa->ifa_ifp == NULL");
1305         if (!(ifa->ifa_ifp->if_flags & IFF_UP)) {
1306                 return;
1307         }
1308         if (ND_IFINFO(ifa->ifa_ifp)->flags & ND6_IFF_IFDISABLED)
1309                 return;
1310         if ((dp = nd6_dad_find(ifa, NULL)) != NULL) {
1311                 /* DAD already in progress */
1312                 nd6_dad_rele(dp);
1313                 return;
1314         }
1315
1316         dp = malloc(sizeof(*dp), M_IP6NDP, M_NOWAIT | M_ZERO);
1317         if (dp == NULL) {
1318                 log(LOG_ERR, "nd6_dad_start: memory allocation failed for "
1319                         "%s(%s)\n",
1320                         ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr),
1321                         ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???");
1322                 return;
1323         }
1324         callout_init(&dp->dad_timer_ch, 0);
1325 #ifdef VIMAGE
1326         dp->dad_vnet = curvnet;
1327 #endif
1328         nd6log((LOG_DEBUG, "%s: starting DAD for %s\n", if_name(ifa->ifa_ifp),
1329             ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr)));
1330
1331         /*
1332          * Send NS packet for DAD, ip6_dad_count times.
1333          * Note that we must delay the first transmission, if this is the
1334          * first packet to be sent from the interface after interface
1335          * (re)initialization.
1336          */
1337         dp->dad_ifa = ifa;
1338         ifa_ref(dp->dad_ifa);
1339         dp->dad_count = V_ip6_dad_count;
1340         dp->dad_ns_icount = dp->dad_na_icount = 0;
1341         dp->dad_ns_ocount = dp->dad_ns_tcount = 0;
1342         dp->dad_ns_lcount = dp->dad_loopbackprobe = 0;
1343         refcount_init(&dp->dad_refcnt, 1);
1344         nd6_dad_add(dp);
1345         if (delay == 0) {
1346                 nd6_dad_ns_output(dp, ifa);
1347                 nd6_dad_starttimer(dp,
1348                     (long)ND_IFINFO(ifa->ifa_ifp)->retrans * hz / 1000);
1349         } else {
1350                 nd6_dad_starttimer(dp, delay);
1351         }
1352 }
1353
1354 /*
1355  * terminate DAD unconditionally.  used for address removals.
1356  */
1357 void
1358 nd6_dad_stop(struct ifaddr *ifa)
1359 {
1360         struct dadq *dp;
1361
1362         dp = nd6_dad_find(ifa, NULL);
1363         if (!dp) {
1364                 /* DAD wasn't started yet */
1365                 return;
1366         }
1367
1368         nd6_dad_stoptimer(dp);
1369
1370         /*
1371          * The DAD queue entry may have been removed by nd6_dad_timer() while
1372          * we were waiting for it to stop, so re-do the lookup.
1373          */
1374         nd6_dad_rele(dp);
1375         if (nd6_dad_find(ifa, NULL) == NULL)
1376                 return;
1377
1378         nd6_dad_del(dp);
1379         nd6_dad_rele(dp);
1380 }
1381
1382 static void
1383 nd6_dad_timer(struct dadq *dp)
1384 {
1385         CURVNET_SET(dp->dad_vnet);
1386         struct ifaddr *ifa = dp->dad_ifa;
1387         struct ifnet *ifp = dp->dad_ifa->ifa_ifp;
1388         struct in6_ifaddr *ia = (struct in6_ifaddr *)ifa;
1389         char ip6buf[INET6_ADDRSTRLEN];
1390
1391         /* Sanity check */
1392         if (ia == NULL) {
1393                 log(LOG_ERR, "nd6_dad_timer: called with null parameter\n");
1394                 goto err;
1395         }
1396         if (ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED) {
1397                 /* Do not need DAD for ifdisabled interface. */
1398                 log(LOG_ERR, "nd6_dad_timer: cancel DAD on %s because of "
1399                     "ND6_IFF_IFDISABLED.\n", ifp->if_xname);
1400                 goto err;
1401         }
1402         if (ia->ia6_flags & IN6_IFF_DUPLICATED) {
1403                 log(LOG_ERR, "nd6_dad_timer: called with duplicated address "
1404                         "%s(%s)\n",
1405                         ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr),
1406                         ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???");
1407                 goto err;
1408         }
1409         if ((ia->ia6_flags & IN6_IFF_TENTATIVE) == 0) {
1410                 log(LOG_ERR, "nd6_dad_timer: called with non-tentative address "
1411                         "%s(%s)\n",
1412                         ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr),
1413                         ifa->ifa_ifp ? if_name(ifa->ifa_ifp) : "???");
1414                 goto err;
1415         }
1416
1417         /* Stop DAD if the interface is down even after dad_maxtry attempts. */
1418         if ((dp->dad_ns_tcount > V_dad_maxtry) &&
1419             (((ifp->if_flags & IFF_UP) == 0) ||
1420              ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0))) {
1421                 nd6log((LOG_INFO, "%s: could not run DAD, driver problem?\n",
1422                     if_name(ifa->ifa_ifp)));
1423                 goto err;
1424         }
1425
1426         /* Need more checks? */
1427         if (dp->dad_ns_ocount < dp->dad_count) {
1428                 /*
1429                  * We have more NS to go.  Send NS packet for DAD.
1430                  */
1431                 nd6_dad_ns_output(dp, ifa);
1432                 nd6_dad_starttimer(dp,
1433                     (long)ND_IFINFO(ifa->ifa_ifp)->retrans * hz / 1000);
1434                 goto done;
1435         } else {
1436                 /*
1437                  * We have transmitted sufficient number of DAD packets.
1438                  * See what we've got.
1439                  */
1440                 if (dp->dad_ns_icount > 0 || dp->dad_na_icount > 0)
1441                         /* We've seen NS or NA, means DAD has failed. */
1442                         nd6_dad_duplicated(ifa, dp);
1443                 else if (V_dad_enhanced != 0 &&
1444                     dp->dad_ns_lcount > 0 &&
1445                     dp->dad_ns_lcount > dp->dad_loopbackprobe) {
1446                         /*
1447                          * Sec. 4.1 in RFC 7527 requires transmission of
1448                          * additional probes until the loopback condition
1449                          * becomes clear when a looped back probe is detected.
1450                          */
1451                         log(LOG_ERR, "%s: a looped back NS message is "
1452                             "detected during DAD for %s.  "
1453                             "Another DAD probes are being sent.\n",
1454                             if_name(ifa->ifa_ifp),
1455                             ip6_sprintf(ip6buf, IFA_IN6(ifa)));
1456                         dp->dad_loopbackprobe = dp->dad_ns_lcount;
1457                         /*
1458                          * Send an NS immediately and increase dad_count by
1459                          * V_nd6_mmaxtries - 1.
1460                          */
1461                         nd6_dad_ns_output(dp, ifa);
1462                         dp->dad_count =
1463                             dp->dad_ns_ocount + V_nd6_mmaxtries - 1;
1464                         nd6_dad_starttimer(dp,
1465                             (long)ND_IFINFO(ifa->ifa_ifp)->retrans * hz / 1000);
1466                         goto done;
1467                 } else {
1468                         /*
1469                          * We are done with DAD.  No NA came, no NS came.
1470                          * No duplicate address found.  Check IFDISABLED flag
1471                          * again in case that it is changed between the
1472                          * beginning of this function and here.
1473                          */
1474                         if ((ND_IFINFO(ifp)->flags & ND6_IFF_IFDISABLED) == 0)
1475                                 ia->ia6_flags &= ~IN6_IFF_TENTATIVE;
1476
1477                         nd6log((LOG_DEBUG,
1478                             "%s: DAD complete for %s - no duplicates found\n",
1479                             if_name(ifa->ifa_ifp),
1480                             ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr)));
1481                         if (dp->dad_ns_lcount > 0)
1482                                 log(LOG_ERR, "%s: DAD completed while "
1483                                     "a looped back NS message is detected "
1484                                     "during DAD for %s.\n",
1485                                     if_name(ifa->ifa_ifp),
1486                                     ip6_sprintf(ip6buf, IFA_IN6(ifa)));
1487                 }
1488         }
1489 err:
1490         nd6_dad_del(dp);
1491 done:
1492         CURVNET_RESTORE();
1493 }
1494
1495 static void
1496 nd6_dad_duplicated(struct ifaddr *ifa, struct dadq *dp)
1497 {
1498         struct in6_ifaddr *ia = (struct in6_ifaddr *)ifa;
1499         struct ifnet *ifp;
1500         char ip6buf[INET6_ADDRSTRLEN];
1501
1502         log(LOG_ERR, "%s: DAD detected duplicate IPv6 address %s: "
1503             "NS in/out/loopback=%d/%d/%d, NA in=%d\n",
1504             if_name(ifa->ifa_ifp), ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr),
1505             dp->dad_ns_icount, dp->dad_ns_ocount, dp->dad_ns_lcount,
1506             dp->dad_na_icount);
1507
1508         ia->ia6_flags &= ~IN6_IFF_TENTATIVE;
1509         ia->ia6_flags |= IN6_IFF_DUPLICATED;
1510
1511         ifp = ifa->ifa_ifp;
1512         log(LOG_ERR, "%s: DAD complete for %s - duplicate found\n",
1513             if_name(ifp), ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr));
1514         log(LOG_ERR, "%s: manual intervention required\n",
1515             if_name(ifp));
1516
1517         /*
1518          * If the address is a link-local address formed from an interface
1519          * identifier based on the hardware address which is supposed to be
1520          * uniquely assigned (e.g., EUI-64 for an Ethernet interface), IP
1521          * operation on the interface SHOULD be disabled.
1522          * [RFC 4862, Section 5.4.5]
1523          */
1524         if (IN6_IS_ADDR_LINKLOCAL(&ia->ia_addr.sin6_addr)) {
1525                 struct in6_addr in6;
1526
1527                 /*
1528                  * To avoid over-reaction, we only apply this logic when we are
1529                  * very sure that hardware addresses are supposed to be unique.
1530                  */
1531                 switch (ifp->if_type) {
1532                 case IFT_ETHER:
1533                 case IFT_FDDI:
1534                 case IFT_ATM:
1535                 case IFT_IEEE1394:
1536                 case IFT_IEEE80211:
1537                 case IFT_INFINIBAND:
1538                         in6 = ia->ia_addr.sin6_addr;
1539                         if (in6_get_hw_ifid(ifp, &in6) == 0 &&
1540                             IN6_ARE_ADDR_EQUAL(&ia->ia_addr.sin6_addr, &in6)) {
1541                                 ND_IFINFO(ifp)->flags |= ND6_IFF_IFDISABLED;
1542                                 log(LOG_ERR, "%s: possible hardware address "
1543                                     "duplication detected, disable IPv6\n",
1544                                     if_name(ifp));
1545                         }
1546                         break;
1547                 }
1548         }
1549 }
1550
1551 static void
1552 nd6_dad_ns_output(struct dadq *dp, struct ifaddr *ifa)
1553 {
1554         struct in6_ifaddr *ia = (struct in6_ifaddr *)ifa;
1555         struct ifnet *ifp = ifa->ifa_ifp;
1556         int i;
1557
1558         dp->dad_ns_tcount++;
1559         if ((ifp->if_flags & IFF_UP) == 0) {
1560                 return;
1561         }
1562         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
1563                 return;
1564         }
1565
1566         dp->dad_ns_ocount++;
1567         if (V_dad_enhanced != 0) {
1568                 for (i = 0; i < ND_OPT_NONCE_LEN32; i++)
1569                         dp->dad_nonce[i] = arc4random();
1570                 /*
1571                  * XXXHRS: Note that in the case that
1572                  * DupAddrDetectTransmits > 1, multiple NS messages with
1573                  * different nonces can be looped back in an unexpected
1574                  * order.  The current implementation recognizes only
1575                  * the latest nonce on the sender side.  Practically it
1576                  * should work well in almost all cases.
1577                  */
1578         }
1579         nd6_ns_output(ifp, NULL, &ia->ia_addr.sin6_addr, NULL,
1580             (uint8_t *)&dp->dad_nonce[0]);
1581 }
1582
1583 static void
1584 nd6_dad_ns_input(struct ifaddr *ifa, struct nd_opt_nonce *ndopt_nonce)
1585 {
1586         struct in6_ifaddr *ia;
1587         struct ifnet *ifp;
1588         const struct in6_addr *taddr6;
1589         struct dadq *dp;
1590
1591         if (ifa == NULL)
1592                 panic("ifa == NULL in nd6_dad_ns_input");
1593
1594         ia = (struct in6_ifaddr *)ifa;
1595         ifp = ifa->ifa_ifp;
1596         taddr6 = &ia->ia_addr.sin6_addr;
1597         /* Ignore Nonce option when Enhanced DAD is disabled. */
1598         if (V_dad_enhanced == 0)
1599                 ndopt_nonce = NULL;
1600         dp = nd6_dad_find(ifa, ndopt_nonce);
1601         if (dp == NULL)
1602                 return;
1603
1604         dp->dad_ns_icount++;
1605         nd6_dad_rele(dp);
1606 }
1607
1608 static void
1609 nd6_dad_na_input(struct ifaddr *ifa)
1610 {
1611         struct dadq *dp;
1612
1613         if (ifa == NULL)
1614                 panic("ifa == NULL in nd6_dad_na_input");
1615
1616         dp = nd6_dad_find(ifa, NULL);
1617         if (dp != NULL) {
1618                 dp->dad_na_icount++;
1619                 nd6_dad_rele(dp);
1620         }
1621 }