xref: /openbmc/linux/net/ipv6/ndisc.c (revision a8da474e)
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 		   struct sk_buff *oskb)
561 {
562 	struct sk_buff *skb;
563 	struct in6_addr addr_buf;
564 	int inc_opt = dev->addr_len;
565 	int optlen = 0;
566 	struct nd_msg *msg;
567 
568 	if (!saddr) {
569 		if (ipv6_get_lladdr(dev, &addr_buf,
570 				   (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)))
571 			return;
572 		saddr = &addr_buf;
573 	}
574 
575 	if (ipv6_addr_any(saddr))
576 		inc_opt = false;
577 	if (inc_opt)
578 		optlen += ndisc_opt_addr_space(dev);
579 
580 	skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
581 	if (!skb)
582 		return;
583 
584 	msg = (struct nd_msg *)skb_put(skb, sizeof(*msg));
585 	*msg = (struct nd_msg) {
586 		.icmph = {
587 			.icmp6_type = NDISC_NEIGHBOUR_SOLICITATION,
588 		},
589 		.target = *solicit,
590 	};
591 
592 	if (inc_opt)
593 		ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR,
594 				       dev->dev_addr);
595 
596 	if (!(dev->priv_flags & IFF_XMIT_DST_RELEASE) && oskb)
597 		skb_dst_copy(skb, oskb);
598 
599 	ndisc_send_skb(skb, daddr, saddr);
600 }
601 
602 void ndisc_send_rs(struct net_device *dev, const struct in6_addr *saddr,
603 		   const struct in6_addr *daddr)
604 {
605 	struct sk_buff *skb;
606 	struct rs_msg *msg;
607 	int send_sllao = dev->addr_len;
608 	int optlen = 0;
609 
610 #ifdef CONFIG_IPV6_OPTIMISTIC_DAD
611 	/*
612 	 * According to section 2.2 of RFC 4429, we must not
613 	 * send router solicitations with a sllao from
614 	 * optimistic addresses, but we may send the solicitation
615 	 * if we don't include the sllao.  So here we check
616 	 * if our address is optimistic, and if so, we
617 	 * suppress the inclusion of the sllao.
618 	 */
619 	if (send_sllao) {
620 		struct inet6_ifaddr *ifp = ipv6_get_ifaddr(dev_net(dev), saddr,
621 							   dev, 1);
622 		if (ifp) {
623 			if (ifp->flags & IFA_F_OPTIMISTIC)  {
624 				send_sllao = 0;
625 			}
626 			in6_ifa_put(ifp);
627 		} else {
628 			send_sllao = 0;
629 		}
630 	}
631 #endif
632 	if (send_sllao)
633 		optlen += ndisc_opt_addr_space(dev);
634 
635 	skb = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
636 	if (!skb)
637 		return;
638 
639 	msg = (struct rs_msg *)skb_put(skb, sizeof(*msg));
640 	*msg = (struct rs_msg) {
641 		.icmph = {
642 			.icmp6_type = NDISC_ROUTER_SOLICITATION,
643 		},
644 	};
645 
646 	if (send_sllao)
647 		ndisc_fill_addr_option(skb, ND_OPT_SOURCE_LL_ADDR,
648 				       dev->dev_addr);
649 
650 	ndisc_send_skb(skb, daddr, saddr);
651 }
652 
653 
654 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb)
655 {
656 	/*
657 	 *	"The sender MUST return an ICMP
658 	 *	 destination unreachable"
659 	 */
660 	dst_link_failure(skb);
661 	kfree_skb(skb);
662 }
663 
664 /* Called with locked neigh: either read or both */
665 
666 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb)
667 {
668 	struct in6_addr *saddr = NULL;
669 	struct in6_addr mcaddr;
670 	struct net_device *dev = neigh->dev;
671 	struct in6_addr *target = (struct in6_addr *)&neigh->primary_key;
672 	int probes = atomic_read(&neigh->probes);
673 
674 	if (skb && ipv6_chk_addr_and_flags(dev_net(dev), &ipv6_hdr(skb)->saddr,
675 					   dev, 1,
676 					   IFA_F_TENTATIVE|IFA_F_OPTIMISTIC))
677 		saddr = &ipv6_hdr(skb)->saddr;
678 	probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES);
679 	if (probes < 0) {
680 		if (!(neigh->nud_state & NUD_VALID)) {
681 			ND_PRINTK(1, dbg,
682 				  "%s: trying to ucast probe in NUD_INVALID: %pI6\n",
683 				  __func__, target);
684 		}
685 		ndisc_send_ns(dev, target, target, saddr, skb);
686 	} else if ((probes -= NEIGH_VAR(neigh->parms, APP_PROBES)) < 0) {
687 		neigh_app_ns(neigh);
688 	} else {
689 		addrconf_addr_solict_mult(target, &mcaddr);
690 		ndisc_send_ns(dev, target, &mcaddr, saddr, skb);
691 	}
692 }
693 
694 static int pndisc_is_router(const void *pkey,
695 			    struct net_device *dev)
696 {
697 	struct pneigh_entry *n;
698 	int ret = -1;
699 
700 	read_lock_bh(&nd_tbl.lock);
701 	n = __pneigh_lookup(&nd_tbl, dev_net(dev), pkey, dev);
702 	if (n)
703 		ret = !!(n->flags & NTF_ROUTER);
704 	read_unlock_bh(&nd_tbl.lock);
705 
706 	return ret;
707 }
708 
709 static void ndisc_recv_ns(struct sk_buff *skb)
710 {
711 	struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
712 	const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
713 	const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
714 	u8 *lladdr = NULL;
715 	u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
716 				    offsetof(struct nd_msg, opt));
717 	struct ndisc_options ndopts;
718 	struct net_device *dev = skb->dev;
719 	struct inet6_ifaddr *ifp;
720 	struct inet6_dev *idev = NULL;
721 	struct neighbour *neigh;
722 	int dad = ipv6_addr_any(saddr);
723 	bool inc;
724 	int is_router = -1;
725 
726 	if (skb->len < sizeof(struct nd_msg)) {
727 		ND_PRINTK(2, warn, "NS: packet too short\n");
728 		return;
729 	}
730 
731 	if (ipv6_addr_is_multicast(&msg->target)) {
732 		ND_PRINTK(2, warn, "NS: multicast target address\n");
733 		return;
734 	}
735 
736 	/*
737 	 * RFC2461 7.1.1:
738 	 * DAD has to be destined for solicited node multicast address.
739 	 */
740 	if (dad && !ipv6_addr_is_solict_mult(daddr)) {
741 		ND_PRINTK(2, warn, "NS: bad DAD packet (wrong destination)\n");
742 		return;
743 	}
744 
745 	if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
746 		ND_PRINTK(2, warn, "NS: invalid ND options\n");
747 		return;
748 	}
749 
750 	if (ndopts.nd_opts_src_lladdr) {
751 		lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr, dev);
752 		if (!lladdr) {
753 			ND_PRINTK(2, warn,
754 				  "NS: invalid link-layer address length\n");
755 			return;
756 		}
757 
758 		/* RFC2461 7.1.1:
759 		 *	If the IP source address is the unspecified address,
760 		 *	there MUST NOT be source link-layer address option
761 		 *	in the message.
762 		 */
763 		if (dad) {
764 			ND_PRINTK(2, warn,
765 				  "NS: bad DAD packet (link-layer address option)\n");
766 			return;
767 		}
768 	}
769 
770 	inc = ipv6_addr_is_multicast(daddr);
771 
772 	ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
773 	if (ifp) {
774 have_ifp:
775 		if (ifp->flags & (IFA_F_TENTATIVE|IFA_F_OPTIMISTIC)) {
776 			if (dad) {
777 				/*
778 				 * We are colliding with another node
779 				 * who is doing DAD
780 				 * so fail our DAD process
781 				 */
782 				addrconf_dad_failure(ifp);
783 				return;
784 			} else {
785 				/*
786 				 * This is not a dad solicitation.
787 				 * If we are an optimistic node,
788 				 * we should respond.
789 				 * Otherwise, we should ignore it.
790 				 */
791 				if (!(ifp->flags & IFA_F_OPTIMISTIC))
792 					goto out;
793 			}
794 		}
795 
796 		idev = ifp->idev;
797 	} else {
798 		struct net *net = dev_net(dev);
799 
800 		/* perhaps an address on the master device */
801 		if (netif_is_l3_slave(dev)) {
802 			struct net_device *mdev;
803 
804 			mdev = netdev_master_upper_dev_get_rcu(dev);
805 			if (mdev) {
806 				ifp = ipv6_get_ifaddr(net, &msg->target, mdev, 1);
807 				if (ifp)
808 					goto have_ifp;
809 			}
810 		}
811 
812 		idev = in6_dev_get(dev);
813 		if (!idev) {
814 			/* XXX: count this drop? */
815 			return;
816 		}
817 
818 		if (ipv6_chk_acast_addr(net, dev, &msg->target) ||
819 		    (idev->cnf.forwarding &&
820 		     (net->ipv6.devconf_all->proxy_ndp || idev->cnf.proxy_ndp) &&
821 		     (is_router = pndisc_is_router(&msg->target, dev)) >= 0)) {
822 			if (!(NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED) &&
823 			    skb->pkt_type != PACKET_HOST &&
824 			    inc &&
825 			    NEIGH_VAR(idev->nd_parms, PROXY_DELAY) != 0) {
826 				/*
827 				 * for anycast or proxy,
828 				 * sender should delay its response
829 				 * by a random time between 0 and
830 				 * MAX_ANYCAST_DELAY_TIME seconds.
831 				 * (RFC2461) -- yoshfuji
832 				 */
833 				struct sk_buff *n = skb_clone(skb, GFP_ATOMIC);
834 				if (n)
835 					pneigh_enqueue(&nd_tbl, idev->nd_parms, n);
836 				goto out;
837 			}
838 		} else
839 			goto out;
840 	}
841 
842 	if (is_router < 0)
843 		is_router = idev->cnf.forwarding;
844 
845 	if (dad) {
846 		ndisc_send_na(dev, &in6addr_linklocal_allnodes, &msg->target,
847 			      !!is_router, false, (ifp != NULL), true);
848 		goto out;
849 	}
850 
851 	if (inc)
852 		NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_mcast);
853 	else
854 		NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast);
855 
856 	/*
857 	 *	update / create cache entry
858 	 *	for the source address
859 	 */
860 	neigh = __neigh_lookup(&nd_tbl, saddr, dev,
861 			       !inc || lladdr || !dev->addr_len);
862 	if (neigh)
863 		neigh_update(neigh, lladdr, NUD_STALE,
864 			     NEIGH_UPDATE_F_WEAK_OVERRIDE|
865 			     NEIGH_UPDATE_F_OVERRIDE);
866 	if (neigh || !dev->header_ops) {
867 		ndisc_send_na(dev, saddr, &msg->target, !!is_router,
868 			      true, (ifp != NULL && inc), inc);
869 		if (neigh)
870 			neigh_release(neigh);
871 	}
872 
873 out:
874 	if (ifp)
875 		in6_ifa_put(ifp);
876 	else
877 		in6_dev_put(idev);
878 }
879 
880 static void ndisc_recv_na(struct sk_buff *skb)
881 {
882 	struct nd_msg *msg = (struct nd_msg *)skb_transport_header(skb);
883 	struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
884 	const struct in6_addr *daddr = &ipv6_hdr(skb)->daddr;
885 	u8 *lladdr = NULL;
886 	u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
887 				    offsetof(struct nd_msg, opt));
888 	struct ndisc_options ndopts;
889 	struct net_device *dev = skb->dev;
890 	struct inet6_ifaddr *ifp;
891 	struct neighbour *neigh;
892 
893 	if (skb->len < sizeof(struct nd_msg)) {
894 		ND_PRINTK(2, warn, "NA: packet too short\n");
895 		return;
896 	}
897 
898 	if (ipv6_addr_is_multicast(&msg->target)) {
899 		ND_PRINTK(2, warn, "NA: target address is multicast\n");
900 		return;
901 	}
902 
903 	if (ipv6_addr_is_multicast(daddr) &&
904 	    msg->icmph.icmp6_solicited) {
905 		ND_PRINTK(2, warn, "NA: solicited NA is multicasted\n");
906 		return;
907 	}
908 
909 	if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
910 		ND_PRINTK(2, warn, "NS: invalid ND option\n");
911 		return;
912 	}
913 	if (ndopts.nd_opts_tgt_lladdr) {
914 		lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr, dev);
915 		if (!lladdr) {
916 			ND_PRINTK(2, warn,
917 				  "NA: invalid link-layer address length\n");
918 			return;
919 		}
920 	}
921 	ifp = ipv6_get_ifaddr(dev_net(dev), &msg->target, dev, 1);
922 	if (ifp) {
923 		if (skb->pkt_type != PACKET_LOOPBACK
924 		    && (ifp->flags & IFA_F_TENTATIVE)) {
925 				addrconf_dad_failure(ifp);
926 				return;
927 		}
928 		/* What should we make now? The advertisement
929 		   is invalid, but ndisc specs say nothing
930 		   about it. It could be misconfiguration, or
931 		   an smart proxy agent tries to help us :-)
932 
933 		   We should not print the error if NA has been
934 		   received from loopback - it is just our own
935 		   unsolicited advertisement.
936 		 */
937 		if (skb->pkt_type != PACKET_LOOPBACK)
938 			ND_PRINTK(1, warn,
939 				  "NA: someone advertises our address %pI6 on %s!\n",
940 				  &ifp->addr, ifp->idev->dev->name);
941 		in6_ifa_put(ifp);
942 		return;
943 	}
944 	neigh = neigh_lookup(&nd_tbl, &msg->target, dev);
945 
946 	if (neigh) {
947 		u8 old_flags = neigh->flags;
948 		struct net *net = dev_net(dev);
949 
950 		if (neigh->nud_state & NUD_FAILED)
951 			goto out;
952 
953 		/*
954 		 * Don't update the neighbor cache entry on a proxy NA from
955 		 * ourselves because either the proxied node is off link or it
956 		 * has already sent a NA to us.
957 		 */
958 		if (lladdr && !memcmp(lladdr, dev->dev_addr, dev->addr_len) &&
959 		    net->ipv6.devconf_all->forwarding && net->ipv6.devconf_all->proxy_ndp &&
960 		    pneigh_lookup(&nd_tbl, net, &msg->target, dev, 0)) {
961 			/* XXX: idev->cnf.proxy_ndp */
962 			goto out;
963 		}
964 
965 		neigh_update(neigh, lladdr,
966 			     msg->icmph.icmp6_solicited ? NUD_REACHABLE : NUD_STALE,
967 			     NEIGH_UPDATE_F_WEAK_OVERRIDE|
968 			     (msg->icmph.icmp6_override ? NEIGH_UPDATE_F_OVERRIDE : 0)|
969 			     NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
970 			     (msg->icmph.icmp6_router ? NEIGH_UPDATE_F_ISROUTER : 0));
971 
972 		if ((old_flags & ~neigh->flags) & NTF_ROUTER) {
973 			/*
974 			 * Change: router to host
975 			 */
976 			rt6_clean_tohost(dev_net(dev),  saddr);
977 		}
978 
979 out:
980 		neigh_release(neigh);
981 	}
982 }
983 
984 static void ndisc_recv_rs(struct sk_buff *skb)
985 {
986 	struct rs_msg *rs_msg = (struct rs_msg *)skb_transport_header(skb);
987 	unsigned long ndoptlen = skb->len - sizeof(*rs_msg);
988 	struct neighbour *neigh;
989 	struct inet6_dev *idev;
990 	const struct in6_addr *saddr = &ipv6_hdr(skb)->saddr;
991 	struct ndisc_options ndopts;
992 	u8 *lladdr = NULL;
993 
994 	if (skb->len < sizeof(*rs_msg))
995 		return;
996 
997 	idev = __in6_dev_get(skb->dev);
998 	if (!idev) {
999 		ND_PRINTK(1, err, "RS: can't find in6 device\n");
1000 		return;
1001 	}
1002 
1003 	/* Don't accept RS if we're not in router mode */
1004 	if (!idev->cnf.forwarding)
1005 		goto out;
1006 
1007 	/*
1008 	 * Don't update NCE if src = ::;
1009 	 * this implies that the source node has no ip address assigned yet.
1010 	 */
1011 	if (ipv6_addr_any(saddr))
1012 		goto out;
1013 
1014 	/* Parse ND options */
1015 	if (!ndisc_parse_options(rs_msg->opt, ndoptlen, &ndopts)) {
1016 		ND_PRINTK(2, notice, "NS: invalid ND option, ignored\n");
1017 		goto out;
1018 	}
1019 
1020 	if (ndopts.nd_opts_src_lladdr) {
1021 		lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1022 					     skb->dev);
1023 		if (!lladdr)
1024 			goto out;
1025 	}
1026 
1027 	neigh = __neigh_lookup(&nd_tbl, saddr, skb->dev, 1);
1028 	if (neigh) {
1029 		neigh_update(neigh, lladdr, NUD_STALE,
1030 			     NEIGH_UPDATE_F_WEAK_OVERRIDE|
1031 			     NEIGH_UPDATE_F_OVERRIDE|
1032 			     NEIGH_UPDATE_F_OVERRIDE_ISROUTER);
1033 		neigh_release(neigh);
1034 	}
1035 out:
1036 	return;
1037 }
1038 
1039 static void ndisc_ra_useropt(struct sk_buff *ra, struct nd_opt_hdr *opt)
1040 {
1041 	struct icmp6hdr *icmp6h = (struct icmp6hdr *)skb_transport_header(ra);
1042 	struct sk_buff *skb;
1043 	struct nlmsghdr *nlh;
1044 	struct nduseroptmsg *ndmsg;
1045 	struct net *net = dev_net(ra->dev);
1046 	int err;
1047 	int base_size = NLMSG_ALIGN(sizeof(struct nduseroptmsg)
1048 				    + (opt->nd_opt_len << 3));
1049 	size_t msg_size = base_size + nla_total_size(sizeof(struct in6_addr));
1050 
1051 	skb = nlmsg_new(msg_size, GFP_ATOMIC);
1052 	if (!skb) {
1053 		err = -ENOBUFS;
1054 		goto errout;
1055 	}
1056 
1057 	nlh = nlmsg_put(skb, 0, 0, RTM_NEWNDUSEROPT, base_size, 0);
1058 	if (!nlh) {
1059 		goto nla_put_failure;
1060 	}
1061 
1062 	ndmsg = nlmsg_data(nlh);
1063 	ndmsg->nduseropt_family = AF_INET6;
1064 	ndmsg->nduseropt_ifindex = ra->dev->ifindex;
1065 	ndmsg->nduseropt_icmp_type = icmp6h->icmp6_type;
1066 	ndmsg->nduseropt_icmp_code = icmp6h->icmp6_code;
1067 	ndmsg->nduseropt_opts_len = opt->nd_opt_len << 3;
1068 
1069 	memcpy(ndmsg + 1, opt, opt->nd_opt_len << 3);
1070 
1071 	if (nla_put_in6_addr(skb, NDUSEROPT_SRCADDR, &ipv6_hdr(ra)->saddr))
1072 		goto nla_put_failure;
1073 	nlmsg_end(skb, nlh);
1074 
1075 	rtnl_notify(skb, net, 0, RTNLGRP_ND_USEROPT, NULL, GFP_ATOMIC);
1076 	return;
1077 
1078 nla_put_failure:
1079 	nlmsg_free(skb);
1080 	err = -EMSGSIZE;
1081 errout:
1082 	rtnl_set_sk_err(net, RTNLGRP_ND_USEROPT, err);
1083 }
1084 
1085 static void ndisc_router_discovery(struct sk_buff *skb)
1086 {
1087 	struct ra_msg *ra_msg = (struct ra_msg *)skb_transport_header(skb);
1088 	struct neighbour *neigh = NULL;
1089 	struct inet6_dev *in6_dev;
1090 	struct rt6_info *rt = NULL;
1091 	int lifetime;
1092 	struct ndisc_options ndopts;
1093 	int optlen;
1094 	unsigned int pref = 0;
1095 	__u32 old_if_flags;
1096 	bool send_ifinfo_notify = false;
1097 
1098 	__u8 *opt = (__u8 *)(ra_msg + 1);
1099 
1100 	optlen = (skb_tail_pointer(skb) - skb_transport_header(skb)) -
1101 		sizeof(struct ra_msg);
1102 
1103 	ND_PRINTK(2, info,
1104 		  "RA: %s, dev: %s\n",
1105 		  __func__, skb->dev->name);
1106 	if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1107 		ND_PRINTK(2, warn, "RA: source address is not link-local\n");
1108 		return;
1109 	}
1110 	if (optlen < 0) {
1111 		ND_PRINTK(2, warn, "RA: packet too short\n");
1112 		return;
1113 	}
1114 
1115 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1116 	if (skb->ndisc_nodetype == NDISC_NODETYPE_HOST) {
1117 		ND_PRINTK(2, warn, "RA: from host or unauthorized router\n");
1118 		return;
1119 	}
1120 #endif
1121 
1122 	/*
1123 	 *	set the RA_RECV flag in the interface
1124 	 */
1125 
1126 	in6_dev = __in6_dev_get(skb->dev);
1127 	if (!in6_dev) {
1128 		ND_PRINTK(0, err, "RA: can't find inet6 device for %s\n",
1129 			  skb->dev->name);
1130 		return;
1131 	}
1132 
1133 	if (!ndisc_parse_options(opt, optlen, &ndopts)) {
1134 		ND_PRINTK(2, warn, "RA: invalid ND options\n");
1135 		return;
1136 	}
1137 
1138 	if (!ipv6_accept_ra(in6_dev)) {
1139 		ND_PRINTK(2, info,
1140 			  "RA: %s, did not accept ra for dev: %s\n",
1141 			  __func__, skb->dev->name);
1142 		goto skip_linkparms;
1143 	}
1144 
1145 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1146 	/* skip link-specific parameters from interior routers */
1147 	if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) {
1148 		ND_PRINTK(2, info,
1149 			  "RA: %s, nodetype is NODEFAULT, dev: %s\n",
1150 			  __func__, skb->dev->name);
1151 		goto skip_linkparms;
1152 	}
1153 #endif
1154 
1155 	if (in6_dev->if_flags & IF_RS_SENT) {
1156 		/*
1157 		 *	flag that an RA was received after an RS was sent
1158 		 *	out on this interface.
1159 		 */
1160 		in6_dev->if_flags |= IF_RA_RCVD;
1161 	}
1162 
1163 	/*
1164 	 * Remember the managed/otherconf flags from most recently
1165 	 * received RA message (RFC 2462) -- yoshfuji
1166 	 */
1167 	old_if_flags = in6_dev->if_flags;
1168 	in6_dev->if_flags = (in6_dev->if_flags & ~(IF_RA_MANAGED |
1169 				IF_RA_OTHERCONF)) |
1170 				(ra_msg->icmph.icmp6_addrconf_managed ?
1171 					IF_RA_MANAGED : 0) |
1172 				(ra_msg->icmph.icmp6_addrconf_other ?
1173 					IF_RA_OTHERCONF : 0);
1174 
1175 	if (old_if_flags != in6_dev->if_flags)
1176 		send_ifinfo_notify = true;
1177 
1178 	if (!in6_dev->cnf.accept_ra_defrtr) {
1179 		ND_PRINTK(2, info,
1180 			  "RA: %s, defrtr is false for dev: %s\n",
1181 			  __func__, skb->dev->name);
1182 		goto skip_defrtr;
1183 	}
1184 
1185 	/* Do not accept RA with source-addr found on local machine unless
1186 	 * accept_ra_from_local is set to true.
1187 	 */
1188 	if (!in6_dev->cnf.accept_ra_from_local &&
1189 	    ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
1190 			  NULL, 0)) {
1191 		ND_PRINTK(2, info,
1192 			  "RA from local address detected on dev: %s: default router ignored\n",
1193 			  skb->dev->name);
1194 		goto skip_defrtr;
1195 	}
1196 
1197 	lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
1198 
1199 #ifdef CONFIG_IPV6_ROUTER_PREF
1200 	pref = ra_msg->icmph.icmp6_router_pref;
1201 	/* 10b is handled as if it were 00b (medium) */
1202 	if (pref == ICMPV6_ROUTER_PREF_INVALID ||
1203 	    !in6_dev->cnf.accept_ra_rtr_pref)
1204 		pref = ICMPV6_ROUTER_PREF_MEDIUM;
1205 #endif
1206 
1207 	rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
1208 
1209 	if (rt) {
1210 		neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1211 		if (!neigh) {
1212 			ND_PRINTK(0, err,
1213 				  "RA: %s got default router without neighbour\n",
1214 				  __func__);
1215 			ip6_rt_put(rt);
1216 			return;
1217 		}
1218 	}
1219 	if (rt && lifetime == 0) {
1220 		ip6_del_rt(rt);
1221 		rt = NULL;
1222 	}
1223 
1224 	ND_PRINTK(3, info, "RA: rt: %p  lifetime: %d, for dev: %s\n",
1225 		  rt, lifetime, skb->dev->name);
1226 	if (!rt && lifetime) {
1227 		ND_PRINTK(3, info, "RA: adding default router\n");
1228 
1229 		rt = rt6_add_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev, pref);
1230 		if (!rt) {
1231 			ND_PRINTK(0, err,
1232 				  "RA: %s failed to add default route\n",
1233 				  __func__);
1234 			return;
1235 		}
1236 
1237 		neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr);
1238 		if (!neigh) {
1239 			ND_PRINTK(0, err,
1240 				  "RA: %s got default router without neighbour\n",
1241 				  __func__);
1242 			ip6_rt_put(rt);
1243 			return;
1244 		}
1245 		neigh->flags |= NTF_ROUTER;
1246 	} else if (rt) {
1247 		rt->rt6i_flags = (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
1248 	}
1249 
1250 	if (rt)
1251 		rt6_set_expires(rt, jiffies + (HZ * lifetime));
1252 	if (in6_dev->cnf.accept_ra_min_hop_limit < 256 &&
1253 	    ra_msg->icmph.icmp6_hop_limit) {
1254 		if (in6_dev->cnf.accept_ra_min_hop_limit <= ra_msg->icmph.icmp6_hop_limit) {
1255 			in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
1256 			if (rt)
1257 				dst_metric_set(&rt->dst, RTAX_HOPLIMIT,
1258 					       ra_msg->icmph.icmp6_hop_limit);
1259 		} else {
1260 			ND_PRINTK(2, warn, "RA: Got route advertisement with lower hop_limit than minimum\n");
1261 		}
1262 	}
1263 
1264 skip_defrtr:
1265 
1266 	/*
1267 	 *	Update Reachable Time and Retrans Timer
1268 	 */
1269 
1270 	if (in6_dev->nd_parms) {
1271 		unsigned long rtime = ntohl(ra_msg->retrans_timer);
1272 
1273 		if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/HZ) {
1274 			rtime = (rtime*HZ)/1000;
1275 			if (rtime < HZ/10)
1276 				rtime = HZ/10;
1277 			NEIGH_VAR_SET(in6_dev->nd_parms, RETRANS_TIME, rtime);
1278 			in6_dev->tstamp = jiffies;
1279 			send_ifinfo_notify = true;
1280 		}
1281 
1282 		rtime = ntohl(ra_msg->reachable_time);
1283 		if (rtime && rtime/1000 < MAX_SCHEDULE_TIMEOUT/(3*HZ)) {
1284 			rtime = (rtime*HZ)/1000;
1285 
1286 			if (rtime < HZ/10)
1287 				rtime = HZ/10;
1288 
1289 			if (rtime != NEIGH_VAR(in6_dev->nd_parms, BASE_REACHABLE_TIME)) {
1290 				NEIGH_VAR_SET(in6_dev->nd_parms,
1291 					      BASE_REACHABLE_TIME, rtime);
1292 				NEIGH_VAR_SET(in6_dev->nd_parms,
1293 					      GC_STALETIME, 3 * rtime);
1294 				in6_dev->nd_parms->reachable_time = neigh_rand_reach_time(rtime);
1295 				in6_dev->tstamp = jiffies;
1296 				send_ifinfo_notify = true;
1297 			}
1298 		}
1299 	}
1300 
1301 	/*
1302 	 *	Send a notify if RA changed managed/otherconf flags or timer settings
1303 	 */
1304 	if (send_ifinfo_notify)
1305 		inet6_ifinfo_notify(RTM_NEWLINK, in6_dev);
1306 
1307 skip_linkparms:
1308 
1309 	/*
1310 	 *	Process options.
1311 	 */
1312 
1313 	if (!neigh)
1314 		neigh = __neigh_lookup(&nd_tbl, &ipv6_hdr(skb)->saddr,
1315 				       skb->dev, 1);
1316 	if (neigh) {
1317 		u8 *lladdr = NULL;
1318 		if (ndopts.nd_opts_src_lladdr) {
1319 			lladdr = ndisc_opt_addr_data(ndopts.nd_opts_src_lladdr,
1320 						     skb->dev);
1321 			if (!lladdr) {
1322 				ND_PRINTK(2, warn,
1323 					  "RA: invalid link-layer address length\n");
1324 				goto out;
1325 			}
1326 		}
1327 		neigh_update(neigh, lladdr, NUD_STALE,
1328 			     NEIGH_UPDATE_F_WEAK_OVERRIDE|
1329 			     NEIGH_UPDATE_F_OVERRIDE|
1330 			     NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
1331 			     NEIGH_UPDATE_F_ISROUTER);
1332 	}
1333 
1334 	if (!ipv6_accept_ra(in6_dev)) {
1335 		ND_PRINTK(2, info,
1336 			  "RA: %s, accept_ra is false for dev: %s\n",
1337 			  __func__, skb->dev->name);
1338 		goto out;
1339 	}
1340 
1341 #ifdef CONFIG_IPV6_ROUTE_INFO
1342 	if (!in6_dev->cnf.accept_ra_from_local &&
1343 	    ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr,
1344 			  NULL, 0)) {
1345 		ND_PRINTK(2, info,
1346 			  "RA from local address detected on dev: %s: router info ignored.\n",
1347 			  skb->dev->name);
1348 		goto skip_routeinfo;
1349 	}
1350 
1351 	if (in6_dev->cnf.accept_ra_rtr_pref && ndopts.nd_opts_ri) {
1352 		struct nd_opt_hdr *p;
1353 		for (p = ndopts.nd_opts_ri;
1354 		     p;
1355 		     p = ndisc_next_option(p, ndopts.nd_opts_ri_end)) {
1356 			struct route_info *ri = (struct route_info *)p;
1357 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1358 			if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT &&
1359 			    ri->prefix_len == 0)
1360 				continue;
1361 #endif
1362 			if (ri->prefix_len == 0 &&
1363 			    !in6_dev->cnf.accept_ra_defrtr)
1364 				continue;
1365 			if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen)
1366 				continue;
1367 			rt6_route_rcv(skb->dev, (u8 *)p, (p->nd_opt_len) << 3,
1368 				      &ipv6_hdr(skb)->saddr);
1369 		}
1370 	}
1371 
1372 skip_routeinfo:
1373 #endif
1374 
1375 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1376 	/* skip link-specific ndopts from interior routers */
1377 	if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) {
1378 		ND_PRINTK(2, info,
1379 			  "RA: %s, nodetype is NODEFAULT (interior routes), dev: %s\n",
1380 			  __func__, skb->dev->name);
1381 		goto out;
1382 	}
1383 #endif
1384 
1385 	if (in6_dev->cnf.accept_ra_pinfo && ndopts.nd_opts_pi) {
1386 		struct nd_opt_hdr *p;
1387 		for (p = ndopts.nd_opts_pi;
1388 		     p;
1389 		     p = ndisc_next_option(p, ndopts.nd_opts_pi_end)) {
1390 			addrconf_prefix_rcv(skb->dev, (u8 *)p,
1391 					    (p->nd_opt_len) << 3,
1392 					    ndopts.nd_opts_src_lladdr != NULL);
1393 		}
1394 	}
1395 
1396 	if (ndopts.nd_opts_mtu && in6_dev->cnf.accept_ra_mtu) {
1397 		__be32 n;
1398 		u32 mtu;
1399 
1400 		memcpy(&n, ((u8 *)(ndopts.nd_opts_mtu+1))+2, sizeof(mtu));
1401 		mtu = ntohl(n);
1402 
1403 		if (mtu < IPV6_MIN_MTU || mtu > skb->dev->mtu) {
1404 			ND_PRINTK(2, warn, "RA: invalid mtu: %d\n", mtu);
1405 		} else if (in6_dev->cnf.mtu6 != mtu) {
1406 			in6_dev->cnf.mtu6 = mtu;
1407 
1408 			if (rt)
1409 				dst_metric_set(&rt->dst, RTAX_MTU, mtu);
1410 
1411 			rt6_mtu_change(skb->dev, mtu);
1412 		}
1413 	}
1414 
1415 	if (ndopts.nd_useropts) {
1416 		struct nd_opt_hdr *p;
1417 		for (p = ndopts.nd_useropts;
1418 		     p;
1419 		     p = ndisc_next_useropt(p, ndopts.nd_useropts_end)) {
1420 			ndisc_ra_useropt(skb, p);
1421 		}
1422 	}
1423 
1424 	if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
1425 		ND_PRINTK(2, warn, "RA: invalid RA options\n");
1426 	}
1427 out:
1428 	ip6_rt_put(rt);
1429 	if (neigh)
1430 		neigh_release(neigh);
1431 }
1432 
1433 static void ndisc_redirect_rcv(struct sk_buff *skb)
1434 {
1435 	u8 *hdr;
1436 	struct ndisc_options ndopts;
1437 	struct rd_msg *msg = (struct rd_msg *)skb_transport_header(skb);
1438 	u32 ndoptlen = skb_tail_pointer(skb) - (skb_transport_header(skb) +
1439 				    offsetof(struct rd_msg, opt));
1440 
1441 #ifdef CONFIG_IPV6_NDISC_NODETYPE
1442 	switch (skb->ndisc_nodetype) {
1443 	case NDISC_NODETYPE_HOST:
1444 	case NDISC_NODETYPE_NODEFAULT:
1445 		ND_PRINTK(2, warn,
1446 			  "Redirect: from host or unauthorized router\n");
1447 		return;
1448 	}
1449 #endif
1450 
1451 	if (!(ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)) {
1452 		ND_PRINTK(2, warn,
1453 			  "Redirect: source address is not link-local\n");
1454 		return;
1455 	}
1456 
1457 	if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts))
1458 		return;
1459 
1460 	if (!ndopts.nd_opts_rh) {
1461 		ip6_redirect_no_header(skb, dev_net(skb->dev),
1462 					skb->dev->ifindex, 0);
1463 		return;
1464 	}
1465 
1466 	hdr = (u8 *)ndopts.nd_opts_rh;
1467 	hdr += 8;
1468 	if (!pskb_pull(skb, hdr - skb_transport_header(skb)))
1469 		return;
1470 
1471 	icmpv6_notify(skb, NDISC_REDIRECT, 0, 0);
1472 }
1473 
1474 static void ndisc_fill_redirect_hdr_option(struct sk_buff *skb,
1475 					   struct sk_buff *orig_skb,
1476 					   int rd_len)
1477 {
1478 	u8 *opt = skb_put(skb, rd_len);
1479 
1480 	memset(opt, 0, 8);
1481 	*(opt++) = ND_OPT_REDIRECT_HDR;
1482 	*(opt++) = (rd_len >> 3);
1483 	opt += 6;
1484 
1485 	memcpy(opt, ipv6_hdr(orig_skb), rd_len - 8);
1486 }
1487 
1488 void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target)
1489 {
1490 	struct net_device *dev = skb->dev;
1491 	struct net *net = dev_net(dev);
1492 	struct sock *sk = net->ipv6.ndisc_sk;
1493 	int optlen = 0;
1494 	struct inet_peer *peer;
1495 	struct sk_buff *buff;
1496 	struct rd_msg *msg;
1497 	struct in6_addr saddr_buf;
1498 	struct rt6_info *rt;
1499 	struct dst_entry *dst;
1500 	struct flowi6 fl6;
1501 	int rd_len;
1502 	u8 ha_buf[MAX_ADDR_LEN], *ha = NULL;
1503 	int oif = l3mdev_fib_oif(dev);
1504 	bool ret;
1505 
1506 	if (ipv6_get_lladdr(dev, &saddr_buf, IFA_F_TENTATIVE)) {
1507 		ND_PRINTK(2, warn, "Redirect: no link-local address on %s\n",
1508 			  dev->name);
1509 		return;
1510 	}
1511 
1512 	if (!ipv6_addr_equal(&ipv6_hdr(skb)->daddr, target) &&
1513 	    ipv6_addr_type(target) != (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
1514 		ND_PRINTK(2, warn,
1515 			  "Redirect: target address is not link-local unicast\n");
1516 		return;
1517 	}
1518 
1519 	icmpv6_flow_init(sk, &fl6, NDISC_REDIRECT,
1520 			 &saddr_buf, &ipv6_hdr(skb)->saddr, oif);
1521 
1522 	if (oif != skb->dev->ifindex)
1523 		fl6.flowi6_flags |= FLOWI_FLAG_L3MDEV_SRC;
1524 
1525 	dst = ip6_route_output(net, NULL, &fl6);
1526 	if (dst->error) {
1527 		dst_release(dst);
1528 		return;
1529 	}
1530 	dst = xfrm_lookup(net, dst, flowi6_to_flowi(&fl6), NULL, 0);
1531 	if (IS_ERR(dst))
1532 		return;
1533 
1534 	rt = (struct rt6_info *) dst;
1535 
1536 	if (rt->rt6i_flags & RTF_GATEWAY) {
1537 		ND_PRINTK(2, warn,
1538 			  "Redirect: destination is not a neighbour\n");
1539 		goto release;
1540 	}
1541 	peer = inet_getpeer_v6(net->ipv6.peers, &ipv6_hdr(skb)->saddr, 1);
1542 	ret = inet_peer_xrlim_allow(peer, 1*HZ);
1543 	if (peer)
1544 		inet_putpeer(peer);
1545 	if (!ret)
1546 		goto release;
1547 
1548 	if (dev->addr_len) {
1549 		struct neighbour *neigh = dst_neigh_lookup(skb_dst(skb), target);
1550 		if (!neigh) {
1551 			ND_PRINTK(2, warn,
1552 				  "Redirect: no neigh for target address\n");
1553 			goto release;
1554 		}
1555 
1556 		read_lock_bh(&neigh->lock);
1557 		if (neigh->nud_state & NUD_VALID) {
1558 			memcpy(ha_buf, neigh->ha, dev->addr_len);
1559 			read_unlock_bh(&neigh->lock);
1560 			ha = ha_buf;
1561 			optlen += ndisc_opt_addr_space(dev);
1562 		} else
1563 			read_unlock_bh(&neigh->lock);
1564 
1565 		neigh_release(neigh);
1566 	}
1567 
1568 	rd_len = min_t(unsigned int,
1569 		       IPV6_MIN_MTU - sizeof(struct ipv6hdr) - sizeof(*msg) - optlen,
1570 		       skb->len + 8);
1571 	rd_len &= ~0x7;
1572 	optlen += rd_len;
1573 
1574 	buff = ndisc_alloc_skb(dev, sizeof(*msg) + optlen);
1575 	if (!buff)
1576 		goto release;
1577 
1578 	msg = (struct rd_msg *)skb_put(buff, sizeof(*msg));
1579 	*msg = (struct rd_msg) {
1580 		.icmph = {
1581 			.icmp6_type = NDISC_REDIRECT,
1582 		},
1583 		.target = *target,
1584 		.dest = ipv6_hdr(skb)->daddr,
1585 	};
1586 
1587 	/*
1588 	 *	include target_address option
1589 	 */
1590 
1591 	if (ha)
1592 		ndisc_fill_addr_option(buff, ND_OPT_TARGET_LL_ADDR, ha);
1593 
1594 	/*
1595 	 *	build redirect option and copy skb over to the new packet.
1596 	 */
1597 
1598 	if (rd_len)
1599 		ndisc_fill_redirect_hdr_option(buff, skb, rd_len);
1600 
1601 	skb_dst_set(buff, dst);
1602 	ndisc_send_skb(buff, &ipv6_hdr(skb)->saddr, &saddr_buf);
1603 	return;
1604 
1605 release:
1606 	dst_release(dst);
1607 }
1608 
1609 static void pndisc_redo(struct sk_buff *skb)
1610 {
1611 	ndisc_recv_ns(skb);
1612 	kfree_skb(skb);
1613 }
1614 
1615 static bool ndisc_suppress_frag_ndisc(struct sk_buff *skb)
1616 {
1617 	struct inet6_dev *idev = __in6_dev_get(skb->dev);
1618 
1619 	if (!idev)
1620 		return true;
1621 	if (IP6CB(skb)->flags & IP6SKB_FRAGMENTED &&
1622 	    idev->cnf.suppress_frag_ndisc) {
1623 		net_warn_ratelimited("Received fragmented ndisc packet. Carefully consider disabling suppress_frag_ndisc.\n");
1624 		return true;
1625 	}
1626 	return false;
1627 }
1628 
1629 int ndisc_rcv(struct sk_buff *skb)
1630 {
1631 	struct nd_msg *msg;
1632 
1633 	if (ndisc_suppress_frag_ndisc(skb))
1634 		return 0;
1635 
1636 	if (skb_linearize(skb))
1637 		return 0;
1638 
1639 	msg = (struct nd_msg *)skb_transport_header(skb);
1640 
1641 	__skb_push(skb, skb->data - skb_transport_header(skb));
1642 
1643 	if (ipv6_hdr(skb)->hop_limit != 255) {
1644 		ND_PRINTK(2, warn, "NDISC: invalid hop-limit: %d\n",
1645 			  ipv6_hdr(skb)->hop_limit);
1646 		return 0;
1647 	}
1648 
1649 	if (msg->icmph.icmp6_code != 0) {
1650 		ND_PRINTK(2, warn, "NDISC: invalid ICMPv6 code: %d\n",
1651 			  msg->icmph.icmp6_code);
1652 		return 0;
1653 	}
1654 
1655 	memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
1656 
1657 	switch (msg->icmph.icmp6_type) {
1658 	case NDISC_NEIGHBOUR_SOLICITATION:
1659 		ndisc_recv_ns(skb);
1660 		break;
1661 
1662 	case NDISC_NEIGHBOUR_ADVERTISEMENT:
1663 		ndisc_recv_na(skb);
1664 		break;
1665 
1666 	case NDISC_ROUTER_SOLICITATION:
1667 		ndisc_recv_rs(skb);
1668 		break;
1669 
1670 	case NDISC_ROUTER_ADVERTISEMENT:
1671 		ndisc_router_discovery(skb);
1672 		break;
1673 
1674 	case NDISC_REDIRECT:
1675 		ndisc_redirect_rcv(skb);
1676 		break;
1677 	}
1678 
1679 	return 0;
1680 }
1681 
1682 static int ndisc_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
1683 {
1684 	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1685 	struct netdev_notifier_change_info *change_info;
1686 	struct net *net = dev_net(dev);
1687 	struct inet6_dev *idev;
1688 
1689 	switch (event) {
1690 	case NETDEV_CHANGEADDR:
1691 		neigh_changeaddr(&nd_tbl, dev);
1692 		fib6_run_gc(0, net, false);
1693 		idev = in6_dev_get(dev);
1694 		if (!idev)
1695 			break;
1696 		if (idev->cnf.ndisc_notify)
1697 			ndisc_send_unsol_na(dev);
1698 		in6_dev_put(idev);
1699 		break;
1700 	case NETDEV_CHANGE:
1701 		change_info = ptr;
1702 		if (change_info->flags_changed & IFF_NOARP)
1703 			neigh_changeaddr(&nd_tbl, dev);
1704 		break;
1705 	case NETDEV_DOWN:
1706 		neigh_ifdown(&nd_tbl, dev);
1707 		fib6_run_gc(0, net, false);
1708 		break;
1709 	case NETDEV_NOTIFY_PEERS:
1710 		ndisc_send_unsol_na(dev);
1711 		break;
1712 	default:
1713 		break;
1714 	}
1715 
1716 	return NOTIFY_DONE;
1717 }
1718 
1719 static struct notifier_block ndisc_netdev_notifier = {
1720 	.notifier_call = ndisc_netdev_event,
1721 };
1722 
1723 #ifdef CONFIG_SYSCTL
1724 static void ndisc_warn_deprecated_sysctl(struct ctl_table *ctl,
1725 					 const char *func, const char *dev_name)
1726 {
1727 	static char warncomm[TASK_COMM_LEN];
1728 	static int warned;
1729 	if (strcmp(warncomm, current->comm) && warned < 5) {
1730 		strcpy(warncomm, current->comm);
1731 		pr_warn("process `%s' is using deprecated sysctl (%s) net.ipv6.neigh.%s.%s - use net.ipv6.neigh.%s.%s_ms instead\n",
1732 			warncomm, func,
1733 			dev_name, ctl->procname,
1734 			dev_name, ctl->procname);
1735 		warned++;
1736 	}
1737 }
1738 
1739 int ndisc_ifinfo_sysctl_change(struct ctl_table *ctl, int write, void __user *buffer, size_t *lenp, loff_t *ppos)
1740 {
1741 	struct net_device *dev = ctl->extra1;
1742 	struct inet6_dev *idev;
1743 	int ret;
1744 
1745 	if ((strcmp(ctl->procname, "retrans_time") == 0) ||
1746 	    (strcmp(ctl->procname, "base_reachable_time") == 0))
1747 		ndisc_warn_deprecated_sysctl(ctl, "syscall", dev ? dev->name : "default");
1748 
1749 	if (strcmp(ctl->procname, "retrans_time") == 0)
1750 		ret = neigh_proc_dointvec(ctl, write, buffer, lenp, ppos);
1751 
1752 	else if (strcmp(ctl->procname, "base_reachable_time") == 0)
1753 		ret = neigh_proc_dointvec_jiffies(ctl, write,
1754 						  buffer, lenp, ppos);
1755 
1756 	else if ((strcmp(ctl->procname, "retrans_time_ms") == 0) ||
1757 		 (strcmp(ctl->procname, "base_reachable_time_ms") == 0))
1758 		ret = neigh_proc_dointvec_ms_jiffies(ctl, write,
1759 						     buffer, lenp, ppos);
1760 	else
1761 		ret = -1;
1762 
1763 	if (write && ret == 0 && dev && (idev = in6_dev_get(dev)) != NULL) {
1764 		if (ctl->data == &NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME))
1765 			idev->nd_parms->reachable_time =
1766 					neigh_rand_reach_time(NEIGH_VAR(idev->nd_parms, BASE_REACHABLE_TIME));
1767 		idev->tstamp = jiffies;
1768 		inet6_ifinfo_notify(RTM_NEWLINK, idev);
1769 		in6_dev_put(idev);
1770 	}
1771 	return ret;
1772 }
1773 
1774 
1775 #endif
1776 
1777 static int __net_init ndisc_net_init(struct net *net)
1778 {
1779 	struct ipv6_pinfo *np;
1780 	struct sock *sk;
1781 	int err;
1782 
1783 	err = inet_ctl_sock_create(&sk, PF_INET6,
1784 				   SOCK_RAW, IPPROTO_ICMPV6, net);
1785 	if (err < 0) {
1786 		ND_PRINTK(0, err,
1787 			  "NDISC: Failed to initialize the control socket (err %d)\n",
1788 			  err);
1789 		return err;
1790 	}
1791 
1792 	net->ipv6.ndisc_sk = sk;
1793 
1794 	np = inet6_sk(sk);
1795 	np->hop_limit = 255;
1796 	/* Do not loopback ndisc messages */
1797 	np->mc_loop = 0;
1798 
1799 	return 0;
1800 }
1801 
1802 static void __net_exit ndisc_net_exit(struct net *net)
1803 {
1804 	inet_ctl_sock_destroy(net->ipv6.ndisc_sk);
1805 }
1806 
1807 static struct pernet_operations ndisc_net_ops = {
1808 	.init = ndisc_net_init,
1809 	.exit = ndisc_net_exit,
1810 };
1811 
1812 int __init ndisc_init(void)
1813 {
1814 	int err;
1815 
1816 	err = register_pernet_subsys(&ndisc_net_ops);
1817 	if (err)
1818 		return err;
1819 	/*
1820 	 * Initialize the neighbour table
1821 	 */
1822 	neigh_table_init(NEIGH_ND_TABLE, &nd_tbl);
1823 
1824 #ifdef CONFIG_SYSCTL
1825 	err = neigh_sysctl_register(NULL, &nd_tbl.parms,
1826 				    ndisc_ifinfo_sysctl_change);
1827 	if (err)
1828 		goto out_unregister_pernet;
1829 out:
1830 #endif
1831 	return err;
1832 
1833 #ifdef CONFIG_SYSCTL
1834 out_unregister_pernet:
1835 	unregister_pernet_subsys(&ndisc_net_ops);
1836 	goto out;
1837 #endif
1838 }
1839 
1840 int __init ndisc_late_init(void)
1841 {
1842 	return register_netdevice_notifier(&ndisc_netdev_notifier);
1843 }
1844 
1845 void ndisc_late_cleanup(void)
1846 {
1847 	unregister_netdevice_notifier(&ndisc_netdev_notifier);
1848 }
1849 
1850 void ndisc_cleanup(void)
1851 {
1852 #ifdef CONFIG_SYSCTL
1853 	neigh_sysctl_unregister(&nd_tbl.parms);
1854 #endif
1855 	neigh_table_clear(NEIGH_ND_TABLE, &nd_tbl);
1856 	unregister_pernet_subsys(&ndisc_net_ops);
1857 }
1858