xref: /linux/net/ipv6/ndisc.c (revision 7f3edee81fbd49114c28057512906f169caa0bed)
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 
92 static struct socket *ndisc_socket;
93 
94 static u32 ndisc_hash(const void *pkey, const struct net_device *dev);
95 static int ndisc_constructor(struct neighbour *neigh);
96 static void ndisc_solicit(struct neighbour *neigh, struct sk_buff *skb);
97 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb);
98 static int pndisc_constructor(struct pneigh_entry *n);
99 static void pndisc_destructor(struct pneigh_entry *n);
100 static void pndisc_redo(struct sk_buff *skb);
101 
102 static 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 
112 static 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 
123 static 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 
131 struct 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 */
162 struct 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  */
187 static 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 
195 static 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 
200 static 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 
221 static 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 
234 static inline int ndisc_is_useropt(struct nd_opt_hdr *opt)
235 {
236 	return (opt->nd_opt_type == ND_OPT_RDNSS);
237 }
238 
239 static 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 
250 static 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 
314 static 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 
325 int 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, dev->broadcast, 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 
351 EXPORT_SYMBOL(ndisc_mc_map);
352 
353 static 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 
365 static 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 
416 static 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 
429 static 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 
445 static 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 
459 static 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 
546 static 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 
579 void 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 
600 void 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 
635 static 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 
647 static 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 
677 static 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 
847 out:
848 	if (ifp)
849 		in6_ifa_put(ifp);
850 	else
851 		in6_dev_put(idev);
852 
853 	return;
854 }
855 
856 static 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 
954 out:
955 		neigh_release(neigh);
956 	}
957 }
958 
959 static 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 	}
1012 out:
1013 	in6_dev_put(idev);
1014 }
1015 
1016 static 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 
1057 nla_put_failure:
1058 	nlmsg_free(skb);
1059 	err = -EMSGSIZE;
1060 errout:
1061 	rtnl_set_sk_err(RTNLGRP_ND_USEROPT, err);
1062 }
1063 
1064 static 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 
1192 skip_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 	}
1309 out:
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 
1317 static 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 
1403 void 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 
1551 static void pndisc_redo(struct sk_buff *skb)
1552 {
1553 	ndisc_recv_ns(skb);
1554 	kfree_skb(skb);
1555 }
1556 
1557 int 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 
1609 static 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 
1632 static struct notifier_block ndisc_netdev_notifier = {
1633 	.notifier_call = ndisc_netdev_event,
1634 };
1635 
1636 #ifdef CONFIG_SYSCTL
1637 static 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 
1656 int 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 
1690 static 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 
1732 int __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 
1772 void 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