Merge branches 'iommu/fixes', 'dma-debug', 'arm/omap', 'arm/tegra', 'core' and 'x86...
[platform/adaptation/renesas_rcar/renesas_kernel.git] / net / ipv6 / ndisc.c
1 /*
2  *      Neighbour Discovery for IPv6
3  *      Linux INET6 implementation
4  *
5  *      Authors:
6  *      Pedro Roque             <roque@di.fc.ul.pt>
7  *      Mike Shaver             <shaver@ingenia.com>
8  *
9  *      This program is free software; you can redistribute it and/or
10  *      modify it under the terms of the GNU General Public License
11  *      as published by the Free Software Foundation; either version
12  *      2 of the License, or (at your option) any later version.
13  */
14
15 /*
16  *      Changes:
17  *
18  *      Pierre Ynard                    :       export userland ND options
19  *                                              through netlink (RDNSS support)
20  *      Lars Fenneberg                  :       fixed MTU setting on receipt
21  *                                              of an RA.
22  *      Janos Farkas                    :       kmalloc failure checks
23  *      Alexey Kuznetsov                :       state machine reworked
24  *                                              and moved to net/core.
25  *      Pekka Savola                    :       RFC2461 validation
26  *      YOSHIFUJI Hideaki @USAGI        :       Verify ND options properly
27  */
28
29 /* Set to 3 to get tracing... */
30 #define ND_DEBUG 1
31
32 #define ND_PRINTK(fmt, args...) do { if (net_ratelimit()) { printk(fmt, ## args); } } while(0)
33 #define ND_NOPRINTK(x...) do { ; } while(0)
34 #define ND_PRINTK0 ND_PRINTK
35 #define ND_PRINTK1 ND_NOPRINTK
36 #define ND_PRINTK2 ND_NOPRINTK
37 #define ND_PRINTK3 ND_NOPRINTK
38 #if ND_DEBUG >= 1
39 #undef ND_PRINTK1
40 #define ND_PRINTK1 ND_PRINTK
41 #endif
42 #if ND_DEBUG >= 2
43 #undef ND_PRINTK2
44 #define ND_PRINTK2 ND_PRINTK
45 #endif
46 #if ND_DEBUG >= 3
47 #undef ND_PRINTK3
48 #define ND_PRINTK3 ND_PRINTK
49 #endif
50
51 #include <linux/module.h>
52 #include <linux/errno.h>
53 #include <linux/types.h>
54 #include <linux/socket.h>
55 #include <linux/sockios.h>
56 #include <linux/sched.h>
57 #include <linux/net.h>
58 #include <linux/in6.h>
59 #include <linux/route.h>
60 #include <linux/init.h>
61 #include <linux/rcupdate.h>
62 #include <linux/slab.h>
63 #ifdef CONFIG_SYSCTL
64 #include <linux/sysctl.h>
65 #endif
66
67 #include <linux/if_addr.h>
68 #include <linux/if_arp.h>
69 #include <linux/ipv6.h>
70 #include <linux/icmpv6.h>
71 #include <linux/jhash.h>
72
73 #include <net/sock.h>
74 #include <net/snmp.h>
75
76 #include <net/ipv6.h>
77 #include <net/protocol.h>
78 #include <net/ndisc.h>
79 #include <net/ip6_route.h>
80 #include <net/addrconf.h>
81 #include <net/icmp.h>
82
83 #include <net/netlink.h>
84 #include <linux/rtnetlink.h>
85
86 #include <net/flow.h>
87 #include <net/ip6_checksum.h>
88 #include <net/inet_common.h>
89 #include <linux/proc_fs.h>
90
91 #include <linux/netfilter.h>
92 #include <linux/netfilter_ipv6.h>
93
94 static u32 ndisc_hash(const void *pkey,
95                       const struct net_device *dev,
96                       __u32 *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_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1228                 if (!neigh) {
1229                         ND_PRINTK0(KERN_ERR
1230                                    "ICMPv6 RA: %s() got default router without neighbour.\n",
1231                                    __func__);
1232                         dst_release(&rt->dst);
1233                         return;
1234                 }
1235         }
1236         if (rt && lifetime == 0) {
1237                 ip6_del_rt(rt);
1238                 rt = NULL;
1239         }
1240
1241         if (rt == NULL && lifetime) {
1242                 ND_PRINTK3(KERN_DEBUG
1243                            "ICMPv6 RA: adding default router.\n");
1244
1245                 rt = rt6_add_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev, pref);
1246                 if (rt == NULL) {
1247                         ND_PRINTK0(KERN_ERR
1248                                    "ICMPv6 RA: %s() failed to add default route.\n",
1249                                    __func__);
1250                         return;
1251                 }
1252
1253                 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1254                 if (neigh == NULL) {
1255                         ND_PRINTK0(KERN_ERR
1256                                    "ICMPv6 RA: %s() got default router without neighbour.\n",
1257                                    __func__);
1258                         dst_release(&rt->dst);
1259                         return;
1260                 }
1261                 neigh->flags |= NTF_ROUTER;
1262         } else if (rt) {
1263                 rt->rt6i_flags = (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
1264         }
1265
1266         if (rt)
1267                 rt6_set_expires(rt, jiffies + (HZ * lifetime));
1268         if (ra_msg->icmph.icmp6_hop_limit) {
1269                 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
1270                 if (rt)
1271                         dst_metric_set(&rt->dst, RTAX_HOPLIMIT,
1272                                        ra_msg->icmph.icmp6_hop_limit);
1273         }
1274
1275 skip_defrtr:
1276
1277         /*
1278          *      Update Reachable Time and Retrans Timer
1279          */
1280
1281         if (in6_dev->nd_parms) {
1282                 unsigned long rtime = ntohl(ra_msg->retrans_timer);
1283
1284                 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/HZ) {
1285                         rtime = (rtime*HZ)/1000;
1286                         if (rtime < HZ/10)
1287                                 rtime = HZ/10;
1288                         in6_dev->nd_parms->retrans_time = rtime;
1289                         in6_dev->tstamp = jiffies;
1290                         inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1291                 }
1292
1293                 rtime = ntohl(ra_msg->reachable_time);
1294                 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/(3*HZ)) {
1295                         rtime = (rtime*HZ)/1000;
1296
1297                         if (rtime < HZ/10)
1298                                 rtime = HZ/10;
1299
1300                         if (rtime != in6_dev->nd_parms->base_reachable_time) {
1301                                 in6_dev->nd_parms->base_reachable_time = rtime;
1302                                 in6_dev->nd_parms->gc_staletime = 3 * rtime;
1303                                 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime);
1304                                 in6_dev->tstamp = jiffies;
1305                                 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1306                         }
1307                 }
1308         }
1309
1310 skip_linkparms:
1311
1312         /*
1313          *      Process options.
1314          */
1315
1316         if (!neigh)
1317                 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr,
1318                                        skb->dev, 1);
1319         if (neigh) {
1320                 u8 *lladdr = NULL;
1321                 if (ndopts.nd_opts_src_lladdr) {
1322                         lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1323                                                      skb->dev);
1324                         if (!lladdr) {
1325                                 ND_PRINTK2(KERN_WARNING
1326                                            "ICMPv6 RA: invalid link-layer address length\n");
1327                                 goto out;
1328                         }
1329                 }
1330                 neigh_update(neigh, lladdr, NUD_STALE,
1331                              NEIGH_UPDATE_F_WEAK_OVERRIDE|
1332                              NEIGH_UPDATE_F_OVERRIDE|
1333                              NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1334                              NEIGH_UPDATE_F_ISROUTER);
1335         }
1336
1337         if (!accept_ra(in6_dev))
1338                 goto out;
1339
1340 #ifdef CONFIG_IPV6_ROUTE_INFO
1341         if (ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, NULL, 0))
1342                 goto skip_routeinfo;
1343
1344         if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
1345                 struct nd_opt_hdr *p;
1346                 for (p = ndopts.nd_opts_ri;
1347                      p;
1348                      p = ndisc_next_option(p, ndopts.nd_opts_ri_end)) {
1349                         struct route_info *ri = (struct route_info *)p;
1350 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1351                         if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT &&
1352                             ri->prefix_len == 0)
1353                                 continue;
1354 #endif
1355                         if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen)
1356                                 continue;
1357                         rt6_route_rcv(skb->dev, (u8*)p, (p->nd_opt_len) << 3,
1358                                       &ipv6_hdr(skb)->saddr);
1359                 }
1360         }
1361
1362 skip_routeinfo:
1363 #endif
1364
1365 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1366         /* skip link-specific ndopts from interior routers */
1367         if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT)
1368                 goto out;
1369 #endif
1370
1371         if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
1372                 struct nd_opt_hdr *p;
1373                 for (p = ndopts.nd_opts_pi;
1374                      p;
1375                      p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) {
1376                         addrconf_prefix_rcv(skb->dev, (u8 *)p,
1377                                             (p->nd_opt_len) << 3,
1378                                             ndopts.nd_opts_src_lladdr != NULL);
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         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, const struct in6_addr *target)
1515 {
1516         struct net_device *dev = skb->dev;
1517         struct net *net = dev_net(dev);
1518         struct sock *sk = net->ipv6.ndisc_sk;
1519         int len = sizeof(struct icmp6hdr) + 2 * sizeof(struct in6_addr);
1520         struct sk_buff *buff;
1521         struct icmp6hdr *icmph;
1522         struct in6_addr saddr_buf;
1523         struct in6_addr *addrp;
1524         struct rt6_info *rt;
1525         struct dst_entry *dst;
1526         struct inet6_dev *idev;
1527         struct flowi6 fl6;
1528         u8 *opt;
1529         int hlen, tlen;
1530         int rd_len;
1531         int err;
1532         u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
1533
1534         if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) {
1535                 ND_PRINTK2(KERN_WARNING
1536                            "ICMPv6 Redirect: no link-local address on %s\n",
1537                            dev->name);
1538                 return;
1539         }
1540
1541         if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
1542             ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
1543                 ND_PRINTK2(KERN_WARNING
1544                         "ICMPv6 Redirect: target address is not link-local unicast.\n");
1545                 return;
1546         }
1547
1548         icmpv6_flow_init(sk, &fl6, NDISC_REDIRECT,
1549                          &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex);
1550
1551         dst = ip6_route_output(net, NULL, &fl6);
1552         if (dst->error) {
1553                 dst_release(dst);
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                 struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target);
1574                 if (!neigh) {
1575                         ND_PRINTK2(KERN_WARNING
1576                                    "ICMPv6 Redirect: no neigh for target address\n");
1577                         goto release;
1578                 }
1579
1580                 read_lock_bh(&neigh->lock);
1581                 if (neigh->nud_state & NUD_VALID) {
1582                         memcpy(ha_buf, neigh->ha, dev->addr_len);
1583                         read_unlock_bh(&neigh->lock);
1584                         ha = ha_buf;
1585                         len += ndisc_opt_addr_space(dev);
1586                 } else
1587                         read_unlock_bh(&neigh->lock);
1588
1589                 neigh_release(neigh);
1590         }
1591
1592         rd_len = min_t(unsigned int,
1593                      IPV6_MIN_MTU-sizeof(struct ipv6hdr)-len, skb->len + 8);
1594         rd_len &= ~0x7;
1595         len += rd_len;
1596
1597         hlen = LL_RESERVED_SPACE(dev);
1598         tlen = dev->needed_tailroom;
1599         buff = sock_alloc_send_skb(sk,
1600                                    (MAX_HEADER + sizeof(struct ipv6hdr) +
1601                                     len + hlen + tlen),
1602                                    1, &err);
1603         if (buff == NULL) {
1604                 ND_PRINTK0(KERN_ERR
1605                            "ICMPv6 Redirect: %s() failed to allocate an skb, err=%d.\n",
1606                            __func__, err);
1607                 goto release;
1608         }
1609
1610         skb_reserve(buff, hlen);
1611         ip6_nd_hdr(sk, buff, dev, &saddr_buf, &ipv6_hdr(skb)->saddr,
1612                    IPPROTO_ICMPV6, len);
1613
1614         skb_set_transport_header(buff, skb_tail_pointer(buff) - buff->data);
1615         skb_put(buff, len);
1616         icmph = icmp6_hdr(buff);
1617
1618         memset(icmph, 0, sizeof(struct icmp6hdr));
1619         icmph->icmp6_type = NDISC_REDIRECT;
1620
1621         /*
1622          *      copy target and destination addresses
1623          */
1624
1625         addrp = (struct in6_addr *)(icmph + 1);
1626         *addrp = *target;
1627         addrp++;
1628         *addrp = ipv6_hdr(skb)->daddr;
1629
1630         opt = (u8*) (addrp + 1);
1631
1632         /*
1633          *      include target_address option
1634          */
1635
1636         if (ha)
1637                 opt = ndisc_fill_addr_option(opt, ND_OPT_TARGET_LL_ADDR, ha,
1638                                              dev->addr_len, dev->type);
1639
1640         /*
1641          *      build redirect option and copy skb over to the new packet.
1642          */
1643
1644         memset(opt, 0, 8);
1645         *(opt++) = ND_OPT_REDIRECT_HDR;
1646         *(opt++) = (rd_len >> 3);
1647         opt += 6;
1648
1649         memcpy(opt, ipv6_hdr(skb), rd_len - 8);
1650
1651         icmph->icmp6_cksum = csum_ipv6_magic(&saddr_buf, &ipv6_hdr(skb)->saddr,
1652                                              len, IPPROTO_ICMPV6,
1653                                              csum_partial(icmph, len, 0));
1654
1655         skb_dst_set(buff, dst);
1656         rcu_read_lock();
1657         idev = __in6_dev_get(dst->dev);
1658         IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len);
1659         err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, buff, NULL, dst->dev,
1660                       dst_output);
1661         if (!err) {
1662                 ICMP6MSGOUT_INC_STATS(net, idev, NDISC_REDIRECT);
1663                 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
1664         }
1665
1666         rcu_read_unlock();
1667         return;
1668
1669 release:
1670         dst_release(dst);
1671 }
1672
1673 static void pndisc_redo(struct sk_buff *skb)
1674 {
1675         ndisc_recv_ns(skb);
1676         kfree_skb(skb);
1677 }
1678
1679 int ndisc_rcv(struct sk_buff *skb)
1680 {
1681         struct nd_msg *msg;
1682
1683         if (!pskb_may_pull(skb, skb->len))
1684                 return 0;
1685
1686         msg = (struct nd_msg *)skb_transport_header(skb);
1687
1688         __skb_push(skb, skb->data - skb_transport_header(skb));
1689
1690         if (ipv6_hdr(skb)->hop_limit != 255) {
1691                 ND_PRINTK2(KERN_WARNING
1692                            "ICMPv6 NDISC: invalid hop-limit: %d\n",
1693                            ipv6_hdr(skb)->hop_limit);
1694                 return 0;
1695         }
1696
1697         if (msg->icmph.icmp6_code != 0) {
1698                 ND_PRINTK2(KERN_WARNING
1699                            "ICMPv6 NDISC: invalid ICMPv6 code: %d\n",
1700                            msg->icmph.icmp6_code);
1701                 return 0;
1702         }
1703
1704         memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
1705
1706         switch (msg->icmph.icmp6_type) {
1707         case NDISC_NEIGHBOUR_SOLICITATION:
1708                 ndisc_recv_ns(skb);
1709                 break;
1710
1711         case NDISC_NEIGHBOUR_ADVERTISEMENT:
1712                 ndisc_recv_na(skb);
1713                 break;
1714
1715         case NDISC_ROUTER_SOLICITATION:
1716                 ndisc_recv_rs(skb);
1717                 break;
1718
1719         case NDISC_ROUTER_ADVERTISEMENT:
1720                 ndisc_router_discovery(skb);
1721                 break;
1722
1723         case NDISC_REDIRECT:
1724                 ndisc_redirect_rcv(skb);
1725                 break;
1726         }
1727
1728         return 0;
1729 }
1730
1731 static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1732 {
1733         struct net_device *dev = ptr;
1734         struct net *net = dev_net(dev);
1735
1736         switch (event) {
1737         case NETDEV_CHANGEADDR:
1738                 neigh_changeaddr(&nd_tbl, dev);
1739                 fib6_run_gc(~0UL, net);
1740                 break;
1741         case NETDEV_DOWN:
1742                 neigh_ifdown(&nd_tbl, dev);
1743                 fib6_run_gc(~0UL, net);
1744                 break;
1745         case NETDEV_NOTIFY_PEERS:
1746                 ndisc_send_unsol_na(dev);
1747                 break;
1748         default:
1749                 break;
1750         }
1751
1752         return NOTIFY_DONE;
1753 }
1754
1755 static struct notifier_block ndisc_netdev_notifier = {
1756         .notifier_call = ndisc_netdev_event,
1757 };
1758
1759 #ifdef CONFIG_SYSCTL
1760 static void ndisc_warn_deprecated_sysctl(struct ctl_table *ctl,
1761                                          const char *func, const char *dev_name)
1762 {
1763         static char warncomm[TASK_COMM_LEN];
1764         static int warned;
1765         if (strcmp(warncomm, current->comm) && warned < 5) {
1766                 strcpy(warncomm, current->comm);
1767                 printk(KERN_WARNING
1768                         "process `%s' is using deprecated sysctl (%s) "
1769                         "net.ipv6.neigh.%s.%s; "
1770                         "Use net.ipv6.neigh.%s.%s_ms "
1771                         "instead.\n",
1772                         warncomm, func,
1773                         dev_name, ctl->procname,
1774                         dev_name, ctl->procname);
1775                 warned++;
1776         }
1777 }
1778
1779 int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void __user *buffer, size_t *lenp, loff_t *ppos)
1780 {
1781         struct net_device *dev = ctl->extra1;
1782         struct inet6_dev *idev;
1783         int ret;
1784
1785         if ((strcmp(ctl->procname, "retrans_time") == 0) ||
1786             (strcmp(ctl->procname, "base_reachable_time") == 0))
1787                 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default");
1788
1789         if (strcmp(ctl->procname, "retrans_time") == 0)
1790                 ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
1791
1792         else if (strcmp(ctl->procname, "base_reachable_time") == 0)
1793                 ret = proc_dointvec_jiffies(ctl, write,
1794                                             buffer, lenp, ppos);
1795
1796         else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) ||
1797                  (strcmp(ctl->procname, "base_reachable_time_ms") == 0))
1798                 ret = proc_dointvec_ms_jiffies(ctl, write,
1799                                                buffer, lenp, ppos);
1800         else
1801                 ret = -1;
1802
1803         if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) {
1804                 if (ctl->data == &idev->nd_parms->base_reachable_time)
1805                         idev->nd_parms->reachable_time = neigh_rand_reach_time(idev->nd_parms->base_reachable_time);
1806                 idev->tstamp = jiffies;
1807                 inet6_ifinfo_notify(RTM_NEWLINK, idev);
1808                 in6_dev_put(idev);
1809         }
1810         return ret;
1811 }
1812
1813
1814 #endif
1815
1816 static int __net_init ndisc_net_init(struct net *net)
1817 {
1818         struct ipv6_pinfo *np;
1819         struct sock *sk;
1820         int err;
1821
1822         err = inet_ctl_sock_create(&sk, PF_INET6,
1823                                    SOCK_RAW, IPPROTO_ICMPV6, net);
1824         if (err < 0) {
1825                 ND_PRINTK0(KERN_ERR
1826                            "ICMPv6 NDISC: Failed to initialize the control socket (err %d).\n",
1827                            err);
1828                 return err;
1829         }
1830
1831         net->ipv6.ndisc_sk = sk;
1832
1833         np = inet6_sk(sk);
1834         np->hop_limit = 255;
1835         /* Do not loopback ndisc messages */
1836         np->mc_loop = 0;
1837
1838         return 0;
1839 }
1840
1841 static void __net_exit ndisc_net_exit(struct net *net)
1842 {
1843         inet_ctl_sock_destroy(net->ipv6.ndisc_sk);
1844 }
1845
1846 static struct pernet_operations ndisc_net_ops = {
1847         .init = ndisc_net_init,
1848         .exit = ndisc_net_exit,
1849 };
1850
1851 int __init ndisc_init(void)
1852 {
1853         int err;
1854
1855         err = register_pernet_subsys(&ndisc_net_ops);
1856         if (err)
1857                 return err;
1858         /*
1859          * Initialize the neighbour table
1860          */
1861         neigh_table_init(&nd_tbl);
1862
1863 #ifdef CONFIG_SYSCTL
1864         err = neigh_sysctl_register(NULL, &nd_tbl.parms, "ipv6",
1865                                     &ndisc_ifinfo_sysctl_change);
1866         if (err)
1867                 goto out_unregister_pernet;
1868 #endif
1869         err = register_netdevice_notifier(&ndisc_netdev_notifier);
1870         if (err)
1871                 goto out_unregister_sysctl;
1872 out:
1873         return err;
1874
1875 out_unregister_sysctl:
1876 #ifdef CONFIG_SYSCTL
1877         neigh_sysctl_unregister(&nd_tbl.parms);
1878 out_unregister_pernet:
1879 #endif
1880         unregister_pernet_subsys(&ndisc_net_ops);
1881         goto out;
1882 }
1883
1884 void ndisc_cleanup(void)
1885 {
1886         unregister_netdevice_notifier(&ndisc_netdev_notifier);
1887 #ifdef CONFIG_SYSCTL
1888         neigh_sysctl_unregister(&nd_tbl.parms);
1889 #endif
1890         neigh_table_clear(&nd_tbl);
1891         unregister_pernet_subsys(&ndisc_net_ops);
1892 }