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