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