irqchip: Fix dependencies for archs w/o HAS_IOMEM
[linux/fpc-iii.git] / net / ipv6 / ndisc.c
blob84afb9a7727848038b51ee7a60eebb28d555f693
1 /*
2 * Neighbour Discovery for IPv6
3 * Linux INET6 implementation
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 * Mike Shaver <shaver@ingenia.com>
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.
16 * Changes:
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
30 #define pr_fmt(fmt) "ICMPv6: " fmt
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
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>
54 #include <net/sock.h>
55 #include <net/snmp.h>
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>
64 #include <net/netlink.h>
65 #include <linux/rtnetlink.h>
67 #include <net/flow.h>
68 #include <net/ip6_checksum.h>
69 #include <net/inet_common.h>
70 #include <net/l3mdev.h>
71 #include <linux/proc_fs.h>
73 #include <linux/netfilter.h>
74 #include <linux/netfilter_ipv6.h>
76 /* Set to 3 to get tracing... */
77 #define ND_DEBUG 1
79 #define ND_PRINTK(val, level, fmt, ...) \
80 do { \
81 if (val <= ND_DEBUG) \
82 net_##level##_ratelimited(fmt, ##__VA_ARGS__); \
83 } while (0)
85 static u32 ndisc_hash(const void *pkey,
86 const struct net_device *dev,
87 __u32 *hash_rnd);
88 static bool ndisc_key_eq(const struct neighbour *neigh, const void *pkey);
89 static int ndisc_constructor(struct neighbour *neigh);
90 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb);
91 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb);
92 static int pndisc_constructor(struct pneigh_entry *n);
93 static void pndisc_destructor(struct pneigh_entry *n);
94 static void pndisc_redo(struct sk_buff *skb);
96 static const struct neigh_ops ndisc_generic_ops = {
97 .family = AF_INET6,
98 .solicit = ndisc_solicit,
99 .error_report = ndisc_error_report,
100 .output = neigh_resolve_output,
101 .connected_output = neigh_connected_output,
104 static const struct neigh_ops ndisc_hh_ops = {
105 .family = AF_INET6,
106 .solicit = ndisc_solicit,
107 .error_report = ndisc_error_report,
108 .output = neigh_resolve_output,
109 .connected_output = neigh_resolve_output,
113 static const struct neigh_ops ndisc_direct_ops = {
114 .family = AF_INET6,
115 .output = neigh_direct_output,
116 .connected_output = neigh_direct_output,
119 struct neigh_table nd_tbl = {
120 .family = AF_INET6,
121 .key_len = sizeof(struct in6_addr),
122 .protocol = cpu_to_be16(ETH_P_IPV6),
123 .hash = ndisc_hash,
124 .key_eq = ndisc_key_eq,
125 .constructor = ndisc_constructor,
126 .pconstructor = pndisc_constructor,
127 .pdestructor = pndisc_destructor,
128 .proxy_redo = pndisc_redo,
129 .id = "ndisc_cache",
130 .parms = {
131 .tbl = &nd_tbl,
132 .reachable_time = ND_REACHABLE_TIME,
133 .data = {
134 [NEIGH_VAR_MCAST_PROBES] = 3,
135 [NEIGH_VAR_UCAST_PROBES] = 3,
136 [NEIGH_VAR_RETRANS_TIME] = ND_RETRANS_TIMER,
137 [NEIGH_VAR_BASE_REACHABLE_TIME] = ND_REACHABLE_TIME,
138 [NEIGH_VAR_DELAY_PROBE_TIME] = 5 * HZ,
139 [NEIGH_VAR_GC_STALETIME] = 60 * HZ,
140 [NEIGH_VAR_QUEUE_LEN_BYTES] = 64 * 1024,
141 [NEIGH_VAR_PROXY_QLEN] = 64,
142 [NEIGH_VAR_ANYCAST_DELAY] = 1 * HZ,
143 [NEIGH_VAR_PROXY_DELAY] = (8 * HZ) / 10,
146 .gc_interval = 30 * HZ,
147 .gc_thresh1 = 128,
148 .gc_thresh2 = 512,
149 .gc_thresh3 = 1024,
151 EXPORT_SYMBOL_GPL(nd_tbl);
153 static void ndisc_fill_addr_option(struct sk_buff *skb, int type, void *data)
155 int pad = ndisc_addr_option_pad(skb->dev->type);
156 int data_len = skb->dev->addr_len;
157 int space = ndisc_opt_addr_space(skb->dev);
158 u8 *opt = skb_put(skb, space);
160 opt[0] = type;
161 opt[1] = space>>3;
163 memset(opt + 2, 0, pad);
164 opt += pad;
165 space -= pad;
167 memcpy(opt+2, data, data_len);
168 data_len += 2;
169 opt += data_len;
170 space -= data_len;
171 if (space > 0)
172 memset(opt, 0, space);
175 static struct nd_opt_hdr *ndisc_next_option(struct nd_opt_hdr *cur,
176 struct nd_opt_hdr *end)
178 int type;
179 if (!cur || !end || cur >= end)
180 return NULL;
181 type = cur->nd_opt_type;
182 do {
183 cur = ((void *)cur) + (cur->nd_opt_len << 3);
184 } while (cur < end && cur->nd_opt_type != type);
185 return cur <= end && cur->nd_opt_type == type ? cur : NULL;
188 static inline int ndisc_is_useropt(struct nd_opt_hdr *opt)
190 return opt->nd_opt_type == ND_OPT_RDNSS ||
191 opt->nd_opt_type == ND_OPT_DNSSL;
194 static struct nd_opt_hdr *ndisc_next_useropt(struct nd_opt_hdr *cur,
195 struct nd_opt_hdr *end)
197 if (!cur || !end || cur >= end)
198 return NULL;
199 do {
200 cur = ((void *)cur) + (cur->nd_opt_len << 3);
201 } while (cur < end && !ndisc_is_useropt(cur));
202 return cur <= end && ndisc_is_useropt(cur) ? cur : NULL;
205 struct ndisc_options *ndisc_parse_options(u8 *opt, int opt_len,
206 struct ndisc_options *ndopts)
208 struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)opt;
210 if (!nd_opt || opt_len < 0 || !ndopts)
211 return NULL;
212 memset(ndopts, 0, sizeof(*ndopts));
213 while (opt_len) {
214 int l;
215 if (opt_len < sizeof(struct nd_opt_hdr))
216 return NULL;
217 l = nd_opt->nd_opt_len << 3;
218 if (opt_len < l || l == 0)
219 return NULL;
220 switch (nd_opt->nd_opt_type) {
221 case ND_OPT_SOURCE_LL_ADDR:
222 case ND_OPT_TARGET_LL_ADDR:
223 case ND_OPT_MTU:
224 case ND_OPT_REDIRECT_HDR:
225 if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) {
226 ND_PRINTK(2, warn,
227 "%s: duplicated ND6 option found: type=%d\n",
228 __func__, nd_opt->nd_opt_type);
229 } else {
230 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
232 break;
233 case ND_OPT_PREFIX_INFO:
234 ndopts->nd_opts_pi_end = nd_opt;
235 if (!ndopts->nd_opt_array[nd_opt->nd_opt_type])
236 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
237 break;
238 #ifdef CONFIG_IPV6_ROUTE_INFO
239 case ND_OPT_ROUTE_INFO:
240 ndopts->nd_opts_ri_end = nd_opt;
241 if (!ndopts->nd_opts_ri)
242 ndopts->nd_opts_ri = nd_opt;
243 break;
244 #endif
245 default:
246 if (ndisc_is_useropt(nd_opt)) {
247 ndopts->nd_useropts_end = nd_opt;
248 if (!ndopts->nd_useropts)
249 ndopts->nd_useropts = nd_opt;
250 } else {
252 * Unknown options must be silently ignored,
253 * to accommodate future extension to the
254 * protocol.
256 ND_PRINTK(2, notice,
257 "%s: ignored unsupported option; type=%d, len=%d\n",
258 __func__,
259 nd_opt->nd_opt_type,
260 nd_opt->nd_opt_len);
263 opt_len -= l;
264 nd_opt = ((void *)nd_opt) + l;
266 return ndopts;
269 int ndisc_mc_map(const struct in6_addr *addr, char *buf, struct net_device *dev, int dir)
271 switch (dev->type) {
272 case ARPHRD_ETHER:
273 case ARPHRD_IEEE802: /* Not sure. Check it later. --ANK */
274 case ARPHRD_FDDI:
275 ipv6_eth_mc_map(addr, buf);
276 return 0;
277 case ARPHRD_ARCNET:
278 ipv6_arcnet_mc_map(addr, buf);
279 return 0;
280 case ARPHRD_INFINIBAND:
281 ipv6_ib_mc_map(addr, dev->broadcast, buf);
282 return 0;
283 case ARPHRD_IPGRE:
284 return ipv6_ipgre_mc_map(addr, dev->broadcast, buf);
285 default:
286 if (dir) {
287 memcpy(buf, dev->broadcast, dev->addr_len);
288 return 0;
291 return -EINVAL;
293 EXPORT_SYMBOL(ndisc_mc_map);
295 static u32 ndisc_hash(const void *pkey,
296 const struct net_device *dev,
297 __u32 *hash_rnd)
299 return ndisc_hashfn(pkey, dev, hash_rnd);
302 static bool ndisc_key_eq(const struct neighbour *n, const void *pkey)
304 return neigh_key_eq128(n, pkey);
307 static int ndisc_constructor(struct neighbour *neigh)
309 struct in6_addr *addr = (struct in6_addr *)&neigh->primary_key;
310 struct net_device *dev = neigh->dev;
311 struct inet6_dev *in6_dev;
312 struct neigh_parms *parms;
313 bool is_multicast = ipv6_addr_is_multicast(addr);
315 in6_dev = in6_dev_get(dev);
316 if (!in6_dev) {
317 return -EINVAL;
320 parms = in6_dev->nd_parms;
321 __neigh_parms_put(neigh->parms);
322 neigh->parms = neigh_parms_clone(parms);
324 neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST;
325 if (!dev->header_ops) {
326 neigh->nud_state = NUD_NOARP;
327 neigh->ops = &ndisc_direct_ops;
328 neigh->output = neigh_direct_output;
329 } else {
330 if (is_multicast) {
331 neigh->nud_state = NUD_NOARP;
332 ndisc_mc_map(addr, neigh->ha, dev, 1);
333 } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) {
334 neigh->nud_state = NUD_NOARP;
335 memcpy(neigh->ha, dev->dev_addr, dev->addr_len);
336 if (dev->flags&IFF_LOOPBACK)
337 neigh->type = RTN_LOCAL;
338 } else if (dev->flags&IFF_POINTOPOINT) {
339 neigh->nud_state = NUD_NOARP;
340 memcpy(neigh->ha, dev->broadcast, dev->addr_len);
342 if (dev->header_ops->cache)
343 neigh->ops = &ndisc_hh_ops;
344 else
345 neigh->ops = &ndisc_generic_ops;
346 if (neigh->nud_state&NUD_VALID)
347 neigh->output = neigh->ops->connected_output;
348 else
349 neigh->output = neigh->ops->output;
351 in6_dev_put(in6_dev);
352 return 0;
355 static int pndisc_constructor(struct pneigh_entry *n)
357 struct in6_addr *addr = (struct in6_addr *)&n->key;
358 struct in6_addr maddr;
359 struct net_device *dev = n->dev;
361 if (!dev || !__in6_dev_get(dev))
362 return -EINVAL;
363 addrconf_addr_solict_mult(addr, &maddr);
364 ipv6_dev_mc_inc(dev, &maddr);
365 return 0;
368 static void pndisc_destructor(struct pneigh_entry *n)
370 struct in6_addr *addr = (struct in6_addr *)&n->key;
371 struct in6_addr maddr;
372 struct net_device *dev = n->dev;
374 if (!dev || !__in6_dev_get(dev))
375 return;
376 addrconf_addr_solict_mult(addr, &maddr);
377 ipv6_dev_mc_dec(dev, &maddr);
380 static struct sk_buff *ndisc_alloc_skb(struct net_device *dev,
381 int len)
383 int hlen = LL_RESERVED_SPACE(dev);
384 int tlen = dev->needed_tailroom;
385 struct sock *sk = dev_net(dev)->ipv6.ndisc_sk;
386 struct sk_buff *skb;
388 skb = alloc_skb(hlen + sizeof(struct ipv6hdr) + len + tlen, GFP_ATOMIC);
389 if (!skb) {
390 ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb\n",
391 __func__);
392 return NULL;
395 skb->protocol = htons(ETH_P_IPV6);
396 skb->dev = dev;
398 skb_reserve(skb, hlen + sizeof(struct ipv6hdr));
399 skb_reset_transport_header(skb);
401 /* Manually assign socket ownership as we avoid calling
402 * sock_alloc_send_pskb() to bypass wmem buffer limits
404 skb_set_owner_w(skb, sk);
406 return skb;
409 static void ip6_nd_hdr(struct sk_buff *skb,
410 const struct in6_addr *saddr,
411 const struct in6_addr *daddr,
412 int hop_limit, int len)
414 struct ipv6hdr *hdr;
416 skb_push(skb, sizeof(*hdr));
417 skb_reset_network_header(skb);
418 hdr = ipv6_hdr(skb);
420 ip6_flow_hdr(hdr, 0, 0);
422 hdr->payload_len = htons(len);
423 hdr->nexthdr = IPPROTO_ICMPV6;
424 hdr->hop_limit = hop_limit;
426 hdr->saddr = *saddr;
427 hdr->daddr = *daddr;
430 static void ndisc_send_skb(struct sk_buff *skb,
431 const struct in6_addr *daddr,
432 const struct in6_addr *saddr)
434 struct dst_entry *dst = skb_dst(skb);
435 struct net *net = dev_net(skb->dev);
436 struct sock *sk = net->ipv6.ndisc_sk;
437 struct inet6_dev *idev;
438 int err;
439 struct icmp6hdr *icmp6h = icmp6_hdr(skb);
440 u8 type;
442 type = icmp6h->icmp6_type;
444 if (!dst) {
445 struct flowi6 fl6;
446 int oif = l3mdev_fib_oif(skb->dev);
448 icmpv6_flow_init(sk, &fl6, type, saddr, daddr, oif);
449 if (oif != skb->dev->ifindex)
450 fl6.flowi6_flags |= FLOWI_FLAG_L3MDEV_SRC;
451 dst = icmp6_dst_alloc(skb->dev, &fl6);
452 if (IS_ERR(dst)) {
453 kfree_skb(skb);
454 return;
457 skb_dst_set(skb, dst);
460 icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, skb->len,
461 IPPROTO_ICMPV6,
462 csum_partial(icmp6h,
463 skb->len, 0));
465 ip6_nd_hdr(skb, saddr, daddr, inet6_sk(sk)->hop_limit, skb->len);
467 rcu_read_lock();
468 idev = __in6_dev_get(dst->dev);
469 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len);
471 err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT,
472 net, sk, skb, NULL, dst->dev,
473 dst_output);
474 if (!err) {
475 ICMP6MSGOUT_INC_STATS(net, idev, type);
476 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
479 rcu_read_unlock();
482 void ndisc_send_na(struct net_device *dev, const struct in6_addr *daddr,
483 const struct in6_addr *solicited_addr,
484 bool router, bool solicited, bool override, bool inc_opt)
486 struct sk_buff *skb;
487 struct in6_addr tmpaddr;
488 struct inet6_ifaddr *ifp;
489 const struct in6_addr *src_addr;
490 struct nd_msg *msg;
491 int optlen = 0;
493 /* for anycast or proxy, solicited_addr != src_addr */
494 ifp = ipv6_get_ifaddr(dev_net(dev), solicited_addr, dev, 1);
495 if (ifp) {
496 src_addr = solicited_addr;
497 if (ifp->flags & IFA_F_OPTIMISTIC)
498 override = false;
499 inc_opt |= ifp->idev->cnf.force_tllao;
500 in6_ifa_put(ifp);
501 } else {
502 if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr,
503 inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs,
504 &tmpaddr))
505 return;
506 src_addr = &tmpaddr;
509 if (!dev->addr_len)
510 inc_opt = 0;
511 if (inc_opt)
512 optlen += ndisc_opt_addr_space(dev);
514 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
515 if (!skb)
516 return;
518 msg = (struct nd_msg *)skb_put(skb, sizeof(*msg));
519 *msg = (struct nd_msg) {
520 .icmph = {
521 .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
522 .icmp6_router = router,
523 .icmp6_solicited = solicited,
524 .icmp6_override = override,
526 .target = *solicited_addr,
529 if (inc_opt)
530 ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR,
531 dev->dev_addr);
534 ndisc_send_skb(skb, daddr, src_addr);
537 static void ndisc_send_unsol_na(struct net_device *dev)
539 struct inet6_dev *idev;
540 struct inet6_ifaddr *ifa;
542 idev = in6_dev_get(dev);
543 if (!idev)
544 return;
546 read_lock_bh(&idev->lock);
547 list_for_each_entry(ifa, &idev->addr_list, if_list) {
548 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &ifa->addr,
549 /*router=*/ !!idev->cnf.forwarding,
550 /*solicited=*/ false, /*override=*/ true,
551 /*inc_opt=*/ true);
553 read_unlock_bh(&idev->lock);
555 in6_dev_put(idev);
558 void ndisc_send_ns(struct net_device *dev, const struct in6_addr *solicit,
559 const struct in6_addr *daddr, const struct in6_addr *saddr)
561 struct sk_buff *skb;
562 struct in6_addr addr_buf;
563 int inc_opt = dev->addr_len;
564 int optlen = 0;
565 struct nd_msg *msg;
567 if (!saddr) {
568 if (ipv6_get_lladdr(dev, &addr_buf,
569 (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)))
570 return;
571 saddr = &addr_buf;
574 if (ipv6_addr_any(saddr))
575 inc_opt = false;
576 if (inc_opt)
577 optlen += ndisc_opt_addr_space(dev);
579 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
580 if (!skb)
581 return;
583 msg = (struct nd_msg *)skb_put(skb, sizeof(*msg));
584 *msg = (struct nd_msg) {
585 .icmph = {
586 .icmp6_type = NDISC_NEIGHBOUR_SOLICITATION,
588 .target = *solicit,
591 if (inc_opt)
592 ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR,
593 dev->dev_addr);
595 ndisc_send_skb(skb, daddr, saddr);
598 void ndisc_send_rs(struct net_device *dev, const struct in6_addr *saddr,
599 const struct in6_addr *daddr)
601 struct sk_buff *skb;
602 struct rs_msg *msg;
603 int send_sllao = dev->addr_len;
604 int optlen = 0;
606 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
608 * According to section 2.2 of RFC 4429, we must not
609 * send router solicitations with a sllao from
610 * optimistic addresses, but we may send the solicitation
611 * if we don't include the sllao. So here we check
612 * if our address is optimistic, and if so, we
613 * suppress the inclusion of the sllao.
615 if (send_sllao) {
616 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(dev_net(dev), saddr,
617 dev, 1);
618 if (ifp) {
619 if (ifp->flags & IFA_F_OPTIMISTIC) {
620 send_sllao = 0;
622 in6_ifa_put(ifp);
623 } else {
624 send_sllao = 0;
627 #endif
628 if (send_sllao)
629 optlen += ndisc_opt_addr_space(dev);
631 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
632 if (!skb)
633 return;
635 msg = (struct rs_msg *)skb_put(skb, sizeof(*msg));
636 *msg = (struct rs_msg) {
637 .icmph = {
638 .icmp6_type = NDISC_ROUTER_SOLICITATION,
642 if (send_sllao)
643 ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR,
644 dev->dev_addr);
646 ndisc_send_skb(skb, daddr, saddr);
650 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb)
653 * "The sender MUST return an ICMP
654 * destination unreachable"
656 dst_link_failure(skb);
657 kfree_skb(skb);
660 /* Called with locked neigh: either read or both */
662 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
664 struct in6_addr *saddr = NULL;
665 struct in6_addr mcaddr;
666 struct net_device *dev = neigh->dev;
667 struct in6_addr *target = (struct in6_addr *)&neigh->primary_key;
668 int probes = atomic_read(&neigh->probes);
670 if (skb && ipv6_chk_addr_and_flags(dev_net(dev), &ipv6_hdr(skb)->saddr,
671 dev, 1,
672 IFA_F_TENTATIVE|IFA_F_OPTIMISTIC))
673 saddr = &ipv6_hdr(skb)->saddr;
674 probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES);
675 if (probes < 0) {
676 if (!(neigh->nud_state & NUD_VALID)) {
677 ND_PRINTK(1, dbg,
678 "%s: trying to ucast probe in NUD_INVALID: %pI6\n",
679 __func__, target);
681 ndisc_send_ns(dev, target, target, saddr);
682 } else if ((probes -= NEIGH_VAR(neigh->parms, APP_PROBES)) < 0) {
683 neigh_app_ns(neigh);
684 } else {
685 addrconf_addr_solict_mult(target, &mcaddr);
686 ndisc_send_ns(dev, target, &mcaddr, saddr);
690 static int pndisc_is_router(const void *pkey,
691 struct net_device *dev)
693 struct pneigh_entry *n;
694 int ret = -1;
696 read_lock_bh(&nd_tbl.lock);
697 n = __pneigh_lookup(&nd_tbl, dev_net(dev), pkey, dev);
698 if (n)
699 ret = !!(n->flags & NTF_ROUTER);
700 read_unlock_bh(&nd_tbl.lock);
702 return ret;
705 static void ndisc_recv_ns(struct sk_buff *skb)
707 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
708 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
709 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
710 u8 *lladdr = NULL;
711 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
712 offsetof(struct nd_msg, opt));
713 struct ndisc_options ndopts;
714 struct net_device *dev = skb->dev;
715 struct inet6_ifaddr *ifp;
716 struct inet6_dev *idev = NULL;
717 struct neighbour *neigh;
718 int dad = ipv6_addr_any(saddr);
719 bool inc;
720 int is_router = -1;
722 if (skb->len < sizeof(struct nd_msg)) {
723 ND_PRINTK(2, warn, "NS: packet too short\n");
724 return;
727 if (ipv6_addr_is_multicast(&msg->target)) {
728 ND_PRINTK(2, warn, "NS: multicast target address\n");
729 return;
733 * RFC2461 7.1.1:
734 * DAD has to be destined for solicited node multicast address.
736 if (dad && !ipv6_addr_is_solict_mult(daddr)) {
737 ND_PRINTK(2, warn, "NS: bad DAD packet (wrong destination)\n");
738 return;
741 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
742 ND_PRINTK(2, warn, "NS: invalid ND options\n");
743 return;
746 if (ndopts.nd_opts_src_lladdr) {
747 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev);
748 if (!lladdr) {
749 ND_PRINTK(2, warn,
750 "NS: invalid link-layer address length\n");
751 return;
754 /* RFC2461 7.1.1:
755 * If the IP source address is the unspecified address,
756 * there MUST NOT be source link-layer address option
757 * in the message.
759 if (dad) {
760 ND_PRINTK(2, warn,
761 "NS: bad DAD packet (link-layer address option)\n");
762 return;
766 inc = ipv6_addr_is_multicast(daddr);
768 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
769 if (ifp) {
770 have_ifp:
771 if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) {
772 if (dad) {
774 * We are colliding with another node
775 * who is doing DAD
776 * so fail our DAD process
778 addrconf_dad_failure(ifp);
779 return;
780 } else {
782 * This is not a dad solicitation.
783 * If we are an optimistic node,
784 * we should respond.
785 * Otherwise, we should ignore it.
787 if (!(ifp->flags & IFA_F_OPTIMISTIC))
788 goto out;
792 idev = ifp->idev;
793 } else {
794 struct net *net = dev_net(dev);
796 /* perhaps an address on the master device */
797 if (netif_is_l3_slave(dev)) {
798 struct net_device *mdev;
800 mdev = netdev_master_upper_dev_get_rcu(dev);
801 if (mdev) {
802 ifp = ipv6_get_ifaddr(net, &msg->target, mdev, 1);
803 if (ifp)
804 goto have_ifp;
808 idev = in6_dev_get(dev);
809 if (!idev) {
810 /* XXX: count this drop? */
811 return;
814 if (ipv6_chk_acast_addr(net, dev, &msg->target) ||
815 (idev->cnf.forwarding &&
816 (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) &&
817 (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) {
818 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
819 skb->pkt_type != PACKET_HOST &&
820 inc &&
821 NEIGH_VAR(idev->nd_parms, PROXY_DELAY) != 0) {
823 * for anycast or proxy,
824 * sender should delay its response
825 * by a random time between 0 and
826 * MAX_ANYCAST_DELAY_TIME seconds.
827 * (RFC2461) -- yoshfuji
829 struct sk_buff *n = skb_clone(skb, GFP_ATOMIC);
830 if (n)
831 pneigh_enqueue(&nd_tbl, idev->nd_parms, n);
832 goto out;
834 } else
835 goto out;
838 if (is_router < 0)
839 is_router = idev->cnf.forwarding;
841 if (dad) {
842 ndisc_send_na(dev, &in6addr_linklocal_allnodes, &msg->target,
843 !!is_router, false, (ifp != NULL), true);
844 goto out;
847 if (inc)
848 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_mcast);
849 else
850 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast);
853 * update / create cache entry
854 * for the source address
856 neigh = __neigh_lookup(&nd_tbl, saddr, dev,
857 !inc || lladdr || !dev->addr_len);
858 if (neigh)
859 neigh_update(neigh, lladdr, NUD_STALE,
860 NEIGH_UPDATE_F_WEAK_OVERRIDE|
861 NEIGH_UPDATE_F_OVERRIDE);
862 if (neigh || !dev->header_ops) {
863 ndisc_send_na(dev, saddr, &msg->target, !!is_router,
864 true, (ifp != NULL && inc), inc);
865 if (neigh)
866 neigh_release(neigh);
869 out:
870 if (ifp)
871 in6_ifa_put(ifp);
872 else
873 in6_dev_put(idev);
876 static void ndisc_recv_na(struct sk_buff *skb)
878 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
879 struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
880 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
881 u8 *lladdr = NULL;
882 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
883 offsetof(struct nd_msg, opt));
884 struct ndisc_options ndopts;
885 struct net_device *dev = skb->dev;
886 struct inet6_ifaddr *ifp;
887 struct neighbour *neigh;
889 if (skb->len < sizeof(struct nd_msg)) {
890 ND_PRINTK(2, warn, "NA: packet too short\n");
891 return;
894 if (ipv6_addr_is_multicast(&msg->target)) {
895 ND_PRINTK(2, warn, "NA: target address is multicast\n");
896 return;
899 if (ipv6_addr_is_multicast(daddr) &&
900 msg->icmph.icmp6_solicited) {
901 ND_PRINTK(2, warn, "NA: solicited NA is multicasted\n");
902 return;
905 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
906 ND_PRINTK(2, warn, "NS: invalid ND option\n");
907 return;
909 if (ndopts.nd_opts_tgt_lladdr) {
910 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev);
911 if (!lladdr) {
912 ND_PRINTK(2, warn,
913 "NA: invalid link-layer address length\n");
914 return;
917 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
918 if (ifp) {
919 if (skb->pkt_type != PACKET_LOOPBACK
920 && (ifp->flags & IFA_F_TENTATIVE)) {
921 addrconf_dad_failure(ifp);
922 return;
924 /* What should we make now? The advertisement
925 is invalid, but ndisc specs say nothing
926 about it. It could be misconfiguration, or
927 an smart proxy agent tries to help us :-)
929 We should not print the error if NA has been
930 received from loopback - it is just our own
931 unsolicited advertisement.
933 if (skb->pkt_type != PACKET_LOOPBACK)
934 ND_PRINTK(1, warn,
935 "NA: someone advertises our address %pI6 on %s!\n",
936 &ifp->addr, ifp->idev->dev->name);
937 in6_ifa_put(ifp);
938 return;
940 neigh = neigh_lookup(&nd_tbl, &msg->target, dev);
942 if (neigh) {
943 u8 old_flags = neigh->flags;
944 struct net *net = dev_net(dev);
946 if (neigh->nud_state & NUD_FAILED)
947 goto out;
950 * Don't update the neighbor cache entry on a proxy NA from
951 * ourselves because either the proxied node is off link or it
952 * has already sent a NA to us.
954 if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) &&
955 net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp &&
956 pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) {
957 /* XXX: idev->cnf.proxy_ndp */
958 goto out;
961 neigh_update(neigh, lladdr,
962 msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE,
963 NEIGH_UPDATE_F_WEAK_OVERRIDE|
964 (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)|
965 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
966 (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0));
968 if ((old_flags & ~neigh->flags) & NTF_ROUTER) {
970 * Change: router to host
972 rt6_clean_tohost(dev_net(dev), saddr);
975 out:
976 neigh_release(neigh);
980 static void ndisc_recv_rs(struct sk_buff *skb)
982 struct rs_msg *rs_msg = (struct rs_msg *)skb_transport_header(skb);
983 unsigned long ndoptlen = skb->len - sizeof(*rs_msg);
984 struct neighbour *neigh;
985 struct inet6_dev *idev;
986 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
987 struct ndisc_options ndopts;
988 u8 *lladdr = NULL;
990 if (skb->len < sizeof(*rs_msg))
991 return;
993 idev = __in6_dev_get(skb->dev);
994 if (!idev) {
995 ND_PRINTK(1, err, "RS: can't find in6 device\n");
996 return;
999 /* Don't accept RS if we're not in router mode */
1000 if (!idev->cnf.forwarding)
1001 goto out;
1004 * Don't update NCE if src = ::;
1005 * this implies that the source node has no ip address assigned yet.
1007 if (ipv6_addr_any(saddr))
1008 goto out;
1010 /* Parse ND options */
1011 if (!ndisc_parse_options(rs_msg->opt, ndoptlen, &ndopts)) {
1012 ND_PRINTK(2, notice, "NS: invalid ND option, ignored\n");
1013 goto out;
1016 if (ndopts.nd_opts_src_lladdr) {
1017 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1018 skb->dev);
1019 if (!lladdr)
1020 goto out;
1023 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1);
1024 if (neigh) {
1025 neigh_update(neigh, lladdr, NUD_STALE,
1026 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1027 NEIGH_UPDATE_F_OVERRIDE|
1028 NEIGH_UPDATE_F_OVERRIDE_ISROUTER);
1029 neigh_release(neigh);
1031 out:
1032 return;
1035 static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt)
1037 struct icmp6hdr *icmp6h = (struct icmp6hdr *)skb_transport_header(ra);
1038 struct sk_buff *skb;
1039 struct nlmsghdr *nlh;
1040 struct nduseroptmsg *ndmsg;
1041 struct net *net = dev_net(ra->dev);
1042 int err;
1043 int base_size = NLMSG_ALIGN(sizeof(struct nduseroptmsg)
1044 + (opt->nd_opt_len << 3));
1045 size_t msg_size = base_size + nla_total_size(sizeof(struct in6_addr));
1047 skb = nlmsg_new(msg_size, GFP_ATOMIC);
1048 if (!skb) {
1049 err = -ENOBUFS;
1050 goto errout;
1053 nlh = nlmsg_put(skb, 0, 0, RTM_NEWNDUSEROPT, base_size, 0);
1054 if (!nlh) {
1055 goto nla_put_failure;
1058 ndmsg = nlmsg_data(nlh);
1059 ndmsg->nduseropt_family = AF_INET6;
1060 ndmsg->nduseropt_ifindex = ra->dev->ifindex;
1061 ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type;
1062 ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code;
1063 ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3;
1065 memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3);
1067 if (nla_put_in6_addr(skb, NDUSEROPT_SRCADDR, &ipv6_hdr(ra)->saddr))
1068 goto nla_put_failure;
1069 nlmsg_end(skb, nlh);
1071 rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC);
1072 return;
1074 nla_put_failure:
1075 nlmsg_free(skb);
1076 err = -EMSGSIZE;
1077 errout:
1078 rtnl_set_sk_err(net, RTNLGRP_ND_USEROPT, err);
1081 static void ndisc_router_discovery(struct sk_buff *skb)
1083 struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb);
1084 struct neighbour *neigh = NULL;
1085 struct inet6_dev *in6_dev;
1086 struct rt6_info *rt = NULL;
1087 int lifetime;
1088 struct ndisc_options ndopts;
1089 int optlen;
1090 unsigned int pref = 0;
1091 __u32 old_if_flags;
1092 bool send_ifinfo_notify = false;
1094 __u8 *opt = (__u8 *)(ra_msg + 1);
1096 optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) -
1097 sizeof(struct ra_msg);
1099 ND_PRINTK(2, info,
1100 "RA: %s, dev: %s\n",
1101 __func__, skb->dev->name);
1102 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1103 ND_PRINTK(2, warn, "RA: source address is not link-local\n");
1104 return;
1106 if (optlen < 0) {
1107 ND_PRINTK(2, warn, "RA: packet too short\n");
1108 return;
1111 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1112 if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) {
1113 ND_PRINTK(2, warn, "RA: from host or unauthorized router\n");
1114 return;
1116 #endif
1119 * set the RA_RECV flag in the interface
1122 in6_dev = __in6_dev_get(skb->dev);
1123 if (!in6_dev) {
1124 ND_PRINTK(0, err, "RA: can't find inet6 device for %s\n",
1125 skb->dev->name);
1126 return;
1129 if (!ndisc_parse_options(opt, optlen, &ndopts)) {
1130 ND_PRINTK(2, warn, "RA: invalid ND options\n");
1131 return;
1134 if (!ipv6_accept_ra(in6_dev)) {
1135 ND_PRINTK(2, info,
1136 "RA: %s, did not accept ra for dev: %s\n",
1137 __func__, skb->dev->name);
1138 goto skip_linkparms;
1141 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1142 /* skip link-specific parameters from interior routers */
1143 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) {
1144 ND_PRINTK(2, info,
1145 "RA: %s, nodetype is NODEFAULT, dev: %s\n",
1146 __func__, skb->dev->name);
1147 goto skip_linkparms;
1149 #endif
1151 if (in6_dev->if_flags & IF_RS_SENT) {
1153 * flag that an RA was received after an RS was sent
1154 * out on this interface.
1156 in6_dev->if_flags |= IF_RA_RCVD;
1160 * Remember the managed/otherconf flags from most recently
1161 * received RA message (RFC 2462) -- yoshfuji
1163 old_if_flags = in6_dev->if_flags;
1164 in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED |
1165 IF_RA_OTHERCONF)) |
1166 (ra_msg->icmph.icmp6_addrconf_managed ?
1167 IF_RA_MANAGED : 0) |
1168 (ra_msg->icmph.icmp6_addrconf_other ?
1169 IF_RA_OTHERCONF : 0);
1171 if (old_if_flags != in6_dev->if_flags)
1172 send_ifinfo_notify = true;
1174 if (!in6_dev->cnf.accept_ra_defrtr) {
1175 ND_PRINTK(2, info,
1176 "RA: %s, defrtr is false for dev: %s\n",
1177 __func__, skb->dev->name);
1178 goto skip_defrtr;
1181 /* Do not accept RA with source-addr found on local machine unless
1182 * accept_ra_from_local is set to true.
1184 if (!in6_dev->cnf.accept_ra_from_local &&
1185 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
1186 in6_dev->dev, 0)) {
1187 ND_PRINTK(2, info,
1188 "RA from local address detected on dev: %s: default router ignored\n",
1189 skb->dev->name);
1190 goto skip_defrtr;
1193 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
1195 #ifdef CONFIG_IPV6_ROUTER_PREF
1196 pref = ra_msg->icmph.icmp6_router_pref;
1197 /* 10b is handled as if it were 00b (medium) */
1198 if (pref == ICMPV6_ROUTER_PREF_INVALID ||
1199 !in6_dev->cnf.accept_ra_rtr_pref)
1200 pref = ICMPV6_ROUTER_PREF_MEDIUM;
1201 #endif
1203 rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
1205 if (rt) {
1206 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1207 if (!neigh) {
1208 ND_PRINTK(0, err,
1209 "RA: %s got default router without neighbour\n",
1210 __func__);
1211 ip6_rt_put(rt);
1212 return;
1215 if (rt && lifetime == 0) {
1216 ip6_del_rt(rt);
1217 rt = NULL;
1220 ND_PRINTK(3, info, "RA: rt: %p lifetime: %d, for dev: %s\n",
1221 rt, lifetime, skb->dev->name);
1222 if (!rt && lifetime) {
1223 ND_PRINTK(3, info, "RA: adding default router\n");
1225 rt = rt6_add_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev, pref);
1226 if (!rt) {
1227 ND_PRINTK(0, err,
1228 "RA: %s failed to add default route\n",
1229 __func__);
1230 return;
1233 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1234 if (!neigh) {
1235 ND_PRINTK(0, err,
1236 "RA: %s got default router without neighbour\n",
1237 __func__);
1238 ip6_rt_put(rt);
1239 return;
1241 neigh->flags |= NTF_ROUTER;
1242 } else if (rt) {
1243 rt->rt6i_flags = (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
1246 if (rt)
1247 rt6_set_expires(rt, jiffies + (HZ * lifetime));
1248 if (in6_dev->cnf.accept_ra_min_hop_limit < 256 &&
1249 ra_msg->icmph.icmp6_hop_limit) {
1250 if (in6_dev->cnf.accept_ra_min_hop_limit <= ra_msg->icmph.icmp6_hop_limit) {
1251 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
1252 if (rt)
1253 dst_metric_set(&rt->dst, RTAX_HOPLIMIT,
1254 ra_msg->icmph.icmp6_hop_limit);
1255 } else {
1256 ND_PRINTK(2, warn, "RA: Got route advertisement with lower hop_limit than minimum\n");
1260 skip_defrtr:
1263 * Update Reachable Time and Retrans Timer
1266 if (in6_dev->nd_parms) {
1267 unsigned long rtime = ntohl(ra_msg->retrans_timer);
1269 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/HZ) {
1270 rtime = (rtime*HZ)/1000;
1271 if (rtime < HZ/10)
1272 rtime = HZ/10;
1273 NEIGH_VAR_SET(in6_dev->nd_parms, RETRANS_TIME, rtime);
1274 in6_dev->tstamp = jiffies;
1275 send_ifinfo_notify = true;
1278 rtime = ntohl(ra_msg->reachable_time);
1279 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/(3*HZ)) {
1280 rtime = (rtime*HZ)/1000;
1282 if (rtime < HZ/10)
1283 rtime = HZ/10;
1285 if (rtime != NEIGH_VAR(in6_dev->nd_parms, BASE_REACHABLE_TIME)) {
1286 NEIGH_VAR_SET(in6_dev->nd_parms,
1287 BASE_REACHABLE_TIME, rtime);
1288 NEIGH_VAR_SET(in6_dev->nd_parms,
1289 GC_STALETIME, 3 * rtime);
1290 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime);
1291 in6_dev->tstamp = jiffies;
1292 send_ifinfo_notify = true;
1298 * Send a notify if RA changed managed/otherconf flags or timer settings
1300 if (send_ifinfo_notify)
1301 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1303 skip_linkparms:
1306 * Process options.
1309 if (!neigh)
1310 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr,
1311 skb->dev, 1);
1312 if (neigh) {
1313 u8 *lladdr = NULL;
1314 if (ndopts.nd_opts_src_lladdr) {
1315 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1316 skb->dev);
1317 if (!lladdr) {
1318 ND_PRINTK(2, warn,
1319 "RA: invalid link-layer address length\n");
1320 goto out;
1323 neigh_update(neigh, lladdr, NUD_STALE,
1324 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1325 NEIGH_UPDATE_F_OVERRIDE|
1326 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1327 NEIGH_UPDATE_F_ISROUTER);
1330 if (!ipv6_accept_ra(in6_dev)) {
1331 ND_PRINTK(2, info,
1332 "RA: %s, accept_ra is false for dev: %s\n",
1333 __func__, skb->dev->name);
1334 goto out;
1337 #ifdef CONFIG_IPV6_ROUTE_INFO
1338 if (!in6_dev->cnf.accept_ra_from_local &&
1339 ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
1340 in6_dev->dev, 0)) {
1341 ND_PRINTK(2, info,
1342 "RA from local address detected on dev: %s: router info ignored.\n",
1343 skb->dev->name);
1344 goto skip_routeinfo;
1347 if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
1348 struct nd_opt_hdr *p;
1349 for (p = ndopts.nd_opts_ri;
1351 p = ndisc_next_option(p, ndopts.nd_opts_ri_end)) {
1352 struct route_info *ri = (struct route_info *)p;
1353 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1354 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT &&
1355 ri->prefix_len == 0)
1356 continue;
1357 #endif
1358 if (ri->prefix_len == 0 &&
1359 !in6_dev->cnf.accept_ra_defrtr)
1360 continue;
1361 if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen)
1362 continue;
1363 rt6_route_rcv(skb->dev, (u8 *)p, (p->nd_opt_len) << 3,
1364 &ipv6_hdr(skb)->saddr);
1368 skip_routeinfo:
1369 #endif
1371 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1372 /* skip link-specific ndopts from interior routers */
1373 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) {
1374 ND_PRINTK(2, info,
1375 "RA: %s, nodetype is NODEFAULT (interior routes), dev: %s\n",
1376 __func__, skb->dev->name);
1377 goto out;
1379 #endif
1381 if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
1382 struct nd_opt_hdr *p;
1383 for (p = ndopts.nd_opts_pi;
1385 p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) {
1386 addrconf_prefix_rcv(skb->dev, (u8 *)p,
1387 (p->nd_opt_len) << 3,
1388 ndopts.nd_opts_src_lladdr != NULL);
1392 if (ndopts.nd_opts_mtu && in6_dev->cnf.accept_ra_mtu) {
1393 __be32 n;
1394 u32 mtu;
1396 memcpy(&n, ((u8 *)(ndopts.nd_opts_mtu+1))+2, sizeof(mtu));
1397 mtu = ntohl(n);
1399 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) {
1400 ND_PRINTK(2, warn, "RA: invalid mtu: %d\n", mtu);
1401 } else if (in6_dev->cnf.mtu6 != mtu) {
1402 in6_dev->cnf.mtu6 = mtu;
1404 if (rt)
1405 dst_metric_set(&rt->dst, RTAX_MTU, mtu);
1407 rt6_mtu_change(skb->dev, mtu);
1411 if (ndopts.nd_useropts) {
1412 struct nd_opt_hdr *p;
1413 for (p = ndopts.nd_useropts;
1415 p = ndisc_next_useropt(p, ndopts.nd_useropts_end)) {
1416 ndisc_ra_useropt(skb, p);
1420 if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
1421 ND_PRINTK(2, warn, "RA: invalid RA options\n");
1423 out:
1424 ip6_rt_put(rt);
1425 if (neigh)
1426 neigh_release(neigh);
1429 static void ndisc_redirect_rcv(struct sk_buff *skb)
1431 u8 *hdr;
1432 struct ndisc_options ndopts;
1433 struct rd_msg *msg = (struct rd_msg *)skb_transport_header(skb);
1434 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
1435 offsetof(struct rd_msg, opt));
1437 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1438 switch (skb->ndisc_nodetype) {
1439 case NDISC_NODETYPE_HOST:
1440 case NDISC_NODETYPE_NODEFAULT:
1441 ND_PRINTK(2, warn,
1442 "Redirect: from host or unauthorized router\n");
1443 return;
1445 #endif
1447 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1448 ND_PRINTK(2, warn,
1449 "Redirect: source address is not link-local\n");
1450 return;
1453 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts))
1454 return;
1456 if (!ndopts.nd_opts_rh) {
1457 ip6_redirect_no_header(skb, dev_net(skb->dev),
1458 skb->dev->ifindex, 0);
1459 return;
1462 hdr = (u8 *)ndopts.nd_opts_rh;
1463 hdr += 8;
1464 if (!pskb_pull(skb, hdr - skb_transport_header(skb)))
1465 return;
1467 icmpv6_notify(skb, NDISC_REDIRECT, 0, 0);
1470 static void ndisc_fill_redirect_hdr_option(struct sk_buff *skb,
1471 struct sk_buff *orig_skb,
1472 int rd_len)
1474 u8 *opt = skb_put(skb, rd_len);
1476 memset(opt, 0, 8);
1477 *(opt++) = ND_OPT_REDIRECT_HDR;
1478 *(opt++) = (rd_len >> 3);
1479 opt += 6;
1481 memcpy(opt, ipv6_hdr(orig_skb), rd_len - 8);
1484 void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
1486 struct net_device *dev = skb->dev;
1487 struct net *net = dev_net(dev);
1488 struct sock *sk = net->ipv6.ndisc_sk;
1489 int optlen = 0;
1490 struct inet_peer *peer;
1491 struct sk_buff *buff;
1492 struct rd_msg *msg;
1493 struct in6_addr saddr_buf;
1494 struct rt6_info *rt;
1495 struct dst_entry *dst;
1496 struct flowi6 fl6;
1497 int rd_len;
1498 u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
1499 int oif = l3mdev_fib_oif(dev);
1500 bool ret;
1502 if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) {
1503 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n",
1504 dev->name);
1505 return;
1508 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
1509 ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
1510 ND_PRINTK(2, warn,
1511 "Redirect: target address is not link-local unicast\n");
1512 return;
1515 icmpv6_flow_init(sk, &fl6, NDISC_REDIRECT,
1516 &saddr_buf, &ipv6_hdr(skb)->saddr, oif);
1518 if (oif != skb->dev->ifindex)
1519 fl6.flowi6_flags |= FLOWI_FLAG_L3MDEV_SRC;
1521 dst = ip6_route_output(net, NULL, &fl6);
1522 if (dst->error) {
1523 dst_release(dst);
1524 return;
1526 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), NULL, 0);
1527 if (IS_ERR(dst))
1528 return;
1530 rt = (struct rt6_info *) dst;
1532 if (rt->rt6i_flags & RTF_GATEWAY) {
1533 ND_PRINTK(2, warn,
1534 "Redirect: destination is not a neighbour\n");
1535 goto release;
1537 peer = inet_getpeer_v6(net->ipv6.peers, &ipv6_hdr(skb)->saddr, 1);
1538 ret = inet_peer_xrlim_allow(peer, 1*HZ);
1539 if (peer)
1540 inet_putpeer(peer);
1541 if (!ret)
1542 goto release;
1544 if (dev->addr_len) {
1545 struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target);
1546 if (!neigh) {
1547 ND_PRINTK(2, warn,
1548 "Redirect: no neigh for target address\n");
1549 goto release;
1552 read_lock_bh(&neigh->lock);
1553 if (neigh->nud_state & NUD_VALID) {
1554 memcpy(ha_buf, neigh->ha, dev->addr_len);
1555 read_unlock_bh(&neigh->lock);
1556 ha = ha_buf;
1557 optlen += ndisc_opt_addr_space(dev);
1558 } else
1559 read_unlock_bh(&neigh->lock);
1561 neigh_release(neigh);
1564 rd_len = min_t(unsigned int,
1565 IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(*msg) - optlen,
1566 skb->len + 8);
1567 rd_len &= ~0x7;
1568 optlen += rd_len;
1570 buff = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
1571 if (!buff)
1572 goto release;
1574 msg = (struct rd_msg *)skb_put(buff, sizeof(*msg));
1575 *msg = (struct rd_msg) {
1576 .icmph = {
1577 .icmp6_type = NDISC_REDIRECT,
1579 .target = *target,
1580 .dest = ipv6_hdr(skb)->daddr,
1584 * include target_address option
1587 if (ha)
1588 ndisc_fill_addr_option(buff, ND_OPT_TARGET_LL_ADDR, ha);
1591 * build redirect option and copy skb over to the new packet.
1594 if (rd_len)
1595 ndisc_fill_redirect_hdr_option(buff, skb, rd_len);
1597 skb_dst_set(buff, dst);
1598 ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf);
1599 return;
1601 release:
1602 dst_release(dst);
1605 static void pndisc_redo(struct sk_buff *skb)
1607 ndisc_recv_ns(skb);
1608 kfree_skb(skb);
1611 static bool ndisc_suppress_frag_ndisc(struct sk_buff *skb)
1613 struct inet6_dev *idev = __in6_dev_get(skb->dev);
1615 if (!idev)
1616 return true;
1617 if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED &&
1618 idev->cnf.suppress_frag_ndisc) {
1619 net_warn_ratelimited("Received fragmented ndisc packet. Carefully consider disabling suppress_frag_ndisc.\n");
1620 return true;
1622 return false;
1625 int ndisc_rcv(struct sk_buff *skb)
1627 struct nd_msg *msg;
1629 if (ndisc_suppress_frag_ndisc(skb))
1630 return 0;
1632 if (skb_linearize(skb))
1633 return 0;
1635 msg = (struct nd_msg *)skb_transport_header(skb);
1637 __skb_push(skb, skb->data - skb_transport_header(skb));
1639 if (ipv6_hdr(skb)->hop_limit != 255) {
1640 ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n",
1641 ipv6_hdr(skb)->hop_limit);
1642 return 0;
1645 if (msg->icmph.icmp6_code != 0) {
1646 ND_PRINTK(2, warn, "NDISC: invalid ICMPv6 code: %d\n",
1647 msg->icmph.icmp6_code);
1648 return 0;
1651 memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
1653 switch (msg->icmph.icmp6_type) {
1654 case NDISC_NEIGHBOUR_SOLICITATION:
1655 ndisc_recv_ns(skb);
1656 break;
1658 case NDISC_NEIGHBOUR_ADVERTISEMENT:
1659 ndisc_recv_na(skb);
1660 break;
1662 case NDISC_ROUTER_SOLICITATION:
1663 ndisc_recv_rs(skb);
1664 break;
1666 case NDISC_ROUTER_ADVERTISEMENT:
1667 ndisc_router_discovery(skb);
1668 break;
1670 case NDISC_REDIRECT:
1671 ndisc_redirect_rcv(skb);
1672 break;
1675 return 0;
1678 static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1680 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1681 struct netdev_notifier_change_info *change_info;
1682 struct net *net = dev_net(dev);
1683 struct inet6_dev *idev;
1685 switch (event) {
1686 case NETDEV_CHANGEADDR:
1687 neigh_changeaddr(&nd_tbl, dev);
1688 fib6_run_gc(0, net, false);
1689 idev = in6_dev_get(dev);
1690 if (!idev)
1691 break;
1692 if (idev->cnf.ndisc_notify)
1693 ndisc_send_unsol_na(dev);
1694 in6_dev_put(idev);
1695 break;
1696 case NETDEV_CHANGE:
1697 change_info = ptr;
1698 if (change_info->flags_changed & IFF_NOARP)
1699 neigh_changeaddr(&nd_tbl, dev);
1700 break;
1701 case NETDEV_DOWN:
1702 neigh_ifdown(&nd_tbl, dev);
1703 fib6_run_gc(0, net, false);
1704 break;
1705 case NETDEV_NOTIFY_PEERS:
1706 ndisc_send_unsol_na(dev);
1707 break;
1708 default:
1709 break;
1712 return NOTIFY_DONE;
1715 static struct notifier_block ndisc_netdev_notifier = {
1716 .notifier_call = ndisc_netdev_event,
1719 #ifdef CONFIG_SYSCTL
1720 static void ndisc_warn_deprecated_sysctl(struct ctl_table *ctl,
1721 const char *func, const char *dev_name)
1723 static char warncomm[TASK_COMM_LEN];
1724 static int warned;
1725 if (strcmp(warncomm, current->comm) && warned < 5) {
1726 strcpy(warncomm, current->comm);
1727 pr_warn("process `%s' is using deprecated sysctl (%s) net.ipv6.neigh.%s.%s - use net.ipv6.neigh.%s.%s_ms instead\n",
1728 warncomm, func,
1729 dev_name, ctl->procname,
1730 dev_name, ctl->procname);
1731 warned++;
1735 int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void __user *buffer, size_t *lenp, loff_t *ppos)
1737 struct net_device *dev = ctl->extra1;
1738 struct inet6_dev *idev;
1739 int ret;
1741 if ((strcmp(ctl->procname, "retrans_time") == 0) ||
1742 (strcmp(ctl->procname, "base_reachable_time") == 0))
1743 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default");
1745 if (strcmp(ctl->procname, "retrans_time") == 0)
1746 ret = neigh_proc_dointvec(ctl, write, buffer, lenp, ppos);
1748 else if (strcmp(ctl->procname, "base_reachable_time") == 0)
1749 ret = neigh_proc_dointvec_jiffies(ctl, write,
1750 buffer, lenp, ppos);
1752 else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) ||
1753 (strcmp(ctl->procname, "base_reachable_time_ms") == 0))
1754 ret = neigh_proc_dointvec_ms_jiffies(ctl, write,
1755 buffer, lenp, ppos);
1756 else
1757 ret = -1;
1759 if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) {
1760 if (ctl->data == &NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME))
1761 idev->nd_parms->reachable_time =
1762 neigh_rand_reach_time(NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME));
1763 idev->tstamp = jiffies;
1764 inet6_ifinfo_notify(RTM_NEWLINK, idev);
1765 in6_dev_put(idev);
1767 return ret;
1771 #endif
1773 static int __net_init ndisc_net_init(struct net *net)
1775 struct ipv6_pinfo *np;
1776 struct sock *sk;
1777 int err;
1779 err = inet_ctl_sock_create(&sk, PF_INET6,
1780 SOCK_RAW, IPPROTO_ICMPV6, net);
1781 if (err < 0) {
1782 ND_PRINTK(0, err,
1783 "NDISC: Failed to initialize the control socket (err %d)\n",
1784 err);
1785 return err;
1788 net->ipv6.ndisc_sk = sk;
1790 np = inet6_sk(sk);
1791 np->hop_limit = 255;
1792 /* Do not loopback ndisc messages */
1793 np->mc_loop = 0;
1795 return 0;
1798 static void __net_exit ndisc_net_exit(struct net *net)
1800 inet_ctl_sock_destroy(net->ipv6.ndisc_sk);
1803 static struct pernet_operations ndisc_net_ops = {
1804 .init = ndisc_net_init,
1805 .exit = ndisc_net_exit,
1808 int __init ndisc_init(void)
1810 int err;
1812 err = register_pernet_subsys(&ndisc_net_ops);
1813 if (err)
1814 return err;
1816 * Initialize the neighbour table
1818 neigh_table_init(NEIGH_ND_TABLE, &nd_tbl);
1820 #ifdef CONFIG_SYSCTL
1821 err = neigh_sysctl_register(NULL, &nd_tbl.parms,
1822 ndisc_ifinfo_sysctl_change);
1823 if (err)
1824 goto out_unregister_pernet;
1825 out:
1826 #endif
1827 return err;
1829 #ifdef CONFIG_SYSCTL
1830 out_unregister_pernet:
1831 unregister_pernet_subsys(&ndisc_net_ops);
1832 goto out;
1833 #endif
1836 int __init ndisc_late_init(void)
1838 return register_netdevice_notifier(&ndisc_netdev_notifier);
1841 void ndisc_late_cleanup(void)
1843 unregister_netdevice_notifier(&ndisc_netdev_notifier);
1846 void ndisc_cleanup(void)
1848 #ifdef CONFIG_SYSCTL
1849 neigh_sysctl_unregister(&nd_tbl.parms);
1850 #endif
1851 neigh_table_clear(NEIGH_ND_TABLE, &nd_tbl);
1852 unregister_pernet_subsys(&ndisc_net_ops);