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