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 void ndisc_fill_addr_option(struct sk_buff *skb, int type, void *data)
148 int pad = ndisc_addr_option_pad(skb->dev->type);
149 int data_len = skb->dev->addr_len;
150 int space = ndisc_opt_addr_space(skb->dev);
151 u8 *opt = skb_put(skb, space);
156 memset(opt + 2, 0, pad);
160 memcpy(opt+2, data, data_len);
163 if ((space -= data_len) > 0)
164 memset(opt, 0, space);
167 static struct nd_opt_hdr *ndisc_next_option(struct nd_opt_hdr *cur,
168 struct nd_opt_hdr *end)
171 if (!cur || !end || cur >= end)
173 type = cur->nd_opt_type;
175 cur = ((void *)cur) + (cur->nd_opt_len << 3);
176 } while(cur < end && cur->nd_opt_type != type);
177 return cur <= end && cur->nd_opt_type == type ? cur : NULL;
180 static inline int ndisc_is_useropt(struct nd_opt_hdr *opt)
182 return opt->nd_opt_type == ND_OPT_RDNSS ||
183 opt->nd_opt_type == ND_OPT_DNSSL;
186 static struct nd_opt_hdr *ndisc_next_useropt(struct nd_opt_hdr *cur,
187 struct nd_opt_hdr *end)
189 if (!cur || !end || cur >= end)
192 cur = ((void *)cur) + (cur->nd_opt_len << 3);
193 } while(cur < end && !ndisc_is_useropt(cur));
194 return cur <= end && ndisc_is_useropt(cur) ? cur : NULL;
197 struct ndisc_options *ndisc_parse_options(u8 *opt, int opt_len,
198 struct ndisc_options *ndopts)
200 struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)opt;
202 if (!nd_opt || opt_len < 0 || !ndopts)
204 memset(ndopts, 0, sizeof(*ndopts));
207 if (opt_len < sizeof(struct nd_opt_hdr))
209 l = nd_opt->nd_opt_len << 3;
210 if (opt_len < l || l == 0)
212 switch (nd_opt->nd_opt_type) {
213 case ND_OPT_SOURCE_LL_ADDR:
214 case ND_OPT_TARGET_LL_ADDR:
216 case ND_OPT_REDIRECT_HDR:
217 if (ndopts->nd_opt_array[nd_opt->nd_opt_type]) {
219 "%s: duplicated ND6 option found: type=%d\n",
220 __func__, nd_opt->nd_opt_type);
222 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
225 case ND_OPT_PREFIX_INFO:
226 ndopts->nd_opts_pi_end = nd_opt;
227 if (!ndopts->nd_opt_array[nd_opt->nd_opt_type])
228 ndopts->nd_opt_array[nd_opt->nd_opt_type] = nd_opt;
230 #ifdef CONFIG_IPV6_ROUTE_INFO
231 case ND_OPT_ROUTE_INFO:
232 ndopts->nd_opts_ri_end = nd_opt;
233 if (!ndopts->nd_opts_ri)
234 ndopts->nd_opts_ri = nd_opt;
238 if (ndisc_is_useropt(nd_opt)) {
239 ndopts->nd_useropts_end = nd_opt;
240 if (!ndopts->nd_useropts)
241 ndopts->nd_useropts = nd_opt;
244 * Unknown options must be silently ignored,
245 * to accommodate future extension to the
249 "%s: ignored unsupported option; type=%d, len=%d\n",
256 nd_opt = ((void *)nd_opt) + l;
261 int ndisc_mc_map(const struct in6_addr *addr, char *buf, struct net_device *dev, int dir)
265 case ARPHRD_IEEE802: /* Not sure. Check it later. --ANK */
267 ipv6_eth_mc_map(addr, buf);
270 ipv6_arcnet_mc_map(addr, buf);
272 case ARPHRD_INFINIBAND:
273 ipv6_ib_mc_map(addr, dev->broadcast, buf);
276 return ipv6_ipgre_mc_map(addr, dev->broadcast, buf);
279 memcpy(buf, dev->broadcast, dev->addr_len);
286 EXPORT_SYMBOL(ndisc_mc_map);
288 static u32 ndisc_hash(const void *pkey,
289 const struct net_device *dev,
292 return ndisc_hashfn(pkey, dev, hash_rnd);
295 static int ndisc_constructor(struct neighbour *neigh)
297 struct in6_addr *addr = (struct in6_addr*)&neigh->primary_key;
298 struct net_device *dev = neigh->dev;
299 struct inet6_dev *in6_dev;
300 struct neigh_parms *parms;
301 bool is_multicast = ipv6_addr_is_multicast(addr);
303 in6_dev = in6_dev_get(dev);
304 if (in6_dev == NULL) {
308 parms = in6_dev->nd_parms;
309 __neigh_parms_put(neigh->parms);
310 neigh->parms = neigh_parms_clone(parms);
312 neigh->type = is_multicast ? RTN_MULTICAST : RTN_UNICAST;
313 if (!dev->header_ops) {
314 neigh->nud_state = NUD_NOARP;
315 neigh->ops = &ndisc_direct_ops;
316 neigh->output = neigh_direct_output;
319 neigh->nud_state = NUD_NOARP;
320 ndisc_mc_map(addr, neigh->ha, dev, 1);
321 } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) {
322 neigh->nud_state = NUD_NOARP;
323 memcpy(neigh->ha, dev->dev_addr, dev->addr_len);
324 if (dev->flags&IFF_LOOPBACK)
325 neigh->type = RTN_LOCAL;
326 } else if (dev->flags&IFF_POINTOPOINT) {
327 neigh->nud_state = NUD_NOARP;
328 memcpy(neigh->ha, dev->broadcast, dev->addr_len);
330 if (dev->header_ops->cache)
331 neigh->ops = &ndisc_hh_ops;
333 neigh->ops = &ndisc_generic_ops;
334 if (neigh->nud_state&NUD_VALID)
335 neigh->output = neigh->ops->connected_output;
337 neigh->output = neigh->ops->output;
339 in6_dev_put(in6_dev);
343 static int pndisc_constructor(struct pneigh_entry *n)
345 struct in6_addr *addr = (struct in6_addr*)&n->key;
346 struct in6_addr maddr;
347 struct net_device *dev = n->dev;
349 if (dev == NULL || __in6_dev_get(dev) == NULL)
351 addrconf_addr_solict_mult(addr, &maddr);
352 ipv6_dev_mc_inc(dev, &maddr);
356 static void pndisc_destructor(struct pneigh_entry *n)
358 struct in6_addr *addr = (struct in6_addr*)&n->key;
359 struct in6_addr maddr;
360 struct net_device *dev = n->dev;
362 if (dev == NULL || __in6_dev_get(dev) == NULL)
364 addrconf_addr_solict_mult(addr, &maddr);
365 ipv6_dev_mc_dec(dev, &maddr);
368 static struct sk_buff *ndisc_alloc_skb(struct net_device *dev,
371 int hlen = LL_RESERVED_SPACE(dev);
372 int tlen = dev->needed_tailroom;
373 struct sock *sk = dev_net(dev)->ipv6.ndisc_sk;
377 skb = sock_alloc_send_skb(sk,
378 hlen + sizeof(struct ipv6hdr) + len + tlen,
381 ND_PRINTK(0, err, "ndisc: %s failed to allocate an skb, err=%d\n",
386 skb->protocol = htons(ETH_P_IPV6);
389 skb_reserve(skb, hlen + sizeof(struct ipv6hdr));
390 skb_reset_transport_header(skb);
395 static void ip6_nd_hdr(struct sk_buff *skb,
396 const struct in6_addr *saddr,
397 const struct in6_addr *daddr,
398 int hop_limit, int len)
402 skb_push(skb, sizeof(*hdr));
403 skb_reset_network_header(skb);
406 ip6_flow_hdr(hdr, 0, 0);
408 hdr->payload_len = htons(len);
409 hdr->nexthdr = IPPROTO_ICMPV6;
410 hdr->hop_limit = hop_limit;
416 static void ndisc_send_skb(struct sk_buff *skb,
417 const struct in6_addr *daddr,
418 const struct in6_addr *saddr)
420 struct dst_entry *dst = skb_dst(skb);
421 struct net *net = dev_net(skb->dev);
422 struct sock *sk = net->ipv6.ndisc_sk;
423 struct inet6_dev *idev;
425 struct icmp6hdr *icmp6h = icmp6_hdr(skb);
428 type = icmp6h->icmp6_type;
433 icmpv6_flow_init(sk, &fl6, type, saddr, daddr, skb->dev->ifindex);
434 dst = icmp6_dst_alloc(skb->dev, &fl6);
440 skb_dst_set(skb, dst);
443 icmp6h->icmp6_cksum = csum_ipv6_magic(saddr, daddr, skb->len,
448 ip6_nd_hdr(skb, saddr, daddr, inet6_sk(sk)->hop_limit, skb->len);
451 idev = __in6_dev_get(dst->dev);
452 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len);
454 err = NF_HOOK(NFPROTO_IPV6, NF_INET_LOCAL_OUT, skb, NULL, dst->dev,
457 ICMP6MSGOUT_INC_STATS(net, idev, type);
458 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
464 void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
465 const struct in6_addr *daddr,
466 const struct in6_addr *solicited_addr,
467 bool router, bool solicited, bool override, bool inc_opt)
470 struct in6_addr tmpaddr;
471 struct inet6_ifaddr *ifp;
472 const struct in6_addr *src_addr;
476 /* for anycast or proxy, solicited_addr != src_addr */
477 ifp = ipv6_get_ifaddr(dev_net(dev), solicited_addr, dev, 1);
479 src_addr = solicited_addr;
480 if (ifp->flags & IFA_F_OPTIMISTIC)
482 inc_opt |= ifp->idev->cnf.force_tllao;
485 if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr,
486 inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs,
495 optlen += ndisc_opt_addr_space(dev);
497 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
501 msg = (struct nd_msg *)skb_put(skb, sizeof(*msg));
502 *msg = (struct nd_msg) {
504 .icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT,
505 .icmp6_router = router,
506 .icmp6_solicited = solicited,
507 .icmp6_override = override,
509 .target = *solicited_addr,
513 ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR,
517 ndisc_send_skb(skb, daddr, src_addr);
520 static void ndisc_send_unsol_na(struct net_device *dev)
522 struct inet6_dev *idev;
523 struct inet6_ifaddr *ifa;
525 idev = in6_dev_get(dev);
529 read_lock_bh(&idev->lock);
530 list_for_each_entry(ifa, &idev->addr_list, if_list) {
531 ndisc_send_na(dev, NULL, &in6addr_linklocal_allnodes, &ifa->addr,
532 /*router=*/ !!idev->cnf.forwarding,
533 /*solicited=*/ false, /*override=*/ true,
536 read_unlock_bh(&idev->lock);
541 void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
542 const struct in6_addr *solicit,
543 const struct in6_addr *daddr, const struct in6_addr *saddr)
546 struct in6_addr addr_buf;
547 int inc_opt = dev->addr_len;
552 if (ipv6_get_lladdr(dev, &addr_buf,
553 (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)))
558 if (ipv6_addr_any(saddr))
561 optlen += ndisc_opt_addr_space(dev);
563 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
567 msg = (struct nd_msg *)skb_put(skb, sizeof(*msg));
568 *msg = (struct nd_msg) {
570 .icmp6_type = NDISC_NEIGHBOUR_SOLICITATION,
576 ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR,
579 ndisc_send_skb(skb, daddr, saddr);
582 void ndisc_send_rs(struct net_device *dev, const struct in6_addr *saddr,
583 const struct in6_addr *daddr)
587 int send_sllao = dev->addr_len;
590 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
592 * According to section 2.2 of RFC 4429, we must not
593 * send router solicitations with a sllao from
594 * optimistic addresses, but we may send the solicitation
595 * if we don't include the sllao. So here we check
596 * if our address is optimistic, and if so, we
597 * suppress the inclusion of the sllao.
600 struct inet6_ifaddr *ifp = ipv6_get_ifaddr(dev_net(dev), saddr,
603 if (ifp->flags & IFA_F_OPTIMISTIC) {
613 optlen += ndisc_opt_addr_space(dev);
615 skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
619 msg = (struct rs_msg *)skb_put(skb, sizeof(*msg));
620 *msg = (struct rs_msg) {
622 .icmp6_type = NDISC_ROUTER_SOLICITATION,
627 ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR,
630 ndisc_send_skb(skb, daddr, saddr);
634 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb)
637 * "The sender MUST return an ICMP
638 * destination unreachable"
640 dst_link_failure(skb);
644 /* Called with locked neigh: either read or both */
646 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
648 struct in6_addr *saddr = NULL;
649 struct in6_addr mcaddr;
650 struct net_device *dev = neigh->dev;
651 struct in6_addr *target = (struct in6_addr *)&neigh->primary_key;
652 int probes = atomic_read(&neigh->probes);
654 if (skb && ipv6_chk_addr(dev_net(dev), &ipv6_hdr(skb)->saddr, dev, 1))
655 saddr = &ipv6_hdr(skb)->saddr;
657 if ((probes -= neigh->parms->ucast_probes) < 0) {
658 if (!(neigh->nud_state & NUD_VALID)) {
660 "%s: trying to ucast probe in NUD_INVALID: %pI6\n",
663 ndisc_send_ns(dev, neigh, target, target, saddr);
664 } else if ((probes -= neigh->parms->app_probes) < 0) {
667 addrconf_addr_solict_mult(target, &mcaddr);
668 ndisc_send_ns(dev, NULL, target, &mcaddr, saddr);
672 static int pndisc_is_router(const void *pkey,
673 struct net_device *dev)
675 struct pneigh_entry *n;
678 read_lock_bh(&nd_tbl.lock);
679 n = __pneigh_lookup(&nd_tbl, dev_net(dev), pkey, dev);
681 ret = !!(n->flags & NTF_ROUTER);
682 read_unlock_bh(&nd_tbl.lock);
687 static void ndisc_recv_ns(struct sk_buff *skb)
689 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
690 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
691 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
693 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
694 offsetof(struct nd_msg, opt));
695 struct ndisc_options ndopts;
696 struct net_device *dev = skb->dev;
697 struct inet6_ifaddr *ifp;
698 struct inet6_dev *idev = NULL;
699 struct neighbour *neigh;
700 int dad = ipv6_addr_any(saddr);
704 if (skb->len < sizeof(struct nd_msg)) {
705 ND_PRINTK(2, warn, "NS: packet too short\n");
709 if (ipv6_addr_is_multicast(&msg->target)) {
710 ND_PRINTK(2, warn, "NS: multicast target address\n");
716 * DAD has to be destined for solicited node multicast address.
718 if (dad && !ipv6_addr_is_solict_mult(daddr)) {
719 ND_PRINTK(2, warn, "NS: bad DAD packet (wrong destination)\n");
723 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
724 ND_PRINTK(2, warn, "NS: invalid ND options\n");
728 if (ndopts.nd_opts_src_lladdr) {
729 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev);
732 "NS: invalid link-layer address length\n");
737 * If the IP source address is the unspecified address,
738 * there MUST NOT be source link-layer address option
743 "NS: bad DAD packet (link-layer address option)\n");
748 inc = ipv6_addr_is_multicast(daddr);
750 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
753 if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) {
756 * We are colliding with another node
758 * so fail our DAD process
760 addrconf_dad_failure(ifp);
764 * This is not a dad solicitation.
765 * If we are an optimistic node,
767 * Otherwise, we should ignore it.
769 if (!(ifp->flags & IFA_F_OPTIMISTIC))
776 struct net *net = dev_net(dev);
778 idev = in6_dev_get(dev);
780 /* XXX: count this drop? */
784 if (ipv6_chk_acast_addr(net, dev, &msg->target) ||
785 (idev->cnf.forwarding &&
786 (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) &&
787 (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) {
788 if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
789 skb->pkt_type != PACKET_HOST &&
791 idev->nd_parms->proxy_delay != 0) {
793 * for anycast or proxy,
794 * sender should delay its response
795 * by a random time between 0 and
796 * MAX_ANYCAST_DELAY_TIME seconds.
797 * (RFC2461) -- yoshfuji
799 struct sk_buff *n = skb_clone(skb, GFP_ATOMIC);
801 pneigh_enqueue(&nd_tbl, idev->nd_parms, n);
809 is_router = idev->cnf.forwarding;
812 ndisc_send_na(dev, NULL, &in6addr_linklocal_allnodes, &msg->target,
813 !!is_router, false, (ifp != NULL), true);
818 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_mcast);
820 NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast);
823 * update / create cache entry
824 * for the source address
826 neigh = __neigh_lookup(&nd_tbl, saddr, dev,
827 !inc || lladdr || !dev->addr_len);
829 neigh_update(neigh, lladdr, NUD_STALE,
830 NEIGH_UPDATE_F_WEAK_OVERRIDE|
831 NEIGH_UPDATE_F_OVERRIDE);
832 if (neigh || !dev->header_ops) {
833 ndisc_send_na(dev, neigh, saddr, &msg->target,
835 true, (ifp != NULL && inc), inc);
837 neigh_release(neigh);
847 static void ndisc_recv_na(struct sk_buff *skb)
849 struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
850 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
851 const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
853 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
854 offsetof(struct nd_msg, opt));
855 struct ndisc_options ndopts;
856 struct net_device *dev = skb->dev;
857 struct inet6_ifaddr *ifp;
858 struct neighbour *neigh;
860 if (skb->len < sizeof(struct nd_msg)) {
861 ND_PRINTK(2, warn, "NA: packet too short\n");
865 if (ipv6_addr_is_multicast(&msg->target)) {
866 ND_PRINTK(2, warn, "NA: target address is multicast\n");
870 if (ipv6_addr_is_multicast(daddr) &&
871 msg->icmph.icmp6_solicited) {
872 ND_PRINTK(2, warn, "NA: solicited NA is multicasted\n");
876 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
877 ND_PRINTK(2, warn, "NS: invalid ND option\n");
880 if (ndopts.nd_opts_tgt_lladdr) {
881 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev);
884 "NA: invalid link-layer address length\n");
888 ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
890 if (skb->pkt_type != PACKET_LOOPBACK
891 && (ifp->flags & IFA_F_TENTATIVE)) {
892 addrconf_dad_failure(ifp);
895 /* What should we make now? The advertisement
896 is invalid, but ndisc specs say nothing
897 about it. It could be misconfiguration, or
898 an smart proxy agent tries to help us :-)
900 We should not print the error if NA has been
901 received from loopback - it is just our own
902 unsolicited advertisement.
904 if (skb->pkt_type != PACKET_LOOPBACK)
906 "NA: someone advertises our address %pI6 on %s!\n",
907 &ifp->addr, ifp->idev->dev->name);
911 neigh = neigh_lookup(&nd_tbl, &msg->target, dev);
914 u8 old_flags = neigh->flags;
915 struct net *net = dev_net(dev);
917 if (neigh->nud_state & NUD_FAILED)
921 * Don't update the neighbor cache entry on a proxy NA from
922 * ourselves because either the proxied node is off link or it
923 * has already sent a NA to us.
925 if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) &&
926 net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp &&
927 pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) {
928 /* XXX: idev->cnf.proxy_ndp */
932 neigh_update(neigh, lladdr,
933 msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE,
934 NEIGH_UPDATE_F_WEAK_OVERRIDE|
935 (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)|
936 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
937 (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0));
939 if ((old_flags & ~neigh->flags) & NTF_ROUTER) {
941 * Change: router to host
944 rt = rt6_get_dflt_router(saddr, dev);
950 neigh_release(neigh);
954 static void ndisc_recv_rs(struct sk_buff *skb)
956 struct rs_msg *rs_msg = (struct rs_msg *)skb_transport_header(skb);
957 unsigned long ndoptlen = skb->len - sizeof(*rs_msg);
958 struct neighbour *neigh;
959 struct inet6_dev *idev;
960 const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
961 struct ndisc_options ndopts;
964 if (skb->len < sizeof(*rs_msg))
967 idev = __in6_dev_get(skb->dev);
969 ND_PRINTK(1, err, "RS: can't find in6 device\n");
973 /* Don't accept RS if we're not in router mode */
974 if (!idev->cnf.forwarding)
978 * Don't update NCE if src = ::;
979 * this implies that the source node has no ip address assigned yet.
981 if (ipv6_addr_any(saddr))
984 /* Parse ND options */
985 if (!ndisc_parse_options(rs_msg->opt, ndoptlen, &ndopts)) {
986 ND_PRINTK(2, notice, "NS: invalid ND option, ignored\n");
990 if (ndopts.nd_opts_src_lladdr) {
991 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
997 neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1);
999 neigh_update(neigh, lladdr, NUD_STALE,
1000 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1001 NEIGH_UPDATE_F_OVERRIDE|
1002 NEIGH_UPDATE_F_OVERRIDE_ISROUTER);
1003 neigh_release(neigh);
1009 static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt)
1011 struct icmp6hdr *icmp6h = (struct icmp6hdr *)skb_transport_header(ra);
1012 struct sk_buff *skb;
1013 struct nlmsghdr *nlh;
1014 struct nduseroptmsg *ndmsg;
1015 struct net *net = dev_net(ra->dev);
1017 int base_size = NLMSG_ALIGN(sizeof(struct nduseroptmsg)
1018 + (opt->nd_opt_len << 3));
1019 size_t msg_size = base_size + nla_total_size(sizeof(struct in6_addr));
1021 skb = nlmsg_new(msg_size, GFP_ATOMIC);
1027 nlh = nlmsg_put(skb, 0, 0, RTM_NEWNDUSEROPT, base_size, 0);
1029 goto nla_put_failure;
1032 ndmsg = nlmsg_data(nlh);
1033 ndmsg->nduseropt_family = AF_INET6;
1034 ndmsg->nduseropt_ifindex = ra->dev->ifindex;
1035 ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type;
1036 ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code;
1037 ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3;
1039 memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3);
1041 if (nla_put(skb, NDUSEROPT_SRCADDR, sizeof(struct in6_addr),
1042 &ipv6_hdr(ra)->saddr))
1043 goto nla_put_failure;
1044 nlmsg_end(skb, nlh);
1046 rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC);
1053 rtnl_set_sk_err(net, RTNLGRP_ND_USEROPT, err);
1056 static void ndisc_router_discovery(struct sk_buff *skb)
1058 struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb);
1059 struct neighbour *neigh = NULL;
1060 struct inet6_dev *in6_dev;
1061 struct rt6_info *rt = NULL;
1063 struct ndisc_options ndopts;
1065 unsigned int pref = 0;
1067 __u8 * opt = (__u8 *)(ra_msg + 1);
1069 optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) -
1070 sizeof(struct ra_msg);
1072 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1073 ND_PRINTK(2, warn, "RA: source address is not link-local\n");
1077 ND_PRINTK(2, warn, "RA: packet too short\n");
1081 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1082 if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) {
1083 ND_PRINTK(2, warn, "RA: from host or unauthorized router\n");
1089 * set the RA_RECV flag in the interface
1092 in6_dev = __in6_dev_get(skb->dev);
1093 if (in6_dev == NULL) {
1094 ND_PRINTK(0, err, "RA: can't find inet6 device for %s\n",
1099 if (!ndisc_parse_options(opt, optlen, &ndopts)) {
1100 ND_PRINTK(2, warn, "RA: invalid ND options\n");
1104 if (!ipv6_accept_ra(in6_dev))
1105 goto skip_linkparms;
1107 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1108 /* skip link-specific parameters from interior routers */
1109 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT)
1110 goto skip_linkparms;
1113 if (in6_dev->if_flags & IF_RS_SENT) {
1115 * flag that an RA was received after an RS was sent
1116 * out on this interface.
1118 in6_dev->if_flags |= IF_RA_RCVD;
1122 * Remember the managed/otherconf flags from most recently
1123 * received RA message (RFC 2462) -- yoshfuji
1125 in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED |
1127 (ra_msg->icmph.icmp6_addrconf_managed ?
1128 IF_RA_MANAGED : 0) |
1129 (ra_msg->icmph.icmp6_addrconf_other ?
1130 IF_RA_OTHERCONF : 0);
1132 if (!in6_dev->cnf.accept_ra_defrtr)
1135 if (ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, NULL, 0))
1138 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
1140 #ifdef CONFIG_IPV6_ROUTER_PREF
1141 pref = ra_msg->icmph.icmp6_router_pref;
1142 /* 10b is handled as if it were 00b (medium) */
1143 if (pref == ICMPV6_ROUTER_PREF_INVALID ||
1144 !in6_dev->cnf.accept_ra_rtr_pref)
1145 pref = ICMPV6_ROUTER_PREF_MEDIUM;
1148 rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
1151 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1154 "RA: %s got default router without neighbour\n",
1160 if (rt && lifetime == 0) {
1165 if (rt == NULL && lifetime) {
1166 ND_PRINTK(3, dbg, "RA: adding default router\n");
1168 rt = rt6_add_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev, pref);
1171 "RA: %s failed to add default route\n",
1176 neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1177 if (neigh == NULL) {
1179 "RA: %s got default router without neighbour\n",
1184 neigh->flags |= NTF_ROUTER;
1186 rt->rt6i_flags = (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
1190 rt6_set_expires(rt, jiffies + (HZ * lifetime));
1191 if (ra_msg->icmph.icmp6_hop_limit) {
1192 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
1194 dst_metric_set(&rt->dst, RTAX_HOPLIMIT,
1195 ra_msg->icmph.icmp6_hop_limit);
1201 * Update Reachable Time and Retrans Timer
1204 if (in6_dev->nd_parms) {
1205 unsigned long rtime = ntohl(ra_msg->retrans_timer);
1207 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/HZ) {
1208 rtime = (rtime*HZ)/1000;
1211 in6_dev->nd_parms->retrans_time = rtime;
1212 in6_dev->tstamp = jiffies;
1213 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1216 rtime = ntohl(ra_msg->reachable_time);
1217 if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/(3*HZ)) {
1218 rtime = (rtime*HZ)/1000;
1223 if (rtime != in6_dev->nd_parms->base_reachable_time) {
1224 in6_dev->nd_parms->base_reachable_time = rtime;
1225 in6_dev->nd_parms->gc_staletime = 3 * rtime;
1226 in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime);
1227 in6_dev->tstamp = jiffies;
1228 inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1240 neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr,
1244 if (ndopts.nd_opts_src_lladdr) {
1245 lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1249 "RA: invalid link-layer address length\n");
1253 neigh_update(neigh, lladdr, NUD_STALE,
1254 NEIGH_UPDATE_F_WEAK_OVERRIDE|
1255 NEIGH_UPDATE_F_OVERRIDE|
1256 NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1257 NEIGH_UPDATE_F_ISROUTER);
1260 if (!ipv6_accept_ra(in6_dev))
1263 #ifdef CONFIG_IPV6_ROUTE_INFO
1264 if (ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, NULL, 0))
1265 goto skip_routeinfo;
1267 if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
1268 struct nd_opt_hdr *p;
1269 for (p = ndopts.nd_opts_ri;
1271 p = ndisc_next_option(p, ndopts.nd_opts_ri_end)) {
1272 struct route_info *ri = (struct route_info *)p;
1273 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1274 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT &&
1275 ri->prefix_len == 0)
1278 if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen)
1280 rt6_route_rcv(skb->dev, (u8*)p, (p->nd_opt_len) << 3,
1281 &ipv6_hdr(skb)->saddr);
1288 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1289 /* skip link-specific ndopts from interior routers */
1290 if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT)
1294 if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
1295 struct nd_opt_hdr *p;
1296 for (p = ndopts.nd_opts_pi;
1298 p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) {
1299 addrconf_prefix_rcv(skb->dev, (u8 *)p,
1300 (p->nd_opt_len) << 3,
1301 ndopts.nd_opts_src_lladdr != NULL);
1305 if (ndopts.nd_opts_mtu) {
1309 memcpy(&n, ((u8*)(ndopts.nd_opts_mtu+1))+2, sizeof(mtu));
1312 if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) {
1313 ND_PRINTK(2, warn, "RA: invalid mtu: %d\n", mtu);
1314 } else if (in6_dev->cnf.mtu6 != mtu) {
1315 in6_dev->cnf.mtu6 = mtu;
1318 dst_metric_set(&rt->dst, RTAX_MTU, mtu);
1320 rt6_mtu_change(skb->dev, mtu);
1324 if (ndopts.nd_useropts) {
1325 struct nd_opt_hdr *p;
1326 for (p = ndopts.nd_useropts;
1328 p = ndisc_next_useropt(p, ndopts.nd_useropts_end)) {
1329 ndisc_ra_useropt(skb, p);
1333 if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
1334 ND_PRINTK(2, warn, "RA: invalid RA options\n");
1339 neigh_release(neigh);
1342 static void ndisc_redirect_rcv(struct sk_buff *skb)
1345 struct ndisc_options ndopts;
1346 struct rd_msg *msg = (struct rd_msg *)skb_transport_header(skb);
1347 u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
1348 offsetof(struct rd_msg, opt));
1350 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1351 switch (skb->ndisc_nodetype) {
1352 case NDISC_NODETYPE_HOST:
1353 case NDISC_NODETYPE_NODEFAULT:
1355 "Redirect: from host or unauthorized router\n");
1360 if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1362 "Redirect: source address is not link-local\n");
1366 if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts))
1369 if (!ndopts.nd_opts_rh) {
1370 ip6_redirect_no_header(skb, dev_net(skb->dev), 0, 0);
1374 hdr = (u8 *)ndopts.nd_opts_rh;
1376 if (!pskb_pull(skb, hdr - skb_transport_header(skb)))
1379 icmpv6_notify(skb, NDISC_REDIRECT, 0, 0);
1382 static void ndisc_fill_redirect_hdr_option(struct sk_buff *skb,
1383 struct sk_buff *orig_skb,
1386 u8 *opt = skb_put(skb, rd_len);
1389 *(opt++) = ND_OPT_REDIRECT_HDR;
1390 *(opt++) = (rd_len >> 3);
1393 memcpy(opt, ipv6_hdr(orig_skb), rd_len - 8);
1396 void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
1398 struct net_device *dev = skb->dev;
1399 struct net *net = dev_net(dev);
1400 struct sock *sk = net->ipv6.ndisc_sk;
1402 struct inet_peer *peer;
1403 struct sk_buff *buff;
1405 struct in6_addr saddr_buf;
1406 struct rt6_info *rt;
1407 struct dst_entry *dst;
1410 u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
1413 if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) {
1414 ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n",
1419 if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
1420 ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
1422 "Redirect: target address is not link-local unicast\n");
1426 icmpv6_flow_init(sk, &fl6, NDISC_REDIRECT,
1427 &saddr_buf, &ipv6_hdr(skb)->saddr, dev->ifindex);
1429 dst = ip6_route_output(net, NULL, &fl6);
1434 dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), NULL, 0);
1438 rt = (struct rt6_info *) dst;
1440 if (rt->rt6i_flags & RTF_GATEWAY) {
1442 "Redirect: destination is not a neighbour\n");
1445 peer = inet_getpeer_v6(net->ipv6.peers, &rt->rt6i_dst.addr, 1);
1446 ret = inet_peer_xrlim_allow(peer, 1*HZ);
1452 if (dev->addr_len) {
1453 struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target);
1456 "Redirect: no neigh for target address\n");
1460 read_lock_bh(&neigh->lock);
1461 if (neigh->nud_state & NUD_VALID) {
1462 memcpy(ha_buf, neigh->ha, dev->addr_len);
1463 read_unlock_bh(&neigh->lock);
1465 optlen += ndisc_opt_addr_space(dev);
1467 read_unlock_bh(&neigh->lock);
1469 neigh_release(neigh);
1472 rd_len = min_t(unsigned int,
1473 IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(*msg) - optlen,
1478 buff = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
1482 msg = (struct rd_msg *)skb_put(buff, sizeof(*msg));
1483 *msg = (struct rd_msg) {
1485 .icmp6_type = NDISC_REDIRECT,
1488 .dest = ipv6_hdr(skb)->daddr,
1492 * include target_address option
1496 ndisc_fill_addr_option(buff, ND_OPT_TARGET_LL_ADDR, ha);
1499 * build redirect option and copy skb over to the new packet.
1503 ndisc_fill_redirect_hdr_option(buff, skb, rd_len);
1505 skb_dst_set(buff, dst);
1506 ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf);
1513 static void pndisc_redo(struct sk_buff *skb)
1519 static bool ndisc_suppress_frag_ndisc(struct sk_buff *skb)
1521 struct inet6_dev *idev = __in6_dev_get(skb->dev);
1525 if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED &&
1526 idev->cnf.suppress_frag_ndisc) {
1527 net_warn_ratelimited("Received fragmented ndisc packet. Carefully consider disabling suppress_frag_ndisc.\n");
1533 int ndisc_rcv(struct sk_buff *skb)
1537 if (ndisc_suppress_frag_ndisc(skb))
1540 if (skb_linearize(skb))
1543 msg = (struct nd_msg *)skb_transport_header(skb);
1545 __skb_push(skb, skb->data - skb_transport_header(skb));
1547 if (ipv6_hdr(skb)->hop_limit != 255) {
1548 ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n",
1549 ipv6_hdr(skb)->hop_limit);
1553 if (msg->icmph.icmp6_code != 0) {
1554 ND_PRINTK(2, warn, "NDISC: invalid ICMPv6 code: %d\n",
1555 msg->icmph.icmp6_code);
1559 memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
1561 switch (msg->icmph.icmp6_type) {
1562 case NDISC_NEIGHBOUR_SOLICITATION:
1566 case NDISC_NEIGHBOUR_ADVERTISEMENT:
1570 case NDISC_ROUTER_SOLICITATION:
1574 case NDISC_ROUTER_ADVERTISEMENT:
1575 ndisc_router_discovery(skb);
1578 case NDISC_REDIRECT:
1579 ndisc_redirect_rcv(skb);
1586 static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1588 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1589 struct net *net = dev_net(dev);
1590 struct inet6_dev *idev;
1593 case NETDEV_CHANGEADDR:
1594 neigh_changeaddr(&nd_tbl, dev);
1595 fib6_run_gc(0, net, false);
1596 idev = in6_dev_get(dev);
1599 if (idev->cnf.ndisc_notify)
1600 ndisc_send_unsol_na(dev);
1604 neigh_ifdown(&nd_tbl, dev);
1605 fib6_run_gc(0, net, false);
1607 case NETDEV_NOTIFY_PEERS:
1608 ndisc_send_unsol_na(dev);
1617 static struct notifier_block ndisc_netdev_notifier = {
1618 .notifier_call = ndisc_netdev_event,
1621 #ifdef CONFIG_SYSCTL
1622 static void ndisc_warn_deprecated_sysctl(struct ctl_table *ctl,
1623 const char *func, const char *dev_name)
1625 static char warncomm[TASK_COMM_LEN];
1627 if (strcmp(warncomm, current->comm) && warned < 5) {
1628 strcpy(warncomm, current->comm);
1629 pr_warn("process `%s' is using deprecated sysctl (%s) net.ipv6.neigh.%s.%s - use net.ipv6.neigh.%s.%s_ms instead\n",
1631 dev_name, ctl->procname,
1632 dev_name, ctl->procname);
1637 int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void __user *buffer, size_t *lenp, loff_t *ppos)
1639 struct net_device *dev = ctl->extra1;
1640 struct inet6_dev *idev;
1643 if ((strcmp(ctl->procname, "retrans_time") == 0) ||
1644 (strcmp(ctl->procname, "base_reachable_time") == 0))
1645 ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default");
1647 if (strcmp(ctl->procname, "retrans_time") == 0)
1648 ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
1650 else if (strcmp(ctl->procname, "base_reachable_time") == 0)
1651 ret = proc_dointvec_jiffies(ctl, write,
1652 buffer, lenp, ppos);
1654 else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) ||
1655 (strcmp(ctl->procname, "base_reachable_time_ms") == 0))
1656 ret = proc_dointvec_ms_jiffies(ctl, write,
1657 buffer, lenp, ppos);
1661 if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) {
1662 if (ctl->data == &idev->nd_parms->base_reachable_time)
1663 idev->nd_parms->reachable_time = neigh_rand_reach_time(idev->nd_parms->base_reachable_time);
1664 idev->tstamp = jiffies;
1665 inet6_ifinfo_notify(RTM_NEWLINK, idev);
1674 static int __net_init ndisc_net_init(struct net *net)
1676 struct ipv6_pinfo *np;
1680 err = inet_ctl_sock_create(&sk, PF_INET6,
1681 SOCK_RAW, IPPROTO_ICMPV6, net);
1684 "NDISC: Failed to initialize the control socket (err %d)\n",
1689 net->ipv6.ndisc_sk = sk;
1692 np->hop_limit = 255;
1693 /* Do not loopback ndisc messages */
1699 static void __net_exit ndisc_net_exit(struct net *net)
1701 inet_ctl_sock_destroy(net->ipv6.ndisc_sk);
1704 static struct pernet_operations ndisc_net_ops = {
1705 .init = ndisc_net_init,
1706 .exit = ndisc_net_exit,
1709 int __init ndisc_init(void)
1713 err = register_pernet_subsys(&ndisc_net_ops);
1717 * Initialize the neighbour table
1719 neigh_table_init(&nd_tbl);
1721 #ifdef CONFIG_SYSCTL
1722 err = neigh_sysctl_register(NULL, &nd_tbl.parms, "ipv6",
1723 &ndisc_ifinfo_sysctl_change);
1725 goto out_unregister_pernet;
1727 err = register_netdevice_notifier(&ndisc_netdev_notifier);
1729 goto out_unregister_sysctl;
1733 out_unregister_sysctl:
1734 #ifdef CONFIG_SYSCTL
1735 neigh_sysctl_unregister(&nd_tbl.parms);
1736 out_unregister_pernet:
1738 unregister_pernet_subsys(&ndisc_net_ops);
1742 void ndisc_cleanup(void)
1744 unregister_netdevice_notifier(&ndisc_netdev_notifier);
1745 #ifdef CONFIG_SYSCTL
1746 neigh_sysctl_unregister(&nd_tbl.parms);
1748 neigh_table_clear(&nd_tbl);
1749 unregister_pernet_subsys(&ndisc_net_ops);