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