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