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