Linux Audio

Check our new training course

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