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