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