2 * Neighbour Discovery for IPv6
3 * Linux INET6 implementation
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.
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
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>
45 #include <linux/sysctl.h>
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>
58 #include <net/protocol.h>
59 #include <net/ndisc.h>
60 #include <net/ip6_route.h>
61 #include <net/addrconf.h>
64 #include <net/netlink.h>
65 #include <linux/rtnetlink.h>
68 #include <net/ip6_checksum.h>
69 #include <net/inet_common.h>
70 #include <linux/proc_fs.h>
72 #include <linux/netfilter.h>
73 #include <linux/netfilter_ipv6.h>
75 /* Set to 3 to get tracing... */
78 #define ND_PRINTK(val, level, fmt, ...) \
80 if (val <= ND_DEBUG) \
81 net_##level##_ratelimited(fmt, ##__VA_ARGS__); \
84 static u32 ndisc_hash(const void *pkey,
85 const struct net_device *dev,
87 static int ndisc_constructor(struct neighbour *neigh);
88 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb);
89 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb);
90 static int pndisc_constructor(struct pneigh_entry *n);
91 static void pndisc_destructor(struct pneigh_entry *n);
92 static void pndisc_redo(struct sk_buff *skb);
94 static const struct neigh_ops ndisc_generic_ops = {
96 .solicit = ndisc_solicit,
97 .error_report = ndisc_error_report,
98 .output = neigh_resolve_output,
99 .connected_output = neigh_connected_output,
102 static const struct neigh_ops ndisc_hh_ops = {
104 .solicit = ndisc_solicit,
105 .error_report = ndisc_error_report,
106 .output = neigh_resolve_output,
107 .connected_output = neigh_resolve_output,
111 static const struct neigh_ops ndisc_direct_ops = {
113 .output = neigh_direct_output,
114 .connected_output = neigh_direct_output,
117 struct neigh_table nd_tbl = {
119 .key_len = sizeof(struct in6_addr),
121 .constructor = ndisc_constructor,
122 .pconstructor = pndisc_constructor,
123 .pdestructor = pndisc_destructor,
124 .proxy_redo = pndisc_redo,
128 .base_reachable_time = ND_REACHABLE_TIME,
129 .retrans_time = ND_RETRANS_TIMER,
130 .gc_staletime = 60 * HZ,
131 .reachable_time = ND_REACHABLE_TIME,
132 .delay_probe_time = 5 * HZ,
133 .queue_len_bytes = 64*1024,
136 .anycast_delay = 1 * HZ,
137 .proxy_delay = (8 * HZ) / 10,
140 .gc_interval = 30 * HZ,
146 static inline int ndisc_opt_addr_space(struct net_device *dev)
148 return NDISC_OPT_SPACE(dev->addr_len + ndisc_addr_option_pad(dev->type));
151 static u8 *ndisc_fill_addr_option(u8 *opt, int type, void *data, int data_len,
152 unsigned short addr_type)
154 int space = NDISC_OPT_SPACE(data_len);
155 int pad = ndisc_addr_option_pad(addr_type);
160 memset(opt + 2, 0, pad);
164 memcpy(opt+2, data, data_len);
167 if ((space -= data_len) > 0)
168 memset(opt, 0, space);
172 static struct nd_opt_hdr *ndisc_next_option(struct nd_opt_hdr *cur,
173 struct nd_opt_hdr *end)
176 if (!cur || !end || cur >= end)
178 type = cur->nd_opt_type;
180 cur = ((void *)cur) + (cur->nd_opt_len << 3);
181 } while(cur < end && cur->nd_opt_type != type);
182 return cur <= end && cur->nd_opt_type == type ? cur : NULL;
185 static inline int ndisc_is_useropt(struct nd_opt_hdr *opt)
187 return opt->nd_opt_type == ND_OPT_RDNSS ||
188 opt->nd_opt_type == ND_OPT_DNSSL;
191 static struct nd_opt_hdr *ndisc_next_useropt(struct nd_opt_hdr *cur,
192 struct nd_opt_hdr *end)
194 if (!cur || !end || cur >= end)
197 cur = ((void *)cur) + (cur->nd_opt_len << 3);
198 } while(cur < end && !ndisc_is_useropt(cur));
199 return cur <= end && ndisc_is_useropt(cur) ? cur : NULL;
202 struct ndisc_options *ndisc_parse_options(u8 *opt, int opt_len,
203 struct ndisc_options *ndopts)
205 struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)opt;
207 if (!nd_opt || opt_len < 0 || !ndopts)
209 memset(ndopts, 0, sizeof(*ndopts));
212 if (opt_len < sizeof(struct nd_opt_hdr))
214 l = nd_opt->nd_opt_len << 3;
215 if (opt_len < l || l == 0)
217 switch (nd_opt->nd_opt_type) {
218 case ND_OPT_SOURCE_LL_ADDR:
219 case ND_OPT_TARGET_LL_ADDR:
221 case ND_OPT_REDIRECT_HDR:
222 if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) {
224 "%s: duplicated ND6 option found: type=%d\n",
225 __func__, nd_opt->nd_opt_type);
227 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
230 case ND_OPT_PREFIX_INFO:
231 ndopts->nd_opts_pi_end = nd_opt;
232 if (!ndopts->nd_opt_array[nd_opt->nd_opt_type])
233 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
235 #ifdef CONFIG_IPV6_ROUTE_INFO
236 case ND_OPT_ROUTE_INFO:
237 ndopts->nd_opts_ri_end = nd_opt;
238 if (!ndopts->nd_opts_ri)
239 ndopts->nd_opts_ri = nd_opt;
243 if (ndisc_is_useropt(nd_opt)) {
244 ndopts->nd_useropts_end = nd_opt;
245 if (!ndopts->nd_useropts)
246 ndopts->nd_useropts = nd_opt;
249 * Unknown options must be silently ignored,
250 * to accommodate future extension to the
254 "%s: ignored unsupported option; type=%d, len=%d\n",
261 nd_opt = ((void *)nd_opt) + l;
266 int ndisc_mc_map(const struct in6_addr *addr, char *buf, struct net_device *dev, int dir)
270 case ARPHRD_IEEE802: /* Not sure. Check it later. --ANK */
272 ipv6_eth_mc_map(addr, buf);
275 ipv6_arcnet_mc_map(addr, buf);
277 case ARPHRD_INFINIBAND:
278 ipv6_ib_mc_map(addr, dev->broadcast, buf);
281 return ipv6_ipgre_mc_map(addr, dev->broadcast, buf);
284 memcpy(buf, dev->broadcast, dev->addr_len);
291 EXPORT_SYMBOL(ndisc_mc_map);
293 static u32 ndisc_hash(const void *pkey,
294 const struct net_device *dev,
297 return ndisc_hashfn(pkey, dev, hash_rnd);
300 static int ndisc_constructor(struct neighbour *neigh)
302 struct in6_addr *addr = (struct in6_addr*)&neigh->primary_key;
303 struct net_device *dev = neigh->dev;
304 struct inet6_dev *in6_dev;
305 struct neigh_parms *parms;
306 bool is_multicast = ipv6_addr_is_multicast(addr);
308 in6_dev = in6_dev_get(dev);
309 if (in6_dev == NULL) {
313 parms = in6_dev->nd_parms;
314 __neigh_parms_put(neigh->parms);
315 neigh->parms = neigh_parms_clone(parms);
317 neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST;
318 if (!dev->header_ops) {
319 neigh->nud_state = NUD_NOARP;
320 neigh->ops = &ndisc_direct_ops;
321 neigh->output = neigh_direct_output;
324 neigh->nud_state = NUD_NOARP;
325 ndisc_mc_map(addr, neigh->ha, dev, 1);
326 } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) {
327 neigh->nud_state = NUD_NOARP;
328 memcpy(neigh->ha, dev->dev_addr, dev->addr_len);
329 if (dev->flags&IFF_LOOPBACK)
330 neigh->type = RTN_LOCAL;
331 } else if (dev->flags&IFF_POINTOPOINT) {
332 neigh->nud_state = NUD_NOARP;
333 memcpy(neigh->ha, dev->broadcast, dev->addr_len);
335 if (dev->header_ops->cache)
336 neigh->ops = &ndisc_hh_ops;
338 neigh->ops = &ndisc_generic_ops;
339 if (neigh->nud_state&NUD_VALID)
340 neigh->output = neigh->ops->connected_output;
342 neigh->output = neigh->ops->output;
344 in6_dev_put(in6_dev);
348 static int pndisc_constructor(struct pneigh_entry *n)
350 struct in6_addr *addr = (struct in6_addr*)&n->key;
351 struct in6_addr maddr;
352 struct net_device *dev = n->dev;
354 if (dev == NULL || __in6_dev_get(dev) == NULL)
356 addrconf_addr_solict_mult(addr, &maddr);
357 ipv6_dev_mc_inc(dev, &maddr);
361 static void pndisc_destructor(struct pneigh_entry *n)
363 struct in6_addr *addr = (struct in6_addr*)&n->key;
364 struct in6_addr maddr;
365 struct net_device *dev = n->dev;
367 if (dev == NULL || __in6_dev_get(dev) == NULL)
369 addrconf_addr_solict_mult(addr, &maddr);
370 ipv6_dev_mc_dec(dev, &maddr);
373 struct sk_buff *ndisc_build_skb(struct net_device *dev,
374 const struct in6_addr *daddr,
375 const struct in6_addr *saddr,
376 struct icmp6hdr *icmp6h,
377 const struct in6_addr *target,
380 struct net *net = dev_net(dev);
381 struct sock *sk = net->ipv6.ndisc_sk;
383 struct icmp6hdr *hdr;
384 int hlen = LL_RESERVED_SPACE(dev);
385 int tlen = dev->needed_tailroom;
393 len = sizeof(struct icmp6hdr) + (target ? sizeof(*target) : 0);
395 len += ndisc_opt_addr_space(dev);
397 skb = sock_alloc_send_skb(sk,
398 (MAX_HEADER + sizeof(struct ipv6hdr) +
402 ND_PRINTK(0, err, "ND: %s failed to allocate an skb, err=%d\n",
407 skb_reserve(skb, hlen);
408 ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len);
410 skb->transport_header = skb->tail;
413 hdr = (struct icmp6hdr *)skb_transport_header(skb);
414 memcpy(hdr, icmp6h, sizeof(*hdr));
416 opt = skb_transport_header(skb) + sizeof(struct icmp6hdr);
418 *(struct in6_addr *)opt = *target;
419 opt += sizeof(*target);
423 ndisc_fill_addr_option(opt, llinfo, dev->dev_addr,
424 dev->addr_len, dev->type);
426 hdr->icmp6_cksum = csum_ipv6_magic(saddr, daddr, len,
434 EXPORT_SYMBOL(ndisc_build_skb);
436 void ndisc_send_skb(struct sk_buff *skb,
437 struct net_device *dev,
438 struct neighbour *neigh,
439 const struct in6_addr *daddr,
440 const struct in6_addr *saddr,
441 struct icmp6hdr *icmp6h)
444 struct dst_entry *dst;
445 struct net *net = dev_net(dev);
446 struct sock *sk = net->ipv6.ndisc_sk;
447 struct inet6_dev *idev;
451 type = icmp6h->icmp6_type;
453 icmpv6_flow_init(sk, &fl6, type, saddr, daddr, dev->ifindex);
454 dst = icmp6_dst_alloc(dev, neigh, &fl6);
460 skb_dst_set(skb, dst);
463 idev = __in6_dev_get(dst->dev);
464 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len);
466 err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, skb, NULL, dst->dev,
469 ICMP6MSGOUT_INC_STATS(net, idev, type);
470 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
476 EXPORT_SYMBOL(ndisc_send_skb);
479 * Send a Neighbour Discover packet
481 static void __ndisc_send(struct net_device *dev,
482 struct neighbour *neigh,
483 const struct in6_addr *daddr,
484 const struct in6_addr *saddr,
485 struct icmp6hdr *icmp6h, const struct in6_addr *target,
490 skb = ndisc_build_skb(dev, daddr, saddr, icmp6h, target, llinfo);
494 ndisc_send_skb(skb, dev, neigh, daddr, saddr, icmp6h);
497 static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
498 const struct in6_addr *daddr,
499 const struct in6_addr *solicited_addr,
500 int router, int solicited, int override, int inc_opt)
502 struct in6_addr tmpaddr;
503 struct inet6_ifaddr *ifp;
504 const struct in6_addr *src_addr;
505 struct icmp6hdr icmp6h = {
506 .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
509 /* for anycast or proxy, solicited_addr != src_addr */
510 ifp = ipv6_get_ifaddr(dev_net(dev), solicited_addr, dev, 1);
512 src_addr = solicited_addr;
513 if (ifp->flags & IFA_F_OPTIMISTIC)
515 inc_opt |= ifp->idev->cnf.force_tllao;
518 if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr,
519 inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs,
525 icmp6h.icmp6_router = router;
526 icmp6h.icmp6_solicited = solicited;
527 icmp6h.icmp6_override = override;
529 __ndisc_send(dev, neigh, daddr, src_addr,
530 &icmp6h, solicited_addr,
531 inc_opt ? ND_OPT_TARGET_LL_ADDR : 0);
534 static void ndisc_send_unsol_na(struct net_device *dev)
536 struct inet6_dev *idev;
537 struct inet6_ifaddr *ifa;
539 idev = in6_dev_get(dev);
543 read_lock_bh(&idev->lock);
544 list_for_each_entry(ifa, &idev->addr_list, if_list) {
545 ndisc_send_na(dev, NULL, &in6addr_linklocal_allnodes, &ifa->addr,
546 /*router=*/ !!idev->cnf.forwarding,
547 /*solicited=*/ false, /*override=*/ true,
550 read_unlock_bh(&idev->lock);
555 void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
556 const struct in6_addr *solicit,
557 const struct in6_addr *daddr, const struct in6_addr *saddr)
559 struct in6_addr addr_buf;
560 struct icmp6hdr icmp6h = {
561 .icmp6_type = NDISC_NEIGHBOUR_SOLICITATION,
565 if (ipv6_get_lladdr(dev, &addr_buf,
566 (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)))
571 __ndisc_send(dev, neigh, daddr, saddr,
573 !ipv6_addr_any(saddr) ? ND_OPT_SOURCE_LL_ADDR : 0);
576 void ndisc_send_rs(struct net_device *dev, const struct in6_addr *saddr,
577 const struct in6_addr *daddr)
579 struct icmp6hdr icmp6h = {
580 .icmp6_type = NDISC_ROUTER_SOLICITATION,
582 int send_sllao = dev->addr_len;
584 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
586 * According to section 2.2 of RFC 4429, we must not
587 * send router solicitations with a sllao from
588 * optimistic addresses, but we may send the solicitation
589 * if we don't include the sllao. So here we check
590 * if our address is optimistic, and if so, we
591 * suppress the inclusion of the sllao.
594 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(dev_net(dev), saddr,
597 if (ifp->flags & IFA_F_OPTIMISTIC) {
606 __ndisc_send(dev, NULL, daddr, saddr,
608 send_sllao ? ND_OPT_SOURCE_LL_ADDR : 0);
612 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb)
615 * "The sender MUST return an ICMP
616 * destination unreachable"
618 dst_link_failure(skb);
622 /* Called with locked neigh: either read or both */
624 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
626 struct in6_addr *saddr = NULL;
627 struct in6_addr mcaddr;
628 struct net_device *dev = neigh->dev;
629 struct in6_addr *target = (struct in6_addr *)&neigh->primary_key;
630 int probes = atomic_read(&neigh->probes);
632 if (skb && ipv6_chk_addr(dev_net(dev), &ipv6_hdr(skb)->saddr, dev, 1))
633 saddr = &ipv6_hdr(skb)->saddr;
635 if ((probes -= neigh->parms->ucast_probes) < 0) {
636 if (!(neigh->nud_state & NUD_VALID)) {
638 "%s: trying to ucast probe in NUD_INVALID: %pI6\n",
641 ndisc_send_ns(dev, neigh, target, target, saddr);
642 } else if ((probes -= neigh->parms->app_probes) < 0) {
647 addrconf_addr_solict_mult(target, &mcaddr);
648 ndisc_send_ns(dev, NULL, target, &mcaddr, saddr);
652 static int pndisc_is_router(const void *pkey,
653 struct net_device *dev)
655 struct pneigh_entry *n;
658 read_lock_bh(&nd_tbl.lock);
659 n = __pneigh_lookup(&nd_tbl, dev_net(dev), pkey, dev);
661 ret = !!(n->flags & NTF_ROUTER);
662 read_unlock_bh(&nd_tbl.lock);
667 static void ndisc_recv_ns(struct sk_buff *skb)
669 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
670 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
671 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
673 u32 ndoptlen = skb->tail - (skb->transport_header +
674 offsetof(struct nd_msg, opt));
675 struct ndisc_options ndopts;
676 struct net_device *dev = skb->dev;
677 struct inet6_ifaddr *ifp;
678 struct inet6_dev *idev = NULL;
679 struct neighbour *neigh;
680 int dad = ipv6_addr_any(saddr);
684 if (ipv6_addr_is_multicast(&msg->target)) {
685 ND_PRINTK(2, warn, "NS: multicast target address\n");
691 * DAD has to be destined for solicited node multicast address.
694 !(daddr->s6_addr32[0] == htonl(0xff020000) &&
695 daddr->s6_addr32[1] == htonl(0x00000000) &&
696 daddr->s6_addr32[2] == htonl(0x00000001) &&
697 daddr->s6_addr [12] == 0xff )) {
698 ND_PRINTK(2, warn, "NS: bad DAD packet (wrong destination)\n");
702 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
703 ND_PRINTK(2, warn, "NS: invalid ND options\n");
707 if (ndopts.nd_opts_src_lladdr) {
708 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev);
711 "NS: invalid link-layer address length\n");
716 * If the IP source address is the unspecified address,
717 * there MUST NOT be source link-layer address option
722 "NS: bad DAD packet (link-layer address option)\n");
727 inc = ipv6_addr_is_multicast(daddr);
729 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
732 if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) {
735 * We are colliding with another node
737 * so fail our DAD process
739 addrconf_dad_failure(ifp);
743 * This is not a dad solicitation.
744 * If we are an optimistic node,
746 * Otherwise, we should ignore it.
748 if (!(ifp->flags & IFA_F_OPTIMISTIC))
755 struct net *net = dev_net(dev);
757 idev = in6_dev_get(dev);
759 /* XXX: count this drop? */
763 if (ipv6_chk_acast_addr(net, dev, &msg->target) ||
764 (idev->cnf.forwarding &&
765 (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) &&
766 (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) {
767 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
768 skb->pkt_type != PACKET_HOST &&
770 idev->nd_parms->proxy_delay != 0) {
772 * for anycast or proxy,
773 * sender should delay its response
774 * by a random time between 0 and
775 * MAX_ANYCAST_DELAY_TIME seconds.
776 * (RFC2461) -- yoshfuji
778 struct sk_buff *n = skb_clone(skb, GFP_ATOMIC);
780 pneigh_enqueue(&nd_tbl, idev->nd_parms, n);
788 is_router = !!idev->cnf.forwarding;
791 ndisc_send_na(dev, NULL, &in6addr_linklocal_allnodes, &msg->target,
792 is_router, 0, (ifp != NULL), 1);
797 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_mcast);
799 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast);
802 * update / create cache entry
803 * for the source address
805 neigh = __neigh_lookup(&nd_tbl, saddr, dev,
806 !inc || lladdr || !dev->addr_len);
808 neigh_update(neigh, lladdr, NUD_STALE,
809 NEIGH_UPDATE_F_WEAK_OVERRIDE|
810 NEIGH_UPDATE_F_OVERRIDE);
811 if (neigh || !dev->header_ops) {
812 ndisc_send_na(dev, neigh, saddr, &msg->target,
814 1, (ifp != NULL && inc), inc);
816 neigh_release(neigh);
826 static void ndisc_recv_na(struct sk_buff *skb)
828 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
829 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
830 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
832 u32 ndoptlen = skb->tail - (skb->transport_header +
833 offsetof(struct nd_msg, opt));
834 struct ndisc_options ndopts;
835 struct net_device *dev = skb->dev;
836 struct inet6_ifaddr *ifp;
837 struct neighbour *neigh;
839 if (skb->len < sizeof(struct nd_msg)) {
840 ND_PRINTK(2, warn, "NA: packet too short\n");
844 if (ipv6_addr_is_multicast(&msg->target)) {
845 ND_PRINTK(2, warn, "NA: target address is multicast\n");
849 if (ipv6_addr_is_multicast(daddr) &&
850 msg->icmph.icmp6_solicited) {
851 ND_PRINTK(2, warn, "NA: solicited NA is multicasted\n");
855 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
856 ND_PRINTK(2, warn, "NS: invalid ND option\n");
859 if (ndopts.nd_opts_tgt_lladdr) {
860 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev);
863 "NA: invalid link-layer address length\n");
867 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
869 if (skb->pkt_type != PACKET_LOOPBACK
870 && (ifp->flags & IFA_F_TENTATIVE)) {
871 addrconf_dad_failure(ifp);
874 /* What should we make now? The advertisement
875 is invalid, but ndisc specs say nothing
876 about it. It could be misconfiguration, or
877 an smart proxy agent tries to help us :-)
879 We should not print the error if NA has been
880 received from loopback - it is just our own
881 unsolicited advertisement.
883 if (skb->pkt_type != PACKET_LOOPBACK)
885 "NA: someone advertises our address %pI6 on %s!\n",
886 &ifp->addr, ifp->idev->dev->name);
890 neigh = neigh_lookup(&nd_tbl, &msg->target, dev);
893 u8 old_flags = neigh->flags;
894 struct net *net = dev_net(dev);
896 if (neigh->nud_state & NUD_FAILED)
900 * Don't update the neighbor cache entry on a proxy NA from
901 * ourselves because either the proxied node is off link or it
902 * has already sent a NA to us.
904 if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) &&
905 net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp &&
906 pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) {
907 /* XXX: idev->cnf.proxy_ndp */
911 neigh_update(neigh, lladdr,
912 msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE,
913 NEIGH_UPDATE_F_WEAK_OVERRIDE|
914 (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)|
915 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
916 (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0));
918 if ((old_flags & ~neigh->flags) & NTF_ROUTER) {
920 * Change: router to host
923 rt = rt6_get_dflt_router(saddr, dev);
929 neigh_release(neigh);
933 static void ndisc_recv_rs(struct sk_buff *skb)
935 struct rs_msg *rs_msg = (struct rs_msg *)skb_transport_header(skb);
936 unsigned long ndoptlen = skb->len - sizeof(*rs_msg);
937 struct neighbour *neigh;
938 struct inet6_dev *idev;
939 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
940 struct ndisc_options ndopts;
943 if (skb->len < sizeof(*rs_msg))
946 idev = __in6_dev_get(skb->dev);
948 ND_PRINTK(1, err, "RS: can't find in6 device\n");
952 /* Don't accept RS if we're not in router mode */
953 if (!idev->cnf.forwarding)
957 * Don't update NCE if src = ::;
958 * this implies that the source node has no ip address assigned yet.
960 if (ipv6_addr_any(saddr))
963 /* Parse ND options */
964 if (!ndisc_parse_options(rs_msg->opt, ndoptlen, &ndopts)) {
965 ND_PRINTK(2, notice, "NS: invalid ND option, ignored\n");
969 if (ndopts.nd_opts_src_lladdr) {
970 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
976 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1);
978 neigh_update(neigh, lladdr, NUD_STALE,
979 NEIGH_UPDATE_F_WEAK_OVERRIDE|
980 NEIGH_UPDATE_F_OVERRIDE|
981 NEIGH_UPDATE_F_OVERRIDE_ISROUTER);
982 neigh_release(neigh);
988 static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt)
990 struct icmp6hdr *icmp6h = (struct icmp6hdr *)skb_transport_header(ra);
992 struct nlmsghdr *nlh;
993 struct nduseroptmsg *ndmsg;
994 struct net *net = dev_net(ra->dev);
996 int base_size = NLMSG_ALIGN(sizeof(struct nduseroptmsg)
997 + (opt->nd_opt_len << 3));
998 size_t msg_size = base_size + nla_total_size(sizeof(struct in6_addr));
1000 skb = nlmsg_new(msg_size, GFP_ATOMIC);
1006 nlh = nlmsg_put(skb, 0, 0, RTM_NEWNDUSEROPT, base_size, 0);
1008 goto nla_put_failure;
1011 ndmsg = nlmsg_data(nlh);
1012 ndmsg->nduseropt_family = AF_INET6;
1013 ndmsg->nduseropt_ifindex = ra->dev->ifindex;
1014 ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type;
1015 ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code;
1016 ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3;
1018 memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3);
1020 if (nla_put(skb, NDUSEROPT_SRCADDR, sizeof(struct in6_addr),
1021 &ipv6_hdr(ra)->saddr))
1022 goto nla_put_failure;
1023 nlmsg_end(skb, nlh);
1025 rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC);
1032 rtnl_set_sk_err(net, RTNLGRP_ND_USEROPT, err);
1035 static inline int accept_ra(struct inet6_dev *in6_dev)
1038 * If forwarding is enabled, RA are not accepted unless the special
1039 * hybrid mode (accept_ra=2) is enabled.
1041 if (in6_dev->cnf.forwarding && in6_dev->cnf.accept_ra < 2)
1044 return in6_dev->cnf.accept_ra;
1047 static void ndisc_router_discovery(struct sk_buff *skb)
1049 struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb);
1050 struct neighbour *neigh = NULL;
1051 struct inet6_dev *in6_dev;
1052 struct rt6_info *rt = NULL;
1054 struct ndisc_options ndopts;
1056 unsigned int pref = 0;
1058 __u8 * opt = (__u8 *)(ra_msg + 1);
1060 optlen = (skb->tail - skb->transport_header) - sizeof(struct ra_msg);
1062 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1063 ND_PRINTK(2, warn, "RA: source address is not link-local\n");
1067 ND_PRINTK(2, warn, "RA: packet too short\n");
1071 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1072 if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) {
1073 ND_PRINTK(2, warn, "RA: from host or unauthorized router\n");
1079 * set the RA_RECV flag in the interface
1082 in6_dev = __in6_dev_get(skb->dev);
1083 if (in6_dev == NULL) {
1084 ND_PRINTK(0, err, "RA: can't find inet6 device for %s\n",
1089 if (!ndisc_parse_options(opt, optlen, &ndopts)) {
1090 ND_PRINTK(2, warn, "RA: invalid ND options\n");
1094 if (!accept_ra(in6_dev))
1095 goto skip_linkparms;
1097 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1098 /* skip link-specific parameters from interior routers */
1099 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT)
1100 goto skip_linkparms;
1103 if (in6_dev->if_flags & IF_RS_SENT) {
1105 * flag that an RA was received after an RS was sent
1106 * out on this interface.
1108 in6_dev->if_flags |= IF_RA_RCVD;
1112 * Remember the managed/otherconf flags from most recently
1113 * received RA message (RFC 2462) -- yoshfuji
1115 in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED |
1117 (ra_msg->icmph.icmp6_addrconf_managed ?
1118 IF_RA_MANAGED : 0) |
1119 (ra_msg->icmph.icmp6_addrconf_other ?
1120 IF_RA_OTHERCONF : 0);
1122 if (!in6_dev->cnf.accept_ra_defrtr)
1125 if (ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, NULL, 0))
1128 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
1130 #ifdef CONFIG_IPV6_ROUTER_PREF
1131 pref = ra_msg->icmph.icmp6_router_pref;
1132 /* 10b is handled as if it were 00b (medium) */
1133 if (pref == ICMPV6_ROUTER_PREF_INVALID ||
1134 !in6_dev->cnf.accept_ra_rtr_pref)
1135 pref = ICMPV6_ROUTER_PREF_MEDIUM;
1138 rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
1141 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1144 "RA: %s got default router without neighbour\n",
1150 if (rt && lifetime == 0) {
1155 if (rt == NULL && lifetime) {
1156 ND_PRINTK(3, dbg, "RA: adding default router\n");
1158 rt = rt6_add_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev, pref);
1161 "RA: %s failed to add default route\n",
1166 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1167 if (neigh == NULL) {
1169 "RA: %s got default router without neighbour\n",
1174 neigh->flags |= NTF_ROUTER;
1176 rt->rt6i_flags = (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
1180 rt6_set_expires(rt, jiffies + (HZ * lifetime));
1181 if (ra_msg->icmph.icmp6_hop_limit) {
1182 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
1184 dst_metric_set(&rt->dst, RTAX_HOPLIMIT,
1185 ra_msg->icmph.icmp6_hop_limit);
1191 * Update Reachable Time and Retrans Timer
1194 if (in6_dev->nd_parms) {
1195 unsigned long rtime = ntohl(ra_msg->retrans_timer);
1197 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/HZ) {
1198 rtime = (rtime*HZ)/1000;
1201 in6_dev->nd_parms->retrans_time = rtime;
1202 in6_dev->tstamp = jiffies;
1203 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1206 rtime = ntohl(ra_msg->reachable_time);
1207 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/(3*HZ)) {
1208 rtime = (rtime*HZ)/1000;
1213 if (rtime != in6_dev->nd_parms->base_reachable_time) {
1214 in6_dev->nd_parms->base_reachable_time = rtime;
1215 in6_dev->nd_parms->gc_staletime = 3 * rtime;
1216 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime);
1217 in6_dev->tstamp = jiffies;
1218 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1230 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr,
1234 if (ndopts.nd_opts_src_lladdr) {
1235 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1239 "RA: invalid link-layer address length\n");
1243 neigh_update(neigh, lladdr, NUD_STALE,
1244 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1245 NEIGH_UPDATE_F_OVERRIDE|
1246 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1247 NEIGH_UPDATE_F_ISROUTER);
1250 if (!accept_ra(in6_dev))
1253 #ifdef CONFIG_IPV6_ROUTE_INFO
1254 if (ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, NULL, 0))
1255 goto skip_routeinfo;
1257 if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
1258 struct nd_opt_hdr *p;
1259 for (p = ndopts.nd_opts_ri;
1261 p = ndisc_next_option(p, ndopts.nd_opts_ri_end)) {
1262 struct route_info *ri = (struct route_info *)p;
1263 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1264 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT &&
1265 ri->prefix_len == 0)
1268 if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen)
1270 rt6_route_rcv(skb->dev, (u8*)p, (p->nd_opt_len) << 3,
1271 &ipv6_hdr(skb)->saddr);
1278 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1279 /* skip link-specific ndopts from interior routers */
1280 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT)
1284 if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
1285 struct nd_opt_hdr *p;
1286 for (p = ndopts.nd_opts_pi;
1288 p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) {
1289 addrconf_prefix_rcv(skb->dev, (u8 *)p,
1290 (p->nd_opt_len) << 3,
1291 ndopts.nd_opts_src_lladdr != NULL);
1295 if (ndopts.nd_opts_mtu) {
1299 memcpy(&n, ((u8*)(ndopts.nd_opts_mtu+1))+2, sizeof(mtu));
1302 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) {
1303 ND_PRINTK(2, warn, "RA: invalid mtu: %d\n", mtu);
1304 } else if (in6_dev->cnf.mtu6 != mtu) {
1305 in6_dev->cnf.mtu6 = mtu;
1308 dst_metric_set(&rt->dst, RTAX_MTU, mtu);
1310 rt6_mtu_change(skb->dev, mtu);
1314 if (ndopts.nd_useropts) {
1315 struct nd_opt_hdr *p;
1316 for (p = ndopts.nd_useropts;
1318 p = ndisc_next_useropt(p, ndopts.nd_useropts_end)) {
1319 ndisc_ra_useropt(skb, p);
1323 if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
1324 ND_PRINTK(2, warn, "RA: invalid RA options\n");
1329 neigh_release(neigh);
1332 static void ndisc_redirect_rcv(struct sk_buff *skb)
1334 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1335 switch (skb->ndisc_nodetype) {
1336 case NDISC_NODETYPE_HOST:
1337 case NDISC_NODETYPE_NODEFAULT:
1339 "Redirect: from host or unauthorized router\n");
1344 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1346 "Redirect: source address is not link-local\n");
1350 icmpv6_notify(skb, NDISC_REDIRECT, 0, 0);
1353 void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
1355 struct net_device *dev = skb->dev;
1356 struct net *net = dev_net(dev);
1357 struct sock *sk = net->ipv6.ndisc_sk;
1358 int len = sizeof(struct icmp6hdr) + 2 * sizeof(struct in6_addr);
1359 struct inet_peer *peer;
1360 struct sk_buff *buff;
1361 struct icmp6hdr *icmph;
1362 struct in6_addr saddr_buf;
1363 struct in6_addr *addrp;
1364 struct rt6_info *rt;
1365 struct dst_entry *dst;
1366 struct inet6_dev *idev;
1372 u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
1375 if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) {
1376 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n",
1381 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
1382 ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
1384 "Redirect: target address is not link-local unicast\n");
1388 icmpv6_flow_init(sk, &fl6, NDISC_REDIRECT,
1389 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex);
1391 dst = ip6_route_output(net, NULL, &fl6);
1396 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), NULL, 0);
1400 rt = (struct rt6_info *) dst;
1402 if (rt->rt6i_flags & RTF_GATEWAY) {
1404 "Redirect: destination is not a neighbour\n");
1407 peer = inet_getpeer_v6(net->ipv6.peers, &rt->rt6i_dst.addr, 1);
1408 ret = inet_peer_xrlim_allow(peer, 1*HZ);
1414 if (dev->addr_len) {
1415 struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target);
1418 "Redirect: no neigh for target address\n");
1422 read_lock_bh(&neigh->lock);
1423 if (neigh->nud_state & NUD_VALID) {
1424 memcpy(ha_buf, neigh->ha, dev->addr_len);
1425 read_unlock_bh(&neigh->lock);
1427 len += ndisc_opt_addr_space(dev);
1429 read_unlock_bh(&neigh->lock);
1431 neigh_release(neigh);
1434 rd_len = min_t(unsigned int,
1435 IPV6_MIN_MTU-sizeof(struct ipv6hdr)-len, skb->len + 8);
1439 hlen = LL_RESERVED_SPACE(dev);
1440 tlen = dev->needed_tailroom;
1441 buff = sock_alloc_send_skb(sk,
1442 (MAX_HEADER + sizeof(struct ipv6hdr) +
1447 "Redirect: %s failed to allocate an skb, err=%d\n",
1452 skb_reserve(buff, hlen);
1453 ip6_nd_hdr(sk, buff, dev, &saddr_buf, &ipv6_hdr(skb)->saddr,
1454 IPPROTO_ICMPV6, len);
1456 skb_set_transport_header(buff, skb_tail_pointer(buff) - buff->data);
1458 icmph = icmp6_hdr(buff);
1460 memset(icmph, 0, sizeof(struct icmp6hdr));
1461 icmph->icmp6_type = NDISC_REDIRECT;
1464 * copy target and destination addresses
1467 addrp = (struct in6_addr *)(icmph + 1);
1470 *addrp = ipv6_hdr(skb)->daddr;
1472 opt = (u8*) (addrp + 1);
1475 * include target_address option
1479 opt = ndisc_fill_addr_option(opt, ND_OPT_TARGET_LL_ADDR, ha,
1480 dev->addr_len, dev->type);
1483 * build redirect option and copy skb over to the new packet.
1487 *(opt++) = ND_OPT_REDIRECT_HDR;
1488 *(opt++) = (rd_len >> 3);
1491 memcpy(opt, ipv6_hdr(skb), rd_len - 8);
1493 icmph->icmp6_cksum = csum_ipv6_magic(&saddr_buf, &ipv6_hdr(skb)->saddr,
1494 len, IPPROTO_ICMPV6,
1495 csum_partial(icmph, len, 0));
1497 skb_dst_set(buff, dst);
1499 idev = __in6_dev_get(dst->dev);
1500 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len);
1501 err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, buff, NULL, dst->dev,
1504 ICMP6MSGOUT_INC_STATS(net, idev, NDISC_REDIRECT);
1505 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
1515 static void pndisc_redo(struct sk_buff *skb)
1521 int ndisc_rcv(struct sk_buff *skb)
1525 if (!pskb_may_pull(skb, skb->len))
1528 msg = (struct nd_msg *)skb_transport_header(skb);
1530 __skb_push(skb, skb->data - skb_transport_header(skb));
1532 if (ipv6_hdr(skb)->hop_limit != 255) {
1533 ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n",
1534 ipv6_hdr(skb)->hop_limit);
1538 if (msg->icmph.icmp6_code != 0) {
1539 ND_PRINTK(2, warn, "NDISC: invalid ICMPv6 code: %d\n",
1540 msg->icmph.icmp6_code);
1544 memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
1546 switch (msg->icmph.icmp6_type) {
1547 case NDISC_NEIGHBOUR_SOLICITATION:
1551 case NDISC_NEIGHBOUR_ADVERTISEMENT:
1555 case NDISC_ROUTER_SOLICITATION:
1559 case NDISC_ROUTER_ADVERTISEMENT:
1560 ndisc_router_discovery(skb);
1563 case NDISC_REDIRECT:
1564 ndisc_redirect_rcv(skb);
1571 static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1573 struct net_device *dev = ptr;
1574 struct net *net = dev_net(dev);
1575 struct inet6_dev *idev;
1578 case NETDEV_CHANGEADDR:
1579 neigh_changeaddr(&nd_tbl, dev);
1580 fib6_run_gc(~0UL, net);
1581 idev = in6_dev_get(dev);
1584 if (idev->cnf.ndisc_notify)
1585 ndisc_send_unsol_na(dev);
1589 neigh_ifdown(&nd_tbl, dev);
1590 fib6_run_gc(~0UL, net);
1592 case NETDEV_NOTIFY_PEERS:
1593 ndisc_send_unsol_na(dev);
1602 static struct notifier_block ndisc_netdev_notifier = {
1603 .notifier_call = ndisc_netdev_event,
1606 #ifdef CONFIG_SYSCTL
1607 static void ndisc_warn_deprecated_sysctl(struct ctl_table *ctl,
1608 const char *func, const char *dev_name)
1610 static char warncomm[TASK_COMM_LEN];
1612 if (strcmp(warncomm, current->comm) && warned < 5) {
1613 strcpy(warncomm, current->comm);
1614 pr_warn("process `%s' is using deprecated sysctl (%s) net.ipv6.neigh.%s.%s - use net.ipv6.neigh.%s.%s_ms instead\n",
1616 dev_name, ctl->procname,
1617 dev_name, ctl->procname);
1622 int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void __user *buffer, size_t *lenp, loff_t *ppos)
1624 struct net_device *dev = ctl->extra1;
1625 struct inet6_dev *idev;
1628 if ((strcmp(ctl->procname, "retrans_time") == 0) ||
1629 (strcmp(ctl->procname, "base_reachable_time") == 0))
1630 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default");
1632 if (strcmp(ctl->procname, "retrans_time") == 0)
1633 ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
1635 else if (strcmp(ctl->procname, "base_reachable_time") == 0)
1636 ret = proc_dointvec_jiffies(ctl, write,
1637 buffer, lenp, ppos);
1639 else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) ||
1640 (strcmp(ctl->procname, "base_reachable_time_ms") == 0))
1641 ret = proc_dointvec_ms_jiffies(ctl, write,
1642 buffer, lenp, ppos);
1646 if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) {
1647 if (ctl->data == &idev->nd_parms->base_reachable_time)
1648 idev->nd_parms->reachable_time = neigh_rand_reach_time(idev->nd_parms->base_reachable_time);
1649 idev->tstamp = jiffies;
1650 inet6_ifinfo_notify(RTM_NEWLINK, idev);
1659 static int __net_init ndisc_net_init(struct net *net)
1661 struct ipv6_pinfo *np;
1665 err = inet_ctl_sock_create(&sk, PF_INET6,
1666 SOCK_RAW, IPPROTO_ICMPV6, net);
1669 "NDISC: Failed to initialize the control socket (err %d)\n",
1674 net->ipv6.ndisc_sk = sk;
1677 np->hop_limit = 255;
1678 /* Do not loopback ndisc messages */
1684 static void __net_exit ndisc_net_exit(struct net *net)
1686 inet_ctl_sock_destroy(net->ipv6.ndisc_sk);
1689 static struct pernet_operations ndisc_net_ops = {
1690 .init = ndisc_net_init,
1691 .exit = ndisc_net_exit,
1694 int __init ndisc_init(void)
1698 err = register_pernet_subsys(&ndisc_net_ops);
1702 * Initialize the neighbour table
1704 neigh_table_init(&nd_tbl);
1706 #ifdef CONFIG_SYSCTL
1707 err = neigh_sysctl_register(NULL, &nd_tbl.parms, "ipv6",
1708 &ndisc_ifinfo_sysctl_change);
1710 goto out_unregister_pernet;
1712 err = register_netdevice_notifier(&ndisc_netdev_notifier);
1714 goto out_unregister_sysctl;
1718 out_unregister_sysctl:
1719 #ifdef CONFIG_SYSCTL
1720 neigh_sysctl_unregister(&nd_tbl.parms);
1721 out_unregister_pernet:
1723 unregister_pernet_subsys(&ndisc_net_ops);
1727 void ndisc_cleanup(void)
1729 unregister_netdevice_notifier(&ndisc_netdev_notifier);
1730 #ifdef CONFIG_SYSCTL
1731 neigh_sysctl_unregister(&nd_tbl.parms);
1733 neigh_table_clear(&nd_tbl);
1734 unregister_pernet_subsys(&ndisc_net_ops);