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 pad = ndisc_addr_option_pad(addr_type);
155 int space = NDISC_OPT_SPACE(data_len + pad);
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 static struct sk_buff *ndisc_build_skb(struct net_device *dev,
374 const struct in6_addr *daddr,
375 const struct in6_addr *saddr,
376 struct icmp6hdr *icmp6h,
377 const struct in6_addr *target,
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 (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 static void ndisc_send_skb(struct sk_buff *skb, struct net_device *dev,
435 const struct in6_addr *daddr,
436 const struct in6_addr *saddr,
437 struct icmp6hdr *icmp6h)
440 struct dst_entry *dst;
441 struct net *net = dev_net(dev);
442 struct sock *sk = net->ipv6.ndisc_sk;
443 struct inet6_dev *idev;
447 type = icmp6h->icmp6_type;
449 icmpv6_flow_init(sk, &fl6, type, saddr, daddr, dev->ifindex);
450 dst = icmp6_dst_alloc(dev, &fl6);
456 skb_dst_set(skb, dst);
459 idev = __in6_dev_get(dst->dev);
460 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len);
462 err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, skb, NULL, dst->dev,
465 ICMP6MSGOUT_INC_STATS(net, idev, type);
466 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
473 * Send a Neighbour Discover packet
475 static void __ndisc_send(struct net_device *dev,
476 const struct in6_addr *daddr,
477 const struct in6_addr *saddr,
478 struct icmp6hdr *icmp6h, const struct in6_addr *target,
483 skb = ndisc_build_skb(dev, daddr, saddr, icmp6h, target, llinfo);
487 ndisc_send_skb(skb, dev, daddr, saddr, icmp6h);
490 static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
491 const struct in6_addr *daddr,
492 const struct in6_addr *solicited_addr,
493 int router, int solicited, int override, int inc_opt)
495 struct in6_addr tmpaddr;
496 struct inet6_ifaddr *ifp;
497 const struct in6_addr *src_addr;
498 struct icmp6hdr icmp6h = {
499 .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
502 /* for anycast or proxy, solicited_addr != src_addr */
503 ifp = ipv6_get_ifaddr(dev_net(dev), solicited_addr, dev, 1);
505 src_addr = solicited_addr;
506 if (ifp->flags & IFA_F_OPTIMISTIC)
508 inc_opt |= ifp->idev->cnf.force_tllao;
511 if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr,
512 inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs,
518 icmp6h.icmp6_router = router;
519 icmp6h.icmp6_solicited = solicited;
520 icmp6h.icmp6_override = override;
522 __ndisc_send(dev, daddr, src_addr, &icmp6h, solicited_addr,
523 inc_opt ? ND_OPT_TARGET_LL_ADDR : 0);
526 static void ndisc_send_unsol_na(struct net_device *dev)
528 struct inet6_dev *idev;
529 struct inet6_ifaddr *ifa;
531 idev = in6_dev_get(dev);
535 read_lock_bh(&idev->lock);
536 list_for_each_entry(ifa, &idev->addr_list, if_list) {
537 ndisc_send_na(dev, NULL, &in6addr_linklocal_allnodes, &ifa->addr,
538 /*router=*/ !!idev->cnf.forwarding,
539 /*solicited=*/ false, /*override=*/ true,
542 read_unlock_bh(&idev->lock);
547 void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
548 const struct in6_addr *solicit,
549 const struct in6_addr *daddr, const struct in6_addr *saddr)
551 struct in6_addr addr_buf;
552 struct icmp6hdr icmp6h = {
553 .icmp6_type = NDISC_NEIGHBOUR_SOLICITATION,
557 if (ipv6_get_lladdr(dev, &addr_buf,
558 (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)))
563 __ndisc_send(dev, daddr, saddr, &icmp6h, solicit,
564 !ipv6_addr_any(saddr) ? ND_OPT_SOURCE_LL_ADDR : 0);
567 void ndisc_send_rs(struct net_device *dev, const struct in6_addr *saddr,
568 const struct in6_addr *daddr)
570 struct icmp6hdr icmp6h = {
571 .icmp6_type = NDISC_ROUTER_SOLICITATION,
573 int send_sllao = dev->addr_len;
575 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
577 * According to section 2.2 of RFC 4429, we must not
578 * send router solicitations with a sllao from
579 * optimistic addresses, but we may send the solicitation
580 * if we don't include the sllao. So here we check
581 * if our address is optimistic, and if so, we
582 * suppress the inclusion of the sllao.
585 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(dev_net(dev), saddr,
588 if (ifp->flags & IFA_F_OPTIMISTIC) {
597 __ndisc_send(dev, daddr, saddr, &icmp6h, NULL,
598 send_sllao ? ND_OPT_SOURCE_LL_ADDR : 0);
602 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb)
605 * "The sender MUST return an ICMP
606 * destination unreachable"
608 dst_link_failure(skb);
612 /* Called with locked neigh: either read or both */
614 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
616 struct in6_addr *saddr = NULL;
617 struct in6_addr mcaddr;
618 struct net_device *dev = neigh->dev;
619 struct in6_addr *target = (struct in6_addr *)&neigh->primary_key;
620 int probes = atomic_read(&neigh->probes);
622 if (skb && ipv6_chk_addr(dev_net(dev), &ipv6_hdr(skb)->saddr, dev, 1))
623 saddr = &ipv6_hdr(skb)->saddr;
625 if ((probes -= neigh->parms->ucast_probes) < 0) {
626 if (!(neigh->nud_state & NUD_VALID)) {
628 "%s: trying to ucast probe in NUD_INVALID: %pI6\n",
631 ndisc_send_ns(dev, neigh, target, target, saddr);
632 } else if ((probes -= neigh->parms->app_probes) < 0) {
637 addrconf_addr_solict_mult(target, &mcaddr);
638 ndisc_send_ns(dev, NULL, target, &mcaddr, saddr);
642 static int pndisc_is_router(const void *pkey,
643 struct net_device *dev)
645 struct pneigh_entry *n;
648 read_lock_bh(&nd_tbl.lock);
649 n = __pneigh_lookup(&nd_tbl, dev_net(dev), pkey, dev);
651 ret = !!(n->flags & NTF_ROUTER);
652 read_unlock_bh(&nd_tbl.lock);
657 static void ndisc_recv_ns(struct sk_buff *skb)
659 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
660 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
661 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
663 u32 ndoptlen = skb->tail - (skb->transport_header +
664 offsetof(struct nd_msg, opt));
665 struct ndisc_options ndopts;
666 struct net_device *dev = skb->dev;
667 struct inet6_ifaddr *ifp;
668 struct inet6_dev *idev = NULL;
669 struct neighbour *neigh;
670 int dad = ipv6_addr_any(saddr);
674 if (skb->len < sizeof(struct nd_msg)) {
675 ND_PRINTK(2, warn, "NS: packet too short\n");
679 if (ipv6_addr_is_multicast(&msg->target)) {
680 ND_PRINTK(2, warn, "NS: multicast target address\n");
686 * DAD has to be destined for solicited node multicast address.
689 !(daddr->s6_addr32[0] == htonl(0xff020000) &&
690 daddr->s6_addr32[1] == htonl(0x00000000) &&
691 daddr->s6_addr32[2] == htonl(0x00000001) &&
692 daddr->s6_addr [12] == 0xff )) {
693 ND_PRINTK(2, warn, "NS: bad DAD packet (wrong destination)\n");
697 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
698 ND_PRINTK(2, warn, "NS: invalid ND options\n");
702 if (ndopts.nd_opts_src_lladdr) {
703 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev);
706 "NS: invalid link-layer address length\n");
711 * If the IP source address is the unspecified address,
712 * there MUST NOT be source link-layer address option
717 "NS: bad DAD packet (link-layer address option)\n");
722 inc = ipv6_addr_is_multicast(daddr);
724 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
727 if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) {
730 * We are colliding with another node
732 * so fail our DAD process
734 addrconf_dad_failure(ifp);
738 * This is not a dad solicitation.
739 * If we are an optimistic node,
741 * Otherwise, we should ignore it.
743 if (!(ifp->flags & IFA_F_OPTIMISTIC))
750 struct net *net = dev_net(dev);
752 idev = in6_dev_get(dev);
754 /* XXX: count this drop? */
758 if (ipv6_chk_acast_addr(net, dev, &msg->target) ||
759 (idev->cnf.forwarding &&
760 (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) &&
761 (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) {
762 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
763 skb->pkt_type != PACKET_HOST &&
765 idev->nd_parms->proxy_delay != 0) {
767 * for anycast or proxy,
768 * sender should delay its response
769 * by a random time between 0 and
770 * MAX_ANYCAST_DELAY_TIME seconds.
771 * (RFC2461) -- yoshfuji
773 struct sk_buff *n = skb_clone(skb, GFP_ATOMIC);
775 pneigh_enqueue(&nd_tbl, idev->nd_parms, n);
783 is_router = !!idev->cnf.forwarding;
786 ndisc_send_na(dev, NULL, &in6addr_linklocal_allnodes, &msg->target,
787 is_router, 0, (ifp != NULL), 1);
792 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_mcast);
794 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast);
797 * update / create cache entry
798 * for the source address
800 neigh = __neigh_lookup(&nd_tbl, saddr, dev,
801 !inc || lladdr || !dev->addr_len);
803 neigh_update(neigh, lladdr, NUD_STALE,
804 NEIGH_UPDATE_F_WEAK_OVERRIDE|
805 NEIGH_UPDATE_F_OVERRIDE);
806 if (neigh || !dev->header_ops) {
807 ndisc_send_na(dev, neigh, saddr, &msg->target,
809 1, (ifp != NULL && inc), inc);
811 neigh_release(neigh);
821 static void ndisc_recv_na(struct sk_buff *skb)
823 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
824 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
825 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
827 u32 ndoptlen = skb->tail - (skb->transport_header +
828 offsetof(struct nd_msg, opt));
829 struct ndisc_options ndopts;
830 struct net_device *dev = skb->dev;
831 struct inet6_ifaddr *ifp;
832 struct neighbour *neigh;
834 if (skb->len < sizeof(struct nd_msg)) {
835 ND_PRINTK(2, warn, "NA: packet too short\n");
839 if (ipv6_addr_is_multicast(&msg->target)) {
840 ND_PRINTK(2, warn, "NA: target address is multicast\n");
844 if (ipv6_addr_is_multicast(daddr) &&
845 msg->icmph.icmp6_solicited) {
846 ND_PRINTK(2, warn, "NA: solicited NA is multicasted\n");
850 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
851 ND_PRINTK(2, warn, "NS: invalid ND option\n");
854 if (ndopts.nd_opts_tgt_lladdr) {
855 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev);
858 "NA: invalid link-layer address length\n");
862 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
864 if (skb->pkt_type != PACKET_LOOPBACK
865 && (ifp->flags & IFA_F_TENTATIVE)) {
866 addrconf_dad_failure(ifp);
869 /* What should we make now? The advertisement
870 is invalid, but ndisc specs say nothing
871 about it. It could be misconfiguration, or
872 an smart proxy agent tries to help us :-)
874 We should not print the error if NA has been
875 received from loopback - it is just our own
876 unsolicited advertisement.
878 if (skb->pkt_type != PACKET_LOOPBACK)
880 "NA: someone advertises our address %pI6 on %s!\n",
881 &ifp->addr, ifp->idev->dev->name);
885 neigh = neigh_lookup(&nd_tbl, &msg->target, dev);
888 u8 old_flags = neigh->flags;
889 struct net *net = dev_net(dev);
891 if (neigh->nud_state & NUD_FAILED)
895 * Don't update the neighbor cache entry on a proxy NA from
896 * ourselves because either the proxied node is off link or it
897 * has already sent a NA to us.
899 if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) &&
900 net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp &&
901 pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) {
902 /* XXX: idev->cnf.proxy_ndp */
906 neigh_update(neigh, lladdr,
907 msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE,
908 NEIGH_UPDATE_F_WEAK_OVERRIDE|
909 (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)|
910 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
911 (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0));
913 if ((old_flags & ~neigh->flags) & NTF_ROUTER) {
915 * Change: router to host
918 rt = rt6_get_dflt_router(saddr, dev);
924 neigh_release(neigh);
928 static void ndisc_recv_rs(struct sk_buff *skb)
930 struct rs_msg *rs_msg = (struct rs_msg *)skb_transport_header(skb);
931 unsigned long ndoptlen = skb->len - sizeof(*rs_msg);
932 struct neighbour *neigh;
933 struct inet6_dev *idev;
934 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
935 struct ndisc_options ndopts;
938 if (skb->len < sizeof(*rs_msg))
941 idev = __in6_dev_get(skb->dev);
943 ND_PRINTK(1, err, "RS: can't find in6 device\n");
947 /* Don't accept RS if we're not in router mode */
948 if (!idev->cnf.forwarding)
952 * Don't update NCE if src = ::;
953 * this implies that the source node has no ip address assigned yet.
955 if (ipv6_addr_any(saddr))
958 /* Parse ND options */
959 if (!ndisc_parse_options(rs_msg->opt, ndoptlen, &ndopts)) {
960 ND_PRINTK(2, notice, "NS: invalid ND option, ignored\n");
964 if (ndopts.nd_opts_src_lladdr) {
965 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
971 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1);
973 neigh_update(neigh, lladdr, NUD_STALE,
974 NEIGH_UPDATE_F_WEAK_OVERRIDE|
975 NEIGH_UPDATE_F_OVERRIDE|
976 NEIGH_UPDATE_F_OVERRIDE_ISROUTER);
977 neigh_release(neigh);
983 static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt)
985 struct icmp6hdr *icmp6h = (struct icmp6hdr *)skb_transport_header(ra);
987 struct nlmsghdr *nlh;
988 struct nduseroptmsg *ndmsg;
989 struct net *net = dev_net(ra->dev);
991 int base_size = NLMSG_ALIGN(sizeof(struct nduseroptmsg)
992 + (opt->nd_opt_len << 3));
993 size_t msg_size = base_size + nla_total_size(sizeof(struct in6_addr));
995 skb = nlmsg_new(msg_size, GFP_ATOMIC);
1001 nlh = nlmsg_put(skb, 0, 0, RTM_NEWNDUSEROPT, base_size, 0);
1003 goto nla_put_failure;
1006 ndmsg = nlmsg_data(nlh);
1007 ndmsg->nduseropt_family = AF_INET6;
1008 ndmsg->nduseropt_ifindex = ra->dev->ifindex;
1009 ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type;
1010 ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code;
1011 ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3;
1013 memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3);
1015 if (nla_put(skb, NDUSEROPT_SRCADDR, sizeof(struct in6_addr),
1016 &ipv6_hdr(ra)->saddr))
1017 goto nla_put_failure;
1018 nlmsg_end(skb, nlh);
1020 rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC);
1027 rtnl_set_sk_err(net, RTNLGRP_ND_USEROPT, err);
1030 static void ndisc_router_discovery(struct sk_buff *skb)
1032 struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb);
1033 struct neighbour *neigh = NULL;
1034 struct inet6_dev *in6_dev;
1035 struct rt6_info *rt = NULL;
1037 struct ndisc_options ndopts;
1039 unsigned int pref = 0;
1041 __u8 * opt = (__u8 *)(ra_msg + 1);
1043 optlen = (skb->tail - skb->transport_header) - sizeof(struct ra_msg);
1045 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1046 ND_PRINTK(2, warn, "RA: source address is not link-local\n");
1050 ND_PRINTK(2, warn, "RA: packet too short\n");
1054 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1055 if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) {
1056 ND_PRINTK(2, warn, "RA: from host or unauthorized router\n");
1062 * set the RA_RECV flag in the interface
1065 in6_dev = __in6_dev_get(skb->dev);
1066 if (in6_dev == NULL) {
1067 ND_PRINTK(0, err, "RA: can't find inet6 device for %s\n",
1072 if (!ndisc_parse_options(opt, optlen, &ndopts)) {
1073 ND_PRINTK(2, warn, "RA: invalid ND options\n");
1077 if (!ipv6_accept_ra(in6_dev))
1078 goto skip_linkparms;
1080 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1081 /* skip link-specific parameters from interior routers */
1082 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT)
1083 goto skip_linkparms;
1086 if (in6_dev->if_flags & IF_RS_SENT) {
1088 * flag that an RA was received after an RS was sent
1089 * out on this interface.
1091 in6_dev->if_flags |= IF_RA_RCVD;
1095 * Remember the managed/otherconf flags from most recently
1096 * received RA message (RFC 2462) -- yoshfuji
1098 in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED |
1100 (ra_msg->icmph.icmp6_addrconf_managed ?
1101 IF_RA_MANAGED : 0) |
1102 (ra_msg->icmph.icmp6_addrconf_other ?
1103 IF_RA_OTHERCONF : 0);
1105 if (!in6_dev->cnf.accept_ra_defrtr)
1108 if (ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, NULL, 0))
1111 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
1113 #ifdef CONFIG_IPV6_ROUTER_PREF
1114 pref = ra_msg->icmph.icmp6_router_pref;
1115 /* 10b is handled as if it were 00b (medium) */
1116 if (pref == ICMPV6_ROUTER_PREF_INVALID ||
1117 !in6_dev->cnf.accept_ra_rtr_pref)
1118 pref = ICMPV6_ROUTER_PREF_MEDIUM;
1121 rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
1124 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1127 "RA: %s got default router without neighbour\n",
1133 if (rt && lifetime == 0) {
1138 if (rt == NULL && lifetime) {
1139 ND_PRINTK(3, dbg, "RA: adding default router\n");
1141 rt = rt6_add_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev, pref);
1144 "RA: %s failed to add default route\n",
1149 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1150 if (neigh == NULL) {
1152 "RA: %s got default router without neighbour\n",
1157 neigh->flags |= NTF_ROUTER;
1159 rt->rt6i_flags = (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
1163 rt6_set_expires(rt, jiffies + (HZ * lifetime));
1164 if (ra_msg->icmph.icmp6_hop_limit) {
1165 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
1167 dst_metric_set(&rt->dst, RTAX_HOPLIMIT,
1168 ra_msg->icmph.icmp6_hop_limit);
1174 * Update Reachable Time and Retrans Timer
1177 if (in6_dev->nd_parms) {
1178 unsigned long rtime = ntohl(ra_msg->retrans_timer);
1180 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/HZ) {
1181 rtime = (rtime*HZ)/1000;
1184 in6_dev->nd_parms->retrans_time = rtime;
1185 in6_dev->tstamp = jiffies;
1186 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1189 rtime = ntohl(ra_msg->reachable_time);
1190 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/(3*HZ)) {
1191 rtime = (rtime*HZ)/1000;
1196 if (rtime != in6_dev->nd_parms->base_reachable_time) {
1197 in6_dev->nd_parms->base_reachable_time = rtime;
1198 in6_dev->nd_parms->gc_staletime = 3 * rtime;
1199 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime);
1200 in6_dev->tstamp = jiffies;
1201 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1213 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr,
1217 if (ndopts.nd_opts_src_lladdr) {
1218 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1222 "RA: invalid link-layer address length\n");
1226 neigh_update(neigh, lladdr, NUD_STALE,
1227 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1228 NEIGH_UPDATE_F_OVERRIDE|
1229 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1230 NEIGH_UPDATE_F_ISROUTER);
1233 if (!ipv6_accept_ra(in6_dev))
1236 #ifdef CONFIG_IPV6_ROUTE_INFO
1237 if (ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, NULL, 0))
1238 goto skip_routeinfo;
1240 if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
1241 struct nd_opt_hdr *p;
1242 for (p = ndopts.nd_opts_ri;
1244 p = ndisc_next_option(p, ndopts.nd_opts_ri_end)) {
1245 struct route_info *ri = (struct route_info *)p;
1246 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1247 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT &&
1248 ri->prefix_len == 0)
1251 if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen)
1253 rt6_route_rcv(skb->dev, (u8*)p, (p->nd_opt_len) << 3,
1254 &ipv6_hdr(skb)->saddr);
1261 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1262 /* skip link-specific ndopts from interior routers */
1263 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT)
1267 if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
1268 struct nd_opt_hdr *p;
1269 for (p = ndopts.nd_opts_pi;
1271 p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) {
1272 addrconf_prefix_rcv(skb->dev, (u8 *)p,
1273 (p->nd_opt_len) << 3,
1274 ndopts.nd_opts_src_lladdr != NULL);
1278 if (ndopts.nd_opts_mtu) {
1282 memcpy(&n, ((u8*)(ndopts.nd_opts_mtu+1))+2, sizeof(mtu));
1285 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) {
1286 ND_PRINTK(2, warn, "RA: invalid mtu: %d\n", mtu);
1287 } else if (in6_dev->cnf.mtu6 != mtu) {
1288 in6_dev->cnf.mtu6 = mtu;
1291 dst_metric_set(&rt->dst, RTAX_MTU, mtu);
1293 rt6_mtu_change(skb->dev, mtu);
1297 if (ndopts.nd_useropts) {
1298 struct nd_opt_hdr *p;
1299 for (p = ndopts.nd_useropts;
1301 p = ndisc_next_useropt(p, ndopts.nd_useropts_end)) {
1302 ndisc_ra_useropt(skb, p);
1306 if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
1307 ND_PRINTK(2, warn, "RA: invalid RA options\n");
1312 neigh_release(neigh);
1315 static void ndisc_redirect_rcv(struct sk_buff *skb)
1318 struct ndisc_options ndopts;
1319 struct rd_msg *msg = (struct rd_msg *)skb_transport_header(skb);
1320 u32 ndoptlen = skb->tail - (skb->transport_header +
1321 offsetof(struct rd_msg, opt));
1323 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1324 switch (skb->ndisc_nodetype) {
1325 case NDISC_NODETYPE_HOST:
1326 case NDISC_NODETYPE_NODEFAULT:
1328 "Redirect: from host or unauthorized router\n");
1333 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1335 "Redirect: source address is not link-local\n");
1339 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts))
1342 if (!ndopts.nd_opts_rh)
1345 hdr = (u8 *)ndopts.nd_opts_rh;
1347 if (!pskb_pull(skb, hdr - skb_transport_header(skb)))
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 rd_msg);
1359 struct inet_peer *peer;
1360 struct sk_buff *buff;
1362 struct in6_addr saddr_buf;
1363 struct rt6_info *rt;
1364 struct dst_entry *dst;
1365 struct inet6_dev *idev;
1371 u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
1374 if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) {
1375 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n",
1380 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
1381 ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
1383 "Redirect: target address is not link-local unicast\n");
1387 icmpv6_flow_init(sk, &fl6, NDISC_REDIRECT,
1388 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex);
1390 dst = ip6_route_output(net, NULL, &fl6);
1395 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), NULL, 0);
1399 rt = (struct rt6_info *) dst;
1401 if (rt->rt6i_flags & RTF_GATEWAY) {
1403 "Redirect: destination is not a neighbour\n");
1406 peer = inet_getpeer_v6(net->ipv6.peers, &rt->rt6i_dst.addr, 1);
1407 ret = inet_peer_xrlim_allow(peer, 1*HZ);
1413 if (dev->addr_len) {
1414 struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target);
1417 "Redirect: no neigh for target address\n");
1421 read_lock_bh(&neigh->lock);
1422 if (neigh->nud_state & NUD_VALID) {
1423 memcpy(ha_buf, neigh->ha, dev->addr_len);
1424 read_unlock_bh(&neigh->lock);
1426 len += ndisc_opt_addr_space(dev);
1428 read_unlock_bh(&neigh->lock);
1430 neigh_release(neigh);
1433 rd_len = min_t(unsigned int,
1434 IPV6_MIN_MTU-sizeof(struct ipv6hdr)-len, skb->len + 8);
1438 hlen = LL_RESERVED_SPACE(dev);
1439 tlen = dev->needed_tailroom;
1440 buff = sock_alloc_send_skb(sk,
1441 (sizeof(struct ipv6hdr) +
1446 "Redirect: %s failed to allocate an skb, err=%d\n",
1451 skb_reserve(buff, hlen);
1452 ip6_nd_hdr(sk, buff, dev, &saddr_buf, &ipv6_hdr(skb)->saddr,
1453 IPPROTO_ICMPV6, len);
1455 skb_set_transport_header(buff, skb_tail_pointer(buff) - buff->data);
1457 msg = (struct rd_msg *)icmp6_hdr(buff);
1459 memset(&msg->icmph, 0, sizeof(struct icmp6hdr));
1460 msg->icmph.icmp6_type = NDISC_REDIRECT;
1463 * copy target and destination addresses
1466 msg->target = *target;
1467 msg->dest = ipv6_hdr(skb)->daddr;
1472 * include target_address option
1476 opt = ndisc_fill_addr_option(opt, ND_OPT_TARGET_LL_ADDR, ha,
1477 dev->addr_len, dev->type);
1480 * build redirect option and copy skb over to the new packet.
1484 *(opt++) = ND_OPT_REDIRECT_HDR;
1485 *(opt++) = (rd_len >> 3);
1488 memcpy(opt, ipv6_hdr(skb), rd_len - 8);
1490 msg->icmph.icmp6_cksum = csum_ipv6_magic(&saddr_buf, &ipv6_hdr(skb)->saddr,
1491 len, IPPROTO_ICMPV6,
1492 csum_partial(msg, len, 0));
1494 skb_dst_set(buff, dst);
1496 idev = __in6_dev_get(dst->dev);
1497 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len);
1498 err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, buff, NULL, dst->dev,
1501 ICMP6MSGOUT_INC_STATS(net, idev, NDISC_REDIRECT);
1502 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
1512 static void pndisc_redo(struct sk_buff *skb)
1518 int ndisc_rcv(struct sk_buff *skb)
1522 if (!pskb_may_pull(skb, skb->len))
1525 msg = (struct nd_msg *)skb_transport_header(skb);
1527 __skb_push(skb, skb->data - skb_transport_header(skb));
1529 if (ipv6_hdr(skb)->hop_limit != 255) {
1530 ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n",
1531 ipv6_hdr(skb)->hop_limit);
1535 if (msg->icmph.icmp6_code != 0) {
1536 ND_PRINTK(2, warn, "NDISC: invalid ICMPv6 code: %d\n",
1537 msg->icmph.icmp6_code);
1541 memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
1543 switch (msg->icmph.icmp6_type) {
1544 case NDISC_NEIGHBOUR_SOLICITATION:
1548 case NDISC_NEIGHBOUR_ADVERTISEMENT:
1552 case NDISC_ROUTER_SOLICITATION:
1556 case NDISC_ROUTER_ADVERTISEMENT:
1557 ndisc_router_discovery(skb);
1560 case NDISC_REDIRECT:
1561 ndisc_redirect_rcv(skb);
1568 static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1570 struct net_device *dev = ptr;
1571 struct net *net = dev_net(dev);
1572 struct inet6_dev *idev;
1575 case NETDEV_CHANGEADDR:
1576 neigh_changeaddr(&nd_tbl, dev);
1577 fib6_run_gc(~0UL, net);
1578 idev = in6_dev_get(dev);
1581 if (idev->cnf.ndisc_notify)
1582 ndisc_send_unsol_na(dev);
1586 neigh_ifdown(&nd_tbl, dev);
1587 fib6_run_gc(~0UL, net);
1589 case NETDEV_NOTIFY_PEERS:
1590 ndisc_send_unsol_na(dev);
1599 static struct notifier_block ndisc_netdev_notifier = {
1600 .notifier_call = ndisc_netdev_event,
1603 #ifdef CONFIG_SYSCTL
1604 static void ndisc_warn_deprecated_sysctl(struct ctl_table *ctl,
1605 const char *func, const char *dev_name)
1607 static char warncomm[TASK_COMM_LEN];
1609 if (strcmp(warncomm, current->comm) && warned < 5) {
1610 strcpy(warncomm, current->comm);
1611 pr_warn("process `%s' is using deprecated sysctl (%s) net.ipv6.neigh.%s.%s - use net.ipv6.neigh.%s.%s_ms instead\n",
1613 dev_name, ctl->procname,
1614 dev_name, ctl->procname);
1619 int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void __user *buffer, size_t *lenp, loff_t *ppos)
1621 struct net_device *dev = ctl->extra1;
1622 struct inet6_dev *idev;
1625 if ((strcmp(ctl->procname, "retrans_time") == 0) ||
1626 (strcmp(ctl->procname, "base_reachable_time") == 0))
1627 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default");
1629 if (strcmp(ctl->procname, "retrans_time") == 0)
1630 ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
1632 else if (strcmp(ctl->procname, "base_reachable_time") == 0)
1633 ret = proc_dointvec_jiffies(ctl, write,
1634 buffer, lenp, ppos);
1636 else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) ||
1637 (strcmp(ctl->procname, "base_reachable_time_ms") == 0))
1638 ret = proc_dointvec_ms_jiffies(ctl, write,
1639 buffer, lenp, ppos);
1643 if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) {
1644 if (ctl->data == &idev->nd_parms->base_reachable_time)
1645 idev->nd_parms->reachable_time = neigh_rand_reach_time(idev->nd_parms->base_reachable_time);
1646 idev->tstamp = jiffies;
1647 inet6_ifinfo_notify(RTM_NEWLINK, idev);
1656 static int __net_init ndisc_net_init(struct net *net)
1658 struct ipv6_pinfo *np;
1662 err = inet_ctl_sock_create(&sk, PF_INET6,
1663 SOCK_RAW, IPPROTO_ICMPV6, net);
1666 "NDISC: Failed to initialize the control socket (err %d)\n",
1671 net->ipv6.ndisc_sk = sk;
1674 np->hop_limit = 255;
1675 /* Do not loopback ndisc messages */
1681 static void __net_exit ndisc_net_exit(struct net *net)
1683 inet_ctl_sock_destroy(net->ipv6.ndisc_sk);
1686 static struct pernet_operations ndisc_net_ops = {
1687 .init = ndisc_net_init,
1688 .exit = ndisc_net_exit,
1691 int __init ndisc_init(void)
1695 err = register_pernet_subsys(&ndisc_net_ops);
1699 * Initialize the neighbour table
1701 neigh_table_init(&nd_tbl);
1703 #ifdef CONFIG_SYSCTL
1704 err = neigh_sysctl_register(NULL, &nd_tbl.parms, "ipv6",
1705 &ndisc_ifinfo_sysctl_change);
1707 goto out_unregister_pernet;
1709 err = register_netdevice_notifier(&ndisc_netdev_notifier);
1711 goto out_unregister_sysctl;
1715 out_unregister_sysctl:
1716 #ifdef CONFIG_SYSCTL
1717 neigh_sysctl_unregister(&nd_tbl.parms);
1718 out_unregister_pernet:
1720 unregister_pernet_subsys(&ndisc_net_ops);
1724 void ndisc_cleanup(void)
1726 unregister_netdevice_notifier(&ndisc_netdev_notifier);
1727 #ifdef CONFIG_SYSCTL
1728 neigh_sysctl_unregister(&nd_tbl.parms);
1730 neigh_table_clear(&nd_tbl);
1731 unregister_pernet_subsys(&ndisc_net_ops);