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