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