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