Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  *      Neighbour Discovery for IPv6
  3  *      Linux INET6 implementation
  4  *
  5  *      Authors:
  6  *      Pedro Roque             <roque@di.fc.ul.pt>
  7  *      Mike Shaver             <shaver@ingenia.com>
  8  *
  9  *      This program is free software; you can redistribute it and/or
 10  *      modify it under the terms of the GNU General Public License
 11  *      as published by the Free Software Foundation; either version
 12  *      2 of the License, or (at your option) any later version.
 13  */
 14 
 15 /*
 16  *      Changes:
 17  *
 18  *      Pierre Ynard                    :       export userland ND options
 19  *                                              through netlink (RDNSS support)
 20  *      Lars Fenneberg                  :       fixed MTU setting on receipt
 21  *                                              of an RA.
 22  *      Janos Farkas                    :       kmalloc failure checks
 23  *      Alexey Kuznetsov                :       state machine reworked
 24  *                                              and moved to net/core.
 25  *      Pekka Savola                    :       RFC2461 validation
 26  *      YOSHIFUJI Hideaki @USAGI        :       Verify ND options properly
 27  */
 28 
 29 /* Set to 3 to get tracing... */
 30 #define ND_DEBUG 1
 31 
 32 #define ND_PRINTK(fmt, args...) do { if (net_ratelimit()) { printk(fmt, ## args); } } while(0)
 33 #define ND_NOPRINTK(x...) do { ; } while(0)
 34 #define ND_PRINTK0 ND_PRINTK
 35 #define ND_PRINTK1 ND_NOPRINTK
 36 #define ND_PRINTK2 ND_NOPRINTK
 37 #define ND_PRINTK3 ND_NOPRINTK
 38 #if ND_DEBUG >= 1
 39 #undef ND_PRINTK1
 40 #define ND_PRINTK1 ND_PRINTK
 41 #endif
 42 #if ND_DEBUG >= 2
 43 #undef ND_PRINTK2
 44 #define ND_PRINTK2 ND_PRINTK
 45 #endif
 46 #if ND_DEBUG >= 3
 47 #undef ND_PRINTK3
 48 #define ND_PRINTK3 ND_PRINTK
 49 #endif
 50 
 51 #include <linux/module.h>
 52 #include <linux/errno.h>
 53 #include <linux/types.h>
 54 #include <linux/socket.h>
 55 #include <linux/sockios.h>
 56 #include <linux/sched.h>
 57 #include <linux/net.h>
 58 #include <linux/in6.h>
 59 #include <linux/route.h>
 60 #include <linux/init.h>
 61 #include <linux/rcupdate.h>
 62 #ifdef CONFIG_SYSCTL
 63 #include <linux/sysctl.h>
 64 #endif
 65 
 66 #include <linux/if_addr.h>
 67 #include <linux/if_arp.h>
 68 #include <linux/ipv6.h>
 69 #include <linux/icmpv6.h>
 70 #include <linux/jhash.h>
 71 
 72 #include <net/sock.h>
 73 #include <net/snmp.h>
 74 
 75 #include <net/ipv6.h>
 76 #include <net/protocol.h>
 77 #include <net/ndisc.h>
 78 #include <net/ip6_route.h>
 79 #include <net/addrconf.h>
 80 #include <net/icmp.h>
 81 
 82 #include <net/netlink.h>
 83 #include <linux/rtnetlink.h>
 84 
 85 #include <net/flow.h>
 86 #include <net/ip6_checksum.h>
 87 #include <net/inet_common.h>
 88 #include <linux/proc_fs.h>
 89 
 90 #include <linux/netfilter.h>
 91 #include <linux/netfilter_ipv6.h>
 92 
 93 static u32 ndisc_hash(const void *pkey, const struct net_device *dev);
 94 static int ndisc_constructor(struct neighbour *neigh);
 95 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb);
 96 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb);
 97 static int pndisc_constructor(struct pneigh_entry *n);
 98 static void pndisc_destructor(struct pneigh_entry *n);
 99 static void pndisc_redo(struct sk_buff *skb);
100 
101 static struct neigh_ops ndisc_generic_ops = {
102         .family =               AF_INET6,
103         .solicit =              ndisc_solicit,
104         .error_report =         ndisc_error_report,
105         .output =               neigh_resolve_output,
106         .connected_output =     neigh_connected_output,
107         .hh_output =            dev_queue_xmit,
108         .queue_xmit =           dev_queue_xmit,
109 };
110 
111 static struct neigh_ops ndisc_hh_ops = {
112         .family =               AF_INET6,
113         .solicit =              ndisc_solicit,
114         .error_report =         ndisc_error_report,
115         .output =               neigh_resolve_output,
116         .connected_output =     neigh_resolve_output,
117         .hh_output =            dev_queue_xmit,
118         .queue_xmit =           dev_queue_xmit,
119 };
120 
121 
122 static struct neigh_ops ndisc_direct_ops = {
123         .family =               AF_INET6,
124         .output =               dev_queue_xmit,
125         .connected_output =     dev_queue_xmit,
126         .hh_output =            dev_queue_xmit,
127         .queue_xmit =           dev_queue_xmit,
128 };
129 
130 struct neigh_table nd_tbl = {
131         .family =       AF_INET6,
132         .entry_size =   sizeof(struct neighbour) + sizeof(struct in6_addr),
133         .key_len =      sizeof(struct in6_addr),
134         .hash =         ndisc_hash,
135         .constructor =  ndisc_constructor,
136         .pconstructor = pndisc_constructor,
137         .pdestructor =  pndisc_destructor,
138         .proxy_redo =   pndisc_redo,
139         .id =           "ndisc_cache",
140         .parms = {
141                 .tbl =                  &nd_tbl,
142                 .base_reachable_time =  30 * HZ,
143                 .retrans_time =  1 * HZ,
144                 .gc_staletime = 60 * HZ,
145                 .reachable_time =               30 * HZ,
146                 .delay_probe_time =      5 * HZ,
147                 .queue_len =             3,
148                 .ucast_probes =  3,
149                 .mcast_probes =  3,
150                 .anycast_delay =         1 * HZ,
151                 .proxy_delay =          (8 * HZ) / 10,
152                 .proxy_qlen =           64,
153         },
154         .gc_interval =    30 * HZ,
155         .gc_thresh1 =    128,
156         .gc_thresh2 =    512,
157         .gc_thresh3 =   1024,
158 };
159 
160 /* ND options */
161 struct ndisc_options {
162         struct nd_opt_hdr *nd_opt_array[__ND_OPT_ARRAY_MAX];
163 #ifdef CONFIG_IPV6_ROUTE_INFO
164         struct nd_opt_hdr *nd_opts_ri;
165         struct nd_opt_hdr *nd_opts_ri_end;
166 #endif
167         struct nd_opt_hdr *nd_useropts;
168         struct nd_opt_hdr *nd_useropts_end;
169 };
170 
171 #define nd_opts_src_lladdr      nd_opt_array[ND_OPT_SOURCE_LL_ADDR]
172 #define nd_opts_tgt_lladdr      nd_opt_array[ND_OPT_TARGET_LL_ADDR]
173 #define nd_opts_pi              nd_opt_array[ND_OPT_PREFIX_INFO]
174 #define nd_opts_pi_end          nd_opt_array[__ND_OPT_PREFIX_INFO_END]
175 #define nd_opts_rh              nd_opt_array[ND_OPT_REDIRECT_HDR]
176 #define nd_opts_mtu             nd_opt_array[ND_OPT_MTU]
177 
178 #define NDISC_OPT_SPACE(len) (((len)+2+7)&~7)
179 
180 /*
181  * Return the padding between the option length and the start of the
182  * link addr.  Currently only IP-over-InfiniBand needs this, although
183  * if RFC 3831 IPv6-over-Fibre Channel is ever implemented it may
184  * also need a pad of 2.
185  */
186 static int ndisc_addr_option_pad(unsigned short type)
187 {
188         switch (type) {
189         case ARPHRD_INFINIBAND: return 2;
190         default:                return 0;
191         }
192 }
193 
194 static inline int ndisc_opt_addr_space(struct net_device *dev)
195 {
196         return NDISC_OPT_SPACE(dev->addr_len + ndisc_addr_option_pad(dev->type));
197 }
198 
199 static u8 *ndisc_fill_addr_option(u8 *opt, int type, void *data, int data_len,
200                                   unsigned short addr_type)
201 {
202         int space = NDISC_OPT_SPACE(data_len);
203         int pad   = ndisc_addr_option_pad(addr_type);
204 
205         opt[0] = type;
206         opt[1] = space>>3;
207 
208         memset(opt + 2, 0, pad);
209         opt   += pad;
210         space -= pad;
211 
212         memcpy(opt+2, data, data_len);
213         data_len += 2;
214         opt += data_len;
215         if ((space -= data_len) > 0)
216                 memset(opt, 0, space);
217         return opt + space;
218 }
219 
220 static struct nd_opt_hdr *ndisc_next_option(struct nd_opt_hdr *cur,
221                                             struct nd_opt_hdr *end)
222 {
223         int type;
224         if (!cur || !end || cur >= end)
225                 return NULL;
226         type = cur->nd_opt_type;
227         do {
228                 cur = ((void *)cur) + (cur->nd_opt_len << 3);
229         } while(cur < end && cur->nd_opt_type != type);
230         return (cur <= end && cur->nd_opt_type == type ? cur : NULL);
231 }
232 
233 static inline int ndisc_is_useropt(struct nd_opt_hdr *opt)
234 {
235         return (opt->nd_opt_type == ND_OPT_RDNSS);
236 }
237 
238 static struct nd_opt_hdr *ndisc_next_useropt(struct nd_opt_hdr *cur,
239                                              struct nd_opt_hdr *end)
240 {
241         if (!cur || !end || cur >= end)
242                 return NULL;
243         do {
244                 cur = ((void *)cur) + (cur->nd_opt_len << 3);
245         } while(cur < end && !ndisc_is_useropt(cur));
246         return (cur <= end && ndisc_is_useropt(cur) ? cur : NULL);
247 }
248 
249 static struct ndisc_options *ndisc_parse_options(u8 *opt, int opt_len,
250                                                  struct ndisc_options *ndopts)
251 {
252         struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)opt;
253 
254         if (!nd_opt || opt_len < 0 || !ndopts)
255                 return NULL;
256         memset(ndopts, 0, sizeof(*ndopts));
257         while (opt_len) {
258                 int l;
259                 if (opt_len < sizeof(struct nd_opt_hdr))
260                         return NULL;
261                 l = nd_opt->nd_opt_len << 3;
262                 if (opt_len < l || l == 0)
263                         return NULL;
264                 switch (nd_opt->nd_opt_type) {
265                 case ND_OPT_SOURCE_LL_ADDR:
266                 case ND_OPT_TARGET_LL_ADDR:
267                 case ND_OPT_MTU:
268                 case ND_OPT_REDIRECT_HDR:
269                         if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) {
270                                 ND_PRINTK2(KERN_WARNING
271                                            "%s(): duplicated ND6 option found: type=%d\n",
272                                            __func__,
273                                            nd_opt->nd_opt_type);
274                         } else {
275                                 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
276                         }
277                         break;
278                 case ND_OPT_PREFIX_INFO:
279                         ndopts->nd_opts_pi_end = nd_opt;
280                         if (!ndopts->nd_opt_array[nd_opt->nd_opt_type])
281                                 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
282                         break;
283 #ifdef CONFIG_IPV6_ROUTE_INFO
284                 case ND_OPT_ROUTE_INFO:
285                         ndopts->nd_opts_ri_end = nd_opt;
286                         if (!ndopts->nd_opts_ri)
287                                 ndopts->nd_opts_ri = nd_opt;
288                         break;
289 #endif
290                 default:
291                         if (ndisc_is_useropt(nd_opt)) {
292                                 ndopts->nd_useropts_end = nd_opt;
293                                 if (!ndopts->nd_useropts)
294                                         ndopts->nd_useropts = nd_opt;
295                         } else {
296                                 /*
297                                  * Unknown options must be silently ignored,
298                                  * to accommodate future extension to the
299                                  * protocol.
300                                  */
301                                 ND_PRINTK2(KERN_NOTICE
302                                            "%s(): ignored unsupported option; type=%d, len=%d\n",
303                                            __func__,
304                                            nd_opt->nd_opt_type, nd_opt->nd_opt_len);
305                         }
306                 }
307                 opt_len -= l;
308                 nd_opt = ((void *)nd_opt) + l;
309         }
310         return ndopts;
311 }
312 
313 static inline u8 *ndisc_opt_addr_data(struct nd_opt_hdr *p,
314                                       struct net_device *dev)
315 {
316         u8 *lladdr = (u8 *)(p + 1);
317         int lladdrlen = p->nd_opt_len << 3;
318         int prepad = ndisc_addr_option_pad(dev->type);
319         if (lladdrlen != NDISC_OPT_SPACE(dev->addr_len + prepad))
320                 return NULL;
321         return (lladdr + prepad);
322 }
323 
324 int ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *dev, int dir)
325 {
326         switch (dev->type) {
327         case ARPHRD_ETHER:
328         case ARPHRD_IEEE802:    /* Not sure. Check it later. --ANK */
329         case ARPHRD_FDDI:
330                 ipv6_eth_mc_map(addr, buf);
331                 return 0;
332         case ARPHRD_IEEE802_TR:
333                 ipv6_tr_mc_map(addr,buf);
334                 return 0;
335         case ARPHRD_ARCNET:
336                 ipv6_arcnet_mc_map(addr, buf);
337                 return 0;
338         case ARPHRD_INFINIBAND:
339                 ipv6_ib_mc_map(addr, dev->broadcast, buf);
340                 return 0;
341         default:
342                 if (dir) {
343                         memcpy(buf, dev->broadcast, dev->addr_len);
344                         return 0;
345                 }
346         }
347         return -EINVAL;
348 }
349 
350 EXPORT_SYMBOL(ndisc_mc_map);
351 
352 static u32 ndisc_hash(const void *pkey, const struct net_device *dev)
353 {
354         const u32 *p32 = pkey;
355         u32 addr_hash, i;
356 
357         addr_hash = 0;
358         for (i = 0; i < (sizeof(struct in6_addr) / sizeof(u32)); i++)
359                 addr_hash ^= *p32++;
360 
361         return jhash_2words(addr_hash, dev->ifindex, nd_tbl.hash_rnd);
362 }
363 
364 static int ndisc_constructor(struct neighbour *neigh)
365 {
366         struct in6_addr *addr = (struct in6_addr*)&neigh->primary_key;
367         struct net_device *dev = neigh->dev;
368         struct inet6_dev *in6_dev;
369         struct neigh_parms *parms;
370         int is_multicast = ipv6_addr_is_multicast(addr);
371 
372         rcu_read_lock();
373         in6_dev = in6_dev_get(dev);
374         if (in6_dev == NULL) {
375                 rcu_read_unlock();
376                 return -EINVAL;
377         }
378 
379         parms = in6_dev->nd_parms;
380         __neigh_parms_put(neigh->parms);
381         neigh->parms = neigh_parms_clone(parms);
382         rcu_read_unlock();
383 
384         neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST;
385         if (!dev->header_ops) {
386                 neigh->nud_state = NUD_NOARP;
387                 neigh->ops = &ndisc_direct_ops;
388                 neigh->output = neigh->ops->queue_xmit;
389         } else {
390                 if (is_multicast) {
391                         neigh->nud_state = NUD_NOARP;
392                         ndisc_mc_map(addr, neigh->ha, dev, 1);
393                 } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) {
394                         neigh->nud_state = NUD_NOARP;
395                         memcpy(neigh->ha, dev->dev_addr, dev->addr_len);
396                         if (dev->flags&IFF_LOOPBACK)
397                                 neigh->type = RTN_LOCAL;
398                 } else if (dev->flags&IFF_POINTOPOINT) {
399                         neigh->nud_state = NUD_NOARP;
400                         memcpy(neigh->ha, dev->broadcast, dev->addr_len);
401                 }
402                 if (dev->header_ops->cache)
403                         neigh->ops = &ndisc_hh_ops;
404                 else
405                         neigh->ops = &ndisc_generic_ops;
406                 if (neigh->nud_state&NUD_VALID)
407                         neigh->output = neigh->ops->connected_output;
408                 else
409                         neigh->output = neigh->ops->output;
410         }
411         in6_dev_put(in6_dev);
412         return 0;
413 }
414 
415 static int pndisc_constructor(struct pneigh_entry *n)
416 {
417         struct in6_addr *addr = (struct in6_addr*)&n->key;
418         struct in6_addr maddr;
419         struct net_device *dev = n->dev;
420 
421         if (dev == NULL || __in6_dev_get(dev) == NULL)
422                 return -EINVAL;
423         addrconf_addr_solict_mult(addr, &maddr);
424         ipv6_dev_mc_inc(dev, &maddr);
425         return 0;
426 }
427 
428 static void pndisc_destructor(struct pneigh_entry *n)
429 {
430         struct in6_addr *addr = (struct in6_addr*)&n->key;
431         struct in6_addr maddr;
432         struct net_device *dev = n->dev;
433 
434         if (dev == NULL || __in6_dev_get(dev) == NULL)
435                 return;
436         addrconf_addr_solict_mult(addr, &maddr);
437         ipv6_dev_mc_dec(dev, &maddr);
438 }
439 
440 struct sk_buff *ndisc_build_skb(struct net_device *dev,
441                                 const struct in6_addr *daddr,
442                                 const struct in6_addr *saddr,
443                                 struct icmp6hdr *icmp6h,
444                                 const struct in6_addr *target,
445                                 int llinfo)
446 {
447         struct net *net = dev_net(dev);
448         struct sock *sk = net->ipv6.ndisc_sk;
449         struct sk_buff *skb;
450         struct icmp6hdr *hdr;
451         int len;
452         int err;
453         u8 *opt;
454 
455         if (!dev->addr_len)
456                 llinfo = 0;
457 
458         len = sizeof(struct icmp6hdr) + (target ? sizeof(*target) : 0);
459         if (llinfo)
460                 len += ndisc_opt_addr_space(dev);
461 
462         skb = sock_alloc_send_skb(sk,
463                                   (MAX_HEADER + sizeof(struct ipv6hdr) +
464                                    len + LL_ALLOCATED_SPACE(dev)),
465                                   1, &err);
466         if (!skb) {
467                 ND_PRINTK0(KERN_ERR
468                            "ICMPv6 ND: %s() failed to allocate an skb, err=%d.\n",
469                            __func__, err);
470                 return NULL;
471         }
472 
473         skb_reserve(skb, LL_RESERVED_SPACE(dev));
474         ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len);
475 
476         skb->transport_header = skb->tail;
477         skb_put(skb, len);
478 
479         hdr = (struct icmp6hdr *)skb_transport_header(skb);
480         memcpy(hdr, icmp6h, sizeof(*hdr));
481 
482         opt = skb_transport_header(skb) + sizeof(struct icmp6hdr);
483         if (target) {
484                 ipv6_addr_copy((struct in6_addr *)opt, target);
485                 opt += sizeof(*target);
486         }
487 
488         if (llinfo)
489                 ndisc_fill_addr_option(opt, llinfo, dev->dev_addr,
490                                        dev->addr_len, dev->type);
491 
492         hdr->icmp6_cksum = csum_ipv6_magic(saddr, daddr, len,
493                                            IPPROTO_ICMPV6,
494                                            csum_partial(hdr,
495                                                         len, 0));
496 
497         return skb;
498 }
499 
500 EXPORT_SYMBOL(ndisc_build_skb);
501 
502 void ndisc_send_skb(struct sk_buff *skb,
503                     struct net_device *dev,
504                     struct neighbour *neigh,
505                     const struct in6_addr *daddr,
506                     const struct in6_addr *saddr,
507                     struct icmp6hdr *icmp6h)
508 {
509         struct flowi fl;
510         struct dst_entry *dst;
511         struct net *net = dev_net(dev);
512         struct sock *sk = net->ipv6.ndisc_sk;
513         struct inet6_dev *idev;
514         int err;
515         u8 type;
516 
517         type = icmp6h->icmp6_type;
518 
519         icmpv6_flow_init(sk, &fl, type, saddr, daddr, dev->ifindex);
520 
521         dst = icmp6_dst_alloc(dev, neigh, daddr);
522         if (!dst) {
523                 kfree_skb(skb);
524                 return;
525         }
526 
527         err = xfrm_lookup(net, &dst, &fl, NULL, 0);
528         if (err < 0) {
529                 kfree_skb(skb);
530                 return;
531         }
532 
533         skb_dst_set(skb, dst);
534 
535         idev = in6_dev_get(dst->dev);
536         IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len);
537 
538         err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, skb, NULL, dst->dev,
539                       dst_output);
540         if (!err) {
541                 ICMP6MSGOUT_INC_STATS(net, idev, type);
542                 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
543         }
544 
545         if (likely(idev != NULL))
546                 in6_dev_put(idev);
547 }
548 
549 EXPORT_SYMBOL(ndisc_send_skb);
550 
551 /*
552  *      Send a Neighbour Discover packet
553  */
554 static void __ndisc_send(struct net_device *dev,
555                          struct neighbour *neigh,
556                          const struct in6_addr *daddr,
557                          const struct in6_addr *saddr,
558                          struct icmp6hdr *icmp6h, const struct in6_addr *target,
559                          int llinfo)
560 {
561         struct sk_buff *skb;
562 
563         skb = ndisc_build_skb(dev, daddr, saddr, icmp6h, target, llinfo);
564         if (!skb)
565                 return;
566 
567         ndisc_send_skb(skb, dev, neigh, daddr, saddr, icmp6h);
568 }
569 
570 static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
571                           const struct in6_addr *daddr,
572                           const struct in6_addr *solicited_addr,
573                           int router, int solicited, int override, int inc_opt)
574 {
575         struct in6_addr tmpaddr;
576         struct inet6_ifaddr *ifp;
577         const struct in6_addr *src_addr;
578         struct icmp6hdr icmp6h = {
579                 .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
580         };
581 
582         /* for anycast or proxy, solicited_addr != src_addr */
583         ifp = ipv6_get_ifaddr(dev_net(dev), solicited_addr, dev, 1);
584         if (ifp) {
585                 src_addr = solicited_addr;
586                 if (ifp->flags & IFA_F_OPTIMISTIC)
587                         override = 0;
588                 in6_ifa_put(ifp);
589         } else {
590                 if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr,
591                                        inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs,
592                                        &tmpaddr))
593                         return;
594                 src_addr = &tmpaddr;
595         }
596 
597         icmp6h.icmp6_router = router;
598         icmp6h.icmp6_solicited = solicited;
599         icmp6h.icmp6_override = override;
600 
601         __ndisc_send(dev, neigh, daddr, src_addr,
602                      &icmp6h, solicited_addr,
603                      inc_opt ? ND_OPT_TARGET_LL_ADDR : 0);
604 }
605 
606 void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
607                    const struct in6_addr *solicit,
608                    const struct in6_addr *daddr, const struct in6_addr *saddr)
609 {
610         struct in6_addr addr_buf;
611         struct icmp6hdr icmp6h = {
612                 .icmp6_type = NDISC_NEIGHBOUR_SOLICITATION,
613         };
614 
615         if (saddr == NULL) {
616                 if (ipv6_get_lladdr(dev, &addr_buf,
617                                    (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)))
618                         return;
619                 saddr = &addr_buf;
620         }
621 
622         __ndisc_send(dev, neigh, daddr, saddr,
623                      &icmp6h, solicit,
624                      !ipv6_addr_any(saddr) ? ND_OPT_SOURCE_LL_ADDR : 0);
625 }
626 
627 void ndisc_send_rs(struct net_device *dev, const struct in6_addr *saddr,
628                    const struct in6_addr *daddr)
629 {
630         struct icmp6hdr icmp6h = {
631                 .icmp6_type = NDISC_ROUTER_SOLICITATION,
632         };
633         int send_sllao = dev->addr_len;
634 
635 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
636         /*
637          * According to section 2.2 of RFC 4429, we must not
638          * send router solicitations with a sllao from
639          * optimistic addresses, but we may send the solicitation
640          * if we don't include the sllao.  So here we check
641          * if our address is optimistic, and if so, we
642          * suppress the inclusion of the sllao.
643          */
644         if (send_sllao) {
645                 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(dev_net(dev), saddr,
646                                                            dev, 1);
647                 if (ifp) {
648                         if (ifp->flags & IFA_F_OPTIMISTIC)  {
649                                 send_sllao = 0;
650                         }
651                         in6_ifa_put(ifp);
652                 } else {
653                         send_sllao = 0;
654                 }
655         }
656 #endif
657         __ndisc_send(dev, NULL, daddr, saddr,
658                      &icmp6h, NULL,
659                      send_sllao ? ND_OPT_SOURCE_LL_ADDR : 0);
660 }
661 EXPORT_SYMBOL(ndisc_send_rs);
662 
663 
664 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb)
665 {
666         /*
667          *      "The sender MUST return an ICMP
668          *       destination unreachable"
669          */
670         dst_link_failure(skb);
671         kfree_skb(skb);
672 }
673 
674 /* Called with locked neigh: either read or both */
675 
676 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
677 {
678         struct in6_addr *saddr = NULL;
679         struct in6_addr mcaddr;
680         struct net_device *dev = neigh->dev;
681         struct in6_addr *target = (struct in6_addr *)&neigh->primary_key;
682         int probes = atomic_read(&neigh->probes);
683 
684         if (skb && ipv6_chk_addr(dev_net(dev), &ipv6_hdr(skb)->saddr, dev, 1))
685                 saddr = &ipv6_hdr(skb)->saddr;
686 
687         if ((probes -= neigh->parms->ucast_probes) < 0) {
688                 if (!(neigh->nud_state & NUD_VALID)) {
689                         ND_PRINTK1(KERN_DEBUG "%s(): trying to ucast probe in NUD_INVALID: %pI6\n",
690                                    __func__, target);
691                 }
692                 ndisc_send_ns(dev, neigh, target, target, saddr);
693         } else if ((probes -= neigh->parms->app_probes) < 0) {
694 #ifdef CONFIG_ARPD
695                 neigh_app_ns(neigh);
696 #endif
697         } else {
698                 addrconf_addr_solict_mult(target, &mcaddr);
699                 ndisc_send_ns(dev, NULL, target, &mcaddr, saddr);
700         }
701 }
702 
703 static int pndisc_is_router(const void *pkey,
704                             struct net_device *dev)
705 {
706         struct pneigh_entry *n;
707         int ret = -1;
708 
709         read_lock_bh(&nd_tbl.lock);
710         n = __pneigh_lookup(&nd_tbl, dev_net(dev), pkey, dev);
711         if (n)
712                 ret = !!(n->flags & NTF_ROUTER);
713         read_unlock_bh(&nd_tbl.lock);
714 
715         return ret;
716 }
717 
718 static void ndisc_recv_ns(struct sk_buff *skb)
719 {
720         struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
721         struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
722         struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
723         u8 *lladdr = NULL;
724         u32 ndoptlen = skb->tail - (skb->transport_header +
725                                     offsetof(struct nd_msg, opt));
726         struct ndisc_options ndopts;
727         struct net_device *dev = skb->dev;
728         struct inet6_ifaddr *ifp;
729         struct inet6_dev *idev = NULL;
730         struct neighbour *neigh;
731         int dad = ipv6_addr_any(saddr);
732         int inc;
733         int is_router = -1;
734 
735         if (ipv6_addr_is_multicast(&msg->target)) {
736                 ND_PRINTK2(KERN_WARNING
737                            "ICMPv6 NS: multicast target address");
738                 return;
739         }
740 
741         /*
742          * RFC2461 7.1.1:
743          * DAD has to be destined for solicited node multicast address.
744          */
745         if (dad &&
746             !(daddr->s6_addr32[0] == htonl(0xff020000) &&
747               daddr->s6_addr32[1] == htonl(0x00000000) &&
748               daddr->s6_addr32[2] == htonl(0x00000001) &&
749               daddr->s6_addr [12] == 0xff )) {
750                 ND_PRINTK2(KERN_WARNING
751                            "ICMPv6 NS: bad DAD packet (wrong destination)\n");
752                 return;
753         }
754 
755         if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
756                 ND_PRINTK2(KERN_WARNING
757                            "ICMPv6 NS: invalid ND options\n");
758                 return;
759         }
760 
761         if (ndopts.nd_opts_src_lladdr) {
762                 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev);
763                 if (!lladdr) {
764                         ND_PRINTK2(KERN_WARNING
765                                    "ICMPv6 NS: invalid link-layer address length\n");
766                         return;
767                 }
768 
769                 /* RFC2461 7.1.1:
770                  *      If the IP source address is the unspecified address,
771                  *      there MUST NOT be source link-layer address option
772                  *      in the message.
773                  */
774                 if (dad) {
775                         ND_PRINTK2(KERN_WARNING
776                                    "ICMPv6 NS: bad DAD packet (link-layer address option)\n");
777                         return;
778                 }
779         }
780 
781         inc = ipv6_addr_is_multicast(daddr);
782 
783         ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
784         if (ifp) {
785 
786                 if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) {
787                         if (dad) {
788                                 if (dev->type == ARPHRD_IEEE802_TR) {
789                                         const unsigned char *sadr;
790                                         sadr = skb_mac_header(skb);
791                                         if (((sadr[8] ^ dev->dev_addr[0]) & 0x7f) == 0 &&
792                                             sadr[9] == dev->dev_addr[1] &&
793                                             sadr[10] == dev->dev_addr[2] &&
794                                             sadr[11] == dev->dev_addr[3] &&
795                                             sadr[12] == dev->dev_addr[4] &&
796                                             sadr[13] == dev->dev_addr[5]) {
797                                                 /* looped-back to us */
798                                                 goto out;
799                                         }
800                                 }
801 
802                                 /*
803                                  * We are colliding with another node
804                                  * who is doing DAD
805                                  * so fail our DAD process
806                                  */
807                                 addrconf_dad_failure(ifp);
808                                 return;
809                         } else {
810                                 /*
811                                  * This is not a dad solicitation.
812                                  * If we are an optimistic node,
813                                  * we should respond.
814                                  * Otherwise, we should ignore it.
815                                  */
816                                 if (!(ifp->flags & IFA_F_OPTIMISTIC))
817                                         goto out;
818                         }
819                 }
820 
821                 idev = ifp->idev;
822         } else {
823                 struct net *net = dev_net(dev);
824 
825                 idev = in6_dev_get(dev);
826                 if (!idev) {
827                         /* XXX: count this drop? */
828                         return;
829                 }
830 
831                 if (ipv6_chk_acast_addr(net, dev, &msg->target) ||
832                     (idev->cnf.forwarding &&
833                      (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) &&
834                      (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) {
835                         if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
836                             skb->pkt_type != PACKET_HOST &&
837                             inc != 0 &&
838                             idev->nd_parms->proxy_delay != 0) {
839                                 /*
840                                  * for anycast or proxy,
841                                  * sender should delay its response
842                                  * by a random time between 0 and
843                                  * MAX_ANYCAST_DELAY_TIME seconds.
844                                  * (RFC2461) -- yoshfuji
845                                  */
846                                 struct sk_buff *n = skb_clone(skb, GFP_ATOMIC);
847                                 if (n)
848                                         pneigh_enqueue(&nd_tbl, idev->nd_parms, n);
849                                 goto out;
850                         }
851                 } else
852                         goto out;
853         }
854 
855         if (is_router < 0)
856                 is_router = !!idev->cnf.forwarding;
857 
858         if (dad) {
859                 ndisc_send_na(dev, NULL, &in6addr_linklocal_allnodes, &msg->target,
860                               is_router, 0, (ifp != NULL), 1);
861                 goto out;
862         }
863 
864         if (inc)
865                 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_mcast);
866         else
867                 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast);
868 
869         /*
870          *      update / create cache entry
871          *      for the source address
872          */
873         neigh = __neigh_lookup(&nd_tbl, saddr, dev,
874                                !inc || lladdr || !dev->addr_len);
875         if (neigh)
876                 neigh_update(neigh, lladdr, NUD_STALE,
877                              NEIGH_UPDATE_F_WEAK_OVERRIDE|
878                              NEIGH_UPDATE_F_OVERRIDE);
879         if (neigh || !dev->header_ops) {
880                 ndisc_send_na(dev, neigh, saddr, &msg->target,
881                               is_router,
882                               1, (ifp != NULL && inc), inc);
883                 if (neigh)
884                         neigh_release(neigh);
885         }
886 
887 out:
888         if (ifp)
889                 in6_ifa_put(ifp);
890         else
891                 in6_dev_put(idev);
892 
893         return;
894 }
895 
896 static void ndisc_recv_na(struct sk_buff *skb)
897 {
898         struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
899         struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
900         struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
901         u8 *lladdr = NULL;
902         u32 ndoptlen = skb->tail - (skb->transport_header +
903                                     offsetof(struct nd_msg, opt));
904         struct ndisc_options ndopts;
905         struct net_device *dev = skb->dev;
906         struct inet6_ifaddr *ifp;
907         struct neighbour *neigh;
908 
909         if (skb->len < sizeof(struct nd_msg)) {
910                 ND_PRINTK2(KERN_WARNING
911                            "ICMPv6 NA: packet too short\n");
912                 return;
913         }
914 
915         if (ipv6_addr_is_multicast(&msg->target)) {
916                 ND_PRINTK2(KERN_WARNING
917                            "ICMPv6 NA: target address is multicast.\n");
918                 return;
919         }
920 
921         if (ipv6_addr_is_multicast(daddr) &&
922             msg->icmph.icmp6_solicited) {
923                 ND_PRINTK2(KERN_WARNING
924                            "ICMPv6 NA: solicited NA is multicasted.\n");
925                 return;
926         }
927 
928         if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
929                 ND_PRINTK2(KERN_WARNING
930                            "ICMPv6 NS: invalid ND option\n");
931                 return;
932         }
933         if (ndopts.nd_opts_tgt_lladdr) {
934                 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev);
935                 if (!lladdr) {
936                         ND_PRINTK2(KERN_WARNING
937                                    "ICMPv6 NA: invalid link-layer address length\n");
938                         return;
939                 }
940         }
941         ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
942         if (ifp) {
943                 if (ifp->flags & IFA_F_TENTATIVE) {
944                         addrconf_dad_failure(ifp);
945                         return;
946                 }
947                 /* What should we make now? The advertisement
948                    is invalid, but ndisc specs say nothing
949                    about it. It could be misconfiguration, or
950                    an smart proxy agent tries to help us :-)
951 
952                    We should not print the error if NA has been
953                    received from loopback - it is just our own
954                    unsolicited advertisement.
955                  */
956                 if (skb->pkt_type != PACKET_LOOPBACK)
957                         ND_PRINTK1(KERN_WARNING
958                            "ICMPv6 NA: someone advertises our address on %s!\n",
959                            ifp->idev->dev->name);
960                 in6_ifa_put(ifp);
961                 return;
962         }
963         neigh = neigh_lookup(&nd_tbl, &msg->target, dev);
964 
965         if (neigh) {
966                 u8 old_flags = neigh->flags;
967                 struct net *net = dev_net(dev);
968 
969                 if (neigh->nud_state & NUD_FAILED)
970                         goto out;
971 
972                 /*
973                  * Don't update the neighbor cache entry on a proxy NA from
974                  * ourselves because either the proxied node is off link or it
975                  * has already sent a NA to us.
976                  */
977                 if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) &&
978                     net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp &&
979                     pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) {
980                         /* XXX: idev->cnf.prixy_ndp */
981                         goto out;
982                 }
983 
984                 neigh_update(neigh, lladdr,
985                              msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE,
986                              NEIGH_UPDATE_F_WEAK_OVERRIDE|
987                              (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)|
988                              NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
989                              (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0));
990 
991                 if ((old_flags & ~neigh->flags) & NTF_ROUTER) {
992                         /*
993                          * Change: router to host
994                          */
995                         struct rt6_info *rt;
996                         rt = rt6_get_dflt_router(saddr, dev);
997                         if (rt)
998                                 ip6_del_rt(rt);
999                 }
1000 
1001 out:
1002                 neigh_release(neigh);
1003         }
1004 }
1005 
1006 static void ndisc_recv_rs(struct sk_buff *skb)
1007 {
1008         struct rs_msg *rs_msg = (struct rs_msg *)skb_transport_header(skb);
1009         unsigned long ndoptlen = skb->len - sizeof(*rs_msg);
1010         struct neighbour *neigh;
1011         struct inet6_dev *idev;
1012         struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
1013         struct ndisc_options ndopts;
1014         u8 *lladdr = NULL;
1015 
1016         if (skb->len < sizeof(*rs_msg))
1017                 return;
1018 
1019         idev = in6_dev_get(skb->dev);
1020         if (!idev) {
1021                 if (net_ratelimit())
1022                         ND_PRINTK1("ICMP6 RS: can't find in6 device\n");
1023                 return;
1024         }
1025 
1026         /* Don't accept RS if we're not in router mode */
1027         if (!idev->cnf.forwarding)
1028                 goto out;
1029 
1030         /*
1031          * Don't update NCE if src = ::;
1032          * this implies that the source node has no ip address assigned yet.
1033          */
1034         if (ipv6_addr_any(saddr))
1035                 goto out;
1036 
1037         /* Parse ND options */
1038         if (!ndisc_parse_options(rs_msg->opt, ndoptlen, &ndopts)) {
1039                 if (net_ratelimit())
1040                         ND_PRINTK2("ICMP6 NS: invalid ND option, ignored\n");
1041                 goto out;
1042         }
1043 
1044         if (ndopts.nd_opts_src_lladdr) {
1045                 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1046                                              skb->dev);
1047                 if (!lladdr)
1048                         goto out;
1049         }
1050 
1051         neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1);
1052         if (neigh) {
1053                 neigh_update(neigh, lladdr, NUD_STALE,
1054                              NEIGH_UPDATE_F_WEAK_OVERRIDE|
1055                              NEIGH_UPDATE_F_OVERRIDE|
1056                              NEIGH_UPDATE_F_OVERRIDE_ISROUTER);
1057                 neigh_release(neigh);
1058         }
1059 out:
1060         in6_dev_put(idev);
1061 }
1062 
1063 static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt)
1064 {
1065         struct icmp6hdr *icmp6h = (struct icmp6hdr *)skb_transport_header(ra);
1066         struct sk_buff *skb;
1067         struct nlmsghdr *nlh;
1068         struct nduseroptmsg *ndmsg;
1069         struct net *net = dev_net(ra->dev);
1070         int err;
1071         int base_size = NLMSG_ALIGN(sizeof(struct nduseroptmsg)
1072                                     + (opt->nd_opt_len << 3));
1073         size_t msg_size = base_size + nla_total_size(sizeof(struct in6_addr));
1074 
1075         skb = nlmsg_new(msg_size, GFP_ATOMIC);
1076         if (skb == NULL) {
1077                 err = -ENOBUFS;
1078                 goto errout;
1079         }
1080 
1081         nlh = nlmsg_put(skb, 0, 0, RTM_NEWNDUSEROPT, base_size, 0);
1082         if (nlh == NULL) {
1083                 goto nla_put_failure;
1084         }
1085 
1086         ndmsg = nlmsg_data(nlh);
1087         ndmsg->nduseropt_family = AF_INET6;
1088         ndmsg->nduseropt_ifindex = ra->dev->ifindex;
1089         ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type;
1090         ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code;
1091         ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3;
1092 
1093         memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3);
1094 
1095         NLA_PUT(skb, NDUSEROPT_SRCADDR, sizeof(struct in6_addr),
1096                 &ipv6_hdr(ra)->saddr);
1097         nlmsg_end(skb, nlh);
1098 
1099         rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC);
1100         return;
1101 
1102 nla_put_failure:
1103         nlmsg_free(skb);
1104         err = -EMSGSIZE;
1105 errout:
1106         rtnl_set_sk_err(net, RTNLGRP_ND_USEROPT, err);
1107 }
1108 
1109 static void ndisc_router_discovery(struct sk_buff *skb)
1110 {
1111         struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb);
1112         struct neighbour *neigh = NULL;
1113         struct inet6_dev *in6_dev;
1114         struct rt6_info *rt = NULL;
1115         int lifetime;
1116         struct ndisc_options ndopts;
1117         int optlen;
1118         unsigned int pref = 0;
1119 
1120         __u8 * opt = (__u8 *)(ra_msg + 1);
1121 
1122         optlen = (skb->tail - skb->transport_header) - sizeof(struct ra_msg);
1123 
1124         if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1125                 ND_PRINTK2(KERN_WARNING
1126                            "ICMPv6 RA: source address is not link-local.\n");
1127                 return;
1128         }
1129         if (optlen < 0) {
1130                 ND_PRINTK2(KERN_WARNING
1131                            "ICMPv6 RA: packet too short\n");
1132                 return;
1133         }
1134 
1135 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1136         if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) {
1137                 ND_PRINTK2(KERN_WARNING
1138                            "ICMPv6 RA: from host or unauthorized router\n");
1139                 return;
1140         }
1141 #endif
1142 
1143         /*
1144          *      set the RA_RECV flag in the interface
1145          */
1146 
1147         in6_dev = in6_dev_get(skb->dev);
1148         if (in6_dev == NULL) {
1149                 ND_PRINTK0(KERN_ERR
1150                            "ICMPv6 RA: can't find inet6 device for %s.\n",
1151                            skb->dev->name);
1152                 return;
1153         }
1154         if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_ra) {
1155                 in6_dev_put(in6_dev);
1156                 return;
1157         }
1158 
1159         if (!ndisc_parse_options(opt, optlen, &ndopts)) {
1160                 in6_dev_put(in6_dev);
1161                 ND_PRINTK2(KERN_WARNING
1162                            "ICMP6 RA: invalid ND options\n");
1163                 return;
1164         }
1165 
1166 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1167         /* skip link-specific parameters from interior routers */
1168         if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT)
1169                 goto skip_linkparms;
1170 #endif
1171 
1172         if (in6_dev->if_flags & IF_RS_SENT) {
1173                 /*
1174                  *      flag that an RA was received after an RS was sent
1175                  *      out on this interface.
1176                  */
1177                 in6_dev->if_flags |= IF_RA_RCVD;
1178         }
1179 
1180         /*
1181          * Remember the managed/otherconf flags from most recently
1182          * received RA message (RFC 2462) -- yoshfuji
1183          */
1184         in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED |
1185                                 IF_RA_OTHERCONF)) |
1186                                 (ra_msg->icmph.icmp6_addrconf_managed ?
1187                                         IF_RA_MANAGED : 0) |
1188                                 (ra_msg->icmph.icmp6_addrconf_other ?
1189                                         IF_RA_OTHERCONF : 0);
1190 
1191         if (!in6_dev->cnf.accept_ra_defrtr)
1192                 goto skip_defrtr;
1193 
1194         lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
1195 
1196 #ifdef CONFIG_IPV6_ROUTER_PREF
1197         pref = ra_msg->icmph.icmp6_router_pref;
1198         /* 10b is handled as if it were 00b (medium) */
1199         if (pref == ICMPV6_ROUTER_PREF_INVALID ||
1200             !in6_dev->cnf.accept_ra_rtr_pref)
1201                 pref = ICMPV6_ROUTER_PREF_MEDIUM;
1202 #endif
1203 
1204         rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
1205 
1206         if (rt)
1207                 neigh = rt->rt6i_nexthop;
1208 
1209         if (rt && lifetime == 0) {
1210                 neigh_clone(neigh);
1211                 ip6_del_rt(rt);
1212                 rt = NULL;
1213         }
1214 
1215         if (rt == NULL && lifetime) {
1216                 ND_PRINTK3(KERN_DEBUG
1217                            "ICMPv6 RA: adding default router.\n");
1218 
1219                 rt = rt6_add_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev, pref);
1220                 if (rt == NULL) {
1221                         ND_PRINTK0(KERN_ERR
1222                                    "ICMPv6 RA: %s() failed to add default route.\n",
1223                                    __func__);
1224                         in6_dev_put(in6_dev);
1225                         return;
1226                 }
1227 
1228                 neigh = rt->rt6i_nexthop;
1229                 if (neigh == NULL) {
1230                         ND_PRINTK0(KERN_ERR
1231                                    "ICMPv6 RA: %s() got default router without neighbour.\n",
1232                                    __func__);
1233                         dst_release(&rt->u.dst);
1234                         in6_dev_put(in6_dev);
1235                         return;
1236                 }
1237                 neigh->flags |= NTF_ROUTER;
1238         } else if (rt) {
1239                 rt->rt6i_flags = (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
1240         }
1241 
1242         if (rt)
1243                 rt->rt6i_expires = jiffies + (HZ * lifetime);
1244 
1245         if (ra_msg->icmph.icmp6_hop_limit) {
1246                 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
1247                 if (rt)
1248                         rt->u.dst.metrics[RTAX_HOPLIMIT-1] = ra_msg->icmph.icmp6_hop_limit;
1249         }
1250 
1251 skip_defrtr:
1252 
1253         /*
1254          *      Update Reachable Time and Retrans Timer
1255          */
1256 
1257         if (in6_dev->nd_parms) {
1258                 unsigned long rtime = ntohl(ra_msg->retrans_timer);
1259 
1260                 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/HZ) {
1261                         rtime = (rtime*HZ)/1000;
1262                         if (rtime < HZ/10)
1263                                 rtime = HZ/10;
1264                         in6_dev->nd_parms->retrans_time = rtime;
1265                         in6_dev->tstamp = jiffies;
1266                         inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1267                 }
1268 
1269                 rtime = ntohl(ra_msg->reachable_time);
1270                 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/(3*HZ)) {
1271                         rtime = (rtime*HZ)/1000;
1272 
1273                         if (rtime < HZ/10)
1274                                 rtime = HZ/10;
1275 
1276                         if (rtime != in6_dev->nd_parms->base_reachable_time) {
1277                                 in6_dev->nd_parms->base_reachable_time = rtime;
1278                                 in6_dev->nd_parms->gc_staletime = 3 * rtime;
1279                                 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime);
1280                                 in6_dev->tstamp = jiffies;
1281                                 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1282                         }
1283                 }
1284         }
1285 
1286 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1287 skip_linkparms:
1288 #endif
1289 
1290         /*
1291          *      Process options.
1292          */
1293 
1294         if (!neigh)
1295                 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr,
1296                                        skb->dev, 1);
1297         if (neigh) {
1298                 u8 *lladdr = NULL;
1299                 if (ndopts.nd_opts_src_lladdr) {
1300                         lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1301                                                      skb->dev);
1302                         if (!lladdr) {
1303                                 ND_PRINTK2(KERN_WARNING
1304                                            "ICMPv6 RA: invalid link-layer address length\n");
1305                                 goto out;
1306                         }
1307                 }
1308                 neigh_update(neigh, lladdr, NUD_STALE,
1309                              NEIGH_UPDATE_F_WEAK_OVERRIDE|
1310                              NEIGH_UPDATE_F_OVERRIDE|
1311                              NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1312                              NEIGH_UPDATE_F_ISROUTER);
1313         }
1314 
1315 #ifdef CONFIG_IPV6_ROUTE_INFO
1316         if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
1317                 struct nd_opt_hdr *p;
1318                 for (p = ndopts.nd_opts_ri;
1319                      p;
1320                      p = ndisc_next_option(p, ndopts.nd_opts_ri_end)) {
1321                         struct route_info *ri = (struct route_info *)p;
1322 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1323                         if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT &&
1324                             ri->prefix_len == 0)
1325                                 continue;
1326 #endif
1327                         if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen)
1328                                 continue;
1329                         rt6_route_rcv(skb->dev, (u8*)p, (p->nd_opt_len) << 3,
1330                                       &ipv6_hdr(skb)->saddr);
1331                 }
1332         }
1333 #endif
1334 
1335 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1336         /* skip link-specific ndopts from interior routers */
1337         if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT)
1338                 goto out;
1339 #endif
1340 
1341         if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
1342                 struct nd_opt_hdr *p;
1343                 for (p = ndopts.nd_opts_pi;
1344                      p;
1345                      p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) {
1346                         addrconf_prefix_rcv(skb->dev, (u8*)p, (p->nd_opt_len) << 3);
1347                 }
1348         }
1349 
1350         if (ndopts.nd_opts_mtu) {
1351                 __be32 n;
1352                 u32 mtu;
1353 
1354                 memcpy(&n, ((u8*)(ndopts.nd_opts_mtu+1))+2, sizeof(mtu));
1355                 mtu = ntohl(n);
1356 
1357                 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) {
1358                         ND_PRINTK2(KERN_WARNING
1359                                    "ICMPv6 RA: invalid mtu: %d\n",
1360                                    mtu);
1361                 } else if (in6_dev->cnf.mtu6 != mtu) {
1362                         in6_dev->cnf.mtu6 = mtu;
1363 
1364                         if (rt)
1365                                 rt->u.dst.metrics[RTAX_MTU-1] = mtu;
1366 
1367                         rt6_mtu_change(skb->dev, mtu);
1368                 }
1369         }
1370 
1371         if (ndopts.nd_useropts) {
1372                 struct nd_opt_hdr *p;
1373                 for (p = ndopts.nd_useropts;
1374                      p;
1375                      p = ndisc_next_useropt(p, ndopts.nd_useropts_end)) {
1376                         ndisc_ra_useropt(skb, p);
1377                 }
1378         }
1379 
1380         if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
1381                 ND_PRINTK2(KERN_WARNING
1382                            "ICMPv6 RA: invalid RA options");
1383         }
1384 out:
1385         if (rt)
1386                 dst_release(&rt->u.dst);
1387         else if (neigh)
1388                 neigh_release(neigh);
1389         in6_dev_put(in6_dev);
1390 }
1391 
1392 static void ndisc_redirect_rcv(struct sk_buff *skb)
1393 {
1394         struct inet6_dev *in6_dev;
1395         struct icmp6hdr *icmph;
1396         struct in6_addr *dest;
1397         struct in6_addr *target;        /* new first hop to destination */
1398         struct neighbour *neigh;
1399         int on_link = 0;
1400         struct ndisc_options ndopts;
1401         int optlen;
1402         u8 *lladdr = NULL;
1403 
1404 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1405         switch (skb->ndisc_nodetype) {
1406         case NDISC_NODETYPE_HOST:
1407         case NDISC_NODETYPE_NODEFAULT:
1408                 ND_PRINTK2(KERN_WARNING
1409                            "ICMPv6 Redirect: from host or unauthorized router\n");
1410                 return;
1411         }
1412 #endif
1413 
1414         if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1415                 ND_PRINTK2(KERN_WARNING
1416                            "ICMPv6 Redirect: source address is not link-local.\n");
1417                 return;
1418         }
1419 
1420         optlen = skb->tail - skb->transport_header;
1421         optlen -= sizeof(struct icmp6hdr) + 2 * sizeof(struct in6_addr);
1422 
1423         if (optlen < 0) {
1424                 ND_PRINTK2(KERN_WARNING
1425                            "ICMPv6 Redirect: packet too short\n");
1426                 return;
1427         }
1428 
1429         icmph = icmp6_hdr(skb);
1430         target = (struct in6_addr *) (icmph + 1);
1431         dest = target + 1;
1432 
1433         if (ipv6_addr_is_multicast(dest)) {
1434                 ND_PRINTK2(KERN_WARNING
1435                            "ICMPv6 Redirect: destination address is multicast.\n");
1436                 return;
1437         }
1438 
1439         if (ipv6_addr_equal(dest, target)) {
1440                 on_link = 1;
1441         } else if (ipv6_addr_type(target) !=
1442                    (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
1443                 ND_PRINTK2(KERN_WARNING
1444                            "ICMPv6 Redirect: target address is not link-local unicast.\n");
1445                 return;
1446         }
1447 
1448         in6_dev = in6_dev_get(skb->dev);
1449         if (!in6_dev)
1450                 return;
1451         if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_redirects) {
1452                 in6_dev_put(in6_dev);
1453                 return;
1454         }
1455 
1456         /* RFC2461 8.1:
1457          *      The IP source address of the Redirect MUST be the same as the current
1458          *      first-hop router for the specified ICMP Destination Address.
1459          */
1460 
1461         if (!ndisc_parse_options((u8*)(dest + 1), optlen, &ndopts)) {
1462                 ND_PRINTK2(KERN_WARNING
1463                            "ICMPv6 Redirect: invalid ND options\n");
1464                 in6_dev_put(in6_dev);
1465                 return;
1466         }
1467         if (ndopts.nd_opts_tgt_lladdr) {
1468                 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr,
1469                                              skb->dev);
1470                 if (!lladdr) {
1471                         ND_PRINTK2(KERN_WARNING
1472                                    "ICMPv6 Redirect: invalid link-layer address length\n");
1473                         in6_dev_put(in6_dev);
1474                         return;
1475                 }
1476         }
1477 
1478         neigh = __neigh_lookup(&nd_tbl, target, skb->dev, 1);
1479         if (neigh) {
1480                 rt6_redirect(dest, &ipv6_hdr(skb)->daddr,
1481                              &ipv6_hdr(skb)->saddr, neigh, lladdr,
1482                              on_link);
1483                 neigh_release(neigh);
1484         }
1485         in6_dev_put(in6_dev);
1486 }
1487 
1488 void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
1489                          const struct in6_addr *target)
1490 {
1491         struct net_device *dev = skb->dev;
1492         struct net *net = dev_net(dev);
1493         struct sock *sk = net->ipv6.ndisc_sk;
1494         int len = sizeof(struct icmp6hdr) + 2 * sizeof(struct in6_addr);
1495         struct sk_buff *buff;
1496         struct icmp6hdr *icmph;
1497         struct in6_addr saddr_buf;
1498         struct in6_addr *addrp;
1499         struct rt6_info *rt;
1500         struct dst_entry *dst;
1501         struct inet6_dev *idev;
1502         struct flowi fl;
1503         u8 *opt;
1504         int rd_len;
1505         int err;
1506         u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
1507 
1508         if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) {
1509                 ND_PRINTK2(KERN_WARNING
1510                            "ICMPv6 Redirect: no link-local address on %s\n",
1511                            dev->name);
1512                 return;
1513         }
1514 
1515         if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
1516             ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
1517                 ND_PRINTK2(KERN_WARNING
1518                         "ICMPv6 Redirect: target address is not link-local unicast.\n");
1519                 return;
1520         }
1521 
1522         icmpv6_flow_init(sk, &fl, NDISC_REDIRECT,
1523                          &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex);
1524 
1525         dst = ip6_route_output(net, NULL, &fl);
1526         if (dst == NULL)
1527                 return;
1528 
1529         err = xfrm_lookup(net, &dst, &fl, NULL, 0);
1530         if (err)
1531                 return;
1532 
1533         rt = (struct rt6_info *) dst;
1534 
1535         if (rt->rt6i_flags & RTF_GATEWAY) {
1536                 ND_PRINTK2(KERN_WARNING
1537                            "ICMPv6 Redirect: destination is not a neighbour.\n");
1538                 goto release;
1539         }
1540         if (!xrlim_allow(dst, 1*HZ))
1541                 goto release;
1542 
1543         if (dev->addr_len) {
1544                 read_lock_bh(&neigh->lock);
1545                 if (neigh->nud_state & NUD_VALID) {
1546                         memcpy(ha_buf, neigh->ha, dev->addr_len);
1547                         read_unlock_bh(&neigh->lock);
1548                         ha = ha_buf;
1549                         len += ndisc_opt_addr_space(dev);
1550                 } else
1551                         read_unlock_bh(&neigh->lock);
1552         }
1553 
1554         rd_len = min_t(unsigned int,
1555                      IPV6_MIN_MTU-sizeof(struct ipv6hdr)-len, skb->len + 8);
1556         rd_len &= ~0x7;
1557         len += rd_len;
1558 
1559         buff = sock_alloc_send_skb(sk,
1560                                    (MAX_HEADER + sizeof(struct ipv6hdr) +
1561                                     len + LL_ALLOCATED_SPACE(dev)),
1562                                    1, &err);
1563         if (buff == NULL) {
1564                 ND_PRINTK0(KERN_ERR
1565                            "ICMPv6 Redirect: %s() failed to allocate an skb, err=%d.\n",
1566                            __func__, err);
1567                 goto release;
1568         }
1569 
1570         skb_reserve(buff, LL_RESERVED_SPACE(dev));
1571         ip6_nd_hdr(sk, buff, dev, &saddr_buf, &ipv6_hdr(skb)->saddr,
1572                    IPPROTO_ICMPV6, len);
1573 
1574         skb_set_transport_header(buff, skb_tail_pointer(buff) - buff->data);
1575         skb_put(buff, len);
1576         icmph = icmp6_hdr(buff);
1577 
1578         memset(icmph, 0, sizeof(struct icmp6hdr));
1579         icmph->icmp6_type = NDISC_REDIRECT;
1580 
1581         /*
1582          *      copy target and destination addresses
1583          */
1584 
1585         addrp = (struct in6_addr *)(icmph + 1);
1586         ipv6_addr_copy(addrp, target);
1587         addrp++;
1588         ipv6_addr_copy(addrp, &ipv6_hdr(skb)->daddr);
1589 
1590         opt = (u8*) (addrp + 1);
1591 
1592         /*
1593          *      include target_address option
1594          */
1595 
1596         if (ha)
1597                 opt = ndisc_fill_addr_option(opt, ND_OPT_TARGET_LL_ADDR, ha,
1598                                              dev->addr_len, dev->type);
1599 
1600         /*
1601          *      build redirect option and copy skb over to the new packet.
1602          */
1603 
1604         memset(opt, 0, 8);
1605         *(opt++) = ND_OPT_REDIRECT_HDR;
1606         *(opt++) = (rd_len >> 3);
1607         opt += 6;
1608 
1609         memcpy(opt, ipv6_hdr(skb), rd_len - 8);
1610 
1611         icmph->icmp6_cksum = csum_ipv6_magic(&saddr_buf, &ipv6_hdr(skb)->saddr,
1612                                              len, IPPROTO_ICMPV6,
1613                                              csum_partial(icmph, len, 0));
1614 
1615         skb_dst_set(buff, dst);
1616         idev = in6_dev_get(dst->dev);
1617         IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len);
1618         err = NF_HOOK(PF_INET6, NF_INET_LOCAL_OUT, buff, NULL, dst->dev,
1619                       dst_output);
1620         if (!err) {
1621                 ICMP6MSGOUT_INC_STATS(net, idev, NDISC_REDIRECT);
1622                 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
1623         }
1624 
1625         if (likely(idev != NULL))
1626                 in6_dev_put(idev);
1627         return;
1628 
1629 release:
1630         dst_release(dst);
1631 }
1632 
1633 static void pndisc_redo(struct sk_buff *skb)
1634 {
1635         ndisc_recv_ns(skb);
1636         kfree_skb(skb);
1637 }
1638 
1639 int ndisc_rcv(struct sk_buff *skb)
1640 {
1641         struct nd_msg *msg;
1642 
1643         if (!pskb_may_pull(skb, skb->len))
1644                 return 0;
1645 
1646         msg = (struct nd_msg *)skb_transport_header(skb);
1647 
1648         __skb_push(skb, skb->data - skb_transport_header(skb));
1649 
1650         if (ipv6_hdr(skb)->hop_limit != 255) {
1651                 ND_PRINTK2(KERN_WARNING
1652                            "ICMPv6 NDISC: invalid hop-limit: %d\n",
1653                            ipv6_hdr(skb)->hop_limit);
1654                 return 0;
1655         }
1656 
1657         if (msg->icmph.icmp6_code != 0) {
1658                 ND_PRINTK2(KERN_WARNING
1659                            "ICMPv6 NDISC: invalid ICMPv6 code: %d\n",
1660                            msg->icmph.icmp6_code);
1661                 return 0;
1662         }
1663 
1664         memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
1665 
1666         switch (msg->icmph.icmp6_type) {
1667         case NDISC_NEIGHBOUR_SOLICITATION:
1668                 ndisc_recv_ns(skb);
1669                 break;
1670 
1671         case NDISC_NEIGHBOUR_ADVERTISEMENT:
1672                 ndisc_recv_na(skb);
1673                 break;
1674 
1675         case NDISC_ROUTER_SOLICITATION:
1676                 ndisc_recv_rs(skb);
1677                 break;
1678 
1679         case NDISC_ROUTER_ADVERTISEMENT:
1680                 ndisc_router_discovery(skb);
1681                 break;
1682 
1683         case NDISC_REDIRECT:
1684                 ndisc_redirect_rcv(skb);
1685                 break;
1686         }
1687 
1688         return 0;
1689 }
1690 
1691 static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1692 {
1693         struct net_device *dev = ptr;
1694         struct net *net = dev_net(dev);
1695 
1696         switch (event) {
1697         case NETDEV_CHANGEADDR:
1698                 neigh_changeaddr(&nd_tbl, dev);
1699                 fib6_run_gc(~0UL, net);
1700                 break;
1701         case NETDEV_DOWN:
1702                 neigh_ifdown(&nd_tbl, dev);
1703                 fib6_run_gc(~0UL, net);
1704                 break;
1705         default:
1706                 break;
1707         }
1708 
1709         return NOTIFY_DONE;
1710 }
1711 
1712 static struct notifier_block ndisc_netdev_notifier = {
1713         .notifier_call = ndisc_netdev_event,
1714 };
1715 
1716 #ifdef CONFIG_SYSCTL
1717 static void ndisc_warn_deprecated_sysctl(struct ctl_table *ctl,
1718                                          const char *func, const char *dev_name)
1719 {
1720         static char warncomm[TASK_COMM_LEN];
1721         static int warned;
1722         if (strcmp(warncomm, current->comm) && warned < 5) {
1723                 strcpy(warncomm, current->comm);
1724                 printk(KERN_WARNING
1725                         "process `%s' is using deprecated sysctl (%s) "
1726                         "net.ipv6.neigh.%s.%s; "
1727                         "Use net.ipv6.neigh.%s.%s_ms "
1728                         "instead.\n",
1729                         warncomm, func,
1730                         dev_name, ctl->procname,
1731                         dev_name, ctl->procname);
1732                 warned++;
1733         }
1734 }
1735 
1736 int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, struct file * filp, void __user *buffer, size_t *lenp, loff_t *ppos)
1737 {
1738         struct net_device *dev = ctl->extra1;
1739         struct inet6_dev *idev;
1740         int ret;
1741 
1742         if ((strcmp(ctl->procname, "retrans_time") == 0) ||
1743             (strcmp(ctl->procname, "base_reachable_time") == 0))
1744                 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default");
1745 
1746         if (strcmp(ctl->procname, "retrans_time") == 0)
1747                 ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
1748 
1749         else if (strcmp(ctl->procname, "base_reachable_time") == 0)
1750                 ret = proc_dointvec_jiffies(ctl, write,
1751                                             filp, buffer, lenp, ppos);
1752 
1753         else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) ||
1754                  (strcmp(ctl->procname, "base_reachable_time_ms") == 0))
1755                 ret = proc_dointvec_ms_jiffies(ctl, write,
1756                                                filp, buffer, lenp, ppos);
1757         else
1758                 ret = -1;
1759 
1760         if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) {
1761                 if (ctl->data == &idev->nd_parms->base_reachable_time)
1762                         idev->nd_parms->reachable_time = neigh_rand_reach_time(idev->nd_parms->base_reachable_time);
1763                 idev->tstamp = jiffies;
1764                 inet6_ifinfo_notify(RTM_NEWLINK, idev);
1765                 in6_dev_put(idev);
1766         }
1767         return ret;
1768 }
1769 
1770 int ndisc_ifinfo_sysctl_strategy(ctl_table *ctl,
1771                                  void __user *oldval, size_t __user *oldlenp,
1772                                  void __user *newval, size_t newlen)
1773 {
1774         struct net_device *dev = ctl->extra1;
1775         struct inet6_dev *idev;
1776         int ret;
1777 
1778         if (ctl->ctl_name == NET_NEIGH_RETRANS_TIME ||
1779             ctl->ctl_name == NET_NEIGH_REACHABLE_TIME)
1780                 ndisc_warn_deprecated_sysctl(ctl, "procfs", dev ? dev->name : "default");
1781 
1782         switch (ctl->ctl_name) {
1783         case NET_NEIGH_REACHABLE_TIME:
1784                 ret = sysctl_jiffies(ctl, oldval, oldlenp, newval, newlen);
1785                 break;
1786         case NET_NEIGH_RETRANS_TIME_MS:
1787         case NET_NEIGH_REACHABLE_TIME_MS:
1788                  ret = sysctl_ms_jiffies(ctl, oldval, oldlenp, newval, newlen);
1789                  break;
1790         default:
1791                 ret = 0;
1792         }
1793 
1794         if (newval && newlen && ret > 0 &&
1795             dev && (idev = in6_dev_get(dev)) != NULL) {
1796                 if (ctl->ctl_name == NET_NEIGH_REACHABLE_TIME ||
1797                     ctl->ctl_name == NET_NEIGH_REACHABLE_TIME_MS)
1798                         idev->nd_parms->reachable_time = neigh_rand_reach_time(idev->nd_parms->base_reachable_time);
1799                 idev->tstamp = jiffies;
1800                 inet6_ifinfo_notify(RTM_NEWLINK, idev);
1801                 in6_dev_put(idev);
1802         }
1803 
1804         return ret;
1805 }
1806 
1807 #endif
1808 
1809 static int ndisc_net_init(struct net *net)
1810 {
1811         struct ipv6_pinfo *np;
1812         struct sock *sk;
1813         int err;
1814 
1815         err = inet_ctl_sock_create(&sk, PF_INET6,
1816                                    SOCK_RAW, IPPROTO_ICMPV6, net);
1817         if (err < 0) {
1818                 ND_PRINTK0(KERN_ERR
1819                            "ICMPv6 NDISC: Failed to initialize the control socket (err %d).\n",
1820                            err);
1821                 return err;
1822         }
1823 
1824         net->ipv6.ndisc_sk = sk;
1825 
1826         np = inet6_sk(sk);
1827         np->hop_limit = 255;
1828         /* Do not loopback ndisc messages */
1829         np->mc_loop = 0;
1830 
1831         return 0;
1832 }
1833 
1834 static void ndisc_net_exit(struct net *net)
1835 {
1836         inet_ctl_sock_destroy(net->ipv6.ndisc_sk);
1837 }
1838 
1839 static struct pernet_operations ndisc_net_ops = {
1840         .init = ndisc_net_init,
1841         .exit = ndisc_net_exit,
1842 };
1843 
1844 int __init ndisc_init(void)
1845 {
1846         int err;
1847 
1848         err = register_pernet_subsys(&ndisc_net_ops);
1849         if (err)
1850                 return err;
1851         /*
1852          * Initialize the neighbour table
1853          */
1854         neigh_table_init(&nd_tbl);
1855 
1856 #ifdef CONFIG_SYSCTL
1857         err = neigh_sysctl_register(NULL, &nd_tbl.parms, NET_IPV6,
1858                                     NET_IPV6_NEIGH, "ipv6",
1859                                     &ndisc_ifinfo_sysctl_change,
1860                                     &ndisc_ifinfo_sysctl_strategy);
1861         if (err)
1862                 goto out_unregister_pernet;
1863 #endif
1864         err = register_netdevice_notifier(&ndisc_netdev_notifier);
1865         if (err)
1866                 goto out_unregister_sysctl;
1867 out:
1868         return err;
1869 
1870 out_unregister_sysctl:
1871 #ifdef CONFIG_SYSCTL
1872         neigh_sysctl_unregister(&nd_tbl.parms);
1873 out_unregister_pernet:
1874 #endif
1875         unregister_pernet_subsys(&ndisc_net_ops);
1876         goto out;
1877 }
1878 
1879 void ndisc_cleanup(void)
1880 {
1881         unregister_netdevice_notifier(&ndisc_netdev_notifier);
1882 #ifdef CONFIG_SYSCTL
1883         neigh_sysctl_unregister(&nd_tbl.parms);
1884 #endif
1885         neigh_table_clear(&nd_tbl);
1886         unregister_pernet_subsys(&ndisc_net_ops);
1887 }
1888 
  This page was automatically generated by the LXR engine.