File Index
Files and directories
Sign in
FILE

route.c

File preview with syntax highlighting.

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