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