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