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