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