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