Linux Audio

Check our new training course

Loading...
v6.13.7
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 *	Linux INET6 implementation
   4 *	FIB front-end.
   5 *
   6 *	Authors:
   7 *	Pedro Roque		<roque@di.fc.ul.pt>
 
 
 
 
 
   8 */
   9
  10/*	Changes:
  11 *
  12 *	YOSHIFUJI Hideaki @USAGI
  13 *		reworked default router selection.
  14 *		- respect outgoing interface
  15 *		- select from (probably) reachable routers (i.e.
  16 *		routers in REACHABLE, STALE, DELAY or PROBE states).
  17 *		- always select the same router if it is (probably)
  18 *		reachable.  otherwise, round-robin the list.
  19 *	Ville Nuorvala
  20 *		Fixed routing subtrees.
  21 */
  22
  23#define pr_fmt(fmt) "IPv6: " fmt
  24
  25#include <linux/capability.h>
  26#include <linux/errno.h>
  27#include <linux/export.h>
  28#include <linux/types.h>
  29#include <linux/times.h>
  30#include <linux/socket.h>
  31#include <linux/sockios.h>
  32#include <linux/net.h>
  33#include <linux/route.h>
  34#include <linux/netdevice.h>
  35#include <linux/in6.h>
  36#include <linux/mroute6.h>
  37#include <linux/init.h>
  38#include <linux/if_arp.h>
  39#include <linux/proc_fs.h>
  40#include <linux/seq_file.h>
  41#include <linux/nsproxy.h>
  42#include <linux/slab.h>
  43#include <linux/jhash.h>
  44#include <linux/siphash.h>
  45#include <net/net_namespace.h>
  46#include <net/snmp.h>
  47#include <net/ipv6.h>
  48#include <net/ip6_fib.h>
  49#include <net/ip6_route.h>
  50#include <net/ndisc.h>
  51#include <net/addrconf.h>
  52#include <net/tcp.h>
  53#include <linux/rtnetlink.h>
  54#include <net/dst.h>
  55#include <net/dst_metadata.h>
  56#include <net/xfrm.h>
  57#include <net/netevent.h>
  58#include <net/netlink.h>
  59#include <net/rtnh.h>
  60#include <net/lwtunnel.h>
  61#include <net/ip_tunnels.h>
  62#include <net/l3mdev.h>
  63#include <net/ip.h>
 
  64#include <linux/uaccess.h>
  65#include <linux/btf_ids.h>
  66
  67#ifdef CONFIG_SYSCTL
  68#include <linux/sysctl.h>
  69#endif
  70
  71static int ip6_rt_type_to_error(u8 fib6_type);
  72
  73#define CREATE_TRACE_POINTS
  74#include <trace/events/fib6.h>
  75EXPORT_TRACEPOINT_SYMBOL_GPL(fib6_table_lookup);
  76#undef CREATE_TRACE_POINTS
  77
  78enum rt6_nud_state {
  79	RT6_NUD_FAIL_HARD = -3,
  80	RT6_NUD_FAIL_PROBE = -2,
  81	RT6_NUD_FAIL_DO_RR = -1,
  82	RT6_NUD_SUCCEED = 1
  83};
  84
  85INDIRECT_CALLABLE_SCOPE
  86struct dst_entry	*ip6_dst_check(struct dst_entry *dst, u32 cookie);
  87static unsigned int	 ip6_default_advmss(const struct dst_entry *dst);
  88INDIRECT_CALLABLE_SCOPE
  89unsigned int		ip6_mtu(const struct dst_entry *dst);
  90static void		ip6_negative_advice(struct sock *sk,
  91					    struct dst_entry *dst);
  92static void		ip6_dst_destroy(struct dst_entry *);
  93static void		ip6_dst_ifdown(struct dst_entry *,
  94				       struct net_device *dev);
  95static void		 ip6_dst_gc(struct dst_ops *ops);
  96
  97static int		ip6_pkt_discard(struct sk_buff *skb);
  98static int		ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb);
  99static int		ip6_pkt_prohibit(struct sk_buff *skb);
 100static int		ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb);
 101static void		ip6_link_failure(struct sk_buff *skb);
 102static void		ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
 103					   struct sk_buff *skb, u32 mtu,
 104					   bool confirm_neigh);
 105static void		rt6_do_redirect(struct dst_entry *dst, struct sock *sk,
 106					struct sk_buff *skb);
 107static int rt6_score_route(const struct fib6_nh *nh, u32 fib6_flags, int oif,
 108			   int strict);
 109static size_t rt6_nlmsg_size(struct fib6_info *f6i);
 110static int rt6_fill_node(struct net *net, struct sk_buff *skb,
 111			 struct fib6_info *rt, struct dst_entry *dst,
 112			 struct in6_addr *dest, struct in6_addr *src,
 113			 int iif, int type, u32 portid, u32 seq,
 114			 unsigned int flags);
 115static struct rt6_info *rt6_find_cached_rt(const struct fib6_result *res,
 116					   const struct in6_addr *daddr,
 117					   const struct in6_addr *saddr);
 118
 119#ifdef CONFIG_IPV6_ROUTE_INFO
 120static struct fib6_info *rt6_add_route_info(struct net *net,
 121					   const struct in6_addr *prefix, int prefixlen,
 122					   const struct in6_addr *gwaddr,
 123					   struct net_device *dev,
 124					   unsigned int pref);
 125static struct fib6_info *rt6_get_route_info(struct net *net,
 126					   const struct in6_addr *prefix, int prefixlen,
 127					   const struct in6_addr *gwaddr,
 128					   struct net_device *dev);
 129#endif
 130
 131struct uncached_list {
 132	spinlock_t		lock;
 133	struct list_head	head;
 134};
 135
 136static DEFINE_PER_CPU_ALIGNED(struct uncached_list, rt6_uncached_list);
 137
 138void rt6_uncached_list_add(struct rt6_info *rt)
 139{
 140	struct uncached_list *ul = raw_cpu_ptr(&rt6_uncached_list);
 141
 142	rt->dst.rt_uncached_list = ul;
 143
 144	spin_lock_bh(&ul->lock);
 145	list_add_tail(&rt->dst.rt_uncached, &ul->head);
 146	spin_unlock_bh(&ul->lock);
 147}
 148
 149void rt6_uncached_list_del(struct rt6_info *rt)
 150{
 151	if (!list_empty(&rt->dst.rt_uncached)) {
 152		struct uncached_list *ul = rt->dst.rt_uncached_list;
 
 153
 154		spin_lock_bh(&ul->lock);
 155		list_del_init(&rt->dst.rt_uncached);
 
 156		spin_unlock_bh(&ul->lock);
 157	}
 158}
 159
 160static void rt6_uncached_list_flush_dev(struct net_device *dev)
 161{
 
 162	int cpu;
 163
 
 
 
 164	for_each_possible_cpu(cpu) {
 165		struct uncached_list *ul = per_cpu_ptr(&rt6_uncached_list, cpu);
 166		struct rt6_info *rt, *safe;
 167
 168		if (list_empty(&ul->head))
 169			continue;
 170
 171		spin_lock_bh(&ul->lock);
 172		list_for_each_entry_safe(rt, safe, &ul->head, dst.rt_uncached) {
 173			struct inet6_dev *rt_idev = rt->rt6i_idev;
 174			struct net_device *rt_dev = rt->dst.dev;
 175			bool handled = false;
 176
 177			if (rt_idev && rt_idev->dev == dev) {
 178				rt->rt6i_idev = in6_dev_get(blackhole_netdev);
 179				in6_dev_put(rt_idev);
 180				handled = true;
 181			}
 182
 183			if (rt_dev == dev) {
 184				rt->dst.dev = blackhole_netdev;
 185				netdev_ref_replace(rt_dev, blackhole_netdev,
 186						   &rt->dst.dev_tracker,
 187						   GFP_ATOMIC);
 188				handled = true;
 189			}
 190			if (handled)
 191				list_del_init(&rt->dst.rt_uncached);
 192		}
 193		spin_unlock_bh(&ul->lock);
 194	}
 195}
 196
 197static inline const void *choose_neigh_daddr(const struct in6_addr *p,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 198					     struct sk_buff *skb,
 199					     const void *daddr)
 200{
 
 
 201	if (!ipv6_addr_any(p))
 202		return (const void *) p;
 203	else if (skb)
 204		return &ipv6_hdr(skb)->daddr;
 205	return daddr;
 206}
 207
 208struct neighbour *ip6_neigh_lookup(const struct in6_addr *gw,
 209				   struct net_device *dev,
 210				   struct sk_buff *skb,
 211				   const void *daddr)
 212{
 
 213	struct neighbour *n;
 214
 215	daddr = choose_neigh_daddr(gw, skb, daddr);
 216	n = __ipv6_neigh_lookup(dev, daddr);
 217	if (n)
 218		return n;
 219
 220	n = neigh_create(&nd_tbl, daddr, dev);
 221	return IS_ERR(n) ? NULL : n;
 222}
 223
 224static struct neighbour *ip6_dst_neigh_lookup(const struct dst_entry *dst,
 225					      struct sk_buff *skb,
 226					      const void *daddr)
 227{
 228	const struct rt6_info *rt = dst_rt6_info(dst);
 229
 230	return ip6_neigh_lookup(rt6_nexthop(rt, &in6addr_any),
 231				dst->dev, skb, daddr);
 232}
 233
 234static void ip6_confirm_neigh(const struct dst_entry *dst, const void *daddr)
 235{
 236	const struct rt6_info *rt = dst_rt6_info(dst);
 237	struct net_device *dev = dst->dev;
 
 238
 239	daddr = choose_neigh_daddr(rt6_nexthop(rt, &in6addr_any), NULL, daddr);
 240	if (!daddr)
 241		return;
 242	if (dev->flags & (IFF_NOARP | IFF_LOOPBACK))
 243		return;
 244	if (ipv6_addr_is_multicast((const struct in6_addr *)daddr))
 245		return;
 246	__ipv6_confirm_neigh(dev, daddr);
 247}
 248
 249static struct dst_ops ip6_dst_ops_template = {
 250	.family			=	AF_INET6,
 251	.gc			=	ip6_dst_gc,
 252	.gc_thresh		=	1024,
 253	.check			=	ip6_dst_check,
 254	.default_advmss		=	ip6_default_advmss,
 255	.mtu			=	ip6_mtu,
 256	.cow_metrics		=	dst_cow_metrics_generic,
 257	.destroy		=	ip6_dst_destroy,
 258	.ifdown			=	ip6_dst_ifdown,
 259	.negative_advice	=	ip6_negative_advice,
 260	.link_failure		=	ip6_link_failure,
 261	.update_pmtu		=	ip6_rt_update_pmtu,
 262	.redirect		=	rt6_do_redirect,
 263	.local_out		=	__ip6_local_out,
 264	.neigh_lookup		=	ip6_dst_neigh_lookup,
 265	.confirm_neigh		=	ip6_confirm_neigh,
 266};
 267
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 268static struct dst_ops ip6_dst_blackhole_ops = {
 269	.family			= AF_INET6,
 270	.default_advmss		= ip6_default_advmss,
 271	.neigh_lookup		= ip6_dst_neigh_lookup,
 272	.check			= ip6_dst_check,
 273	.destroy		= ip6_dst_destroy,
 274	.cow_metrics		= dst_cow_metrics_generic,
 275	.update_pmtu		= dst_blackhole_update_pmtu,
 276	.redirect		= dst_blackhole_redirect,
 277	.mtu			= dst_blackhole_mtu,
 278};
 279
 280static const u32 ip6_template_metrics[RTAX_MAX] = {
 281	[RTAX_HOPLIMIT - 1] = 0,
 282};
 283
 284static const struct fib6_info fib6_null_entry_template = {
 285	.fib6_flags	= (RTF_REJECT | RTF_NONEXTHOP),
 286	.fib6_protocol  = RTPROT_KERNEL,
 287	.fib6_metric	= ~(u32)0,
 288	.fib6_ref	= REFCOUNT_INIT(1),
 289	.fib6_type	= RTN_UNREACHABLE,
 290	.fib6_metrics	= (struct dst_metrics *)&dst_default_metrics,
 291};
 292
 293static const struct rt6_info ip6_null_entry_template = {
 294	.dst = {
 295		.__rcuref	= RCUREF_INIT(1),
 296		.__use		= 1,
 297		.obsolete	= DST_OBSOLETE_FORCE_CHK,
 298		.error		= -ENETUNREACH,
 299		.input		= ip6_pkt_discard,
 300		.output		= ip6_pkt_discard_out,
 301	},
 302	.rt6i_flags	= (RTF_REJECT | RTF_NONEXTHOP),
 
 
 
 303};
 304
 305#ifdef CONFIG_IPV6_MULTIPLE_TABLES
 306
 307static const struct rt6_info ip6_prohibit_entry_template = {
 308	.dst = {
 309		.__rcuref	= RCUREF_INIT(1),
 310		.__use		= 1,
 311		.obsolete	= DST_OBSOLETE_FORCE_CHK,
 312		.error		= -EACCES,
 313		.input		= ip6_pkt_prohibit,
 314		.output		= ip6_pkt_prohibit_out,
 315	},
 316	.rt6i_flags	= (RTF_REJECT | RTF_NONEXTHOP),
 
 
 
 317};
 318
 319static const struct rt6_info ip6_blk_hole_entry_template = {
 320	.dst = {
 321		.__rcuref	= RCUREF_INIT(1),
 322		.__use		= 1,
 323		.obsolete	= DST_OBSOLETE_FORCE_CHK,
 324		.error		= -EINVAL,
 325		.input		= dst_discard,
 326		.output		= dst_discard_out,
 327	},
 328	.rt6i_flags	= (RTF_REJECT | RTF_NONEXTHOP),
 
 
 
 329};
 330
 331#endif
 332
 333static void rt6_info_init(struct rt6_info *rt)
 334{
 335	memset_after(rt, 0, dst);
 
 
 
 
 336}
 337
 338/* allocate dst with ip6_dst_ops */
 339struct rt6_info *ip6_dst_alloc(struct net *net, struct net_device *dev,
 340			       int flags)
 
 341{
 342	struct rt6_info *rt = dst_alloc(&net->ipv6.ip6_dst_ops, dev,
 343					DST_OBSOLETE_FORCE_CHK, flags);
 344
 345	if (rt) {
 346		rt6_info_init(rt);
 347		atomic_inc(&net->ipv6.rt6_stats->fib_rt_alloc);
 348	}
 349
 350	return rt;
 351}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 352EXPORT_SYMBOL(ip6_dst_alloc);
 353
 354static void ip6_dst_destroy(struct dst_entry *dst)
 355{
 356	struct rt6_info *rt = dst_rt6_info(dst);
 357	struct fib6_info *from;
 
 358	struct inet6_dev *idev;
 359
 360	ip_dst_metrics_put(dst);
 
 361	rt6_uncached_list_del(rt);
 362
 363	idev = rt->rt6i_idev;
 364	if (idev) {
 365		rt->rt6i_idev = NULL;
 366		in6_dev_put(idev);
 367	}
 
 
 
 
 
 368
 369	from = unrcu_pointer(xchg(&rt->from, NULL));
 370	fib6_info_release(from);
 371}
 372
 373static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev)
 
 374{
 375	struct rt6_info *rt = dst_rt6_info(dst);
 376	struct inet6_dev *idev = rt->rt6i_idev;
 377	struct fib6_info *from;
 
 378
 379	if (idev && idev->dev != blackhole_netdev) {
 380		struct inet6_dev *blackhole_idev = in6_dev_get(blackhole_netdev);
 381
 382		if (blackhole_idev) {
 383			rt->rt6i_idev = blackhole_idev;
 384			in6_dev_put(idev);
 385		}
 386	}
 387	from = unrcu_pointer(xchg(&rt->from, NULL));
 388	fib6_info_release(from);
 389}
 390
 391static bool __rt6_check_expired(const struct rt6_info *rt)
 392{
 393	if (rt->rt6i_flags & RTF_EXPIRES)
 394		return time_after(jiffies, rt->dst.expires);
 395	else
 396		return false;
 397}
 398
 399static bool rt6_check_expired(const struct rt6_info *rt)
 400{
 401	struct fib6_info *from;
 402
 403	from = rcu_dereference(rt->from);
 404
 405	if (rt->rt6i_flags & RTF_EXPIRES) {
 406		if (time_after(jiffies, rt->dst.expires))
 407			return true;
 408	} else if (from) {
 409		return rt->dst.obsolete != DST_OBSOLETE_FORCE_CHK ||
 410			fib6_check_expired(from);
 411	}
 412	return false;
 413}
 414
 415void fib6_select_path(const struct net *net, struct fib6_result *res,
 416		      struct flowi6 *fl6, int oif, bool have_oif_match,
 417		      const struct sk_buff *skb, int strict)
 
 
 418{
 419	struct fib6_info *match = res->f6i;
 420	struct fib6_info *sibling;
 421
 422	if (!match->nh && (!match->fib6_nsiblings || have_oif_match))
 423		goto out;
 424
 425	if (match->nh && have_oif_match && res->nh)
 426		return;
 427
 428	if (skb)
 429		IP6CB(skb)->flags |= IP6SKB_MULTIPATH;
 430
 431	/* We might have already computed the hash for ICMPv6 errors. In such
 432	 * case it will always be non-zero. Otherwise now is the time to do it.
 433	 */
 434	if (!fl6->mp_hash &&
 435	    (!match->nh || nexthop_is_multipath(match->nh)))
 436		fl6->mp_hash = rt6_multipath_hash(net, fl6, skb, NULL);
 437
 438	if (unlikely(match->nh)) {
 439		nexthop_path_fib6_result(res, fl6->mp_hash);
 440		return;
 441	}
 442
 443	if (fl6->mp_hash <= atomic_read(&match->fib6_nh->fib_nh_upper_bound))
 444		goto out;
 445
 446	list_for_each_entry_rcu(sibling, &match->fib6_siblings,
 447				fib6_siblings) {
 448		const struct fib6_nh *nh = sibling->fib6_nh;
 449		int nh_upper_bound;
 450
 451		nh_upper_bound = atomic_read(&nh->fib_nh_upper_bound);
 452		if (fl6->mp_hash > nh_upper_bound)
 453			continue;
 454		if (rt6_score_route(nh, sibling->fib6_flags, oif, strict) < 0)
 455			break;
 456		match = sibling;
 457		break;
 458	}
 459
 460out:
 461	res->f6i = match;
 462	res->nh = match->fib6_nh;
 463}
 464
 465/*
 466 *	Route lookup. rcu_read_lock() should be held.
 467 */
 468
 469static bool __rt6_device_match(struct net *net, const struct fib6_nh *nh,
 470			       const struct in6_addr *saddr, int oif, int flags)
 471{
 472	const struct net_device *dev;
 
 
 
 
 473
 474	if (nh->fib_nh_flags & RTNH_F_DEAD)
 475		return false;
 476
 477	dev = nh->fib_nh_dev;
 478	if (oif) {
 479		if (dev->ifindex == oif)
 480			return true;
 481	} else {
 482		if (ipv6_chk_addr(net, saddr, dev,
 483				  flags & RT6_LOOKUP_F_IFACE))
 484			return true;
 485	}
 486
 487	return false;
 488}
 489
 490struct fib6_nh_dm_arg {
 491	struct net		*net;
 492	const struct in6_addr	*saddr;
 493	int			oif;
 494	int			flags;
 495	struct fib6_nh		*nh;
 496};
 497
 498static int __rt6_nh_dev_match(struct fib6_nh *nh, void *_arg)
 499{
 500	struct fib6_nh_dm_arg *arg = _arg;
 501
 502	arg->nh = nh;
 503	return __rt6_device_match(arg->net, nh, arg->saddr, arg->oif,
 504				  arg->flags);
 505}
 506
 507/* returns fib6_nh from nexthop or NULL */
 508static struct fib6_nh *rt6_nh_dev_match(struct net *net, struct nexthop *nh,
 509					struct fib6_result *res,
 510					const struct in6_addr *saddr,
 511					int oif, int flags)
 512{
 513	struct fib6_nh_dm_arg arg = {
 514		.net   = net,
 515		.saddr = saddr,
 516		.oif   = oif,
 517		.flags = flags,
 518	};
 519
 520	if (nexthop_is_blackhole(nh))
 521		return NULL;
 522
 523	if (nexthop_for_each_fib6_nh(nh, __rt6_nh_dev_match, &arg))
 524		return arg.nh;
 525
 526	return NULL;
 527}
 528
 529static void rt6_device_match(struct net *net, struct fib6_result *res,
 530			     const struct in6_addr *saddr, int oif, int flags)
 531{
 532	struct fib6_info *f6i = res->f6i;
 533	struct fib6_info *spf6i;
 534	struct fib6_nh *nh;
 535
 536	if (!oif && ipv6_addr_any(saddr)) {
 537		if (unlikely(f6i->nh)) {
 538			nh = nexthop_fib6_nh(f6i->nh);
 539			if (nexthop_is_blackhole(f6i->nh))
 540				goto out_blackhole;
 541		} else {
 542			nh = f6i->fib6_nh;
 543		}
 544		if (!(nh->fib_nh_flags & RTNH_F_DEAD))
 545			goto out;
 546	}
 547
 548	for (spf6i = f6i; spf6i; spf6i = rcu_dereference(spf6i->fib6_next)) {
 549		bool matched = false;
 550
 551		if (unlikely(spf6i->nh)) {
 552			nh = rt6_nh_dev_match(net, spf6i->nh, res, saddr,
 553					      oif, flags);
 554			if (nh)
 555				matched = true;
 
 
 
 
 
 
 
 
 
 556		} else {
 557			nh = spf6i->fib6_nh;
 558			if (__rt6_device_match(net, nh, saddr, oif, flags))
 559				matched = true;
 560		}
 561		if (matched) {
 562			res->f6i = spf6i;
 563			goto out;
 564		}
 565	}
 566
 567	if (oif && flags & RT6_LOOKUP_F_IFACE) {
 568		res->f6i = net->ipv6.fib6_null_entry;
 569		nh = res->f6i->fib6_nh;
 570		goto out;
 571	}
 572
 573	if (unlikely(f6i->nh)) {
 574		nh = nexthop_fib6_nh(f6i->nh);
 575		if (nexthop_is_blackhole(f6i->nh))
 576			goto out_blackhole;
 577	} else {
 578		nh = f6i->fib6_nh;
 579	}
 580
 581	if (nh->fib_nh_flags & RTNH_F_DEAD) {
 582		res->f6i = net->ipv6.fib6_null_entry;
 583		nh = res->f6i->fib6_nh;
 584	}
 585out:
 586	res->nh = nh;
 587	res->fib6_type = res->f6i->fib6_type;
 588	res->fib6_flags = res->f6i->fib6_flags;
 589	return;
 590
 591out_blackhole:
 592	res->fib6_flags |= RTF_REJECT;
 593	res->fib6_type = RTN_BLACKHOLE;
 594	res->nh = nh;
 595}
 596
 597#ifdef CONFIG_IPV6_ROUTER_PREF
 598struct __rt6_probe_work {
 599	struct work_struct work;
 600	struct in6_addr target;
 601	struct net_device *dev;
 602	netdevice_tracker dev_tracker;
 603};
 604
 605static void rt6_probe_deferred(struct work_struct *w)
 606{
 607	struct in6_addr mcaddr;
 608	struct __rt6_probe_work *work =
 609		container_of(w, struct __rt6_probe_work, work);
 610
 611	addrconf_addr_solict_mult(&work->target, &mcaddr);
 612	ndisc_send_ns(work->dev, &work->target, &mcaddr, NULL, 0);
 613	netdev_put(work->dev, &work->dev_tracker);
 614	kfree(work);
 615}
 616
 617static void rt6_probe(struct fib6_nh *fib6_nh)
 618{
 619	struct __rt6_probe_work *work = NULL;
 620	const struct in6_addr *nh_gw;
 621	unsigned long last_probe;
 622	struct neighbour *neigh;
 623	struct net_device *dev;
 624	struct inet6_dev *idev;
 625
 626	/*
 627	 * Okay, this does not seem to be appropriate
 628	 * for now, however, we need to check if it
 629	 * is really so; aka Router Reachability Probing.
 630	 *
 631	 * Router Reachability Probe MUST be rate-limited
 632	 * to no more than one per minute.
 633	 */
 634	if (!fib6_nh->fib_nh_gw_family)
 635		return;
 636
 637	nh_gw = &fib6_nh->fib_nh_gw6;
 638	dev = fib6_nh->fib_nh_dev;
 639	rcu_read_lock();
 640	last_probe = READ_ONCE(fib6_nh->last_probe);
 641	idev = __in6_dev_get(dev);
 642	if (!idev)
 643		goto out;
 644	neigh = __ipv6_neigh_lookup_noref(dev, nh_gw);
 645	if (neigh) {
 646		if (READ_ONCE(neigh->nud_state) & NUD_VALID)
 647			goto out;
 648
 649		write_lock_bh(&neigh->lock);
 
 650		if (!(neigh->nud_state & NUD_VALID) &&
 651		    time_after(jiffies,
 652			       neigh->updated +
 653			       READ_ONCE(idev->cnf.rtr_probe_interval))) {
 654			work = kmalloc(sizeof(*work), GFP_ATOMIC);
 655			if (work)
 656				__neigh_set_probe_once(neigh);
 657		}
 658		write_unlock_bh(&neigh->lock);
 659	} else if (time_after(jiffies, last_probe +
 660				       READ_ONCE(idev->cnf.rtr_probe_interval))) {
 661		work = kmalloc(sizeof(*work), GFP_ATOMIC);
 662	}
 663
 664	if (!work || cmpxchg(&fib6_nh->last_probe,
 665			     last_probe, jiffies) != last_probe) {
 666		kfree(work);
 667	} else {
 668		INIT_WORK(&work->work, rt6_probe_deferred);
 669		work->target = *nh_gw;
 670		netdev_hold(dev, &work->dev_tracker, GFP_ATOMIC);
 671		work->dev = dev;
 672		schedule_work(&work->work);
 673	}
 674
 675out:
 676	rcu_read_unlock();
 677}
 678#else
 679static inline void rt6_probe(struct fib6_nh *fib6_nh)
 680{
 681}
 682#endif
 683
 684/*
 685 * Default Router Selection (RFC 2461 6.3.6)
 686 */
 687static enum rt6_nud_state rt6_check_neigh(const struct fib6_nh *fib6_nh)
 
 
 
 
 
 
 
 
 
 
 
 688{
 689	enum rt6_nud_state ret = RT6_NUD_FAIL_HARD;
 690	struct neighbour *neigh;
 
 691
 692	rcu_read_lock();
 693	neigh = __ipv6_neigh_lookup_noref(fib6_nh->fib_nh_dev,
 694					  &fib6_nh->fib_nh_gw6);
 695	if (neigh) {
 696		u8 nud_state = READ_ONCE(neigh->nud_state);
 697
 698		if (nud_state & NUD_VALID)
 
 
 
 
 699			ret = RT6_NUD_SUCCEED;
 700#ifdef CONFIG_IPV6_ROUTER_PREF
 701		else if (!(nud_state & NUD_FAILED))
 702			ret = RT6_NUD_SUCCEED;
 703		else
 704			ret = RT6_NUD_FAIL_PROBE;
 705#endif
 
 706	} else {
 707		ret = IS_ENABLED(CONFIG_IPV6_ROUTER_PREF) ?
 708		      RT6_NUD_SUCCEED : RT6_NUD_FAIL_DO_RR;
 709	}
 710	rcu_read_unlock();
 711
 712	return ret;
 713}
 714
 715static int rt6_score_route(const struct fib6_nh *nh, u32 fib6_flags, int oif,
 716			   int strict)
 717{
 718	int m = 0;
 719
 720	if (!oif || nh->fib_nh_dev->ifindex == oif)
 721		m = 2;
 722
 
 723	if (!m && (strict & RT6_LOOKUP_F_IFACE))
 724		return RT6_NUD_FAIL_HARD;
 725#ifdef CONFIG_IPV6_ROUTER_PREF
 726	m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(fib6_flags)) << 2;
 727#endif
 728	if ((strict & RT6_LOOKUP_F_REACHABLE) &&
 729	    !(fib6_flags & RTF_NONEXTHOP) && nh->fib_nh_gw_family) {
 730		int n = rt6_check_neigh(nh);
 731		if (n < 0)
 732			return n;
 733	}
 734	return m;
 735}
 736
 737static bool find_match(struct fib6_nh *nh, u32 fib6_flags,
 738		       int oif, int strict, int *mpri, bool *do_rr)
 
 739{
 740	bool match_do_rr = false;
 741	bool rc = false;
 742	int m;
 
 
 743
 744	if (nh->fib_nh_flags & RTNH_F_DEAD)
 745		goto out;
 746
 747	if (ip6_ignore_linkdown(nh->fib_nh_dev) &&
 748	    nh->fib_nh_flags & RTNH_F_LINKDOWN &&
 749	    !(strict & RT6_LOOKUP_F_IGNORE_LINKSTATE))
 750		goto out;
 751
 752	m = rt6_score_route(nh, fib6_flags, oif, strict);
 
 
 
 753	if (m == RT6_NUD_FAIL_DO_RR) {
 754		match_do_rr = true;
 755		m = 0; /* lowest valid score */
 756	} else if (m == RT6_NUD_FAIL_HARD) {
 757		goto out;
 758	}
 759
 760	if (strict & RT6_LOOKUP_F_REACHABLE)
 761		rt6_probe(nh);
 762
 763	/* note that m can be RT6_NUD_FAIL_PROBE at this point */
 764	if (m > *mpri) {
 765		*do_rr = match_do_rr;
 766		*mpri = m;
 767		rc = true;
 768	}
 769out:
 770	return rc;
 771}
 772
 773struct fib6_nh_frl_arg {
 774	u32		flags;
 775	int		oif;
 776	int		strict;
 777	int		*mpri;
 778	bool		*do_rr;
 779	struct fib6_nh	*nh;
 780};
 781
 782static int rt6_nh_find_match(struct fib6_nh *nh, void *_arg)
 783{
 784	struct fib6_nh_frl_arg *arg = _arg;
 785
 786	arg->nh = nh;
 787	return find_match(nh, arg->flags, arg->oif, arg->strict,
 788			  arg->mpri, arg->do_rr);
 789}
 790
 791static void __find_rr_leaf(struct fib6_info *f6i_start,
 792			   struct fib6_info *nomatch, u32 metric,
 793			   struct fib6_result *res, struct fib6_info **cont,
 794			   int oif, int strict, bool *do_rr, int *mpri)
 
 795{
 796	struct fib6_info *f6i;
 797
 798	for (f6i = f6i_start;
 799	     f6i && f6i != nomatch;
 800	     f6i = rcu_dereference(f6i->fib6_next)) {
 801		bool matched = false;
 802		struct fib6_nh *nh;
 803
 804		if (cont && f6i->fib6_metric != metric) {
 805			*cont = f6i;
 806			return;
 
 
 
 807		}
 808
 809		if (fib6_check_expired(f6i))
 810			continue;
 811
 812		if (unlikely(f6i->nh)) {
 813			struct fib6_nh_frl_arg arg = {
 814				.flags  = f6i->fib6_flags,
 815				.oif    = oif,
 816				.strict = strict,
 817				.mpri   = mpri,
 818				.do_rr  = do_rr
 819			};
 820
 821			if (nexthop_is_blackhole(f6i->nh)) {
 822				res->fib6_flags = RTF_REJECT;
 823				res->fib6_type = RTN_BLACKHOLE;
 824				res->f6i = f6i;
 825				res->nh = nexthop_fib6_nh(f6i->nh);
 826				return;
 827			}
 828			if (nexthop_for_each_fib6_nh(f6i->nh, rt6_nh_find_match,
 829						     &arg)) {
 830				matched = true;
 831				nh = arg.nh;
 832			}
 833		} else {
 834			nh = f6i->fib6_nh;
 835			if (find_match(nh, f6i->fib6_flags, oif, strict,
 836				       mpri, do_rr))
 837				matched = true;
 838		}
 839		if (matched) {
 840			res->f6i = f6i;
 841			res->nh = nh;
 842			res->fib6_flags = f6i->fib6_flags;
 843			res->fib6_type = f6i->fib6_type;
 844		}
 845	}
 846}
 847
 848static void find_rr_leaf(struct fib6_node *fn, struct fib6_info *leaf,
 849			 struct fib6_info *rr_head, int oif, int strict,
 850			 bool *do_rr, struct fib6_result *res)
 851{
 852	u32 metric = rr_head->fib6_metric;
 853	struct fib6_info *cont = NULL;
 854	int mpri = -1;
 855
 856	__find_rr_leaf(rr_head, NULL, metric, res, &cont,
 857		       oif, strict, do_rr, &mpri);
 858
 859	__find_rr_leaf(leaf, rr_head, metric, res, &cont,
 860		       oif, strict, do_rr, &mpri);
 861
 862	if (res->f6i || !cont)
 863		return;
 864
 865	__find_rr_leaf(cont, NULL, metric, res, NULL,
 866		       oif, strict, do_rr, &mpri);
 867}
 868
 869static void rt6_select(struct net *net, struct fib6_node *fn, int oif,
 870		       struct fib6_result *res, int strict)
 871{
 872	struct fib6_info *leaf = rcu_dereference(fn->leaf);
 873	struct fib6_info *rt0;
 874	bool do_rr = false;
 875	int key_plen;
 876
 877	/* make sure this function or its helpers sets f6i */
 878	res->f6i = NULL;
 879
 880	if (!leaf || leaf == net->ipv6.fib6_null_entry)
 881		goto out;
 882
 883	rt0 = rcu_dereference(fn->rr_ptr);
 884	if (!rt0)
 885		rt0 = leaf;
 886
 887	/* Double check to make sure fn is not an intermediate node
 888	 * and fn->leaf does not points to its child's leaf
 889	 * (This might happen if all routes under fn are deleted from
 890	 * the tree and fib6_repair_tree() is called on the node.)
 891	 */
 892	key_plen = rt0->fib6_dst.plen;
 893#ifdef CONFIG_IPV6_SUBTREES
 894	if (rt0->fib6_src.plen)
 895		key_plen = rt0->fib6_src.plen;
 896#endif
 897	if (fn->fn_bit != key_plen)
 898		goto out;
 
 
 
 899
 900	find_rr_leaf(fn, leaf, rt0, oif, strict, &do_rr, res);
 901	if (do_rr) {
 902		struct fib6_info *next = rcu_dereference(rt0->fib6_next);
 903
 904		/* no entries matched; do round-robin */
 905		if (!next || next->fib6_metric != rt0->fib6_metric)
 906			next = leaf;
 907
 908		if (next != rt0) {
 909			spin_lock_bh(&leaf->fib6_table->tb6_lock);
 910			/* make sure next is not being deleted from the tree */
 911			if (next->fib6_node)
 912				rcu_assign_pointer(fn->rr_ptr, next);
 913			spin_unlock_bh(&leaf->fib6_table->tb6_lock);
 914		}
 915	}
 916
 917out:
 918	if (!res->f6i) {
 919		res->f6i = net->ipv6.fib6_null_entry;
 920		res->nh = res->f6i->fib6_nh;
 921		res->fib6_flags = res->f6i->fib6_flags;
 922		res->fib6_type = res->f6i->fib6_type;
 923	}
 924}
 925
 926static bool rt6_is_gw_or_nonexthop(const struct fib6_result *res)
 927{
 928	return (res->f6i->fib6_flags & RTF_NONEXTHOP) ||
 929	       res->nh->fib_nh_gw_family;
 930}
 931
 932#ifdef CONFIG_IPV6_ROUTE_INFO
 933int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
 934		  const struct in6_addr *gwaddr)
 935{
 936	struct net *net = dev_net(dev);
 937	struct route_info *rinfo = (struct route_info *) opt;
 938	struct in6_addr prefix_buf, *prefix;
 939	struct fib6_table *table;
 940	unsigned int pref;
 941	unsigned long lifetime;
 942	struct fib6_info *rt;
 943
 944	if (len < sizeof(struct route_info)) {
 945		return -EINVAL;
 946	}
 947
 948	/* Sanity check for prefix_len and length */
 949	if (rinfo->length > 3) {
 950		return -EINVAL;
 951	} else if (rinfo->prefix_len > 128) {
 952		return -EINVAL;
 953	} else if (rinfo->prefix_len > 64) {
 954		if (rinfo->length < 2) {
 955			return -EINVAL;
 956		}
 957	} else if (rinfo->prefix_len > 0) {
 958		if (rinfo->length < 1) {
 959			return -EINVAL;
 960		}
 961	}
 962
 963	pref = rinfo->route_pref;
 964	if (pref == ICMPV6_ROUTER_PREF_INVALID)
 965		return -EINVAL;
 966
 967	lifetime = addrconf_timeout_fixup(ntohl(rinfo->lifetime), HZ);
 968
 969	if (rinfo->length == 3)
 970		prefix = (struct in6_addr *)rinfo->prefix;
 971	else {
 972		/* this function is safe */
 973		ipv6_addr_prefix(&prefix_buf,
 974				 (struct in6_addr *)rinfo->prefix,
 975				 rinfo->prefix_len);
 976		prefix = &prefix_buf;
 977	}
 978
 979	if (rinfo->prefix_len == 0)
 980		rt = rt6_get_dflt_router(net, gwaddr, dev);
 981	else
 982		rt = rt6_get_route_info(net, prefix, rinfo->prefix_len,
 983					gwaddr, dev);
 984
 985	if (rt && !lifetime) {
 986		ip6_del_rt(net, rt, false);
 987		rt = NULL;
 988	}
 989
 990	if (!rt && lifetime)
 991		rt = rt6_add_route_info(net, prefix, rinfo->prefix_len, gwaddr,
 992					dev, pref);
 993	else if (rt)
 994		rt->fib6_flags = RTF_ROUTEINFO |
 995				 (rt->fib6_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
 996
 997	if (rt) {
 998		table = rt->fib6_table;
 999		spin_lock_bh(&table->tb6_lock);
1000
1001		if (!addrconf_finite_timeout(lifetime)) {
1002			fib6_clean_expires(rt);
1003			fib6_remove_gc_list(rt);
1004		} else {
1005			fib6_set_expires(rt, jiffies + HZ * lifetime);
1006			fib6_add_gc_list(rt);
1007		}
1008
1009		spin_unlock_bh(&table->tb6_lock);
1010
1011		fib6_info_release(rt);
1012	}
1013	return 0;
1014}
1015#endif
1016
1017/*
1018 *	Misc support functions
1019 */
1020
1021/* called with rcu_lock held */
1022static struct net_device *ip6_rt_get_dev_rcu(const struct fib6_result *res)
1023{
1024	struct net_device *dev = res->nh->fib_nh_dev;
1025
1026	if (res->fib6_flags & (RTF_LOCAL | RTF_ANYCAST)) {
1027		/* for copies of local routes, dst->dev needs to be the
1028		 * device if it is a master device, the master device if
1029		 * device is enslaved, and the loopback as the default
1030		 */
1031		if (netif_is_l3_slave(dev) &&
1032		    !rt6_need_strict(&res->f6i->fib6_dst.addr))
1033			dev = l3mdev_master_dev_rcu(dev);
1034		else if (!netif_is_l3_master(dev))
1035			dev = dev_net(dev)->loopback_dev;
1036		/* last case is netif_is_l3_master(dev) is true in which
1037		 * case we want dev returned to be dev
1038		 */
1039	}
1040
1041	return dev;
1042}
1043
1044static const int fib6_prop[RTN_MAX + 1] = {
1045	[RTN_UNSPEC]	= 0,
1046	[RTN_UNICAST]	= 0,
1047	[RTN_LOCAL]	= 0,
1048	[RTN_BROADCAST]	= 0,
1049	[RTN_ANYCAST]	= 0,
1050	[RTN_MULTICAST]	= 0,
1051	[RTN_BLACKHOLE]	= -EINVAL,
1052	[RTN_UNREACHABLE] = -EHOSTUNREACH,
1053	[RTN_PROHIBIT]	= -EACCES,
1054	[RTN_THROW]	= -EAGAIN,
1055	[RTN_NAT]	= -EINVAL,
1056	[RTN_XRESOLVE]	= -EINVAL,
1057};
1058
1059static int ip6_rt_type_to_error(u8 fib6_type)
1060{
1061	return fib6_prop[fib6_type];
1062}
1063
1064static unsigned short fib6_info_dst_flags(struct fib6_info *rt)
1065{
1066	unsigned short flags = 0;
1067
1068	if (rt->dst_nocount)
1069		flags |= DST_NOCOUNT;
1070	if (rt->dst_nopolicy)
1071		flags |= DST_NOPOLICY;
1072
1073	return flags;
1074}
1075
1076static void ip6_rt_init_dst_reject(struct rt6_info *rt, u8 fib6_type)
1077{
1078	rt->dst.error = ip6_rt_type_to_error(fib6_type);
1079
1080	switch (fib6_type) {
1081	case RTN_BLACKHOLE:
1082		rt->dst.output = dst_discard_out;
1083		rt->dst.input = dst_discard;
1084		break;
1085	case RTN_PROHIBIT:
1086		rt->dst.output = ip6_pkt_prohibit_out;
1087		rt->dst.input = ip6_pkt_prohibit;
1088		break;
1089	case RTN_THROW:
1090	case RTN_UNREACHABLE:
1091	default:
1092		rt->dst.output = ip6_pkt_discard_out;
1093		rt->dst.input = ip6_pkt_discard;
1094		break;
1095	}
1096}
1097
1098static void ip6_rt_init_dst(struct rt6_info *rt, const struct fib6_result *res)
1099{
1100	struct fib6_info *f6i = res->f6i;
1101
1102	if (res->fib6_flags & RTF_REJECT) {
1103		ip6_rt_init_dst_reject(rt, res->fib6_type);
1104		return;
1105	}
1106
1107	rt->dst.error = 0;
1108	rt->dst.output = ip6_output;
1109
1110	if (res->fib6_type == RTN_LOCAL || res->fib6_type == RTN_ANYCAST) {
1111		rt->dst.input = ip6_input;
1112	} else if (ipv6_addr_type(&f6i->fib6_dst.addr) & IPV6_ADDR_MULTICAST) {
1113		rt->dst.input = ip6_mc_input;
1114	} else {
1115		rt->dst.input = ip6_forward;
1116	}
1117
1118	if (res->nh->fib_nh_lws) {
1119		rt->dst.lwtstate = lwtstate_get(res->nh->fib_nh_lws);
1120		lwtunnel_set_redirect(&rt->dst);
1121	}
1122
1123	rt->dst.lastuse = jiffies;
1124}
1125
1126/* Caller must already hold reference to @from */
1127static void rt6_set_from(struct rt6_info *rt, struct fib6_info *from)
1128{
1129	rt->rt6i_flags &= ~RTF_EXPIRES;
1130	rcu_assign_pointer(rt->from, from);
1131	ip_dst_init_metrics(&rt->dst, from->fib6_metrics);
1132}
1133
1134/* Caller must already hold reference to f6i in result */
1135static void ip6_rt_copy_init(struct rt6_info *rt, const struct fib6_result *res)
1136{
1137	const struct fib6_nh *nh = res->nh;
1138	const struct net_device *dev = nh->fib_nh_dev;
1139	struct fib6_info *f6i = res->f6i;
1140
1141	ip6_rt_init_dst(rt, res);
1142
1143	rt->rt6i_dst = f6i->fib6_dst;
1144	rt->rt6i_idev = dev ? in6_dev_get(dev) : NULL;
1145	rt->rt6i_flags = res->fib6_flags;
1146	if (nh->fib_nh_gw_family) {
1147		rt->rt6i_gateway = nh->fib_nh_gw6;
1148		rt->rt6i_flags |= RTF_GATEWAY;
1149	}
1150	rt6_set_from(rt, f6i);
1151#ifdef CONFIG_IPV6_SUBTREES
1152	rt->rt6i_src = f6i->fib6_src;
1153#endif
1154}
1155
1156static struct fib6_node* fib6_backtrack(struct fib6_node *fn,
1157					struct in6_addr *saddr)
1158{
1159	struct fib6_node *pn, *sn;
1160	while (1) {
1161		if (fn->fn_flags & RTN_TL_ROOT)
1162			return NULL;
1163		pn = rcu_dereference(fn->parent);
1164		sn = FIB6_SUBTREE(pn);
1165		if (sn && sn != fn)
1166			fn = fib6_node_lookup(sn, NULL, saddr);
1167		else
1168			fn = pn;
1169		if (fn->fn_flags & RTN_RTINFO)
1170			return fn;
1171	}
1172}
1173
1174static bool ip6_hold_safe(struct net *net, struct rt6_info **prt)
 
1175{
1176	struct rt6_info *rt = *prt;
1177
1178	if (dst_hold_safe(&rt->dst))
1179		return true;
1180	if (net) {
1181		rt = net->ipv6.ip6_null_entry;
1182		dst_hold(&rt->dst);
1183	} else {
1184		rt = NULL;
1185	}
1186	*prt = rt;
1187	return false;
1188}
1189
1190/* called with rcu_lock held */
1191static struct rt6_info *ip6_create_rt_rcu(const struct fib6_result *res)
1192{
1193	struct net_device *dev = res->nh->fib_nh_dev;
1194	struct fib6_info *f6i = res->f6i;
1195	unsigned short flags;
1196	struct rt6_info *nrt;
1197
1198	if (!fib6_info_hold_safe(f6i))
1199		goto fallback;
1200
1201	flags = fib6_info_dst_flags(f6i);
1202	nrt = ip6_dst_alloc(dev_net(dev), dev, flags);
1203	if (!nrt) {
1204		fib6_info_release(f6i);
1205		goto fallback;
1206	}
1207
1208	ip6_rt_copy_init(nrt, res);
1209	return nrt;
1210
1211fallback:
1212	nrt = dev_net(dev)->ipv6.ip6_null_entry;
1213	dst_hold(&nrt->dst);
1214	return nrt;
1215}
1216
1217INDIRECT_CALLABLE_SCOPE struct rt6_info *ip6_pol_route_lookup(struct net *net,
1218					     struct fib6_table *table,
1219					     struct flowi6 *fl6,
1220					     const struct sk_buff *skb,
1221					     int flags)
1222{
1223	struct fib6_result res = {};
1224	struct fib6_node *fn;
1225	struct rt6_info *rt;
 
 
1226
1227	rcu_read_lock();
1228	fn = fib6_node_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
1229restart:
1230	res.f6i = rcu_dereference(fn->leaf);
1231	if (!res.f6i)
1232		res.f6i = net->ipv6.fib6_null_entry;
1233	else
1234		rt6_device_match(net, &res, &fl6->saddr, fl6->flowi6_oif,
1235				 flags);
1236
1237	if (res.f6i == net->ipv6.fib6_null_entry) {
 
 
 
1238		fn = fib6_backtrack(fn, &fl6->saddr);
1239		if (fn)
1240			goto restart;
1241
1242		rt = net->ipv6.ip6_null_entry;
1243		dst_hold(&rt->dst);
1244		goto out;
1245	} else if (res.fib6_flags & RTF_REJECT) {
1246		goto do_create;
1247	}
1248
1249	fib6_select_path(net, &res, fl6, fl6->flowi6_oif,
1250			 fl6->flowi6_oif != 0, skb, flags);
1251
1252	/* Search through exception table */
1253	rt = rt6_find_cached_rt(&res, &fl6->daddr, &fl6->saddr);
1254	if (rt) {
1255		if (ip6_hold_safe(net, &rt))
1256			dst_use_noref(&rt->dst, jiffies);
1257	} else {
1258do_create:
1259		rt = ip6_create_rt_rcu(&res);
1260	}
1261
1262out:
1263	trace_fib6_table_lookup(net, &res, table, fl6);
1264
1265	rcu_read_unlock();
1266
 
 
1267	return rt;
 
1268}
1269
1270struct dst_entry *ip6_route_lookup(struct net *net, struct flowi6 *fl6,
1271				   const struct sk_buff *skb, int flags)
1272{
1273	return fib6_rule_lookup(net, fl6, skb, flags, ip6_pol_route_lookup);
1274}
1275EXPORT_SYMBOL_GPL(ip6_route_lookup);
1276
1277struct rt6_info *rt6_lookup(struct net *net, const struct in6_addr *daddr,
1278			    const struct in6_addr *saddr, int oif,
1279			    const struct sk_buff *skb, int strict)
1280{
1281	struct flowi6 fl6 = {
1282		.flowi6_oif = oif,
1283		.daddr = *daddr,
1284	};
1285	struct dst_entry *dst;
1286	int flags = strict ? RT6_LOOKUP_F_IFACE : 0;
1287
1288	if (saddr) {
1289		memcpy(&fl6.saddr, saddr, sizeof(*saddr));
1290		flags |= RT6_LOOKUP_F_HAS_SADDR;
1291	}
1292
1293	dst = fib6_rule_lookup(net, &fl6, skb, flags, ip6_pol_route_lookup);
1294	if (dst->error == 0)
1295		return dst_rt6_info(dst);
1296
1297	dst_release(dst);
1298
1299	return NULL;
1300}
1301EXPORT_SYMBOL(rt6_lookup);
1302
1303/* ip6_ins_rt is called with FREE table->tb6_lock.
1304 * It takes new route entry, the addition fails by any reason the
1305 * route is released.
1306 * Caller must hold dst before calling it.
1307 */
1308
1309static int __ip6_ins_rt(struct fib6_info *rt, struct nl_info *info,
 
1310			struct netlink_ext_ack *extack)
1311{
1312	int err;
1313	struct fib6_table *table;
1314
1315	table = rt->fib6_table;
1316	spin_lock_bh(&table->tb6_lock);
1317	err = fib6_add(&table->tb6_root, rt, info, extack);
1318	spin_unlock_bh(&table->tb6_lock);
1319
1320	return err;
1321}
1322
1323int ip6_ins_rt(struct net *net, struct fib6_info *rt)
1324{
1325	struct nl_info info = {	.nl_net = net, };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1326
1327	return __ip6_ins_rt(rt, &info, NULL);
1328}
1329
1330static struct rt6_info *ip6_rt_cache_alloc(const struct fib6_result *res,
1331					   const struct in6_addr *daddr,
1332					   const struct in6_addr *saddr)
1333{
1334	struct fib6_info *f6i = res->f6i;
1335	struct net_device *dev;
1336	struct rt6_info *rt;
1337
1338	/*
1339	 *	Clone the route.
1340	 */
1341
1342	if (!fib6_info_hold_safe(f6i))
1343		return NULL;
1344
1345	dev = ip6_rt_get_dev_rcu(res);
1346	rt = ip6_dst_alloc(dev_net(dev), dev, 0);
1347	if (!rt) {
1348		fib6_info_release(f6i);
 
1349		return NULL;
1350	}
1351
1352	ip6_rt_copy_init(rt, res);
1353	rt->rt6i_flags |= RTF_CACHE;
 
 
1354	rt->rt6i_dst.addr = *daddr;
1355	rt->rt6i_dst.plen = 128;
1356
1357	if (!rt6_is_gw_or_nonexthop(res)) {
1358		if (f6i->fib6_dst.plen != 128 &&
1359		    ipv6_addr_equal(&f6i->fib6_dst.addr, daddr))
1360			rt->rt6i_flags |= RTF_ANYCAST;
1361#ifdef CONFIG_IPV6_SUBTREES
1362		if (rt->rt6i_src.plen && saddr) {
1363			rt->rt6i_src.addr = *saddr;
1364			rt->rt6i_src.plen = 128;
1365		}
1366#endif
1367	}
1368
1369	return rt;
1370}
1371
1372static struct rt6_info *ip6_rt_pcpu_alloc(const struct fib6_result *res)
1373{
1374	struct fib6_info *f6i = res->f6i;
1375	unsigned short flags = fib6_info_dst_flags(f6i);
1376	struct net_device *dev;
1377	struct rt6_info *pcpu_rt;
1378
1379	if (!fib6_info_hold_safe(f6i))
1380		return NULL;
1381
1382	rcu_read_lock();
1383	dev = ip6_rt_get_dev_rcu(res);
1384	pcpu_rt = ip6_dst_alloc(dev_net(dev), dev, flags | DST_NOCOUNT);
1385	rcu_read_unlock();
1386	if (!pcpu_rt) {
1387		fib6_info_release(f6i);
1388		return NULL;
1389	}
1390	ip6_rt_copy_init(pcpu_rt, res);
1391	pcpu_rt->rt6i_flags |= RTF_PCPU;
1392
1393	if (f6i->nh)
1394		pcpu_rt->sernum = rt_genid_ipv6(dev_net(dev));
1395
1396	return pcpu_rt;
1397}
1398
1399static bool rt6_is_valid(const struct rt6_info *rt6)
1400{
1401	return rt6->sernum == rt_genid_ipv6(dev_net(rt6->dst.dev));
1402}
1403
1404/* It should be called with rcu_read_lock() acquired */
1405static struct rt6_info *rt6_get_pcpu_route(const struct fib6_result *res)
1406{
1407	struct rt6_info *pcpu_rt;
1408
1409	pcpu_rt = this_cpu_read(*res->nh->rt6i_pcpu);
 
1410
1411	if (pcpu_rt && pcpu_rt->sernum && !rt6_is_valid(pcpu_rt)) {
1412		struct rt6_info *prev, **p;
1413
1414		p = this_cpu_ptr(res->nh->rt6i_pcpu);
1415		/* Paired with READ_ONCE() in __fib6_drop_pcpu_from() */
1416		prev = xchg(p, NULL);
1417		if (prev) {
1418			dst_dev_put(&prev->dst);
1419			dst_release(&prev->dst);
1420		}
1421
1422		pcpu_rt = NULL;
1423	}
1424
1425	return pcpu_rt;
1426}
1427
1428static struct rt6_info *rt6_make_pcpu_route(struct net *net,
1429					    const struct fib6_result *res)
1430{
1431	struct rt6_info *pcpu_rt, *prev, **p;
1432
1433	pcpu_rt = ip6_rt_pcpu_alloc(res);
1434	if (!pcpu_rt)
1435		return NULL;
1436
1437	p = this_cpu_ptr(res->nh->rt6i_pcpu);
 
 
 
 
 
1438	prev = cmpxchg(p, NULL, pcpu_rt);
1439	BUG_ON(prev);
1440
1441	if (res->f6i->fib6_destroying) {
1442		struct fib6_info *from;
1443
1444		from = unrcu_pointer(xchg(&pcpu_rt->from, NULL));
1445		fib6_info_release(from);
1446	}
1447
1448	return pcpu_rt;
1449}
1450
1451/* exception hash table implementation
1452 */
1453static DEFINE_SPINLOCK(rt6_exception_lock);
1454
1455/* Remove rt6_ex from hash table and free the memory
1456 * Caller must hold rt6_exception_lock
1457 */
1458static void rt6_remove_exception(struct rt6_exception_bucket *bucket,
1459				 struct rt6_exception *rt6_ex)
1460{
1461	struct net *net;
1462
1463	if (!bucket || !rt6_ex)
1464		return;
1465
1466	net = dev_net(rt6_ex->rt6i->dst.dev);
1467	net->ipv6.rt6_stats->fib_rt_cache--;
1468
1469	/* purge completely the exception to allow releasing the held resources:
1470	 * some [sk] cache may keep the dst around for unlimited time
1471	 */
1472	dst_dev_put(&rt6_ex->rt6i->dst);
1473
1474	hlist_del_rcu(&rt6_ex->hlist);
1475	dst_release(&rt6_ex->rt6i->dst);
1476	kfree_rcu(rt6_ex, rcu);
1477	WARN_ON_ONCE(!bucket->depth);
1478	bucket->depth--;
 
1479}
1480
1481/* Remove oldest rt6_ex in bucket and free the memory
1482 * Caller must hold rt6_exception_lock
1483 */
1484static void rt6_exception_remove_oldest(struct rt6_exception_bucket *bucket)
1485{
1486	struct rt6_exception *rt6_ex, *oldest = NULL;
1487
1488	if (!bucket)
1489		return;
1490
1491	hlist_for_each_entry(rt6_ex, &bucket->chain, hlist) {
1492		if (!oldest || time_before(rt6_ex->stamp, oldest->stamp))
1493			oldest = rt6_ex;
1494	}
1495	rt6_remove_exception(bucket, oldest);
1496}
1497
1498static u32 rt6_exception_hash(const struct in6_addr *dst,
1499			      const struct in6_addr *src)
1500{
1501	static siphash_aligned_key_t rt6_exception_key;
1502	struct {
1503		struct in6_addr dst;
1504		struct in6_addr src;
1505	} __aligned(SIPHASH_ALIGNMENT) combined = {
1506		.dst = *dst,
1507	};
1508	u64 val;
1509
1510	net_get_random_once(&rt6_exception_key, sizeof(rt6_exception_key));
 
1511
1512#ifdef CONFIG_IPV6_SUBTREES
1513	if (src)
1514		combined.src = *src;
1515#endif
1516	val = siphash(&combined, sizeof(combined), &rt6_exception_key);
1517
1518	return hash_64(val, FIB6_EXCEPTION_BUCKET_SIZE_SHIFT);
1519}
1520
1521/* Helper function to find the cached rt in the hash table
1522 * and update bucket pointer to point to the bucket for this
1523 * (daddr, saddr) pair
1524 * Caller must hold rt6_exception_lock
1525 */
1526static struct rt6_exception *
1527__rt6_find_exception_spinlock(struct rt6_exception_bucket **bucket,
1528			      const struct in6_addr *daddr,
1529			      const struct in6_addr *saddr)
1530{
1531	struct rt6_exception *rt6_ex;
1532	u32 hval;
1533
1534	if (!(*bucket) || !daddr)
1535		return NULL;
1536
1537	hval = rt6_exception_hash(daddr, saddr);
1538	*bucket += hval;
1539
1540	hlist_for_each_entry(rt6_ex, &(*bucket)->chain, hlist) {
1541		struct rt6_info *rt6 = rt6_ex->rt6i;
1542		bool matched = ipv6_addr_equal(daddr, &rt6->rt6i_dst.addr);
1543
1544#ifdef CONFIG_IPV6_SUBTREES
1545		if (matched && saddr)
1546			matched = ipv6_addr_equal(saddr, &rt6->rt6i_src.addr);
1547#endif
1548		if (matched)
1549			return rt6_ex;
1550	}
1551	return NULL;
1552}
1553
1554/* Helper function to find the cached rt in the hash table
1555 * and update bucket pointer to point to the bucket for this
1556 * (daddr, saddr) pair
1557 * Caller must hold rcu_read_lock()
1558 */
1559static struct rt6_exception *
1560__rt6_find_exception_rcu(struct rt6_exception_bucket **bucket,
1561			 const struct in6_addr *daddr,
1562			 const struct in6_addr *saddr)
1563{
1564	struct rt6_exception *rt6_ex;
1565	u32 hval;
1566
1567	WARN_ON_ONCE(!rcu_read_lock_held());
1568
1569	if (!(*bucket) || !daddr)
1570		return NULL;
1571
1572	hval = rt6_exception_hash(daddr, saddr);
1573	*bucket += hval;
1574
1575	hlist_for_each_entry_rcu(rt6_ex, &(*bucket)->chain, hlist) {
1576		struct rt6_info *rt6 = rt6_ex->rt6i;
1577		bool matched = ipv6_addr_equal(daddr, &rt6->rt6i_dst.addr);
1578
1579#ifdef CONFIG_IPV6_SUBTREES
1580		if (matched && saddr)
1581			matched = ipv6_addr_equal(saddr, &rt6->rt6i_src.addr);
1582#endif
1583		if (matched)
1584			return rt6_ex;
1585	}
1586	return NULL;
1587}
1588
1589static unsigned int fib6_mtu(const struct fib6_result *res)
1590{
1591	const struct fib6_nh *nh = res->nh;
1592	unsigned int mtu;
1593
1594	if (res->f6i->fib6_pmtu) {
1595		mtu = res->f6i->fib6_pmtu;
1596	} else {
1597		struct net_device *dev = nh->fib_nh_dev;
1598		struct inet6_dev *idev;
1599
1600		rcu_read_lock();
1601		idev = __in6_dev_get(dev);
1602		mtu = READ_ONCE(idev->cnf.mtu6);
1603		rcu_read_unlock();
1604	}
1605
1606	mtu = min_t(unsigned int, mtu, IP6_MAX_MTU);
1607
1608	return mtu - lwtunnel_headroom(nh->fib_nh_lws, mtu);
1609}
1610
1611#define FIB6_EXCEPTION_BUCKET_FLUSHED  0x1UL
1612
1613/* used when the flushed bit is not relevant, only access to the bucket
1614 * (ie., all bucket users except rt6_insert_exception);
1615 *
1616 * called under rcu lock; sometimes called with rt6_exception_lock held
1617 */
1618static
1619struct rt6_exception_bucket *fib6_nh_get_excptn_bucket(const struct fib6_nh *nh,
1620						       spinlock_t *lock)
1621{
1622	struct rt6_exception_bucket *bucket;
1623
1624	if (lock)
1625		bucket = rcu_dereference_protected(nh->rt6i_exception_bucket,
1626						   lockdep_is_held(lock));
1627	else
1628		bucket = rcu_dereference(nh->rt6i_exception_bucket);
1629
1630	/* remove bucket flushed bit if set */
1631	if (bucket) {
1632		unsigned long p = (unsigned long)bucket;
1633
1634		p &= ~FIB6_EXCEPTION_BUCKET_FLUSHED;
1635		bucket = (struct rt6_exception_bucket *)p;
1636	}
1637
1638	return bucket;
1639}
1640
1641static bool fib6_nh_excptn_bucket_flushed(struct rt6_exception_bucket *bucket)
1642{
1643	unsigned long p = (unsigned long)bucket;
1644
1645	return !!(p & FIB6_EXCEPTION_BUCKET_FLUSHED);
1646}
1647
1648/* called with rt6_exception_lock held */
1649static void fib6_nh_excptn_bucket_set_flushed(struct fib6_nh *nh,
1650					      spinlock_t *lock)
1651{
1652	struct rt6_exception_bucket *bucket;
1653	unsigned long p;
1654
1655	bucket = rcu_dereference_protected(nh->rt6i_exception_bucket,
1656					   lockdep_is_held(lock));
1657
1658	p = (unsigned long)bucket;
1659	p |= FIB6_EXCEPTION_BUCKET_FLUSHED;
1660	bucket = (struct rt6_exception_bucket *)p;
1661	rcu_assign_pointer(nh->rt6i_exception_bucket, bucket);
1662}
1663
1664static int rt6_insert_exception(struct rt6_info *nrt,
1665				const struct fib6_result *res)
1666{
1667	struct net *net = dev_net(nrt->dst.dev);
1668	struct rt6_exception_bucket *bucket;
1669	struct fib6_info *f6i = res->f6i;
1670	struct in6_addr *src_key = NULL;
1671	struct rt6_exception *rt6_ex;
1672	struct fib6_nh *nh = res->nh;
1673	int max_depth;
1674	int err = 0;
1675
 
 
 
 
 
1676	spin_lock_bh(&rt6_exception_lock);
1677
1678	bucket = rcu_dereference_protected(nh->rt6i_exception_bucket,
1679					  lockdep_is_held(&rt6_exception_lock));
 
 
 
 
 
1680	if (!bucket) {
1681		bucket = kcalloc(FIB6_EXCEPTION_BUCKET_SIZE, sizeof(*bucket),
1682				 GFP_ATOMIC);
1683		if (!bucket) {
1684			err = -ENOMEM;
1685			goto out;
1686		}
1687		rcu_assign_pointer(nh->rt6i_exception_bucket, bucket);
1688	} else if (fib6_nh_excptn_bucket_flushed(bucket)) {
1689		err = -EINVAL;
1690		goto out;
1691	}
1692
1693#ifdef CONFIG_IPV6_SUBTREES
1694	/* fib6_src.plen != 0 indicates f6i is in subtree
1695	 * and exception table is indexed by a hash of
1696	 * both fib6_dst and fib6_src.
1697	 * Otherwise, the exception table is indexed by
1698	 * a hash of only fib6_dst.
1699	 */
1700	if (f6i->fib6_src.plen)
1701		src_key = &nrt->rt6i_src.addr;
1702#endif
1703	/* rt6_mtu_change() might lower mtu on f6i.
 
 
 
 
 
1704	 * Only insert this exception route if its mtu
1705	 * is less than f6i's mtu value.
1706	 */
1707	if (dst_metric_raw(&nrt->dst, RTAX_MTU) >= fib6_mtu(res)) {
1708		err = -EINVAL;
1709		goto out;
1710	}
1711
1712	rt6_ex = __rt6_find_exception_spinlock(&bucket, &nrt->rt6i_dst.addr,
1713					       src_key);
1714	if (rt6_ex)
1715		rt6_remove_exception(bucket, rt6_ex);
1716
1717	rt6_ex = kzalloc(sizeof(*rt6_ex), GFP_ATOMIC);
1718	if (!rt6_ex) {
1719		err = -ENOMEM;
1720		goto out;
1721	}
1722	rt6_ex->rt6i = nrt;
1723	rt6_ex->stamp = jiffies;
 
 
1724	hlist_add_head_rcu(&rt6_ex->hlist, &bucket->chain);
1725	bucket->depth++;
1726	net->ipv6.rt6_stats->fib_rt_cache++;
1727
1728	/* Randomize max depth to avoid some side channels attacks. */
1729	max_depth = FIB6_MAX_DEPTH + get_random_u32_below(FIB6_MAX_DEPTH);
1730	while (bucket->depth > max_depth)
1731		rt6_exception_remove_oldest(bucket);
1732
1733out:
1734	spin_unlock_bh(&rt6_exception_lock);
1735
1736	/* Update fn->fn_sernum to invalidate all cached dst */
1737	if (!err) {
1738		spin_lock_bh(&f6i->fib6_table->tb6_lock);
1739		fib6_update_sernum(net, f6i);
1740		spin_unlock_bh(&f6i->fib6_table->tb6_lock);
1741		fib6_force_start_gc(net);
1742	}
1743
1744	return err;
1745}
1746
1747static void fib6_nh_flush_exceptions(struct fib6_nh *nh, struct fib6_info *from)
1748{
1749	struct rt6_exception_bucket *bucket;
1750	struct rt6_exception *rt6_ex;
1751	struct hlist_node *tmp;
1752	int i;
1753
1754	spin_lock_bh(&rt6_exception_lock);
 
 
1755
1756	bucket = fib6_nh_get_excptn_bucket(nh, &rt6_exception_lock);
 
1757	if (!bucket)
1758		goto out;
1759
1760	/* Prevent rt6_insert_exception() to recreate the bucket list */
1761	if (!from)
1762		fib6_nh_excptn_bucket_set_flushed(nh, &rt6_exception_lock);
1763
1764	for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
1765		hlist_for_each_entry_safe(rt6_ex, tmp, &bucket->chain, hlist) {
1766			if (!from ||
1767			    rcu_access_pointer(rt6_ex->rt6i->from) == from)
1768				rt6_remove_exception(bucket, rt6_ex);
1769		}
1770		WARN_ON_ONCE(!from && bucket->depth);
1771		bucket++;
1772	}
 
1773out:
1774	spin_unlock_bh(&rt6_exception_lock);
1775}
1776
1777static int rt6_nh_flush_exceptions(struct fib6_nh *nh, void *arg)
1778{
1779	struct fib6_info *f6i = arg;
1780
1781	fib6_nh_flush_exceptions(nh, f6i);
1782
1783	return 0;
1784}
1785
1786void rt6_flush_exceptions(struct fib6_info *f6i)
1787{
1788	if (f6i->nh)
1789		nexthop_for_each_fib6_nh(f6i->nh, rt6_nh_flush_exceptions,
1790					 f6i);
1791	else
1792		fib6_nh_flush_exceptions(f6i->fib6_nh, f6i);
1793}
1794
1795/* Find cached rt in the hash table inside passed in rt
1796 * Caller has to hold rcu_read_lock()
1797 */
1798static struct rt6_info *rt6_find_cached_rt(const struct fib6_result *res,
1799					   const struct in6_addr *daddr,
1800					   const struct in6_addr *saddr)
1801{
1802	const struct in6_addr *src_key = NULL;
1803	struct rt6_exception_bucket *bucket;
 
1804	struct rt6_exception *rt6_ex;
1805	struct rt6_info *ret = NULL;
 
 
1806
1807#ifdef CONFIG_IPV6_SUBTREES
1808	/* fib6i_src.plen != 0 indicates f6i is in subtree
1809	 * and exception table is indexed by a hash of
1810	 * both fib6_dst and fib6_src.
1811	 * However, the src addr used to create the hash
1812	 * might not be exactly the passed in saddr which
1813	 * is a /128 addr from the flow.
1814	 * So we need to use f6i->fib6_src to redo lookup
1815	 * if the passed in saddr does not find anything.
1816	 * (See the logic in ip6_rt_cache_alloc() on how
1817	 * rt->rt6i_src is updated.)
1818	 */
1819	if (res->f6i->fib6_src.plen)
1820		src_key = saddr;
1821find_ex:
1822#endif
1823	bucket = fib6_nh_get_excptn_bucket(res->nh, NULL);
1824	rt6_ex = __rt6_find_exception_rcu(&bucket, daddr, src_key);
1825
1826	if (rt6_ex && !rt6_check_expired(rt6_ex->rt6i))
1827		ret = rt6_ex->rt6i;
1828
1829#ifdef CONFIG_IPV6_SUBTREES
1830	/* Use fib6_src as src_key and redo lookup */
1831	if (!ret && src_key && src_key != &res->f6i->fib6_src.addr) {
1832		src_key = &res->f6i->fib6_src.addr;
1833		goto find_ex;
1834	}
1835#endif
1836
1837	return ret;
1838}
1839
1840/* Remove the passed in cached rt from the hash table that contains it */
1841static int fib6_nh_remove_exception(const struct fib6_nh *nh, int plen,
1842				    const struct rt6_info *rt)
1843{
1844	const struct in6_addr *src_key = NULL;
1845	struct rt6_exception_bucket *bucket;
 
 
1846	struct rt6_exception *rt6_ex;
1847	int err;
1848
1849	if (!rcu_access_pointer(nh->rt6i_exception_bucket))
 
 
 
 
1850		return -ENOENT;
1851
1852	spin_lock_bh(&rt6_exception_lock);
1853	bucket = fib6_nh_get_excptn_bucket(nh, &rt6_exception_lock);
1854
1855#ifdef CONFIG_IPV6_SUBTREES
1856	/* rt6i_src.plen != 0 indicates 'from' is in subtree
1857	 * and exception table is indexed by a hash of
1858	 * both rt6i_dst and rt6i_src.
1859	 * Otherwise, the exception table is indexed by
1860	 * a hash of only rt6i_dst.
1861	 */
1862	if (plen)
1863		src_key = &rt->rt6i_src.addr;
1864#endif
1865	rt6_ex = __rt6_find_exception_spinlock(&bucket,
1866					       &rt->rt6i_dst.addr,
1867					       src_key);
1868	if (rt6_ex) {
1869		rt6_remove_exception(bucket, rt6_ex);
1870		err = 0;
1871	} else {
1872		err = -ENOENT;
1873	}
1874
1875	spin_unlock_bh(&rt6_exception_lock);
1876	return err;
1877}
1878
1879struct fib6_nh_excptn_arg {
1880	struct rt6_info	*rt;
1881	int		plen;
1882};
1883
1884static int rt6_nh_remove_exception_rt(struct fib6_nh *nh, void *_arg)
1885{
1886	struct fib6_nh_excptn_arg *arg = _arg;
1887	int err;
1888
1889	err = fib6_nh_remove_exception(nh, arg->plen, arg->rt);
1890	if (err == 0)
1891		return 1;
1892
1893	return 0;
1894}
1895
1896static int rt6_remove_exception_rt(struct rt6_info *rt)
1897{
1898	struct fib6_info *from;
1899
1900	from = rcu_dereference(rt->from);
1901	if (!from || !(rt->rt6i_flags & RTF_CACHE))
1902		return -EINVAL;
1903
1904	if (from->nh) {
1905		struct fib6_nh_excptn_arg arg = {
1906			.rt = rt,
1907			.plen = from->fib6_src.plen
1908		};
1909		int rc;
1910
1911		/* rc = 1 means an entry was found */
1912		rc = nexthop_for_each_fib6_nh(from->nh,
1913					      rt6_nh_remove_exception_rt,
1914					      &arg);
1915		return rc ? 0 : -ENOENT;
1916	}
1917
1918	return fib6_nh_remove_exception(from->fib6_nh,
1919					from->fib6_src.plen, rt);
1920}
1921
1922/* Find rt6_ex which contains the passed in rt cache and
1923 * refresh its stamp
1924 */
1925static void fib6_nh_update_exception(const struct fib6_nh *nh, int plen,
1926				     const struct rt6_info *rt)
1927{
1928	const struct in6_addr *src_key = NULL;
1929	struct rt6_exception_bucket *bucket;
 
 
1930	struct rt6_exception *rt6_ex;
1931
1932	bucket = fib6_nh_get_excptn_bucket(nh, NULL);
 
 
 
 
 
 
1933#ifdef CONFIG_IPV6_SUBTREES
1934	/* rt6i_src.plen != 0 indicates 'from' is in subtree
1935	 * and exception table is indexed by a hash of
1936	 * both rt6i_dst and rt6i_src.
1937	 * Otherwise, the exception table is indexed by
1938	 * a hash of only rt6i_dst.
1939	 */
1940	if (plen)
1941		src_key = &rt->rt6i_src.addr;
1942#endif
1943	rt6_ex = __rt6_find_exception_rcu(&bucket, &rt->rt6i_dst.addr, src_key);
 
 
1944	if (rt6_ex)
1945		rt6_ex->stamp = jiffies;
1946}
1947
1948struct fib6_nh_match_arg {
1949	const struct net_device *dev;
1950	const struct in6_addr	*gw;
1951	struct fib6_nh		*match;
1952};
1953
1954/* determine if fib6_nh has given device and gateway */
1955static int fib6_nh_find_match(struct fib6_nh *nh, void *_arg)
1956{
1957	struct fib6_nh_match_arg *arg = _arg;
1958
1959	if (arg->dev != nh->fib_nh_dev ||
1960	    (arg->gw && !nh->fib_nh_gw_family) ||
1961	    (!arg->gw && nh->fib_nh_gw_family) ||
1962	    (arg->gw && !ipv6_addr_equal(arg->gw, &nh->fib_nh_gw6)))
1963		return 0;
1964
1965	arg->match = nh;
1966
1967	/* found a match, break the loop */
1968	return 1;
1969}
1970
1971static void rt6_update_exception_stamp_rt(struct rt6_info *rt)
1972{
1973	struct fib6_info *from;
1974	struct fib6_nh *fib6_nh;
 
1975
1976	rcu_read_lock();
 
1977
1978	from = rcu_dereference(rt->from);
1979	if (!from || !(rt->rt6i_flags & RTF_CACHE))
1980		goto unlock;
1981
1982	if (from->nh) {
1983		struct fib6_nh_match_arg arg = {
1984			.dev = rt->dst.dev,
1985			.gw = &rt->rt6i_gateway,
1986		};
1987
1988		nexthop_for_each_fib6_nh(from->nh, fib6_nh_find_match, &arg);
1989
1990		if (!arg.match)
1991			goto unlock;
1992		fib6_nh = arg.match;
1993	} else {
1994		fib6_nh = from->fib6_nh;
1995	}
1996	fib6_nh_update_exception(fib6_nh, from->fib6_src.plen, rt);
1997unlock:
1998	rcu_read_unlock();
1999}
2000
2001static bool rt6_mtu_change_route_allowed(struct inet6_dev *idev,
2002					 struct rt6_info *rt, int mtu)
2003{
2004	/* If the new MTU is lower than the route PMTU, this new MTU will be the
2005	 * lowest MTU in the path: always allow updating the route PMTU to
2006	 * reflect PMTU decreases.
2007	 *
2008	 * If the new MTU is higher, and the route PMTU is equal to the local
2009	 * MTU, this means the old MTU is the lowest in the path, so allow
2010	 * updating it: if other nodes now have lower MTUs, PMTU discovery will
2011	 * handle this.
2012	 */
2013
2014	if (dst_mtu(&rt->dst) >= mtu)
2015		return true;
2016
2017	if (dst_mtu(&rt->dst) == idev->cnf.mtu6)
2018		return true;
2019
2020	return false;
2021}
2022
2023static void rt6_exceptions_update_pmtu(struct inet6_dev *idev,
2024				       const struct fib6_nh *nh, int mtu)
2025{
2026	struct rt6_exception_bucket *bucket;
2027	struct rt6_exception *rt6_ex;
2028	int i;
2029
2030	bucket = fib6_nh_get_excptn_bucket(nh, &rt6_exception_lock);
 
 
2031	if (!bucket)
2032		return;
2033
2034	for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
2035		hlist_for_each_entry(rt6_ex, &bucket->chain, hlist) {
2036			struct rt6_info *entry = rt6_ex->rt6i;
2037
2038			/* For RTF_CACHE with rt6i_pmtu == 0 (i.e. a redirected
2039			 * route), the metrics of its rt->from have already
2040			 * been updated.
2041			 */
2042			if (dst_metric_raw(&entry->dst, RTAX_MTU) &&
2043			    rt6_mtu_change_route_allowed(idev, entry, mtu))
2044				dst_metric_set(&entry->dst, RTAX_MTU, mtu);
2045		}
2046		bucket++;
2047	}
2048}
2049
2050#define RTF_CACHE_GATEWAY	(RTF_GATEWAY | RTF_CACHE)
2051
2052static void fib6_nh_exceptions_clean_tohost(const struct fib6_nh *nh,
2053					    const struct in6_addr *gateway)
2054{
2055	struct rt6_exception_bucket *bucket;
2056	struct rt6_exception *rt6_ex;
2057	struct hlist_node *tmp;
2058	int i;
2059
2060	if (!rcu_access_pointer(nh->rt6i_exception_bucket))
2061		return;
2062
2063	spin_lock_bh(&rt6_exception_lock);
2064	bucket = fib6_nh_get_excptn_bucket(nh, &rt6_exception_lock);
 
 
2065	if (bucket) {
2066		for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
2067			hlist_for_each_entry_safe(rt6_ex, tmp,
2068						  &bucket->chain, hlist) {
2069				struct rt6_info *entry = rt6_ex->rt6i;
2070
2071				if ((entry->rt6i_flags & RTF_CACHE_GATEWAY) ==
2072				    RTF_CACHE_GATEWAY &&
2073				    ipv6_addr_equal(gateway,
2074						    &entry->rt6i_gateway)) {
2075					rt6_remove_exception(bucket, rt6_ex);
2076				}
2077			}
2078			bucket++;
2079		}
2080	}
2081
2082	spin_unlock_bh(&rt6_exception_lock);
2083}
2084
2085static void rt6_age_examine_exception(struct rt6_exception_bucket *bucket,
2086				      struct rt6_exception *rt6_ex,
2087				      struct fib6_gc_args *gc_args,
2088				      unsigned long now)
2089{
2090	struct rt6_info *rt = rt6_ex->rt6i;
2091
2092	/* we are pruning and obsoleting aged-out and non gateway exceptions
2093	 * even if others have still references to them, so that on next
2094	 * dst_check() such references can be dropped.
2095	 * EXPIRES exceptions - e.g. pmtu-generated ones are pruned when
2096	 * expired, independently from their aging, as per RFC 8201 section 4
2097	 */
2098	if (!(rt->rt6i_flags & RTF_EXPIRES)) {
2099		if (time_after_eq(now, rt->dst.lastuse + gc_args->timeout)) {
2100			pr_debug("aging clone %p\n", rt);
2101			rt6_remove_exception(bucket, rt6_ex);
2102			return;
2103		}
2104	} else if (time_after(jiffies, rt->dst.expires)) {
2105		pr_debug("purging expired route %p\n", rt);
2106		rt6_remove_exception(bucket, rt6_ex);
2107		return;
2108	}
2109
2110	if (rt->rt6i_flags & RTF_GATEWAY) {
2111		struct neighbour *neigh;
 
2112
2113		neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway);
 
 
2114
2115		if (!(neigh && (neigh->flags & NTF_ROUTER))) {
2116			pr_debug("purging route %p via non-router but gateway\n",
2117				 rt);
2118			rt6_remove_exception(bucket, rt6_ex);
2119			return;
2120		}
2121	}
2122
2123	gc_args->more++;
2124}
2125
2126static void fib6_nh_age_exceptions(const struct fib6_nh *nh,
2127				   struct fib6_gc_args *gc_args,
2128				   unsigned long now)
2129{
2130	struct rt6_exception_bucket *bucket;
2131	struct rt6_exception *rt6_ex;
2132	struct hlist_node *tmp;
2133	int i;
2134
2135	if (!rcu_access_pointer(nh->rt6i_exception_bucket))
2136		return;
2137
2138	rcu_read_lock_bh();
2139	spin_lock(&rt6_exception_lock);
2140	bucket = fib6_nh_get_excptn_bucket(nh, &rt6_exception_lock);
 
 
2141	if (bucket) {
2142		for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
2143			hlist_for_each_entry_safe(rt6_ex, tmp,
2144						  &bucket->chain, hlist) {
2145				rt6_age_examine_exception(bucket, rt6_ex,
2146							  gc_args, now);
2147			}
2148			bucket++;
2149		}
2150	}
2151	spin_unlock(&rt6_exception_lock);
2152	rcu_read_unlock_bh();
2153}
2154
2155struct fib6_nh_age_excptn_arg {
2156	struct fib6_gc_args	*gc_args;
2157	unsigned long		now;
2158};
2159
2160static int rt6_nh_age_exceptions(struct fib6_nh *nh, void *_arg)
2161{
2162	struct fib6_nh_age_excptn_arg *arg = _arg;
2163
2164	fib6_nh_age_exceptions(nh, arg->gc_args, arg->now);
2165	return 0;
2166}
2167
2168void rt6_age_exceptions(struct fib6_info *f6i,
2169			struct fib6_gc_args *gc_args,
2170			unsigned long now)
2171{
2172	if (f6i->nh) {
2173		struct fib6_nh_age_excptn_arg arg = {
2174			.gc_args = gc_args,
2175			.now = now
2176		};
2177
2178		nexthop_for_each_fib6_nh(f6i->nh, rt6_nh_age_exceptions,
2179					 &arg);
2180	} else {
2181		fib6_nh_age_exceptions(f6i->fib6_nh, gc_args, now);
2182	}
2183}
2184
2185/* must be called with rcu lock held */
2186int fib6_table_lookup(struct net *net, struct fib6_table *table, int oif,
2187		      struct flowi6 *fl6, struct fib6_result *res, int strict)
2188{
2189	struct fib6_node *fn, *saved_fn;
2190
2191	fn = fib6_node_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
2192	saved_fn = fn;
2193
 
 
 
2194redo_rt6_select:
2195	rt6_select(net, fn, oif, res, strict);
2196	if (res->f6i == net->ipv6.fib6_null_entry) {
 
 
2197		fn = fib6_backtrack(fn, &fl6->saddr);
2198		if (fn)
2199			goto redo_rt6_select;
2200		else if (strict & RT6_LOOKUP_F_REACHABLE) {
2201			/* also consider unreachable route */
2202			strict &= ~RT6_LOOKUP_F_REACHABLE;
2203			fn = saved_fn;
2204			goto redo_rt6_select;
2205		}
2206	}
2207
2208	trace_fib6_table_lookup(net, res, table, fl6);
2209
2210	return 0;
2211}
2212
2213struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table,
2214			       int oif, struct flowi6 *fl6,
2215			       const struct sk_buff *skb, int flags)
2216{
2217	struct fib6_result res = {};
2218	struct rt6_info *rt = NULL;
2219	int strict = 0;
2220
2221	WARN_ON_ONCE((flags & RT6_LOOKUP_F_DST_NOREF) &&
2222		     !rcu_read_lock_held());
2223
2224	strict |= flags & RT6_LOOKUP_F_IFACE;
2225	strict |= flags & RT6_LOOKUP_F_IGNORE_LINKSTATE;
2226	if (READ_ONCE(net->ipv6.devconf_all->forwarding) == 0)
2227		strict |= RT6_LOOKUP_F_REACHABLE;
2228
2229	rcu_read_lock();
2230
2231	fib6_table_lookup(net, table, oif, fl6, &res, strict);
2232	if (res.f6i == net->ipv6.fib6_null_entry)
2233		goto out;
2234
2235	fib6_select_path(net, &res, fl6, oif, false, skb, strict);
2236
2237	/*Search through exception table */
2238	rt = rt6_find_cached_rt(&res, &fl6->daddr, &fl6->saddr);
2239	if (rt) {
2240		goto out;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2241	} else if (unlikely((fl6->flowi6_flags & FLOWI_FLAG_KNOWN_NH) &&
2242			    !res.nh->fib_nh_gw_family)) {
2243		/* Create a RTF_CACHE clone which will not be
2244		 * owned by the fib6 tree.  It is for the special case where
2245		 * the daddr in the skb during the neighbor look-up is different
2246		 * from the fl6->daddr used to look-up route here.
2247		 */
2248		rt = ip6_rt_cache_alloc(&res, &fl6->daddr, NULL);
2249
2250		if (rt) {
2251			/* 1 refcnt is taken during ip6_rt_cache_alloc().
2252			 * As rt6_uncached_list_add() does not consume refcnt,
2253			 * this refcnt is always returned to the caller even
2254			 * if caller sets RT6_LOOKUP_F_DST_NOREF flag.
2255			 */
2256			rt6_uncached_list_add(rt);
2257			rcu_read_unlock();
 
 
 
 
2258
2259			return rt;
 
 
 
 
 
 
 
 
 
 
 
2260		}
 
 
 
 
 
2261	} else {
2262		/* Get a percpu copy */
2263		local_bh_disable();
2264		rt = rt6_get_pcpu_route(&res);
2265
2266		if (!rt)
2267			rt = rt6_make_pcpu_route(net, &res);
2268
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2269		local_bh_enable();
 
 
 
2270	}
2271out:
2272	if (!rt)
2273		rt = net->ipv6.ip6_null_entry;
2274	if (!(flags & RT6_LOOKUP_F_DST_NOREF))
2275		ip6_hold_safe(net, &rt);
2276	rcu_read_unlock();
2277
2278	return rt;
2279}
2280EXPORT_SYMBOL_GPL(ip6_pol_route);
2281
2282INDIRECT_CALLABLE_SCOPE struct rt6_info *ip6_pol_route_input(struct net *net,
2283					    struct fib6_table *table,
2284					    struct flowi6 *fl6,
2285					    const struct sk_buff *skb,
2286					    int flags)
2287{
2288	return ip6_pol_route(net, table, fl6->flowi6_iif, fl6, skb, flags);
2289}
2290
2291struct dst_entry *ip6_route_input_lookup(struct net *net,
2292					 struct net_device *dev,
2293					 struct flowi6 *fl6,
2294					 const struct sk_buff *skb,
2295					 int flags)
2296{
2297	if (rt6_need_strict(&fl6->daddr) && dev->type != ARPHRD_PIMREG)
2298		flags |= RT6_LOOKUP_F_IFACE;
2299
2300	return fib6_rule_lookup(net, fl6, skb, flags, ip6_pol_route_input);
2301}
2302EXPORT_SYMBOL_GPL(ip6_route_input_lookup);
2303
2304static void ip6_multipath_l3_keys(const struct sk_buff *skb,
2305				  struct flow_keys *keys,
2306				  struct flow_keys *flkeys)
2307{
2308	const struct ipv6hdr *outer_iph = ipv6_hdr(skb);
2309	const struct ipv6hdr *key_iph = outer_iph;
2310	struct flow_keys *_flkeys = flkeys;
2311	const struct ipv6hdr *inner_iph;
2312	const struct icmp6hdr *icmph;
2313	struct ipv6hdr _inner_iph;
2314	struct icmp6hdr _icmph;
2315
2316	if (likely(outer_iph->nexthdr != IPPROTO_ICMPV6))
2317		goto out;
2318
2319	icmph = skb_header_pointer(skb, skb_transport_offset(skb),
2320				   sizeof(_icmph), &_icmph);
2321	if (!icmph)
2322		goto out;
2323
2324	if (!icmpv6_is_err(icmph->icmp6_type))
 
 
 
2325		goto out;
2326
2327	inner_iph = skb_header_pointer(skb,
2328				       skb_transport_offset(skb) + sizeof(*icmph),
2329				       sizeof(_inner_iph), &_inner_iph);
2330	if (!inner_iph)
2331		goto out;
2332
2333	key_iph = inner_iph;
2334	_flkeys = NULL;
2335out:
2336	if (_flkeys) {
2337		keys->addrs.v6addrs.src = _flkeys->addrs.v6addrs.src;
2338		keys->addrs.v6addrs.dst = _flkeys->addrs.v6addrs.dst;
2339		keys->tags.flow_label = _flkeys->tags.flow_label;
2340		keys->basic.ip_proto = _flkeys->basic.ip_proto;
2341	} else {
2342		keys->addrs.v6addrs.src = key_iph->saddr;
2343		keys->addrs.v6addrs.dst = key_iph->daddr;
2344		keys->tags.flow_label = ip6_flowlabel(key_iph);
2345		keys->basic.ip_proto = key_iph->nexthdr;
2346	}
2347}
2348
2349static u32 rt6_multipath_custom_hash_outer(const struct net *net,
2350					   const struct sk_buff *skb,
2351					   bool *p_has_inner)
2352{
2353	u32 hash_fields = ip6_multipath_hash_fields(net);
2354	struct flow_keys keys, hash_keys;
2355
2356	if (!(hash_fields & FIB_MULTIPATH_HASH_FIELD_OUTER_MASK))
2357		return 0;
2358
2359	memset(&hash_keys, 0, sizeof(hash_keys));
2360	skb_flow_dissect_flow_keys(skb, &keys, FLOW_DISSECTOR_F_STOP_AT_ENCAP);
2361
2362	hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2363	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_SRC_IP)
2364		hash_keys.addrs.v6addrs.src = keys.addrs.v6addrs.src;
2365	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_DST_IP)
2366		hash_keys.addrs.v6addrs.dst = keys.addrs.v6addrs.dst;
2367	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_IP_PROTO)
2368		hash_keys.basic.ip_proto = keys.basic.ip_proto;
2369	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_FLOWLABEL)
2370		hash_keys.tags.flow_label = keys.tags.flow_label;
2371	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_SRC_PORT)
2372		hash_keys.ports.src = keys.ports.src;
2373	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_DST_PORT)
2374		hash_keys.ports.dst = keys.ports.dst;
2375
2376	*p_has_inner = !!(keys.control.flags & FLOW_DIS_ENCAPSULATION);
2377	return fib_multipath_hash_from_keys(net, &hash_keys);
2378}
2379
2380static u32 rt6_multipath_custom_hash_inner(const struct net *net,
2381					   const struct sk_buff *skb,
2382					   bool has_inner)
2383{
2384	u32 hash_fields = ip6_multipath_hash_fields(net);
2385	struct flow_keys keys, hash_keys;
2386
2387	/* We assume the packet carries an encapsulation, but if none was
2388	 * encountered during dissection of the outer flow, then there is no
2389	 * point in calling the flow dissector again.
2390	 */
2391	if (!has_inner)
2392		return 0;
2393
2394	if (!(hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_MASK))
2395		return 0;
2396
2397	memset(&hash_keys, 0, sizeof(hash_keys));
2398	skb_flow_dissect_flow_keys(skb, &keys, 0);
2399
2400	if (!(keys.control.flags & FLOW_DIS_ENCAPSULATION))
2401		return 0;
2402
2403	if (keys.control.addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) {
2404		hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
2405		if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_SRC_IP)
2406			hash_keys.addrs.v4addrs.src = keys.addrs.v4addrs.src;
2407		if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_DST_IP)
2408			hash_keys.addrs.v4addrs.dst = keys.addrs.v4addrs.dst;
2409	} else if (keys.control.addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) {
2410		hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2411		if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_SRC_IP)
2412			hash_keys.addrs.v6addrs.src = keys.addrs.v6addrs.src;
2413		if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_DST_IP)
2414			hash_keys.addrs.v6addrs.dst = keys.addrs.v6addrs.dst;
2415		if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_FLOWLABEL)
2416			hash_keys.tags.flow_label = keys.tags.flow_label;
2417	}
2418
2419	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_IP_PROTO)
2420		hash_keys.basic.ip_proto = keys.basic.ip_proto;
2421	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_SRC_PORT)
2422		hash_keys.ports.src = keys.ports.src;
2423	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_INNER_DST_PORT)
2424		hash_keys.ports.dst = keys.ports.dst;
2425
2426	return fib_multipath_hash_from_keys(net, &hash_keys);
2427}
2428
2429static u32 rt6_multipath_custom_hash_skb(const struct net *net,
2430					 const struct sk_buff *skb)
2431{
2432	u32 mhash, mhash_inner;
2433	bool has_inner = true;
2434
2435	mhash = rt6_multipath_custom_hash_outer(net, skb, &has_inner);
2436	mhash_inner = rt6_multipath_custom_hash_inner(net, skb, has_inner);
2437
2438	return jhash_2words(mhash, mhash_inner, 0);
2439}
2440
2441static u32 rt6_multipath_custom_hash_fl6(const struct net *net,
2442					 const struct flowi6 *fl6)
2443{
2444	u32 hash_fields = ip6_multipath_hash_fields(net);
2445	struct flow_keys hash_keys;
2446
2447	if (!(hash_fields & FIB_MULTIPATH_HASH_FIELD_OUTER_MASK))
2448		return 0;
2449
2450	memset(&hash_keys, 0, sizeof(hash_keys));
2451	hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2452	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_SRC_IP)
2453		hash_keys.addrs.v6addrs.src = fl6->saddr;
2454	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_DST_IP)
2455		hash_keys.addrs.v6addrs.dst = fl6->daddr;
2456	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_IP_PROTO)
2457		hash_keys.basic.ip_proto = fl6->flowi6_proto;
2458	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_FLOWLABEL)
2459		hash_keys.tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6);
2460	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_SRC_PORT)
2461		hash_keys.ports.src = fl6->fl6_sport;
2462	if (hash_fields & FIB_MULTIPATH_HASH_FIELD_DST_PORT)
2463		hash_keys.ports.dst = fl6->fl6_dport;
2464
2465	return fib_multipath_hash_from_keys(net, &hash_keys);
2466}
2467
2468/* if skb is set it will be used and fl6 can be NULL */
2469u32 rt6_multipath_hash(const struct net *net, const struct flowi6 *fl6,
2470		       const struct sk_buff *skb, struct flow_keys *flkeys)
2471{
2472	struct flow_keys hash_keys;
2473	u32 mhash = 0;
2474
2475	switch (ip6_multipath_hash_policy(net)) {
2476	case 0:
2477		memset(&hash_keys, 0, sizeof(hash_keys));
2478		hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2479		if (skb) {
2480			ip6_multipath_l3_keys(skb, &hash_keys, flkeys);
2481		} else {
2482			hash_keys.addrs.v6addrs.src = fl6->saddr;
2483			hash_keys.addrs.v6addrs.dst = fl6->daddr;
2484			hash_keys.tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6);
2485			hash_keys.basic.ip_proto = fl6->flowi6_proto;
2486		}
2487		mhash = fib_multipath_hash_from_keys(net, &hash_keys);
2488		break;
2489	case 1:
2490		if (skb) {
2491			unsigned int flag = FLOW_DISSECTOR_F_STOP_AT_ENCAP;
2492			struct flow_keys keys;
2493
2494			/* short-circuit if we already have L4 hash present */
2495			if (skb->l4_hash)
2496				return skb_get_hash_raw(skb) >> 1;
2497
2498			memset(&hash_keys, 0, sizeof(hash_keys));
2499
2500			if (!flkeys) {
2501				skb_flow_dissect_flow_keys(skb, &keys, flag);
2502				flkeys = &keys;
2503			}
2504			hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2505			hash_keys.addrs.v6addrs.src = flkeys->addrs.v6addrs.src;
2506			hash_keys.addrs.v6addrs.dst = flkeys->addrs.v6addrs.dst;
2507			hash_keys.ports.src = flkeys->ports.src;
2508			hash_keys.ports.dst = flkeys->ports.dst;
2509			hash_keys.basic.ip_proto = flkeys->basic.ip_proto;
2510		} else {
2511			memset(&hash_keys, 0, sizeof(hash_keys));
2512			hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2513			hash_keys.addrs.v6addrs.src = fl6->saddr;
2514			hash_keys.addrs.v6addrs.dst = fl6->daddr;
2515			hash_keys.ports.src = fl6->fl6_sport;
2516			hash_keys.ports.dst = fl6->fl6_dport;
2517			hash_keys.basic.ip_proto = fl6->flowi6_proto;
2518		}
2519		mhash = fib_multipath_hash_from_keys(net, &hash_keys);
2520		break;
2521	case 2:
2522		memset(&hash_keys, 0, sizeof(hash_keys));
2523		hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2524		if (skb) {
2525			struct flow_keys keys;
2526
2527			if (!flkeys) {
2528				skb_flow_dissect_flow_keys(skb, &keys, 0);
2529				flkeys = &keys;
2530			}
2531
2532			/* Inner can be v4 or v6 */
2533			if (flkeys->control.addr_type == FLOW_DISSECTOR_KEY_IPV4_ADDRS) {
2534				hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
2535				hash_keys.addrs.v4addrs.src = flkeys->addrs.v4addrs.src;
2536				hash_keys.addrs.v4addrs.dst = flkeys->addrs.v4addrs.dst;
2537			} else if (flkeys->control.addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) {
2538				hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2539				hash_keys.addrs.v6addrs.src = flkeys->addrs.v6addrs.src;
2540				hash_keys.addrs.v6addrs.dst = flkeys->addrs.v6addrs.dst;
2541				hash_keys.tags.flow_label = flkeys->tags.flow_label;
2542				hash_keys.basic.ip_proto = flkeys->basic.ip_proto;
2543			} else {
2544				/* Same as case 0 */
2545				hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2546				ip6_multipath_l3_keys(skb, &hash_keys, flkeys);
2547			}
2548		} else {
2549			/* Same as case 0 */
2550			hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
2551			hash_keys.addrs.v6addrs.src = fl6->saddr;
2552			hash_keys.addrs.v6addrs.dst = fl6->daddr;
2553			hash_keys.tags.flow_label = (__force u32)flowi6_get_flowlabel(fl6);
2554			hash_keys.basic.ip_proto = fl6->flowi6_proto;
2555		}
2556		mhash = fib_multipath_hash_from_keys(net, &hash_keys);
2557		break;
2558	case 3:
2559		if (skb)
2560			mhash = rt6_multipath_custom_hash_skb(net, skb);
2561		else
2562			mhash = rt6_multipath_custom_hash_fl6(net, fl6);
2563		break;
2564	}
 
2565
2566	return mhash >> 1;
2567}
2568
2569/* Called with rcu held */
2570void ip6_route_input(struct sk_buff *skb)
2571{
2572	const struct ipv6hdr *iph = ipv6_hdr(skb);
2573	struct net *net = dev_net(skb->dev);
2574	int flags = RT6_LOOKUP_F_HAS_SADDR | RT6_LOOKUP_F_DST_NOREF;
2575	struct ip_tunnel_info *tun_info;
2576	struct flowi6 fl6 = {
2577		.flowi6_iif = skb->dev->ifindex,
2578		.daddr = iph->daddr,
2579		.saddr = iph->saddr,
2580		.flowlabel = ip6_flowinfo(iph),
2581		.flowi6_mark = skb->mark,
2582		.flowi6_proto = iph->nexthdr,
2583	};
2584	struct flow_keys *flkeys = NULL, _flkeys;
2585
2586	tun_info = skb_tunnel_info(skb);
2587	if (tun_info && !(tun_info->mode & IP_TUNNEL_INFO_TX))
2588		fl6.flowi6_tun_key.tun_id = tun_info->key.tun_id;
2589
2590	if (fib6_rules_early_flow_dissect(net, skb, &fl6, &_flkeys))
2591		flkeys = &_flkeys;
2592
2593	if (unlikely(fl6.flowi6_proto == IPPROTO_ICMPV6))
2594		fl6.mp_hash = rt6_multipath_hash(net, &fl6, skb, flkeys);
2595	skb_dst_drop(skb);
2596	skb_dst_set_noref(skb, ip6_route_input_lookup(net, skb->dev,
2597						      &fl6, skb, flags));
2598}
2599
2600INDIRECT_CALLABLE_SCOPE struct rt6_info *ip6_pol_route_output(struct net *net,
2601					     struct fib6_table *table,
2602					     struct flowi6 *fl6,
2603					     const struct sk_buff *skb,
2604					     int flags)
2605{
2606	return ip6_pol_route(net, table, fl6->flowi6_oif, fl6, skb, flags);
2607}
2608
2609static struct dst_entry *ip6_route_output_flags_noref(struct net *net,
2610						      const struct sock *sk,
2611						      struct flowi6 *fl6,
2612						      int flags)
2613{
2614	bool any_src;
2615
2616	if (ipv6_addr_type(&fl6->daddr) &
2617	    (IPV6_ADDR_MULTICAST | IPV6_ADDR_LINKLOCAL)) {
2618		struct dst_entry *dst;
2619
2620		/* This function does not take refcnt on the dst */
2621		dst = l3mdev_link_scope_lookup(net, fl6);
2622		if (dst)
2623			return dst;
2624	}
2625
2626	fl6->flowi6_iif = LOOPBACK_IFINDEX;
2627
2628	flags |= RT6_LOOKUP_F_DST_NOREF;
2629	any_src = ipv6_addr_any(&fl6->saddr);
2630	if ((sk && sk->sk_bound_dev_if) || rt6_need_strict(&fl6->daddr) ||
2631	    (fl6->flowi6_oif && any_src))
2632		flags |= RT6_LOOKUP_F_IFACE;
2633
2634	if (!any_src)
2635		flags |= RT6_LOOKUP_F_HAS_SADDR;
2636	else if (sk)
2637		flags |= rt6_srcprefs2flags(READ_ONCE(inet6_sk(sk)->srcprefs));
2638
2639	return fib6_rule_lookup(net, fl6, NULL, flags, ip6_pol_route_output);
2640}
2641
2642struct dst_entry *ip6_route_output_flags(struct net *net,
2643					 const struct sock *sk,
2644					 struct flowi6 *fl6,
2645					 int flags)
2646{
2647	struct dst_entry *dst;
2648	struct rt6_info *rt6;
2649
2650	rcu_read_lock();
2651	dst = ip6_route_output_flags_noref(net, sk, fl6, flags);
2652	rt6 = dst_rt6_info(dst);
2653	/* For dst cached in uncached_list, refcnt is already taken. */
2654	if (list_empty(&rt6->dst.rt_uncached) && !dst_hold_safe(dst)) {
2655		dst = &net->ipv6.ip6_null_entry->dst;
2656		dst_hold(dst);
2657	}
2658	rcu_read_unlock();
2659
2660	return dst;
2661}
2662EXPORT_SYMBOL_GPL(ip6_route_output_flags);
2663
2664struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_orig)
2665{
2666	struct rt6_info *rt, *ort = dst_rt6_info(dst_orig);
2667	struct net_device *loopback_dev = net->loopback_dev;
2668	struct dst_entry *new = NULL;
2669
2670	rt = dst_alloc(&ip6_dst_blackhole_ops, loopback_dev,
2671		       DST_OBSOLETE_DEAD, 0);
2672	if (rt) {
2673		rt6_info_init(rt);
2674		atomic_inc(&net->ipv6.rt6_stats->fib_rt_alloc);
2675
2676		new = &rt->dst;
2677		new->__use = 1;
2678		new->input = dst_discard;
2679		new->output = dst_discard_out;
2680
2681		dst_copy_metrics(new, &ort->dst);
2682
2683		rt->rt6i_idev = in6_dev_get(loopback_dev);
2684		rt->rt6i_gateway = ort->rt6i_gateway;
2685		rt->rt6i_flags = ort->rt6i_flags & ~RTF_PCPU;
 
2686
2687		memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key));
2688#ifdef CONFIG_IPV6_SUBTREES
2689		memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key));
2690#endif
2691	}
2692
2693	dst_release(dst_orig);
2694	return new ? new : ERR_PTR(-ENOMEM);
2695}
2696
2697/*
2698 *	Destination cache support functions
2699 */
2700
2701static bool fib6_check(struct fib6_info *f6i, u32 cookie)
2702{
2703	u32 rt_cookie = 0;
2704
2705	if (!fib6_get_cookie_safe(f6i, &rt_cookie) || rt_cookie != cookie)
2706		return false;
2707
2708	if (fib6_check_expired(f6i))
2709		return false;
2710
2711	return true;
2712}
2713
2714static struct dst_entry *rt6_check(struct rt6_info *rt,
2715				   struct fib6_info *from,
2716				   u32 cookie)
2717{
2718	u32 rt_cookie = 0;
2719
2720	if (!from || !fib6_get_cookie_safe(from, &rt_cookie) ||
2721	    rt_cookie != cookie)
2722		return NULL;
2723
2724	if (rt6_check_expired(rt))
2725		return NULL;
2726
2727	return &rt->dst;
2728}
2729
2730static struct dst_entry *rt6_dst_from_check(struct rt6_info *rt,
2731					    struct fib6_info *from,
2732					    u32 cookie)
2733{
2734	if (!__rt6_check_expired(rt) &&
2735	    rt->dst.obsolete == DST_OBSOLETE_FORCE_CHK &&
2736	    fib6_check(from, cookie))
2737		return &rt->dst;
2738	else
2739		return NULL;
2740}
2741
2742INDIRECT_CALLABLE_SCOPE struct dst_entry *ip6_dst_check(struct dst_entry *dst,
2743							u32 cookie)
2744{
2745	struct dst_entry *dst_ret;
2746	struct fib6_info *from;
2747	struct rt6_info *rt;
2748
2749	rt = dst_rt6_info(dst);
2750
2751	if (rt->sernum)
2752		return rt6_is_valid(rt) ? dst : NULL;
2753
2754	rcu_read_lock();
2755
2756	/* All IPV6 dsts are created with ->obsolete set to the value
2757	 * DST_OBSOLETE_FORCE_CHK which forces validation calls down
2758	 * into this function always.
2759	 */
2760
2761	from = rcu_dereference(rt->from);
2762
2763	if (from && (rt->rt6i_flags & RTF_PCPU ||
2764	    unlikely(!list_empty(&rt->dst.rt_uncached))))
2765		dst_ret = rt6_dst_from_check(rt, from, cookie);
2766	else
2767		dst_ret = rt6_check(rt, from, cookie);
2768
2769	rcu_read_unlock();
2770
2771	return dst_ret;
2772}
2773EXPORT_INDIRECT_CALLABLE(ip6_dst_check);
2774
2775static void ip6_negative_advice(struct sock *sk,
2776				struct dst_entry *dst)
2777{
2778	struct rt6_info *rt = dst_rt6_info(dst);
2779
2780	if (rt->rt6i_flags & RTF_CACHE) {
2781		rcu_read_lock();
2782		if (rt6_check_expired(rt)) {
2783			/* rt/dst can not be destroyed yet,
2784			 * because of rcu_read_lock()
2785			 */
2786			sk_dst_reset(sk);
2787			rt6_remove_exception_rt(rt);
 
2788		}
2789		rcu_read_unlock();
2790		return;
2791	}
2792	sk_dst_reset(sk);
2793}
2794
2795static void ip6_link_failure(struct sk_buff *skb)
2796{
2797	struct rt6_info *rt;
2798
2799	icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0);
2800
2801	rt = dst_rt6_info(skb_dst(skb));
2802	if (rt) {
2803		rcu_read_lock();
2804		if (rt->rt6i_flags & RTF_CACHE) {
2805			rt6_remove_exception_rt(rt);
 
2806		} else {
2807			struct fib6_info *from;
2808			struct fib6_node *fn;
2809
2810			from = rcu_dereference(rt->from);
2811			if (from) {
2812				fn = rcu_dereference(from->fib6_node);
2813				if (fn && (rt->rt6i_flags & RTF_DEFAULT))
2814					WRITE_ONCE(fn->fn_sernum, -1);
2815			}
2816		}
2817		rcu_read_unlock();
2818	}
2819}
2820
2821static void rt6_update_expires(struct rt6_info *rt0, int timeout)
2822{
2823	if (!(rt0->rt6i_flags & RTF_EXPIRES)) {
2824		struct fib6_info *from;
2825
2826		rcu_read_lock();
2827		from = rcu_dereference(rt0->from);
2828		if (from)
2829			rt0->dst.expires = from->expires;
2830		rcu_read_unlock();
2831	}
2832
2833	dst_set_expires(&rt0->dst, timeout);
2834	rt0->rt6i_flags |= RTF_EXPIRES;
2835}
2836
2837static void rt6_do_update_pmtu(struct rt6_info *rt, u32 mtu)
2838{
2839	struct net *net = dev_net(rt->dst.dev);
2840
2841	dst_metric_set(&rt->dst, RTAX_MTU, mtu);
2842	rt->rt6i_flags |= RTF_MODIFIED;
 
2843	rt6_update_expires(rt, net->ipv6.sysctl.ip6_rt_mtu_expires);
2844}
2845
2846static bool rt6_cache_allowed_for_pmtu(const struct rt6_info *rt)
2847{
2848	return !(rt->rt6i_flags & RTF_CACHE) &&
2849		(rt->rt6i_flags & RTF_PCPU || rcu_access_pointer(rt->from));
 
2850}
2851
2852static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk,
2853				 const struct ipv6hdr *iph, u32 mtu,
2854				 bool confirm_neigh)
2855{
2856	const struct in6_addr *daddr, *saddr;
2857	struct rt6_info *rt6 = dst_rt6_info(dst);
2858
2859	/* Note: do *NOT* check dst_metric_locked(dst, RTAX_MTU)
2860	 * IPv6 pmtu discovery isn't optional, so 'mtu lock' cannot disable it.
2861	 * [see also comment in rt6_mtu_change_route()]
2862	 */
 
2863
2864	if (iph) {
2865		daddr = &iph->daddr;
2866		saddr = &iph->saddr;
2867	} else if (sk) {
2868		daddr = &sk->sk_v6_daddr;
2869		saddr = &inet6_sk(sk)->saddr;
2870	} else {
2871		daddr = NULL;
2872		saddr = NULL;
2873	}
2874
2875	if (confirm_neigh)
2876		dst_confirm_neigh(dst, daddr);
2877
2878	if (mtu < IPV6_MIN_MTU)
2879		return;
2880	if (mtu >= dst_mtu(dst))
2881		return;
2882
2883	if (!rt6_cache_allowed_for_pmtu(rt6)) {
2884		rt6_do_update_pmtu(rt6, mtu);
2885		/* update rt6_ex->stamp for cache */
2886		if (rt6->rt6i_flags & RTF_CACHE)
2887			rt6_update_exception_stamp_rt(rt6);
2888	} else if (daddr) {
2889		struct fib6_result res = {};
2890		struct rt6_info *nrt6;
2891
2892		rcu_read_lock();
2893		res.f6i = rcu_dereference(rt6->from);
2894		if (!res.f6i)
2895			goto out_unlock;
2896
2897		res.fib6_flags = res.f6i->fib6_flags;
2898		res.fib6_type = res.f6i->fib6_type;
2899
2900		if (res.f6i->nh) {
2901			struct fib6_nh_match_arg arg = {
2902				.dev = dst->dev,
2903				.gw = &rt6->rt6i_gateway,
2904			};
2905
2906			nexthop_for_each_fib6_nh(res.f6i->nh,
2907						 fib6_nh_find_match, &arg);
2908
2909			/* fib6_info uses a nexthop that does not have fib6_nh
2910			 * using the dst->dev + gw. Should be impossible.
2911			 */
2912			if (!arg.match)
2913				goto out_unlock;
2914
2915			res.nh = arg.match;
2916		} else {
2917			res.nh = res.f6i->fib6_nh;
2918		}
2919
2920		nrt6 = ip6_rt_cache_alloc(&res, daddr, saddr);
2921		if (nrt6) {
2922			rt6_do_update_pmtu(nrt6, mtu);
2923			if (rt6_insert_exception(nrt6, &res))
2924				dst_release_immediate(&nrt6->dst);
2925		}
2926out_unlock:
2927		rcu_read_unlock();
2928	}
2929}
2930
2931static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
2932			       struct sk_buff *skb, u32 mtu,
2933			       bool confirm_neigh)
2934{
2935	__ip6_rt_update_pmtu(dst, sk, skb ? ipv6_hdr(skb) : NULL, mtu,
2936			     confirm_neigh);
2937}
2938
2939void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu,
2940		     int oif, u32 mark, kuid_t uid)
2941{
2942	const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data;
2943	struct dst_entry *dst;
2944	struct flowi6 fl6 = {
2945		.flowi6_oif = oif,
2946		.flowi6_mark = mark ? mark : IP6_REPLY_MARK(net, skb->mark),
2947		.daddr = iph->daddr,
2948		.saddr = iph->saddr,
2949		.flowlabel = ip6_flowinfo(iph),
2950		.flowi6_uid = uid,
2951	};
 
2952
2953	dst = ip6_route_output(net, NULL, &fl6);
2954	if (!dst->error)
2955		__ip6_rt_update_pmtu(dst, NULL, iph, ntohl(mtu), true);
2956	dst_release(dst);
2957}
2958EXPORT_SYMBOL_GPL(ip6_update_pmtu);
2959
2960void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, __be32 mtu)
2961{
2962	int oif = sk->sk_bound_dev_if;
2963	struct dst_entry *dst;
2964
2965	if (!oif && skb->dev)
2966		oif = l3mdev_master_ifindex(skb->dev);
2967
2968	ip6_update_pmtu(skb, sock_net(sk), mtu, oif, READ_ONCE(sk->sk_mark),
2969			sk->sk_uid);
2970
2971	dst = __sk_dst_get(sk);
2972	if (!dst || !dst->obsolete ||
2973	    dst->ops->check(dst, inet6_sk(sk)->dst_cookie))
2974		return;
2975
2976	bh_lock_sock(sk);
2977	if (!sock_owned_by_user(sk) && !ipv6_addr_v4mapped(&sk->sk_v6_daddr))
2978		ip6_datagram_dst_update(sk, false);
2979	bh_unlock_sock(sk);
2980}
2981EXPORT_SYMBOL_GPL(ip6_sk_update_pmtu);
2982
2983void ip6_sk_dst_store_flow(struct sock *sk, struct dst_entry *dst,
2984			   const struct flowi6 *fl6)
2985{
2986#ifdef CONFIG_IPV6_SUBTREES
2987	struct ipv6_pinfo *np = inet6_sk(sk);
2988#endif
2989
2990	ip6_dst_store(sk, dst,
2991		      ipv6_addr_equal(&fl6->daddr, &sk->sk_v6_daddr) ?
2992		      &sk->sk_v6_daddr : NULL,
2993#ifdef CONFIG_IPV6_SUBTREES
2994		      ipv6_addr_equal(&fl6->saddr, &np->saddr) ?
2995		      &np->saddr :
2996#endif
2997		      NULL);
2998}
2999
3000static bool ip6_redirect_nh_match(const struct fib6_result *res,
3001				  struct flowi6 *fl6,
3002				  const struct in6_addr *gw,
3003				  struct rt6_info **ret)
3004{
3005	const struct fib6_nh *nh = res->nh;
3006
3007	if (nh->fib_nh_flags & RTNH_F_DEAD || !nh->fib_nh_gw_family ||
3008	    fl6->flowi6_oif != nh->fib_nh_dev->ifindex)
3009		return false;
3010
3011	/* rt_cache's gateway might be different from its 'parent'
3012	 * in the case of an ip redirect.
3013	 * So we keep searching in the exception table if the gateway
3014	 * is different.
3015	 */
3016	if (!ipv6_addr_equal(gw, &nh->fib_nh_gw6)) {
3017		struct rt6_info *rt_cache;
3018
3019		rt_cache = rt6_find_cached_rt(res, &fl6->daddr, &fl6->saddr);
3020		if (rt_cache &&
3021		    ipv6_addr_equal(gw, &rt_cache->rt6i_gateway)) {
3022			*ret = rt_cache;
3023			return true;
3024		}
3025		return false;
3026	}
3027	return true;
3028}
3029
3030struct fib6_nh_rd_arg {
3031	struct fib6_result	*res;
3032	struct flowi6		*fl6;
3033	const struct in6_addr	*gw;
3034	struct rt6_info		**ret;
3035};
3036
3037static int fib6_nh_redirect_match(struct fib6_nh *nh, void *_arg)
3038{
3039	struct fib6_nh_rd_arg *arg = _arg;
3040
3041	arg->res->nh = nh;
3042	return ip6_redirect_nh_match(arg->res, arg->fl6, arg->gw, arg->ret);
3043}
3044
3045/* Handle redirects */
3046struct ip6rd_flowi {
3047	struct flowi6 fl6;
3048	struct in6_addr gateway;
3049};
3050
3051INDIRECT_CALLABLE_SCOPE struct rt6_info *__ip6_route_redirect(struct net *net,
3052					     struct fib6_table *table,
3053					     struct flowi6 *fl6,
3054					     const struct sk_buff *skb,
3055					     int flags)
3056{
3057	struct ip6rd_flowi *rdfl = (struct ip6rd_flowi *)fl6;
3058	struct rt6_info *ret = NULL;
3059	struct fib6_result res = {};
3060	struct fib6_nh_rd_arg arg = {
3061		.res = &res,
3062		.fl6 = fl6,
3063		.gw  = &rdfl->gateway,
3064		.ret = &ret
3065	};
3066	struct fib6_info *rt;
3067	struct fib6_node *fn;
3068
3069	/* Get the "current" route for this destination and
3070	 * check if the redirect has come from appropriate router.
3071	 *
3072	 * RFC 4861 specifies that redirects should only be
3073	 * accepted if they come from the nexthop to the target.
3074	 * Due to the way the routes are chosen, this notion
3075	 * is a bit fuzzy and one might need to check all possible
3076	 * routes.
3077	 */
3078
3079	rcu_read_lock();
3080	fn = fib6_node_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
3081restart:
3082	for_each_fib6_node_rt_rcu(fn) {
3083		res.f6i = rt;
3084		if (fib6_check_expired(rt))
3085			continue;
3086		if (rt->fib6_flags & RTF_REJECT)
 
 
3087			break;
3088		if (unlikely(rt->nh)) {
3089			if (nexthop_is_blackhole(rt->nh))
3090				continue;
3091			/* on match, res->nh is filled in and potentially ret */
3092			if (nexthop_for_each_fib6_nh(rt->nh,
3093						     fib6_nh_redirect_match,
3094						     &arg))
3095				goto out;
3096		} else {
3097			res.nh = rt->fib6_nh;
3098			if (ip6_redirect_nh_match(&res, fl6, &rdfl->gateway,
3099						  &ret))
3100				goto out;
 
 
 
 
 
 
 
3101		}
 
3102	}
3103
3104	if (!rt)
3105		rt = net->ipv6.fib6_null_entry;
3106	else if (rt->fib6_flags & RTF_REJECT) {
3107		ret = net->ipv6.ip6_null_entry;
3108		goto out;
3109	}
3110
3111	if (rt == net->ipv6.fib6_null_entry) {
3112		fn = fib6_backtrack(fn, &fl6->saddr);
3113		if (fn)
3114			goto restart;
3115	}
3116
3117	res.f6i = rt;
3118	res.nh = rt->fib6_nh;
3119out:
3120	if (ret) {
3121		ip6_hold_safe(net, &ret);
3122	} else {
3123		res.fib6_flags = res.f6i->fib6_flags;
3124		res.fib6_type = res.f6i->fib6_type;
3125		ret = ip6_create_rt_rcu(&res);
3126	}
3127
3128	rcu_read_unlock();
3129
3130	trace_fib6_table_lookup(net, &res, table, fl6);
3131	return ret;
3132};
3133
3134static struct dst_entry *ip6_route_redirect(struct net *net,
3135					    const struct flowi6 *fl6,
3136					    const struct sk_buff *skb,
3137					    const struct in6_addr *gateway)
3138{
3139	int flags = RT6_LOOKUP_F_HAS_SADDR;
3140	struct ip6rd_flowi rdfl;
3141
3142	rdfl.fl6 = *fl6;
3143	rdfl.gateway = *gateway;
3144
3145	return fib6_rule_lookup(net, &rdfl.fl6, skb,
3146				flags, __ip6_route_redirect);
3147}
3148
3149void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark,
3150		  kuid_t uid)
3151{
3152	const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data;
3153	struct dst_entry *dst;
3154	struct flowi6 fl6 = {
3155		.flowi6_iif = LOOPBACK_IFINDEX,
3156		.flowi6_oif = oif,
3157		.flowi6_mark = mark,
3158		.daddr = iph->daddr,
3159		.saddr = iph->saddr,
3160		.flowlabel = ip6_flowinfo(iph),
3161		.flowi6_uid = uid,
3162	};
 
3163
3164	dst = ip6_route_redirect(net, &fl6, skb, &ipv6_hdr(skb)->saddr);
3165	rt6_do_redirect(dst, NULL, skb);
3166	dst_release(dst);
3167}
3168EXPORT_SYMBOL_GPL(ip6_redirect);
3169
3170void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif)
 
3171{
3172	const struct ipv6hdr *iph = ipv6_hdr(skb);
3173	const struct rd_msg *msg = (struct rd_msg *)icmp6_hdr(skb);
3174	struct dst_entry *dst;
3175	struct flowi6 fl6 = {
3176		.flowi6_iif = LOOPBACK_IFINDEX,
3177		.flowi6_oif = oif,
3178		.daddr = msg->dest,
3179		.saddr = iph->daddr,
3180		.flowi6_uid = sock_net_uid(net, NULL),
3181	};
 
 
3182
3183	dst = ip6_route_redirect(net, &fl6, skb, &iph->saddr);
3184	rt6_do_redirect(dst, NULL, skb);
3185	dst_release(dst);
3186}
3187
3188void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk)
3189{
3190	ip6_redirect(skb, sock_net(sk), sk->sk_bound_dev_if,
3191		     READ_ONCE(sk->sk_mark), sk->sk_uid);
3192}
3193EXPORT_SYMBOL_GPL(ip6_sk_redirect);
3194
3195static unsigned int ip6_default_advmss(const struct dst_entry *dst)
3196{
3197	struct net_device *dev = dst->dev;
3198	unsigned int mtu = dst_mtu(dst);
3199	struct net *net;
3200
3201	mtu -= sizeof(struct ipv6hdr) + sizeof(struct tcphdr);
3202
3203	rcu_read_lock();
3204
3205	net = dev_net_rcu(dev);
3206	if (mtu < net->ipv6.sysctl.ip6_rt_min_advmss)
3207		mtu = net->ipv6.sysctl.ip6_rt_min_advmss;
3208
3209	rcu_read_unlock();
3210
3211	/*
3212	 * Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and
3213	 * corresponding MSS is IPV6_MAXPLEN - tcp_header_size.
3214	 * IPV6_MAXPLEN is also valid and means: "any MSS,
3215	 * rely only on pmtu discovery"
3216	 */
3217	if (mtu > IPV6_MAXPLEN - sizeof(struct tcphdr))
3218		mtu = IPV6_MAXPLEN;
3219	return mtu;
3220}
3221
3222INDIRECT_CALLABLE_SCOPE unsigned int ip6_mtu(const struct dst_entry *dst)
3223{
3224	return ip6_dst_mtu_maybe_forward(dst, false);
3225}
3226EXPORT_INDIRECT_CALLABLE(ip6_mtu);
3227
3228/* MTU selection:
3229 * 1. mtu on route is locked - use it
3230 * 2. mtu from nexthop exception
3231 * 3. mtu from egress device
3232 *
3233 * based on ip6_dst_mtu_forward and exception logic of
3234 * rt6_find_cached_rt; called with rcu_read_lock
3235 */
3236u32 ip6_mtu_from_fib6(const struct fib6_result *res,
3237		      const struct in6_addr *daddr,
3238		      const struct in6_addr *saddr)
3239{
3240	const struct fib6_nh *nh = res->nh;
3241	struct fib6_info *f6i = res->f6i;
3242	struct inet6_dev *idev;
3243	struct rt6_info *rt;
3244	u32 mtu = 0;
3245
3246	if (unlikely(fib6_metric_locked(f6i, RTAX_MTU))) {
3247		mtu = f6i->fib6_pmtu;
3248		if (mtu)
3249			goto out;
3250	}
3251
3252	rt = rt6_find_cached_rt(res, daddr, saddr);
3253	if (unlikely(rt)) {
3254		mtu = dst_metric_raw(&rt->dst, RTAX_MTU);
3255	} else {
3256		struct net_device *dev = nh->fib_nh_dev;
3257
3258		mtu = IPV6_MIN_MTU;
3259		idev = __in6_dev_get(dev);
3260		if (idev)
3261			mtu = max_t(u32, mtu, READ_ONCE(idev->cnf.mtu6));
3262	}
 
 
3263
3264	mtu = min_t(unsigned int, mtu, IP6_MAX_MTU);
3265out:
3266	return mtu - lwtunnel_headroom(nh->fib_nh_lws, mtu);
 
 
3267}
3268
3269struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
3270				  struct flowi6 *fl6)
3271{
3272	struct dst_entry *dst;
3273	struct rt6_info *rt;
3274	struct inet6_dev *idev = in6_dev_get(dev);
3275	struct net *net = dev_net(dev);
3276
3277	if (unlikely(!idev))
3278		return ERR_PTR(-ENODEV);
3279
3280	rt = ip6_dst_alloc(net, dev, 0);
3281	if (unlikely(!rt)) {
3282		in6_dev_put(idev);
3283		dst = ERR_PTR(-ENOMEM);
3284		goto out;
3285	}
3286
 
3287	rt->dst.input = ip6_input;
3288	rt->dst.output  = ip6_output;
3289	rt->rt6i_gateway  = fl6->daddr;
3290	rt->rt6i_dst.addr = fl6->daddr;
3291	rt->rt6i_dst.plen = 128;
3292	rt->rt6i_idev     = idev;
3293	dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 0);
3294
3295	/* Add this dst into uncached_list so that rt6_disable_ip() can
3296	 * do proper release of the net_device
3297	 */
3298	rt6_uncached_list_add(rt);
 
3299
3300	dst = xfrm_lookup(net, &rt->dst, flowi6_to_flowi(fl6), NULL, 0);
3301
3302out:
3303	return dst;
3304}
3305
3306static void ip6_dst_gc(struct dst_ops *ops)
3307{
3308	struct net *net = container_of(ops, struct net, ipv6.ip6_dst_ops);
3309	int rt_min_interval = net->ipv6.sysctl.ip6_rt_gc_min_interval;
 
3310	int rt_elasticity = net->ipv6.sysctl.ip6_rt_gc_elasticity;
3311	int rt_gc_timeout = net->ipv6.sysctl.ip6_rt_gc_timeout;
3312	unsigned long rt_last_gc = net->ipv6.ip6_rt_last_gc;
3313	unsigned int val;
3314	int entries;
3315
3316	if (time_after(rt_last_gc + rt_min_interval, jiffies))
 
 
3317		goto out;
3318
3319	fib6_run_gc(atomic_inc_return(&net->ipv6.ip6_rt_gc_expire), net, true);
 
3320	entries = dst_entries_get_slow(ops);
3321	if (entries < ops->gc_thresh)
3322		atomic_set(&net->ipv6.ip6_rt_gc_expire, rt_gc_timeout >> 1);
3323out:
3324	val = atomic_read(&net->ipv6.ip6_rt_gc_expire);
3325	atomic_set(&net->ipv6.ip6_rt_gc_expire, val - (val >> rt_elasticity));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3326}
3327
3328static int ip6_nh_lookup_table(struct net *net, struct fib6_config *cfg,
3329			       const struct in6_addr *gw_addr, u32 tbid,
3330			       int flags, struct fib6_result *res)
 
3331{
3332	struct flowi6 fl6 = {
3333		.flowi6_oif = cfg->fc_ifindex,
3334		.daddr = *gw_addr,
3335		.saddr = cfg->fc_prefsrc,
3336	};
3337	struct fib6_table *table;
3338	int err;
3339
3340	table = fib6_get_table(net, tbid);
3341	if (!table)
3342		return -EINVAL;
3343
3344	if (!ipv6_addr_any(&cfg->fc_prefsrc))
3345		flags |= RT6_LOOKUP_F_HAS_SADDR;
3346
3347	flags |= RT6_LOOKUP_F_IGNORE_LINKSTATE;
 
3348
3349	err = fib6_table_lookup(net, table, cfg->fc_ifindex, &fl6, res, flags);
3350	if (!err && res->f6i != net->ipv6.fib6_null_entry)
3351		fib6_select_path(net, res, &fl6, cfg->fc_ifindex,
3352				 cfg->fc_ifindex != 0, NULL, flags);
 
3353
3354	return err;
3355}
3356
3357static int ip6_route_check_nh_onlink(struct net *net,
3358				     struct fib6_config *cfg,
3359				     const struct net_device *dev,
3360				     struct netlink_ext_ack *extack)
3361{
3362	u32 tbid = l3mdev_fib_table_rcu(dev) ? : RT_TABLE_MAIN;
3363	const struct in6_addr *gw_addr = &cfg->fc_gateway;
3364	struct fib6_result res = {};
 
3365	int err;
3366
3367	err = ip6_nh_lookup_table(net, cfg, gw_addr, tbid, 0, &res);
3368	if (!err && !(res.fib6_flags & RTF_REJECT) &&
3369	    /* ignore match if it is the default route */
3370	    !ipv6_addr_any(&res.f6i->fib6_dst.addr) &&
3371	    (res.fib6_type != RTN_UNICAST || dev != res.nh->fib_nh_dev)) {
3372		NL_SET_ERR_MSG(extack,
3373			       "Nexthop has invalid gateway or device mismatch");
3374		err = -EINVAL;
 
 
 
3375	}
3376
3377	return err;
3378}
3379
3380static int ip6_route_check_nh(struct net *net,
3381			      struct fib6_config *cfg,
3382			      struct net_device **_dev,
3383			      netdevice_tracker *dev_tracker,
3384			      struct inet6_dev **idev)
3385{
3386	const struct in6_addr *gw_addr = &cfg->fc_gateway;
3387	struct net_device *dev = _dev ? *_dev : NULL;
3388	int flags = RT6_LOOKUP_F_IFACE;
3389	struct fib6_result res = {};
3390	int err = -EHOSTUNREACH;
3391
3392	if (cfg->fc_table) {
3393		err = ip6_nh_lookup_table(net, cfg, gw_addr,
3394					  cfg->fc_table, flags, &res);
3395		/* gw_addr can not require a gateway or resolve to a reject
3396		 * route. If a device is given, it must match the result.
3397		 */
3398		if (err || res.fib6_flags & RTF_REJECT ||
3399		    res.nh->fib_nh_gw_family ||
3400		    (dev && dev != res.nh->fib_nh_dev))
3401			err = -EHOSTUNREACH;
3402	}
3403
3404	if (err < 0) {
3405		struct flowi6 fl6 = {
3406			.flowi6_oif = cfg->fc_ifindex,
3407			.daddr = *gw_addr,
3408		};
3409
3410		err = fib6_lookup(net, cfg->fc_ifindex, &fl6, &res, flags);
3411		if (err || res.fib6_flags & RTF_REJECT ||
3412		    res.nh->fib_nh_gw_family)
3413			err = -EHOSTUNREACH;
3414
3415		if (err)
3416			return err;
3417
3418		fib6_select_path(net, &res, &fl6, cfg->fc_ifindex,
3419				 cfg->fc_ifindex != 0, NULL, flags);
3420	}
3421
3422	err = 0;
3423	if (dev) {
3424		if (dev != res.nh->fib_nh_dev)
3425			err = -EHOSTUNREACH;
 
 
3426	} else {
3427		*_dev = dev = res.nh->fib_nh_dev;
3428		netdev_hold(dev, dev_tracker, GFP_ATOMIC);
3429		*idev = in6_dev_get(dev);
 
3430	}
3431
 
 
 
 
 
 
3432	return err;
3433}
3434
3435static int ip6_validate_gw(struct net *net, struct fib6_config *cfg,
3436			   struct net_device **_dev,
3437			   netdevice_tracker *dev_tracker,
3438			   struct inet6_dev **idev,
3439			   struct netlink_ext_ack *extack)
3440{
3441	const struct in6_addr *gw_addr = &cfg->fc_gateway;
3442	int gwa_type = ipv6_addr_type(gw_addr);
3443	bool skip_dev = gwa_type & IPV6_ADDR_LINKLOCAL ? false : true;
3444	const struct net_device *dev = *_dev;
3445	bool need_addr_check = !dev;
3446	int err = -EINVAL;
3447
3448	/* if gw_addr is local we will fail to detect this in case
3449	 * address is still TENTATIVE (DAD in progress). rt6_lookup()
3450	 * will return already-added prefix route via interface that
3451	 * prefix route was assigned to, which might be non-loopback.
3452	 */
3453	if (dev &&
3454	    ipv6_chk_addr_and_flags(net, gw_addr, dev, skip_dev, 0, 0)) {
3455		NL_SET_ERR_MSG(extack, "Gateway can not be a local address");
3456		goto out;
3457	}
3458
3459	if (gwa_type != (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST)) {
3460		/* IPv6 strictly inhibits using not link-local
3461		 * addresses as nexthop address.
3462		 * Otherwise, router will not able to send redirects.
3463		 * It is very good, but in some (rare!) circumstances
3464		 * (SIT, PtP, NBMA NOARP links) it is handy to allow
3465		 * some exceptions. --ANK
3466		 * We allow IPv4-mapped nexthops to support RFC4798-type
3467		 * addressing
3468		 */
3469		if (!(gwa_type & (IPV6_ADDR_UNICAST | IPV6_ADDR_MAPPED))) {
3470			NL_SET_ERR_MSG(extack, "Invalid gateway address");
3471			goto out;
3472		}
3473
3474		rcu_read_lock();
3475
3476		if (cfg->fc_flags & RTNH_F_ONLINK)
3477			err = ip6_route_check_nh_onlink(net, cfg, dev, extack);
3478		else
3479			err = ip6_route_check_nh(net, cfg, _dev, dev_tracker,
3480						 idev);
3481
3482		rcu_read_unlock();
3483
3484		if (err)
3485			goto out;
3486	}
3487
3488	/* reload in case device was changed */
3489	dev = *_dev;
3490
3491	err = -EINVAL;
3492	if (!dev) {
3493		NL_SET_ERR_MSG(extack, "Egress device not specified");
3494		goto out;
3495	} else if (dev->flags & IFF_LOOPBACK) {
3496		NL_SET_ERR_MSG(extack,
3497			       "Egress device can not be loopback device for this route");
3498		goto out;
3499	}
3500
3501	/* if we did not check gw_addr above, do so now that the
3502	 * egress device has been resolved.
3503	 */
3504	if (need_addr_check &&
3505	    ipv6_chk_addr_and_flags(net, gw_addr, dev, skip_dev, 0, 0)) {
3506		NL_SET_ERR_MSG(extack, "Gateway can not be a local address");
3507		goto out;
3508	}
3509
3510	err = 0;
3511out:
3512	return err;
3513}
3514
3515static bool fib6_is_reject(u32 flags, struct net_device *dev, int addr_type)
3516{
3517	if ((flags & RTF_REJECT) ||
3518	    (dev && (dev->flags & IFF_LOOPBACK) &&
3519	     !(addr_type & IPV6_ADDR_LOOPBACK) &&
3520	     !(flags & (RTF_ANYCAST | RTF_LOCAL))))
3521		return true;
3522
3523	return false;
3524}
3525
3526int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
3527		 struct fib6_config *cfg, gfp_t gfp_flags,
3528		 struct netlink_ext_ack *extack)
3529{
3530	netdevice_tracker *dev_tracker = &fib6_nh->fib_nh_dev_tracker;
3531	struct net_device *dev = NULL;
3532	struct inet6_dev *idev = NULL;
3533	int addr_type;
3534	int err;
3535
3536	fib6_nh->fib_nh_family = AF_INET6;
3537#ifdef CONFIG_IPV6_ROUTER_PREF
3538	fib6_nh->last_probe = jiffies;
3539#endif
3540	if (cfg->fc_is_fdb) {
3541		fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3542		fib6_nh->fib_nh_gw_family = AF_INET6;
3543		return 0;
3544	}
3545
3546	err = -ENODEV;
3547	if (cfg->fc_ifindex) {
3548		dev = netdev_get_by_index(net, cfg->fc_ifindex,
3549					  dev_tracker, gfp_flags);
3550		if (!dev)
3551			goto out;
3552		idev = in6_dev_get(dev);
3553		if (!idev)
3554			goto out;
3555	}
3556
3557	if (cfg->fc_flags & RTNH_F_ONLINK) {
3558		if (!dev) {
3559			NL_SET_ERR_MSG(extack,
3560				       "Nexthop device required for onlink");
3561			goto out;
3562		}
3563
3564		if (!(dev->flags & IFF_UP)) {
3565			NL_SET_ERR_MSG(extack, "Nexthop device is not up");
3566			err = -ENETDOWN;
3567			goto out;
3568		}
3569
3570		fib6_nh->fib_nh_flags |= RTNH_F_ONLINK;
3571	}
3572
3573	fib6_nh->fib_nh_weight = 1;
3574
3575	/* We cannot add true routes via loopback here,
3576	 * they would result in kernel looping; promote them to reject routes
3577	 */
3578	addr_type = ipv6_addr_type(&cfg->fc_dst);
3579	if (fib6_is_reject(cfg->fc_flags, dev, addr_type)) {
3580		/* hold loopback dev/idev if we haven't done so. */
3581		if (dev != net->loopback_dev) {
3582			if (dev) {
3583				netdev_put(dev, dev_tracker);
3584				in6_dev_put(idev);
3585			}
3586			dev = net->loopback_dev;
3587			netdev_hold(dev, dev_tracker, gfp_flags);
3588			idev = in6_dev_get(dev);
3589			if (!idev) {
3590				err = -ENODEV;
3591				goto out;
3592			}
3593		}
3594		goto pcpu_alloc;
3595	}
3596
3597	if (cfg->fc_flags & RTF_GATEWAY) {
3598		err = ip6_validate_gw(net, cfg, &dev, dev_tracker,
3599				      &idev, extack);
3600		if (err)
3601			goto out;
3602
3603		fib6_nh->fib_nh_gw6 = cfg->fc_gateway;
3604		fib6_nh->fib_nh_gw_family = AF_INET6;
3605	}
3606
3607	err = -ENODEV;
3608	if (!dev)
3609		goto out;
3610
3611	if (!idev || idev->cnf.disable_ipv6) {
3612		NL_SET_ERR_MSG(extack, "IPv6 is disabled on nexthop device");
3613		err = -EACCES;
3614		goto out;
3615	}
3616
3617	if (!(dev->flags & IFF_UP) && !cfg->fc_ignore_dev_down) {
3618		NL_SET_ERR_MSG(extack, "Nexthop device is not up");
3619		err = -ENETDOWN;
3620		goto out;
3621	}
3622
3623	if (!(cfg->fc_flags & (RTF_LOCAL | RTF_ANYCAST)) &&
3624	    !netif_carrier_ok(dev))
3625		fib6_nh->fib_nh_flags |= RTNH_F_LINKDOWN;
3626
3627	err = fib_nh_common_init(net, &fib6_nh->nh_common, cfg->fc_encap,
3628				 cfg->fc_encap_type, cfg, gfp_flags, extack);
3629	if (err)
3630		goto out;
3631
3632pcpu_alloc:
3633	fib6_nh->rt6i_pcpu = alloc_percpu_gfp(struct rt6_info *, gfp_flags);
3634	if (!fib6_nh->rt6i_pcpu) {
3635		err = -ENOMEM;
3636		goto out;
3637	}
3638
3639	fib6_nh->fib_nh_dev = dev;
3640	fib6_nh->fib_nh_oif = dev->ifindex;
3641	err = 0;
3642out:
3643	if (idev)
3644		in6_dev_put(idev);
3645
3646	if (err) {
3647		lwtstate_put(fib6_nh->fib_nh_lws);
3648		fib6_nh->fib_nh_lws = NULL;
3649		netdev_put(dev, dev_tracker);
3650	}
3651
3652	return err;
3653}
3654
3655void fib6_nh_release(struct fib6_nh *fib6_nh)
3656{
3657	struct rt6_exception_bucket *bucket;
3658
3659	rcu_read_lock();
3660
3661	fib6_nh_flush_exceptions(fib6_nh, NULL);
3662	bucket = fib6_nh_get_excptn_bucket(fib6_nh, NULL);
3663	if (bucket) {
3664		rcu_assign_pointer(fib6_nh->rt6i_exception_bucket, NULL);
3665		kfree(bucket);
3666	}
3667
3668	rcu_read_unlock();
3669
3670	fib6_nh_release_dsts(fib6_nh);
3671	free_percpu(fib6_nh->rt6i_pcpu);
3672
3673	fib_nh_common_release(&fib6_nh->nh_common);
3674}
3675
3676void fib6_nh_release_dsts(struct fib6_nh *fib6_nh)
3677{
3678	int cpu;
3679
3680	if (!fib6_nh->rt6i_pcpu)
3681		return;
3682
3683	for_each_possible_cpu(cpu) {
3684		struct rt6_info *pcpu_rt, **ppcpu_rt;
3685
3686		ppcpu_rt = per_cpu_ptr(fib6_nh->rt6i_pcpu, cpu);
3687		pcpu_rt = xchg(ppcpu_rt, NULL);
3688		if (pcpu_rt) {
3689			dst_dev_put(&pcpu_rt->dst);
3690			dst_release(&pcpu_rt->dst);
3691		}
3692	}
3693}
3694
3695static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
3696					      gfp_t gfp_flags,
3697					      struct netlink_ext_ack *extack)
3698{
3699	struct net *net = cfg->fc_nlinfo.nl_net;
3700	struct fib6_info *rt = NULL;
3701	struct nexthop *nh = NULL;
 
3702	struct fib6_table *table;
3703	struct fib6_nh *fib6_nh;
3704	int err = -EINVAL;
3705	int addr_type;
 
3706
3707	/* RTF_PCPU is an internal flag; can not be set by userspace */
3708	if (cfg->fc_flags & RTF_PCPU) {
3709		NL_SET_ERR_MSG(extack, "Userspace can not set RTF_PCPU");
3710		goto out;
3711	}
3712
3713	/* RTF_CACHE is an internal flag; can not be set by userspace */
3714	if (cfg->fc_flags & RTF_CACHE) {
3715		NL_SET_ERR_MSG(extack, "Userspace can not set RTF_CACHE");
3716		goto out;
3717	}
3718
3719	if (cfg->fc_type > RTN_MAX) {
3720		NL_SET_ERR_MSG(extack, "Invalid route type");
3721		goto out;
3722	}
3723
3724	if (cfg->fc_dst_len > 128) {
3725		NL_SET_ERR_MSG(extack, "Invalid prefix length");
3726		goto out;
3727	}
3728	if (cfg->fc_src_len > 128) {
3729		NL_SET_ERR_MSG(extack, "Invalid source address length");
3730		goto out;
3731	}
3732#ifndef CONFIG_IPV6_SUBTREES
3733	if (cfg->fc_src_len) {
3734		NL_SET_ERR_MSG(extack,
3735			       "Specifying source address requires IPV6_SUBTREES to be enabled");
3736		goto out;
3737	}
3738#endif
3739	if (cfg->fc_nh_id) {
3740		nh = nexthop_find_by_id(net, cfg->fc_nh_id);
3741		if (!nh) {
3742			NL_SET_ERR_MSG(extack, "Nexthop id does not exist");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3743			goto out;
3744		}
3745		err = fib6_check_nexthop(nh, cfg, extack);
3746		if (err)
 
 
3747			goto out;
 
3748	}
3749
3750	err = -ENOBUFS;
3751	if (cfg->fc_nlinfo.nlh &&
3752	    !(cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_CREATE)) {
3753		table = fib6_get_table(net, cfg->fc_table);
3754		if (!table) {
3755			pr_warn("NLM_F_CREATE should be specified when creating new route\n");
3756			table = fib6_new_table(net, cfg->fc_table);
3757		}
3758	} else {
3759		table = fib6_new_table(net, cfg->fc_table);
3760	}
3761
3762	if (!table)
3763		goto out;
3764
3765	err = -ENOMEM;
3766	rt = fib6_info_alloc(gfp_flags, !nh);
3767	if (!rt)
3768		goto out;
3769
3770	rt->fib6_metrics = ip_fib_metrics_init(cfg->fc_mx, cfg->fc_mx_len,
3771					       extack);
3772	if (IS_ERR(rt->fib6_metrics)) {
3773		err = PTR_ERR(rt->fib6_metrics);
3774		/* Do not leave garbage there. */
3775		rt->fib6_metrics = (struct dst_metrics *)&dst_default_metrics;
3776		goto out_free;
3777	}
3778
3779	if (cfg->fc_flags & RTF_ADDRCONF)
3780		rt->dst_nocount = true;
3781
3782	if (cfg->fc_flags & RTF_EXPIRES)
3783		fib6_set_expires(rt, jiffies +
3784				clock_t_to_jiffies(cfg->fc_expires));
 
 
3785
3786	if (cfg->fc_protocol == RTPROT_UNSPEC)
3787		cfg->fc_protocol = RTPROT_BOOT;
3788	rt->fib6_protocol = cfg->fc_protocol;
3789
3790	rt->fib6_table = table;
3791	rt->fib6_metric = cfg->fc_metric;
3792	rt->fib6_type = cfg->fc_type ? : RTN_UNICAST;
3793	rt->fib6_flags = cfg->fc_flags & ~RTF_GATEWAY;
3794
3795	ipv6_addr_prefix(&rt->fib6_dst.addr, &cfg->fc_dst, cfg->fc_dst_len);
3796	rt->fib6_dst.plen = cfg->fc_dst_len;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3797
3798#ifdef CONFIG_IPV6_SUBTREES
3799	ipv6_addr_prefix(&rt->fib6_src.addr, &cfg->fc_src, cfg->fc_src_len);
3800	rt->fib6_src.plen = cfg->fc_src_len;
3801#endif
3802	if (nh) {
3803		if (rt->fib6_src.plen) {
3804			NL_SET_ERR_MSG(extack, "Nexthops can not be used with source routing");
3805			goto out_free;
3806		}
3807		if (!nexthop_get(nh)) {
3808			NL_SET_ERR_MSG(extack, "Nexthop has been deleted");
3809			goto out_free;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3810		}
3811		rt->nh = nh;
3812		fib6_nh = nexthop_fib6_nh(rt->nh);
3813	} else {
3814		err = fib6_nh_init(net, rt->fib6_nh, cfg, gfp_flags, extack);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3815		if (err)
3816			goto out;
3817
3818		fib6_nh = rt->fib6_nh;
 
3819
3820		/* We cannot add true routes via loopback here, they would
3821		 * result in kernel looping; promote them to reject routes
3822		 */
3823		addr_type = ipv6_addr_type(&cfg->fc_dst);
3824		if (fib6_is_reject(cfg->fc_flags, rt->fib6_nh->fib_nh_dev,
3825				   addr_type))
3826			rt->fib6_flags = RTF_REJECT | RTF_NONEXTHOP;
 
3827	}
3828
3829	if (!ipv6_addr_any(&cfg->fc_prefsrc)) {
3830		struct net_device *dev = fib6_nh->fib_nh_dev;
 
 
 
3831
 
3832		if (!ipv6_chk_addr(net, &cfg->fc_prefsrc, dev, 0)) {
3833			NL_SET_ERR_MSG(extack, "Invalid source address");
3834			err = -EINVAL;
3835			goto out;
3836		}
3837		rt->fib6_prefsrc.addr = cfg->fc_prefsrc;
3838		rt->fib6_prefsrc.plen = 128;
3839	} else
3840		rt->fib6_prefsrc.plen = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
3841
3842	return rt;
3843out:
3844	fib6_info_release(rt);
3845	return ERR_PTR(err);
3846out_free:
3847	ip_fib_metrics_put(rt->fib6_metrics);
3848	kfree(rt);
 
 
3849	return ERR_PTR(err);
3850}
3851
3852int ip6_route_add(struct fib6_config *cfg, gfp_t gfp_flags,
3853		  struct netlink_ext_ack *extack)
3854{
3855	struct fib6_info *rt;
 
3856	int err;
3857
3858	rt = ip6_route_info_create(cfg, gfp_flags, extack);
3859	if (IS_ERR(rt))
3860		return PTR_ERR(rt);
 
 
 
 
 
 
 
3861
3862	err = __ip6_ins_rt(rt, &cfg->fc_nlinfo, extack);
3863	fib6_info_release(rt);
 
 
 
 
 
 
3864
3865	return err;
3866}
3867
3868static int __ip6_del_rt(struct fib6_info *rt, struct nl_info *info)
3869{
3870	struct net *net = info->nl_net;
3871	struct fib6_table *table;
3872	int err;
 
 
3873
3874	if (rt == net->ipv6.fib6_null_entry) {
3875		err = -ENOENT;
3876		goto out;
3877	}
3878
3879	table = rt->fib6_table;
3880	spin_lock_bh(&table->tb6_lock);
3881	err = fib6_del(rt, info);
3882	spin_unlock_bh(&table->tb6_lock);
3883
3884out:
3885	fib6_info_release(rt);
3886	return err;
3887}
3888
3889int ip6_del_rt(struct net *net, struct fib6_info *rt, bool skip_notify)
3890{
3891	struct nl_info info = {
3892		.nl_net = net,
3893		.skip_notify = skip_notify
3894	};
3895
3896	return __ip6_del_rt(rt, &info);
3897}
3898
3899static int __ip6_del_rt_siblings(struct fib6_info *rt, struct fib6_config *cfg)
3900{
3901	struct nl_info *info = &cfg->fc_nlinfo;
3902	struct net *net = info->nl_net;
3903	struct sk_buff *skb = NULL;
3904	struct fib6_table *table;
3905	int err = -ENOENT;
3906
3907	if (rt == net->ipv6.fib6_null_entry)
3908		goto out_put;
3909	table = rt->fib6_table;
3910	spin_lock_bh(&table->tb6_lock);
3911
3912	if (rt->fib6_nsiblings && cfg->fc_delete_all_nh) {
3913		struct fib6_info *sibling, *next_sibling;
3914		struct fib6_node *fn;
3915
3916		/* prefer to send a single notification with all hops */
3917		skb = nlmsg_new(rt6_nlmsg_size(rt), gfp_any());
3918		if (skb) {
3919			u32 seq = info->nlh ? info->nlh->nlmsg_seq : 0;
3920
3921			if (rt6_fill_node(net, skb, rt, NULL,
3922					  NULL, NULL, 0, RTM_DELROUTE,
3923					  info->portid, seq, 0) < 0) {
3924				kfree_skb(skb);
3925				skb = NULL;
3926			} else
3927				info->skip_notify = 1;
3928		}
3929
3930		/* 'rt' points to the first sibling route. If it is not the
3931		 * leaf, then we do not need to send a notification. Otherwise,
3932		 * we need to check if the last sibling has a next route or not
3933		 * and emit a replace or delete notification, respectively.
3934		 */
3935		info->skip_notify_kernel = 1;
3936		fn = rcu_dereference_protected(rt->fib6_node,
3937					    lockdep_is_held(&table->tb6_lock));
3938		if (rcu_access_pointer(fn->leaf) == rt) {
3939			struct fib6_info *last_sibling, *replace_rt;
3940
3941			last_sibling = list_last_entry(&rt->fib6_siblings,
3942						       struct fib6_info,
3943						       fib6_siblings);
3944			replace_rt = rcu_dereference_protected(
3945					    last_sibling->fib6_next,
3946					    lockdep_is_held(&table->tb6_lock));
3947			if (replace_rt)
3948				call_fib6_entry_notifiers_replace(net,
3949								  replace_rt);
3950			else
3951				call_fib6_multipath_entry_notifiers(net,
3952						       FIB_EVENT_ENTRY_DEL,
3953						       rt, rt->fib6_nsiblings,
3954						       NULL);
3955		}
3956		list_for_each_entry_safe(sibling, next_sibling,
3957					 &rt->fib6_siblings,
3958					 fib6_siblings) {
3959			err = fib6_del(sibling, info);
3960			if (err)
3961				goto out_unlock;
3962		}
3963	}
3964
3965	err = fib6_del(rt, info);
3966out_unlock:
3967	spin_unlock_bh(&table->tb6_lock);
3968out_put:
3969	fib6_info_release(rt);
3970
3971	if (skb) {
3972		rtnl_notify(skb, net, info->portid, RTNLGRP_IPV6_ROUTE,
3973			    info->nlh, gfp_any());
3974	}
3975	return err;
3976}
3977
3978static int __ip6_del_cached_rt(struct rt6_info *rt, struct fib6_config *cfg)
3979{
3980	int rc = -ESRCH;
3981
3982	if (cfg->fc_ifindex && rt->dst.dev->ifindex != cfg->fc_ifindex)
3983		goto out;
3984
3985	if (cfg->fc_flags & RTF_GATEWAY &&
3986	    !ipv6_addr_equal(&cfg->fc_gateway, &rt->rt6i_gateway))
3987		goto out;
3988
3989	rc = rt6_remove_exception_rt(rt);
3990out:
3991	return rc;
3992}
3993
3994static int ip6_del_cached_rt(struct fib6_config *cfg, struct fib6_info *rt,
3995			     struct fib6_nh *nh)
3996{
3997	struct fib6_result res = {
3998		.f6i = rt,
3999		.nh = nh,
4000	};
4001	struct rt6_info *rt_cache;
4002
4003	rt_cache = rt6_find_cached_rt(&res, &cfg->fc_dst, &cfg->fc_src);
4004	if (rt_cache)
4005		return __ip6_del_cached_rt(rt_cache, cfg);
4006
4007	return 0;
4008}
4009
4010struct fib6_nh_del_cached_rt_arg {
4011	struct fib6_config *cfg;
4012	struct fib6_info *f6i;
4013};
4014
4015static int fib6_nh_del_cached_rt(struct fib6_nh *nh, void *_arg)
4016{
4017	struct fib6_nh_del_cached_rt_arg *arg = _arg;
4018	int rc;
4019
4020	rc = ip6_del_cached_rt(arg->cfg, arg->f6i, nh);
4021	return rc != -ESRCH ? rc : 0;
4022}
4023
4024static int ip6_del_cached_rt_nh(struct fib6_config *cfg, struct fib6_info *f6i)
4025{
4026	struct fib6_nh_del_cached_rt_arg arg = {
4027		.cfg = cfg,
4028		.f6i = f6i
4029	};
4030
4031	return nexthop_for_each_fib6_nh(f6i->nh, fib6_nh_del_cached_rt, &arg);
4032}
4033
4034static int ip6_route_del(struct fib6_config *cfg,
4035			 struct netlink_ext_ack *extack)
4036{
 
4037	struct fib6_table *table;
4038	struct fib6_info *rt;
4039	struct fib6_node *fn;
4040	int err = -ESRCH;
4041
4042	table = fib6_get_table(cfg->fc_nlinfo.nl_net, cfg->fc_table);
4043	if (!table) {
4044		NL_SET_ERR_MSG(extack, "FIB table does not exist");
4045		return err;
4046	}
4047
4048	rcu_read_lock();
4049
4050	fn = fib6_locate(&table->tb6_root,
4051			 &cfg->fc_dst, cfg->fc_dst_len,
4052			 &cfg->fc_src, cfg->fc_src_len,
4053			 !(cfg->fc_flags & RTF_CACHE));
4054
4055	if (fn) {
4056		for_each_fib6_node_rt_rcu(fn) {
4057			struct fib6_nh *nh;
4058
4059			if (rt->nh && cfg->fc_nh_id &&
4060			    rt->nh->id != cfg->fc_nh_id)
4061				continue;
4062
4063			if (cfg->fc_flags & RTF_CACHE) {
4064				int rc = 0;
4065
4066				if (rt->nh) {
4067					rc = ip6_del_cached_rt_nh(cfg, rt);
4068				} else if (cfg->fc_nh_id) {
4069					continue;
4070				} else {
4071					nh = rt->fib6_nh;
4072					rc = ip6_del_cached_rt(cfg, rt, nh);
4073				}
4074				if (rc != -ESRCH) {
4075					rcu_read_unlock();
4076					return rc;
4077				}
4078				continue;
4079			}
4080
4081			if (cfg->fc_metric && cfg->fc_metric != rt->fib6_metric)
4082				continue;
4083			if (cfg->fc_protocol &&
4084			    cfg->fc_protocol != rt->fib6_protocol)
4085				continue;
4086
4087			if (rt->nh) {
4088				if (!fib6_info_hold_safe(rt))
4089					continue;
4090				rcu_read_unlock();
4091
4092				return __ip6_del_rt(rt, &cfg->fc_nlinfo);
4093			}
4094			if (cfg->fc_nh_id)
4095				continue;
4096
4097			nh = rt->fib6_nh;
4098			if (cfg->fc_ifindex &&
4099			    (!nh->fib_nh_dev ||
4100			     nh->fib_nh_dev->ifindex != cfg->fc_ifindex))
4101				continue;
4102			if (cfg->fc_flags & RTF_GATEWAY &&
4103			    !ipv6_addr_equal(&cfg->fc_gateway, &nh->fib_nh_gw6))
 
 
4104				continue;
4105			if (!fib6_info_hold_safe(rt))
4106				continue;
 
 
4107			rcu_read_unlock();
4108
4109			/* if gateway was specified only delete the one hop */
4110			if (cfg->fc_flags & RTF_GATEWAY)
4111				return __ip6_del_rt(rt, &cfg->fc_nlinfo);
4112
4113			return __ip6_del_rt_siblings(rt, cfg);
4114		}
4115	}
4116	rcu_read_unlock();
4117
4118	return err;
4119}
4120
4121static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb)
4122{
4123	struct netevent_redirect netevent;
4124	struct rt6_info *rt, *nrt = NULL;
4125	struct fib6_result res = {};
4126	struct ndisc_options ndopts;
4127	struct inet6_dev *in6_dev;
4128	struct neighbour *neigh;
4129	struct rd_msg *msg;
4130	int optlen, on_link;
4131	u8 *lladdr;
4132
4133	optlen = skb_tail_pointer(skb) - skb_transport_header(skb);
4134	optlen -= sizeof(*msg);
4135
4136	if (optlen < 0) {
4137		net_dbg_ratelimited("rt6_do_redirect: packet too short\n");
4138		return;
4139	}
4140
4141	msg = (struct rd_msg *)icmp6_hdr(skb);
4142
4143	if (ipv6_addr_is_multicast(&msg->dest)) {
4144		net_dbg_ratelimited("rt6_do_redirect: destination address is multicast\n");
4145		return;
4146	}
4147
4148	on_link = 0;
4149	if (ipv6_addr_equal(&msg->dest, &msg->target)) {
4150		on_link = 1;
4151	} else if (ipv6_addr_type(&msg->target) !=
4152		   (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
4153		net_dbg_ratelimited("rt6_do_redirect: target address is not link-local unicast\n");
4154		return;
4155	}
4156
4157	in6_dev = __in6_dev_get(skb->dev);
4158	if (!in6_dev)
4159		return;
4160	if (READ_ONCE(in6_dev->cnf.forwarding) ||
4161	    !READ_ONCE(in6_dev->cnf.accept_redirects))
4162		return;
4163
4164	/* RFC2461 8.1:
4165	 *	The IP source address of the Redirect MUST be the same as the current
4166	 *	first-hop router for the specified ICMP Destination Address.
4167	 */
4168
4169	if (!ndisc_parse_options(skb->dev, msg->opt, optlen, &ndopts)) {
4170		net_dbg_ratelimited("rt6_redirect: invalid ND options\n");
4171		return;
4172	}
4173
4174	lladdr = NULL;
4175	if (ndopts.nd_opts_tgt_lladdr) {
4176		lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr,
4177					     skb->dev);
4178		if (!lladdr) {
4179			net_dbg_ratelimited("rt6_redirect: invalid link-layer address length\n");
4180			return;
4181		}
4182	}
4183
4184	rt = dst_rt6_info(dst);
4185	if (rt->rt6i_flags & RTF_REJECT) {
4186		net_dbg_ratelimited("rt6_redirect: source isn't a valid nexthop for redirect target\n");
4187		return;
4188	}
4189
4190	/* Redirect received -> path was valid.
4191	 * Look, redirects are sent only in response to data packets,
4192	 * so that this nexthop apparently is reachable. --ANK
4193	 */
4194	dst_confirm_neigh(&rt->dst, &ipv6_hdr(skb)->saddr);
4195
4196	neigh = __neigh_lookup(&nd_tbl, &msg->target, skb->dev, 1);
4197	if (!neigh)
4198		return;
4199
4200	/*
4201	 *	We have finally decided to accept it.
4202	 */
4203
4204	ndisc_update(skb->dev, neigh, lladdr, NUD_STALE,
4205		     NEIGH_UPDATE_F_WEAK_OVERRIDE|
4206		     NEIGH_UPDATE_F_OVERRIDE|
4207		     (on_link ? 0 : (NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
4208				     NEIGH_UPDATE_F_ISROUTER)),
4209		     NDISC_REDIRECT, &ndopts);
4210
4211	rcu_read_lock();
4212	res.f6i = rcu_dereference(rt->from);
4213	if (!res.f6i)
4214		goto out;
4215
4216	if (res.f6i->nh) {
4217		struct fib6_nh_match_arg arg = {
4218			.dev = dst->dev,
4219			.gw = &rt->rt6i_gateway,
4220		};
4221
4222		nexthop_for_each_fib6_nh(res.f6i->nh,
4223					 fib6_nh_find_match, &arg);
4224
4225		/* fib6_info uses a nexthop that does not have fib6_nh
4226		 * using the dst->dev. Should be impossible
4227		 */
4228		if (!arg.match)
4229			goto out;
4230		res.nh = arg.match;
4231	} else {
4232		res.nh = res.f6i->fib6_nh;
4233	}
4234
4235	res.fib6_flags = res.f6i->fib6_flags;
4236	res.fib6_type = res.f6i->fib6_type;
4237	nrt = ip6_rt_cache_alloc(&res, &msg->dest, NULL);
4238	if (!nrt)
4239		goto out;
4240
4241	nrt->rt6i_flags = RTF_GATEWAY|RTF_UP|RTF_DYNAMIC|RTF_CACHE;
4242	if (on_link)
4243		nrt->rt6i_flags &= ~RTF_GATEWAY;
4244
 
4245	nrt->rt6i_gateway = *(struct in6_addr *)neigh->primary_key;
4246
4247	/* rt6_insert_exception() will take care of duplicated exceptions */
4248	if (rt6_insert_exception(nrt, &res)) {
 
 
 
4249		dst_release_immediate(&nrt->dst);
4250		goto out;
4251	}
4252
4253	netevent.old = &rt->dst;
4254	netevent.new = &nrt->dst;
4255	netevent.daddr = &msg->dest;
4256	netevent.neigh = neigh;
4257	call_netevent_notifiers(NETEVENT_REDIRECT, &netevent);
4258
4259out:
4260	rcu_read_unlock();
4261	neigh_release(neigh);
4262}
4263
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4264#ifdef CONFIG_IPV6_ROUTE_INFO
4265static struct fib6_info *rt6_get_route_info(struct net *net,
4266					   const struct in6_addr *prefix, int prefixlen,
4267					   const struct in6_addr *gwaddr,
4268					   struct net_device *dev)
4269{
4270	u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_INFO;
4271	int ifindex = dev->ifindex;
4272	struct fib6_node *fn;
4273	struct fib6_info *rt = NULL;
4274	struct fib6_table *table;
4275
4276	table = fib6_get_table(net, tb_id);
4277	if (!table)
4278		return NULL;
4279
4280	rcu_read_lock();
4281	fn = fib6_locate(&table->tb6_root, prefix, prefixlen, NULL, 0, true);
4282	if (!fn)
4283		goto out;
4284
4285	for_each_fib6_node_rt_rcu(fn) {
4286		/* these routes do not use nexthops */
4287		if (rt->nh)
4288			continue;
4289		if (rt->fib6_nh->fib_nh_dev->ifindex != ifindex)
4290			continue;
4291		if (!(rt->fib6_flags & RTF_ROUTEINFO) ||
4292		    !rt->fib6_nh->fib_nh_gw_family)
4293			continue;
4294		if (!ipv6_addr_equal(&rt->fib6_nh->fib_nh_gw6, gwaddr))
4295			continue;
4296		if (!fib6_info_hold_safe(rt))
4297			continue;
 
4298		break;
4299	}
4300out:
4301	rcu_read_unlock();
4302	return rt;
4303}
4304
4305static struct fib6_info *rt6_add_route_info(struct net *net,
4306					   const struct in6_addr *prefix, int prefixlen,
4307					   const struct in6_addr *gwaddr,
4308					   struct net_device *dev,
4309					   unsigned int pref)
4310{
4311	struct fib6_config cfg = {
4312		.fc_metric	= IP6_RT_PRIO_USER,
4313		.fc_ifindex	= dev->ifindex,
4314		.fc_dst_len	= prefixlen,
4315		.fc_flags	= RTF_GATEWAY | RTF_ADDRCONF | RTF_ROUTEINFO |
4316				  RTF_UP | RTF_PREF(pref),
4317		.fc_protocol = RTPROT_RA,
4318		.fc_type = RTN_UNICAST,
4319		.fc_nlinfo.portid = 0,
4320		.fc_nlinfo.nlh = NULL,
4321		.fc_nlinfo.nl_net = net,
4322	};
4323
4324	cfg.fc_table = l3mdev_fib_table(dev) ? : RT6_TABLE_INFO;
4325	cfg.fc_dst = *prefix;
4326	cfg.fc_gateway = *gwaddr;
4327
4328	/* We should treat it as a default route if prefix length is 0. */
4329	if (!prefixlen)
4330		cfg.fc_flags |= RTF_DEFAULT;
4331
4332	ip6_route_add(&cfg, GFP_ATOMIC, NULL);
4333
4334	return rt6_get_route_info(net, prefix, prefixlen, gwaddr, dev);
4335}
4336#endif
4337
4338struct fib6_info *rt6_get_dflt_router(struct net *net,
4339				     const struct in6_addr *addr,
4340				     struct net_device *dev)
4341{
4342	u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_DFLT;
4343	struct fib6_info *rt;
4344	struct fib6_table *table;
4345
4346	table = fib6_get_table(net, tb_id);
4347	if (!table)
4348		return NULL;
4349
4350	rcu_read_lock();
4351	for_each_fib6_node_rt_rcu(&table->tb6_root) {
4352		struct fib6_nh *nh;
4353
4354		/* RA routes do not use nexthops */
4355		if (rt->nh)
4356			continue;
4357
4358		nh = rt->fib6_nh;
4359		if (dev == nh->fib_nh_dev &&
4360		    ((rt->fib6_flags & (RTF_ADDRCONF | RTF_DEFAULT)) == (RTF_ADDRCONF | RTF_DEFAULT)) &&
4361		    ipv6_addr_equal(&nh->fib_nh_gw6, addr))
4362			break;
4363	}
4364	if (rt && !fib6_info_hold_safe(rt))
4365		rt = NULL;
4366	rcu_read_unlock();
4367	return rt;
4368}
4369
4370struct fib6_info *rt6_add_dflt_router(struct net *net,
4371				     const struct in6_addr *gwaddr,
4372				     struct net_device *dev,
4373				     unsigned int pref,
4374				     u32 defrtr_usr_metric,
4375				     int lifetime)
4376{
4377	struct fib6_config cfg = {
4378		.fc_table	= l3mdev_fib_table(dev) ? : RT6_TABLE_DFLT,
4379		.fc_metric	= defrtr_usr_metric,
4380		.fc_ifindex	= dev->ifindex,
4381		.fc_flags	= RTF_GATEWAY | RTF_ADDRCONF | RTF_DEFAULT |
4382				  RTF_UP | RTF_EXPIRES | RTF_PREF(pref),
4383		.fc_protocol = RTPROT_RA,
4384		.fc_type = RTN_UNICAST,
4385		.fc_nlinfo.portid = 0,
4386		.fc_nlinfo.nlh = NULL,
4387		.fc_nlinfo.nl_net = net,
4388		.fc_expires = jiffies_to_clock_t(lifetime * HZ),
4389	};
4390
4391	cfg.fc_gateway = *gwaddr;
4392
4393	if (!ip6_route_add(&cfg, GFP_ATOMIC, NULL)) {
4394		struct fib6_table *table;
4395
4396		table = fib6_get_table(dev_net(dev), cfg.fc_table);
4397		if (table)
4398			table->flags |= RT6_TABLE_HAS_DFLT_ROUTER;
4399	}
4400
4401	return rt6_get_dflt_router(net, gwaddr, dev);
4402}
4403
4404static void __rt6_purge_dflt_routers(struct net *net,
4405				     struct fib6_table *table)
4406{
4407	struct fib6_info *rt;
4408
4409restart:
4410	rcu_read_lock();
4411	for_each_fib6_node_rt_rcu(&table->tb6_root) {
4412		struct net_device *dev = fib6_info_nh_dev(rt);
4413		struct inet6_dev *idev = dev ? __in6_dev_get(dev) : NULL;
4414
4415		if (rt->fib6_flags & (RTF_DEFAULT | RTF_ADDRCONF) &&
4416		    (!idev || idev->cnf.accept_ra != 2) &&
4417		    fib6_info_hold_safe(rt)) {
4418			rcu_read_unlock();
4419			ip6_del_rt(net, rt, false);
4420			goto restart;
4421		}
4422	}
4423	rcu_read_unlock();
4424
4425	table->flags &= ~RT6_TABLE_HAS_DFLT_ROUTER;
4426}
4427
4428void rt6_purge_dflt_routers(struct net *net)
4429{
4430	struct fib6_table *table;
4431	struct hlist_head *head;
4432	unsigned int h;
4433
4434	rcu_read_lock();
4435
4436	for (h = 0; h < FIB6_TABLE_HASHSZ; h++) {
4437		head = &net->ipv6.fib_table_hash[h];
4438		hlist_for_each_entry_rcu(table, head, tb6_hlist) {
4439			if (table->flags & RT6_TABLE_HAS_DFLT_ROUTER)
4440				__rt6_purge_dflt_routers(net, table);
4441		}
4442	}
4443
4444	rcu_read_unlock();
4445}
4446
4447static void rtmsg_to_fib6_config(struct net *net,
4448				 struct in6_rtmsg *rtmsg,
4449				 struct fib6_config *cfg)
4450{
4451	*cfg = (struct fib6_config){
4452		.fc_table = l3mdev_fib_table_by_index(net, rtmsg->rtmsg_ifindex) ?
4453			 : RT6_TABLE_MAIN,
4454		.fc_ifindex = rtmsg->rtmsg_ifindex,
4455		.fc_metric = rtmsg->rtmsg_metric,
4456		.fc_expires = rtmsg->rtmsg_info,
4457		.fc_dst_len = rtmsg->rtmsg_dst_len,
4458		.fc_src_len = rtmsg->rtmsg_src_len,
4459		.fc_flags = rtmsg->rtmsg_flags,
4460		.fc_type = rtmsg->rtmsg_type,
4461
4462		.fc_nlinfo.nl_net = net,
 
 
 
 
 
 
 
4463
4464		.fc_dst = rtmsg->rtmsg_dst,
4465		.fc_src = rtmsg->rtmsg_src,
4466		.fc_gateway = rtmsg->rtmsg_gateway,
4467	};
 
4468}
4469
4470int ipv6_route_ioctl(struct net *net, unsigned int cmd, struct in6_rtmsg *rtmsg)
4471{
4472	struct fib6_config cfg;
 
4473	int err;
4474
4475	if (cmd != SIOCADDRT && cmd != SIOCDELRT)
4476		return -EINVAL;
4477	if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
4478		return -EPERM;
 
 
 
 
 
4479
4480	rtmsg_to_fib6_config(net, rtmsg, &cfg);
4481
4482	rtnl_lock();
4483	switch (cmd) {
4484	case SIOCADDRT:
4485		/* Only do the default setting of fc_metric in route adding */
4486		if (cfg.fc_metric == 0)
4487			cfg.fc_metric = IP6_RT_PRIO_USER;
4488		err = ip6_route_add(&cfg, GFP_KERNEL, NULL);
4489		break;
4490	case SIOCDELRT:
4491		err = ip6_route_del(&cfg, NULL);
4492		break;
 
 
 
4493	}
4494	rtnl_unlock();
4495	return err;
4496}
4497
4498/*
4499 *	Drop the packet on the floor
4500 */
4501
4502static int ip6_pkt_drop(struct sk_buff *skb, u8 code, int ipstats_mib_noroutes)
4503{
4504	struct dst_entry *dst = skb_dst(skb);
4505	struct net *net = dev_net(dst->dev);
4506	struct inet6_dev *idev;
4507	SKB_DR(reason);
4508	int type;
4509
4510	if (netif_is_l3_master(skb->dev) ||
4511	    dst->dev == net->loopback_dev)
4512		idev = __in6_dev_get_safely(dev_get_by_index_rcu(net, IP6CB(skb)->iif));
4513	else
4514		idev = ip6_dst_idev(dst);
4515
4516	switch (ipstats_mib_noroutes) {
4517	case IPSTATS_MIB_INNOROUTES:
4518		type = ipv6_addr_type(&ipv6_hdr(skb)->daddr);
4519		if (type == IPV6_ADDR_ANY) {
4520			SKB_DR_SET(reason, IP_INADDRERRORS);
4521			IP6_INC_STATS(net, idev, IPSTATS_MIB_INADDRERRORS);
4522			break;
4523		}
4524		SKB_DR_SET(reason, IP_INNOROUTES);
4525		fallthrough;
4526	case IPSTATS_MIB_OUTNOROUTES:
4527		SKB_DR_OR(reason, IP_OUTNOROUTES);
4528		IP6_INC_STATS(net, idev, ipstats_mib_noroutes);
4529		break;
4530	}
4531
4532	/* Start over by dropping the dst for l3mdev case */
4533	if (netif_is_l3_master(skb->dev))
4534		skb_dst_drop(skb);
4535
4536	icmpv6_send(skb, ICMPV6_DEST_UNREACH, code, 0);
4537	kfree_skb_reason(skb, reason);
4538	return 0;
4539}
4540
4541static int ip6_pkt_discard(struct sk_buff *skb)
4542{
4543	return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_INNOROUTES);
4544}
4545
4546static int ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb)
4547{
4548	skb->dev = skb_dst(skb)->dev;
4549	return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_OUTNOROUTES);
4550}
4551
4552static int ip6_pkt_prohibit(struct sk_buff *skb)
4553{
4554	return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_INNOROUTES);
4555}
4556
4557static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb)
4558{
4559	skb->dev = skb_dst(skb)->dev;
4560	return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
4561}
4562
4563/*
4564 *	Allocate a dst for local (unicast / anycast) address.
4565 */
4566
4567struct fib6_info *addrconf_f6i_alloc(struct net *net,
4568				     struct inet6_dev *idev,
4569				     const struct in6_addr *addr,
4570				     bool anycast, gfp_t gfp_flags,
4571				     struct netlink_ext_ack *extack)
4572{
4573	struct fib6_config cfg = {
4574		.fc_table = l3mdev_fib_table(idev->dev) ? : RT6_TABLE_LOCAL,
4575		.fc_ifindex = idev->dev->ifindex,
4576		.fc_flags = RTF_UP | RTF_NONEXTHOP,
4577		.fc_dst = *addr,
4578		.fc_dst_len = 128,
4579		.fc_protocol = RTPROT_KERNEL,
4580		.fc_nlinfo.nl_net = net,
4581		.fc_ignore_dev_down = true,
4582	};
4583	struct fib6_info *f6i;
4584
4585	if (anycast) {
4586		cfg.fc_type = RTN_ANYCAST;
4587		cfg.fc_flags |= RTF_ANYCAST;
4588	} else {
4589		cfg.fc_type = RTN_LOCAL;
4590		cfg.fc_flags |= RTF_LOCAL;
4591	}
4592
4593	f6i = ip6_route_info_create(&cfg, gfp_flags, extack);
4594	if (!IS_ERR(f6i)) {
4595		f6i->dst_nocount = true;
4596
4597		if (!anycast &&
4598		    (READ_ONCE(net->ipv6.devconf_all->disable_policy) ||
4599		     READ_ONCE(idev->cnf.disable_policy)))
4600			f6i->dst_nopolicy = true;
4601	}
4602
4603	return f6i;
 
 
 
 
 
 
 
 
 
 
 
 
 
4604}
4605
4606/* remove deleted ip from prefsrc entries */
4607struct arg_dev_net_ip {
 
4608	struct net *net;
4609	struct in6_addr *addr;
4610};
4611
4612static int fib6_remove_prefsrc(struct fib6_info *rt, void *arg)
4613{
 
4614	struct net *net = ((struct arg_dev_net_ip *)arg)->net;
4615	struct in6_addr *addr = ((struct arg_dev_net_ip *)arg)->addr;
4616
4617	if (!rt->nh &&
4618	    rt != net->ipv6.fib6_null_entry &&
4619	    ipv6_addr_equal(addr, &rt->fib6_prefsrc.addr) &&
4620	    !ipv6_chk_addr(net, addr, rt->fib6_nh->fib_nh_dev, 0)) {
4621		spin_lock_bh(&rt6_exception_lock);
4622		/* remove prefsrc entry */
4623		rt->fib6_prefsrc.plen = 0;
 
 
4624		spin_unlock_bh(&rt6_exception_lock);
4625	}
4626	return 0;
4627}
4628
4629void rt6_remove_prefsrc(struct inet6_ifaddr *ifp)
4630{
4631	struct net *net = dev_net(ifp->idev->dev);
4632	struct arg_dev_net_ip adni = {
 
4633		.net = net,
4634		.addr = &ifp->addr,
4635	};
4636	fib6_clean_all(net, fib6_remove_prefsrc, &adni);
4637}
4638
4639#define RTF_RA_ROUTER		(RTF_ADDRCONF | RTF_DEFAULT)
4640
4641/* Remove routers and update dst entries when gateway turn into host. */
4642static int fib6_clean_tohost(struct fib6_info *rt, void *arg)
4643{
4644	struct in6_addr *gateway = (struct in6_addr *)arg;
4645	struct fib6_nh *nh;
4646
4647	/* RA routes do not use nexthops */
4648	if (rt->nh)
4649		return 0;
4650
4651	nh = rt->fib6_nh;
4652	if (((rt->fib6_flags & RTF_RA_ROUTER) == RTF_RA_ROUTER) &&
4653	    nh->fib_nh_gw_family && ipv6_addr_equal(gateway, &nh->fib_nh_gw6))
4654		return -1;
 
4655
4656	/* Further clean up cached routes in exception table.
4657	 * This is needed because cached route may have a different
4658	 * gateway than its 'parent' in the case of an ip redirect.
4659	 */
4660	fib6_nh_exceptions_clean_tohost(nh, gateway);
4661
4662	return 0;
4663}
4664
4665void rt6_clean_tohost(struct net *net, struct in6_addr *gateway)
4666{
4667	fib6_clean_all(net, fib6_clean_tohost, gateway);
4668}
4669
4670struct arg_netdev_event {
4671	const struct net_device *dev;
4672	union {
4673		unsigned char nh_flags;
4674		unsigned long event;
4675	};
4676};
4677
4678static struct fib6_info *rt6_multipath_first_sibling(const struct fib6_info *rt)
4679{
4680	struct fib6_info *iter;
4681	struct fib6_node *fn;
4682
4683	fn = rcu_dereference_protected(rt->fib6_node,
4684			lockdep_is_held(&rt->fib6_table->tb6_lock));
4685	iter = rcu_dereference_protected(fn->leaf,
4686			lockdep_is_held(&rt->fib6_table->tb6_lock));
4687	while (iter) {
4688		if (iter->fib6_metric == rt->fib6_metric &&
4689		    rt6_qualify_for_ecmp(iter))
4690			return iter;
4691		iter = rcu_dereference_protected(iter->fib6_next,
4692				lockdep_is_held(&rt->fib6_table->tb6_lock));
4693	}
4694
4695	return NULL;
4696}
4697
4698/* only called for fib entries with builtin fib6_nh */
4699static bool rt6_is_dead(const struct fib6_info *rt)
4700{
4701	if (rt->fib6_nh->fib_nh_flags & RTNH_F_DEAD ||
4702	    (rt->fib6_nh->fib_nh_flags & RTNH_F_LINKDOWN &&
4703	     ip6_ignore_linkdown(rt->fib6_nh->fib_nh_dev)))
4704		return true;
4705
4706	return false;
4707}
4708
4709static int rt6_multipath_total_weight(const struct fib6_info *rt)
4710{
4711	struct fib6_info *iter;
4712	int total = 0;
4713
4714	if (!rt6_is_dead(rt))
4715		total += rt->fib6_nh->fib_nh_weight;
4716
4717	list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings) {
4718		if (!rt6_is_dead(iter))
4719			total += iter->fib6_nh->fib_nh_weight;
4720	}
4721
4722	return total;
4723}
4724
4725static void rt6_upper_bound_set(struct fib6_info *rt, int *weight, int total)
4726{
4727	int upper_bound = -1;
4728
4729	if (!rt6_is_dead(rt)) {
4730		*weight += rt->fib6_nh->fib_nh_weight;
4731		upper_bound = DIV_ROUND_CLOSEST_ULL((u64) (*weight) << 31,
4732						    total) - 1;
4733	}
4734	atomic_set(&rt->fib6_nh->fib_nh_upper_bound, upper_bound);
4735}
4736
4737static void rt6_multipath_upper_bound_set(struct fib6_info *rt, int total)
4738{
4739	struct fib6_info *iter;
4740	int weight = 0;
4741
4742	rt6_upper_bound_set(rt, &weight, total);
4743
4744	list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings)
4745		rt6_upper_bound_set(iter, &weight, total);
4746}
4747
4748void rt6_multipath_rebalance(struct fib6_info *rt)
4749{
4750	struct fib6_info *first;
4751	int total;
4752
4753	/* In case the entire multipath route was marked for flushing,
4754	 * then there is no need to rebalance upon the removal of every
4755	 * sibling route.
4756	 */
4757	if (!rt->fib6_nsiblings || rt->should_flush)
4758		return;
4759
4760	/* During lookup routes are evaluated in order, so we need to
4761	 * make sure upper bounds are assigned from the first sibling
4762	 * onwards.
4763	 */
4764	first = rt6_multipath_first_sibling(rt);
4765	if (WARN_ON_ONCE(!first))
4766		return;
4767
4768	total = rt6_multipath_total_weight(first);
4769	rt6_multipath_upper_bound_set(first, total);
4770}
4771
4772static int fib6_ifup(struct fib6_info *rt, void *p_arg)
4773{
4774	const struct arg_netdev_event *arg = p_arg;
4775	struct net *net = dev_net(arg->dev);
4776
4777	if (rt != net->ipv6.fib6_null_entry && !rt->nh &&
4778	    rt->fib6_nh->fib_nh_dev == arg->dev) {
4779		rt->fib6_nh->fib_nh_flags &= ~arg->nh_flags;
4780		fib6_update_sernum_upto_root(net, rt);
4781		rt6_multipath_rebalance(rt);
4782	}
4783
4784	return 0;
4785}
4786
4787void rt6_sync_up(struct net_device *dev, unsigned char nh_flags)
4788{
4789	struct arg_netdev_event arg = {
4790		.dev = dev,
4791		{
4792			.nh_flags = nh_flags,
4793		},
4794	};
4795
4796	if (nh_flags & RTNH_F_DEAD && netif_carrier_ok(dev))
4797		arg.nh_flags |= RTNH_F_LINKDOWN;
4798
4799	fib6_clean_all(dev_net(dev), fib6_ifup, &arg);
4800}
4801
4802/* only called for fib entries with inline fib6_nh */
4803static bool rt6_multipath_uses_dev(const struct fib6_info *rt,
4804				   const struct net_device *dev)
4805{
4806	struct fib6_info *iter;
4807
4808	if (rt->fib6_nh->fib_nh_dev == dev)
4809		return true;
4810	list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings)
4811		if (iter->fib6_nh->fib_nh_dev == dev)
4812			return true;
4813
4814	return false;
4815}
4816
4817static void rt6_multipath_flush(struct fib6_info *rt)
4818{
4819	struct fib6_info *iter;
4820
4821	rt->should_flush = 1;
4822	list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings)
4823		iter->should_flush = 1;
4824}
4825
4826static unsigned int rt6_multipath_dead_count(const struct fib6_info *rt,
4827					     const struct net_device *down_dev)
4828{
4829	struct fib6_info *iter;
4830	unsigned int dead = 0;
4831
4832	if (rt->fib6_nh->fib_nh_dev == down_dev ||
4833	    rt->fib6_nh->fib_nh_flags & RTNH_F_DEAD)
4834		dead++;
4835	list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings)
4836		if (iter->fib6_nh->fib_nh_dev == down_dev ||
4837		    iter->fib6_nh->fib_nh_flags & RTNH_F_DEAD)
4838			dead++;
4839
4840	return dead;
4841}
4842
4843static void rt6_multipath_nh_flags_set(struct fib6_info *rt,
4844				       const struct net_device *dev,
4845				       unsigned char nh_flags)
4846{
4847	struct fib6_info *iter;
4848
4849	if (rt->fib6_nh->fib_nh_dev == dev)
4850		rt->fib6_nh->fib_nh_flags |= nh_flags;
4851	list_for_each_entry(iter, &rt->fib6_siblings, fib6_siblings)
4852		if (iter->fib6_nh->fib_nh_dev == dev)
4853			iter->fib6_nh->fib_nh_flags |= nh_flags;
4854}
4855
4856/* called with write lock held for table with rt */
4857static int fib6_ifdown(struct fib6_info *rt, void *p_arg)
4858{
4859	const struct arg_netdev_event *arg = p_arg;
4860	const struct net_device *dev = arg->dev;
4861	struct net *net = dev_net(dev);
4862
4863	if (rt == net->ipv6.fib6_null_entry || rt->nh)
4864		return 0;
4865
4866	switch (arg->event) {
4867	case NETDEV_UNREGISTER:
4868		return rt->fib6_nh->fib_nh_dev == dev ? -1 : 0;
4869	case NETDEV_DOWN:
4870		if (rt->should_flush)
4871			return -1;
4872		if (!rt->fib6_nsiblings)
4873			return rt->fib6_nh->fib_nh_dev == dev ? -1 : 0;
4874		if (rt6_multipath_uses_dev(rt, dev)) {
4875			unsigned int count;
4876
4877			count = rt6_multipath_dead_count(rt, dev);
4878			if (rt->fib6_nsiblings + 1 == count) {
4879				rt6_multipath_flush(rt);
4880				return -1;
4881			}
4882			rt6_multipath_nh_flags_set(rt, dev, RTNH_F_DEAD |
4883						   RTNH_F_LINKDOWN);
4884			fib6_update_sernum(net, rt);
4885			rt6_multipath_rebalance(rt);
4886		}
4887		return -2;
4888	case NETDEV_CHANGE:
4889		if (rt->fib6_nh->fib_nh_dev != dev ||
4890		    rt->fib6_flags & (RTF_LOCAL | RTF_ANYCAST))
4891			break;
4892		rt->fib6_nh->fib_nh_flags |= RTNH_F_LINKDOWN;
4893		rt6_multipath_rebalance(rt);
4894		break;
4895	}
4896
4897	return 0;
4898}
4899
4900void rt6_sync_down_dev(struct net_device *dev, unsigned long event)
4901{
4902	struct arg_netdev_event arg = {
4903		.dev = dev,
4904		{
4905			.event = event,
4906		},
4907	};
4908	struct net *net = dev_net(dev);
4909
4910	if (net->ipv6.sysctl.skip_notify_on_dev_down)
4911		fib6_clean_all_skip_notify(net, fib6_ifdown, &arg);
4912	else
4913		fib6_clean_all(net, fib6_ifdown, &arg);
4914}
4915
4916void rt6_disable_ip(struct net_device *dev, unsigned long event)
4917{
4918	rt6_sync_down_dev(dev, event);
4919	rt6_uncached_list_flush_dev(dev);
4920	neigh_ifdown(&nd_tbl, dev);
4921}
4922
4923struct rt6_mtu_change_arg {
4924	struct net_device *dev;
4925	unsigned int mtu;
4926	struct fib6_info *f6i;
4927};
4928
4929static int fib6_nh_mtu_change(struct fib6_nh *nh, void *_arg)
4930{
4931	struct rt6_mtu_change_arg *arg = (struct rt6_mtu_change_arg *)_arg;
4932	struct fib6_info *f6i = arg->f6i;
4933
4934	/* For administrative MTU increase, there is no way to discover
4935	 * IPv6 PMTU increase, so PMTU increase should be updated here.
4936	 * Since RFC 1981 doesn't include administrative MTU increase
4937	 * update PMTU increase is a MUST. (i.e. jumbo frame)
4938	 */
4939	if (nh->fib_nh_dev == arg->dev) {
4940		struct inet6_dev *idev = __in6_dev_get(arg->dev);
4941		u32 mtu = f6i->fib6_pmtu;
4942
4943		if (mtu >= arg->mtu ||
4944		    (mtu < arg->mtu && mtu == idev->cnf.mtu6))
4945			fib6_metric_set(f6i, RTAX_MTU, arg->mtu);
4946
4947		spin_lock_bh(&rt6_exception_lock);
4948		rt6_exceptions_update_pmtu(idev, nh, arg->mtu);
4949		spin_unlock_bh(&rt6_exception_lock);
4950	}
4951
4952	return 0;
4953}
4954
4955static int rt6_mtu_change_route(struct fib6_info *f6i, void *p_arg)
4956{
4957	struct rt6_mtu_change_arg *arg = (struct rt6_mtu_change_arg *) p_arg;
4958	struct inet6_dev *idev;
4959
4960	/* In IPv6 pmtu discovery is not optional,
4961	   so that RTAX_MTU lock cannot disable it.
4962	   We still use this lock to block changes
4963	   caused by addrconf/ndisc.
4964	*/
4965
4966	idev = __in6_dev_get(arg->dev);
4967	if (!idev)
4968		return 0;
4969
4970	if (fib6_metric_locked(f6i, RTAX_MTU))
4971		return 0;
4972
4973	arg->f6i = f6i;
4974	if (f6i->nh) {
4975		/* fib6_nh_mtu_change only returns 0, so this is safe */
4976		return nexthop_for_each_fib6_nh(f6i->nh, fib6_nh_mtu_change,
4977						arg);
 
 
 
 
 
4978	}
4979
4980	return fib6_nh_mtu_change(f6i->fib6_nh, arg);
4981}
4982
4983void rt6_mtu_change(struct net_device *dev, unsigned int mtu)
4984{
4985	struct rt6_mtu_change_arg arg = {
4986		.dev = dev,
4987		.mtu = mtu,
4988	};
4989
4990	fib6_clean_all(dev_net(dev), rt6_mtu_change_route, &arg);
4991}
4992
4993static const struct nla_policy rtm_ipv6_policy[RTA_MAX+1] = {
4994	[RTA_UNSPEC]		= { .strict_start_type = RTA_DPORT + 1 },
4995	[RTA_GATEWAY]           = { .len = sizeof(struct in6_addr) },
4996	[RTA_PREFSRC]		= { .len = sizeof(struct in6_addr) },
4997	[RTA_OIF]               = { .type = NLA_U32 },
4998	[RTA_IIF]		= { .type = NLA_U32 },
4999	[RTA_PRIORITY]          = { .type = NLA_U32 },
5000	[RTA_METRICS]           = { .type = NLA_NESTED },
5001	[RTA_MULTIPATH]		= { .len = sizeof(struct rtnexthop) },
5002	[RTA_PREF]              = { .type = NLA_U8 },
5003	[RTA_ENCAP_TYPE]	= { .type = NLA_U16 },
5004	[RTA_ENCAP]		= { .type = NLA_NESTED },
5005	[RTA_EXPIRES]		= { .type = NLA_U32 },
5006	[RTA_UID]		= { .type = NLA_U32 },
5007	[RTA_MARK]		= { .type = NLA_U32 },
5008	[RTA_TABLE]		= { .type = NLA_U32 },
5009	[RTA_IP_PROTO]		= { .type = NLA_U8 },
5010	[RTA_SPORT]		= { .type = NLA_U16 },
5011	[RTA_DPORT]		= { .type = NLA_U16 },
5012	[RTA_NH_ID]		= { .type = NLA_U32 },
5013};
5014
5015static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
5016			      struct fib6_config *cfg,
5017			      struct netlink_ext_ack *extack)
5018{
5019	struct rtmsg *rtm;
5020	struct nlattr *tb[RTA_MAX+1];
5021	unsigned int pref;
5022	int err;
5023
5024	err = nlmsg_parse_deprecated(nlh, sizeof(*rtm), tb, RTA_MAX,
5025				     rtm_ipv6_policy, extack);
5026	if (err < 0)
5027		goto errout;
5028
5029	err = -EINVAL;
5030	rtm = nlmsg_data(nlh);
 
5031
5032	if (rtm->rtm_tos) {
5033		NL_SET_ERR_MSG(extack,
5034			       "Invalid dsfield (tos): option not available for IPv6");
5035		goto errout;
5036	}
5037
5038	*cfg = (struct fib6_config){
5039		.fc_table = rtm->rtm_table,
5040		.fc_dst_len = rtm->rtm_dst_len,
5041		.fc_src_len = rtm->rtm_src_len,
5042		.fc_flags = RTF_UP,
5043		.fc_protocol = rtm->rtm_protocol,
5044		.fc_type = rtm->rtm_type,
5045
5046		.fc_nlinfo.portid = NETLINK_CB(skb).portid,
5047		.fc_nlinfo.nlh = nlh,
5048		.fc_nlinfo.nl_net = sock_net(skb->sk),
5049	};
5050
5051	if (rtm->rtm_type == RTN_UNREACHABLE ||
5052	    rtm->rtm_type == RTN_BLACKHOLE ||
5053	    rtm->rtm_type == RTN_PROHIBIT ||
5054	    rtm->rtm_type == RTN_THROW)
5055		cfg->fc_flags |= RTF_REJECT;
5056
5057	if (rtm->rtm_type == RTN_LOCAL)
5058		cfg->fc_flags |= RTF_LOCAL;
5059
5060	if (rtm->rtm_flags & RTM_F_CLONED)
5061		cfg->fc_flags |= RTF_CACHE;
5062
5063	cfg->fc_flags |= (rtm->rtm_flags & RTNH_F_ONLINK);
5064
5065	if (tb[RTA_NH_ID]) {
5066		if (tb[RTA_GATEWAY]   || tb[RTA_OIF] ||
5067		    tb[RTA_MULTIPATH] || tb[RTA_ENCAP]) {
5068			NL_SET_ERR_MSG(extack,
5069				       "Nexthop specification and nexthop id are mutually exclusive");
5070			goto errout;
5071		}
5072		cfg->fc_nh_id = nla_get_u32(tb[RTA_NH_ID]);
5073	}
5074
5075	if (tb[RTA_GATEWAY]) {
5076		cfg->fc_gateway = nla_get_in6_addr(tb[RTA_GATEWAY]);
5077		cfg->fc_flags |= RTF_GATEWAY;
5078	}
5079	if (tb[RTA_VIA]) {
5080		NL_SET_ERR_MSG(extack, "IPv6 does not support RTA_VIA attribute");
5081		goto errout;
5082	}
5083
5084	if (tb[RTA_DST]) {
5085		int plen = (rtm->rtm_dst_len + 7) >> 3;
5086
5087		if (nla_len(tb[RTA_DST]) < plen)
5088			goto errout;
5089
5090		nla_memcpy(&cfg->fc_dst, tb[RTA_DST], plen);
5091	}
5092
5093	if (tb[RTA_SRC]) {
5094		int plen = (rtm->rtm_src_len + 7) >> 3;
5095
5096		if (nla_len(tb[RTA_SRC]) < plen)
5097			goto errout;
5098
5099		nla_memcpy(&cfg->fc_src, tb[RTA_SRC], plen);
5100	}
5101
5102	if (tb[RTA_PREFSRC])
5103		cfg->fc_prefsrc = nla_get_in6_addr(tb[RTA_PREFSRC]);
5104
5105	if (tb[RTA_OIF])
5106		cfg->fc_ifindex = nla_get_u32(tb[RTA_OIF]);
5107
5108	if (tb[RTA_PRIORITY])
5109		cfg->fc_metric = nla_get_u32(tb[RTA_PRIORITY]);
5110
5111	if (tb[RTA_METRICS]) {
5112		cfg->fc_mx = nla_data(tb[RTA_METRICS]);
5113		cfg->fc_mx_len = nla_len(tb[RTA_METRICS]);
5114	}
5115
5116	if (tb[RTA_TABLE])
5117		cfg->fc_table = nla_get_u32(tb[RTA_TABLE]);
5118
5119	if (tb[RTA_MULTIPATH]) {
5120		cfg->fc_mp = nla_data(tb[RTA_MULTIPATH]);
5121		cfg->fc_mp_len = nla_len(tb[RTA_MULTIPATH]);
5122
5123		err = lwtunnel_valid_encap_type_attr(cfg->fc_mp,
5124						     cfg->fc_mp_len, extack);
5125		if (err < 0)
5126			goto errout;
5127	}
5128
5129	if (tb[RTA_PREF]) {
5130		pref = nla_get_u8(tb[RTA_PREF]);
5131		if (pref != ICMPV6_ROUTER_PREF_LOW &&
5132		    pref != ICMPV6_ROUTER_PREF_HIGH)
5133			pref = ICMPV6_ROUTER_PREF_MEDIUM;
5134		cfg->fc_flags |= RTF_PREF(pref);
5135	}
5136
5137	if (tb[RTA_ENCAP])
5138		cfg->fc_encap = tb[RTA_ENCAP];
5139
5140	if (tb[RTA_ENCAP_TYPE]) {
5141		cfg->fc_encap_type = nla_get_u16(tb[RTA_ENCAP_TYPE]);
5142
5143		err = lwtunnel_valid_encap_type(cfg->fc_encap_type, extack);
5144		if (err < 0)
5145			goto errout;
5146	}
5147
5148	if (tb[RTA_EXPIRES]) {
5149		unsigned long timeout = addrconf_timeout_fixup(nla_get_u32(tb[RTA_EXPIRES]), HZ);
5150
5151		if (addrconf_finite_timeout(timeout)) {
5152			cfg->fc_expires = jiffies_to_clock_t(timeout * HZ);
5153			cfg->fc_flags |= RTF_EXPIRES;
5154		}
5155	}
5156
5157	err = 0;
5158errout:
5159	return err;
5160}
5161
5162struct rt6_nh {
5163	struct fib6_info *fib6_info;
5164	struct fib6_config r_cfg;
 
5165	struct list_head next;
5166};
5167
5168static int ip6_route_info_append(struct net *net,
5169				 struct list_head *rt6_nh_list,
5170				 struct fib6_info *rt,
5171				 struct fib6_config *r_cfg)
 
 
 
 
 
 
 
 
 
5172{
5173	struct rt6_nh *nh;
5174	int err = -EEXIST;
5175
5176	list_for_each_entry(nh, rt6_nh_list, next) {
5177		/* check if fib6_info already exists */
5178		if (rt6_duplicate_nexthop(nh->fib6_info, rt))
5179			return err;
5180	}
5181
5182	nh = kzalloc(sizeof(*nh), GFP_KERNEL);
5183	if (!nh)
5184		return -ENOMEM;
5185	nh->fib6_info = rt;
 
 
 
 
 
5186	memcpy(&nh->r_cfg, r_cfg, sizeof(*r_cfg));
5187	list_add_tail(&nh->next, rt6_nh_list);
5188
5189	return 0;
5190}
5191
5192static void ip6_route_mpath_notify(struct fib6_info *rt,
5193				   struct fib6_info *rt_last,
5194				   struct nl_info *info,
5195				   __u16 nlflags)
5196{
5197	/* if this is an APPEND route, then rt points to the first route
5198	 * inserted and rt_last points to last route inserted. Userspace
5199	 * wants a consistent dump of the route which starts at the first
5200	 * nexthop. Since sibling routes are always added at the end of
5201	 * the list, find the first sibling of the last route appended
5202	 */
5203	rcu_read_lock();
5204
5205	if ((nlflags & NLM_F_APPEND) && rt_last && rt_last->fib6_nsiblings) {
5206		rt = list_first_or_null_rcu(&rt_last->fib6_siblings,
5207					    struct fib6_info,
5208					    fib6_siblings);
5209	}
5210
5211	if (rt)
5212		inet6_rt_notify(RTM_NEWROUTE, rt, info, nlflags);
5213
5214	rcu_read_unlock();
5215}
5216
5217static bool ip6_route_mpath_should_notify(const struct fib6_info *rt)
5218{
5219	bool rt_can_ecmp = rt6_qualify_for_ecmp(rt);
5220	bool should_notify = false;
5221	struct fib6_info *leaf;
5222	struct fib6_node *fn;
5223
5224	rcu_read_lock();
5225	fn = rcu_dereference(rt->fib6_node);
5226	if (!fn)
5227		goto out;
5228
5229	leaf = rcu_dereference(fn->leaf);
5230	if (!leaf)
5231		goto out;
5232
5233	if (rt == leaf ||
5234	    (rt_can_ecmp && rt->fib6_metric == leaf->fib6_metric &&
5235	     rt6_qualify_for_ecmp(leaf)))
5236		should_notify = true;
5237out:
5238	rcu_read_unlock();
5239
5240	return should_notify;
5241}
5242
5243static int fib6_gw_from_attr(struct in6_addr *gw, struct nlattr *nla,
5244			     struct netlink_ext_ack *extack)
5245{
5246	if (nla_len(nla) < sizeof(*gw)) {
5247		NL_SET_ERR_MSG(extack, "Invalid IPv6 address in RTA_GATEWAY");
5248		return -EINVAL;
5249	}
5250
5251	*gw = nla_get_in6_addr(nla);
5252
5253	return 0;
5254}
5255
5256static int ip6_route_multipath_add(struct fib6_config *cfg,
5257				   struct netlink_ext_ack *extack)
5258{
5259	struct fib6_info *rt_notif = NULL, *rt_last = NULL;
5260	struct nl_info *info = &cfg->fc_nlinfo;
5261	struct fib6_config r_cfg;
5262	struct rtnexthop *rtnh;
5263	struct fib6_info *rt;
5264	struct rt6_nh *err_nh;
5265	struct rt6_nh *nh, *nh_safe;
5266	__u16 nlflags;
5267	int remaining;
5268	int attrlen;
5269	int err = 1;
5270	int nhn = 0;
5271	int replace = (cfg->fc_nlinfo.nlh &&
5272		       (cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_REPLACE));
5273	LIST_HEAD(rt6_nh_list);
5274
5275	nlflags = replace ? NLM_F_REPLACE : NLM_F_CREATE;
5276	if (info->nlh && info->nlh->nlmsg_flags & NLM_F_APPEND)
5277		nlflags |= NLM_F_APPEND;
5278
5279	remaining = cfg->fc_mp_len;
5280	rtnh = (struct rtnexthop *)cfg->fc_mp;
5281
5282	/* Parse a Multipath Entry and build a list (rt6_nh_list) of
5283	 * fib6_info structs per nexthop
5284	 */
5285	while (rtnh_ok(rtnh, remaining)) {
5286		memcpy(&r_cfg, cfg, sizeof(*cfg));
5287		if (rtnh->rtnh_ifindex)
5288			r_cfg.fc_ifindex = rtnh->rtnh_ifindex;
5289
5290		attrlen = rtnh_attrlen(rtnh);
5291		if (attrlen > 0) {
5292			struct nlattr *nla, *attrs = rtnh_attrs(rtnh);
5293
5294			nla = nla_find(attrs, attrlen, RTA_GATEWAY);
5295			if (nla) {
5296				err = fib6_gw_from_attr(&r_cfg.fc_gateway, nla,
5297							extack);
5298				if (err)
5299					goto cleanup;
5300
5301				r_cfg.fc_flags |= RTF_GATEWAY;
5302			}
5303			r_cfg.fc_encap = nla_find(attrs, attrlen, RTA_ENCAP);
5304
5305			/* RTA_ENCAP_TYPE length checked in
5306			 * lwtunnel_valid_encap_type_attr
5307			 */
5308			nla = nla_find(attrs, attrlen, RTA_ENCAP_TYPE);
5309			if (nla)
5310				r_cfg.fc_encap_type = nla_get_u16(nla);
5311		}
5312
5313		r_cfg.fc_flags |= (rtnh->rtnh_flags & RTNH_F_ONLINK);
5314		rt = ip6_route_info_create(&r_cfg, GFP_KERNEL, extack);
5315		if (IS_ERR(rt)) {
5316			err = PTR_ERR(rt);
5317			rt = NULL;
5318			goto cleanup;
5319		}
5320		if (!rt6_qualify_for_ecmp(rt)) {
5321			err = -EINVAL;
5322			NL_SET_ERR_MSG(extack,
5323				       "Device only routes can not be added for IPv6 using the multipath API.");
5324			fib6_info_release(rt);
5325			goto cleanup;
5326		}
5327
5328		rt->fib6_nh->fib_nh_weight = rtnh->rtnh_hops + 1;
5329
5330		err = ip6_route_info_append(info->nl_net, &rt6_nh_list,
5331					    rt, &r_cfg);
5332		if (err) {
5333			fib6_info_release(rt);
5334			goto cleanup;
5335		}
5336
5337		rtnh = rtnh_next(rtnh, &remaining);
5338	}
5339
5340	if (list_empty(&rt6_nh_list)) {
5341		NL_SET_ERR_MSG(extack,
5342			       "Invalid nexthop configuration - no valid nexthops");
5343		return -EINVAL;
5344	}
5345
5346	/* for add and replace send one notification with all nexthops.
5347	 * Skip the notification in fib6_add_rt2node and send one with
5348	 * the full route when done
5349	 */
5350	info->skip_notify = 1;
5351
5352	/* For add and replace, send one notification with all nexthops. For
5353	 * append, send one notification with all appended nexthops.
5354	 */
5355	info->skip_notify_kernel = 1;
5356
5357	err_nh = NULL;
5358	list_for_each_entry(nh, &rt6_nh_list, next) {
5359		err = __ip6_ins_rt(nh->fib6_info, info, extack);
 
 
 
 
5360
 
 
5361		if (err) {
5362			if (replace && nhn)
5363				NL_SET_ERR_MSG_MOD(extack,
5364						   "multipath route replace failed (check consistency of installed routes)");
5365			err_nh = nh;
5366			goto add_errout;
5367		}
5368		/* save reference to last route successfully inserted */
5369		rt_last = nh->fib6_info;
5370
5371		/* save reference to first route for notification */
5372		if (!rt_notif)
5373			rt_notif = nh->fib6_info;
5374
5375		/* Because each route is added like a single route we remove
5376		 * these flags after the first nexthop: if there is a collision,
5377		 * we have already failed to add the first nexthop:
5378		 * fib6_add_rt2node() has rejected it; when replacing, old
5379		 * nexthops have been replaced by first new, the rest should
5380		 * be added to it.
5381		 */
5382		if (cfg->fc_nlinfo.nlh) {
5383			cfg->fc_nlinfo.nlh->nlmsg_flags &= ~(NLM_F_EXCL |
5384							     NLM_F_REPLACE);
5385			cfg->fc_nlinfo.nlh->nlmsg_flags |= NLM_F_CREATE;
5386		}
5387		nhn++;
5388	}
5389
5390	/* An in-kernel notification should only be sent in case the new
5391	 * multipath route is added as the first route in the node, or if
5392	 * it was appended to it. We pass 'rt_notif' since it is the first
5393	 * sibling and might allow us to skip some checks in the replace case.
5394	 */
5395	if (ip6_route_mpath_should_notify(rt_notif)) {
5396		enum fib_event_type fib_event;
5397
5398		if (rt_notif->fib6_nsiblings != nhn - 1)
5399			fib_event = FIB_EVENT_ENTRY_APPEND;
5400		else
5401			fib_event = FIB_EVENT_ENTRY_REPLACE;
5402
5403		err = call_fib6_multipath_entry_notifiers(info->nl_net,
5404							  fib_event, rt_notif,
5405							  nhn - 1, extack);
5406		if (err) {
5407			/* Delete all the siblings that were just added */
5408			err_nh = NULL;
5409			goto add_errout;
5410		}
5411	}
5412
5413	/* success ... tell user about new route */
5414	ip6_route_mpath_notify(rt_notif, rt_last, info, nlflags);
5415	goto cleanup;
5416
5417add_errout:
5418	/* send notification for routes that were added so that
5419	 * the delete notifications sent by ip6_route_del are
5420	 * coherent
5421	 */
5422	if (rt_notif)
5423		ip6_route_mpath_notify(rt_notif, rt_last, info, nlflags);
5424
5425	/* Delete routes that were already added */
5426	list_for_each_entry(nh, &rt6_nh_list, next) {
5427		if (err_nh == nh)
5428			break;
5429		ip6_route_del(&nh->r_cfg, extack);
5430	}
5431
5432cleanup:
5433	list_for_each_entry_safe(nh, nh_safe, &rt6_nh_list, next) {
5434		fib6_info_release(nh->fib6_info);
 
 
5435		list_del(&nh->next);
5436		kfree(nh);
5437	}
5438
5439	return err;
5440}
5441
5442static int ip6_route_multipath_del(struct fib6_config *cfg,
5443				   struct netlink_ext_ack *extack)
5444{
5445	struct fib6_config r_cfg;
5446	struct rtnexthop *rtnh;
5447	int last_err = 0;
5448	int remaining;
5449	int attrlen;
5450	int err;
5451
5452	remaining = cfg->fc_mp_len;
5453	rtnh = (struct rtnexthop *)cfg->fc_mp;
5454
5455	/* Parse a Multipath Entry */
5456	while (rtnh_ok(rtnh, remaining)) {
5457		memcpy(&r_cfg, cfg, sizeof(*cfg));
5458		if (rtnh->rtnh_ifindex)
5459			r_cfg.fc_ifindex = rtnh->rtnh_ifindex;
5460
5461		attrlen = rtnh_attrlen(rtnh);
5462		if (attrlen > 0) {
5463			struct nlattr *nla, *attrs = rtnh_attrs(rtnh);
5464
5465			nla = nla_find(attrs, attrlen, RTA_GATEWAY);
5466			if (nla) {
5467				err = fib6_gw_from_attr(&r_cfg.fc_gateway, nla,
5468							extack);
5469				if (err) {
5470					last_err = err;
5471					goto next_rtnh;
5472				}
5473
5474				r_cfg.fc_flags |= RTF_GATEWAY;
5475			}
5476		}
5477		err = ip6_route_del(&r_cfg, extack);
5478		if (err)
5479			last_err = err;
5480
5481next_rtnh:
5482		rtnh = rtnh_next(rtnh, &remaining);
5483	}
5484
5485	return last_err;
5486}
5487
5488static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh,
5489			      struct netlink_ext_ack *extack)
5490{
5491	struct fib6_config cfg;
5492	int err;
5493
5494	err = rtm_to_fib6_config(skb, nlh, &cfg, extack);
5495	if (err < 0)
5496		return err;
5497
5498	if (cfg.fc_nh_id &&
5499	    !nexthop_find_by_id(sock_net(skb->sk), cfg.fc_nh_id)) {
5500		NL_SET_ERR_MSG(extack, "Nexthop id does not exist");
5501		return -EINVAL;
5502	}
5503
5504	if (cfg.fc_mp)
5505		return ip6_route_multipath_del(&cfg, extack);
5506	else {
5507		cfg.fc_delete_all_nh = 1;
5508		return ip6_route_del(&cfg, extack);
5509	}
5510}
5511
5512static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh,
5513			      struct netlink_ext_ack *extack)
5514{
5515	struct fib6_config cfg;
5516	int err;
5517
5518	err = rtm_to_fib6_config(skb, nlh, &cfg, extack);
5519	if (err < 0)
5520		return err;
5521
5522	if (cfg.fc_metric == 0)
5523		cfg.fc_metric = IP6_RT_PRIO_USER;
5524
5525	if (cfg.fc_mp)
5526		return ip6_route_multipath_add(&cfg, extack);
5527	else
5528		return ip6_route_add(&cfg, GFP_KERNEL, extack);
5529}
5530
5531/* add the overhead of this fib6_nh to nexthop_len */
5532static int rt6_nh_nlmsg_size(struct fib6_nh *nh, void *arg)
5533{
5534	int *nexthop_len = arg;
5535
5536	*nexthop_len += nla_total_size(0)	 /* RTA_MULTIPATH */
5537		     + NLA_ALIGN(sizeof(struct rtnexthop))
5538		     + nla_total_size(16); /* RTA_GATEWAY */
5539
5540	if (nh->fib_nh_lws) {
5541		/* RTA_ENCAP_TYPE */
5542		*nexthop_len += lwtunnel_get_encap_size(nh->fib_nh_lws);
5543		/* RTA_ENCAP */
5544		*nexthop_len += nla_total_size(2);
5545	}
5546
5547	return 0;
5548}
5549
5550static size_t rt6_nlmsg_size(struct fib6_info *f6i)
5551{
5552	int nexthop_len;
5553
5554	if (f6i->nh) {
5555		nexthop_len = nla_total_size(4); /* RTA_NH_ID */
5556		nexthop_for_each_fib6_nh(f6i->nh, rt6_nh_nlmsg_size,
5557					 &nexthop_len);
5558	} else {
5559		struct fib6_nh *nh = f6i->fib6_nh;
5560		struct fib6_info *sibling;
5561
5562		nexthop_len = 0;
5563		if (f6i->fib6_nsiblings) {
5564			rt6_nh_nlmsg_size(nh, &nexthop_len);
5565
5566			rcu_read_lock();
5567
5568			list_for_each_entry_rcu(sibling, &f6i->fib6_siblings,
5569						fib6_siblings) {
5570				rt6_nh_nlmsg_size(sibling->fib6_nh, &nexthop_len);
5571			}
5572
5573			rcu_read_unlock();
5574		}
5575		nexthop_len += lwtunnel_get_encap_size(nh->fib_nh_lws);
5576	}
5577
5578	return NLMSG_ALIGN(sizeof(struct rtmsg))
5579	       + nla_total_size(16) /* RTA_SRC */
5580	       + nla_total_size(16) /* RTA_DST */
5581	       + nla_total_size(16) /* RTA_GATEWAY */
5582	       + nla_total_size(16) /* RTA_PREFSRC */
5583	       + nla_total_size(4) /* RTA_TABLE */
5584	       + nla_total_size(4) /* RTA_IIF */
5585	       + nla_total_size(4) /* RTA_OIF */
5586	       + nla_total_size(4) /* RTA_PRIORITY */
5587	       + RTAX_MAX * nla_total_size(4) /* RTA_METRICS */
5588	       + nla_total_size(sizeof(struct rta_cacheinfo))
5589	       + nla_total_size(TCP_CA_NAME_MAX) /* RTAX_CC_ALGO */
5590	       + nla_total_size(1) /* RTA_PREF */
 
5591	       + nexthop_len;
5592}
5593
5594static int rt6_fill_node_nexthop(struct sk_buff *skb, struct nexthop *nh,
5595				 unsigned char *flags)
5596{
5597	if (nexthop_is_multipath(nh)) {
5598		struct nlattr *mp;
5599
5600		mp = nla_nest_start_noflag(skb, RTA_MULTIPATH);
5601		if (!mp)
5602			goto nla_put_failure;
 
 
5603
5604		if (nexthop_mpath_fill_node(skb, nh, AF_INET6))
 
5605			goto nla_put_failure;
 
5606
5607		nla_nest_end(skb, mp);
5608	} else {
5609		struct fib6_nh *fib6_nh;
 
 
 
 
 
5610
5611		fib6_nh = nexthop_fib6_nh(nh);
5612		if (fib_nexthop_info(skb, &fib6_nh->nh_common, AF_INET6,
5613				     flags, false) < 0)
5614			goto nla_put_failure;
5615	}
5616
5617	return 0;
5618
5619nla_put_failure:
5620	return -EMSGSIZE;
5621}
5622
5623static int rt6_fill_node(struct net *net, struct sk_buff *skb,
5624			 struct fib6_info *rt, struct dst_entry *dst,
5625			 struct in6_addr *dest, struct in6_addr *src,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5626			 int iif, int type, u32 portid, u32 seq,
5627			 unsigned int flags)
5628{
5629	struct rt6_info *rt6 = dst_rt6_info(dst);
5630	struct rt6key *rt6_dst, *rt6_src;
5631	u32 *pmetrics, table, rt6_flags;
5632	unsigned char nh_flags = 0;
5633	struct nlmsghdr *nlh;
5634	struct rtmsg *rtm;
5635	long expires = 0;
 
 
5636
5637	nlh = nlmsg_put(skb, portid, seq, type, sizeof(*rtm), flags);
5638	if (!nlh)
5639		return -EMSGSIZE;
5640
5641	if (rt6) {
5642		rt6_dst = &rt6->rt6i_dst;
5643		rt6_src = &rt6->rt6i_src;
5644		rt6_flags = rt6->rt6i_flags;
5645	} else {
5646		rt6_dst = &rt->fib6_dst;
5647		rt6_src = &rt->fib6_src;
5648		rt6_flags = rt->fib6_flags;
5649	}
5650
5651	rtm = nlmsg_data(nlh);
5652	rtm->rtm_family = AF_INET6;
5653	rtm->rtm_dst_len = rt6_dst->plen;
5654	rtm->rtm_src_len = rt6_src->plen;
5655	rtm->rtm_tos = 0;
5656	if (rt->fib6_table)
5657		table = rt->fib6_table->tb6_id;
5658	else
5659		table = RT6_TABLE_UNSPEC;
5660	rtm->rtm_table = table < 256 ? table : RT_TABLE_COMPAT;
5661	if (nla_put_u32(skb, RTA_TABLE, table))
5662		goto nla_put_failure;
5663
5664	rtm->rtm_type = rt->fib6_type;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5665	rtm->rtm_flags = 0;
5666	rtm->rtm_scope = RT_SCOPE_UNIVERSE;
5667	rtm->rtm_protocol = rt->fib6_protocol;
5668
5669	if (rt6_flags & RTF_CACHE)
5670		rtm->rtm_flags |= RTM_F_CLONED;
5671
5672	if (dest) {
5673		if (nla_put_in6_addr(skb, RTA_DST, dest))
5674			goto nla_put_failure;
5675		rtm->rtm_dst_len = 128;
5676	} else if (rtm->rtm_dst_len)
5677		if (nla_put_in6_addr(skb, RTA_DST, &rt6_dst->addr))
5678			goto nla_put_failure;
5679#ifdef CONFIG_IPV6_SUBTREES
5680	if (src) {
5681		if (nla_put_in6_addr(skb, RTA_SRC, src))
5682			goto nla_put_failure;
5683		rtm->rtm_src_len = 128;
5684	} else if (rtm->rtm_src_len &&
5685		   nla_put_in6_addr(skb, RTA_SRC, &rt6_src->addr))
5686		goto nla_put_failure;
5687#endif
5688	if (iif) {
5689#ifdef CONFIG_IPV6_MROUTE
5690		if (ipv6_addr_is_multicast(&rt6_dst->addr)) {
5691			int err = ip6mr_get_route(net, skb, rtm, portid);
5692
5693			if (err == 0)
5694				return 0;
5695			if (err < 0)
5696				goto nla_put_failure;
5697		} else
5698#endif
5699			if (nla_put_u32(skb, RTA_IIF, iif))
5700				goto nla_put_failure;
5701	} else if (dest) {
5702		struct in6_addr saddr_buf;
5703		if (ip6_route_get_saddr(net, rt, dest, 0, 0, &saddr_buf) == 0 &&
5704		    nla_put_in6_addr(skb, RTA_PREFSRC, &saddr_buf))
5705			goto nla_put_failure;
5706	}
5707
5708	if (rt->fib6_prefsrc.plen) {
5709		struct in6_addr saddr_buf;
5710		saddr_buf = rt->fib6_prefsrc.addr;
5711		if (nla_put_in6_addr(skb, RTA_PREFSRC, &saddr_buf))
5712			goto nla_put_failure;
5713	}
5714
5715	pmetrics = dst ? dst_metrics_ptr(dst) : rt->fib6_metrics->metrics;
5716	if (rtnetlink_put_metrics(skb, pmetrics) < 0)
 
 
5717		goto nla_put_failure;
5718
5719	if (nla_put_u32(skb, RTA_PRIORITY, rt->fib6_metric))
5720		goto nla_put_failure;
5721
5722	/* For multipath routes, walk the siblings list and add
5723	 * each as a nexthop within RTA_MULTIPATH.
5724	 */
5725	if (rt6) {
5726		if (rt6_flags & RTF_GATEWAY &&
5727		    nla_put_in6_addr(skb, RTA_GATEWAY, &rt6->rt6i_gateway))
5728			goto nla_put_failure;
5729
5730		if (dst->dev && nla_put_u32(skb, RTA_OIF, dst->dev->ifindex))
5731			goto nla_put_failure;
5732
5733		if (dst->lwtstate &&
5734		    lwtunnel_fill_encap(skb, dst->lwtstate, RTA_ENCAP, RTA_ENCAP_TYPE) < 0)
5735			goto nla_put_failure;
5736	} else if (rt->fib6_nsiblings) {
5737		struct fib6_info *sibling;
5738		struct nlattr *mp;
5739
5740		mp = nla_nest_start_noflag(skb, RTA_MULTIPATH);
5741		if (!mp)
5742			goto nla_put_failure;
5743
5744		if (fib_add_nexthop(skb, &rt->fib6_nh->nh_common,
5745				    rt->fib6_nh->fib_nh_weight, AF_INET6,
5746				    0) < 0)
5747			goto nla_put_failure;
5748
5749		rcu_read_lock();
5750
5751		list_for_each_entry_rcu(sibling, &rt->fib6_siblings,
5752					fib6_siblings) {
5753			if (fib_add_nexthop(skb, &sibling->fib6_nh->nh_common,
5754					    sibling->fib6_nh->fib_nh_weight,
5755					    AF_INET6, 0) < 0) {
5756				rcu_read_unlock();
5757
5758				goto nla_put_failure;
5759			}
5760		}
5761
5762		rcu_read_unlock();
5763
5764		nla_nest_end(skb, mp);
5765	} else if (rt->nh) {
5766		if (nla_put_u32(skb, RTA_NH_ID, rt->nh->id))
5767			goto nla_put_failure;
5768
5769		if (nexthop_is_blackhole(rt->nh))
5770			rtm->rtm_type = RTN_BLACKHOLE;
5771
5772		if (READ_ONCE(net->ipv4.sysctl_nexthop_compat_mode) &&
5773		    rt6_fill_node_nexthop(skb, rt->nh, &nh_flags) < 0)
5774			goto nla_put_failure;
5775
5776		rtm->rtm_flags |= nh_flags;
5777	} else {
5778		if (fib_nexthop_info(skb, &rt->fib6_nh->nh_common, AF_INET6,
5779				     &nh_flags, false) < 0)
5780			goto nla_put_failure;
5781
5782		rtm->rtm_flags |= nh_flags;
5783	}
5784
5785	if (rt6_flags & RTF_EXPIRES) {
5786		expires = dst ? dst->expires : rt->expires;
5787		expires -= jiffies;
5788	}
5789
5790	if (!dst) {
5791		if (READ_ONCE(rt->offload))
5792			rtm->rtm_flags |= RTM_F_OFFLOAD;
5793		if (READ_ONCE(rt->trap))
5794			rtm->rtm_flags |= RTM_F_TRAP;
5795		if (READ_ONCE(rt->offload_failed))
5796			rtm->rtm_flags |= RTM_F_OFFLOAD_FAILED;
5797	}
5798
5799	if (rtnl_put_cacheinfo(skb, dst, 0, expires, dst ? dst->error : 0) < 0)
5800		goto nla_put_failure;
5801
5802	if (nla_put_u8(skb, RTA_PREF, IPV6_EXTRACT_PREF(rt6_flags)))
5803		goto nla_put_failure;
5804
5805
5806	nlmsg_end(skb, nlh);
5807	return 0;
5808
5809nla_put_failure:
5810	nlmsg_cancel(skb, nlh);
5811	return -EMSGSIZE;
5812}
5813
5814static int fib6_info_nh_uses_dev(struct fib6_nh *nh, void *arg)
5815{
5816	const struct net_device *dev = arg;
5817
5818	if (nh->fib_nh_dev == dev)
5819		return 1;
5820
5821	return 0;
5822}
5823
5824static bool fib6_info_uses_dev(const struct fib6_info *f6i,
5825			       const struct net_device *dev)
5826{
5827	if (f6i->nh) {
5828		struct net_device *_dev = (struct net_device *)dev;
5829
5830		return !!nexthop_for_each_fib6_nh(f6i->nh,
5831						  fib6_info_nh_uses_dev,
5832						  _dev);
5833	}
5834
5835	if (f6i->fib6_nh->fib_nh_dev == dev)
5836		return true;
5837
5838	if (f6i->fib6_nsiblings) {
5839		struct fib6_info *sibling, *next_sibling;
5840
5841		list_for_each_entry_safe(sibling, next_sibling,
5842					 &f6i->fib6_siblings, fib6_siblings) {
5843			if (sibling->fib6_nh->fib_nh_dev == dev)
5844				return true;
5845		}
5846	}
5847
5848	return false;
5849}
5850
5851struct fib6_nh_exception_dump_walker {
5852	struct rt6_rtnl_dump_arg *dump;
5853	struct fib6_info *rt;
5854	unsigned int flags;
5855	unsigned int skip;
5856	unsigned int count;
5857};
5858
5859static int rt6_nh_dump_exceptions(struct fib6_nh *nh, void *arg)
5860{
5861	struct fib6_nh_exception_dump_walker *w = arg;
5862	struct rt6_rtnl_dump_arg *dump = w->dump;
5863	struct rt6_exception_bucket *bucket;
5864	struct rt6_exception *rt6_ex;
5865	int i, err;
5866
5867	bucket = fib6_nh_get_excptn_bucket(nh, NULL);
5868	if (!bucket)
5869		return 0;
5870
5871	for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
5872		hlist_for_each_entry(rt6_ex, &bucket->chain, hlist) {
5873			if (w->skip) {
5874				w->skip--;
5875				continue;
5876			}
5877
5878			/* Expiration of entries doesn't bump sernum, insertion
5879			 * does. Removal is triggered by insertion, so we can
5880			 * rely on the fact that if entries change between two
5881			 * partial dumps, this node is scanned again completely,
5882			 * see rt6_insert_exception() and fib6_dump_table().
5883			 *
5884			 * Count expired entries we go through as handled
5885			 * entries that we'll skip next time, in case of partial
5886			 * node dump. Otherwise, if entries expire meanwhile,
5887			 * we'll skip the wrong amount.
5888			 */
5889			if (rt6_check_expired(rt6_ex->rt6i)) {
5890				w->count++;
5891				continue;
5892			}
5893
5894			err = rt6_fill_node(dump->net, dump->skb, w->rt,
5895					    &rt6_ex->rt6i->dst, NULL, NULL, 0,
5896					    RTM_NEWROUTE,
5897					    NETLINK_CB(dump->cb->skb).portid,
5898					    dump->cb->nlh->nlmsg_seq, w->flags);
5899			if (err)
5900				return err;
5901
5902			w->count++;
5903		}
5904		bucket++;
5905	}
5906
5907	return 0;
5908}
5909
5910/* Return -1 if done with node, number of handled routes on partial dump */
5911int rt6_dump_route(struct fib6_info *rt, void *p_arg, unsigned int skip)
5912{
5913	struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg;
5914	struct fib_dump_filter *filter = &arg->filter;
5915	unsigned int flags = NLM_F_MULTI;
5916	struct net *net = arg->net;
5917	int count = 0;
5918
5919	if (rt == net->ipv6.fib6_null_entry)
5920		return -1;
5921
5922	if ((filter->flags & RTM_F_PREFIX) &&
5923	    !(rt->fib6_flags & RTF_PREFIX_RT)) {
5924		/* success since this is not a prefix route */
5925		return -1;
5926	}
5927	if (filter->filter_set &&
5928	    ((filter->rt_type  && rt->fib6_type != filter->rt_type) ||
5929	     (filter->dev      && !fib6_info_uses_dev(rt, filter->dev)) ||
5930	     (filter->protocol && rt->fib6_protocol != filter->protocol))) {
5931		return -1;
5932	}
5933
5934	if (filter->filter_set ||
5935	    !filter->dump_routes || !filter->dump_exceptions) {
5936		flags |= NLM_F_DUMP_FILTERED;
5937	}
5938
5939	if (filter->dump_routes) {
5940		if (skip) {
5941			skip--;
5942		} else {
5943			if (rt6_fill_node(net, arg->skb, rt, NULL, NULL, NULL,
5944					  0, RTM_NEWROUTE,
5945					  NETLINK_CB(arg->cb->skb).portid,
5946					  arg->cb->nlh->nlmsg_seq, flags)) {
5947				return 0;
5948			}
5949			count++;
5950		}
5951	}
5952
5953	if (filter->dump_exceptions) {
5954		struct fib6_nh_exception_dump_walker w = { .dump = arg,
5955							   .rt = rt,
5956							   .flags = flags,
5957							   .skip = skip,
5958							   .count = 0 };
5959		int err;
5960
5961		rcu_read_lock();
5962		if (rt->nh) {
5963			err = nexthop_for_each_fib6_nh(rt->nh,
5964						       rt6_nh_dump_exceptions,
5965						       &w);
5966		} else {
5967			err = rt6_nh_dump_exceptions(rt->fib6_nh, &w);
5968		}
5969		rcu_read_unlock();
5970
5971		if (err)
5972			return count + w.count;
5973	}
5974
5975	return -1;
5976}
5977
5978static int inet6_rtm_valid_getroute_req(struct sk_buff *skb,
5979					const struct nlmsghdr *nlh,
5980					struct nlattr **tb,
5981					struct netlink_ext_ack *extack)
5982{
5983	struct rtmsg *rtm;
5984	int i, err;
5985
5986	if (nlh->nlmsg_len < nlmsg_msg_size(sizeof(*rtm))) {
5987		NL_SET_ERR_MSG_MOD(extack,
5988				   "Invalid header for get route request");
5989		return -EINVAL;
5990	}
5991
5992	if (!netlink_strict_get_check(skb))
5993		return nlmsg_parse_deprecated(nlh, sizeof(*rtm), tb, RTA_MAX,
5994					      rtm_ipv6_policy, extack);
5995
5996	rtm = nlmsg_data(nlh);
5997	if ((rtm->rtm_src_len && rtm->rtm_src_len != 128) ||
5998	    (rtm->rtm_dst_len && rtm->rtm_dst_len != 128) ||
5999	    rtm->rtm_table || rtm->rtm_protocol || rtm->rtm_scope ||
6000	    rtm->rtm_type) {
6001		NL_SET_ERR_MSG_MOD(extack, "Invalid values in header for get route request");
6002		return -EINVAL;
6003	}
6004	if (rtm->rtm_flags & ~RTM_F_FIB_MATCH) {
6005		NL_SET_ERR_MSG_MOD(extack,
6006				   "Invalid flags for get route request");
6007		return -EINVAL;
6008	}
6009
6010	err = nlmsg_parse_deprecated_strict(nlh, sizeof(*rtm), tb, RTA_MAX,
6011					    rtm_ipv6_policy, extack);
6012	if (err)
6013		return err;
6014
6015	if ((tb[RTA_SRC] && !rtm->rtm_src_len) ||
6016	    (tb[RTA_DST] && !rtm->rtm_dst_len)) {
6017		NL_SET_ERR_MSG_MOD(extack, "rtm_src_len and rtm_dst_len must be 128 for IPv6");
6018		return -EINVAL;
6019	}
6020
6021	for (i = 0; i <= RTA_MAX; i++) {
6022		if (!tb[i])
6023			continue;
6024
6025		switch (i) {
6026		case RTA_SRC:
6027		case RTA_DST:
6028		case RTA_IIF:
6029		case RTA_OIF:
6030		case RTA_MARK:
6031		case RTA_UID:
6032		case RTA_SPORT:
6033		case RTA_DPORT:
6034		case RTA_IP_PROTO:
6035			break;
6036		default:
6037			NL_SET_ERR_MSG_MOD(extack, "Unsupported attribute in get route request");
6038			return -EINVAL;
6039		}
6040	}
6041
6042	return 0;
 
 
 
6043}
6044
6045static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
6046			      struct netlink_ext_ack *extack)
6047{
6048	struct net *net = sock_net(in_skb->sk);
6049	struct nlattr *tb[RTA_MAX+1];
6050	int err, iif = 0, oif = 0;
6051	struct fib6_info *from;
6052	struct dst_entry *dst;
6053	struct rt6_info *rt;
6054	struct sk_buff *skb;
6055	struct rtmsg *rtm;
6056	struct flowi6 fl6 = {};
6057	bool fibmatch;
6058
6059	err = inet6_rtm_valid_getroute_req(in_skb, nlh, tb, extack);
 
6060	if (err < 0)
6061		goto errout;
6062
6063	err = -EINVAL;
 
6064	rtm = nlmsg_data(nlh);
6065	fl6.flowlabel = ip6_make_flowinfo(rtm->rtm_tos, 0);
6066	fibmatch = !!(rtm->rtm_flags & RTM_F_FIB_MATCH);
6067
6068	if (tb[RTA_SRC]) {
6069		if (nla_len(tb[RTA_SRC]) < sizeof(struct in6_addr))
6070			goto errout;
6071
6072		fl6.saddr = *(struct in6_addr *)nla_data(tb[RTA_SRC]);
6073	}
6074
6075	if (tb[RTA_DST]) {
6076		if (nla_len(tb[RTA_DST]) < sizeof(struct in6_addr))
6077			goto errout;
6078
6079		fl6.daddr = *(struct in6_addr *)nla_data(tb[RTA_DST]);
6080	}
6081
6082	if (tb[RTA_IIF])
6083		iif = nla_get_u32(tb[RTA_IIF]);
6084
6085	if (tb[RTA_OIF])
6086		oif = nla_get_u32(tb[RTA_OIF]);
6087
6088	if (tb[RTA_MARK])
6089		fl6.flowi6_mark = nla_get_u32(tb[RTA_MARK]);
6090
6091	if (tb[RTA_UID])
6092		fl6.flowi6_uid = make_kuid(current_user_ns(),
6093					   nla_get_u32(tb[RTA_UID]));
6094	else
6095		fl6.flowi6_uid = iif ? INVALID_UID : current_uid();
6096
6097	if (tb[RTA_SPORT])
6098		fl6.fl6_sport = nla_get_be16(tb[RTA_SPORT]);
6099
6100	if (tb[RTA_DPORT])
6101		fl6.fl6_dport = nla_get_be16(tb[RTA_DPORT]);
6102
6103	if (tb[RTA_IP_PROTO]) {
6104		err = rtm_getroute_parse_ip_proto(tb[RTA_IP_PROTO],
6105						  &fl6.flowi6_proto, AF_INET6,
6106						  extack);
6107		if (err)
6108			goto errout;
6109	}
6110
6111	if (iif) {
6112		struct net_device *dev;
6113		int flags = 0;
6114
6115		rcu_read_lock();
6116
6117		dev = dev_get_by_index_rcu(net, iif);
6118		if (!dev) {
6119			rcu_read_unlock();
6120			err = -ENODEV;
6121			goto errout;
6122		}
6123
6124		fl6.flowi6_iif = iif;
6125
6126		if (!ipv6_addr_any(&fl6.saddr))
6127			flags |= RT6_LOOKUP_F_HAS_SADDR;
6128
6129		dst = ip6_route_input_lookup(net, dev, &fl6, NULL, flags);
6130
6131		rcu_read_unlock();
6132	} else {
6133		fl6.flowi6_oif = oif;
6134
6135		dst = ip6_route_output(net, NULL, &fl6);
6136	}
6137
6138
6139	rt = dst_rt6_info(dst);
6140	if (rt->dst.error) {
6141		err = rt->dst.error;
6142		ip6_rt_put(rt);
6143		goto errout;
6144	}
6145
6146	if (rt == net->ipv6.ip6_null_entry) {
6147		err = rt->dst.error;
6148		ip6_rt_put(rt);
6149		goto errout;
6150	}
6151
 
 
 
 
 
 
 
 
6152	skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
6153	if (!skb) {
6154		ip6_rt_put(rt);
6155		err = -ENOBUFS;
6156		goto errout;
6157	}
6158
6159	skb_dst_set(skb, &rt->dst);
6160
6161	rcu_read_lock();
6162	from = rcu_dereference(rt->from);
6163	if (from) {
6164		if (fibmatch)
6165			err = rt6_fill_node(net, skb, from, NULL, NULL, NULL,
6166					    iif, RTM_NEWROUTE,
6167					    NETLINK_CB(in_skb).portid,
6168					    nlh->nlmsg_seq, 0);
6169		else
6170			err = rt6_fill_node(net, skb, from, dst, &fl6.daddr,
6171					    &fl6.saddr, iif, RTM_NEWROUTE,
6172					    NETLINK_CB(in_skb).portid,
6173					    nlh->nlmsg_seq, 0);
6174	} else {
6175		err = -ENETUNREACH;
6176	}
6177	rcu_read_unlock();
6178
6179	if (err < 0) {
6180		kfree_skb(skb);
6181		goto errout;
6182	}
6183
6184	err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
6185errout:
6186	return err;
6187}
6188
6189void inet6_rt_notify(int event, struct fib6_info *rt, struct nl_info *info,
6190		     unsigned int nlm_flags)
6191{
6192	struct sk_buff *skb;
6193	struct net *net = info->nl_net;
6194	u32 seq;
6195	int err;
6196
6197	err = -ENOBUFS;
6198	seq = info->nlh ? info->nlh->nlmsg_seq : 0;
6199
6200	skb = nlmsg_new(rt6_nlmsg_size(rt), GFP_ATOMIC);
6201	if (!skb)
6202		goto errout;
6203
6204	err = rt6_fill_node(net, skb, rt, NULL, NULL, NULL, 0,
6205			    event, info->portid, seq, nlm_flags);
6206	if (err < 0) {
6207		/* -EMSGSIZE implies BUG in rt6_nlmsg_size() */
6208		WARN_ON(err == -EMSGSIZE);
6209		kfree_skb(skb);
6210		goto errout;
6211	}
6212	rtnl_notify(skb, net, info->portid, RTNLGRP_IPV6_ROUTE,
6213		    info->nlh, GFP_ATOMIC);
6214	return;
6215errout:
6216	rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err);
6217}
6218
6219void fib6_rt_update(struct net *net, struct fib6_info *rt,
6220		    struct nl_info *info)
6221{
6222	u32 seq = info->nlh ? info->nlh->nlmsg_seq : 0;
6223	struct sk_buff *skb;
6224	int err = -ENOBUFS;
6225
6226	skb = nlmsg_new(rt6_nlmsg_size(rt), gfp_any());
6227	if (!skb)
6228		goto errout;
6229
6230	err = rt6_fill_node(net, skb, rt, NULL, NULL, NULL, 0,
6231			    RTM_NEWROUTE, info->portid, seq, NLM_F_REPLACE);
6232	if (err < 0) {
6233		/* -EMSGSIZE implies BUG in rt6_nlmsg_size() */
6234		WARN_ON(err == -EMSGSIZE);
6235		kfree_skb(skb);
6236		goto errout;
6237	}
6238	rtnl_notify(skb, net, info->portid, RTNLGRP_IPV6_ROUTE,
6239		    info->nlh, gfp_any());
6240	return;
6241errout:
6242	rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err);
6243}
6244
6245void fib6_info_hw_flags_set(struct net *net, struct fib6_info *f6i,
6246			    bool offload, bool trap, bool offload_failed)
6247{
6248	struct sk_buff *skb;
6249	int err;
6250
6251	if (READ_ONCE(f6i->offload) == offload &&
6252	    READ_ONCE(f6i->trap) == trap &&
6253	    READ_ONCE(f6i->offload_failed) == offload_failed)
6254		return;
6255
6256	WRITE_ONCE(f6i->offload, offload);
6257	WRITE_ONCE(f6i->trap, trap);
6258
6259	/* 2 means send notifications only if offload_failed was changed. */
6260	if (net->ipv6.sysctl.fib_notify_on_flag_change == 2 &&
6261	    READ_ONCE(f6i->offload_failed) == offload_failed)
6262		return;
6263
6264	WRITE_ONCE(f6i->offload_failed, offload_failed);
6265
6266	if (!rcu_access_pointer(f6i->fib6_node))
6267		/* The route was removed from the tree, do not send
6268		 * notification.
6269		 */
6270		return;
6271
6272	if (!net->ipv6.sysctl.fib_notify_on_flag_change)
6273		return;
6274
6275	skb = nlmsg_new(rt6_nlmsg_size(f6i), GFP_KERNEL);
6276	if (!skb) {
6277		err = -ENOBUFS;
6278		goto errout;
6279	}
6280
6281	err = rt6_fill_node(net, skb, f6i, NULL, NULL, NULL, 0, RTM_NEWROUTE, 0,
6282			    0, 0);
6283	if (err < 0) {
6284		/* -EMSGSIZE implies BUG in rt6_nlmsg_size() */
6285		WARN_ON(err == -EMSGSIZE);
6286		kfree_skb(skb);
6287		goto errout;
6288	}
6289
6290	rtnl_notify(skb, net, 0, RTNLGRP_IPV6_ROUTE, NULL, GFP_KERNEL);
6291	return;
6292
6293errout:
6294	rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err);
6295}
6296EXPORT_SYMBOL(fib6_info_hw_flags_set);
6297
6298static int ip6_route_dev_notify(struct notifier_block *this,
6299				unsigned long event, void *ptr)
6300{
6301	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
6302	struct net *net = dev_net(dev);
6303
6304	if (!(dev->flags & IFF_LOOPBACK))
6305		return NOTIFY_OK;
6306
6307	if (event == NETDEV_REGISTER) {
6308		net->ipv6.fib6_null_entry->fib6_nh->fib_nh_dev = dev;
6309		net->ipv6.ip6_null_entry->dst.dev = dev;
6310		net->ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(dev);
6311#ifdef CONFIG_IPV6_MULTIPLE_TABLES
6312		net->ipv6.ip6_prohibit_entry->dst.dev = dev;
6313		net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
6314		net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
6315		net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
6316#endif
6317	 } else if (event == NETDEV_UNREGISTER &&
6318		    dev->reg_state != NETREG_UNREGISTERED) {
6319		/* NETDEV_UNREGISTER could be fired for multiple times by
6320		 * netdev_wait_allrefs(). Make sure we only call this once.
6321		 */
6322		in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev);
6323#ifdef CONFIG_IPV6_MULTIPLE_TABLES
6324		in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev);
6325		in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev);
6326#endif
6327	}
6328
6329	return NOTIFY_OK;
6330}
6331
6332/*
6333 *	/proc
6334 */
6335
6336#ifdef CONFIG_PROC_FS
 
 
 
 
 
 
 
 
6337static int rt6_stats_seq_show(struct seq_file *seq, void *v)
6338{
6339	struct net *net = (struct net *)seq->private;
6340	seq_printf(seq, "%04x %04x %04x %04x %04x %04x %04x\n",
6341		   net->ipv6.rt6_stats->fib_nodes,
6342		   net->ipv6.rt6_stats->fib_route_nodes,
6343		   atomic_read(&net->ipv6.rt6_stats->fib_rt_alloc),
6344		   net->ipv6.rt6_stats->fib_rt_entries,
6345		   net->ipv6.rt6_stats->fib_rt_cache,
6346		   dst_entries_get_slow(&net->ipv6.ip6_dst_ops),
6347		   net->ipv6.rt6_stats->fib_discarded_routes);
6348
6349	return 0;
6350}
 
 
 
 
 
 
 
 
 
 
 
 
6351#endif	/* CONFIG_PROC_FS */
6352
6353#ifdef CONFIG_SYSCTL
6354
6355static int ipv6_sysctl_rtcache_flush(const struct ctl_table *ctl, int write,
6356			      void *buffer, size_t *lenp, loff_t *ppos)
 
6357{
6358	struct net *net;
6359	int delay;
6360	int ret;
6361	if (!write)
6362		return -EINVAL;
6363
6364	ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
6365	if (ret)
6366		return ret;
6367
6368	net = (struct net *)ctl->extra1;
6369	delay = net->ipv6.sysctl.flush_delay;
 
6370	fib6_run_gc(delay <= 0 ? 0 : (unsigned long)delay, net, delay > 0);
6371	return 0;
6372}
6373
6374static struct ctl_table ipv6_route_table_template[] = {
6375	{
6376		.procname	=	"max_size",
6377		.data		=	&init_net.ipv6.sysctl.ip6_rt_max_size,
6378		.maxlen		=	sizeof(int),
6379		.mode		=	0644,
6380		.proc_handler	=	proc_dointvec,
6381	},
6382	{
6383		.procname	=	"gc_thresh",
6384		.data		=	&ip6_dst_ops_template.gc_thresh,
6385		.maxlen		=	sizeof(int),
6386		.mode		=	0644,
6387		.proc_handler	=	proc_dointvec,
6388	},
6389	{
6390		.procname	=	"flush",
6391		.data		=	&init_net.ipv6.sysctl.flush_delay,
6392		.maxlen		=	sizeof(int),
6393		.mode		=	0200,
6394		.proc_handler	=	ipv6_sysctl_rtcache_flush
6395	},
6396	{
6397		.procname	=	"gc_min_interval",
6398		.data		=	&init_net.ipv6.sysctl.ip6_rt_gc_min_interval,
6399		.maxlen		=	sizeof(int),
6400		.mode		=	0644,
6401		.proc_handler	=	proc_dointvec_jiffies,
6402	},
6403	{
6404		.procname	=	"gc_timeout",
6405		.data		=	&init_net.ipv6.sysctl.ip6_rt_gc_timeout,
6406		.maxlen		=	sizeof(int),
6407		.mode		=	0644,
6408		.proc_handler	=	proc_dointvec_jiffies,
6409	},
6410	{
6411		.procname	=	"gc_interval",
6412		.data		=	&init_net.ipv6.sysctl.ip6_rt_gc_interval,
6413		.maxlen		=	sizeof(int),
6414		.mode		=	0644,
6415		.proc_handler	=	proc_dointvec_jiffies,
6416	},
6417	{
6418		.procname	=	"gc_elasticity",
6419		.data		=	&init_net.ipv6.sysctl.ip6_rt_gc_elasticity,
6420		.maxlen		=	sizeof(int),
6421		.mode		=	0644,
6422		.proc_handler	=	proc_dointvec,
6423	},
6424	{
6425		.procname	=	"mtu_expires",
6426		.data		=	&init_net.ipv6.sysctl.ip6_rt_mtu_expires,
6427		.maxlen		=	sizeof(int),
6428		.mode		=	0644,
6429		.proc_handler	=	proc_dointvec_jiffies,
6430	},
6431	{
6432		.procname	=	"min_adv_mss",
6433		.data		=	&init_net.ipv6.sysctl.ip6_rt_min_advmss,
6434		.maxlen		=	sizeof(int),
6435		.mode		=	0644,
6436		.proc_handler	=	proc_dointvec,
6437	},
6438	{
6439		.procname	=	"gc_min_interval_ms",
6440		.data		=	&init_net.ipv6.sysctl.ip6_rt_gc_min_interval,
6441		.maxlen		=	sizeof(int),
6442		.mode		=	0644,
6443		.proc_handler	=	proc_dointvec_ms_jiffies,
6444	},
6445	{
6446		.procname	=	"skip_notify_on_dev_down",
6447		.data		=	&init_net.ipv6.sysctl.skip_notify_on_dev_down,
6448		.maxlen		=	sizeof(u8),
6449		.mode		=	0644,
6450		.proc_handler	=	proc_dou8vec_minmax,
6451		.extra1		=	SYSCTL_ZERO,
6452		.extra2		=	SYSCTL_ONE,
6453	},
6454};
6455
6456struct ctl_table * __net_init ipv6_route_sysctl_init(struct net *net)
6457{
6458	struct ctl_table *table;
6459
6460	table = kmemdup(ipv6_route_table_template,
6461			sizeof(ipv6_route_table_template),
6462			GFP_KERNEL);
6463
6464	if (table) {
6465		table[0].data = &net->ipv6.sysctl.ip6_rt_max_size;
 
6466		table[1].data = &net->ipv6.ip6_dst_ops.gc_thresh;
6467		table[2].data = &net->ipv6.sysctl.flush_delay;
6468		table[2].extra1 = net;
6469		table[3].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
6470		table[4].data = &net->ipv6.sysctl.ip6_rt_gc_timeout;
6471		table[5].data = &net->ipv6.sysctl.ip6_rt_gc_interval;
6472		table[6].data = &net->ipv6.sysctl.ip6_rt_gc_elasticity;
6473		table[7].data = &net->ipv6.sysctl.ip6_rt_mtu_expires;
6474		table[8].data = &net->ipv6.sysctl.ip6_rt_min_advmss;
6475		table[9].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
6476		table[10].data = &net->ipv6.sysctl.skip_notify_on_dev_down;
 
 
 
6477	}
6478
6479	return table;
6480}
6481
6482size_t ipv6_route_sysctl_table_size(struct net *net)
6483{
6484	/* Don't export sysctls to unprivileged users */
6485	if (net->user_ns != &init_user_ns)
6486		return 1;
6487
6488	return ARRAY_SIZE(ipv6_route_table_template);
6489}
6490#endif
6491
6492static int __net_init ip6_route_net_init(struct net *net)
6493{
6494	int ret = -ENOMEM;
6495
6496	memcpy(&net->ipv6.ip6_dst_ops, &ip6_dst_ops_template,
6497	       sizeof(net->ipv6.ip6_dst_ops));
6498
6499	if (dst_entries_init(&net->ipv6.ip6_dst_ops) < 0)
6500		goto out_ip6_dst_ops;
6501
6502	net->ipv6.fib6_null_entry = fib6_info_alloc(GFP_KERNEL, true);
6503	if (!net->ipv6.fib6_null_entry)
6504		goto out_ip6_dst_entries;
6505	memcpy(net->ipv6.fib6_null_entry, &fib6_null_entry_template,
6506	       sizeof(*net->ipv6.fib6_null_entry));
6507
6508	net->ipv6.ip6_null_entry = kmemdup(&ip6_null_entry_template,
6509					   sizeof(*net->ipv6.ip6_null_entry),
6510					   GFP_KERNEL);
6511	if (!net->ipv6.ip6_null_entry)
6512		goto out_fib6_null_entry;
6513	net->ipv6.ip6_null_entry->dst.ops = &net->ipv6.ip6_dst_ops;
6514	dst_init_metrics(&net->ipv6.ip6_null_entry->dst,
6515			 ip6_template_metrics, true);
6516	INIT_LIST_HEAD(&net->ipv6.ip6_null_entry->dst.rt_uncached);
6517
6518#ifdef CONFIG_IPV6_MULTIPLE_TABLES
6519	net->ipv6.fib6_has_custom_rules = false;
6520	net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
6521					       sizeof(*net->ipv6.ip6_prohibit_entry),
6522					       GFP_KERNEL);
6523	if (!net->ipv6.ip6_prohibit_entry)
6524		goto out_ip6_null_entry;
6525	net->ipv6.ip6_prohibit_entry->dst.ops = &net->ipv6.ip6_dst_ops;
6526	dst_init_metrics(&net->ipv6.ip6_prohibit_entry->dst,
6527			 ip6_template_metrics, true);
6528	INIT_LIST_HEAD(&net->ipv6.ip6_prohibit_entry->dst.rt_uncached);
6529
6530	net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template,
6531					       sizeof(*net->ipv6.ip6_blk_hole_entry),
6532					       GFP_KERNEL);
6533	if (!net->ipv6.ip6_blk_hole_entry)
6534		goto out_ip6_prohibit_entry;
6535	net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
6536	dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
6537			 ip6_template_metrics, true);
6538	INIT_LIST_HEAD(&net->ipv6.ip6_blk_hole_entry->dst.rt_uncached);
6539#ifdef CONFIG_IPV6_SUBTREES
6540	net->ipv6.fib6_routes_require_src = 0;
6541#endif
6542#endif
6543
6544	net->ipv6.sysctl.flush_delay = 0;
6545	net->ipv6.sysctl.ip6_rt_max_size = INT_MAX;
6546	net->ipv6.sysctl.ip6_rt_gc_min_interval = HZ / 2;
6547	net->ipv6.sysctl.ip6_rt_gc_timeout = 60*HZ;
6548	net->ipv6.sysctl.ip6_rt_gc_interval = 30*HZ;
6549	net->ipv6.sysctl.ip6_rt_gc_elasticity = 9;
6550	net->ipv6.sysctl.ip6_rt_mtu_expires = 10*60*HZ;
6551	net->ipv6.sysctl.ip6_rt_min_advmss = IPV6_MIN_MTU - 20 - 40;
6552	net->ipv6.sysctl.skip_notify_on_dev_down = 0;
6553
6554	atomic_set(&net->ipv6.ip6_rt_gc_expire, 30*HZ);
6555
6556	ret = 0;
6557out:
6558	return ret;
6559
6560#ifdef CONFIG_IPV6_MULTIPLE_TABLES
6561out_ip6_prohibit_entry:
6562	kfree(net->ipv6.ip6_prohibit_entry);
6563out_ip6_null_entry:
6564	kfree(net->ipv6.ip6_null_entry);
6565#endif
6566out_fib6_null_entry:
6567	kfree(net->ipv6.fib6_null_entry);
6568out_ip6_dst_entries:
6569	dst_entries_destroy(&net->ipv6.ip6_dst_ops);
6570out_ip6_dst_ops:
6571	goto out;
6572}
6573
6574static void __net_exit ip6_route_net_exit(struct net *net)
6575{
6576	kfree(net->ipv6.fib6_null_entry);
6577	kfree(net->ipv6.ip6_null_entry);
6578#ifdef CONFIG_IPV6_MULTIPLE_TABLES
6579	kfree(net->ipv6.ip6_prohibit_entry);
6580	kfree(net->ipv6.ip6_blk_hole_entry);
6581#endif
6582	dst_entries_destroy(&net->ipv6.ip6_dst_ops);
6583}
6584
6585static int __net_init ip6_route_net_init_late(struct net *net)
6586{
6587#ifdef CONFIG_PROC_FS
6588	if (!proc_create_net("ipv6_route", 0, net->proc_net,
6589			     &ipv6_route_seq_ops,
6590			     sizeof(struct ipv6_route_iter)))
6591		return -ENOMEM;
6592
6593	if (!proc_create_net_single("rt6_stats", 0444, net->proc_net,
6594				    rt6_stats_seq_show, NULL)) {
6595		remove_proc_entry("ipv6_route", net->proc_net);
6596		return -ENOMEM;
6597	}
6598#endif
6599	return 0;
6600}
6601
6602static void __net_exit ip6_route_net_exit_late(struct net *net)
6603{
6604#ifdef CONFIG_PROC_FS
6605	remove_proc_entry("ipv6_route", net->proc_net);
6606	remove_proc_entry("rt6_stats", net->proc_net);
6607#endif
6608}
6609
6610static struct pernet_operations ip6_route_net_ops = {
6611	.init = ip6_route_net_init,
6612	.exit = ip6_route_net_exit,
6613};
6614
6615static int __net_init ipv6_inetpeer_init(struct net *net)
6616{
6617	struct inet_peer_base *bp = kmalloc(sizeof(*bp), GFP_KERNEL);
6618
6619	if (!bp)
6620		return -ENOMEM;
6621	inet_peer_base_init(bp);
6622	net->ipv6.peers = bp;
6623	return 0;
6624}
6625
6626static void __net_exit ipv6_inetpeer_exit(struct net *net)
6627{
6628	struct inet_peer_base *bp = net->ipv6.peers;
6629
6630	net->ipv6.peers = NULL;
6631	inetpeer_invalidate_tree(bp);
6632	kfree(bp);
6633}
6634
6635static struct pernet_operations ipv6_inetpeer_ops = {
6636	.init	=	ipv6_inetpeer_init,
6637	.exit	=	ipv6_inetpeer_exit,
6638};
6639
6640static struct pernet_operations ip6_route_net_late_ops = {
6641	.init = ip6_route_net_init_late,
6642	.exit = ip6_route_net_exit_late,
6643};
6644
6645static struct notifier_block ip6_route_dev_notifier = {
6646	.notifier_call = ip6_route_dev_notify,
6647	.priority = ADDRCONF_NOTIFY_PRIORITY - 10,
6648};
6649
6650void __init ip6_route_init_special_entries(void)
6651{
6652	/* Registering of the loopback is done before this portion of code,
6653	 * the loopback reference in rt6_info will not be taken, do it
6654	 * manually for init_net */
6655	init_net.ipv6.fib6_null_entry->fib6_nh->fib_nh_dev = init_net.loopback_dev;
6656	init_net.ipv6.ip6_null_entry->dst.dev = init_net.loopback_dev;
6657	init_net.ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
6658  #ifdef CONFIG_IPV6_MULTIPLE_TABLES
6659	init_net.ipv6.ip6_prohibit_entry->dst.dev = init_net.loopback_dev;
6660	init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
6661	init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
6662	init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
6663  #endif
6664}
6665
6666#if IS_BUILTIN(CONFIG_IPV6)
6667#if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_PROC_FS)
6668DEFINE_BPF_ITER_FUNC(ipv6_route, struct bpf_iter_meta *meta, struct fib6_info *rt)
6669
6670BTF_ID_LIST(btf_fib6_info_id)
6671BTF_ID(struct, fib6_info)
6672
6673static const struct bpf_iter_seq_info ipv6_route_seq_info = {
6674	.seq_ops		= &ipv6_route_seq_ops,
6675	.init_seq_private	= bpf_iter_init_seq_net,
6676	.fini_seq_private	= bpf_iter_fini_seq_net,
6677	.seq_priv_size		= sizeof(struct ipv6_route_iter),
6678};
6679
6680static struct bpf_iter_reg ipv6_route_reg_info = {
6681	.target			= "ipv6_route",
6682	.ctx_arg_info_size	= 1,
6683	.ctx_arg_info		= {
6684		{ offsetof(struct bpf_iter__ipv6_route, rt),
6685		  PTR_TO_BTF_ID_OR_NULL },
6686	},
6687	.seq_info		= &ipv6_route_seq_info,
6688};
6689
6690static int __init bpf_iter_register(void)
6691{
6692	ipv6_route_reg_info.ctx_arg_info[0].btf_id = *btf_fib6_info_id;
6693	return bpf_iter_reg_target(&ipv6_route_reg_info);
6694}
6695
6696static void bpf_iter_unregister(void)
6697{
6698	bpf_iter_unreg_target(&ipv6_route_reg_info);
6699}
6700#endif
6701#endif
6702
6703static const struct rtnl_msg_handler ip6_route_rtnl_msg_handlers[] __initconst_or_module = {
6704	{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_NEWROUTE,
6705	 .doit = inet6_rtm_newroute},
6706	{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_DELROUTE,
6707	 .doit = inet6_rtm_delroute},
6708	{.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_GETROUTE,
6709	 .doit = inet6_rtm_getroute, .flags = RTNL_FLAG_DOIT_UNLOCKED},
6710};
6711
6712int __init ip6_route_init(void)
6713{
6714	int ret;
6715	int cpu;
6716
6717	ret = -ENOMEM;
6718	ip6_dst_ops_template.kmem_cachep =
6719		kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0,
6720				  SLAB_HWCACHE_ALIGN | SLAB_ACCOUNT, NULL);
6721	if (!ip6_dst_ops_template.kmem_cachep)
6722		goto out;
6723
6724	ret = dst_entries_init(&ip6_dst_blackhole_ops);
6725	if (ret)
6726		goto out_kmem_cache;
6727
6728	ret = register_pernet_subsys(&ipv6_inetpeer_ops);
6729	if (ret)
6730		goto out_dst_entries;
6731
6732	ret = register_pernet_subsys(&ip6_route_net_ops);
6733	if (ret)
6734		goto out_register_inetpeer;
6735
6736	ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops_template.kmem_cachep;
6737
6738	ret = fib6_init();
6739	if (ret)
6740		goto out_register_subsys;
6741
6742	ret = xfrm6_init();
6743	if (ret)
6744		goto out_fib6_init;
6745
6746	ret = fib6_rules_init();
6747	if (ret)
6748		goto xfrm6_init;
6749
6750	ret = register_pernet_subsys(&ip6_route_net_late_ops);
6751	if (ret)
6752		goto fib6_rules_init;
6753
6754	ret = rtnl_register_many(ip6_route_rtnl_msg_handlers);
 
6755	if (ret < 0)
6756		goto out_register_late_subsys;
6757
6758	ret = register_netdevice_notifier(&ip6_route_dev_notifier);
6759	if (ret)
 
 
 
 
 
 
 
6760		goto out_register_late_subsys;
6761
6762#if IS_BUILTIN(CONFIG_IPV6)
6763#if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_PROC_FS)
6764	ret = bpf_iter_register();
6765	if (ret)
6766		goto out_register_late_subsys;
6767#endif
6768#endif
6769
6770	for_each_possible_cpu(cpu) {
6771		struct uncached_list *ul = per_cpu_ptr(&rt6_uncached_list, cpu);
6772
6773		INIT_LIST_HEAD(&ul->head);
6774		spin_lock_init(&ul->lock);
6775	}
6776
6777out:
6778	return ret;
6779
6780out_register_late_subsys:
6781	rtnl_unregister_all(PF_INET6);
6782	unregister_pernet_subsys(&ip6_route_net_late_ops);
6783fib6_rules_init:
6784	fib6_rules_cleanup();
6785xfrm6_init:
6786	xfrm6_fini();
6787out_fib6_init:
6788	fib6_gc_cleanup();
6789out_register_subsys:
6790	unregister_pernet_subsys(&ip6_route_net_ops);
6791out_register_inetpeer:
6792	unregister_pernet_subsys(&ipv6_inetpeer_ops);
6793out_dst_entries:
6794	dst_entries_destroy(&ip6_dst_blackhole_ops);
6795out_kmem_cache:
6796	kmem_cache_destroy(ip6_dst_ops_template.kmem_cachep);
6797	goto out;
6798}
6799
6800void ip6_route_cleanup(void)
6801{
6802#if IS_BUILTIN(CONFIG_IPV6)
6803#if defined(CONFIG_BPF_SYSCALL) && defined(CONFIG_PROC_FS)
6804	bpf_iter_unregister();
6805#endif
6806#endif
6807	unregister_netdevice_notifier(&ip6_route_dev_notifier);
6808	unregister_pernet_subsys(&ip6_route_net_late_ops);
6809	fib6_rules_cleanup();
6810	xfrm6_fini();
6811	fib6_gc_cleanup();
6812	unregister_pernet_subsys(&ipv6_inetpeer_ops);
6813	unregister_pernet_subsys(&ip6_route_net_ops);
6814	dst_entries_destroy(&ip6_dst_blackhole_ops);
6815	kmem_cache_destroy(ip6_dst_ops_template.kmem_cachep);
6816}
v4.17
 
   1/*
   2 *	Linux INET6 implementation
   3 *	FIB front-end.
   4 *
   5 *	Authors:
   6 *	Pedro Roque		<roque@di.fc.ul.pt>
   7 *
   8 *	This program is free software; you can redistribute it and/or
   9 *      modify it under the terms of the GNU General Public License
  10 *      as published by the Free Software Foundation; either version
  11 *      2 of the License, or (at your option) any later version.
  12 */
  13
  14/*	Changes:
  15 *
  16 *	YOSHIFUJI Hideaki @USAGI
  17 *		reworked default router selection.
  18 *		- respect outgoing interface
  19 *		- select from (probably) reachable routers (i.e.
  20 *		routers in REACHABLE, STALE, DELAY or PROBE states).
  21 *		- always select the same router if it is (probably)
  22 *		reachable.  otherwise, round-robin the list.
  23 *	Ville Nuorvala
  24 *		Fixed routing subtrees.
  25 */
  26
  27#define pr_fmt(fmt) "IPv6: " fmt
  28
  29#include <linux/capability.h>
  30#include <linux/errno.h>
  31#include <linux/export.h>
  32#include <linux/types.h>
  33#include <linux/times.h>
  34#include <linux/socket.h>
  35#include <linux/sockios.h>
  36#include <linux/net.h>
  37#include <linux/route.h>
  38#include <linux/netdevice.h>
  39#include <linux/in6.h>
  40#include <linux/mroute6.h>
  41#include <linux/init.h>
  42#include <linux/if_arp.h>
  43#include <linux/proc_fs.h>
  44#include <linux/seq_file.h>
  45#include <linux/nsproxy.h>
  46#include <linux/slab.h>
  47#include <linux/jhash.h>
 
  48#include <net/net_namespace.h>
  49#include <net/snmp.h>
  50#include <net/ipv6.h>
  51#include <net/ip6_fib.h>
  52#include <net/ip6_route.h>
  53#include <net/ndisc.h>
  54#include <net/addrconf.h>
  55#include <net/tcp.h>
  56#include <linux/rtnetlink.h>
  57#include <net/dst.h>
  58#include <net/dst_metadata.h>
  59#include <net/xfrm.h>
  60#include <net/netevent.h>
  61#include <net/netlink.h>
  62#include <net/nexthop.h>
  63#include <net/lwtunnel.h>
  64#include <net/ip_tunnels.h>
  65#include <net/l3mdev.h>
  66#include <trace/events/fib6.h>
  67
  68#include <linux/uaccess.h>
 
  69
  70#ifdef CONFIG_SYSCTL
  71#include <linux/sysctl.h>
  72#endif
  73
 
 
 
 
 
 
 
  74enum rt6_nud_state {
  75	RT6_NUD_FAIL_HARD = -3,
  76	RT6_NUD_FAIL_PROBE = -2,
  77	RT6_NUD_FAIL_DO_RR = -1,
  78	RT6_NUD_SUCCEED = 1
  79};
  80
  81static void ip6_rt_copy_init(struct rt6_info *rt, struct rt6_info *ort);
  82static struct dst_entry	*ip6_dst_check(struct dst_entry *dst, u32 cookie);
  83static unsigned int	 ip6_default_advmss(const struct dst_entry *dst);
  84static unsigned int	 ip6_mtu(const struct dst_entry *dst);
  85static struct dst_entry *ip6_negative_advice(struct dst_entry *);
 
 
  86static void		ip6_dst_destroy(struct dst_entry *);
  87static void		ip6_dst_ifdown(struct dst_entry *,
  88				       struct net_device *dev, int how);
  89static int		 ip6_dst_gc(struct dst_ops *ops);
  90
  91static int		ip6_pkt_discard(struct sk_buff *skb);
  92static int		ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb);
  93static int		ip6_pkt_prohibit(struct sk_buff *skb);
  94static int		ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb);
  95static void		ip6_link_failure(struct sk_buff *skb);
  96static void		ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
  97					   struct sk_buff *skb, u32 mtu);
 
  98static void		rt6_do_redirect(struct dst_entry *dst, struct sock *sk,
  99					struct sk_buff *skb);
 100static void		rt6_dst_from_metrics_check(struct rt6_info *rt);
 101static int rt6_score_route(struct rt6_info *rt, int oif, int strict);
 102static size_t rt6_nlmsg_size(struct rt6_info *rt);
 103static int rt6_fill_node(struct net *net,
 104			 struct sk_buff *skb, struct rt6_info *rt,
 105			 struct in6_addr *dst, struct in6_addr *src,
 106			 int iif, int type, u32 portid, u32 seq,
 107			 unsigned int flags);
 108static struct rt6_info *rt6_find_cached_rt(struct rt6_info *rt,
 109					   struct in6_addr *daddr,
 110					   struct in6_addr *saddr);
 111
 112#ifdef CONFIG_IPV6_ROUTE_INFO
 113static struct rt6_info *rt6_add_route_info(struct net *net,
 114					   const struct in6_addr *prefix, int prefixlen,
 115					   const struct in6_addr *gwaddr,
 116					   struct net_device *dev,
 117					   unsigned int pref);
 118static struct rt6_info *rt6_get_route_info(struct net *net,
 119					   const struct in6_addr *prefix, int prefixlen,
 120					   const struct in6_addr *gwaddr,
 121					   struct net_device *dev);
 122#endif
 123
 124struct uncached_list {
 125	spinlock_t		lock;
 126	struct list_head	head;
 127};
 128
 129static DEFINE_PER_CPU_ALIGNED(struct uncached_list, rt6_uncached_list);
 130
 131void rt6_uncached_list_add(struct rt6_info *rt)
 132{
 133	struct uncached_list *ul = raw_cpu_ptr(&rt6_uncached_list);
 134
 135	rt->rt6i_uncached_list = ul;
 136
 137	spin_lock_bh(&ul->lock);
 138	list_add_tail(&rt->rt6i_uncached, &ul->head);
 139	spin_unlock_bh(&ul->lock);
 140}
 141
 142void rt6_uncached_list_del(struct rt6_info *rt)
 143{
 144	if (!list_empty(&rt->rt6i_uncached)) {
 145		struct uncached_list *ul = rt->rt6i_uncached_list;
 146		struct net *net = dev_net(rt->dst.dev);
 147
 148		spin_lock_bh(&ul->lock);
 149		list_del(&rt->rt6i_uncached);
 150		atomic_dec(&net->ipv6.rt6_stats->fib_rt_uncache);
 151		spin_unlock_bh(&ul->lock);
 152	}
 153}
 154
 155static void rt6_uncached_list_flush_dev(struct net *net, struct net_device *dev)
 156{
 157	struct net_device *loopback_dev = net->loopback_dev;
 158	int cpu;
 159
 160	if (dev == loopback_dev)
 161		return;
 162
 163	for_each_possible_cpu(cpu) {
 164		struct uncached_list *ul = per_cpu_ptr(&rt6_uncached_list, cpu);
 165		struct rt6_info *rt;
 
 
 
 166
 167		spin_lock_bh(&ul->lock);
 168		list_for_each_entry(rt, &ul->head, rt6i_uncached) {
 169			struct inet6_dev *rt_idev = rt->rt6i_idev;
 170			struct net_device *rt_dev = rt->dst.dev;
 
 171
 172			if (rt_idev->dev == dev) {
 173				rt->rt6i_idev = in6_dev_get(loopback_dev);
 174				in6_dev_put(rt_idev);
 
 175			}
 176
 177			if (rt_dev == dev) {
 178				rt->dst.dev = loopback_dev;
 179				dev_hold(rt->dst.dev);
 180				dev_put(rt_dev);
 
 
 181			}
 
 
 182		}
 183		spin_unlock_bh(&ul->lock);
 184	}
 185}
 186
 187static u32 *rt6_pcpu_cow_metrics(struct rt6_info *rt)
 188{
 189	return dst_metrics_write_ptr(&rt->from->dst);
 190}
 191
 192static u32 *ipv6_cow_metrics(struct dst_entry *dst, unsigned long old)
 193{
 194	struct rt6_info *rt = (struct rt6_info *)dst;
 195
 196	if (rt->rt6i_flags & RTF_PCPU)
 197		return rt6_pcpu_cow_metrics(rt);
 198	else if (rt->rt6i_flags & RTF_CACHE)
 199		return NULL;
 200	else
 201		return dst_cow_metrics_generic(dst, old);
 202}
 203
 204static inline const void *choose_neigh_daddr(struct rt6_info *rt,
 205					     struct sk_buff *skb,
 206					     const void *daddr)
 207{
 208	struct in6_addr *p = &rt->rt6i_gateway;
 209
 210	if (!ipv6_addr_any(p))
 211		return (const void *) p;
 212	else if (skb)
 213		return &ipv6_hdr(skb)->daddr;
 214	return daddr;
 215}
 216
 217static struct neighbour *ip6_neigh_lookup(const struct dst_entry *dst,
 218					  struct sk_buff *skb,
 219					  const void *daddr)
 
 220{
 221	struct rt6_info *rt = (struct rt6_info *) dst;
 222	struct neighbour *n;
 223
 224	daddr = choose_neigh_daddr(rt, skb, daddr);
 225	n = __ipv6_neigh_lookup(dst->dev, daddr);
 226	if (n)
 227		return n;
 228	return neigh_create(&nd_tbl, daddr, dst->dev);
 
 
 
 
 
 
 
 
 
 
 
 
 229}
 230
 231static void ip6_confirm_neigh(const struct dst_entry *dst, const void *daddr)
 232{
 
 233	struct net_device *dev = dst->dev;
 234	struct rt6_info *rt = (struct rt6_info *)dst;
 235
 236	daddr = choose_neigh_daddr(rt, NULL, daddr);
 237	if (!daddr)
 238		return;
 239	if (dev->flags & (IFF_NOARP | IFF_LOOPBACK))
 240		return;
 241	if (ipv6_addr_is_multicast((const struct in6_addr *)daddr))
 242		return;
 243	__ipv6_confirm_neigh(dev, daddr);
 244}
 245
 246static struct dst_ops ip6_dst_ops_template = {
 247	.family			=	AF_INET6,
 248	.gc			=	ip6_dst_gc,
 249	.gc_thresh		=	1024,
 250	.check			=	ip6_dst_check,
 251	.default_advmss		=	ip6_default_advmss,
 252	.mtu			=	ip6_mtu,
 253	.cow_metrics		=	ipv6_cow_metrics,
 254	.destroy		=	ip6_dst_destroy,
 255	.ifdown			=	ip6_dst_ifdown,
 256	.negative_advice	=	ip6_negative_advice,
 257	.link_failure		=	ip6_link_failure,
 258	.update_pmtu		=	ip6_rt_update_pmtu,
 259	.redirect		=	rt6_do_redirect,
 260	.local_out		=	__ip6_local_out,
 261	.neigh_lookup		=	ip6_neigh_lookup,
 262	.confirm_neigh		=	ip6_confirm_neigh,
 263};
 264
 265static unsigned int ip6_blackhole_mtu(const struct dst_entry *dst)
 266{
 267	unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
 268
 269	return mtu ? : dst->dev->mtu;
 270}
 271
 272static void ip6_rt_blackhole_update_pmtu(struct dst_entry *dst, struct sock *sk,
 273					 struct sk_buff *skb, u32 mtu)
 274{
 275}
 276
 277static void ip6_rt_blackhole_redirect(struct dst_entry *dst, struct sock *sk,
 278				      struct sk_buff *skb)
 279{
 280}
 281
 282static struct dst_ops ip6_dst_blackhole_ops = {
 283	.family			=	AF_INET6,
 284	.destroy		=	ip6_dst_destroy,
 285	.check			=	ip6_dst_check,
 286	.mtu			=	ip6_blackhole_mtu,
 287	.default_advmss		=	ip6_default_advmss,
 288	.update_pmtu		=	ip6_rt_blackhole_update_pmtu,
 289	.redirect		=	ip6_rt_blackhole_redirect,
 290	.cow_metrics		=	dst_cow_metrics_generic,
 291	.neigh_lookup		=	ip6_neigh_lookup,
 292};
 293
 294static const u32 ip6_template_metrics[RTAX_MAX] = {
 295	[RTAX_HOPLIMIT - 1] = 0,
 296};
 297
 
 
 
 
 
 
 
 
 
 298static const struct rt6_info ip6_null_entry_template = {
 299	.dst = {
 300		.__refcnt	= ATOMIC_INIT(1),
 301		.__use		= 1,
 302		.obsolete	= DST_OBSOLETE_FORCE_CHK,
 303		.error		= -ENETUNREACH,
 304		.input		= ip6_pkt_discard,
 305		.output		= ip6_pkt_discard_out,
 306	},
 307	.rt6i_flags	= (RTF_REJECT | RTF_NONEXTHOP),
 308	.rt6i_protocol  = RTPROT_KERNEL,
 309	.rt6i_metric	= ~(u32) 0,
 310	.rt6i_ref	= ATOMIC_INIT(1),
 311};
 312
 313#ifdef CONFIG_IPV6_MULTIPLE_TABLES
 314
 315static const struct rt6_info ip6_prohibit_entry_template = {
 316	.dst = {
 317		.__refcnt	= ATOMIC_INIT(1),
 318		.__use		= 1,
 319		.obsolete	= DST_OBSOLETE_FORCE_CHK,
 320		.error		= -EACCES,
 321		.input		= ip6_pkt_prohibit,
 322		.output		= ip6_pkt_prohibit_out,
 323	},
 324	.rt6i_flags	= (RTF_REJECT | RTF_NONEXTHOP),
 325	.rt6i_protocol  = RTPROT_KERNEL,
 326	.rt6i_metric	= ~(u32) 0,
 327	.rt6i_ref	= ATOMIC_INIT(1),
 328};
 329
 330static const struct rt6_info ip6_blk_hole_entry_template = {
 331	.dst = {
 332		.__refcnt	= ATOMIC_INIT(1),
 333		.__use		= 1,
 334		.obsolete	= DST_OBSOLETE_FORCE_CHK,
 335		.error		= -EINVAL,
 336		.input		= dst_discard,
 337		.output		= dst_discard_out,
 338	},
 339	.rt6i_flags	= (RTF_REJECT | RTF_NONEXTHOP),
 340	.rt6i_protocol  = RTPROT_KERNEL,
 341	.rt6i_metric	= ~(u32) 0,
 342	.rt6i_ref	= ATOMIC_INIT(1),
 343};
 344
 345#endif
 346
 347static void rt6_info_init(struct rt6_info *rt)
 348{
 349	struct dst_entry *dst = &rt->dst;
 350
 351	memset(dst + 1, 0, sizeof(*rt) - sizeof(*dst));
 352	INIT_LIST_HEAD(&rt->rt6i_siblings);
 353	INIT_LIST_HEAD(&rt->rt6i_uncached);
 354}
 355
 356/* allocate dst with ip6_dst_ops */
 357static struct rt6_info *__ip6_dst_alloc(struct net *net,
 358					struct net_device *dev,
 359					int flags)
 360{
 361	struct rt6_info *rt = dst_alloc(&net->ipv6.ip6_dst_ops, dev,
 362					1, DST_OBSOLETE_FORCE_CHK, flags);
 363
 364	if (rt) {
 365		rt6_info_init(rt);
 366		atomic_inc(&net->ipv6.rt6_stats->fib_rt_alloc);
 367	}
 368
 369	return rt;
 370}
 371
 372struct rt6_info *ip6_dst_alloc(struct net *net,
 373			       struct net_device *dev,
 374			       int flags)
 375{
 376	struct rt6_info *rt = __ip6_dst_alloc(net, dev, flags);
 377
 378	if (rt) {
 379		rt->rt6i_pcpu = alloc_percpu_gfp(struct rt6_info *, GFP_ATOMIC);
 380		if (!rt->rt6i_pcpu) {
 381			dst_release_immediate(&rt->dst);
 382			return NULL;
 383		}
 384	}
 385
 386	return rt;
 387}
 388EXPORT_SYMBOL(ip6_dst_alloc);
 389
 390static void ip6_dst_destroy(struct dst_entry *dst)
 391{
 392	struct rt6_info *rt = (struct rt6_info *)dst;
 393	struct rt6_exception_bucket *bucket;
 394	struct rt6_info *from = rt->from;
 395	struct inet6_dev *idev;
 396
 397	dst_destroy_metrics_generic(dst);
 398	free_percpu(rt->rt6i_pcpu);
 399	rt6_uncached_list_del(rt);
 400
 401	idev = rt->rt6i_idev;
 402	if (idev) {
 403		rt->rt6i_idev = NULL;
 404		in6_dev_put(idev);
 405	}
 406	bucket = rcu_dereference_protected(rt->rt6i_exception_bucket, 1);
 407	if (bucket) {
 408		rt->rt6i_exception_bucket = NULL;
 409		kfree(bucket);
 410	}
 411
 412	rt->from = NULL;
 413	dst_release(&from->dst);
 414}
 415
 416static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
 417			   int how)
 418{
 419	struct rt6_info *rt = (struct rt6_info *)dst;
 420	struct inet6_dev *idev = rt->rt6i_idev;
 421	struct net_device *loopback_dev =
 422		dev_net(dev)->loopback_dev;
 423
 424	if (idev && idev->dev != loopback_dev) {
 425		struct inet6_dev *loopback_idev = in6_dev_get(loopback_dev);
 426		if (loopback_idev) {
 427			rt->rt6i_idev = loopback_idev;
 
 428			in6_dev_put(idev);
 429		}
 430	}
 
 
 431}
 432
 433static bool __rt6_check_expired(const struct rt6_info *rt)
 434{
 435	if (rt->rt6i_flags & RTF_EXPIRES)
 436		return time_after(jiffies, rt->dst.expires);
 437	else
 438		return false;
 439}
 440
 441static bool rt6_check_expired(const struct rt6_info *rt)
 442{
 
 
 
 
 443	if (rt->rt6i_flags & RTF_EXPIRES) {
 444		if (time_after(jiffies, rt->dst.expires))
 445			return true;
 446	} else if (rt->from) {
 447		return rt->dst.obsolete != DST_OBSOLETE_FORCE_CHK ||
 448			rt6_check_expired(rt->from);
 449	}
 450	return false;
 451}
 452
 453static struct rt6_info *rt6_multipath_select(const struct net *net,
 454					     struct rt6_info *match,
 455					     struct flowi6 *fl6, int oif,
 456					     const struct sk_buff *skb,
 457					     int strict)
 458{
 459	struct rt6_info *sibling, *next_sibling;
 
 
 
 
 
 
 
 
 
 
 460
 461	/* We might have already computed the hash for ICMPv6 errors. In such
 462	 * case it will always be non-zero. Otherwise now is the time to do it.
 463	 */
 464	if (!fl6->mp_hash)
 
 465		fl6->mp_hash = rt6_multipath_hash(net, fl6, skb, NULL);
 466
 467	if (fl6->mp_hash <= atomic_read(&match->rt6i_nh_upper_bound))
 468		return match;
 
 
 
 
 
 469
 470	list_for_each_entry_safe(sibling, next_sibling, &match->rt6i_siblings,
 471				 rt6i_siblings) {
 472		if (fl6->mp_hash > atomic_read(&sibling->rt6i_nh_upper_bound))
 
 
 
 
 473			continue;
 474		if (rt6_score_route(sibling, oif, strict) < 0)
 475			break;
 476		match = sibling;
 477		break;
 478	}
 479
 480	return match;
 
 
 481}
 482
 483/*
 484 *	Route lookup. rcu_read_lock() should be held.
 485 */
 486
 487static inline struct rt6_info *rt6_device_match(struct net *net,
 488						    struct rt6_info *rt,
 489						    const struct in6_addr *saddr,
 490						    int oif,
 491						    int flags)
 492{
 493	struct rt6_info *local = NULL;
 494	struct rt6_info *sprt;
 495
 496	if (!oif && ipv6_addr_any(saddr) && !(rt->rt6i_nh_flags & RTNH_F_DEAD))
 497		return rt;
 498
 499	for (sprt = rt; sprt; sprt = rcu_dereference(sprt->rt6_next)) {
 500		struct net_device *dev = sprt->dst.dev;
 
 
 
 
 
 
 
 501
 502		if (sprt->rt6i_nh_flags & RTNH_F_DEAD)
 503			continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 504
 505		if (oif) {
 506			if (dev->ifindex == oif)
 507				return sprt;
 508			if (dev->flags & IFF_LOOPBACK) {
 509				if (!sprt->rt6i_idev ||
 510				    sprt->rt6i_idev->dev->ifindex != oif) {
 511					if (flags & RT6_LOOKUP_F_IFACE)
 512						continue;
 513					if (local &&
 514					    local->rt6i_idev->dev->ifindex == oif)
 515						continue;
 516				}
 517				local = sprt;
 518			}
 519		} else {
 520			if (ipv6_chk_addr(net, saddr, dev,
 521					  flags & RT6_LOOKUP_F_IFACE))
 522				return sprt;
 523		}
 
 
 
 
 
 
 
 
 
 
 524	}
 525
 526	if (oif) {
 527		if (local)
 528			return local;
 
 
 
 
 529
 530		if (flags & RT6_LOOKUP_F_IFACE)
 531			return net->ipv6.ip6_null_entry;
 
 532	}
 
 
 
 
 
 533
 534	return rt->rt6i_nh_flags & RTNH_F_DEAD ? net->ipv6.ip6_null_entry : rt;
 
 
 
 535}
 536
 537#ifdef CONFIG_IPV6_ROUTER_PREF
 538struct __rt6_probe_work {
 539	struct work_struct work;
 540	struct in6_addr target;
 541	struct net_device *dev;
 
 542};
 543
 544static void rt6_probe_deferred(struct work_struct *w)
 545{
 546	struct in6_addr mcaddr;
 547	struct __rt6_probe_work *work =
 548		container_of(w, struct __rt6_probe_work, work);
 549
 550	addrconf_addr_solict_mult(&work->target, &mcaddr);
 551	ndisc_send_ns(work->dev, &work->target, &mcaddr, NULL, 0);
 552	dev_put(work->dev);
 553	kfree(work);
 554}
 555
 556static void rt6_probe(struct rt6_info *rt)
 557{
 558	struct __rt6_probe_work *work;
 
 
 559	struct neighbour *neigh;
 
 
 
 560	/*
 561	 * Okay, this does not seem to be appropriate
 562	 * for now, however, we need to check if it
 563	 * is really so; aka Router Reachability Probing.
 564	 *
 565	 * Router Reachability Probe MUST be rate-limited
 566	 * to no more than one per minute.
 567	 */
 568	if (!rt || !(rt->rt6i_flags & RTF_GATEWAY))
 569		return;
 570	rcu_read_lock_bh();
 571	neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway);
 
 
 
 
 
 
 
 572	if (neigh) {
 573		if (neigh->nud_state & NUD_VALID)
 574			goto out;
 575
 576		work = NULL;
 577		write_lock(&neigh->lock);
 578		if (!(neigh->nud_state & NUD_VALID) &&
 579		    time_after(jiffies,
 580			       neigh->updated +
 581			       rt->rt6i_idev->cnf.rtr_probe_interval)) {
 582			work = kmalloc(sizeof(*work), GFP_ATOMIC);
 583			if (work)
 584				__neigh_set_probe_once(neigh);
 585		}
 586		write_unlock(&neigh->lock);
 587	} else {
 
 588		work = kmalloc(sizeof(*work), GFP_ATOMIC);
 589	}
 590
 591	if (work) {
 
 
 
 592		INIT_WORK(&work->work, rt6_probe_deferred);
 593		work->target = rt->rt6i_gateway;
 594		dev_hold(rt->dst.dev);
 595		work->dev = rt->dst.dev;
 596		schedule_work(&work->work);
 597	}
 598
 599out:
 600	rcu_read_unlock_bh();
 601}
 602#else
 603static inline void rt6_probe(struct rt6_info *rt)
 604{
 605}
 606#endif
 607
 608/*
 609 * Default Router Selection (RFC 2461 6.3.6)
 610 */
 611static inline int rt6_check_dev(struct rt6_info *rt, int oif)
 612{
 613	struct net_device *dev = rt->dst.dev;
 614	if (!oif || dev->ifindex == oif)
 615		return 2;
 616	if ((dev->flags & IFF_LOOPBACK) &&
 617	    rt->rt6i_idev && rt->rt6i_idev->dev->ifindex == oif)
 618		return 1;
 619	return 0;
 620}
 621
 622static inline enum rt6_nud_state rt6_check_neigh(struct rt6_info *rt)
 623{
 
 624	struct neighbour *neigh;
 625	enum rt6_nud_state ret = RT6_NUD_FAIL_HARD;
 626
 627	if (rt->rt6i_flags & RTF_NONEXTHOP ||
 628	    !(rt->rt6i_flags & RTF_GATEWAY))
 629		return RT6_NUD_SUCCEED;
 
 
 630
 631	rcu_read_lock_bh();
 632	neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway);
 633	if (neigh) {
 634		read_lock(&neigh->lock);
 635		if (neigh->nud_state & NUD_VALID)
 636			ret = RT6_NUD_SUCCEED;
 637#ifdef CONFIG_IPV6_ROUTER_PREF
 638		else if (!(neigh->nud_state & NUD_FAILED))
 639			ret = RT6_NUD_SUCCEED;
 640		else
 641			ret = RT6_NUD_FAIL_PROBE;
 642#endif
 643		read_unlock(&neigh->lock);
 644	} else {
 645		ret = IS_ENABLED(CONFIG_IPV6_ROUTER_PREF) ?
 646		      RT6_NUD_SUCCEED : RT6_NUD_FAIL_DO_RR;
 647	}
 648	rcu_read_unlock_bh();
 649
 650	return ret;
 651}
 652
 653static int rt6_score_route(struct rt6_info *rt, int oif,
 654			   int strict)
 655{
 656	int m;
 
 
 
 657
 658	m = rt6_check_dev(rt, oif);
 659	if (!m && (strict & RT6_LOOKUP_F_IFACE))
 660		return RT6_NUD_FAIL_HARD;
 661#ifdef CONFIG_IPV6_ROUTER_PREF
 662	m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2;
 663#endif
 664	if (strict & RT6_LOOKUP_F_REACHABLE) {
 665		int n = rt6_check_neigh(rt);
 
 666		if (n < 0)
 667			return n;
 668	}
 669	return m;
 670}
 671
 672static struct rt6_info *find_match(struct rt6_info *rt, int oif, int strict,
 673				   int *mpri, struct rt6_info *match,
 674				   bool *do_rr)
 675{
 
 
 676	int m;
 677	bool match_do_rr = false;
 678	struct inet6_dev *idev = rt->rt6i_idev;
 679
 680	if (rt->rt6i_nh_flags & RTNH_F_DEAD)
 681		goto out;
 682
 683	if (idev->cnf.ignore_routes_with_linkdown &&
 684	    rt->rt6i_nh_flags & RTNH_F_LINKDOWN &&
 685	    !(strict & RT6_LOOKUP_F_IGNORE_LINKSTATE))
 686		goto out;
 687
 688	if (rt6_check_expired(rt))
 689		goto out;
 690
 691	m = rt6_score_route(rt, oif, strict);
 692	if (m == RT6_NUD_FAIL_DO_RR) {
 693		match_do_rr = true;
 694		m = 0; /* lowest valid score */
 695	} else if (m == RT6_NUD_FAIL_HARD) {
 696		goto out;
 697	}
 698
 699	if (strict & RT6_LOOKUP_F_REACHABLE)
 700		rt6_probe(rt);
 701
 702	/* note that m can be RT6_NUD_FAIL_PROBE at this point */
 703	if (m > *mpri) {
 704		*do_rr = match_do_rr;
 705		*mpri = m;
 706		match = rt;
 707	}
 708out:
 709	return match;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 710}
 711
 712static struct rt6_info *find_rr_leaf(struct fib6_node *fn,
 713				     struct rt6_info *leaf,
 714				     struct rt6_info *rr_head,
 715				     u32 metric, int oif, int strict,
 716				     bool *do_rr)
 717{
 718	struct rt6_info *rt, *match, *cont;
 719	int mpri = -1;
 
 
 
 
 
 720
 721	match = NULL;
 722	cont = NULL;
 723	for (rt = rr_head; rt; rt = rcu_dereference(rt->rt6_next)) {
 724		if (rt->rt6i_metric != metric) {
 725			cont = rt;
 726			break;
 727		}
 728
 729		match = find_match(rt, oif, strict, &mpri, match, do_rr);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 730	}
 
 731
 732	for (rt = leaf; rt && rt != rr_head;
 733	     rt = rcu_dereference(rt->rt6_next)) {
 734		if (rt->rt6i_metric != metric) {
 735			cont = rt;
 736			break;
 737		}
 
 738
 739		match = find_match(rt, oif, strict, &mpri, match, do_rr);
 740	}
 741
 742	if (match || !cont)
 743		return match;
 744
 745	for (rt = cont; rt; rt = rcu_dereference(rt->rt6_next))
 746		match = find_match(rt, oif, strict, &mpri, match, do_rr);
 747
 748	return match;
 
 749}
 750
 751static struct rt6_info *rt6_select(struct net *net, struct fib6_node *fn,
 752				   int oif, int strict)
 753{
 754	struct rt6_info *leaf = rcu_dereference(fn->leaf);
 755	struct rt6_info *match, *rt0;
 756	bool do_rr = false;
 757	int key_plen;
 758
 759	if (!leaf || leaf == net->ipv6.ip6_null_entry)
 760		return net->ipv6.ip6_null_entry;
 
 
 
 761
 762	rt0 = rcu_dereference(fn->rr_ptr);
 763	if (!rt0)
 764		rt0 = leaf;
 765
 766	/* Double check to make sure fn is not an intermediate node
 767	 * and fn->leaf does not points to its child's leaf
 768	 * (This might happen if all routes under fn are deleted from
 769	 * the tree and fib6_repair_tree() is called on the node.)
 770	 */
 771	key_plen = rt0->rt6i_dst.plen;
 772#ifdef CONFIG_IPV6_SUBTREES
 773	if (rt0->rt6i_src.plen)
 774		key_plen = rt0->rt6i_src.plen;
 775#endif
 776	if (fn->fn_bit != key_plen)
 777		return net->ipv6.ip6_null_entry;
 778
 779	match = find_rr_leaf(fn, leaf, rt0, rt0->rt6i_metric, oif, strict,
 780			     &do_rr);
 781
 
 782	if (do_rr) {
 783		struct rt6_info *next = rcu_dereference(rt0->rt6_next);
 784
 785		/* no entries matched; do round-robin */
 786		if (!next || next->rt6i_metric != rt0->rt6i_metric)
 787			next = leaf;
 788
 789		if (next != rt0) {
 790			spin_lock_bh(&leaf->rt6i_table->tb6_lock);
 791			/* make sure next is not being deleted from the tree */
 792			if (next->rt6i_node)
 793				rcu_assign_pointer(fn->rr_ptr, next);
 794			spin_unlock_bh(&leaf->rt6i_table->tb6_lock);
 795		}
 796	}
 797
 798	return match ? match : net->ipv6.ip6_null_entry;
 
 
 
 
 
 
 799}
 800
 801static bool rt6_is_gw_or_nonexthop(const struct rt6_info *rt)
 802{
 803	return (rt->rt6i_flags & (RTF_NONEXTHOP | RTF_GATEWAY));
 
 804}
 805
 806#ifdef CONFIG_IPV6_ROUTE_INFO
 807int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
 808		  const struct in6_addr *gwaddr)
 809{
 810	struct net *net = dev_net(dev);
 811	struct route_info *rinfo = (struct route_info *) opt;
 812	struct in6_addr prefix_buf, *prefix;
 
 813	unsigned int pref;
 814	unsigned long lifetime;
 815	struct rt6_info *rt;
 816
 817	if (len < sizeof(struct route_info)) {
 818		return -EINVAL;
 819	}
 820
 821	/* Sanity check for prefix_len and length */
 822	if (rinfo->length > 3) {
 823		return -EINVAL;
 824	} else if (rinfo->prefix_len > 128) {
 825		return -EINVAL;
 826	} else if (rinfo->prefix_len > 64) {
 827		if (rinfo->length < 2) {
 828			return -EINVAL;
 829		}
 830	} else if (rinfo->prefix_len > 0) {
 831		if (rinfo->length < 1) {
 832			return -EINVAL;
 833		}
 834	}
 835
 836	pref = rinfo->route_pref;
 837	if (pref == ICMPV6_ROUTER_PREF_INVALID)
 838		return -EINVAL;
 839
 840	lifetime = addrconf_timeout_fixup(ntohl(rinfo->lifetime), HZ);
 841
 842	if (rinfo->length == 3)
 843		prefix = (struct in6_addr *)rinfo->prefix;
 844	else {
 845		/* this function is safe */
 846		ipv6_addr_prefix(&prefix_buf,
 847				 (struct in6_addr *)rinfo->prefix,
 848				 rinfo->prefix_len);
 849		prefix = &prefix_buf;
 850	}
 851
 852	if (rinfo->prefix_len == 0)
 853		rt = rt6_get_dflt_router(gwaddr, dev);
 854	else
 855		rt = rt6_get_route_info(net, prefix, rinfo->prefix_len,
 856					gwaddr, dev);
 857
 858	if (rt && !lifetime) {
 859		ip6_del_rt(rt);
 860		rt = NULL;
 861	}
 862
 863	if (!rt && lifetime)
 864		rt = rt6_add_route_info(net, prefix, rinfo->prefix_len, gwaddr,
 865					dev, pref);
 866	else if (rt)
 867		rt->rt6i_flags = RTF_ROUTEINFO |
 868				 (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
 869
 870	if (rt) {
 871		if (!addrconf_finite_timeout(lifetime))
 872			rt6_clean_expires(rt);
 873		else
 874			rt6_set_expires(rt, jiffies + HZ * lifetime);
 
 
 
 
 
 
 
 
 875
 876		ip6_rt_put(rt);
 877	}
 878	return 0;
 879}
 880#endif
 881
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 882static struct fib6_node* fib6_backtrack(struct fib6_node *fn,
 883					struct in6_addr *saddr)
 884{
 885	struct fib6_node *pn, *sn;
 886	while (1) {
 887		if (fn->fn_flags & RTN_TL_ROOT)
 888			return NULL;
 889		pn = rcu_dereference(fn->parent);
 890		sn = FIB6_SUBTREE(pn);
 891		if (sn && sn != fn)
 892			fn = fib6_lookup(sn, NULL, saddr);
 893		else
 894			fn = pn;
 895		if (fn->fn_flags & RTN_RTINFO)
 896			return fn;
 897	}
 898}
 899
 900static bool ip6_hold_safe(struct net *net, struct rt6_info **prt,
 901			  bool null_fallback)
 902{
 903	struct rt6_info *rt = *prt;
 904
 905	if (dst_hold_safe(&rt->dst))
 906		return true;
 907	if (null_fallback) {
 908		rt = net->ipv6.ip6_null_entry;
 909		dst_hold(&rt->dst);
 910	} else {
 911		rt = NULL;
 912	}
 913	*prt = rt;
 914	return false;
 915}
 916
 917static struct rt6_info *ip6_pol_route_lookup(struct net *net,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 918					     struct fib6_table *table,
 919					     struct flowi6 *fl6,
 920					     const struct sk_buff *skb,
 921					     int flags)
 922{
 923	struct rt6_info *rt, *rt_cache;
 924	struct fib6_node *fn;
 925
 926	if (fl6->flowi6_flags & FLOWI_FLAG_SKIP_NH_OIF)
 927		flags &= ~RT6_LOOKUP_F_IFACE;
 928
 929	rcu_read_lock();
 930	fn = fib6_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
 931restart:
 932	rt = rcu_dereference(fn->leaf);
 933	if (!rt) {
 934		rt = net->ipv6.ip6_null_entry;
 935	} else {
 936		rt = rt6_device_match(net, rt, &fl6->saddr,
 937				      fl6->flowi6_oif, flags);
 938		if (rt->rt6i_nsiblings && fl6->flowi6_oif == 0)
 939			rt = rt6_multipath_select(net, rt, fl6, fl6->flowi6_oif,
 940						  skb, flags);
 941	}
 942	if (rt == net->ipv6.ip6_null_entry) {
 943		fn = fib6_backtrack(fn, &fl6->saddr);
 944		if (fn)
 945			goto restart;
 
 
 
 
 
 
 946	}
 
 
 
 
 947	/* Search through exception table */
 948	rt_cache = rt6_find_cached_rt(rt, &fl6->daddr, &fl6->saddr);
 949	if (rt_cache)
 950		rt = rt_cache;
 
 
 
 
 
 951
 952	if (ip6_hold_safe(net, &rt, true))
 953		dst_use_noref(&rt->dst, jiffies);
 954
 955	rcu_read_unlock();
 956
 957	trace_fib6_table_lookup(net, rt, table, fl6);
 958
 959	return rt;
 960
 961}
 962
 963struct dst_entry *ip6_route_lookup(struct net *net, struct flowi6 *fl6,
 964				   const struct sk_buff *skb, int flags)
 965{
 966	return fib6_rule_lookup(net, fl6, skb, flags, ip6_pol_route_lookup);
 967}
 968EXPORT_SYMBOL_GPL(ip6_route_lookup);
 969
 970struct rt6_info *rt6_lookup(struct net *net, const struct in6_addr *daddr,
 971			    const struct in6_addr *saddr, int oif,
 972			    const struct sk_buff *skb, int strict)
 973{
 974	struct flowi6 fl6 = {
 975		.flowi6_oif = oif,
 976		.daddr = *daddr,
 977	};
 978	struct dst_entry *dst;
 979	int flags = strict ? RT6_LOOKUP_F_IFACE : 0;
 980
 981	if (saddr) {
 982		memcpy(&fl6.saddr, saddr, sizeof(*saddr));
 983		flags |= RT6_LOOKUP_F_HAS_SADDR;
 984	}
 985
 986	dst = fib6_rule_lookup(net, &fl6, skb, flags, ip6_pol_route_lookup);
 987	if (dst->error == 0)
 988		return (struct rt6_info *) dst;
 989
 990	dst_release(dst);
 991
 992	return NULL;
 993}
 994EXPORT_SYMBOL(rt6_lookup);
 995
 996/* ip6_ins_rt is called with FREE table->tb6_lock.
 997 * It takes new route entry, the addition fails by any reason the
 998 * route is released.
 999 * Caller must hold dst before calling it.
1000 */
1001
1002static int __ip6_ins_rt(struct rt6_info *rt, struct nl_info *info,
1003			struct mx6_config *mxc,
1004			struct netlink_ext_ack *extack)
1005{
1006	int err;
1007	struct fib6_table *table;
1008
1009	table = rt->rt6i_table;
1010	spin_lock_bh(&table->tb6_lock);
1011	err = fib6_add(&table->tb6_root, rt, info, mxc, extack);
1012	spin_unlock_bh(&table->tb6_lock);
1013
1014	return err;
1015}
1016
1017int ip6_ins_rt(struct rt6_info *rt)
1018{
1019	struct nl_info info = {	.nl_net = dev_net(rt->dst.dev), };
1020	struct mx6_config mxc = { .mx = NULL, };
1021
1022	/* Hold dst to account for the reference from the fib6 tree */
1023	dst_hold(&rt->dst);
1024	return __ip6_ins_rt(rt, &info, &mxc, NULL);
1025}
1026
1027/* called with rcu_lock held */
1028static struct net_device *ip6_rt_get_dev_rcu(struct rt6_info *rt)
1029{
1030	struct net_device *dev = rt->dst.dev;
1031
1032	if (rt->rt6i_flags & (RTF_LOCAL | RTF_ANYCAST)) {
1033		/* for copies of local routes, dst->dev needs to be the
1034		 * device if it is a master device, the master device if
1035		 * device is enslaved, and the loopback as the default
1036		 */
1037		if (netif_is_l3_slave(dev) &&
1038		    !rt6_need_strict(&rt->rt6i_dst.addr))
1039			dev = l3mdev_master_dev_rcu(dev);
1040		else if (!netif_is_l3_master(dev))
1041			dev = dev_net(dev)->loopback_dev;
1042		/* last case is netif_is_l3_master(dev) is true in which
1043		 * case we want dev returned to be dev
1044		 */
1045	}
1046
1047	return dev;
1048}
1049
1050static struct rt6_info *ip6_rt_cache_alloc(struct rt6_info *ort,
1051					   const struct in6_addr *daddr,
1052					   const struct in6_addr *saddr)
1053{
 
1054	struct net_device *dev;
1055	struct rt6_info *rt;
1056
1057	/*
1058	 *	Clone the route.
1059	 */
1060
1061	if (ort->rt6i_flags & (RTF_CACHE | RTF_PCPU))
1062		ort = ort->from;
1063
1064	rcu_read_lock();
1065	dev = ip6_rt_get_dev_rcu(ort);
1066	rt = __ip6_dst_alloc(dev_net(dev), dev, 0);
1067	rcu_read_unlock();
1068	if (!rt)
1069		return NULL;
 
1070
1071	ip6_rt_copy_init(rt, ort);
1072	rt->rt6i_flags |= RTF_CACHE;
1073	rt->rt6i_metric = 0;
1074	rt->dst.flags |= DST_HOST;
1075	rt->rt6i_dst.addr = *daddr;
1076	rt->rt6i_dst.plen = 128;
1077
1078	if (!rt6_is_gw_or_nonexthop(ort)) {
1079		if (ort->rt6i_dst.plen != 128 &&
1080		    ipv6_addr_equal(&ort->rt6i_dst.addr, daddr))
1081			rt->rt6i_flags |= RTF_ANYCAST;
1082#ifdef CONFIG_IPV6_SUBTREES
1083		if (rt->rt6i_src.plen && saddr) {
1084			rt->rt6i_src.addr = *saddr;
1085			rt->rt6i_src.plen = 128;
1086		}
1087#endif
1088	}
1089
1090	return rt;
1091}
1092
1093static struct rt6_info *ip6_rt_pcpu_alloc(struct rt6_info *rt)
1094{
 
 
1095	struct net_device *dev;
1096	struct rt6_info *pcpu_rt;
1097
 
 
 
1098	rcu_read_lock();
1099	dev = ip6_rt_get_dev_rcu(rt);
1100	pcpu_rt = __ip6_dst_alloc(dev_net(dev), dev, rt->dst.flags);
1101	rcu_read_unlock();
1102	if (!pcpu_rt)
 
1103		return NULL;
1104	ip6_rt_copy_init(pcpu_rt, rt);
1105	pcpu_rt->rt6i_protocol = rt->rt6i_protocol;
1106	pcpu_rt->rt6i_flags |= RTF_PCPU;
 
 
 
 
1107	return pcpu_rt;
1108}
1109
 
 
 
 
 
1110/* It should be called with rcu_read_lock() acquired */
1111static struct rt6_info *rt6_get_pcpu_route(struct rt6_info *rt)
1112{
1113	struct rt6_info *pcpu_rt, **p;
1114
1115	p = this_cpu_ptr(rt->rt6i_pcpu);
1116	pcpu_rt = *p;
1117
1118	if (pcpu_rt && ip6_hold_safe(NULL, &pcpu_rt, false))
1119		rt6_dst_from_metrics_check(pcpu_rt);
 
 
 
 
 
 
 
 
 
 
 
1120
1121	return pcpu_rt;
1122}
1123
1124static struct rt6_info *rt6_make_pcpu_route(struct rt6_info *rt)
 
1125{
1126	struct rt6_info *pcpu_rt, *prev, **p;
1127
1128	pcpu_rt = ip6_rt_pcpu_alloc(rt);
1129	if (!pcpu_rt) {
1130		struct net *net = dev_net(rt->dst.dev);
1131
1132		dst_hold(&net->ipv6.ip6_null_entry->dst);
1133		return net->ipv6.ip6_null_entry;
1134	}
1135
1136	dst_hold(&pcpu_rt->dst);
1137	p = this_cpu_ptr(rt->rt6i_pcpu);
1138	prev = cmpxchg(p, NULL, pcpu_rt);
1139	BUG_ON(prev);
1140
1141	rt6_dst_from_metrics_check(pcpu_rt);
 
 
 
 
 
 
1142	return pcpu_rt;
1143}
1144
1145/* exception hash table implementation
1146 */
1147static DEFINE_SPINLOCK(rt6_exception_lock);
1148
1149/* Remove rt6_ex from hash table and free the memory
1150 * Caller must hold rt6_exception_lock
1151 */
1152static void rt6_remove_exception(struct rt6_exception_bucket *bucket,
1153				 struct rt6_exception *rt6_ex)
1154{
1155	struct net *net;
1156
1157	if (!bucket || !rt6_ex)
1158		return;
1159
1160	net = dev_net(rt6_ex->rt6i->dst.dev);
1161	rt6_ex->rt6i->rt6i_node = NULL;
 
 
 
 
 
 
1162	hlist_del_rcu(&rt6_ex->hlist);
1163	rt6_release(rt6_ex->rt6i);
1164	kfree_rcu(rt6_ex, rcu);
1165	WARN_ON_ONCE(!bucket->depth);
1166	bucket->depth--;
1167	net->ipv6.rt6_stats->fib_rt_cache--;
1168}
1169
1170/* Remove oldest rt6_ex in bucket and free the memory
1171 * Caller must hold rt6_exception_lock
1172 */
1173static void rt6_exception_remove_oldest(struct rt6_exception_bucket *bucket)
1174{
1175	struct rt6_exception *rt6_ex, *oldest = NULL;
1176
1177	if (!bucket)
1178		return;
1179
1180	hlist_for_each_entry(rt6_ex, &bucket->chain, hlist) {
1181		if (!oldest || time_before(rt6_ex->stamp, oldest->stamp))
1182			oldest = rt6_ex;
1183	}
1184	rt6_remove_exception(bucket, oldest);
1185}
1186
1187static u32 rt6_exception_hash(const struct in6_addr *dst,
1188			      const struct in6_addr *src)
1189{
1190	static u32 seed __read_mostly;
1191	u32 val;
 
 
 
 
 
 
1192
1193	net_get_random_once(&seed, sizeof(seed));
1194	val = jhash(dst, sizeof(*dst), seed);
1195
1196#ifdef CONFIG_IPV6_SUBTREES
1197	if (src)
1198		val = jhash(src, sizeof(*src), val);
1199#endif
1200	return hash_32(val, FIB6_EXCEPTION_BUCKET_SIZE_SHIFT);
 
 
1201}
1202
1203/* Helper function to find the cached rt in the hash table
1204 * and update bucket pointer to point to the bucket for this
1205 * (daddr, saddr) pair
1206 * Caller must hold rt6_exception_lock
1207 */
1208static struct rt6_exception *
1209__rt6_find_exception_spinlock(struct rt6_exception_bucket **bucket,
1210			      const struct in6_addr *daddr,
1211			      const struct in6_addr *saddr)
1212{
1213	struct rt6_exception *rt6_ex;
1214	u32 hval;
1215
1216	if (!(*bucket) || !daddr)
1217		return NULL;
1218
1219	hval = rt6_exception_hash(daddr, saddr);
1220	*bucket += hval;
1221
1222	hlist_for_each_entry(rt6_ex, &(*bucket)->chain, hlist) {
1223		struct rt6_info *rt6 = rt6_ex->rt6i;
1224		bool matched = ipv6_addr_equal(daddr, &rt6->rt6i_dst.addr);
1225
1226#ifdef CONFIG_IPV6_SUBTREES
1227		if (matched && saddr)
1228			matched = ipv6_addr_equal(saddr, &rt6->rt6i_src.addr);
1229#endif
1230		if (matched)
1231			return rt6_ex;
1232	}
1233	return NULL;
1234}
1235
1236/* Helper function to find the cached rt in the hash table
1237 * and update bucket pointer to point to the bucket for this
1238 * (daddr, saddr) pair
1239 * Caller must hold rcu_read_lock()
1240 */
1241static struct rt6_exception *
1242__rt6_find_exception_rcu(struct rt6_exception_bucket **bucket,
1243			 const struct in6_addr *daddr,
1244			 const struct in6_addr *saddr)
1245{
1246	struct rt6_exception *rt6_ex;
1247	u32 hval;
1248
1249	WARN_ON_ONCE(!rcu_read_lock_held());
1250
1251	if (!(*bucket) || !daddr)
1252		return NULL;
1253
1254	hval = rt6_exception_hash(daddr, saddr);
1255	*bucket += hval;
1256
1257	hlist_for_each_entry_rcu(rt6_ex, &(*bucket)->chain, hlist) {
1258		struct rt6_info *rt6 = rt6_ex->rt6i;
1259		bool matched = ipv6_addr_equal(daddr, &rt6->rt6i_dst.addr);
1260
1261#ifdef CONFIG_IPV6_SUBTREES
1262		if (matched && saddr)
1263			matched = ipv6_addr_equal(saddr, &rt6->rt6i_src.addr);
1264#endif
1265		if (matched)
1266			return rt6_ex;
1267	}
1268	return NULL;
1269}
1270
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1271static int rt6_insert_exception(struct rt6_info *nrt,
1272				struct rt6_info *ort)
1273{
1274	struct net *net = dev_net(ort->dst.dev);
1275	struct rt6_exception_bucket *bucket;
 
1276	struct in6_addr *src_key = NULL;
1277	struct rt6_exception *rt6_ex;
 
 
1278	int err = 0;
1279
1280	/* ort can't be a cache or pcpu route */
1281	if (ort->rt6i_flags & (RTF_CACHE | RTF_PCPU))
1282		ort = ort->from;
1283	WARN_ON_ONCE(ort->rt6i_flags & (RTF_CACHE | RTF_PCPU));
1284
1285	spin_lock_bh(&rt6_exception_lock);
1286
1287	if (ort->exception_bucket_flushed) {
1288		err = -EINVAL;
1289		goto out;
1290	}
1291
1292	bucket = rcu_dereference_protected(ort->rt6i_exception_bucket,
1293					lockdep_is_held(&rt6_exception_lock));
1294	if (!bucket) {
1295		bucket = kcalloc(FIB6_EXCEPTION_BUCKET_SIZE, sizeof(*bucket),
1296				 GFP_ATOMIC);
1297		if (!bucket) {
1298			err = -ENOMEM;
1299			goto out;
1300		}
1301		rcu_assign_pointer(ort->rt6i_exception_bucket, bucket);
 
 
 
1302	}
1303
1304#ifdef CONFIG_IPV6_SUBTREES
1305	/* rt6i_src.plen != 0 indicates ort is in subtree
1306	 * and exception table is indexed by a hash of
1307	 * both rt6i_dst and rt6i_src.
1308	 * Otherwise, the exception table is indexed by
1309	 * a hash of only rt6i_dst.
1310	 */
1311	if (ort->rt6i_src.plen)
1312		src_key = &nrt->rt6i_src.addr;
1313#endif
1314
1315	/* Update rt6i_prefsrc as it could be changed
1316	 * in rt6_remove_prefsrc()
1317	 */
1318	nrt->rt6i_prefsrc = ort->rt6i_prefsrc;
1319	/* rt6_mtu_change() might lower mtu on ort.
1320	 * Only insert this exception route if its mtu
1321	 * is less than ort's mtu value.
1322	 */
1323	if (nrt->rt6i_pmtu >= dst_mtu(&ort->dst)) {
1324		err = -EINVAL;
1325		goto out;
1326	}
1327
1328	rt6_ex = __rt6_find_exception_spinlock(&bucket, &nrt->rt6i_dst.addr,
1329					       src_key);
1330	if (rt6_ex)
1331		rt6_remove_exception(bucket, rt6_ex);
1332
1333	rt6_ex = kzalloc(sizeof(*rt6_ex), GFP_ATOMIC);
1334	if (!rt6_ex) {
1335		err = -ENOMEM;
1336		goto out;
1337	}
1338	rt6_ex->rt6i = nrt;
1339	rt6_ex->stamp = jiffies;
1340	atomic_inc(&nrt->rt6i_ref);
1341	nrt->rt6i_node = ort->rt6i_node;
1342	hlist_add_head_rcu(&rt6_ex->hlist, &bucket->chain);
1343	bucket->depth++;
1344	net->ipv6.rt6_stats->fib_rt_cache++;
1345
1346	if (bucket->depth > FIB6_MAX_DEPTH)
 
 
1347		rt6_exception_remove_oldest(bucket);
1348
1349out:
1350	spin_unlock_bh(&rt6_exception_lock);
1351
1352	/* Update fn->fn_sernum to invalidate all cached dst */
1353	if (!err) {
1354		spin_lock_bh(&ort->rt6i_table->tb6_lock);
1355		fib6_update_sernum(ort);
1356		spin_unlock_bh(&ort->rt6i_table->tb6_lock);
1357		fib6_force_start_gc(net);
1358	}
1359
1360	return err;
1361}
1362
1363void rt6_flush_exceptions(struct rt6_info *rt)
1364{
1365	struct rt6_exception_bucket *bucket;
1366	struct rt6_exception *rt6_ex;
1367	struct hlist_node *tmp;
1368	int i;
1369
1370	spin_lock_bh(&rt6_exception_lock);
1371	/* Prevent rt6_insert_exception() to recreate the bucket list */
1372	rt->exception_bucket_flushed = 1;
1373
1374	bucket = rcu_dereference_protected(rt->rt6i_exception_bucket,
1375				    lockdep_is_held(&rt6_exception_lock));
1376	if (!bucket)
1377		goto out;
1378
 
 
 
 
1379	for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
1380		hlist_for_each_entry_safe(rt6_ex, tmp, &bucket->chain, hlist)
1381			rt6_remove_exception(bucket, rt6_ex);
1382		WARN_ON_ONCE(bucket->depth);
 
 
 
1383		bucket++;
1384	}
1385
1386out:
1387	spin_unlock_bh(&rt6_exception_lock);
1388}
1389
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1390/* Find cached rt in the hash table inside passed in rt
1391 * Caller has to hold rcu_read_lock()
1392 */
1393static struct rt6_info *rt6_find_cached_rt(struct rt6_info *rt,
1394					   struct in6_addr *daddr,
1395					   struct in6_addr *saddr)
1396{
 
1397	struct rt6_exception_bucket *bucket;
1398	struct in6_addr *src_key = NULL;
1399	struct rt6_exception *rt6_ex;
1400	struct rt6_info *res = NULL;
1401
1402	bucket = rcu_dereference(rt->rt6i_exception_bucket);
1403
1404#ifdef CONFIG_IPV6_SUBTREES
1405	/* rt6i_src.plen != 0 indicates rt is in subtree
1406	 * and exception table is indexed by a hash of
1407	 * both rt6i_dst and rt6i_src.
1408	 * Otherwise, the exception table is indexed by
1409	 * a hash of only rt6i_dst.
 
 
 
 
 
1410	 */
1411	if (rt->rt6i_src.plen)
1412		src_key = saddr;
 
1413#endif
 
1414	rt6_ex = __rt6_find_exception_rcu(&bucket, daddr, src_key);
1415
1416	if (rt6_ex && !rt6_check_expired(rt6_ex->rt6i))
1417		res = rt6_ex->rt6i;
 
 
 
 
 
 
 
 
1418
1419	return res;
1420}
1421
1422/* Remove the passed in cached rt from the hash table that contains it */
1423int rt6_remove_exception_rt(struct rt6_info *rt)
 
1424{
 
1425	struct rt6_exception_bucket *bucket;
1426	struct rt6_info *from = rt->from;
1427	struct in6_addr *src_key = NULL;
1428	struct rt6_exception *rt6_ex;
1429	int err;
1430
1431	if (!from ||
1432	    !(rt->rt6i_flags & RTF_CACHE))
1433		return -EINVAL;
1434
1435	if (!rcu_access_pointer(from->rt6i_exception_bucket))
1436		return -ENOENT;
1437
1438	spin_lock_bh(&rt6_exception_lock);
1439	bucket = rcu_dereference_protected(from->rt6i_exception_bucket,
1440				    lockdep_is_held(&rt6_exception_lock));
1441#ifdef CONFIG_IPV6_SUBTREES
1442	/* rt6i_src.plen != 0 indicates 'from' is in subtree
1443	 * and exception table is indexed by a hash of
1444	 * both rt6i_dst and rt6i_src.
1445	 * Otherwise, the exception table is indexed by
1446	 * a hash of only rt6i_dst.
1447	 */
1448	if (from->rt6i_src.plen)
1449		src_key = &rt->rt6i_src.addr;
1450#endif
1451	rt6_ex = __rt6_find_exception_spinlock(&bucket,
1452					       &rt->rt6i_dst.addr,
1453					       src_key);
1454	if (rt6_ex) {
1455		rt6_remove_exception(bucket, rt6_ex);
1456		err = 0;
1457	} else {
1458		err = -ENOENT;
1459	}
1460
1461	spin_unlock_bh(&rt6_exception_lock);
1462	return err;
1463}
1464
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1465/* Find rt6_ex which contains the passed in rt cache and
1466 * refresh its stamp
1467 */
1468static void rt6_update_exception_stamp_rt(struct rt6_info *rt)
 
1469{
 
1470	struct rt6_exception_bucket *bucket;
1471	struct rt6_info *from = rt->from;
1472	struct in6_addr *src_key = NULL;
1473	struct rt6_exception *rt6_ex;
1474
1475	if (!from ||
1476	    !(rt->rt6i_flags & RTF_CACHE))
1477		return;
1478
1479	rcu_read_lock();
1480	bucket = rcu_dereference(from->rt6i_exception_bucket);
1481
1482#ifdef CONFIG_IPV6_SUBTREES
1483	/* rt6i_src.plen != 0 indicates 'from' is in subtree
1484	 * and exception table is indexed by a hash of
1485	 * both rt6i_dst and rt6i_src.
1486	 * Otherwise, the exception table is indexed by
1487	 * a hash of only rt6i_dst.
1488	 */
1489	if (from->rt6i_src.plen)
1490		src_key = &rt->rt6i_src.addr;
1491#endif
1492	rt6_ex = __rt6_find_exception_rcu(&bucket,
1493					  &rt->rt6i_dst.addr,
1494					  src_key);
1495	if (rt6_ex)
1496		rt6_ex->stamp = jiffies;
 
 
 
 
 
 
 
 
 
 
 
 
1497
1498	rcu_read_unlock();
 
 
 
 
 
 
 
 
 
1499}
1500
1501static void rt6_exceptions_remove_prefsrc(struct rt6_info *rt)
1502{
1503	struct rt6_exception_bucket *bucket;
1504	struct rt6_exception *rt6_ex;
1505	int i;
1506
1507	bucket = rcu_dereference_protected(rt->rt6i_exception_bucket,
1508					lockdep_is_held(&rt6_exception_lock));
1509
1510	if (bucket) {
1511		for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
1512			hlist_for_each_entry(rt6_ex, &bucket->chain, hlist) {
1513				rt6_ex->rt6i->rt6i_prefsrc.plen = 0;
1514			}
1515			bucket++;
1516		}
 
 
 
 
 
 
 
 
 
 
1517	}
 
 
 
1518}
1519
1520static bool rt6_mtu_change_route_allowed(struct inet6_dev *idev,
1521					 struct rt6_info *rt, int mtu)
1522{
1523	/* If the new MTU is lower than the route PMTU, this new MTU will be the
1524	 * lowest MTU in the path: always allow updating the route PMTU to
1525	 * reflect PMTU decreases.
1526	 *
1527	 * If the new MTU is higher, and the route PMTU is equal to the local
1528	 * MTU, this means the old MTU is the lowest in the path, so allow
1529	 * updating it: if other nodes now have lower MTUs, PMTU discovery will
1530	 * handle this.
1531	 */
1532
1533	if (dst_mtu(&rt->dst) >= mtu)
1534		return true;
1535
1536	if (dst_mtu(&rt->dst) == idev->cnf.mtu6)
1537		return true;
1538
1539	return false;
1540}
1541
1542static void rt6_exceptions_update_pmtu(struct inet6_dev *idev,
1543				       struct rt6_info *rt, int mtu)
1544{
1545	struct rt6_exception_bucket *bucket;
1546	struct rt6_exception *rt6_ex;
1547	int i;
1548
1549	bucket = rcu_dereference_protected(rt->rt6i_exception_bucket,
1550					lockdep_is_held(&rt6_exception_lock));
1551
1552	if (!bucket)
1553		return;
1554
1555	for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
1556		hlist_for_each_entry(rt6_ex, &bucket->chain, hlist) {
1557			struct rt6_info *entry = rt6_ex->rt6i;
1558
1559			/* For RTF_CACHE with rt6i_pmtu == 0 (i.e. a redirected
1560			 * route), the metrics of its rt->dst.from have already
1561			 * been updated.
1562			 */
1563			if (entry->rt6i_pmtu &&
1564			    rt6_mtu_change_route_allowed(idev, entry, mtu))
1565				entry->rt6i_pmtu = mtu;
1566		}
1567		bucket++;
1568	}
1569}
1570
1571#define RTF_CACHE_GATEWAY	(RTF_GATEWAY | RTF_CACHE)
1572
1573static void rt6_exceptions_clean_tohost(struct rt6_info *rt,
1574					struct in6_addr *gateway)
1575{
1576	struct rt6_exception_bucket *bucket;
1577	struct rt6_exception *rt6_ex;
1578	struct hlist_node *tmp;
1579	int i;
1580
1581	if (!rcu_access_pointer(rt->rt6i_exception_bucket))
1582		return;
1583
1584	spin_lock_bh(&rt6_exception_lock);
1585	bucket = rcu_dereference_protected(rt->rt6i_exception_bucket,
1586				     lockdep_is_held(&rt6_exception_lock));
1587
1588	if (bucket) {
1589		for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
1590			hlist_for_each_entry_safe(rt6_ex, tmp,
1591						  &bucket->chain, hlist) {
1592				struct rt6_info *entry = rt6_ex->rt6i;
1593
1594				if ((entry->rt6i_flags & RTF_CACHE_GATEWAY) ==
1595				    RTF_CACHE_GATEWAY &&
1596				    ipv6_addr_equal(gateway,
1597						    &entry->rt6i_gateway)) {
1598					rt6_remove_exception(bucket, rt6_ex);
1599				}
1600			}
1601			bucket++;
1602		}
1603	}
1604
1605	spin_unlock_bh(&rt6_exception_lock);
1606}
1607
1608static void rt6_age_examine_exception(struct rt6_exception_bucket *bucket,
1609				      struct rt6_exception *rt6_ex,
1610				      struct fib6_gc_args *gc_args,
1611				      unsigned long now)
1612{
1613	struct rt6_info *rt = rt6_ex->rt6i;
1614
1615	/* we are pruning and obsoleting aged-out and non gateway exceptions
1616	 * even if others have still references to them, so that on next
1617	 * dst_check() such references can be dropped.
1618	 * EXPIRES exceptions - e.g. pmtu-generated ones are pruned when
1619	 * expired, independently from their aging, as per RFC 8201 section 4
1620	 */
1621	if (!(rt->rt6i_flags & RTF_EXPIRES)) {
1622		if (time_after_eq(now, rt->dst.lastuse + gc_args->timeout)) {
1623			RT6_TRACE("aging clone %p\n", rt);
1624			rt6_remove_exception(bucket, rt6_ex);
1625			return;
1626		}
1627	} else if (time_after(jiffies, rt->dst.expires)) {
1628		RT6_TRACE("purging expired route %p\n", rt);
1629		rt6_remove_exception(bucket, rt6_ex);
1630		return;
1631	}
1632
1633	if (rt->rt6i_flags & RTF_GATEWAY) {
1634		struct neighbour *neigh;
1635		__u8 neigh_flags = 0;
1636
1637		neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway);
1638		if (neigh)
1639			neigh_flags = neigh->flags;
1640
1641		if (!(neigh_flags & NTF_ROUTER)) {
1642			RT6_TRACE("purging route %p via non-router but gateway\n",
1643				  rt);
1644			rt6_remove_exception(bucket, rt6_ex);
1645			return;
1646		}
1647	}
1648
1649	gc_args->more++;
1650}
1651
1652void rt6_age_exceptions(struct rt6_info *rt,
1653			struct fib6_gc_args *gc_args,
1654			unsigned long now)
1655{
1656	struct rt6_exception_bucket *bucket;
1657	struct rt6_exception *rt6_ex;
1658	struct hlist_node *tmp;
1659	int i;
1660
1661	if (!rcu_access_pointer(rt->rt6i_exception_bucket))
1662		return;
1663
1664	rcu_read_lock_bh();
1665	spin_lock(&rt6_exception_lock);
1666	bucket = rcu_dereference_protected(rt->rt6i_exception_bucket,
1667				    lockdep_is_held(&rt6_exception_lock));
1668
1669	if (bucket) {
1670		for (i = 0; i < FIB6_EXCEPTION_BUCKET_SIZE; i++) {
1671			hlist_for_each_entry_safe(rt6_ex, tmp,
1672						  &bucket->chain, hlist) {
1673				rt6_age_examine_exception(bucket, rt6_ex,
1674							  gc_args, now);
1675			}
1676			bucket++;
1677		}
1678	}
1679	spin_unlock(&rt6_exception_lock);
1680	rcu_read_unlock_bh();
1681}
1682
1683struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table,
1684			       int oif, struct flowi6 *fl6,
1685			       const struct sk_buff *skb, int flags)
 
 
 
 
 
 
 
 
 
 
 
 
 
1686{
1687	struct fib6_node *fn, *saved_fn;
1688	struct rt6_info *rt, *rt_cache;
1689	int strict = 0;
 
 
1690
1691	strict |= flags & RT6_LOOKUP_F_IFACE;
1692	strict |= flags & RT6_LOOKUP_F_IGNORE_LINKSTATE;
1693	if (net->ipv6.devconf_all->forwarding == 0)
1694		strict |= RT6_LOOKUP_F_REACHABLE;
 
 
1695
1696	rcu_read_lock();
 
 
 
 
1697
1698	fn = fib6_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
1699	saved_fn = fn;
1700
1701	if (fl6->flowi6_flags & FLOWI_FLAG_SKIP_NH_OIF)
1702		oif = 0;
1703
1704redo_rt6_select:
1705	rt = rt6_select(net, fn, oif, strict);
1706	if (rt->rt6i_nsiblings)
1707		rt = rt6_multipath_select(net, rt, fl6, oif, skb, strict);
1708	if (rt == net->ipv6.ip6_null_entry) {
1709		fn = fib6_backtrack(fn, &fl6->saddr);
1710		if (fn)
1711			goto redo_rt6_select;
1712		else if (strict & RT6_LOOKUP_F_REACHABLE) {
1713			/* also consider unreachable route */
1714			strict &= ~RT6_LOOKUP_F_REACHABLE;
1715			fn = saved_fn;
1716			goto redo_rt6_select;
1717		}
1718	}
1719
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1720	/*Search through exception table */
1721	rt_cache = rt6_find_cached_rt(rt, &fl6->daddr, &fl6->saddr);
1722	if (rt_cache)
1723		rt = rt_cache;
1724
1725	if (rt == net->ipv6.ip6_null_entry) {
1726		rcu_read_unlock();
1727		dst_hold(&rt->dst);
1728		trace_fib6_table_lookup(net, rt, table, fl6);
1729		return rt;
1730	} else if (rt->rt6i_flags & RTF_CACHE) {
1731		if (ip6_hold_safe(net, &rt, true)) {
1732			dst_use_noref(&rt->dst, jiffies);
1733			rt6_dst_from_metrics_check(rt);
1734		}
1735		rcu_read_unlock();
1736		trace_fib6_table_lookup(net, rt, table, fl6);
1737		return rt;
1738	} else if (unlikely((fl6->flowi6_flags & FLOWI_FLAG_KNOWN_NH) &&
1739			    !(rt->rt6i_flags & RTF_GATEWAY))) {
1740		/* Create a RTF_CACHE clone which will not be
1741		 * owned by the fib6 tree.  It is for the special case where
1742		 * the daddr in the skb during the neighbor look-up is different
1743		 * from the fl6->daddr used to look-up route here.
1744		 */
 
1745
1746		struct rt6_info *uncached_rt;
1747
1748		if (ip6_hold_safe(net, &rt, true)) {
1749			dst_use_noref(&rt->dst, jiffies);
1750		} else {
 
 
1751			rcu_read_unlock();
1752			uncached_rt = rt;
1753			goto uncached_rt_out;
1754		}
1755		rcu_read_unlock();
1756
1757		uncached_rt = ip6_rt_cache_alloc(rt, &fl6->daddr, NULL);
1758		dst_release(&rt->dst);
1759
1760		if (uncached_rt) {
1761			/* Uncached_rt's refcnt is taken during ip6_rt_cache_alloc()
1762			 * No need for another dst_hold()
1763			 */
1764			rt6_uncached_list_add(uncached_rt);
1765			atomic_inc(&net->ipv6.rt6_stats->fib_rt_uncache);
1766		} else {
1767			uncached_rt = net->ipv6.ip6_null_entry;
1768			dst_hold(&uncached_rt->dst);
1769		}
1770
1771uncached_rt_out:
1772		trace_fib6_table_lookup(net, uncached_rt, table, fl6);
1773		return uncached_rt;
1774
1775	} else {
1776		/* Get a percpu copy */
 
 
1777
1778		struct rt6_info *pcpu_rt;
 
1779
1780		dst_use_noref(&rt->dst, jiffies);
1781		local_bh_disable();
1782		pcpu_rt = rt6_get_pcpu_route(rt);
1783
1784		if (!pcpu_rt) {
1785			/* atomic_inc_not_zero() is needed when using rcu */
1786			if (atomic_inc_not_zero(&rt->rt6i_ref)) {
1787				/* No dst_hold() on rt is needed because grabbing
1788				 * rt->rt6i_ref makes sure rt can't be released.
1789				 */
1790				pcpu_rt = rt6_make_pcpu_route(rt);
1791				rt6_release(rt);
1792			} else {
1793				/* rt is already removed from tree */
1794				pcpu_rt = net->ipv6.ip6_null_entry;
1795				dst_hold(&pcpu_rt->dst);
1796			}
1797		}
1798		local_bh_enable();
1799		rcu_read_unlock();
1800		trace_fib6_table_lookup(net, pcpu_rt, table, fl6);
1801		return pcpu_rt;
1802	}
 
 
 
 
 
 
 
 
1803}
1804EXPORT_SYMBOL_GPL(ip6_pol_route);
1805
1806static struct rt6_info *ip6_pol_route_input(struct net *net,
1807					    struct fib6_table *table,
1808					    struct flowi6 *fl6,
1809					    const struct sk_buff *skb,
1810					    int flags)
1811{
1812	return ip6_pol_route(net, table, fl6->flowi6_iif, fl6, skb, flags);
1813}
1814
1815struct dst_entry *ip6_route_input_lookup(struct net *net,
1816					 struct net_device *dev,
1817					 struct flowi6 *fl6,
1818					 const struct sk_buff *skb,
1819					 int flags)
1820{
1821	if (rt6_need_strict(&fl6->daddr) && dev->type != ARPHRD_PIMREG)
1822		flags |= RT6_LOOKUP_F_IFACE;
1823
1824	return fib6_rule_lookup(net, fl6, skb, flags, ip6_pol_route_input);
1825}
1826EXPORT_SYMBOL_GPL(ip6_route_input_lookup);
1827
1828static void ip6_multipath_l3_keys(const struct sk_buff *skb,
1829				  struct flow_keys *keys,
1830				  struct flow_keys *flkeys)
1831{
1832	const struct ipv6hdr *outer_iph = ipv6_hdr(skb);
1833	const struct ipv6hdr *key_iph = outer_iph;
1834	struct flow_keys *_flkeys = flkeys;
1835	const struct ipv6hdr *inner_iph;
1836	const struct icmp6hdr *icmph;
1837	struct ipv6hdr _inner_iph;
1838	struct icmp6hdr _icmph;
1839
1840	if (likely(outer_iph->nexthdr != IPPROTO_ICMPV6))
1841		goto out;
1842
1843	icmph = skb_header_pointer(skb, skb_transport_offset(skb),
1844				   sizeof(_icmph), &_icmph);
1845	if (!icmph)
1846		goto out;
1847
1848	if (icmph->icmp6_type != ICMPV6_DEST_UNREACH &&
1849	    icmph->icmp6_type != ICMPV6_PKT_TOOBIG &&
1850	    icmph->icmp6_type != ICMPV6_TIME_EXCEED &&
1851	    icmph->icmp6_type != ICMPV6_PARAMPROB)
1852		goto out;
1853
1854	inner_iph = skb_header_pointer(skb,
1855				       skb_transport_offset(skb) + sizeof(*icmph),
1856				       sizeof(_inner_iph), &_inner_iph);
1857	if (!inner_iph)
1858		goto out;
1859
1860	key_iph = inner_iph;
1861	_flkeys = NULL;
1862out:
1863	if (_flkeys) {
1864		keys->addrs.v6addrs.src = _flkeys->addrs.v6addrs.src;
1865		keys->addrs.v6addrs.dst = _flkeys->addrs.v6addrs.dst;
1866		keys->tags.flow_label = _flkeys->tags.flow_label;
1867		keys->basic.ip_proto = _flkeys->basic.ip_proto;
1868	} else {
1869		keys->addrs.v6addrs.src = key_iph->saddr;
1870		keys->addrs.v6addrs.dst = key_iph->daddr;
1871		keys->tags.flow_label = ip6_flowinfo(key_iph);
1872		keys->basic.ip_proto = key_iph->nexthdr;
1873	}
1874}
1875
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1876/* if skb is set it will be used and fl6 can be NULL */
1877u32 rt6_multipath_hash(const struct net *net, const struct flowi6 *fl6,
1878		       const struct sk_buff *skb, struct flow_keys *flkeys)
1879{
1880	struct flow_keys hash_keys;
1881	u32 mhash;
1882
1883	switch (ip6_multipath_hash_policy(net)) {
1884	case 0:
1885		memset(&hash_keys, 0, sizeof(hash_keys));
1886		hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
1887		if (skb) {
1888			ip6_multipath_l3_keys(skb, &hash_keys, flkeys);
1889		} else {
1890			hash_keys.addrs.v6addrs.src = fl6->saddr;
1891			hash_keys.addrs.v6addrs.dst = fl6->daddr;
1892			hash_keys.tags.flow_label = (__force u32)fl6->flowlabel;
1893			hash_keys.basic.ip_proto = fl6->flowi6_proto;
1894		}
 
1895		break;
1896	case 1:
1897		if (skb) {
1898			unsigned int flag = FLOW_DISSECTOR_F_STOP_AT_ENCAP;
1899			struct flow_keys keys;
1900
1901			/* short-circuit if we already have L4 hash present */
1902			if (skb->l4_hash)
1903				return skb_get_hash_raw(skb) >> 1;
1904
1905			memset(&hash_keys, 0, sizeof(hash_keys));
1906
1907                        if (!flkeys) {
1908				skb_flow_dissect_flow_keys(skb, &keys, flag);
1909				flkeys = &keys;
1910			}
1911			hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
1912			hash_keys.addrs.v6addrs.src = flkeys->addrs.v6addrs.src;
1913			hash_keys.addrs.v6addrs.dst = flkeys->addrs.v6addrs.dst;
1914			hash_keys.ports.src = flkeys->ports.src;
1915			hash_keys.ports.dst = flkeys->ports.dst;
1916			hash_keys.basic.ip_proto = flkeys->basic.ip_proto;
1917		} else {
1918			memset(&hash_keys, 0, sizeof(hash_keys));
1919			hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
1920			hash_keys.addrs.v6addrs.src = fl6->saddr;
1921			hash_keys.addrs.v6addrs.dst = fl6->daddr;
1922			hash_keys.ports.src = fl6->fl6_sport;
1923			hash_keys.ports.dst = fl6->fl6_dport;
1924			hash_keys.basic.ip_proto = fl6->flowi6_proto;
1925		}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1926		break;
1927	}
1928	mhash = flow_hash_from_keys(&hash_keys);
1929
1930	return mhash >> 1;
1931}
1932
 
1933void ip6_route_input(struct sk_buff *skb)
1934{
1935	const struct ipv6hdr *iph = ipv6_hdr(skb);
1936	struct net *net = dev_net(skb->dev);
1937	int flags = RT6_LOOKUP_F_HAS_SADDR;
1938	struct ip_tunnel_info *tun_info;
1939	struct flowi6 fl6 = {
1940		.flowi6_iif = skb->dev->ifindex,
1941		.daddr = iph->daddr,
1942		.saddr = iph->saddr,
1943		.flowlabel = ip6_flowinfo(iph),
1944		.flowi6_mark = skb->mark,
1945		.flowi6_proto = iph->nexthdr,
1946	};
1947	struct flow_keys *flkeys = NULL, _flkeys;
1948
1949	tun_info = skb_tunnel_info(skb);
1950	if (tun_info && !(tun_info->mode & IP_TUNNEL_INFO_TX))
1951		fl6.flowi6_tun_key.tun_id = tun_info->key.tun_id;
1952
1953	if (fib6_rules_early_flow_dissect(net, skb, &fl6, &_flkeys))
1954		flkeys = &_flkeys;
1955
1956	if (unlikely(fl6.flowi6_proto == IPPROTO_ICMPV6))
1957		fl6.mp_hash = rt6_multipath_hash(net, &fl6, skb, flkeys);
1958	skb_dst_drop(skb);
1959	skb_dst_set(skb,
1960		    ip6_route_input_lookup(net, skb->dev, &fl6, skb, flags));
1961}
1962
1963static struct rt6_info *ip6_pol_route_output(struct net *net,
1964					     struct fib6_table *table,
1965					     struct flowi6 *fl6,
1966					     const struct sk_buff *skb,
1967					     int flags)
1968{
1969	return ip6_pol_route(net, table, fl6->flowi6_oif, fl6, skb, flags);
1970}
1971
1972struct dst_entry *ip6_route_output_flags(struct net *net, const struct sock *sk,
1973					 struct flowi6 *fl6, int flags)
 
 
1974{
1975	bool any_src;
1976
1977	if (rt6_need_strict(&fl6->daddr)) {
 
1978		struct dst_entry *dst;
1979
 
1980		dst = l3mdev_link_scope_lookup(net, fl6);
1981		if (dst)
1982			return dst;
1983	}
1984
1985	fl6->flowi6_iif = LOOPBACK_IFINDEX;
1986
 
1987	any_src = ipv6_addr_any(&fl6->saddr);
1988	if ((sk && sk->sk_bound_dev_if) || rt6_need_strict(&fl6->daddr) ||
1989	    (fl6->flowi6_oif && any_src))
1990		flags |= RT6_LOOKUP_F_IFACE;
1991
1992	if (!any_src)
1993		flags |= RT6_LOOKUP_F_HAS_SADDR;
1994	else if (sk)
1995		flags |= rt6_srcprefs2flags(inet6_sk(sk)->srcprefs);
1996
1997	return fib6_rule_lookup(net, fl6, NULL, flags, ip6_pol_route_output);
1998}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1999EXPORT_SYMBOL_GPL(ip6_route_output_flags);
2000
2001struct dst_entry *ip6_blackhole_route(struct net *net, struct dst_entry *dst_orig)
2002{
2003	struct rt6_info *rt, *ort = (struct rt6_info *) dst_orig;
2004	struct net_device *loopback_dev = net->loopback_dev;
2005	struct dst_entry *new = NULL;
2006
2007	rt = dst_alloc(&ip6_dst_blackhole_ops, loopback_dev, 1,
2008		       DST_OBSOLETE_DEAD, 0);
2009	if (rt) {
2010		rt6_info_init(rt);
2011		atomic_inc(&net->ipv6.rt6_stats->fib_rt_alloc);
2012
2013		new = &rt->dst;
2014		new->__use = 1;
2015		new->input = dst_discard;
2016		new->output = dst_discard_out;
2017
2018		dst_copy_metrics(new, &ort->dst);
2019
2020		rt->rt6i_idev = in6_dev_get(loopback_dev);
2021		rt->rt6i_gateway = ort->rt6i_gateway;
2022		rt->rt6i_flags = ort->rt6i_flags & ~RTF_PCPU;
2023		rt->rt6i_metric = 0;
2024
2025		memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key));
2026#ifdef CONFIG_IPV6_SUBTREES
2027		memcpy(&rt->rt6i_src, &ort->rt6i_src, sizeof(struct rt6key));
2028#endif
2029	}
2030
2031	dst_release(dst_orig);
2032	return new ? new : ERR_PTR(-ENOMEM);
2033}
2034
2035/*
2036 *	Destination cache support functions
2037 */
2038
2039static void rt6_dst_from_metrics_check(struct rt6_info *rt)
2040{
2041	if (rt->from &&
2042	    dst_metrics_ptr(&rt->dst) != dst_metrics_ptr(&rt->from->dst))
2043		dst_init_metrics(&rt->dst, dst_metrics_ptr(&rt->from->dst), true);
 
 
 
 
 
 
2044}
2045
2046static struct dst_entry *rt6_check(struct rt6_info *rt, u32 cookie)
 
 
2047{
2048	u32 rt_cookie = 0;
2049
2050	if (!rt6_get_cookie_safe(rt, &rt_cookie) || rt_cookie != cookie)
 
2051		return NULL;
2052
2053	if (rt6_check_expired(rt))
2054		return NULL;
2055
2056	return &rt->dst;
2057}
2058
2059static struct dst_entry *rt6_dst_from_check(struct rt6_info *rt, u32 cookie)
 
 
2060{
2061	if (!__rt6_check_expired(rt) &&
2062	    rt->dst.obsolete == DST_OBSOLETE_FORCE_CHK &&
2063	    rt6_check(rt->from, cookie))
2064		return &rt->dst;
2065	else
2066		return NULL;
2067}
2068
2069static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie)
 
2070{
 
 
2071	struct rt6_info *rt;
2072
2073	rt = (struct rt6_info *) dst;
 
 
 
 
 
2074
2075	/* All IPV6 dsts are created with ->obsolete set to the value
2076	 * DST_OBSOLETE_FORCE_CHK which forces validation calls down
2077	 * into this function always.
2078	 */
2079
2080	rt6_dst_from_metrics_check(rt);
2081
2082	if (rt->rt6i_flags & RTF_PCPU ||
2083	    (unlikely(!list_empty(&rt->rt6i_uncached)) && rt->from))
2084		return rt6_dst_from_check(rt, cookie);
2085	else
2086		return rt6_check(rt, cookie);
 
 
 
 
2087}
 
2088
2089static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)
 
2090{
2091	struct rt6_info *rt = (struct rt6_info *) dst;
2092
2093	if (rt) {
2094		if (rt->rt6i_flags & RTF_CACHE) {
2095			if (rt6_check_expired(rt)) {
2096				ip6_del_rt(rt);
2097				dst = NULL;
2098			}
2099		} else {
2100			dst_release(dst);
2101			dst = NULL;
2102		}
 
 
2103	}
2104	return dst;
2105}
2106
2107static void ip6_link_failure(struct sk_buff *skb)
2108{
2109	struct rt6_info *rt;
2110
2111	icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0);
2112
2113	rt = (struct rt6_info *) skb_dst(skb);
2114	if (rt) {
 
2115		if (rt->rt6i_flags & RTF_CACHE) {
2116			if (dst_hold_safe(&rt->dst))
2117				ip6_del_rt(rt);
2118		} else {
 
2119			struct fib6_node *fn;
2120
2121			rcu_read_lock();
2122			fn = rcu_dereference(rt->rt6i_node);
2123			if (fn && (rt->rt6i_flags & RTF_DEFAULT))
2124				fn->fn_sernum = -1;
2125			rcu_read_unlock();
 
2126		}
 
2127	}
2128}
2129
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2130static void rt6_do_update_pmtu(struct rt6_info *rt, u32 mtu)
2131{
2132	struct net *net = dev_net(rt->dst.dev);
2133
 
2134	rt->rt6i_flags |= RTF_MODIFIED;
2135	rt->rt6i_pmtu = mtu;
2136	rt6_update_expires(rt, net->ipv6.sysctl.ip6_rt_mtu_expires);
2137}
2138
2139static bool rt6_cache_allowed_for_pmtu(const struct rt6_info *rt)
2140{
2141	return !(rt->rt6i_flags & RTF_CACHE) &&
2142		(rt->rt6i_flags & RTF_PCPU ||
2143		 rcu_access_pointer(rt->rt6i_node));
2144}
2145
2146static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk,
2147				 const struct ipv6hdr *iph, u32 mtu)
 
2148{
2149	const struct in6_addr *daddr, *saddr;
2150	struct rt6_info *rt6 = (struct rt6_info *)dst;
2151
2152	if (rt6->rt6i_flags & RTF_LOCAL)
2153		return;
2154
2155	if (dst_metric_locked(dst, RTAX_MTU))
2156		return;
2157
2158	if (iph) {
2159		daddr = &iph->daddr;
2160		saddr = &iph->saddr;
2161	} else if (sk) {
2162		daddr = &sk->sk_v6_daddr;
2163		saddr = &inet6_sk(sk)->saddr;
2164	} else {
2165		daddr = NULL;
2166		saddr = NULL;
2167	}
2168	dst_confirm_neigh(dst, daddr);
2169	mtu = max_t(u32, mtu, IPV6_MIN_MTU);
 
 
 
 
2170	if (mtu >= dst_mtu(dst))
2171		return;
2172
2173	if (!rt6_cache_allowed_for_pmtu(rt6)) {
2174		rt6_do_update_pmtu(rt6, mtu);
2175		/* update rt6_ex->stamp for cache */
2176		if (rt6->rt6i_flags & RTF_CACHE)
2177			rt6_update_exception_stamp_rt(rt6);
2178	} else if (daddr) {
 
2179		struct rt6_info *nrt6;
2180
2181		nrt6 = ip6_rt_cache_alloc(rt6, daddr, saddr);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2182		if (nrt6) {
2183			rt6_do_update_pmtu(nrt6, mtu);
2184			if (rt6_insert_exception(nrt6, rt6))
2185				dst_release_immediate(&nrt6->dst);
2186		}
 
 
2187	}
2188}
2189
2190static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
2191			       struct sk_buff *skb, u32 mtu)
 
2192{
2193	__ip6_rt_update_pmtu(dst, sk, skb ? ipv6_hdr(skb) : NULL, mtu);
 
2194}
2195
2196void ip6_update_pmtu(struct sk_buff *skb, struct net *net, __be32 mtu,
2197		     int oif, u32 mark, kuid_t uid)
2198{
2199	const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data;
2200	struct dst_entry *dst;
2201	struct flowi6 fl6;
2202
2203	memset(&fl6, 0, sizeof(fl6));
2204	fl6.flowi6_oif = oif;
2205	fl6.flowi6_mark = mark ? mark : IP6_REPLY_MARK(net, skb->mark);
2206	fl6.daddr = iph->daddr;
2207	fl6.saddr = iph->saddr;
2208	fl6.flowlabel = ip6_flowinfo(iph);
2209	fl6.flowi6_uid = uid;
2210
2211	dst = ip6_route_output(net, NULL, &fl6);
2212	if (!dst->error)
2213		__ip6_rt_update_pmtu(dst, NULL, iph, ntohl(mtu));
2214	dst_release(dst);
2215}
2216EXPORT_SYMBOL_GPL(ip6_update_pmtu);
2217
2218void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, __be32 mtu)
2219{
 
2220	struct dst_entry *dst;
2221
2222	ip6_update_pmtu(skb, sock_net(sk), mtu,
2223			sk->sk_bound_dev_if, sk->sk_mark, sk->sk_uid);
 
 
 
2224
2225	dst = __sk_dst_get(sk);
2226	if (!dst || !dst->obsolete ||
2227	    dst->ops->check(dst, inet6_sk(sk)->dst_cookie))
2228		return;
2229
2230	bh_lock_sock(sk);
2231	if (!sock_owned_by_user(sk) && !ipv6_addr_v4mapped(&sk->sk_v6_daddr))
2232		ip6_datagram_dst_update(sk, false);
2233	bh_unlock_sock(sk);
2234}
2235EXPORT_SYMBOL_GPL(ip6_sk_update_pmtu);
2236
2237void ip6_sk_dst_store_flow(struct sock *sk, struct dst_entry *dst,
2238			   const struct flowi6 *fl6)
2239{
2240#ifdef CONFIG_IPV6_SUBTREES
2241	struct ipv6_pinfo *np = inet6_sk(sk);
2242#endif
2243
2244	ip6_dst_store(sk, dst,
2245		      ipv6_addr_equal(&fl6->daddr, &sk->sk_v6_daddr) ?
2246		      &sk->sk_v6_daddr : NULL,
2247#ifdef CONFIG_IPV6_SUBTREES
2248		      ipv6_addr_equal(&fl6->saddr, &np->saddr) ?
2249		      &np->saddr :
2250#endif
2251		      NULL);
2252}
2253
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2254/* Handle redirects */
2255struct ip6rd_flowi {
2256	struct flowi6 fl6;
2257	struct in6_addr gateway;
2258};
2259
2260static struct rt6_info *__ip6_route_redirect(struct net *net,
2261					     struct fib6_table *table,
2262					     struct flowi6 *fl6,
2263					     const struct sk_buff *skb,
2264					     int flags)
2265{
2266	struct ip6rd_flowi *rdfl = (struct ip6rd_flowi *)fl6;
2267	struct rt6_info *rt, *rt_cache;
 
 
 
 
 
 
 
 
2268	struct fib6_node *fn;
2269
2270	/* Get the "current" route for this destination and
2271	 * check if the redirect has come from appropriate router.
2272	 *
2273	 * RFC 4861 specifies that redirects should only be
2274	 * accepted if they come from the nexthop to the target.
2275	 * Due to the way the routes are chosen, this notion
2276	 * is a bit fuzzy and one might need to check all possible
2277	 * routes.
2278	 */
2279
2280	rcu_read_lock();
2281	fn = fib6_lookup(&table->tb6_root, &fl6->daddr, &fl6->saddr);
2282restart:
2283	for_each_fib6_node_rt_rcu(fn) {
2284		if (rt->rt6i_nh_flags & RTNH_F_DEAD)
 
2285			continue;
2286		if (rt6_check_expired(rt))
2287			continue;
2288		if (rt->dst.error)
2289			break;
2290		if (!(rt->rt6i_flags & RTF_GATEWAY))
2291			continue;
2292		if (fl6->flowi6_oif != rt->dst.dev->ifindex)
2293			continue;
2294		/* rt_cache's gateway might be different from its 'parent'
2295		 * in the case of an ip redirect.
2296		 * So we keep searching in the exception table if the gateway
2297		 * is different.
2298		 */
2299		if (!ipv6_addr_equal(&rdfl->gateway, &rt->rt6i_gateway)) {
2300			rt_cache = rt6_find_cached_rt(rt,
2301						      &fl6->daddr,
2302						      &fl6->saddr);
2303			if (rt_cache &&
2304			    ipv6_addr_equal(&rdfl->gateway,
2305					    &rt_cache->rt6i_gateway)) {
2306				rt = rt_cache;
2307				break;
2308			}
2309			continue;
2310		}
2311		break;
2312	}
2313
2314	if (!rt)
2315		rt = net->ipv6.ip6_null_entry;
2316	else if (rt->dst.error) {
2317		rt = net->ipv6.ip6_null_entry;
2318		goto out;
2319	}
2320
2321	if (rt == net->ipv6.ip6_null_entry) {
2322		fn = fib6_backtrack(fn, &fl6->saddr);
2323		if (fn)
2324			goto restart;
2325	}
2326
 
 
2327out:
2328	ip6_hold_safe(net, &rt, true);
 
 
 
 
 
 
2329
2330	rcu_read_unlock();
2331
2332	trace_fib6_table_lookup(net, rt, table, fl6);
2333	return rt;
2334};
2335
2336static struct dst_entry *ip6_route_redirect(struct net *net,
2337					    const struct flowi6 *fl6,
2338					    const struct sk_buff *skb,
2339					    const struct in6_addr *gateway)
2340{
2341	int flags = RT6_LOOKUP_F_HAS_SADDR;
2342	struct ip6rd_flowi rdfl;
2343
2344	rdfl.fl6 = *fl6;
2345	rdfl.gateway = *gateway;
2346
2347	return fib6_rule_lookup(net, &rdfl.fl6, skb,
2348				flags, __ip6_route_redirect);
2349}
2350
2351void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark,
2352		  kuid_t uid)
2353{
2354	const struct ipv6hdr *iph = (struct ipv6hdr *) skb->data;
2355	struct dst_entry *dst;
2356	struct flowi6 fl6;
2357
2358	memset(&fl6, 0, sizeof(fl6));
2359	fl6.flowi6_iif = LOOPBACK_IFINDEX;
2360	fl6.flowi6_oif = oif;
2361	fl6.flowi6_mark = mark;
2362	fl6.daddr = iph->daddr;
2363	fl6.saddr = iph->saddr;
2364	fl6.flowlabel = ip6_flowinfo(iph);
2365	fl6.flowi6_uid = uid;
2366
2367	dst = ip6_route_redirect(net, &fl6, skb, &ipv6_hdr(skb)->saddr);
2368	rt6_do_redirect(dst, NULL, skb);
2369	dst_release(dst);
2370}
2371EXPORT_SYMBOL_GPL(ip6_redirect);
2372
2373void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif,
2374			    u32 mark)
2375{
2376	const struct ipv6hdr *iph = ipv6_hdr(skb);
2377	const struct rd_msg *msg = (struct rd_msg *)icmp6_hdr(skb);
2378	struct dst_entry *dst;
2379	struct flowi6 fl6;
2380
2381	memset(&fl6, 0, sizeof(fl6));
2382	fl6.flowi6_iif = LOOPBACK_IFINDEX;
2383	fl6.flowi6_oif = oif;
2384	fl6.flowi6_mark = mark;
2385	fl6.daddr = msg->dest;
2386	fl6.saddr = iph->daddr;
2387	fl6.flowi6_uid = sock_net_uid(net, NULL);
2388
2389	dst = ip6_route_redirect(net, &fl6, skb, &iph->saddr);
2390	rt6_do_redirect(dst, NULL, skb);
2391	dst_release(dst);
2392}
2393
2394void ip6_sk_redirect(struct sk_buff *skb, struct sock *sk)
2395{
2396	ip6_redirect(skb, sock_net(sk), sk->sk_bound_dev_if, sk->sk_mark,
2397		     sk->sk_uid);
2398}
2399EXPORT_SYMBOL_GPL(ip6_sk_redirect);
2400
2401static unsigned int ip6_default_advmss(const struct dst_entry *dst)
2402{
2403	struct net_device *dev = dst->dev;
2404	unsigned int mtu = dst_mtu(dst);
2405	struct net *net = dev_net(dev);
2406
2407	mtu -= sizeof(struct ipv6hdr) + sizeof(struct tcphdr);
2408
 
 
 
2409	if (mtu < net->ipv6.sysctl.ip6_rt_min_advmss)
2410		mtu = net->ipv6.sysctl.ip6_rt_min_advmss;
2411
 
 
2412	/*
2413	 * Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and
2414	 * corresponding MSS is IPV6_MAXPLEN - tcp_header_size.
2415	 * IPV6_MAXPLEN is also valid and means: "any MSS,
2416	 * rely only on pmtu discovery"
2417	 */
2418	if (mtu > IPV6_MAXPLEN - sizeof(struct tcphdr))
2419		mtu = IPV6_MAXPLEN;
2420	return mtu;
2421}
2422
2423static unsigned int ip6_mtu(const struct dst_entry *dst)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2424{
2425	const struct rt6_info *rt = (const struct rt6_info *)dst;
2426	unsigned int mtu = rt->rt6i_pmtu;
2427	struct inet6_dev *idev;
 
 
2428
2429	if (mtu)
2430		goto out;
 
 
 
2431
2432	mtu = dst_metric_raw(dst, RTAX_MTU);
2433	if (mtu)
2434		goto out;
 
 
2435
2436	mtu = IPV6_MIN_MTU;
2437
2438	rcu_read_lock();
2439	idev = __in6_dev_get(dst->dev);
2440	if (idev)
2441		mtu = idev->cnf.mtu6;
2442	rcu_read_unlock();
2443
 
2444out:
2445	mtu = min_t(unsigned int, mtu, IP6_MAX_MTU);
2446
2447	return mtu - lwtunnel_headroom(dst->lwtstate, mtu);
2448}
2449
2450struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
2451				  struct flowi6 *fl6)
2452{
2453	struct dst_entry *dst;
2454	struct rt6_info *rt;
2455	struct inet6_dev *idev = in6_dev_get(dev);
2456	struct net *net = dev_net(dev);
2457
2458	if (unlikely(!idev))
2459		return ERR_PTR(-ENODEV);
2460
2461	rt = ip6_dst_alloc(net, dev, 0);
2462	if (unlikely(!rt)) {
2463		in6_dev_put(idev);
2464		dst = ERR_PTR(-ENOMEM);
2465		goto out;
2466	}
2467
2468	rt->dst.flags |= DST_HOST;
2469	rt->dst.input = ip6_input;
2470	rt->dst.output  = ip6_output;
2471	rt->rt6i_gateway  = fl6->daddr;
2472	rt->rt6i_dst.addr = fl6->daddr;
2473	rt->rt6i_dst.plen = 128;
2474	rt->rt6i_idev     = idev;
2475	dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 0);
2476
2477	/* Add this dst into uncached_list so that rt6_disable_ip() can
2478	 * do proper release of the net_device
2479	 */
2480	rt6_uncached_list_add(rt);
2481	atomic_inc(&net->ipv6.rt6_stats->fib_rt_uncache);
2482
2483	dst = xfrm_lookup(net, &rt->dst, flowi6_to_flowi(fl6), NULL, 0);
2484
2485out:
2486	return dst;
2487}
2488
2489static int ip6_dst_gc(struct dst_ops *ops)
2490{
2491	struct net *net = container_of(ops, struct net, ipv6.ip6_dst_ops);
2492	int rt_min_interval = net->ipv6.sysctl.ip6_rt_gc_min_interval;
2493	int rt_max_size = net->ipv6.sysctl.ip6_rt_max_size;
2494	int rt_elasticity = net->ipv6.sysctl.ip6_rt_gc_elasticity;
2495	int rt_gc_timeout = net->ipv6.sysctl.ip6_rt_gc_timeout;
2496	unsigned long rt_last_gc = net->ipv6.ip6_rt_last_gc;
 
2497	int entries;
2498
2499	entries = dst_entries_get_fast(ops);
2500	if (time_after(rt_last_gc + rt_min_interval, jiffies) &&
2501	    entries <= rt_max_size)
2502		goto out;
2503
2504	net->ipv6.ip6_rt_gc_expire++;
2505	fib6_run_gc(net->ipv6.ip6_rt_gc_expire, net, true);
2506	entries = dst_entries_get_slow(ops);
2507	if (entries < ops->gc_thresh)
2508		net->ipv6.ip6_rt_gc_expire = rt_gc_timeout>>1;
2509out:
2510	net->ipv6.ip6_rt_gc_expire -= net->ipv6.ip6_rt_gc_expire>>rt_elasticity;
2511	return entries > rt_max_size;
2512}
2513
2514static int ip6_convert_metrics(struct mx6_config *mxc,
2515			       const struct fib6_config *cfg)
2516{
2517	struct net *net = cfg->fc_nlinfo.nl_net;
2518	bool ecn_ca = false;
2519	struct nlattr *nla;
2520	int remaining;
2521	u32 *mp;
2522
2523	if (!cfg->fc_mx)
2524		return 0;
2525
2526	mp = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL);
2527	if (unlikely(!mp))
2528		return -ENOMEM;
2529
2530	nla_for_each_attr(nla, cfg->fc_mx, cfg->fc_mx_len, remaining) {
2531		int type = nla_type(nla);
2532		u32 val;
2533
2534		if (!type)
2535			continue;
2536		if (unlikely(type > RTAX_MAX))
2537			goto err;
2538
2539		if (type == RTAX_CC_ALGO) {
2540			char tmp[TCP_CA_NAME_MAX];
2541
2542			nla_strlcpy(tmp, nla, sizeof(tmp));
2543			val = tcp_ca_get_key_by_name(net, tmp, &ecn_ca);
2544			if (val == TCP_CA_UNSPEC)
2545				goto err;
2546		} else {
2547			val = nla_get_u32(nla);
2548		}
2549		if (type == RTAX_HOPLIMIT && val > 255)
2550			val = 255;
2551		if (type == RTAX_FEATURES && (val & ~RTAX_FEATURE_MASK))
2552			goto err;
2553
2554		mp[type - 1] = val;
2555		__set_bit(type - 1, mxc->mx_valid);
2556	}
2557
2558	if (ecn_ca) {
2559		__set_bit(RTAX_FEATURES - 1, mxc->mx_valid);
2560		mp[RTAX_FEATURES - 1] |= DST_FEATURE_ECN_CA;
2561	}
2562
2563	mxc->mx = mp;
2564	return 0;
2565 err:
2566	kfree(mp);
2567	return -EINVAL;
2568}
2569
2570static struct rt6_info *ip6_nh_lookup_table(struct net *net,
2571					    struct fib6_config *cfg,
2572					    const struct in6_addr *gw_addr,
2573					    u32 tbid, int flags)
2574{
2575	struct flowi6 fl6 = {
2576		.flowi6_oif = cfg->fc_ifindex,
2577		.daddr = *gw_addr,
2578		.saddr = cfg->fc_prefsrc,
2579	};
2580	struct fib6_table *table;
2581	struct rt6_info *rt;
2582
2583	table = fib6_get_table(net, tbid);
2584	if (!table)
2585		return NULL;
2586
2587	if (!ipv6_addr_any(&cfg->fc_prefsrc))
2588		flags |= RT6_LOOKUP_F_HAS_SADDR;
2589
2590	flags |= RT6_LOOKUP_F_IGNORE_LINKSTATE;
2591	rt = ip6_pol_route(net, table, cfg->fc_ifindex, &fl6, NULL, flags);
2592
2593	/* if table lookup failed, fall back to full lookup */
2594	if (rt == net->ipv6.ip6_null_entry) {
2595		ip6_rt_put(rt);
2596		rt = NULL;
2597	}
2598
2599	return rt;
2600}
2601
2602static int ip6_route_check_nh_onlink(struct net *net,
2603				     struct fib6_config *cfg,
2604				     const struct net_device *dev,
2605				     struct netlink_ext_ack *extack)
2606{
2607	u32 tbid = l3mdev_fib_table(dev) ? : RT_TABLE_MAIN;
2608	const struct in6_addr *gw_addr = &cfg->fc_gateway;
2609	u32 flags = RTF_LOCAL | RTF_ANYCAST | RTF_REJECT;
2610	struct rt6_info *grt;
2611	int err;
2612
2613	err = 0;
2614	grt = ip6_nh_lookup_table(net, cfg, gw_addr, tbid, 0);
2615	if (grt) {
2616		if (!grt->dst.error &&
2617		    (grt->rt6i_flags & flags || dev != grt->dst.dev)) {
2618			NL_SET_ERR_MSG(extack,
2619				       "Nexthop has invalid gateway or device mismatch");
2620			err = -EINVAL;
2621		}
2622
2623		ip6_rt_put(grt);
2624	}
2625
2626	return err;
2627}
2628
2629static int ip6_route_check_nh(struct net *net,
2630			      struct fib6_config *cfg,
2631			      struct net_device **_dev,
 
2632			      struct inet6_dev **idev)
2633{
2634	const struct in6_addr *gw_addr = &cfg->fc_gateway;
2635	struct net_device *dev = _dev ? *_dev : NULL;
2636	struct rt6_info *grt = NULL;
 
2637	int err = -EHOSTUNREACH;
2638
2639	if (cfg->fc_table) {
2640		int flags = RT6_LOOKUP_F_IFACE;
 
 
 
 
 
 
 
 
 
2641
2642		grt = ip6_nh_lookup_table(net, cfg, gw_addr,
2643					  cfg->fc_table, flags);
2644		if (grt) {
2645			if (grt->rt6i_flags & RTF_GATEWAY ||
2646			    (dev && dev != grt->dst.dev)) {
2647				ip6_rt_put(grt);
2648				grt = NULL;
2649			}
2650		}
2651	}
2652
2653	if (!grt)
2654		grt = rt6_lookup(net, gw_addr, NULL, cfg->fc_ifindex, NULL, 1);
2655
2656	if (!grt)
2657		goto out;
 
2658
 
2659	if (dev) {
2660		if (dev != grt->dst.dev) {
2661			ip6_rt_put(grt);
2662			goto out;
2663		}
2664	} else {
2665		*_dev = dev = grt->dst.dev;
2666		*idev = grt->rt6i_idev;
2667		dev_hold(dev);
2668		in6_dev_hold(grt->rt6i_idev);
2669	}
2670
2671	if (!(grt->rt6i_flags & RTF_GATEWAY))
2672		err = 0;
2673
2674	ip6_rt_put(grt);
2675
2676out:
2677	return err;
2678}
2679
2680static int ip6_validate_gw(struct net *net, struct fib6_config *cfg,
2681			   struct net_device **_dev, struct inet6_dev **idev,
 
 
2682			   struct netlink_ext_ack *extack)
2683{
2684	const struct in6_addr *gw_addr = &cfg->fc_gateway;
2685	int gwa_type = ipv6_addr_type(gw_addr);
2686	bool skip_dev = gwa_type & IPV6_ADDR_LINKLOCAL ? false : true;
2687	const struct net_device *dev = *_dev;
2688	bool need_addr_check = !dev;
2689	int err = -EINVAL;
2690
2691	/* if gw_addr is local we will fail to detect this in case
2692	 * address is still TENTATIVE (DAD in progress). rt6_lookup()
2693	 * will return already-added prefix route via interface that
2694	 * prefix route was assigned to, which might be non-loopback.
2695	 */
2696	if (dev &&
2697	    ipv6_chk_addr_and_flags(net, gw_addr, dev, skip_dev, 0, 0)) {
2698		NL_SET_ERR_MSG(extack, "Gateway can not be a local address");
2699		goto out;
2700	}
2701
2702	if (gwa_type != (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST)) {
2703		/* IPv6 strictly inhibits using not link-local
2704		 * addresses as nexthop address.
2705		 * Otherwise, router will not able to send redirects.
2706		 * It is very good, but in some (rare!) circumstances
2707		 * (SIT, PtP, NBMA NOARP links) it is handy to allow
2708		 * some exceptions. --ANK
2709		 * We allow IPv4-mapped nexthops to support RFC4798-type
2710		 * addressing
2711		 */
2712		if (!(gwa_type & (IPV6_ADDR_UNICAST | IPV6_ADDR_MAPPED))) {
2713			NL_SET_ERR_MSG(extack, "Invalid gateway address");
2714			goto out;
2715		}
2716
 
 
2717		if (cfg->fc_flags & RTNH_F_ONLINK)
2718			err = ip6_route_check_nh_onlink(net, cfg, dev, extack);
2719		else
2720			err = ip6_route_check_nh(net, cfg, _dev, idev);
 
 
 
2721
2722		if (err)
2723			goto out;
2724	}
2725
2726	/* reload in case device was changed */
2727	dev = *_dev;
2728
2729	err = -EINVAL;
2730	if (!dev) {
2731		NL_SET_ERR_MSG(extack, "Egress device not specified");
2732		goto out;
2733	} else if (dev->flags & IFF_LOOPBACK) {
2734		NL_SET_ERR_MSG(extack,
2735			       "Egress device can not be loopback device for this route");
2736		goto out;
2737	}
2738
2739	/* if we did not check gw_addr above, do so now that the
2740	 * egress device has been resolved.
2741	 */
2742	if (need_addr_check &&
2743	    ipv6_chk_addr_and_flags(net, gw_addr, dev, skip_dev, 0, 0)) {
2744		NL_SET_ERR_MSG(extack, "Gateway can not be a local address");
2745		goto out;
2746	}
2747
2748	err = 0;
2749out:
2750	return err;
2751}
2752
2753static struct rt6_info *ip6_route_info_create(struct fib6_config *cfg,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2754					      struct netlink_ext_ack *extack)
2755{
2756	struct net *net = cfg->fc_nlinfo.nl_net;
2757	struct rt6_info *rt = NULL;
2758	struct net_device *dev = NULL;
2759	struct inet6_dev *idev = NULL;
2760	struct fib6_table *table;
 
 
2761	int addr_type;
2762	int err = -EINVAL;
2763
2764	/* RTF_PCPU is an internal flag; can not be set by userspace */
2765	if (cfg->fc_flags & RTF_PCPU) {
2766		NL_SET_ERR_MSG(extack, "Userspace can not set RTF_PCPU");
2767		goto out;
2768	}
2769
2770	/* RTF_CACHE is an internal flag; can not be set by userspace */
2771	if (cfg->fc_flags & RTF_CACHE) {
2772		NL_SET_ERR_MSG(extack, "Userspace can not set RTF_CACHE");
2773		goto out;
2774	}
2775
 
 
 
 
 
2776	if (cfg->fc_dst_len > 128) {
2777		NL_SET_ERR_MSG(extack, "Invalid prefix length");
2778		goto out;
2779	}
2780	if (cfg->fc_src_len > 128) {
2781		NL_SET_ERR_MSG(extack, "Invalid source address length");
2782		goto out;
2783	}
2784#ifndef CONFIG_IPV6_SUBTREES
2785	if (cfg->fc_src_len) {
2786		NL_SET_ERR_MSG(extack,
2787			       "Specifying source address requires IPV6_SUBTREES to be enabled");
2788		goto out;
2789	}
2790#endif
2791	if (cfg->fc_ifindex) {
2792		err = -ENODEV;
2793		dev = dev_get_by_index(net, cfg->fc_ifindex);
2794		if (!dev)
2795			goto out;
2796		idev = in6_dev_get(dev);
2797		if (!idev)
2798			goto out;
2799	}
2800
2801	if (cfg->fc_metric == 0)
2802		cfg->fc_metric = IP6_RT_PRIO_USER;
2803
2804	if (cfg->fc_flags & RTNH_F_ONLINK) {
2805		if (!dev) {
2806			NL_SET_ERR_MSG(extack,
2807				       "Nexthop device required for onlink");
2808			err = -ENODEV;
2809			goto out;
2810		}
2811
2812		if (!(dev->flags & IFF_UP)) {
2813			NL_SET_ERR_MSG(extack, "Nexthop device is not up");
2814			err = -ENETDOWN;
2815			goto out;
2816		}
2817	}
2818
2819	err = -ENOBUFS;
2820	if (cfg->fc_nlinfo.nlh &&
2821	    !(cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_CREATE)) {
2822		table = fib6_get_table(net, cfg->fc_table);
2823		if (!table) {
2824			pr_warn("NLM_F_CREATE should be specified when creating new route\n");
2825			table = fib6_new_table(net, cfg->fc_table);
2826		}
2827	} else {
2828		table = fib6_new_table(net, cfg->fc_table);
2829	}
2830
2831	if (!table)
2832		goto out;
2833
2834	rt = ip6_dst_alloc(net, NULL,
2835			   (cfg->fc_flags & RTF_ADDRCONF) ? 0 : DST_NOCOUNT);
 
 
2836
2837	if (!rt) {
2838		err = -ENOMEM;
2839		goto out;
 
 
 
 
2840	}
2841
 
 
 
2842	if (cfg->fc_flags & RTF_EXPIRES)
2843		rt6_set_expires(rt, jiffies +
2844				clock_t_to_jiffies(cfg->fc_expires));
2845	else
2846		rt6_clean_expires(rt);
2847
2848	if (cfg->fc_protocol == RTPROT_UNSPEC)
2849		cfg->fc_protocol = RTPROT_BOOT;
2850	rt->rt6i_protocol = cfg->fc_protocol;
2851
2852	addr_type = ipv6_addr_type(&cfg->fc_dst);
 
 
 
2853
2854	if (addr_type & IPV6_ADDR_MULTICAST)
2855		rt->dst.input = ip6_mc_input;
2856	else if (cfg->fc_flags & RTF_LOCAL)
2857		rt->dst.input = ip6_input;
2858	else
2859		rt->dst.input = ip6_forward;
2860
2861	rt->dst.output = ip6_output;
2862
2863	if (cfg->fc_encap) {
2864		struct lwtunnel_state *lwtstate;
2865
2866		err = lwtunnel_build_state(cfg->fc_encap_type,
2867					   cfg->fc_encap, AF_INET6, cfg,
2868					   &lwtstate, extack);
2869		if (err)
2870			goto out;
2871		rt->dst.lwtstate = lwtstate_get(lwtstate);
2872		lwtunnel_set_redirect(&rt->dst);
2873	}
2874
2875	ipv6_addr_prefix(&rt->rt6i_dst.addr, &cfg->fc_dst, cfg->fc_dst_len);
2876	rt->rt6i_dst.plen = cfg->fc_dst_len;
2877	if (rt->rt6i_dst.plen == 128)
2878		rt->dst.flags |= DST_HOST;
2879
2880#ifdef CONFIG_IPV6_SUBTREES
2881	ipv6_addr_prefix(&rt->rt6i_src.addr, &cfg->fc_src, cfg->fc_src_len);
2882	rt->rt6i_src.plen = cfg->fc_src_len;
2883#endif
2884
2885	rt->rt6i_metric = cfg->fc_metric;
2886	rt->rt6i_nh_weight = 1;
2887
2888	/* We cannot add true routes via loopback here,
2889	   they would result in kernel looping; promote them to reject routes
2890	 */
2891	if ((cfg->fc_flags & RTF_REJECT) ||
2892	    (dev && (dev->flags & IFF_LOOPBACK) &&
2893	     !(addr_type & IPV6_ADDR_LOOPBACK) &&
2894	     !(cfg->fc_flags & RTF_LOCAL))) {
2895		/* hold loopback dev/idev if we haven't done so. */
2896		if (dev != net->loopback_dev) {
2897			if (dev) {
2898				dev_put(dev);
2899				in6_dev_put(idev);
2900			}
2901			dev = net->loopback_dev;
2902			dev_hold(dev);
2903			idev = in6_dev_get(dev);
2904			if (!idev) {
2905				err = -ENODEV;
2906				goto out;
2907			}
2908		}
2909		rt->rt6i_flags = RTF_REJECT|RTF_NONEXTHOP;
2910		switch (cfg->fc_type) {
2911		case RTN_BLACKHOLE:
2912			rt->dst.error = -EINVAL;
2913			rt->dst.output = dst_discard_out;
2914			rt->dst.input = dst_discard;
2915			break;
2916		case RTN_PROHIBIT:
2917			rt->dst.error = -EACCES;
2918			rt->dst.output = ip6_pkt_prohibit_out;
2919			rt->dst.input = ip6_pkt_prohibit;
2920			break;
2921		case RTN_THROW:
2922		case RTN_UNREACHABLE:
2923		default:
2924			rt->dst.error = (cfg->fc_type == RTN_THROW) ? -EAGAIN
2925					: (cfg->fc_type == RTN_UNREACHABLE)
2926					? -EHOSTUNREACH : -ENETUNREACH;
2927			rt->dst.output = ip6_pkt_discard_out;
2928			rt->dst.input = ip6_pkt_discard;
2929			break;
2930		}
2931		goto install_route;
2932	}
2933
2934	if (cfg->fc_flags & RTF_GATEWAY) {
2935		err = ip6_validate_gw(net, cfg, &dev, &idev, extack);
2936		if (err)
2937			goto out;
2938
2939		rt->rt6i_gateway = cfg->fc_gateway;
2940	}
2941
2942	err = -ENODEV;
2943	if (!dev)
2944		goto out;
2945
2946	if (idev->cnf.disable_ipv6) {
2947		NL_SET_ERR_MSG(extack, "IPv6 is disabled on nexthop device");
2948		err = -EACCES;
2949		goto out;
2950	}
2951
2952	if (!(dev->flags & IFF_UP)) {
2953		NL_SET_ERR_MSG(extack, "Nexthop device is not up");
2954		err = -ENETDOWN;
2955		goto out;
2956	}
2957
2958	if (!ipv6_addr_any(&cfg->fc_prefsrc)) {
2959		if (!ipv6_chk_addr(net, &cfg->fc_prefsrc, dev, 0)) {
2960			NL_SET_ERR_MSG(extack, "Invalid source address");
2961			err = -EINVAL;
2962			goto out;
2963		}
2964		rt->rt6i_prefsrc.addr = cfg->fc_prefsrc;
2965		rt->rt6i_prefsrc.plen = 128;
2966	} else
2967		rt->rt6i_prefsrc.plen = 0;
2968
2969	rt->rt6i_flags = cfg->fc_flags;
2970
2971install_route:
2972	if (!(rt->rt6i_flags & (RTF_LOCAL | RTF_ANYCAST)) &&
2973	    !netif_carrier_ok(dev))
2974		rt->rt6i_nh_flags |= RTNH_F_LINKDOWN;
2975	rt->rt6i_nh_flags |= (cfg->fc_flags & RTNH_F_ONLINK);
2976	rt->dst.dev = dev;
2977	rt->rt6i_idev = idev;
2978	rt->rt6i_table = table;
2979
2980	cfg->fc_nlinfo.nl_net = dev_net(dev);
2981
2982	return rt;
2983out:
2984	if (dev)
2985		dev_put(dev);
2986	if (idev)
2987		in6_dev_put(idev);
2988	if (rt)
2989		dst_release_immediate(&rt->dst);
2990
2991	return ERR_PTR(err);
2992}
2993
2994int ip6_route_add(struct fib6_config *cfg,
2995		  struct netlink_ext_ack *extack)
2996{
2997	struct mx6_config mxc = { .mx = NULL, };
2998	struct rt6_info *rt;
2999	int err;
3000
3001	rt = ip6_route_info_create(cfg, extack);
3002	if (IS_ERR(rt)) {
3003		err = PTR_ERR(rt);
3004		rt = NULL;
3005		goto out;
3006	}
3007
3008	err = ip6_convert_metrics(&mxc, cfg);
3009	if (err)
3010		goto out;
3011
3012	err = __ip6_ins_rt(rt, &cfg->fc_nlinfo, &mxc, extack);
3013
3014	kfree(mxc.mx);
3015
3016	return err;
3017out:
3018	if (rt)
3019		dst_release_immediate(&rt->dst);
3020
3021	return err;
3022}
3023
3024static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info)
3025{
 
 
3026	int err;
3027	struct fib6_table *table;
3028	struct net *net = dev_net(rt->dst.dev);
3029
3030	if (rt == net->ipv6.ip6_null_entry) {
3031		err = -ENOENT;
3032		goto out;
3033	}
3034
3035	table = rt->rt6i_table;
3036	spin_lock_bh(&table->tb6_lock);
3037	err = fib6_del(rt, info);
3038	spin_unlock_bh(&table->tb6_lock);
3039
3040out:
3041	ip6_rt_put(rt);
3042	return err;
3043}
3044
3045int ip6_del_rt(struct rt6_info *rt)
3046{
3047	struct nl_info info = {
3048		.nl_net = dev_net(rt->dst.dev),
 
3049	};
 
3050	return __ip6_del_rt(rt, &info);
3051}
3052
3053static int __ip6_del_rt_siblings(struct rt6_info *rt, struct fib6_config *cfg)
3054{
3055	struct nl_info *info = &cfg->fc_nlinfo;
3056	struct net *net = info->nl_net;
3057	struct sk_buff *skb = NULL;
3058	struct fib6_table *table;
3059	int err = -ENOENT;
3060
3061	if (rt == net->ipv6.ip6_null_entry)
3062		goto out_put;
3063	table = rt->rt6i_table;
3064	spin_lock_bh(&table->tb6_lock);
3065
3066	if (rt->rt6i_nsiblings && cfg->fc_delete_all_nh) {
3067		struct rt6_info *sibling, *next_sibling;
 
3068
3069		/* prefer to send a single notification with all hops */
3070		skb = nlmsg_new(rt6_nlmsg_size(rt), gfp_any());
3071		if (skb) {
3072			u32 seq = info->nlh ? info->nlh->nlmsg_seq : 0;
3073
3074			if (rt6_fill_node(net, skb, rt,
3075					  NULL, NULL, 0, RTM_DELROUTE,
3076					  info->portid, seq, 0) < 0) {
3077				kfree_skb(skb);
3078				skb = NULL;
3079			} else
3080				info->skip_notify = 1;
3081		}
3082
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3083		list_for_each_entry_safe(sibling, next_sibling,
3084					 &rt->rt6i_siblings,
3085					 rt6i_siblings) {
3086			err = fib6_del(sibling, info);
3087			if (err)
3088				goto out_unlock;
3089		}
3090	}
3091
3092	err = fib6_del(rt, info);
3093out_unlock:
3094	spin_unlock_bh(&table->tb6_lock);
3095out_put:
3096	ip6_rt_put(rt);
3097
3098	if (skb) {
3099		rtnl_notify(skb, net, info->portid, RTNLGRP_IPV6_ROUTE,
3100			    info->nlh, gfp_any());
3101	}
3102	return err;
3103}
3104
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3105static int ip6_route_del(struct fib6_config *cfg,
3106			 struct netlink_ext_ack *extack)
3107{
3108	struct rt6_info *rt, *rt_cache;
3109	struct fib6_table *table;
 
3110	struct fib6_node *fn;
3111	int err = -ESRCH;
3112
3113	table = fib6_get_table(cfg->fc_nlinfo.nl_net, cfg->fc_table);
3114	if (!table) {
3115		NL_SET_ERR_MSG(extack, "FIB table does not exist");
3116		return err;
3117	}
3118
3119	rcu_read_lock();
3120
3121	fn = fib6_locate(&table->tb6_root,
3122			 &cfg->fc_dst, cfg->fc_dst_len,
3123			 &cfg->fc_src, cfg->fc_src_len,
3124			 !(cfg->fc_flags & RTF_CACHE));
3125
3126	if (fn) {
3127		for_each_fib6_node_rt_rcu(fn) {
 
 
 
 
 
 
3128			if (cfg->fc_flags & RTF_CACHE) {
3129				rt_cache = rt6_find_cached_rt(rt, &cfg->fc_dst,
3130							      &cfg->fc_src);
3131				if (!rt_cache)
 
 
3132					continue;
3133				rt = rt_cache;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3134			}
 
 
 
 
3135			if (cfg->fc_ifindex &&
3136			    (!rt->dst.dev ||
3137			     rt->dst.dev->ifindex != cfg->fc_ifindex))
3138				continue;
3139			if (cfg->fc_flags & RTF_GATEWAY &&
3140			    !ipv6_addr_equal(&cfg->fc_gateway, &rt->rt6i_gateway))
3141				continue;
3142			if (cfg->fc_metric && cfg->fc_metric != rt->rt6i_metric)
3143				continue;
3144			if (cfg->fc_protocol && cfg->fc_protocol != rt->rt6i_protocol)
3145				continue;
3146			if (!dst_hold_safe(&rt->dst))
3147				break;
3148			rcu_read_unlock();
3149
3150			/* if gateway was specified only delete the one hop */
3151			if (cfg->fc_flags & RTF_GATEWAY)
3152				return __ip6_del_rt(rt, &cfg->fc_nlinfo);
3153
3154			return __ip6_del_rt_siblings(rt, cfg);
3155		}
3156	}
3157	rcu_read_unlock();
3158
3159	return err;
3160}
3161
3162static void rt6_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_buff *skb)
3163{
3164	struct netevent_redirect netevent;
3165	struct rt6_info *rt, *nrt = NULL;
 
3166	struct ndisc_options ndopts;
3167	struct inet6_dev *in6_dev;
3168	struct neighbour *neigh;
3169	struct rd_msg *msg;
3170	int optlen, on_link;
3171	u8 *lladdr;
3172
3173	optlen = skb_tail_pointer(skb) - skb_transport_header(skb);
3174	optlen -= sizeof(*msg);
3175
3176	if (optlen < 0) {
3177		net_dbg_ratelimited("rt6_do_redirect: packet too short\n");
3178		return;
3179	}
3180
3181	msg = (struct rd_msg *)icmp6_hdr(skb);
3182
3183	if (ipv6_addr_is_multicast(&msg->dest)) {
3184		net_dbg_ratelimited("rt6_do_redirect: destination address is multicast\n");
3185		return;
3186	}
3187
3188	on_link = 0;
3189	if (ipv6_addr_equal(&msg->dest, &msg->target)) {
3190		on_link = 1;
3191	} else if (ipv6_addr_type(&msg->target) !=
3192		   (IPV6_ADDR_UNICAST|IPV6_ADDR_LINKLOCAL)) {
3193		net_dbg_ratelimited("rt6_do_redirect: target address is not link-local unicast\n");
3194		return;
3195	}
3196
3197	in6_dev = __in6_dev_get(skb->dev);
3198	if (!in6_dev)
3199		return;
3200	if (in6_dev->cnf.forwarding || !in6_dev->cnf.accept_redirects)
 
3201		return;
3202
3203	/* RFC2461 8.1:
3204	 *	The IP source address of the Redirect MUST be the same as the current
3205	 *	first-hop router for the specified ICMP Destination Address.
3206	 */
3207
3208	if (!ndisc_parse_options(skb->dev, msg->opt, optlen, &ndopts)) {
3209		net_dbg_ratelimited("rt6_redirect: invalid ND options\n");
3210		return;
3211	}
3212
3213	lladdr = NULL;
3214	if (ndopts.nd_opts_tgt_lladdr) {
3215		lladdr = ndisc_opt_addr_data(ndopts.nd_opts_tgt_lladdr,
3216					     skb->dev);
3217		if (!lladdr) {
3218			net_dbg_ratelimited("rt6_redirect: invalid link-layer address length\n");
3219			return;
3220		}
3221	}
3222
3223	rt = (struct rt6_info *) dst;
3224	if (rt->rt6i_flags & RTF_REJECT) {
3225		net_dbg_ratelimited("rt6_redirect: source isn't a valid nexthop for redirect target\n");
3226		return;
3227	}
3228
3229	/* Redirect received -> path was valid.
3230	 * Look, redirects are sent only in response to data packets,
3231	 * so that this nexthop apparently is reachable. --ANK
3232	 */
3233	dst_confirm_neigh(&rt->dst, &ipv6_hdr(skb)->saddr);
3234
3235	neigh = __neigh_lookup(&nd_tbl, &msg->target, skb->dev, 1);
3236	if (!neigh)
3237		return;
3238
3239	/*
3240	 *	We have finally decided to accept it.
3241	 */
3242
3243	ndisc_update(skb->dev, neigh, lladdr, NUD_STALE,
3244		     NEIGH_UPDATE_F_WEAK_OVERRIDE|
3245		     NEIGH_UPDATE_F_OVERRIDE|
3246		     (on_link ? 0 : (NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
3247				     NEIGH_UPDATE_F_ISROUTER)),
3248		     NDISC_REDIRECT, &ndopts);
3249
3250	nrt = ip6_rt_cache_alloc(rt, &msg->dest, NULL);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3251	if (!nrt)
3252		goto out;
3253
3254	nrt->rt6i_flags = RTF_GATEWAY|RTF_UP|RTF_DYNAMIC|RTF_CACHE;
3255	if (on_link)
3256		nrt->rt6i_flags &= ~RTF_GATEWAY;
3257
3258	nrt->rt6i_protocol = RTPROT_REDIRECT;
3259	nrt->rt6i_gateway = *(struct in6_addr *)neigh->primary_key;
3260
3261	/* No need to remove rt from the exception table if rt is
3262	 * a cached route because rt6_insert_exception() will
3263	 * takes care of it
3264	 */
3265	if (rt6_insert_exception(nrt, rt)) {
3266		dst_release_immediate(&nrt->dst);
3267		goto out;
3268	}
3269
3270	netevent.old = &rt->dst;
3271	netevent.new = &nrt->dst;
3272	netevent.daddr = &msg->dest;
3273	netevent.neigh = neigh;
3274	call_netevent_notifiers(NETEVENT_REDIRECT, &netevent);
3275
3276out:
 
3277	neigh_release(neigh);
3278}
3279
3280/*
3281 *	Misc support functions
3282 */
3283
3284static void rt6_set_from(struct rt6_info *rt, struct rt6_info *from)
3285{
3286	BUG_ON(from->from);
3287
3288	rt->rt6i_flags &= ~RTF_EXPIRES;
3289	dst_hold(&from->dst);
3290	rt->from = from;
3291	dst_init_metrics(&rt->dst, dst_metrics_ptr(&from->dst), true);
3292}
3293
3294static void ip6_rt_copy_init(struct rt6_info *rt, struct rt6_info *ort)
3295{
3296	rt->dst.input = ort->dst.input;
3297	rt->dst.output = ort->dst.output;
3298	rt->rt6i_dst = ort->rt6i_dst;
3299	rt->dst.error = ort->dst.error;
3300	rt->rt6i_idev = ort->rt6i_idev;
3301	if (rt->rt6i_idev)
3302		in6_dev_hold(rt->rt6i_idev);
3303	rt->dst.lastuse = jiffies;
3304	rt->rt6i_gateway = ort->rt6i_gateway;
3305	rt->rt6i_flags = ort->rt6i_flags;
3306	rt6_set_from(rt, ort);
3307	rt->rt6i_metric = ort->rt6i_metric;
3308#ifdef CONFIG_IPV6_SUBTREES
3309	rt->rt6i_src = ort->rt6i_src;
3310#endif
3311	rt->rt6i_prefsrc = ort->rt6i_prefsrc;
3312	rt->rt6i_table = ort->rt6i_table;
3313	rt->dst.lwtstate = lwtstate_get(ort->dst.lwtstate);
3314}
3315
3316#ifdef CONFIG_IPV6_ROUTE_INFO
3317static struct rt6_info *rt6_get_route_info(struct net *net,
3318					   const struct in6_addr *prefix, int prefixlen,
3319					   const struct in6_addr *gwaddr,
3320					   struct net_device *dev)
3321{
3322	u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_INFO;
3323	int ifindex = dev->ifindex;
3324	struct fib6_node *fn;
3325	struct rt6_info *rt = NULL;
3326	struct fib6_table *table;
3327
3328	table = fib6_get_table(net, tb_id);
3329	if (!table)
3330		return NULL;
3331
3332	rcu_read_lock();
3333	fn = fib6_locate(&table->tb6_root, prefix, prefixlen, NULL, 0, true);
3334	if (!fn)
3335		goto out;
3336
3337	for_each_fib6_node_rt_rcu(fn) {
3338		if (rt->dst.dev->ifindex != ifindex)
 
 
 
 
 
 
3339			continue;
3340		if ((rt->rt6i_flags & (RTF_ROUTEINFO|RTF_GATEWAY)) != (RTF_ROUTEINFO|RTF_GATEWAY))
3341			continue;
3342		if (!ipv6_addr_equal(&rt->rt6i_gateway, gwaddr))
3343			continue;
3344		ip6_hold_safe(NULL, &rt, false);
3345		break;
3346	}
3347out:
3348	rcu_read_unlock();
3349	return rt;
3350}
3351
3352static struct rt6_info *rt6_add_route_info(struct net *net,
3353					   const struct in6_addr *prefix, int prefixlen,
3354					   const struct in6_addr *gwaddr,
3355					   struct net_device *dev,
3356					   unsigned int pref)
3357{
3358	struct fib6_config cfg = {
3359		.fc_metric	= IP6_RT_PRIO_USER,
3360		.fc_ifindex	= dev->ifindex,
3361		.fc_dst_len	= prefixlen,
3362		.fc_flags	= RTF_GATEWAY | RTF_ADDRCONF | RTF_ROUTEINFO |
3363				  RTF_UP | RTF_PREF(pref),
3364		.fc_protocol = RTPROT_RA,
 
3365		.fc_nlinfo.portid = 0,
3366		.fc_nlinfo.nlh = NULL,
3367		.fc_nlinfo.nl_net = net,
3368	};
3369
3370	cfg.fc_table = l3mdev_fib_table(dev) ? : RT6_TABLE_INFO,
3371	cfg.fc_dst = *prefix;
3372	cfg.fc_gateway = *gwaddr;
3373
3374	/* We should treat it as a default route if prefix length is 0. */
3375	if (!prefixlen)
3376		cfg.fc_flags |= RTF_DEFAULT;
3377
3378	ip6_route_add(&cfg, NULL);
3379
3380	return rt6_get_route_info(net, prefix, prefixlen, gwaddr, dev);
3381}
3382#endif
3383
3384struct rt6_info *rt6_get_dflt_router(const struct in6_addr *addr, struct net_device *dev)
 
 
3385{
3386	u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_DFLT;
3387	struct rt6_info *rt;
3388	struct fib6_table *table;
3389
3390	table = fib6_get_table(dev_net(dev), tb_id);
3391	if (!table)
3392		return NULL;
3393
3394	rcu_read_lock();
3395	for_each_fib6_node_rt_rcu(&table->tb6_root) {
3396		if (dev == rt->dst.dev &&
3397		    ((rt->rt6i_flags & (RTF_ADDRCONF | RTF_DEFAULT)) == (RTF_ADDRCONF | RTF_DEFAULT)) &&
3398		    ipv6_addr_equal(&rt->rt6i_gateway, addr))
 
 
 
 
 
 
 
3399			break;
3400	}
3401	if (rt)
3402		ip6_hold_safe(NULL, &rt, false);
3403	rcu_read_unlock();
3404	return rt;
3405}
3406
3407struct rt6_info *rt6_add_dflt_router(const struct in6_addr *gwaddr,
 
3408				     struct net_device *dev,
3409				     unsigned int pref)
 
 
3410{
3411	struct fib6_config cfg = {
3412		.fc_table	= l3mdev_fib_table(dev) ? : RT6_TABLE_DFLT,
3413		.fc_metric	= IP6_RT_PRIO_USER,
3414		.fc_ifindex	= dev->ifindex,
3415		.fc_flags	= RTF_GATEWAY | RTF_ADDRCONF | RTF_DEFAULT |
3416				  RTF_UP | RTF_EXPIRES | RTF_PREF(pref),
3417		.fc_protocol = RTPROT_RA,
 
3418		.fc_nlinfo.portid = 0,
3419		.fc_nlinfo.nlh = NULL,
3420		.fc_nlinfo.nl_net = dev_net(dev),
 
3421	};
3422
3423	cfg.fc_gateway = *gwaddr;
3424
3425	if (!ip6_route_add(&cfg, NULL)) {
3426		struct fib6_table *table;
3427
3428		table = fib6_get_table(dev_net(dev), cfg.fc_table);
3429		if (table)
3430			table->flags |= RT6_TABLE_HAS_DFLT_ROUTER;
3431	}
3432
3433	return rt6_get_dflt_router(gwaddr, dev);
3434}
3435
3436static void __rt6_purge_dflt_routers(struct fib6_table *table)
 
3437{
3438	struct rt6_info *rt;
3439
3440restart:
3441	rcu_read_lock();
3442	for_each_fib6_node_rt_rcu(&table->tb6_root) {
3443		if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF) &&
3444		    (!rt->rt6i_idev || rt->rt6i_idev->cnf.accept_ra != 2)) {
3445			if (dst_hold_safe(&rt->dst)) {
3446				rcu_read_unlock();
3447				ip6_del_rt(rt);
3448			} else {
3449				rcu_read_unlock();
3450			}
3451			goto restart;
3452		}
3453	}
3454	rcu_read_unlock();
3455
3456	table->flags &= ~RT6_TABLE_HAS_DFLT_ROUTER;
3457}
3458
3459void rt6_purge_dflt_routers(struct net *net)
3460{
3461	struct fib6_table *table;
3462	struct hlist_head *head;
3463	unsigned int h;
3464
3465	rcu_read_lock();
3466
3467	for (h = 0; h < FIB6_TABLE_HASHSZ; h++) {
3468		head = &net->ipv6.fib_table_hash[h];
3469		hlist_for_each_entry_rcu(table, head, tb6_hlist) {
3470			if (table->flags & RT6_TABLE_HAS_DFLT_ROUTER)
3471				__rt6_purge_dflt_routers(table);
3472		}
3473	}
3474
3475	rcu_read_unlock();
3476}
3477
3478static void rtmsg_to_fib6_config(struct net *net,
3479				 struct in6_rtmsg *rtmsg,
3480				 struct fib6_config *cfg)
3481{
3482	memset(cfg, 0, sizeof(*cfg));
 
 
 
 
 
 
 
 
 
3483
3484	cfg->fc_table = l3mdev_fib_table_by_index(net, rtmsg->rtmsg_ifindex) ?
3485			 : RT6_TABLE_MAIN;
3486	cfg->fc_ifindex = rtmsg->rtmsg_ifindex;
3487	cfg->fc_metric = rtmsg->rtmsg_metric;
3488	cfg->fc_expires = rtmsg->rtmsg_info;
3489	cfg->fc_dst_len = rtmsg->rtmsg_dst_len;
3490	cfg->fc_src_len = rtmsg->rtmsg_src_len;
3491	cfg->fc_flags = rtmsg->rtmsg_flags;
3492
3493	cfg->fc_nlinfo.nl_net = net;
3494
3495	cfg->fc_dst = rtmsg->rtmsg_dst;
3496	cfg->fc_src = rtmsg->rtmsg_src;
3497	cfg->fc_gateway = rtmsg->rtmsg_gateway;
3498}
3499
3500int ipv6_route_ioctl(struct net *net, unsigned int cmd, void __user *arg)
3501{
3502	struct fib6_config cfg;
3503	struct in6_rtmsg rtmsg;
3504	int err;
3505
3506	switch (cmd) {
3507	case SIOCADDRT:		/* Add a route */
3508	case SIOCDELRT:		/* Delete a route */
3509		if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
3510			return -EPERM;
3511		err = copy_from_user(&rtmsg, arg,
3512				     sizeof(struct in6_rtmsg));
3513		if (err)
3514			return -EFAULT;
3515
3516		rtmsg_to_fib6_config(net, &rtmsg, &cfg);
3517
3518		rtnl_lock();
3519		switch (cmd) {
3520		case SIOCADDRT:
3521			err = ip6_route_add(&cfg, NULL);
3522			break;
3523		case SIOCDELRT:
3524			err = ip6_route_del(&cfg, NULL);
3525			break;
3526		default:
3527			err = -EINVAL;
3528		}
3529		rtnl_unlock();
3530
3531		return err;
3532	}
3533
3534	return -EINVAL;
3535}
3536
3537/*
3538 *	Drop the packet on the floor
3539 */
3540
3541static int ip6_pkt_drop(struct sk_buff *skb, u8 code, int ipstats_mib_noroutes)
3542{
 
 
 
 
3543	int type;
3544	struct dst_entry *dst = skb_dst(skb);
 
 
 
 
 
 
3545	switch (ipstats_mib_noroutes) {
3546	case IPSTATS_MIB_INNOROUTES:
3547		type = ipv6_addr_type(&ipv6_hdr(skb)->daddr);
3548		if (type == IPV6_ADDR_ANY) {
3549			IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst),
3550				      IPSTATS_MIB_INADDRERRORS);
3551			break;
3552		}
3553		/* FALLTHROUGH */
 
3554	case IPSTATS_MIB_OUTNOROUTES:
3555		IP6_INC_STATS(dev_net(dst->dev), ip6_dst_idev(dst),
3556			      ipstats_mib_noroutes);
3557		break;
3558	}
 
 
 
 
 
3559	icmpv6_send(skb, ICMPV6_DEST_UNREACH, code, 0);
3560	kfree_skb(skb);
3561	return 0;
3562}
3563
3564static int ip6_pkt_discard(struct sk_buff *skb)
3565{
3566	return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_INNOROUTES);
3567}
3568
3569static int ip6_pkt_discard_out(struct net *net, struct sock *sk, struct sk_buff *skb)
3570{
3571	skb->dev = skb_dst(skb)->dev;
3572	return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_OUTNOROUTES);
3573}
3574
3575static int ip6_pkt_prohibit(struct sk_buff *skb)
3576{
3577	return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_INNOROUTES);
3578}
3579
3580static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff *skb)
3581{
3582	skb->dev = skb_dst(skb)->dev;
3583	return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
3584}
3585
3586/*
3587 *	Allocate a dst for local (unicast / anycast) address.
3588 */
3589
3590struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
3591				    const struct in6_addr *addr,
3592				    bool anycast)
3593{
3594	u32 tb_id;
3595	struct net *net = dev_net(idev->dev);
3596	struct net_device *dev = idev->dev;
3597	struct rt6_info *rt;
 
 
 
 
 
 
 
 
 
3598
3599	rt = ip6_dst_alloc(net, dev, DST_NOCOUNT);
3600	if (!rt)
3601		return ERR_PTR(-ENOMEM);
 
 
 
 
3602
3603	in6_dev_hold(idev);
 
 
3604
3605	rt->dst.flags |= DST_HOST;
3606	rt->dst.input = ip6_input;
3607	rt->dst.output = ip6_output;
3608	rt->rt6i_idev = idev;
 
3609
3610	rt->rt6i_protocol = RTPROT_KERNEL;
3611	rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP;
3612	if (anycast)
3613		rt->rt6i_flags |= RTF_ANYCAST;
3614	else
3615		rt->rt6i_flags |= RTF_LOCAL;
3616
3617	rt->rt6i_gateway  = *addr;
3618	rt->rt6i_dst.addr = *addr;
3619	rt->rt6i_dst.plen = 128;
3620	tb_id = l3mdev_fib_table(idev->dev) ? : RT6_TABLE_LOCAL;
3621	rt->rt6i_table = fib6_get_table(net, tb_id);
3622
3623	return rt;
3624}
3625
3626/* remove deleted ip from prefsrc entries */
3627struct arg_dev_net_ip {
3628	struct net_device *dev;
3629	struct net *net;
3630	struct in6_addr *addr;
3631};
3632
3633static int fib6_remove_prefsrc(struct rt6_info *rt, void *arg)
3634{
3635	struct net_device *dev = ((struct arg_dev_net_ip *)arg)->dev;
3636	struct net *net = ((struct arg_dev_net_ip *)arg)->net;
3637	struct in6_addr *addr = ((struct arg_dev_net_ip *)arg)->addr;
3638
3639	if (((void *)rt->dst.dev == dev || !dev) &&
3640	    rt != net->ipv6.ip6_null_entry &&
3641	    ipv6_addr_equal(addr, &rt->rt6i_prefsrc.addr)) {
 
3642		spin_lock_bh(&rt6_exception_lock);
3643		/* remove prefsrc entry */
3644		rt->rt6i_prefsrc.plen = 0;
3645		/* need to update cache as well */
3646		rt6_exceptions_remove_prefsrc(rt);
3647		spin_unlock_bh(&rt6_exception_lock);
3648	}
3649	return 0;
3650}
3651
3652void rt6_remove_prefsrc(struct inet6_ifaddr *ifp)
3653{
3654	struct net *net = dev_net(ifp->idev->dev);
3655	struct arg_dev_net_ip adni = {
3656		.dev = ifp->idev->dev,
3657		.net = net,
3658		.addr = &ifp->addr,
3659	};
3660	fib6_clean_all(net, fib6_remove_prefsrc, &adni);
3661}
3662
3663#define RTF_RA_ROUTER		(RTF_ADDRCONF | RTF_DEFAULT | RTF_GATEWAY)
3664
3665/* Remove routers and update dst entries when gateway turn into host. */
3666static int fib6_clean_tohost(struct rt6_info *rt, void *arg)
3667{
3668	struct in6_addr *gateway = (struct in6_addr *)arg;
 
3669
3670	if (((rt->rt6i_flags & RTF_RA_ROUTER) == RTF_RA_ROUTER) &&
3671	    ipv6_addr_equal(gateway, &rt->rt6i_gateway)) {
 
 
 
 
 
3672		return -1;
3673	}
3674
3675	/* Further clean up cached routes in exception table.
3676	 * This is needed because cached route may have a different
3677	 * gateway than its 'parent' in the case of an ip redirect.
3678	 */
3679	rt6_exceptions_clean_tohost(rt, gateway);
3680
3681	return 0;
3682}
3683
3684void rt6_clean_tohost(struct net *net, struct in6_addr *gateway)
3685{
3686	fib6_clean_all(net, fib6_clean_tohost, gateway);
3687}
3688
3689struct arg_netdev_event {
3690	const struct net_device *dev;
3691	union {
3692		unsigned int nh_flags;
3693		unsigned long event;
3694	};
3695};
3696
3697static struct rt6_info *rt6_multipath_first_sibling(const struct rt6_info *rt)
3698{
3699	struct rt6_info *iter;
3700	struct fib6_node *fn;
3701
3702	fn = rcu_dereference_protected(rt->rt6i_node,
3703			lockdep_is_held(&rt->rt6i_table->tb6_lock));
3704	iter = rcu_dereference_protected(fn->leaf,
3705			lockdep_is_held(&rt->rt6i_table->tb6_lock));
3706	while (iter) {
3707		if (iter->rt6i_metric == rt->rt6i_metric &&
3708		    rt6_qualify_for_ecmp(iter))
3709			return iter;
3710		iter = rcu_dereference_protected(iter->rt6_next,
3711				lockdep_is_held(&rt->rt6i_table->tb6_lock));
3712	}
3713
3714	return NULL;
3715}
3716
3717static bool rt6_is_dead(const struct rt6_info *rt)
 
3718{
3719	if (rt->rt6i_nh_flags & RTNH_F_DEAD ||
3720	    (rt->rt6i_nh_flags & RTNH_F_LINKDOWN &&
3721	     rt->rt6i_idev->cnf.ignore_routes_with_linkdown))
3722		return true;
3723
3724	return false;
3725}
3726
3727static int rt6_multipath_total_weight(const struct rt6_info *rt)
3728{
3729	struct rt6_info *iter;
3730	int total = 0;
3731
3732	if (!rt6_is_dead(rt))
3733		total += rt->rt6i_nh_weight;
3734
3735	list_for_each_entry(iter, &rt->rt6i_siblings, rt6i_siblings) {
3736		if (!rt6_is_dead(iter))
3737			total += iter->rt6i_nh_weight;
3738	}
3739
3740	return total;
3741}
3742
3743static void rt6_upper_bound_set(struct rt6_info *rt, int *weight, int total)
3744{
3745	int upper_bound = -1;
3746
3747	if (!rt6_is_dead(rt)) {
3748		*weight += rt->rt6i_nh_weight;
3749		upper_bound = DIV_ROUND_CLOSEST_ULL((u64) (*weight) << 31,
3750						    total) - 1;
3751	}
3752	atomic_set(&rt->rt6i_nh_upper_bound, upper_bound);
3753}
3754
3755static void rt6_multipath_upper_bound_set(struct rt6_info *rt, int total)
3756{
3757	struct rt6_info *iter;
3758	int weight = 0;
3759
3760	rt6_upper_bound_set(rt, &weight, total);
3761
3762	list_for_each_entry(iter, &rt->rt6i_siblings, rt6i_siblings)
3763		rt6_upper_bound_set(iter, &weight, total);
3764}
3765
3766void rt6_multipath_rebalance(struct rt6_info *rt)
3767{
3768	struct rt6_info *first;
3769	int total;
3770
3771	/* In case the entire multipath route was marked for flushing,
3772	 * then there is no need to rebalance upon the removal of every
3773	 * sibling route.
3774	 */
3775	if (!rt->rt6i_nsiblings || rt->should_flush)
3776		return;
3777
3778	/* During lookup routes are evaluated in order, so we need to
3779	 * make sure upper bounds are assigned from the first sibling
3780	 * onwards.
3781	 */
3782	first = rt6_multipath_first_sibling(rt);
3783	if (WARN_ON_ONCE(!first))
3784		return;
3785
3786	total = rt6_multipath_total_weight(first);
3787	rt6_multipath_upper_bound_set(first, total);
3788}
3789
3790static int fib6_ifup(struct rt6_info *rt, void *p_arg)
3791{
3792	const struct arg_netdev_event *arg = p_arg;
3793	const struct net *net = dev_net(arg->dev);
3794
3795	if (rt != net->ipv6.ip6_null_entry && rt->dst.dev == arg->dev) {
3796		rt->rt6i_nh_flags &= ~arg->nh_flags;
3797		fib6_update_sernum_upto_root(dev_net(rt->dst.dev), rt);
 
3798		rt6_multipath_rebalance(rt);
3799	}
3800
3801	return 0;
3802}
3803
3804void rt6_sync_up(struct net_device *dev, unsigned int nh_flags)
3805{
3806	struct arg_netdev_event arg = {
3807		.dev = dev,
3808		{
3809			.nh_flags = nh_flags,
3810		},
3811	};
3812
3813	if (nh_flags & RTNH_F_DEAD && netif_carrier_ok(dev))
3814		arg.nh_flags |= RTNH_F_LINKDOWN;
3815
3816	fib6_clean_all(dev_net(dev), fib6_ifup, &arg);
3817}
3818
3819static bool rt6_multipath_uses_dev(const struct rt6_info *rt,
 
3820				   const struct net_device *dev)
3821{
3822	struct rt6_info *iter;
3823
3824	if (rt->dst.dev == dev)
3825		return true;
3826	list_for_each_entry(iter, &rt->rt6i_siblings, rt6i_siblings)
3827		if (iter->dst.dev == dev)
3828			return true;
3829
3830	return false;
3831}
3832
3833static void rt6_multipath_flush(struct rt6_info *rt)
3834{
3835	struct rt6_info *iter;
3836
3837	rt->should_flush = 1;
3838	list_for_each_entry(iter, &rt->rt6i_siblings, rt6i_siblings)
3839		iter->should_flush = 1;
3840}
3841
3842static unsigned int rt6_multipath_dead_count(const struct rt6_info *rt,
3843					     const struct net_device *down_dev)
3844{
3845	struct rt6_info *iter;
3846	unsigned int dead = 0;
3847
3848	if (rt->dst.dev == down_dev || rt->rt6i_nh_flags & RTNH_F_DEAD)
 
3849		dead++;
3850	list_for_each_entry(iter, &rt->rt6i_siblings, rt6i_siblings)
3851		if (iter->dst.dev == down_dev ||
3852		    iter->rt6i_nh_flags & RTNH_F_DEAD)
3853			dead++;
3854
3855	return dead;
3856}
3857
3858static void rt6_multipath_nh_flags_set(struct rt6_info *rt,
3859				       const struct net_device *dev,
3860				       unsigned int nh_flags)
3861{
3862	struct rt6_info *iter;
3863
3864	if (rt->dst.dev == dev)
3865		rt->rt6i_nh_flags |= nh_flags;
3866	list_for_each_entry(iter, &rt->rt6i_siblings, rt6i_siblings)
3867		if (iter->dst.dev == dev)
3868			iter->rt6i_nh_flags |= nh_flags;
3869}
3870
3871/* called with write lock held for table with rt */
3872static int fib6_ifdown(struct rt6_info *rt, void *p_arg)
3873{
3874	const struct arg_netdev_event *arg = p_arg;
3875	const struct net_device *dev = arg->dev;
3876	const struct net *net = dev_net(dev);
3877
3878	if (rt == net->ipv6.ip6_null_entry)
3879		return 0;
3880
3881	switch (arg->event) {
3882	case NETDEV_UNREGISTER:
3883		return rt->dst.dev == dev ? -1 : 0;
3884	case NETDEV_DOWN:
3885		if (rt->should_flush)
3886			return -1;
3887		if (!rt->rt6i_nsiblings)
3888			return rt->dst.dev == dev ? -1 : 0;
3889		if (rt6_multipath_uses_dev(rt, dev)) {
3890			unsigned int count;
3891
3892			count = rt6_multipath_dead_count(rt, dev);
3893			if (rt->rt6i_nsiblings + 1 == count) {
3894				rt6_multipath_flush(rt);
3895				return -1;
3896			}
3897			rt6_multipath_nh_flags_set(rt, dev, RTNH_F_DEAD |
3898						   RTNH_F_LINKDOWN);
3899			fib6_update_sernum(rt);
3900			rt6_multipath_rebalance(rt);
3901		}
3902		return -2;
3903	case NETDEV_CHANGE:
3904		if (rt->dst.dev != dev ||
3905		    rt->rt6i_flags & (RTF_LOCAL | RTF_ANYCAST))
3906			break;
3907		rt->rt6i_nh_flags |= RTNH_F_LINKDOWN;
3908		rt6_multipath_rebalance(rt);
3909		break;
3910	}
3911
3912	return 0;
3913}
3914
3915void rt6_sync_down_dev(struct net_device *dev, unsigned long event)
3916{
3917	struct arg_netdev_event arg = {
3918		.dev = dev,
3919		{
3920			.event = event,
3921		},
3922	};
 
3923
3924	fib6_clean_all(dev_net(dev), fib6_ifdown, &arg);
 
 
 
3925}
3926
3927void rt6_disable_ip(struct net_device *dev, unsigned long event)
3928{
3929	rt6_sync_down_dev(dev, event);
3930	rt6_uncached_list_flush_dev(dev_net(dev), dev);
3931	neigh_ifdown(&nd_tbl, dev);
3932}
3933
3934struct rt6_mtu_change_arg {
3935	struct net_device *dev;
3936	unsigned int mtu;
 
3937};
3938
3939static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3940{
3941	struct rt6_mtu_change_arg *arg = (struct rt6_mtu_change_arg *) p_arg;
3942	struct inet6_dev *idev;
3943
3944	/* In IPv6 pmtu discovery is not optional,
3945	   so that RTAX_MTU lock cannot disable it.
3946	   We still use this lock to block changes
3947	   caused by addrconf/ndisc.
3948	*/
3949
3950	idev = __in6_dev_get(arg->dev);
3951	if (!idev)
3952		return 0;
3953
3954	/* For administrative MTU increase, there is no way to discover
3955	   IPv6 PMTU increase, so PMTU increase should be updated here.
3956	   Since RFC 1981 doesn't include administrative MTU increase
3957	   update PMTU increase is a MUST. (i.e. jumbo frame)
3958	 */
3959	if (rt->dst.dev == arg->dev &&
3960	    !dst_metric_locked(&rt->dst, RTAX_MTU)) {
3961		spin_lock_bh(&rt6_exception_lock);
3962		if (dst_metric_raw(&rt->dst, RTAX_MTU) &&
3963		    rt6_mtu_change_route_allowed(idev, rt, arg->mtu))
3964			dst_metric_set(&rt->dst, RTAX_MTU, arg->mtu);
3965		rt6_exceptions_update_pmtu(idev, rt, arg->mtu);
3966		spin_unlock_bh(&rt6_exception_lock);
3967	}
3968	return 0;
 
3969}
3970
3971void rt6_mtu_change(struct net_device *dev, unsigned int mtu)
3972{
3973	struct rt6_mtu_change_arg arg = {
3974		.dev = dev,
3975		.mtu = mtu,
3976	};
3977
3978	fib6_clean_all(dev_net(dev), rt6_mtu_change_route, &arg);
3979}
3980
3981static const struct nla_policy rtm_ipv6_policy[RTA_MAX+1] = {
 
3982	[RTA_GATEWAY]           = { .len = sizeof(struct in6_addr) },
3983	[RTA_PREFSRC]		= { .len = sizeof(struct in6_addr) },
3984	[RTA_OIF]               = { .type = NLA_U32 },
3985	[RTA_IIF]		= { .type = NLA_U32 },
3986	[RTA_PRIORITY]          = { .type = NLA_U32 },
3987	[RTA_METRICS]           = { .type = NLA_NESTED },
3988	[RTA_MULTIPATH]		= { .len = sizeof(struct rtnexthop) },
3989	[RTA_PREF]              = { .type = NLA_U8 },
3990	[RTA_ENCAP_TYPE]	= { .type = NLA_U16 },
3991	[RTA_ENCAP]		= { .type = NLA_NESTED },
3992	[RTA_EXPIRES]		= { .type = NLA_U32 },
3993	[RTA_UID]		= { .type = NLA_U32 },
3994	[RTA_MARK]		= { .type = NLA_U32 },
3995	[RTA_TABLE]		= { .type = NLA_U32 },
 
 
 
 
3996};
3997
3998static int rtm_to_fib6_config(struct sk_buff *skb, struct nlmsghdr *nlh,
3999			      struct fib6_config *cfg,
4000			      struct netlink_ext_ack *extack)
4001{
4002	struct rtmsg *rtm;
4003	struct nlattr *tb[RTA_MAX+1];
4004	unsigned int pref;
4005	int err;
4006
4007	err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv6_policy,
4008			  NULL);
4009	if (err < 0)
4010		goto errout;
4011
4012	err = -EINVAL;
4013	rtm = nlmsg_data(nlh);
4014	memset(cfg, 0, sizeof(*cfg));
4015
4016	cfg->fc_table = rtm->rtm_table;
4017	cfg->fc_dst_len = rtm->rtm_dst_len;
4018	cfg->fc_src_len = rtm->rtm_src_len;
4019	cfg->fc_flags = RTF_UP;
4020	cfg->fc_protocol = rtm->rtm_protocol;
4021	cfg->fc_type = rtm->rtm_type;
 
 
 
 
 
 
 
 
 
 
 
 
4022
4023	if (rtm->rtm_type == RTN_UNREACHABLE ||
4024	    rtm->rtm_type == RTN_BLACKHOLE ||
4025	    rtm->rtm_type == RTN_PROHIBIT ||
4026	    rtm->rtm_type == RTN_THROW)
4027		cfg->fc_flags |= RTF_REJECT;
4028
4029	if (rtm->rtm_type == RTN_LOCAL)
4030		cfg->fc_flags |= RTF_LOCAL;
4031
4032	if (rtm->rtm_flags & RTM_F_CLONED)
4033		cfg->fc_flags |= RTF_CACHE;
4034
4035	cfg->fc_flags |= (rtm->rtm_flags & RTNH_F_ONLINK);
4036
4037	cfg->fc_nlinfo.portid = NETLINK_CB(skb).portid;
4038	cfg->fc_nlinfo.nlh = nlh;
4039	cfg->fc_nlinfo.nl_net = sock_net(skb->sk);
 
 
 
 
 
 
4040
4041	if (tb[RTA_GATEWAY]) {
4042		cfg->fc_gateway = nla_get_in6_addr(tb[RTA_GATEWAY]);
4043		cfg->fc_flags |= RTF_GATEWAY;
4044	}
 
 
 
 
4045
4046	if (tb[RTA_DST]) {
4047		int plen = (rtm->rtm_dst_len + 7) >> 3;
4048
4049		if (nla_len(tb[RTA_DST]) < plen)
4050			goto errout;
4051
4052		nla_memcpy(&cfg->fc_dst, tb[RTA_DST], plen);
4053	}
4054
4055	if (tb[RTA_SRC]) {
4056		int plen = (rtm->rtm_src_len + 7) >> 3;
4057
4058		if (nla_len(tb[RTA_SRC]) < plen)
4059			goto errout;
4060
4061		nla_memcpy(&cfg->fc_src, tb[RTA_SRC], plen);
4062	}
4063
4064	if (tb[RTA_PREFSRC])
4065		cfg->fc_prefsrc = nla_get_in6_addr(tb[RTA_PREFSRC]);
4066
4067	if (tb[RTA_OIF])
4068		cfg->fc_ifindex = nla_get_u32(tb[RTA_OIF]);
4069
4070	if (tb[RTA_PRIORITY])
4071		cfg->fc_metric = nla_get_u32(tb[RTA_PRIORITY]);
4072
4073	if (tb[RTA_METRICS]) {
4074		cfg->fc_mx = nla_data(tb[RTA_METRICS]);
4075		cfg->fc_mx_len = nla_len(tb[RTA_METRICS]);
4076	}
4077
4078	if (tb[RTA_TABLE])
4079		cfg->fc_table = nla_get_u32(tb[RTA_TABLE]);
4080
4081	if (tb[RTA_MULTIPATH]) {
4082		cfg->fc_mp = nla_data(tb[RTA_MULTIPATH]);
4083		cfg->fc_mp_len = nla_len(tb[RTA_MULTIPATH]);
4084
4085		err = lwtunnel_valid_encap_type_attr(cfg->fc_mp,
4086						     cfg->fc_mp_len, extack);
4087		if (err < 0)
4088			goto errout;
4089	}
4090
4091	if (tb[RTA_PREF]) {
4092		pref = nla_get_u8(tb[RTA_PREF]);
4093		if (pref != ICMPV6_ROUTER_PREF_LOW &&
4094		    pref != ICMPV6_ROUTER_PREF_HIGH)
4095			pref = ICMPV6_ROUTER_PREF_MEDIUM;
4096		cfg->fc_flags |= RTF_PREF(pref);
4097	}
4098
4099	if (tb[RTA_ENCAP])
4100		cfg->fc_encap = tb[RTA_ENCAP];
4101
4102	if (tb[RTA_ENCAP_TYPE]) {
4103		cfg->fc_encap_type = nla_get_u16(tb[RTA_ENCAP_TYPE]);
4104
4105		err = lwtunnel_valid_encap_type(cfg->fc_encap_type, extack);
4106		if (err < 0)
4107			goto errout;
4108	}
4109
4110	if (tb[RTA_EXPIRES]) {
4111		unsigned long timeout = addrconf_timeout_fixup(nla_get_u32(tb[RTA_EXPIRES]), HZ);
4112
4113		if (addrconf_finite_timeout(timeout)) {
4114			cfg->fc_expires = jiffies_to_clock_t(timeout * HZ);
4115			cfg->fc_flags |= RTF_EXPIRES;
4116		}
4117	}
4118
4119	err = 0;
4120errout:
4121	return err;
4122}
4123
4124struct rt6_nh {
4125	struct rt6_info *rt6_info;
4126	struct fib6_config r_cfg;
4127	struct mx6_config mxc;
4128	struct list_head next;
4129};
4130
4131static void ip6_print_replace_route_err(struct list_head *rt6_nh_list)
4132{
4133	struct rt6_nh *nh;
4134
4135	list_for_each_entry(nh, rt6_nh_list, next) {
4136		pr_warn("IPV6: multipath route replace failed (check consistency of installed routes): %pI6c nexthop %pI6c ifi %d\n",
4137		        &nh->r_cfg.fc_dst, &nh->r_cfg.fc_gateway,
4138		        nh->r_cfg.fc_ifindex);
4139	}
4140}
4141
4142static int ip6_route_info_append(struct list_head *rt6_nh_list,
4143				 struct rt6_info *rt, struct fib6_config *r_cfg)
4144{
4145	struct rt6_nh *nh;
4146	int err = -EEXIST;
4147
4148	list_for_each_entry(nh, rt6_nh_list, next) {
4149		/* check if rt6_info already exists */
4150		if (rt6_duplicate_nexthop(nh->rt6_info, rt))
4151			return err;
4152	}
4153
4154	nh = kzalloc(sizeof(*nh), GFP_KERNEL);
4155	if (!nh)
4156		return -ENOMEM;
4157	nh->rt6_info = rt;
4158	err = ip6_convert_metrics(&nh->mxc, r_cfg);
4159	if (err) {
4160		kfree(nh);
4161		return err;
4162	}
4163	memcpy(&nh->r_cfg, r_cfg, sizeof(*r_cfg));
4164	list_add_tail(&nh->next, rt6_nh_list);
4165
4166	return 0;
4167}
4168
4169static void ip6_route_mpath_notify(struct rt6_info *rt,
4170				   struct rt6_info *rt_last,
4171				   struct nl_info *info,
4172				   __u16 nlflags)
4173{
4174	/* if this is an APPEND route, then rt points to the first route
4175	 * inserted and rt_last points to last route inserted. Userspace
4176	 * wants a consistent dump of the route which starts at the first
4177	 * nexthop. Since sibling routes are always added at the end of
4178	 * the list, find the first sibling of the last route appended
4179	 */
4180	if ((nlflags & NLM_F_APPEND) && rt_last && rt_last->rt6i_nsiblings) {
4181		rt = list_first_entry(&rt_last->rt6i_siblings,
4182				      struct rt6_info,
4183				      rt6i_siblings);
 
 
4184	}
4185
4186	if (rt)
4187		inet6_rt_notify(RTM_NEWROUTE, rt, info, nlflags);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4188}
4189
4190static int ip6_route_multipath_add(struct fib6_config *cfg,
4191				   struct netlink_ext_ack *extack)
4192{
4193	struct rt6_info *rt_notif = NULL, *rt_last = NULL;
4194	struct nl_info *info = &cfg->fc_nlinfo;
4195	struct fib6_config r_cfg;
4196	struct rtnexthop *rtnh;
4197	struct rt6_info *rt;
4198	struct rt6_nh *err_nh;
4199	struct rt6_nh *nh, *nh_safe;
4200	__u16 nlflags;
4201	int remaining;
4202	int attrlen;
4203	int err = 1;
4204	int nhn = 0;
4205	int replace = (cfg->fc_nlinfo.nlh &&
4206		       (cfg->fc_nlinfo.nlh->nlmsg_flags & NLM_F_REPLACE));
4207	LIST_HEAD(rt6_nh_list);
4208
4209	nlflags = replace ? NLM_F_REPLACE : NLM_F_CREATE;
4210	if (info->nlh && info->nlh->nlmsg_flags & NLM_F_APPEND)
4211		nlflags |= NLM_F_APPEND;
4212
4213	remaining = cfg->fc_mp_len;
4214	rtnh = (struct rtnexthop *)cfg->fc_mp;
4215
4216	/* Parse a Multipath Entry and build a list (rt6_nh_list) of
4217	 * rt6_info structs per nexthop
4218	 */
4219	while (rtnh_ok(rtnh, remaining)) {
4220		memcpy(&r_cfg, cfg, sizeof(*cfg));
4221		if (rtnh->rtnh_ifindex)
4222			r_cfg.fc_ifindex = rtnh->rtnh_ifindex;
4223
4224		attrlen = rtnh_attrlen(rtnh);
4225		if (attrlen > 0) {
4226			struct nlattr *nla, *attrs = rtnh_attrs(rtnh);
4227
4228			nla = nla_find(attrs, attrlen, RTA_GATEWAY);
4229			if (nla) {
4230				r_cfg.fc_gateway = nla_get_in6_addr(nla);
 
 
 
 
4231				r_cfg.fc_flags |= RTF_GATEWAY;
4232			}
4233			r_cfg.fc_encap = nla_find(attrs, attrlen, RTA_ENCAP);
 
 
 
 
4234			nla = nla_find(attrs, attrlen, RTA_ENCAP_TYPE);
4235			if (nla)
4236				r_cfg.fc_encap_type = nla_get_u16(nla);
4237		}
4238
4239		r_cfg.fc_flags |= (rtnh->rtnh_flags & RTNH_F_ONLINK);
4240		rt = ip6_route_info_create(&r_cfg, extack);
4241		if (IS_ERR(rt)) {
4242			err = PTR_ERR(rt);
4243			rt = NULL;
4244			goto cleanup;
4245		}
 
 
 
 
 
 
 
4246
4247		rt->rt6i_nh_weight = rtnh->rtnh_hops + 1;
4248
4249		err = ip6_route_info_append(&rt6_nh_list, rt, &r_cfg);
 
4250		if (err) {
4251			dst_release_immediate(&rt->dst);
4252			goto cleanup;
4253		}
4254
4255		rtnh = rtnh_next(rtnh, &remaining);
4256	}
4257
 
 
 
 
 
 
4258	/* for add and replace send one notification with all nexthops.
4259	 * Skip the notification in fib6_add_rt2node and send one with
4260	 * the full route when done
4261	 */
4262	info->skip_notify = 1;
4263
 
 
 
 
 
4264	err_nh = NULL;
4265	list_for_each_entry(nh, &rt6_nh_list, next) {
4266		rt_last = nh->rt6_info;
4267		err = __ip6_ins_rt(nh->rt6_info, info, &nh->mxc, extack);
4268		/* save reference to first route for notification */
4269		if (!rt_notif && !err)
4270			rt_notif = nh->rt6_info;
4271
4272		/* nh->rt6_info is used or freed at this point, reset to NULL*/
4273		nh->rt6_info = NULL;
4274		if (err) {
4275			if (replace && nhn)
4276				ip6_print_replace_route_err(&rt6_nh_list);
 
4277			err_nh = nh;
4278			goto add_errout;
4279		}
 
 
 
 
 
 
4280
4281		/* Because each route is added like a single route we remove
4282		 * these flags after the first nexthop: if there is a collision,
4283		 * we have already failed to add the first nexthop:
4284		 * fib6_add_rt2node() has rejected it; when replacing, old
4285		 * nexthops have been replaced by first new, the rest should
4286		 * be added to it.
4287		 */
4288		cfg->fc_nlinfo.nlh->nlmsg_flags &= ~(NLM_F_EXCL |
4289						     NLM_F_REPLACE);
 
 
 
4290		nhn++;
4291	}
4292
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4293	/* success ... tell user about new route */
4294	ip6_route_mpath_notify(rt_notif, rt_last, info, nlflags);
4295	goto cleanup;
4296
4297add_errout:
4298	/* send notification for routes that were added so that
4299	 * the delete notifications sent by ip6_route_del are
4300	 * coherent
4301	 */
4302	if (rt_notif)
4303		ip6_route_mpath_notify(rt_notif, rt_last, info, nlflags);
4304
4305	/* Delete routes that were already added */
4306	list_for_each_entry(nh, &rt6_nh_list, next) {
4307		if (err_nh == nh)
4308			break;
4309		ip6_route_del(&nh->r_cfg, extack);
4310	}
4311
4312cleanup:
4313	list_for_each_entry_safe(nh, nh_safe, &rt6_nh_list, next) {
4314		if (nh->rt6_info)
4315			dst_release_immediate(&nh->rt6_info->dst);
4316		kfree(nh->mxc.mx);
4317		list_del(&nh->next);
4318		kfree(nh);
4319	}
4320
4321	return err;
4322}
4323
4324static int ip6_route_multipath_del(struct fib6_config *cfg,
4325				   struct netlink_ext_ack *extack)
4326{
4327	struct fib6_config r_cfg;
4328	struct rtnexthop *rtnh;
 
4329	int remaining;
4330	int attrlen;
4331	int err = 1, last_err = 0;
4332
4333	remaining = cfg->fc_mp_len;
4334	rtnh = (struct rtnexthop *)cfg->fc_mp;
4335
4336	/* Parse a Multipath Entry */
4337	while (rtnh_ok(rtnh, remaining)) {
4338		memcpy(&r_cfg, cfg, sizeof(*cfg));
4339		if (rtnh->rtnh_ifindex)
4340			r_cfg.fc_ifindex = rtnh->rtnh_ifindex;
4341
4342		attrlen = rtnh_attrlen(rtnh);
4343		if (attrlen > 0) {
4344			struct nlattr *nla, *attrs = rtnh_attrs(rtnh);
4345
4346			nla = nla_find(attrs, attrlen, RTA_GATEWAY);
4347			if (nla) {
4348				nla_memcpy(&r_cfg.fc_gateway, nla, 16);
 
 
 
 
 
 
4349				r_cfg.fc_flags |= RTF_GATEWAY;
4350			}
4351		}
4352		err = ip6_route_del(&r_cfg, extack);
4353		if (err)
4354			last_err = err;
4355
 
4356		rtnh = rtnh_next(rtnh, &remaining);
4357	}
4358
4359	return last_err;
4360}
4361
4362static int inet6_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh,
4363			      struct netlink_ext_ack *extack)
4364{
4365	struct fib6_config cfg;
4366	int err;
4367
4368	err = rtm_to_fib6_config(skb, nlh, &cfg, extack);
4369	if (err < 0)
4370		return err;
4371
 
 
 
 
 
 
4372	if (cfg.fc_mp)
4373		return ip6_route_multipath_del(&cfg, extack);
4374	else {
4375		cfg.fc_delete_all_nh = 1;
4376		return ip6_route_del(&cfg, extack);
4377	}
4378}
4379
4380static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh,
4381			      struct netlink_ext_ack *extack)
4382{
4383	struct fib6_config cfg;
4384	int err;
4385
4386	err = rtm_to_fib6_config(skb, nlh, &cfg, extack);
4387	if (err < 0)
4388		return err;
4389
 
 
 
4390	if (cfg.fc_mp)
4391		return ip6_route_multipath_add(&cfg, extack);
4392	else
4393		return ip6_route_add(&cfg, extack);
4394}
4395
4396static size_t rt6_nlmsg_size(struct rt6_info *rt)
 
4397{
4398	int nexthop_len = 0;
 
 
 
 
4399
4400	if (rt->rt6i_nsiblings) {
4401		nexthop_len = nla_total_size(0)	 /* RTA_MULTIPATH */
4402			    + NLA_ALIGN(sizeof(struct rtnexthop))
4403			    + nla_total_size(16) /* RTA_GATEWAY */
4404			    + lwtunnel_get_encap_size(rt->dst.lwtstate);
 
4405
4406		nexthop_len *= rt->rt6i_nsiblings;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4407	}
4408
4409	return NLMSG_ALIGN(sizeof(struct rtmsg))
4410	       + nla_total_size(16) /* RTA_SRC */
4411	       + nla_total_size(16) /* RTA_DST */
4412	       + nla_total_size(16) /* RTA_GATEWAY */
4413	       + nla_total_size(16) /* RTA_PREFSRC */
4414	       + nla_total_size(4) /* RTA_TABLE */
4415	       + nla_total_size(4) /* RTA_IIF */
4416	       + nla_total_size(4) /* RTA_OIF */
4417	       + nla_total_size(4) /* RTA_PRIORITY */
4418	       + RTAX_MAX * nla_total_size(4) /* RTA_METRICS */
4419	       + nla_total_size(sizeof(struct rta_cacheinfo))
4420	       + nla_total_size(TCP_CA_NAME_MAX) /* RTAX_CC_ALGO */
4421	       + nla_total_size(1) /* RTA_PREF */
4422	       + lwtunnel_get_encap_size(rt->dst.lwtstate)
4423	       + nexthop_len;
4424}
4425
4426static int rt6_nexthop_info(struct sk_buff *skb, struct rt6_info *rt,
4427			    unsigned int *flags, bool skip_oif)
4428{
4429	if (rt->rt6i_nh_flags & RTNH_F_DEAD)
4430		*flags |= RTNH_F_DEAD;
4431
4432	if (rt->rt6i_nh_flags & RTNH_F_LINKDOWN) {
4433		*flags |= RTNH_F_LINKDOWN;
4434		if (rt->rt6i_idev->cnf.ignore_routes_with_linkdown)
4435			*flags |= RTNH_F_DEAD;
4436	}
4437
4438	if (rt->rt6i_flags & RTF_GATEWAY) {
4439		if (nla_put_in6_addr(skb, RTA_GATEWAY, &rt->rt6i_gateway) < 0)
4440			goto nla_put_failure;
4441	}
4442
4443	*flags |= (rt->rt6i_nh_flags & RTNH_F_ONLINK);
4444	if (rt->rt6i_nh_flags & RTNH_F_OFFLOAD)
4445		*flags |= RTNH_F_OFFLOAD;
4446
4447	/* not needed for multipath encoding b/c it has a rtnexthop struct */
4448	if (!skip_oif && rt->dst.dev &&
4449	    nla_put_u32(skb, RTA_OIF, rt->dst.dev->ifindex))
4450		goto nla_put_failure;
4451
4452	if (rt->dst.lwtstate &&
4453	    lwtunnel_fill_encap(skb, rt->dst.lwtstate) < 0)
4454		goto nla_put_failure;
 
 
4455
4456	return 0;
4457
4458nla_put_failure:
4459	return -EMSGSIZE;
4460}
4461
4462/* add multipath next hop */
4463static int rt6_add_nexthop(struct sk_buff *skb, struct rt6_info *rt)
4464{
4465	struct rtnexthop *rtnh;
4466	unsigned int flags = 0;
4467
4468	rtnh = nla_reserve_nohdr(skb, sizeof(*rtnh));
4469	if (!rtnh)
4470		goto nla_put_failure;
4471
4472	rtnh->rtnh_hops = rt->rt6i_nh_weight - 1;
4473	rtnh->rtnh_ifindex = rt->dst.dev ? rt->dst.dev->ifindex : 0;
4474
4475	if (rt6_nexthop_info(skb, rt, &flags, true) < 0)
4476		goto nla_put_failure;
4477
4478	rtnh->rtnh_flags = flags;
4479
4480	/* length of rtnetlink header + attributes */
4481	rtnh->rtnh_len = nlmsg_get_pos(skb) - (void *)rtnh;
4482
4483	return 0;
4484
4485nla_put_failure:
4486	return -EMSGSIZE;
4487}
4488
4489static int rt6_fill_node(struct net *net,
4490			 struct sk_buff *skb, struct rt6_info *rt,
4491			 struct in6_addr *dst, struct in6_addr *src,
4492			 int iif, int type, u32 portid, u32 seq,
4493			 unsigned int flags)
4494{
4495	u32 metrics[RTAX_MAX];
 
 
 
 
4496	struct rtmsg *rtm;
4497	struct nlmsghdr *nlh;
4498	long expires;
4499	u32 table;
4500
4501	nlh = nlmsg_put(skb, portid, seq, type, sizeof(*rtm), flags);
4502	if (!nlh)
4503		return -EMSGSIZE;
4504
 
 
 
 
 
 
 
 
 
 
4505	rtm = nlmsg_data(nlh);
4506	rtm->rtm_family = AF_INET6;
4507	rtm->rtm_dst_len = rt->rt6i_dst.plen;
4508	rtm->rtm_src_len = rt->rt6i_src.plen;
4509	rtm->rtm_tos = 0;
4510	if (rt->rt6i_table)
4511		table = rt->rt6i_table->tb6_id;
4512	else
4513		table = RT6_TABLE_UNSPEC;
4514	rtm->rtm_table = table;
4515	if (nla_put_u32(skb, RTA_TABLE, table))
4516		goto nla_put_failure;
4517	if (rt->rt6i_flags & RTF_REJECT) {
4518		switch (rt->dst.error) {
4519		case -EINVAL:
4520			rtm->rtm_type = RTN_BLACKHOLE;
4521			break;
4522		case -EACCES:
4523			rtm->rtm_type = RTN_PROHIBIT;
4524			break;
4525		case -EAGAIN:
4526			rtm->rtm_type = RTN_THROW;
4527			break;
4528		default:
4529			rtm->rtm_type = RTN_UNREACHABLE;
4530			break;
4531		}
4532	}
4533	else if (rt->rt6i_flags & RTF_LOCAL)
4534		rtm->rtm_type = RTN_LOCAL;
4535	else if (rt->rt6i_flags & RTF_ANYCAST)
4536		rtm->rtm_type = RTN_ANYCAST;
4537	else if (rt->dst.dev && (rt->dst.dev->flags & IFF_LOOPBACK))
4538		rtm->rtm_type = RTN_LOCAL;
4539	else
4540		rtm->rtm_type = RTN_UNICAST;
4541	rtm->rtm_flags = 0;
4542	rtm->rtm_scope = RT_SCOPE_UNIVERSE;
4543	rtm->rtm_protocol = rt->rt6i_protocol;
4544
4545	if (rt->rt6i_flags & RTF_CACHE)
4546		rtm->rtm_flags |= RTM_F_CLONED;
4547
4548	if (dst) {
4549		if (nla_put_in6_addr(skb, RTA_DST, dst))
4550			goto nla_put_failure;
4551		rtm->rtm_dst_len = 128;
4552	} else if (rtm->rtm_dst_len)
4553		if (nla_put_in6_addr(skb, RTA_DST, &rt->rt6i_dst.addr))
4554			goto nla_put_failure;
4555#ifdef CONFIG_IPV6_SUBTREES
4556	if (src) {
4557		if (nla_put_in6_addr(skb, RTA_SRC, src))
4558			goto nla_put_failure;
4559		rtm->rtm_src_len = 128;
4560	} else if (rtm->rtm_src_len &&
4561		   nla_put_in6_addr(skb, RTA_SRC, &rt->rt6i_src.addr))
4562		goto nla_put_failure;
4563#endif
4564	if (iif) {
4565#ifdef CONFIG_IPV6_MROUTE
4566		if (ipv6_addr_is_multicast(&rt->rt6i_dst.addr)) {
4567			int err = ip6mr_get_route(net, skb, rtm, portid);
4568
4569			if (err == 0)
4570				return 0;
4571			if (err < 0)
4572				goto nla_put_failure;
4573		} else
4574#endif
4575			if (nla_put_u32(skb, RTA_IIF, iif))
4576				goto nla_put_failure;
4577	} else if (dst) {
4578		struct in6_addr saddr_buf;
4579		if (ip6_route_get_saddr(net, rt, dst, 0, &saddr_buf) == 0 &&
4580		    nla_put_in6_addr(skb, RTA_PREFSRC, &saddr_buf))
4581			goto nla_put_failure;
4582	}
4583
4584	if (rt->rt6i_prefsrc.plen) {
4585		struct in6_addr saddr_buf;
4586		saddr_buf = rt->rt6i_prefsrc.addr;
4587		if (nla_put_in6_addr(skb, RTA_PREFSRC, &saddr_buf))
4588			goto nla_put_failure;
4589	}
4590
4591	memcpy(metrics, dst_metrics_ptr(&rt->dst), sizeof(metrics));
4592	if (rt->rt6i_pmtu)
4593		metrics[RTAX_MTU - 1] = rt->rt6i_pmtu;
4594	if (rtnetlink_put_metrics(skb, metrics) < 0)
4595		goto nla_put_failure;
4596
4597	if (nla_put_u32(skb, RTA_PRIORITY, rt->rt6i_metric))
4598		goto nla_put_failure;
4599
4600	/* For multipath routes, walk the siblings list and add
4601	 * each as a nexthop within RTA_MULTIPATH.
4602	 */
4603	if (rt->rt6i_nsiblings) {
4604		struct rt6_info *sibling, *next_sibling;
 
 
 
 
 
 
 
 
 
 
 
4605		struct nlattr *mp;
4606
4607		mp = nla_nest_start(skb, RTA_MULTIPATH);
4608		if (!mp)
4609			goto nla_put_failure;
4610
4611		if (rt6_add_nexthop(skb, rt) < 0)
 
 
4612			goto nla_put_failure;
4613
4614		list_for_each_entry_safe(sibling, next_sibling,
4615					 &rt->rt6i_siblings, rt6i_siblings) {
4616			if (rt6_add_nexthop(skb, sibling) < 0)
 
 
 
 
 
 
4617				goto nla_put_failure;
 
4618		}
4619
 
 
4620		nla_nest_end(skb, mp);
 
 
 
 
 
 
 
 
 
 
 
 
4621	} else {
4622		if (rt6_nexthop_info(skb, rt, &rtm->rtm_flags, false) < 0)
 
4623			goto nla_put_failure;
 
 
4624	}
4625
4626	expires = (rt->rt6i_flags & RTF_EXPIRES) ? rt->dst.expires - jiffies : 0;
 
 
 
 
 
 
 
 
 
 
 
 
4627
4628	if (rtnl_put_cacheinfo(skb, &rt->dst, 0, expires, rt->dst.error) < 0)
4629		goto nla_put_failure;
4630
4631	if (nla_put_u8(skb, RTA_PREF, IPV6_EXTRACT_PREF(rt->rt6i_flags)))
4632		goto nla_put_failure;
4633
4634
4635	nlmsg_end(skb, nlh);
4636	return 0;
4637
4638nla_put_failure:
4639	nlmsg_cancel(skb, nlh);
4640	return -EMSGSIZE;
4641}
4642
4643int rt6_dump_route(struct rt6_info *rt, void *p_arg)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4644{
4645	struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg;
 
 
4646	struct net *net = arg->net;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4647
4648	if (rt == net->ipv6.ip6_null_entry)
4649		return 0;
 
 
4650
4651	if (nlmsg_len(arg->cb->nlh) >= sizeof(struct rtmsg)) {
4652		struct rtmsg *rtm = nlmsg_data(arg->cb->nlh);
 
 
 
4653
4654		/* user wants prefix routes only */
4655		if (rtm->rtm_flags & RTM_F_PREFIX &&
4656		    !(rt->rt6i_flags & RTF_PREFIX_RT)) {
4657			/* success since this is not a prefix route */
4658			return 1;
 
 
 
 
 
 
 
 
 
 
 
 
 
4659		}
4660	}
4661
4662	return rt6_fill_node(net,
4663		     arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE,
4664		     NETLINK_CB(arg->cb->skb).portid, arg->cb->nlh->nlmsg_seq,
4665		     NLM_F_MULTI);
4666}
4667
4668static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
4669			      struct netlink_ext_ack *extack)
4670{
4671	struct net *net = sock_net(in_skb->sk);
4672	struct nlattr *tb[RTA_MAX+1];
4673	int err, iif = 0, oif = 0;
 
4674	struct dst_entry *dst;
4675	struct rt6_info *rt;
4676	struct sk_buff *skb;
4677	struct rtmsg *rtm;
4678	struct flowi6 fl6;
4679	bool fibmatch;
4680
4681	err = nlmsg_parse(nlh, sizeof(*rtm), tb, RTA_MAX, rtm_ipv6_policy,
4682			  extack);
4683	if (err < 0)
4684		goto errout;
4685
4686	err = -EINVAL;
4687	memset(&fl6, 0, sizeof(fl6));
4688	rtm = nlmsg_data(nlh);
4689	fl6.flowlabel = ip6_make_flowinfo(rtm->rtm_tos, 0);
4690	fibmatch = !!(rtm->rtm_flags & RTM_F_FIB_MATCH);
4691
4692	if (tb[RTA_SRC]) {
4693		if (nla_len(tb[RTA_SRC]) < sizeof(struct in6_addr))
4694			goto errout;
4695
4696		fl6.saddr = *(struct in6_addr *)nla_data(tb[RTA_SRC]);
4697	}
4698
4699	if (tb[RTA_DST]) {
4700		if (nla_len(tb[RTA_DST]) < sizeof(struct in6_addr))
4701			goto errout;
4702
4703		fl6.daddr = *(struct in6_addr *)nla_data(tb[RTA_DST]);
4704	}
4705
4706	if (tb[RTA_IIF])
4707		iif = nla_get_u32(tb[RTA_IIF]);
4708
4709	if (tb[RTA_OIF])
4710		oif = nla_get_u32(tb[RTA_OIF]);
4711
4712	if (tb[RTA_MARK])
4713		fl6.flowi6_mark = nla_get_u32(tb[RTA_MARK]);
4714
4715	if (tb[RTA_UID])
4716		fl6.flowi6_uid = make_kuid(current_user_ns(),
4717					   nla_get_u32(tb[RTA_UID]));
4718	else
4719		fl6.flowi6_uid = iif ? INVALID_UID : current_uid();
4720
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4721	if (iif) {
4722		struct net_device *dev;
4723		int flags = 0;
4724
4725		rcu_read_lock();
4726
4727		dev = dev_get_by_index_rcu(net, iif);
4728		if (!dev) {
4729			rcu_read_unlock();
4730			err = -ENODEV;
4731			goto errout;
4732		}
4733
4734		fl6.flowi6_iif = iif;
4735
4736		if (!ipv6_addr_any(&fl6.saddr))
4737			flags |= RT6_LOOKUP_F_HAS_SADDR;
4738
4739		dst = ip6_route_input_lookup(net, dev, &fl6, NULL, flags);
4740
4741		rcu_read_unlock();
4742	} else {
4743		fl6.flowi6_oif = oif;
4744
4745		dst = ip6_route_output(net, NULL, &fl6);
4746	}
4747
4748
4749	rt = container_of(dst, struct rt6_info, dst);
4750	if (rt->dst.error) {
4751		err = rt->dst.error;
4752		ip6_rt_put(rt);
4753		goto errout;
4754	}
4755
4756	if (rt == net->ipv6.ip6_null_entry) {
4757		err = rt->dst.error;
4758		ip6_rt_put(rt);
4759		goto errout;
4760	}
4761
4762	if (fibmatch && rt->from) {
4763		struct rt6_info *ort = rt->from;
4764
4765		dst_hold(&ort->dst);
4766		ip6_rt_put(rt);
4767		rt = ort;
4768	}
4769
4770	skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
4771	if (!skb) {
4772		ip6_rt_put(rt);
4773		err = -ENOBUFS;
4774		goto errout;
4775	}
4776
4777	skb_dst_set(skb, &rt->dst);
4778	if (fibmatch)
4779		err = rt6_fill_node(net, skb, rt, NULL, NULL, iif,
4780				    RTM_NEWROUTE, NETLINK_CB(in_skb).portid,
4781				    nlh->nlmsg_seq, 0);
4782	else
4783		err = rt6_fill_node(net, skb, rt, &fl6.daddr, &fl6.saddr, iif,
4784				    RTM_NEWROUTE, NETLINK_CB(in_skb).portid,
4785				    nlh->nlmsg_seq, 0);
 
 
 
 
 
 
 
 
 
 
 
4786	if (err < 0) {
4787		kfree_skb(skb);
4788		goto errout;
4789	}
4790
4791	err = rtnl_unicast(skb, net, NETLINK_CB(in_skb).portid);
4792errout:
4793	return err;
4794}
4795
4796void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info,
4797		     unsigned int nlm_flags)
4798{
4799	struct sk_buff *skb;
4800	struct net *net = info->nl_net;
4801	u32 seq;
4802	int err;
4803
4804	err = -ENOBUFS;
4805	seq = info->nlh ? info->nlh->nlmsg_seq : 0;
4806
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4807	skb = nlmsg_new(rt6_nlmsg_size(rt), gfp_any());
4808	if (!skb)
4809		goto errout;
4810
4811	err = rt6_fill_node(net, skb, rt, NULL, NULL, 0,
4812				event, info->portid, seq, nlm_flags);
4813	if (err < 0) {
4814		/* -EMSGSIZE implies BUG in rt6_nlmsg_size() */
4815		WARN_ON(err == -EMSGSIZE);
4816		kfree_skb(skb);
4817		goto errout;
4818	}
4819	rtnl_notify(skb, net, info->portid, RTNLGRP_IPV6_ROUTE,
4820		    info->nlh, gfp_any());
4821	return;
4822errout:
4823	if (err < 0)
4824		rtnl_set_sk_err(net, RTNLGRP_IPV6_ROUTE, err);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4825}
 
4826
4827static int ip6_route_dev_notify(struct notifier_block *this,
4828				unsigned long event, void *ptr)
4829{
4830	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
4831	struct net *net = dev_net(dev);
4832
4833	if (!(dev->flags & IFF_LOOPBACK))
4834		return NOTIFY_OK;
4835
4836	if (event == NETDEV_REGISTER) {
 
4837		net->ipv6.ip6_null_entry->dst.dev = dev;
4838		net->ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(dev);
4839#ifdef CONFIG_IPV6_MULTIPLE_TABLES
4840		net->ipv6.ip6_prohibit_entry->dst.dev = dev;
4841		net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
4842		net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
4843		net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
4844#endif
4845	 } else if (event == NETDEV_UNREGISTER &&
4846		    dev->reg_state != NETREG_UNREGISTERED) {
4847		/* NETDEV_UNREGISTER could be fired for multiple times by
4848		 * netdev_wait_allrefs(). Make sure we only call this once.
4849		 */
4850		in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev);
4851#ifdef CONFIG_IPV6_MULTIPLE_TABLES
4852		in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev);
4853		in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev);
4854#endif
4855	}
4856
4857	return NOTIFY_OK;
4858}
4859
4860/*
4861 *	/proc
4862 */
4863
4864#ifdef CONFIG_PROC_FS
4865
4866static const struct file_operations ipv6_route_proc_fops = {
4867	.open		= ipv6_route_open,
4868	.read		= seq_read,
4869	.llseek		= seq_lseek,
4870	.release	= seq_release_net,
4871};
4872
4873static int rt6_stats_seq_show(struct seq_file *seq, void *v)
4874{
4875	struct net *net = (struct net *)seq->private;
4876	seq_printf(seq, "%04x %04x %04x %04x %04x %04x %04x\n",
4877		   net->ipv6.rt6_stats->fib_nodes,
4878		   net->ipv6.rt6_stats->fib_route_nodes,
4879		   atomic_read(&net->ipv6.rt6_stats->fib_rt_alloc),
4880		   net->ipv6.rt6_stats->fib_rt_entries,
4881		   net->ipv6.rt6_stats->fib_rt_cache,
4882		   dst_entries_get_slow(&net->ipv6.ip6_dst_ops),
4883		   net->ipv6.rt6_stats->fib_discarded_routes);
4884
4885	return 0;
4886}
4887
4888static int rt6_stats_seq_open(struct inode *inode, struct file *file)
4889{
4890	return single_open_net(inode, file, rt6_stats_seq_show);
4891}
4892
4893static const struct file_operations rt6_stats_seq_fops = {
4894	.open	 = rt6_stats_seq_open,
4895	.read	 = seq_read,
4896	.llseek	 = seq_lseek,
4897	.release = single_release_net,
4898};
4899#endif	/* CONFIG_PROC_FS */
4900
4901#ifdef CONFIG_SYSCTL
4902
4903static
4904int ipv6_sysctl_rtcache_flush(struct ctl_table *ctl, int write,
4905			      void __user *buffer, size_t *lenp, loff_t *ppos)
4906{
4907	struct net *net;
4908	int delay;
 
4909	if (!write)
4910		return -EINVAL;
4911
 
 
 
 
4912	net = (struct net *)ctl->extra1;
4913	delay = net->ipv6.sysctl.flush_delay;
4914	proc_dointvec(ctl, write, buffer, lenp, ppos);
4915	fib6_run_gc(delay <= 0 ? 0 : (unsigned long)delay, net, delay > 0);
4916	return 0;
4917}
4918
4919struct ctl_table ipv6_route_table_template[] = {
4920	{
4921		.procname	=	"flush",
4922		.data		=	&init_net.ipv6.sysctl.flush_delay,
4923		.maxlen		=	sizeof(int),
4924		.mode		=	0200,
4925		.proc_handler	=	ipv6_sysctl_rtcache_flush
4926	},
4927	{
4928		.procname	=	"gc_thresh",
4929		.data		=	&ip6_dst_ops_template.gc_thresh,
4930		.maxlen		=	sizeof(int),
4931		.mode		=	0644,
4932		.proc_handler	=	proc_dointvec,
4933	},
4934	{
4935		.procname	=	"max_size",
4936		.data		=	&init_net.ipv6.sysctl.ip6_rt_max_size,
4937		.maxlen		=	sizeof(int),
4938		.mode		=	0644,
4939		.proc_handler	=	proc_dointvec,
4940	},
4941	{
4942		.procname	=	"gc_min_interval",
4943		.data		=	&init_net.ipv6.sysctl.ip6_rt_gc_min_interval,
4944		.maxlen		=	sizeof(int),
4945		.mode		=	0644,
4946		.proc_handler	=	proc_dointvec_jiffies,
4947	},
4948	{
4949		.procname	=	"gc_timeout",
4950		.data		=	&init_net.ipv6.sysctl.ip6_rt_gc_timeout,
4951		.maxlen		=	sizeof(int),
4952		.mode		=	0644,
4953		.proc_handler	=	proc_dointvec_jiffies,
4954	},
4955	{
4956		.procname	=	"gc_interval",
4957		.data		=	&init_net.ipv6.sysctl.ip6_rt_gc_interval,
4958		.maxlen		=	sizeof(int),
4959		.mode		=	0644,
4960		.proc_handler	=	proc_dointvec_jiffies,
4961	},
4962	{
4963		.procname	=	"gc_elasticity",
4964		.data		=	&init_net.ipv6.sysctl.ip6_rt_gc_elasticity,
4965		.maxlen		=	sizeof(int),
4966		.mode		=	0644,
4967		.proc_handler	=	proc_dointvec,
4968	},
4969	{
4970		.procname	=	"mtu_expires",
4971		.data		=	&init_net.ipv6.sysctl.ip6_rt_mtu_expires,
4972		.maxlen		=	sizeof(int),
4973		.mode		=	0644,
4974		.proc_handler	=	proc_dointvec_jiffies,
4975	},
4976	{
4977		.procname	=	"min_adv_mss",
4978		.data		=	&init_net.ipv6.sysctl.ip6_rt_min_advmss,
4979		.maxlen		=	sizeof(int),
4980		.mode		=	0644,
4981		.proc_handler	=	proc_dointvec,
4982	},
4983	{
4984		.procname	=	"gc_min_interval_ms",
4985		.data		=	&init_net.ipv6.sysctl.ip6_rt_gc_min_interval,
4986		.maxlen		=	sizeof(int),
4987		.mode		=	0644,
4988		.proc_handler	=	proc_dointvec_ms_jiffies,
4989	},
4990	{ }
 
 
 
 
 
 
 
 
4991};
4992
4993struct ctl_table * __net_init ipv6_route_sysctl_init(struct net *net)
4994{
4995	struct ctl_table *table;
4996
4997	table = kmemdup(ipv6_route_table_template,
4998			sizeof(ipv6_route_table_template),
4999			GFP_KERNEL);
5000
5001	if (table) {
5002		table[0].data = &net->ipv6.sysctl.flush_delay;
5003		table[0].extra1 = net;
5004		table[1].data = &net->ipv6.ip6_dst_ops.gc_thresh;
5005		table[2].data = &net->ipv6.sysctl.ip6_rt_max_size;
 
5006		table[3].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
5007		table[4].data = &net->ipv6.sysctl.ip6_rt_gc_timeout;
5008		table[5].data = &net->ipv6.sysctl.ip6_rt_gc_interval;
5009		table[6].data = &net->ipv6.sysctl.ip6_rt_gc_elasticity;
5010		table[7].data = &net->ipv6.sysctl.ip6_rt_mtu_expires;
5011		table[8].data = &net->ipv6.sysctl.ip6_rt_min_advmss;
5012		table[9].data = &net->ipv6.sysctl.ip6_rt_gc_min_interval;
5013
5014		/* Don't export sysctls to unprivileged users */
5015		if (net->user_ns != &init_user_ns)
5016			table[0].procname = NULL;
5017	}
5018
5019	return table;
5020}
 
 
 
 
 
 
 
 
 
5021#endif
5022
5023static int __net_init ip6_route_net_init(struct net *net)
5024{
5025	int ret = -ENOMEM;
5026
5027	memcpy(&net->ipv6.ip6_dst_ops, &ip6_dst_ops_template,
5028	       sizeof(net->ipv6.ip6_dst_ops));
5029
5030	if (dst_entries_init(&net->ipv6.ip6_dst_ops) < 0)
5031		goto out_ip6_dst_ops;
5032
 
 
 
 
 
 
5033	net->ipv6.ip6_null_entry = kmemdup(&ip6_null_entry_template,
5034					   sizeof(*net->ipv6.ip6_null_entry),
5035					   GFP_KERNEL);
5036	if (!net->ipv6.ip6_null_entry)
5037		goto out_ip6_dst_entries;
5038	net->ipv6.ip6_null_entry->dst.ops = &net->ipv6.ip6_dst_ops;
5039	dst_init_metrics(&net->ipv6.ip6_null_entry->dst,
5040			 ip6_template_metrics, true);
 
5041
5042#ifdef CONFIG_IPV6_MULTIPLE_TABLES
5043	net->ipv6.fib6_has_custom_rules = false;
5044	net->ipv6.ip6_prohibit_entry = kmemdup(&ip6_prohibit_entry_template,
5045					       sizeof(*net->ipv6.ip6_prohibit_entry),
5046					       GFP_KERNEL);
5047	if (!net->ipv6.ip6_prohibit_entry)
5048		goto out_ip6_null_entry;
5049	net->ipv6.ip6_prohibit_entry->dst.ops = &net->ipv6.ip6_dst_ops;
5050	dst_init_metrics(&net->ipv6.ip6_prohibit_entry->dst,
5051			 ip6_template_metrics, true);
 
5052
5053	net->ipv6.ip6_blk_hole_entry = kmemdup(&ip6_blk_hole_entry_template,
5054					       sizeof(*net->ipv6.ip6_blk_hole_entry),
5055					       GFP_KERNEL);
5056	if (!net->ipv6.ip6_blk_hole_entry)
5057		goto out_ip6_prohibit_entry;
5058	net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
5059	dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
5060			 ip6_template_metrics, true);
 
 
 
 
5061#endif
5062
5063	net->ipv6.sysctl.flush_delay = 0;
5064	net->ipv6.sysctl.ip6_rt_max_size = 4096;
5065	net->ipv6.sysctl.ip6_rt_gc_min_interval = HZ / 2;
5066	net->ipv6.sysctl.ip6_rt_gc_timeout = 60*HZ;
5067	net->ipv6.sysctl.ip6_rt_gc_interval = 30*HZ;
5068	net->ipv6.sysctl.ip6_rt_gc_elasticity = 9;
5069	net->ipv6.sysctl.ip6_rt_mtu_expires = 10*60*HZ;
5070	net->ipv6.sysctl.ip6_rt_min_advmss = IPV6_MIN_MTU - 20 - 40;
 
5071
5072	net->ipv6.ip6_rt_gc_expire = 30*HZ;
5073
5074	ret = 0;
5075out:
5076	return ret;
5077
5078#ifdef CONFIG_IPV6_MULTIPLE_TABLES
5079out_ip6_prohibit_entry:
5080	kfree(net->ipv6.ip6_prohibit_entry);
5081out_ip6_null_entry:
5082	kfree(net->ipv6.ip6_null_entry);
5083#endif
 
 
5084out_ip6_dst_entries:
5085	dst_entries_destroy(&net->ipv6.ip6_dst_ops);
5086out_ip6_dst_ops:
5087	goto out;
5088}
5089
5090static void __net_exit ip6_route_net_exit(struct net *net)
5091{
 
5092	kfree(net->ipv6.ip6_null_entry);
5093#ifdef CONFIG_IPV6_MULTIPLE_TABLES
5094	kfree(net->ipv6.ip6_prohibit_entry);
5095	kfree(net->ipv6.ip6_blk_hole_entry);
5096#endif
5097	dst_entries_destroy(&net->ipv6.ip6_dst_ops);
5098}
5099
5100static int __net_init ip6_route_net_init_late(struct net *net)
5101{
5102#ifdef CONFIG_PROC_FS
5103	proc_create("ipv6_route", 0, net->proc_net, &ipv6_route_proc_fops);
5104	proc_create("rt6_stats", 0444, net->proc_net, &rt6_stats_seq_fops);
 
 
 
 
 
 
 
 
5105#endif
5106	return 0;
5107}
5108
5109static void __net_exit ip6_route_net_exit_late(struct net *net)
5110{
5111#ifdef CONFIG_PROC_FS
5112	remove_proc_entry("ipv6_route", net->proc_net);
5113	remove_proc_entry("rt6_stats", net->proc_net);
5114#endif
5115}
5116
5117static struct pernet_operations ip6_route_net_ops = {
5118	.init = ip6_route_net_init,
5119	.exit = ip6_route_net_exit,
5120};
5121
5122static int __net_init ipv6_inetpeer_init(struct net *net)
5123{
5124	struct inet_peer_base *bp = kmalloc(sizeof(*bp), GFP_KERNEL);
5125
5126	if (!bp)
5127		return -ENOMEM;
5128	inet_peer_base_init(bp);
5129	net->ipv6.peers = bp;
5130	return 0;
5131}
5132
5133static void __net_exit ipv6_inetpeer_exit(struct net *net)
5134{
5135	struct inet_peer_base *bp = net->ipv6.peers;
5136
5137	net->ipv6.peers = NULL;
5138	inetpeer_invalidate_tree(bp);
5139	kfree(bp);
5140}
5141
5142static struct pernet_operations ipv6_inetpeer_ops = {
5143	.init	=	ipv6_inetpeer_init,
5144	.exit	=	ipv6_inetpeer_exit,
5145};
5146
5147static struct pernet_operations ip6_route_net_late_ops = {
5148	.init = ip6_route_net_init_late,
5149	.exit = ip6_route_net_exit_late,
5150};
5151
5152static struct notifier_block ip6_route_dev_notifier = {
5153	.notifier_call = ip6_route_dev_notify,
5154	.priority = ADDRCONF_NOTIFY_PRIORITY - 10,
5155};
5156
5157void __init ip6_route_init_special_entries(void)
5158{
5159	/* Registering of the loopback is done before this portion of code,
5160	 * the loopback reference in rt6_info will not be taken, do it
5161	 * manually for init_net */
 
5162	init_net.ipv6.ip6_null_entry->dst.dev = init_net.loopback_dev;
5163	init_net.ipv6.ip6_null_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
5164  #ifdef CONFIG_IPV6_MULTIPLE_TABLES
5165	init_net.ipv6.ip6_prohibit_entry->dst.dev = init_net.loopback_dev;
5166	init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
5167	init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
5168	init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
5169  #endif
5170}
5171
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5172int __init ip6_route_init(void)
5173{
5174	int ret;
5175	int cpu;
5176
5177	ret = -ENOMEM;
5178	ip6_dst_ops_template.kmem_cachep =
5179		kmem_cache_create("ip6_dst_cache", sizeof(struct rt6_info), 0,
5180				  SLAB_HWCACHE_ALIGN, NULL);
5181	if (!ip6_dst_ops_template.kmem_cachep)
5182		goto out;
5183
5184	ret = dst_entries_init(&ip6_dst_blackhole_ops);
5185	if (ret)
5186		goto out_kmem_cache;
5187
5188	ret = register_pernet_subsys(&ipv6_inetpeer_ops);
5189	if (ret)
5190		goto out_dst_entries;
5191
5192	ret = register_pernet_subsys(&ip6_route_net_ops);
5193	if (ret)
5194		goto out_register_inetpeer;
5195
5196	ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops_template.kmem_cachep;
5197
5198	ret = fib6_init();
5199	if (ret)
5200		goto out_register_subsys;
5201
5202	ret = xfrm6_init();
5203	if (ret)
5204		goto out_fib6_init;
5205
5206	ret = fib6_rules_init();
5207	if (ret)
5208		goto xfrm6_init;
5209
5210	ret = register_pernet_subsys(&ip6_route_net_late_ops);
5211	if (ret)
5212		goto fib6_rules_init;
5213
5214	ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_NEWROUTE,
5215				   inet6_rtm_newroute, NULL, 0);
5216	if (ret < 0)
5217		goto out_register_late_subsys;
5218
5219	ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_DELROUTE,
5220				   inet6_rtm_delroute, NULL, 0);
5221	if (ret < 0)
5222		goto out_register_late_subsys;
5223
5224	ret = rtnl_register_module(THIS_MODULE, PF_INET6, RTM_GETROUTE,
5225				   inet6_rtm_getroute, NULL,
5226				   RTNL_FLAG_DOIT_UNLOCKED);
5227	if (ret < 0)
5228		goto out_register_late_subsys;
5229
5230	ret = register_netdevice_notifier(&ip6_route_dev_notifier);
 
 
5231	if (ret)
5232		goto out_register_late_subsys;
 
 
5233
5234	for_each_possible_cpu(cpu) {
5235		struct uncached_list *ul = per_cpu_ptr(&rt6_uncached_list, cpu);
5236
5237		INIT_LIST_HEAD(&ul->head);
5238		spin_lock_init(&ul->lock);
5239	}
5240
5241out:
5242	return ret;
5243
5244out_register_late_subsys:
5245	rtnl_unregister_all(PF_INET6);
5246	unregister_pernet_subsys(&ip6_route_net_late_ops);
5247fib6_rules_init:
5248	fib6_rules_cleanup();
5249xfrm6_init:
5250	xfrm6_fini();
5251out_fib6_init:
5252	fib6_gc_cleanup();
5253out_register_subsys:
5254	unregister_pernet_subsys(&ip6_route_net_ops);
5255out_register_inetpeer:
5256	unregister_pernet_subsys(&ipv6_inetpeer_ops);
5257out_dst_entries:
5258	dst_entries_destroy(&ip6_dst_blackhole_ops);
5259out_kmem_cache:
5260	kmem_cache_destroy(ip6_dst_ops_template.kmem_cachep);
5261	goto out;
5262}
5263
5264void ip6_route_cleanup(void)
5265{
 
 
 
 
 
5266	unregister_netdevice_notifier(&ip6_route_dev_notifier);
5267	unregister_pernet_subsys(&ip6_route_net_late_ops);
5268	fib6_rules_cleanup();
5269	xfrm6_fini();
5270	fib6_gc_cleanup();
5271	unregister_pernet_subsys(&ipv6_inetpeer_ops);
5272	unregister_pernet_subsys(&ip6_route_net_ops);
5273	dst_entries_destroy(&ip6_dst_blackhole_ops);
5274	kmem_cache_destroy(ip6_dst_ops_template.kmem_cachep);
5275}