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