Linux Audio

Check our new training course

Loading...
v3.15
 
   1/*
   2 *   This program is free software; you can redistribute it and/or
   3 *   modify it under the terms of the GNU General Public License
   4 *   as published by the Free Software Foundation; either version
   5 *   2 of the License, or (at your option) any later version.
   6 *
   7 *   Robert Olsson <robert.olsson@its.uu.se> Uppsala Universitet
   8 *     & Swedish University of Agricultural Sciences.
   9 *
  10 *   Jens Laas <jens.laas@data.slu.se> Swedish University of
  11 *     Agricultural Sciences.
  12 *
  13 *   Hans Liss <hans.liss@its.uu.se>  Uppsala Universitet
  14 *
  15 * This work is based on the LPC-trie which is originally described in:
  16 *
  17 * An experimental study of compression methods for dynamic tries
  18 * Stefan Nilsson and Matti Tikkanen. Algorithmica, 33(1):19-33, 2002.
  19 * http://www.csc.kth.se/~snilsson/software/dyntrie2/
  20 *
  21 *
  22 * IP-address lookup using LC-tries. Stefan Nilsson and Gunnar Karlsson
  23 * IEEE Journal on Selected Areas in Communications, 17(6):1083-1092, June 1999
  24 *
  25 *
  26 * Code from fib_hash has been reused which includes the following header:
  27 *
  28 *
  29 * INET		An implementation of the TCP/IP protocol suite for the LINUX
  30 *		operating system.  INET is implemented using the  BSD Socket
  31 *		interface as the means of communication with the user level.
  32 *
  33 *		IPv4 FIB: lookup engine and maintenance routines.
  34 *
  35 *
  36 * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
  37 *
  38 *		This program is free software; you can redistribute it and/or
  39 *		modify it under the terms of the GNU General Public License
  40 *		as published by the Free Software Foundation; either version
  41 *		2 of the License, or (at your option) any later version.
  42 *
  43 * Substantial contributions to this work comes from:
  44 *
  45 *		David S. Miller, <davem@davemloft.net>
  46 *		Stephen Hemminger <shemminger@osdl.org>
  47 *		Paul E. McKenney <paulmck@us.ibm.com>
  48 *		Patrick McHardy <kaber@trash.net>
  49 */
  50
  51#define VERSION "0.409"
  52
  53#include <asm/uaccess.h>
  54#include <linux/bitops.h>
  55#include <linux/types.h>
  56#include <linux/kernel.h>
  57#include <linux/mm.h>
  58#include <linux/string.h>
  59#include <linux/socket.h>
  60#include <linux/sockios.h>
  61#include <linux/errno.h>
  62#include <linux/in.h>
  63#include <linux/inet.h>
  64#include <linux/inetdevice.h>
  65#include <linux/netdevice.h>
  66#include <linux/if_arp.h>
  67#include <linux/proc_fs.h>
  68#include <linux/rcupdate.h>
 
  69#include <linux/skbuff.h>
  70#include <linux/netlink.h>
  71#include <linux/init.h>
  72#include <linux/list.h>
  73#include <linux/slab.h>
  74#include <linux/export.h>
 
 
  75#include <net/net_namespace.h>
 
  76#include <net/ip.h>
  77#include <net/protocol.h>
  78#include <net/route.h>
  79#include <net/tcp.h>
  80#include <net/sock.h>
  81#include <net/ip_fib.h>
 
 
  82#include "fib_lookup.h"
  83
  84#define MAX_STAT_DEPTH 32
  85
  86#define KEYLENGTH (8*sizeof(t_key))
  87
  88typedef unsigned int t_key;
 
 
 
 
 
 
 
 
 
 
 
  89
  90#define T_TNODE 0
  91#define T_LEAF  1
  92#define NODE_TYPE_MASK	0x1UL
  93#define NODE_TYPE(node) ((node)->parent & NODE_TYPE_MASK)
 
 
 
 
 
 
 
 
 
 
 
 
  94
  95#define IS_TNODE(n) (!(n->parent & T_LEAF))
  96#define IS_LEAF(n) (n->parent & T_LEAF)
  97
  98struct rt_trie_node {
  99	unsigned long parent;
 100	t_key key;
 101};
 102
 103struct leaf {
 104	unsigned long parent;
 105	t_key key;
 106	struct hlist_head list;
 107	struct rcu_head rcu;
 108};
 109
 110struct leaf_info {
 111	struct hlist_node hlist;
 112	int plen;
 113	u32 mask_plen; /* ntohl(inet_make_mask(plen)) */
 114	struct list_head falh;
 115	struct rcu_head rcu;
 116};
 117
 118struct tnode {
 119	unsigned long parent;
 120	t_key key;
 121	unsigned char pos;		/* 2log(KEYLENGTH) bits needed */
 122	unsigned char bits;		/* 2log(KEYLENGTH) bits needed */
 123	unsigned int full_children;	/* KEYLENGTH bits needed */
 124	unsigned int empty_children;	/* KEYLENGTH bits needed */
 125	union {
 126		struct rcu_head rcu;
 127		struct tnode *tnode_free;
 
 
 128	};
 129	struct rt_trie_node __rcu *child[0];
 130};
 131
 
 
 
 
 
 
 
 
 
 
 
 
 132#ifdef CONFIG_IP_FIB_TRIE_STATS
 133struct trie_use_stats {
 134	unsigned int gets;
 135	unsigned int backtrack;
 136	unsigned int semantic_match_passed;
 137	unsigned int semantic_match_miss;
 138	unsigned int null_node_hit;
 139	unsigned int resize_node_skipped;
 140};
 141#endif
 142
 143struct trie_stat {
 144	unsigned int totdepth;
 145	unsigned int maxdepth;
 146	unsigned int tnodes;
 147	unsigned int leaves;
 148	unsigned int nullpointers;
 149	unsigned int prefixes;
 150	unsigned int nodesizes[MAX_STAT_DEPTH];
 151};
 152
 153struct trie {
 154	struct rt_trie_node __rcu *trie;
 155#ifdef CONFIG_IP_FIB_TRIE_STATS
 156	struct trie_use_stats stats;
 157#endif
 158};
 159
 160static void tnode_put_child_reorg(struct tnode *tn, int i, struct rt_trie_node *n,
 161				  int wasfull);
 162static struct rt_trie_node *resize(struct trie *t, struct tnode *tn);
 163static struct tnode *inflate(struct trie *t, struct tnode *tn);
 164static struct tnode *halve(struct trie *t, struct tnode *tn);
 165/* tnodes to free after resize(); protected by RTNL */
 166static struct tnode *tnode_free_head;
 167static size_t tnode_free_size;
 168
 169/*
 170 * synchronize_rcu after call_rcu for that many pages; it should be especially
 171 * useful before resizing the root node with PREEMPT_NONE configs; the value was
 172 * obtained experimentally, aiming to avoid visible slowdown.
 173 */
 174static const int sync_pages = 128;
 
 
 175
 176static struct kmem_cache *fn_alias_kmem __read_mostly;
 177static struct kmem_cache *trie_leaf_kmem __read_mostly;
 178
 179/*
 180 * caller must hold RTNL
 181 */
 182static inline struct tnode *node_parent(const struct rt_trie_node *node)
 183{
 184	unsigned long parent;
 185
 186	parent = rcu_dereference_index_check(node->parent, lockdep_rtnl_is_held());
 187
 188	return (struct tnode *)(parent & ~NODE_TYPE_MASK);
 189}
 190
 191/*
 192 * caller must hold RCU read lock or RTNL
 193 */
 194static inline struct tnode *node_parent_rcu(const struct rt_trie_node *node)
 195{
 196	unsigned long parent;
 197
 198	parent = rcu_dereference_index_check(node->parent, rcu_read_lock_held() ||
 199							   lockdep_rtnl_is_held());
 200
 201	return (struct tnode *)(parent & ~NODE_TYPE_MASK);
 202}
 
 203
 204/* Same as rcu_assign_pointer
 205 * but that macro() assumes that value is a pointer.
 206 */
 207static inline void node_set_parent(struct rt_trie_node *node, struct tnode *ptr)
 208{
 209	smp_wmb();
 210	node->parent = (unsigned long)ptr | NODE_TYPE(node);
 211}
 212
 213/*
 214 * caller must hold RTNL
 215 */
 216static inline struct rt_trie_node *tnode_get_child(const struct tnode *tn, unsigned int i)
 217{
 218	BUG_ON(i >= 1U << tn->bits);
 219
 220	return rtnl_dereference(tn->child[i]);
 221}
 222
 223/*
 224 * caller must hold RCU read lock or RTNL
 225 */
 226static inline struct rt_trie_node *tnode_get_child_rcu(const struct tnode *tn, unsigned int i)
 227{
 228	BUG_ON(i >= 1U << tn->bits);
 229
 230	return rcu_dereference_rtnl(tn->child[i]);
 231}
 232
 233static inline int tnode_child_length(const struct tnode *tn)
 234{
 235	return 1 << tn->bits;
 236}
 237
 238static inline t_key mask_pfx(t_key k, unsigned int l)
 239{
 240	return (l == 0) ? 0 : k >> (KEYLENGTH-l) << (KEYLENGTH-l);
 241}
 242
 243static inline t_key tkey_extract_bits(t_key a, unsigned int offset, unsigned int bits)
 244{
 245	if (offset < KEYLENGTH)
 246		return ((t_key)(a << offset)) >> (KEYLENGTH - bits);
 247	else
 248		return 0;
 249}
 250
 251static inline int tkey_equals(t_key a, t_key b)
 252{
 253	return a == b;
 254}
 255
 256static inline int tkey_sub_equals(t_key a, int offset, int bits, t_key b)
 257{
 258	if (bits == 0 || offset >= KEYLENGTH)
 259		return 1;
 260	bits = bits > KEYLENGTH ? KEYLENGTH : bits;
 261	return ((a ^ b) << offset) >> (KEYLENGTH - bits) == 0;
 262}
 263
 264static inline int tkey_mismatch(t_key a, int offset, t_key b)
 265{
 266	t_key diff = a ^ b;
 267	int i = offset;
 268
 269	if (!diff)
 270		return 0;
 271	while ((diff << i) >> (KEYLENGTH-1) == 0)
 272		i++;
 273	return i;
 274}
 275
 276/*
 277  To understand this stuff, an understanding of keys and all their bits is
 278  necessary. Every node in the trie has a key associated with it, but not
 279  all of the bits in that key are significant.
 280
 281  Consider a node 'n' and its parent 'tp'.
 282
 283  If n is a leaf, every bit in its key is significant. Its presence is
 284  necessitated by path compression, since during a tree traversal (when
 285  searching for a leaf - unless we are doing an insertion) we will completely
 286  ignore all skipped bits we encounter. Thus we need to verify, at the end of
 287  a potentially successful search, that we have indeed been walking the
 288  correct key path.
 289
 290  Note that we can never "miss" the correct key in the tree if present by
 291  following the wrong path. Path compression ensures that segments of the key
 292  that are the same for all keys with a given prefix are skipped, but the
 293  skipped part *is* identical for each node in the subtrie below the skipped
 294  bit! trie_insert() in this implementation takes care of that - note the
 295  call to tkey_sub_equals() in trie_insert().
 296
 297  if n is an internal node - a 'tnode' here, the various parts of its key
 298  have many different meanings.
 299
 300  Example:
 301  _________________________________________________________________
 302  | i | i | i | i | i | i | i | N | N | N | S | S | S | S | S | C |
 303  -----------------------------------------------------------------
 304    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
 305
 306  _________________________________________________________________
 307  | C | C | C | u | u | u | u | u | u | u | u | u | u | u | u | u |
 308  -----------------------------------------------------------------
 309   16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31
 310
 311  tp->pos = 7
 312  tp->bits = 3
 313  n->pos = 15
 314  n->bits = 4
 315
 316  First, let's just ignore the bits that come before the parent tp, that is
 317  the bits from 0 to (tp->pos-1). They are *known* but at this point we do
 318  not use them for anything.
 319
 320  The bits from (tp->pos) to (tp->pos + tp->bits - 1) - "N", above - are the
 321  index into the parent's child array. That is, they will be used to find
 322  'n' among tp's children.
 323
 324  The bits from (tp->pos + tp->bits) to (n->pos - 1) - "S" - are skipped bits
 325  for the node n.
 326
 327  All the bits we have seen so far are significant to the node n. The rest
 328  of the bits are really not needed or indeed known in n->key.
 329
 330  The bits from (n->pos) to (n->pos + n->bits - 1) - "C" - are the index into
 331  n's child array, and will of course be different for each child.
 332
 333
 334  The rest of the bits, from (n->pos + n->bits) onward, are completely unknown
 335  at this point.
 336
 337*/
 338
 339static inline void check_tnode(const struct tnode *tn)
 340{
 341	WARN_ON(tn && tn->pos+tn->bits > 32);
 342}
 343
 344static const int halve_threshold = 25;
 345static const int inflate_threshold = 50;
 346static const int halve_threshold_root = 15;
 347static const int inflate_threshold_root = 30;
 348
 349static void __alias_free_mem(struct rcu_head *head)
 350{
 351	struct fib_alias *fa = container_of(head, struct fib_alias, rcu);
 352	kmem_cache_free(fn_alias_kmem, fa);
 353}
 354
 355static inline void alias_free_mem_rcu(struct fib_alias *fa)
 356{
 357	call_rcu(&fa->rcu, __alias_free_mem);
 358}
 359
 360static void __leaf_free_rcu(struct rcu_head *head)
 361{
 362	struct leaf *l = container_of(head, struct leaf, rcu);
 363	kmem_cache_free(trie_leaf_kmem, l);
 364}
 365
 366static inline void free_leaf(struct leaf *l)
 367{
 368	call_rcu(&l->rcu, __leaf_free_rcu);
 369}
 370
 371static inline void free_leaf_info(struct leaf_info *leaf)
 372{
 373	kfree_rcu(leaf, rcu);
 
 374}
 375
 376static struct tnode *tnode_alloc(size_t size)
 
 
 377{
 
 
 
 
 
 
 
 
 
 378	if (size <= PAGE_SIZE)
 379		return kzalloc(size, GFP_KERNEL);
 380	else
 381		return vzalloc(size);
 382}
 383
 384static void __tnode_free_rcu(struct rcu_head *head)
 385{
 386	struct tnode *tn = container_of(head, struct tnode, rcu);
 387	size_t size = sizeof(struct tnode) +
 388		      (sizeof(struct rt_trie_node *) << tn->bits);
 389
 390	if (size <= PAGE_SIZE)
 391		kfree(tn);
 392	else
 393		vfree(tn);
 394}
 395
 396static inline void tnode_free(struct tnode *tn)
 397{
 398	if (IS_LEAF(tn))
 399		free_leaf((struct leaf *) tn);
 400	else
 401		call_rcu(&tn->rcu, __tnode_free_rcu);
 402}
 403
 404static void tnode_free_safe(struct tnode *tn)
 405{
 406	BUG_ON(IS_LEAF(tn));
 407	tn->tnode_free = tnode_free_head;
 408	tnode_free_head = tn;
 409	tnode_free_size += sizeof(struct tnode) +
 410			   (sizeof(struct rt_trie_node *) << tn->bits);
 411}
 412
 413static void tnode_free_flush(void)
 414{
 415	struct tnode *tn;
 
 416
 417	while ((tn = tnode_free_head)) {
 418		tnode_free_head = tn->tnode_free;
 419		tn->tnode_free = NULL;
 420		tnode_free(tn);
 421	}
 422
 423	if (tnode_free_size >= PAGE_SIZE * sync_pages) {
 424		tnode_free_size = 0;
 425		synchronize_rcu();
 426	}
 427}
 
 
 
 
 
 428
 429static struct leaf *leaf_new(void)
 430{
 431	struct leaf *l = kmem_cache_alloc(trie_leaf_kmem, GFP_KERNEL);
 432	if (l) {
 433		l->parent = T_LEAF;
 434		INIT_HLIST_HEAD(&l->list);
 435	}
 436	return l;
 437}
 438
 439static struct leaf_info *leaf_info_new(int plen)
 440{
 441	struct leaf_info *li = kmalloc(sizeof(struct leaf_info),  GFP_KERNEL);
 442	if (li) {
 443		li->plen = plen;
 444		li->mask_plen = ntohl(inet_make_mask(plen));
 445		INIT_LIST_HEAD(&li->falh);
 446	}
 447	return li;
 448}
 449
 450static struct tnode *tnode_new(t_key key, int pos, int bits)
 451{
 452	size_t sz = sizeof(struct tnode) + (sizeof(struct rt_trie_node *) << bits);
 453	struct tnode *tn = tnode_alloc(sz);
 454
 455	if (tn) {
 456		tn->parent = T_TNODE;
 457		tn->pos = pos;
 458		tn->bits = bits;
 459		tn->key = key;
 460		tn->full_children = 0;
 461		tn->empty_children = 1<<bits;
 462	}
 463
 464	pr_debug("AT %p s=%zu %zu\n", tn, sizeof(struct tnode),
 465		 sizeof(struct rt_trie_node *) << bits);
 466	return tn;
 467}
 468
 469/*
 470 * Check whether a tnode 'n' is "full", i.e. it is an internal node
 471 * and no bits are skipped. See discussion in dyntree paper p. 6
 472 */
 473
 474static inline int tnode_full(const struct tnode *tn, const struct rt_trie_node *n)
 475{
 476	if (n == NULL || IS_LEAF(n))
 477		return 0;
 
 478
 479	return ((struct tnode *) n)->pos == tn->pos + tn->bits;
 480}
 481
 482static inline void put_child(struct tnode *tn, int i,
 483			     struct rt_trie_node *n)
 
 
 484{
 485	tnode_put_child_reorg(tn, i, n, -1);
 486}
 487
 488 /*
 489  * Add a child at position i overwriting the old value.
 490  * Update the value of full_children and empty_children.
 491  */
 492
 493static void tnode_put_child_reorg(struct tnode *tn, int i, struct rt_trie_node *n,
 494				  int wasfull)
 495{
 496	struct rt_trie_node *chi = rtnl_dereference(tn->child[i]);
 497	int isfull;
 498
 499	BUG_ON(i >= 1<<tn->bits);
 500
 501	/* update emptyChildren */
 502	if (n == NULL && chi != NULL)
 503		tn->empty_children++;
 504	else if (n != NULL && chi == NULL)
 505		tn->empty_children--;
 506
 507	/* update fullChildren */
 508	if (wasfull == -1)
 509		wasfull = tnode_full(tn, chi);
 510
 511	isfull = tnode_full(tn, n);
 
 512	if (wasfull && !isfull)
 513		tn->full_children--;
 514	else if (!wasfull && isfull)
 515		tn->full_children++;
 516
 517	if (n)
 518		node_set_parent(n, tn);
 519
 520	rcu_assign_pointer(tn->child[i], n);
 521}
 522
 523#define MAX_WORK 10
 524static struct rt_trie_node *resize(struct trie *t, struct tnode *tn)
 525{
 526	int i;
 527	struct tnode *old_tn;
 528	int inflate_threshold_use;
 529	int halve_threshold_use;
 530	int max_work;
 531
 532	if (!tn)
 533		return NULL;
 
 534
 535	pr_debug("In tnode_resize %p inflate_threshold=%d threshold=%d\n",
 536		 tn, inflate_threshold, halve_threshold);
 537
 538	/* No children */
 539	if (tn->empty_children == tnode_child_length(tn)) {
 540		tnode_free_safe(tn);
 541		return NULL;
 
 
 
 
 542	}
 543	/* One child */
 544	if (tn->empty_children == tnode_child_length(tn) - 1)
 545		goto one_child;
 546	/*
 547	 * Double as long as the resulting node has a number of
 548	 * nonempty nodes that are above the threshold.
 549	 */
 550
 551	/*
 552	 * From "Implementing a dynamic compressed trie" by Stefan Nilsson of
 553	 * the Helsinki University of Technology and Matti Tikkanen of Nokia
 554	 * Telecommunications, page 6:
 555	 * "A node is doubled if the ratio of non-empty children to all
 556	 * children in the *doubled* node is at least 'high'."
 557	 *
 558	 * 'high' in this instance is the variable 'inflate_threshold'. It
 559	 * is expressed as a percentage, so we multiply it with
 560	 * tnode_child_length() and instead of multiplying by 2 (since the
 561	 * child array will be doubled by inflate()) and multiplying
 562	 * the left-hand side by 100 (to handle the percentage thing) we
 563	 * multiply the left-hand side by 50.
 564	 *
 565	 * The left-hand side may look a bit weird: tnode_child_length(tn)
 566	 * - tn->empty_children is of course the number of non-null children
 567	 * in the current node. tn->full_children is the number of "full"
 568	 * children, that is non-null tnodes with a skip value of 0.
 569	 * All of those will be doubled in the resulting inflated tnode, so
 570	 * we just count them one extra time here.
 571	 *
 572	 * A clearer way to write this would be:
 573	 *
 574	 * to_be_doubled = tn->full_children;
 575	 * not_to_be_doubled = tnode_child_length(tn) - tn->empty_children -
 576	 *     tn->full_children;
 577	 *
 578	 * new_child_length = tnode_child_length(tn) * 2;
 579	 *
 580	 * new_fill_factor = 100 * (not_to_be_doubled + 2*to_be_doubled) /
 581	 *      new_child_length;
 582	 * if (new_fill_factor >= inflate_threshold)
 583	 *
 584	 * ...and so on, tho it would mess up the while () loop.
 585	 *
 586	 * anyway,
 587	 * 100 * (not_to_be_doubled + 2*to_be_doubled) / new_child_length >=
 588	 *      inflate_threshold
 589	 *
 590	 * avoid a division:
 591	 * 100 * (not_to_be_doubled + 2*to_be_doubled) >=
 592	 *      inflate_threshold * new_child_length
 593	 *
 594	 * expand not_to_be_doubled and to_be_doubled, and shorten:
 595	 * 100 * (tnode_child_length(tn) - tn->empty_children +
 596	 *    tn->full_children) >= inflate_threshold * new_child_length
 597	 *
 598	 * expand new_child_length:
 599	 * 100 * (tnode_child_length(tn) - tn->empty_children +
 600	 *    tn->full_children) >=
 601	 *      inflate_threshold * tnode_child_length(tn) * 2
 602	 *
 603	 * shorten again:
 604	 * 50 * (tn->full_children + tnode_child_length(tn) -
 605	 *    tn->empty_children) >= inflate_threshold *
 606	 *    tnode_child_length(tn)
 607	 *
 608	 */
 609
 610	check_tnode(tn);
 
 
 
 
 
 
 
 611
 612	/* Keep root node larger  */
 
 
 
 613
 614	if (!node_parent((struct rt_trie_node *)tn)) {
 615		inflate_threshold_use = inflate_threshold_root;
 616		halve_threshold_use = halve_threshold_root;
 617	} else {
 618		inflate_threshold_use = inflate_threshold;
 619		halve_threshold_use = halve_threshold;
 620	}
 621
 622	max_work = MAX_WORK;
 623	while ((tn->full_children > 0 &&  max_work-- &&
 624		50 * (tn->full_children + tnode_child_length(tn)
 625		      - tn->empty_children)
 626		>= inflate_threshold_use * tnode_child_length(tn))) {
 627
 628		old_tn = tn;
 629		tn = inflate(t, tn);
 
 
 630
 631		if (IS_ERR(tn)) {
 632			tn = old_tn;
 633#ifdef CONFIG_IP_FIB_TRIE_STATS
 634			t->stats.resize_node_skipped++;
 635#endif
 636			break;
 637		}
 638	}
 639
 640	check_tnode(tn);
 641
 642	/* Return if at least one inflate is run */
 643	if (max_work != MAX_WORK)
 644		return (struct rt_trie_node *) tn;
 645
 646	/*
 647	 * Halve as long as the number of empty children in this
 648	 * node is above threshold.
 649	 */
 650
 651	max_work = MAX_WORK;
 652	while (tn->bits > 1 &&  max_work-- &&
 653	       100 * (tnode_child_length(tn) - tn->empty_children) <
 654	       halve_threshold_use * tnode_child_length(tn)) {
 655
 656		old_tn = tn;
 657		tn = halve(t, tn);
 658		if (IS_ERR(tn)) {
 659			tn = old_tn;
 660#ifdef CONFIG_IP_FIB_TRIE_STATS
 661			t->stats.resize_node_skipped++;
 662#endif
 663			break;
 664		}
 665	}
 
 666
 
 
 
 
 
 
 667
 668	/* Only one child remains */
 669	if (tn->empty_children == tnode_child_length(tn) - 1) {
 670one_child:
 671		for (i = 0; i < tnode_child_length(tn); i++) {
 672			struct rt_trie_node *n;
 673
 674			n = rtnl_dereference(tn->child[i]);
 675			if (!n)
 676				continue;
 677
 678			/* compress one level */
 
 679
 680			node_set_parent(n, NULL);
 681			tnode_free_safe(tn);
 682			return n;
 683		}
 684	}
 685	return (struct rt_trie_node *) tn;
 686}
 687
 688
 689static void tnode_clean_free(struct tnode *tn)
 690{
 691	int i;
 692	struct tnode *tofree;
 693
 694	for (i = 0; i < tnode_child_length(tn); i++) {
 695		tofree = (struct tnode *)rtnl_dereference(tn->child[i]);
 696		if (tofree)
 697			tnode_free(tofree);
 698	}
 699	tnode_free(tn);
 
 700}
 701
 702static struct tnode *inflate(struct trie *t, struct tnode *tn)
 
 703{
 704	struct tnode *oldtnode = tn;
 705	int olen = tnode_child_length(tn);
 706	int i;
 707
 708	pr_debug("In inflate\n");
 709
 710	tn = tnode_new(oldtnode->key, oldtnode->pos, oldtnode->bits + 1);
 711
 712	if (!tn)
 713		return ERR_PTR(-ENOMEM);
 714
 715	/*
 716	 * Preallocate and store tnodes before the actual work so we
 717	 * don't get into an inconsistent state if memory allocation
 718	 * fails. In case of failure we return the oldnode and  inflate
 719	 * of tnode is ignored.
 720	 */
 721
 722	for (i = 0; i < olen; i++) {
 723		struct tnode *inode;
 724
 725		inode = (struct tnode *) tnode_get_child(oldtnode, i);
 726		if (inode &&
 727		    IS_TNODE(inode) &&
 728		    inode->pos == oldtnode->pos + oldtnode->bits &&
 729		    inode->bits > 1) {
 730			struct tnode *left, *right;
 731			t_key m = ~0U << (KEYLENGTH - 1) >> inode->pos;
 732
 733			left = tnode_new(inode->key&(~m), inode->pos + 1,
 734					 inode->bits - 1);
 735			if (!left)
 736				goto nomem;
 737
 738			right = tnode_new(inode->key|m, inode->pos + 1,
 739					  inode->bits - 1);
 740
 741			if (!right) {
 742				tnode_free(left);
 743				goto nomem;
 744			}
 745
 746			put_child(tn, 2*i, (struct rt_trie_node *) left);
 747			put_child(tn, 2*i+1, (struct rt_trie_node *) right);
 748		}
 749	}
 750
 751	for (i = 0; i < olen; i++) {
 752		struct tnode *inode;
 753		struct rt_trie_node *node = tnode_get_child(oldtnode, i);
 754		struct tnode *left, *right;
 755		int size, j;
 756
 757		/* An empty child */
 758		if (node == NULL)
 759			continue;
 760
 761		/* A leaf or an internal node with skipped bits */
 762
 763		if (IS_LEAF(node) || ((struct tnode *) node)->pos >
 764		   tn->pos + tn->bits - 1) {
 765			put_child(tn,
 766				tkey_extract_bits(node->key, oldtnode->pos, oldtnode->bits + 1),
 767				node);
 768			continue;
 769		}
 770
 771		/* An internal node with two children */
 772		inode = (struct tnode *) node;
 773
 
 774		if (inode->bits == 1) {
 775			put_child(tn, 2*i, rtnl_dereference(inode->child[0]));
 776			put_child(tn, 2*i+1, rtnl_dereference(inode->child[1]));
 777
 778			tnode_free_safe(inode);
 779			continue;
 780		}
 781
 782		/* An internal node with more than two children */
 783
 784		/* We will replace this node 'inode' with two new
 785		 * ones, 'left' and 'right', each with half of the
 786		 * original children. The two new nodes will have
 787		 * a position one bit further down the key and this
 788		 * means that the "significant" part of their keys
 789		 * (see the discussion near the top of this file)
 790		 * will differ by one bit, which will be "0" in
 791		 * left's key and "1" in right's key. Since we are
 792		 * moving the key position by one step, the bit that
 793		 * we are moving away from - the bit at position
 794		 * (inode->pos) - is the one that will differ between
 795		 * left and right. So... we synthesize that bit in the
 796		 * two  new keys.
 797		 * The mask 'm' below will be a single "one" bit at
 798		 * the position (inode->pos)
 799		 */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 800
 801		/* Use the old key, but set the new significant
 802		 *   bit to zero.
 803		 */
 
 
 
 
 
 
 
 
 
 
 
 804
 805		left = (struct tnode *) tnode_get_child(tn, 2*i);
 806		put_child(tn, 2*i, NULL);
 807
 808		BUG_ON(!left);
 
 
 809
 810		right = (struct tnode *) tnode_get_child(tn, 2*i+1);
 811		put_child(tn, 2*i+1, NULL);
 812
 813		BUG_ON(!right);
 
 
 
 
 
 
 
 
 814
 815		size = tnode_child_length(left);
 816		for (j = 0; j < size; j++) {
 817			put_child(left, j, rtnl_dereference(inode->child[j]));
 818			put_child(right, j, rtnl_dereference(inode->child[j + size]));
 819		}
 820		put_child(tn, 2*i, resize(t, left));
 821		put_child(tn, 2*i+1, resize(t, right));
 822
 823		tnode_free_safe(inode);
 
 
 
 
 
 
 
 
 
 
 
 
 824	}
 825	tnode_free_safe(oldtnode);
 826	return tn;
 
 827nomem:
 828	tnode_clean_free(tn);
 829	return ERR_PTR(-ENOMEM);
 
 
 830}
 831
 832static struct tnode *halve(struct trie *t, struct tnode *tn)
 
 833{
 834	struct tnode *oldtnode = tn;
 835	struct rt_trie_node *left, *right;
 836	int i;
 837	int olen = tnode_child_length(tn);
 838
 839	pr_debug("In halve\n");
 
 
 840
 841	tn = tnode_new(oldtnode->key, oldtnode->pos, oldtnode->bits - 1);
 
 
 
 842
 843	if (!tn)
 844		return ERR_PTR(-ENOMEM);
 845
 846	/*
 847	 * Preallocate and store tnodes before the actual work so we
 848	 * don't get into an inconsistent state if memory allocation
 849	 * fails. In case of failure we return the oldnode and halve
 850	 * of tnode is ignored.
 851	 */
 852
 853	for (i = 0; i < olen; i += 2) {
 854		left = tnode_get_child(oldtnode, i);
 855		right = tnode_get_child(oldtnode, i+1);
 
 
 856
 857		/* Two nonempty children */
 858		if (left && right) {
 859			struct tnode *newn;
 
 
 860
 861			newn = tnode_new(left->key, tn->pos + tn->bits, 1);
 
 
 
 
 
 
 862
 863			if (!newn)
 864				goto nomem;
 865
 866			put_child(tn, i/2, (struct rt_trie_node *)newn);
 867		}
 
 
 868
 
 
 
 869	}
 870
 871	for (i = 0; i < olen; i += 2) {
 872		struct tnode *newBinNode;
 873
 874		left = tnode_get_child(oldtnode, i);
 875		right = tnode_get_child(oldtnode, i+1);
 876
 877		/* At least one of the children is empty */
 878		if (left == NULL) {
 879			if (right == NULL)    /* Both are empty */
 880				continue;
 881			put_child(tn, i/2, right);
 882			continue;
 883		}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 884
 885		if (right == NULL) {
 886			put_child(tn, i/2, left);
 887			continue;
 888		}
 889
 890		/* Two nonempty children */
 891		newBinNode = (struct tnode *) tnode_get_child(tn, i/2);
 892		put_child(tn, i/2, NULL);
 893		put_child(newBinNode, 0, left);
 894		put_child(newBinNode, 1, right);
 895		put_child(tn, i/2, resize(t, newBinNode));
 896	}
 897	tnode_free_safe(oldtnode);
 898	return tn;
 899nomem:
 900	tnode_clean_free(tn);
 901	return ERR_PTR(-ENOMEM);
 902}
 903
 904/* readside must use rcu_read_lock currently dump routines
 905 via get_fa_head and dump */
 906
 907static struct leaf_info *find_leaf_info(struct leaf *l, int plen)
 908{
 909	struct hlist_head *head = &l->list;
 910	struct leaf_info *li;
 911
 912	hlist_for_each_entry_rcu(li, head, hlist)
 913		if (li->plen == plen)
 914			return li;
 915
 916	return NULL;
 
 
 917}
 918
 919static inline struct list_head *get_fa_head(struct leaf *l, int plen)
 920{
 921	struct leaf_info *li = find_leaf_info(l, plen);
 922
 923	if (!li)
 924		return NULL;
 
 
 
 925
 926	return &li->falh;
 
 927}
 928
 929static void insert_leaf_info(struct hlist_head *head, struct leaf_info *new)
 
 930{
 931	struct leaf_info *li = NULL, *last = NULL;
 
 
 
 
 
 932
 933	if (hlist_empty(head)) {
 934		hlist_add_head_rcu(&new->hlist, head);
 935	} else {
 936		hlist_for_each_entry(li, head, hlist) {
 937			if (new->plen > li->plen)
 938				break;
 939
 940			last = li;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 941		}
 942		if (last)
 943			hlist_add_after_rcu(&last->hlist, &new->hlist);
 944		else
 945			hlist_add_before_rcu(&new->hlist, &li->hlist);
 946	}
 947}
 948
 949/* rcu_read_lock needs to be hold by caller from readside */
 
 950
 951static struct leaf *
 952fib_find_node(struct trie *t, u32 key)
 953{
 954	int pos;
 955	struct tnode *tn;
 956	struct rt_trie_node *n;
 957
 958	pos = 0;
 959	n = rcu_dereference_rtnl(t->trie);
 960
 961	while (n != NULL &&  NODE_TYPE(n) == T_TNODE) {
 962		tn = (struct tnode *) n;
 963
 964		check_tnode(tn);
 965
 966		if (tkey_sub_equals(tn->key, pos, tn->pos-pos, key)) {
 967			pos = tn->pos + tn->bits;
 968			n = tnode_get_child_rcu(tn,
 969						tkey_extract_bits(key,
 970								  tn->pos,
 971								  tn->bits));
 972		} else
 973			break;
 
 
 
 
 974	}
 975	/* Case we have found a leaf. Compare prefixes */
 976
 977	if (n != NULL && IS_LEAF(n) && tkey_equals(key, n->key))
 978		return (struct leaf *)n;
 
 979
 980	return NULL;
 
 981}
 982
 983static void trie_rebalance(struct trie *t, struct tnode *tn)
 984{
 985	int wasfull;
 986	t_key cindex, key;
 987	struct tnode *tp;
 988
 989	key = tn->key;
 
 
 
 990
 991	while (tn != NULL && (tp = node_parent((struct rt_trie_node *)tn)) != NULL) {
 992		cindex = tkey_extract_bits(key, tp->pos, tp->bits);
 993		wasfull = tnode_full(tp, tnode_get_child(tp, cindex));
 994		tn = (struct tnode *)resize(t, tn);
 995
 996		tnode_put_child_reorg(tp, cindex,
 997				      (struct rt_trie_node *)tn, wasfull);
 
 
 
 
 
 
 
 
 
 
 
 
 998
 999		tp = node_parent((struct rt_trie_node *) tn);
1000		if (!tp)
1001			rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
1002
1003		tnode_free_flush();
1004		if (!tp)
1005			break;
1006		tn = tp;
1007	}
1008
1009	/* Handle last (top) tnode */
1010	if (IS_TNODE(tn))
1011		tn = (struct tnode *)resize(t, tn);
1012
1013	rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
1014	tnode_free_flush();
1015}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1016
1017/* only used from updater-side */
 
1018
1019static struct list_head *fib_insert_node(struct trie *t, u32 key, int plen)
 
 
 
 
 
 
 
1020{
1021	int pos, newpos;
1022	struct tnode *tp = NULL, *tn = NULL;
1023	struct rt_trie_node *n;
1024	struct leaf *l;
1025	int missbit;
1026	struct list_head *fa_head = NULL;
1027	struct leaf_info *li;
1028	t_key cindex;
1029
1030	pos = 0;
1031	n = rtnl_dereference(t->trie);
1032
1033	/* If we point to NULL, stop. Either the tree is empty and we should
1034	 * just put a new leaf in if, or we have reached an empty child slot,
1035	 * and we should just put our new leaf in that.
1036	 * If we point to a T_TNODE, check if it matches our key. Note that
1037	 * a T_TNODE might be skipping any number of bits - its 'pos' need
1038	 * not be the parent's 'pos'+'bits'!
1039	 *
1040	 * If it does match the current key, get pos/bits from it, extract
1041	 * the index from our key, push the T_TNODE and walk the tree.
1042	 *
1043	 * If it doesn't, we have to replace it with a new T_TNODE.
1044	 *
1045	 * If we point to a T_LEAF, it might or might not have the same key
1046	 * as we do. If it does, just change the value, update the T_LEAF's
1047	 * value, and return it.
1048	 * If it doesn't, we need to replace it with a T_TNODE.
1049	 */
1050
1051	while (n != NULL &&  NODE_TYPE(n) == T_TNODE) {
1052		tn = (struct tnode *) n;
 
 
 
 
 
 
 
 
 
 
 
 
 
1053
1054		check_tnode(tn);
 
1055
1056		if (tkey_sub_equals(tn->key, pos, tn->pos-pos, key)) {
1057			tp = tn;
1058			pos = tn->pos + tn->bits;
1059			n = tnode_get_child(tn,
1060					    tkey_extract_bits(key,
1061							      tn->pos,
1062							      tn->bits));
 
1063
1064			BUG_ON(n && node_parent(n) != tn);
1065		} else
1066			break;
 
 
 
 
 
 
 
 
 
 
 
1067	}
1068
1069	/*
1070	 * n  ----> NULL, LEAF or TNODE
1071	 *
1072	 * tp is n's (parent) ----> NULL or TNODE
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1073	 */
 
 
 
 
1074
1075	BUG_ON(tp && IS_LEAF(tp));
 
1076
1077	/* Case 1: n is a leaf. Compare prefixes */
1078
1079	if (n != NULL && IS_LEAF(n) && tkey_equals(key, n->key)) {
1080		l = (struct leaf *) n;
1081		li = leaf_info_new(plen);
 
1082
1083		if (!li)
1084			return NULL;
1085
1086		fa_head = &li->falh;
1087		insert_leaf_info(&l->list, li);
1088		goto done;
 
 
 
 
 
 
 
 
 
 
 
 
1089	}
1090	l = leaf_new();
1091
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1092	if (!l)
1093		return NULL;
1094
1095	l->key = key;
1096	li = leaf_info_new(plen);
1097
1098	if (!li) {
1099		free_leaf(l);
1100		return NULL;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1101	}
1102
1103	fa_head = &li->falh;
1104	insert_leaf_info(&l->list, li);
 
 
 
1105
1106	if (t->trie && n == NULL) {
1107		/* Case 2: n is NULL, and will just insert a new leaf */
 
 
 
 
1108
1109		node_set_parent((struct rt_trie_node *)l, tp);
 
 
 
 
 
1110
1111		cindex = tkey_extract_bits(key, tp->pos, tp->bits);
1112		put_child(tp, cindex, (struct rt_trie_node *)l);
1113	} else {
1114		/* Case 3: n is a LEAF or a TNODE and the key doesn't match. */
1115		/*
1116		 *  Add a new tnode here
1117		 *  first tnode need some special handling
1118		 */
1119
1120		if (n) {
1121			pos = tp ? tp->pos+tp->bits : 0;
1122			newpos = tkey_mismatch(key, pos, n->key);
1123			tn = tnode_new(n->key, newpos, 1);
1124		} else {
1125			newpos = 0;
1126			tn = tnode_new(key, newpos, 1); /* First tnode */
1127		}
1128
1129		if (!tn) {
1130			free_leaf_info(li);
1131			free_leaf(l);
1132			return NULL;
1133		}
1134
1135		node_set_parent((struct rt_trie_node *)tn, tp);
 
 
 
 
1136
1137		missbit = tkey_extract_bits(key, newpos, 1);
1138		put_child(tn, missbit, (struct rt_trie_node *)l);
1139		put_child(tn, 1-missbit, n);
1140
1141		if (tp) {
1142			cindex = tkey_extract_bits(key, tp->pos, tp->bits);
1143			put_child(tp, cindex, (struct rt_trie_node *)tn);
1144		} else {
1145			rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
1146			tp = tn;
1147		}
1148	}
1149
1150	if (tp && tp->pos + tp->bits > 32)
1151		pr_warn("fib_trie tp=%p pos=%d, bits=%d, key=%0x plen=%d\n",
1152			tp, tp->pos, tp->bits, key, plen);
1153
1154	/* Rebalance the trie */
1155
1156	trie_rebalance(t, tp);
1157done:
1158	return fa_head;
1159}
1160
1161/*
1162 * Caller must hold RTNL.
1163 */
1164int fib_table_insert(struct fib_table *tb, struct fib_config *cfg)
 
 
1165{
1166	struct trie *t = (struct trie *) tb->tb_data;
1167	struct fib_alias *fa, *new_fa;
1168	struct list_head *fa_head = NULL;
 
1169	struct fib_info *fi;
1170	int plen = cfg->fc_dst_len;
1171	u8 tos = cfg->fc_tos;
1172	u32 key, mask;
 
1173	int err;
1174	struct leaf *l;
1175
1176	if (plen > 32)
1177		return -EINVAL;
1178
1179	key = ntohl(cfg->fc_dst);
1180
1181	pr_debug("Insert table=%u %08x/%d\n", tb->tb_id, key, plen);
1182
1183	mask = ntohl(inet_make_mask(plen));
1184
1185	if (key & ~mask)
1186		return -EINVAL;
1187
1188	key = key & mask;
1189
1190	fi = fib_create_info(cfg);
1191	if (IS_ERR(fi)) {
1192		err = PTR_ERR(fi);
1193		goto err;
1194	}
1195
1196	l = fib_find_node(t, key);
1197	fa = NULL;
1198
1199	if (l) {
1200		fa_head = get_fa_head(l, plen);
1201		fa = fib_find_alias(fa_head, tos, fi->fib_priority);
1202	}
1203
1204	/* Now fa, if non-NULL, points to the first fib alias
1205	 * with the same keys [prefix,tos,priority], if such key already
1206	 * exists or to the node before which we will insert new one.
1207	 *
1208	 * If fa is NULL, we will need to allocate a new one and
1209	 * insert to the head of f.
1210	 *
1211	 * If f is NULL, no fib node matched the destination key
1212	 * and we need to allocate a new one of those as well.
1213	 */
1214
1215	if (fa && fa->fa_tos == tos &&
1216	    fa->fa_info->fib_priority == fi->fib_priority) {
1217		struct fib_alias *fa_first, *fa_match;
1218
1219		err = -EEXIST;
1220		if (cfg->fc_nlflags & NLM_F_EXCL)
1221			goto out;
1222
 
 
1223		/* We have 2 goals:
1224		 * 1. Find exact match for type, scope, fib_info to avoid
1225		 * duplicate routes
1226		 * 2. Find next 'fa' (or head), NLM_F_APPEND inserts before it
1227		 */
1228		fa_match = NULL;
1229		fa_first = fa;
1230		fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list);
1231		list_for_each_entry_continue(fa, fa_head, fa_list) {
1232			if (fa->fa_tos != tos)
 
1233				break;
1234			if (fa->fa_info->fib_priority != fi->fib_priority)
1235				break;
1236			if (fa->fa_type == cfg->fc_type &&
1237			    fa->fa_info == fi) {
1238				fa_match = fa;
1239				break;
1240			}
1241		}
1242
1243		if (cfg->fc_nlflags & NLM_F_REPLACE) {
1244			struct fib_info *fi_drop;
1245			u8 state;
1246
 
1247			fa = fa_first;
1248			if (fa_match) {
1249				if (fa == fa_match)
1250					err = 0;
1251				goto out;
1252			}
1253			err = -ENOBUFS;
1254			new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL);
1255			if (new_fa == NULL)
1256				goto out;
1257
1258			fi_drop = fa->fa_info;
1259			new_fa->fa_tos = fa->fa_tos;
1260			new_fa->fa_info = fi;
1261			new_fa->fa_type = cfg->fc_type;
1262			state = fa->fa_state;
1263			new_fa->fa_state = state & ~FA_S_ACCESSED;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1264
1265			list_replace_rcu(&fa->fa_list, &new_fa->fa_list);
1266			alias_free_mem_rcu(fa);
1267
1268			fib_release_info(fi_drop);
1269			if (state & FA_S_ACCESSED)
1270				rt_cache_flush(cfg->fc_nlinfo.nl_net);
1271			rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen,
1272				tb->tb_id, &cfg->fc_nlinfo, NLM_F_REPLACE);
1273
1274			goto succeeded;
1275		}
1276		/* Error if we find a perfect match which
1277		 * uses the same scope, type, and nexthop
1278		 * information.
1279		 */
1280		if (fa_match)
1281			goto out;
1282
1283		if (!(cfg->fc_nlflags & NLM_F_APPEND))
 
 
1284			fa = fa_first;
1285	}
1286	err = -ENOENT;
1287	if (!(cfg->fc_nlflags & NLM_F_CREATE))
1288		goto out;
1289
 
1290	err = -ENOBUFS;
1291	new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL);
1292	if (new_fa == NULL)
1293		goto out;
1294
1295	new_fa->fa_info = fi;
1296	new_fa->fa_tos = tos;
1297	new_fa->fa_type = cfg->fc_type;
1298	new_fa->fa_state = 0;
1299	/*
1300	 * Insert new entry to the list.
1301	 */
1302
1303	if (!fa_head) {
1304		fa_head = fib_insert_node(t, key, plen);
1305		if (unlikely(!fa_head)) {
1306			err = -ENOMEM;
1307			goto out_free_new_fa;
1308		}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1309	}
1310
1311	if (!plen)
1312		tb->tb_num_default++;
1313
1314	list_add_tail_rcu(&new_fa->fa_list,
1315			  (fa ? &fa->fa_list : fa_head));
1316
1317	rt_cache_flush(cfg->fc_nlinfo.nl_net);
1318	rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id,
1319		  &cfg->fc_nlinfo, 0);
1320succeeded:
1321	return 0;
1322
 
 
1323out_free_new_fa:
1324	kmem_cache_free(fn_alias_kmem, new_fa);
1325out:
1326	fib_release_info(fi);
1327err:
1328	return err;
1329}
1330
1331/* should be called with rcu_read_lock */
1332static int check_leaf(struct fib_table *tb, struct trie *t, struct leaf *l,
1333		      t_key key,  const struct flowi4 *flp,
1334		      struct fib_result *res, int fib_flags)
1335{
1336	struct leaf_info *li;
1337	struct hlist_head *hhead = &l->list;
1338
1339	hlist_for_each_entry_rcu(li, hhead, hlist) {
1340		struct fib_alias *fa;
1341
1342		if (l->key != (key & li->mask_plen))
1343			continue;
1344
1345		list_for_each_entry_rcu(fa, &li->falh, fa_list) {
1346			struct fib_info *fi = fa->fa_info;
1347			int nhsel, err;
1348
1349			if (fa->fa_tos && fa->fa_tos != flp->flowi4_tos)
1350				continue;
1351			if (fi->fib_dead)
1352				continue;
1353			if (fa->fa_info->fib_scope < flp->flowi4_scope)
1354				continue;
1355			fib_alias_accessed(fa);
1356			err = fib_props[fa->fa_type].error;
1357			if (err) {
1358#ifdef CONFIG_IP_FIB_TRIE_STATS
1359				t->stats.semantic_match_passed++;
1360#endif
1361				return err;
1362			}
1363			if (fi->fib_flags & RTNH_F_DEAD)
1364				continue;
1365			for (nhsel = 0; nhsel < fi->fib_nhs; nhsel++) {
1366				const struct fib_nh *nh = &fi->fib_nh[nhsel];
1367
1368				if (nh->nh_flags & RTNH_F_DEAD)
1369					continue;
1370				if (flp->flowi4_oif && flp->flowi4_oif != nh->nh_oif)
1371					continue;
 
1372
1373#ifdef CONFIG_IP_FIB_TRIE_STATS
1374				t->stats.semantic_match_passed++;
1375#endif
1376				res->prefixlen = li->plen;
1377				res->nh_sel = nhsel;
1378				res->type = fa->fa_type;
1379				res->scope = fa->fa_info->fib_scope;
1380				res->fi = fi;
1381				res->table = tb;
1382				res->fa_head = &li->falh;
1383				if (!(fib_flags & FIB_LOOKUP_NOREF))
1384					atomic_inc(&fi->fib_clntref);
1385				return 0;
1386			}
1387		}
1388
1389#ifdef CONFIG_IP_FIB_TRIE_STATS
1390		t->stats.semantic_match_miss++;
1391#endif
1392	}
1393
1394	return 1;
1395}
1396
 
1397int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
1398		     struct fib_result *res, int fib_flags)
1399{
1400	struct trie *t = (struct trie *) tb->tb_data;
1401	int ret;
1402	struct rt_trie_node *n;
1403	struct tnode *pn;
1404	unsigned int pos, bits;
1405	t_key key = ntohl(flp->daddr);
1406	unsigned int chopped_off;
1407	t_key cindex = 0;
1408	unsigned int current_prefix_length = KEYLENGTH;
1409	struct tnode *cn;
1410	t_key pref_mismatch;
1411
1412	rcu_read_lock();
1413
1414	n = rcu_dereference(t->trie);
1415	if (!n)
1416		goto failed;
1417
1418#ifdef CONFIG_IP_FIB_TRIE_STATS
1419	t->stats.gets++;
1420#endif
 
 
 
 
 
1421
1422	/* Just a leaf? */
1423	if (IS_LEAF(n)) {
1424		ret = check_leaf(tb, t, (struct leaf *)n, key, flp, res, fib_flags);
1425		goto found;
1426	}
1427
1428	pn = (struct tnode *) n;
1429	chopped_off = 0;
1430
1431	while (pn) {
1432		pos = pn->pos;
1433		bits = pn->bits;
1434
1435		if (!chopped_off)
1436			cindex = tkey_extract_bits(mask_pfx(key, current_prefix_length),
1437						   pos, bits);
1438
1439		n = tnode_get_child_rcu(pn, cindex);
 
 
 
 
1440
1441		if (n == NULL) {
1442#ifdef CONFIG_IP_FIB_TRIE_STATS
1443			t->stats.null_node_hit++;
1444#endif
1445			goto backtrace;
1446		}
1447
1448		if (IS_LEAF(n)) {
1449			ret = check_leaf(tb, t, (struct leaf *)n, key, flp, res, fib_flags);
1450			if (ret > 0)
1451				goto backtrace;
1452			goto found;
1453		}
1454
1455		cn = (struct tnode *)n;
1456
1457		/*
1458		 * It's a tnode, and we can do some extra checks here if we
1459		 * like, to avoid descending into a dead-end branch.
1460		 * This tnode is in the parent's child array at index
1461		 * key[p_pos..p_pos+p_bits] but potentially with some bits
1462		 * chopped off, so in reality the index may be just a
1463		 * subprefix, padded with zero at the end.
1464		 * We can also take a look at any skipped bits in this
1465		 * tnode - everything up to p_pos is supposed to be ok,
1466		 * and the non-chopped bits of the index (se previous
1467		 * paragraph) are also guaranteed ok, but the rest is
1468		 * considered unknown.
 
1469		 *
1470		 * The skipped bits are key[pos+bits..cn->pos].
1471		 */
1472
1473		/* If current_prefix_length < pos+bits, we are already doing
1474		 * actual prefix  matching, which means everything from
1475		 * pos+(bits-chopped_off) onward must be zero along some
1476		 * branch of this subtree - otherwise there is *no* valid
1477		 * prefix present. Here we can only check the skipped
1478		 * bits. Remember, since we have already indexed into the
1479		 * parent's child array, we know that the bits we chopped of
1480		 * *are* zero.
1481		 */
 
 
1482
1483		/* NOTA BENE: Checking only skipped bits
1484		   for the new node here */
 
1485
1486		if (current_prefix_length < pos+bits) {
1487			if (tkey_extract_bits(cn->key, current_prefix_length,
1488						cn->pos - current_prefix_length)
1489			    || !(cn->child[0]))
1490				goto backtrace;
1491		}
1492
1493		/*
1494		 * If chopped_off=0, the index is fully validated and we
1495		 * only need to look at the skipped bits for this, the new,
1496		 * tnode. What we actually want to do is to find out if
1497		 * these skipped bits match our key perfectly, or if we will
1498		 * have to count on finding a matching prefix further down,
1499		 * because if we do, we would like to have some way of
1500		 * verifying the existence of such a prefix at this point.
1501		 */
 
 
 
 
1502
1503		/* The only thing we can do at this point is to verify that
1504		 * any such matching prefix can indeed be a prefix to our
1505		 * key, and if the bits in the node we are inspecting that
1506		 * do not match our key are not ZERO, this cannot be true.
1507		 * Thus, find out where there is a mismatch (before cn->pos)
1508		 * and verify that all the mismatching bits are zero in the
1509		 * new tnode's key.
1510		 */
1511
1512		/*
1513		 * Note: We aren't very concerned about the piece of
1514		 * the key that precede pn->pos+pn->bits, since these
1515		 * have already been checked. The bits after cn->pos
1516		 * aren't checked since these are by definition
1517		 * "unknown" at this point. Thus, what we want to see
1518		 * is if we are about to enter the "prefix matching"
1519		 * state, and in that case verify that the skipped
1520		 * bits that will prevail throughout this subtree are
1521		 * zero, as they have to be if we are to find a
1522		 * matching prefix.
1523		 */
 
 
1524
1525		pref_mismatch = mask_pfx(cn->key ^ key, cn->pos);
 
 
1526
1527		/*
1528		 * In short: If skipped bits in this node do not match
1529		 * the search key, enter the "prefix matching"
1530		 * state.directly.
1531		 */
1532		if (pref_mismatch) {
1533			/* fls(x) = __fls(x) + 1 */
1534			int mp = KEYLENGTH - __fls(pref_mismatch) - 1;
1535
1536			if (tkey_extract_bits(cn->key, mp, cn->pos - mp) != 0)
1537				goto backtrace;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1538
1539			if (current_prefix_length >= cn->pos)
1540				current_prefix_length = mp;
1541		}
 
1542
1543		pn = (struct tnode *)n; /* Descend */
1544		chopped_off = 0;
1545		continue;
1546
1547backtrace:
1548		chopped_off++;
 
 
 
1549
1550		/* As zero don't change the child key (cindex) */
1551		while ((chopped_off <= pn->bits)
1552		       && !(cindex & (1<<(chopped_off-1))))
1553			chopped_off++;
1554
1555		/* Decrease current_... with bits chopped off */
1556		if (current_prefix_length > pn->pos + pn->bits - chopped_off)
1557			current_prefix_length = pn->pos + pn->bits
1558				- chopped_off;
1559
1560		/*
1561		 * Either we do the actual chop off according or if we have
1562		 * chopped off all bits in this tnode walk up to our parent.
1563		 */
 
 
 
 
 
 
 
 
 
1564
1565		if (chopped_off <= pn->bits) {
1566			cindex &= ~(1 << (chopped_off-1));
1567		} else {
1568			struct tnode *parent = node_parent_rcu((struct rt_trie_node *) pn);
1569			if (!parent)
1570				goto failed;
1571
1572			/* Get Child's index */
1573			cindex = tkey_extract_bits(pn->key, parent->pos, parent->bits);
1574			pn = parent;
1575			chopped_off = 0;
 
 
 
 
1576
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1577#ifdef CONFIG_IP_FIB_TRIE_STATS
1578			t->stats.backtrack++;
1579#endif
1580			goto backtrace;
 
 
1581		}
1582	}
1583failed:
1584	ret = 1;
1585found:
1586	rcu_read_unlock();
1587	return ret;
1588}
1589EXPORT_SYMBOL_GPL(fib_table_lookup);
1590
1591/*
1592 * Remove the leaf and return parent.
1593 */
1594static void trie_leaf_remove(struct trie *t, struct leaf *l)
1595{
1596	struct tnode *tp = node_parent((struct rt_trie_node *) l);
 
 
1597
1598	pr_debug("entering trie_leaf_remove(%p)\n", l);
 
1599
1600	if (tp) {
1601		t_key cindex = tkey_extract_bits(l->key, tp->pos, tp->bits);
1602		put_child(tp, cindex, NULL);
 
 
 
 
 
1603		trie_rebalance(t, tp);
1604	} else
1605		RCU_INIT_POINTER(t->trie, NULL);
1606
1607	free_leaf(l);
 
 
 
 
 
 
1608}
1609
1610/*
1611 * Caller must hold RTNL.
1612 */
1613int fib_table_delete(struct fib_table *tb, struct fib_config *cfg)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1614{
1615	struct trie *t = (struct trie *) tb->tb_data;
1616	u32 key, mask;
1617	int plen = cfg->fc_dst_len;
1618	u8 tos = cfg->fc_tos;
1619	struct fib_alias *fa, *fa_to_delete;
1620	struct list_head *fa_head;
1621	struct leaf *l;
1622	struct leaf_info *li;
1623
1624	if (plen > 32)
1625		return -EINVAL;
1626
1627	key = ntohl(cfg->fc_dst);
1628	mask = ntohl(inet_make_mask(plen));
1629
1630	if (key & ~mask)
1631		return -EINVAL;
1632
1633	key = key & mask;
1634	l = fib_find_node(t, key);
1635
1636	if (!l)
1637		return -ESRCH;
1638
1639	li = find_leaf_info(l, plen);
1640
1641	if (!li)
1642		return -ESRCH;
1643
1644	fa_head = &li->falh;
1645	fa = fib_find_alias(fa_head, tos, 0);
1646
1647	if (!fa)
1648		return -ESRCH;
1649
1650	pr_debug("Deleting %08x/%d tos=%d t=%p\n", key, plen, tos, t);
 
1651
1652	fa_to_delete = NULL;
1653	fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list);
1654	list_for_each_entry_continue(fa, fa_head, fa_list) {
1655		struct fib_info *fi = fa->fa_info;
1656
1657		if (fa->fa_tos != tos)
 
 
1658			break;
1659
1660		if ((!cfg->fc_type || fa->fa_type == cfg->fc_type) &&
1661		    (cfg->fc_scope == RT_SCOPE_NOWHERE ||
1662		     fa->fa_info->fib_scope == cfg->fc_scope) &&
1663		    (!cfg->fc_prefsrc ||
1664		     fi->fib_prefsrc == cfg->fc_prefsrc) &&
1665		    (!cfg->fc_protocol ||
1666		     fi->fib_protocol == cfg->fc_protocol) &&
1667		    fib_nh_match(cfg, fi) == 0) {
 
1668			fa_to_delete = fa;
1669			break;
1670		}
1671	}
1672
1673	if (!fa_to_delete)
1674		return -ESRCH;
1675
1676	fa = fa_to_delete;
1677	rtmsg_fib(RTM_DELROUTE, htonl(key), fa, plen, tb->tb_id,
1678		  &cfg->fc_nlinfo, 0);
1679
1680	list_del_rcu(&fa->fa_list);
1681
1682	if (!plen)
1683		tb->tb_num_default--;
1684
1685	if (list_empty(fa_head)) {
1686		hlist_del_rcu(&li->hlist);
1687		free_leaf_info(li);
1688	}
1689
1690	if (hlist_empty(&l->list))
1691		trie_leaf_remove(t, l);
1692
1693	if (fa->fa_state & FA_S_ACCESSED)
1694		rt_cache_flush(cfg->fc_nlinfo.nl_net);
1695
1696	fib_release_info(fa->fa_info);
1697	alias_free_mem_rcu(fa);
1698	return 0;
1699}
1700
1701static int trie_flush_list(struct list_head *head)
 
1702{
1703	struct fib_alias *fa, *fa_node;
1704	int found = 0;
1705
1706	list_for_each_entry_safe(fa, fa_node, head, fa_list) {
1707		struct fib_info *fi = fa->fa_info;
 
 
 
1708
1709		if (fi && (fi->fib_flags & RTNH_F_DEAD)) {
1710			list_del_rcu(&fa->fa_list);
1711			fib_release_info(fa->fa_info);
1712			alias_free_mem_rcu(fa);
1713			found++;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1714		}
 
 
 
 
 
 
 
 
 
 
 
 
 
1715	}
1716	return found;
 
 
 
 
 
 
1717}
1718
1719static int trie_flush_leaf(struct leaf *l)
1720{
1721	int found = 0;
1722	struct hlist_head *lih = &l->list;
 
1723	struct hlist_node *tmp;
1724	struct leaf_info *li = NULL;
 
 
 
 
 
 
 
 
 
 
1725
1726	hlist_for_each_entry_safe(li, tmp, lih, hlist) {
1727		found += trie_flush_list(&li->falh);
1728
1729		if (list_empty(&li->falh)) {
1730			hlist_del_rcu(&li->hlist);
1731			free_leaf_info(li);
 
 
 
 
1732		}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1733	}
1734	return found;
 
 
 
 
1735}
1736
1737/*
1738 * Scan for the next right leaf starting at node p->child[idx]
1739 * Since we have back pointer, no recursion necessary.
1740 */
1741static struct leaf *leaf_walk_rcu(struct tnode *p, struct rt_trie_node *c)
1742{
1743	do {
1744		t_key idx;
 
 
 
 
1745
1746		if (c)
1747			idx = tkey_extract_bits(c->key, p->pos, p->bits) + 1;
1748		else
1749			idx = 0;
 
 
 
 
 
 
 
1750
1751		while (idx < 1u << p->bits) {
1752			c = tnode_get_child_rcu(p, idx++);
1753			if (!c)
 
1754				continue;
1755
1756			if (IS_LEAF(c))
1757				return (struct leaf *) c;
 
 
 
 
1758
1759			/* Rescan start scanning in new node */
1760			p = (struct tnode *) c;
1761			idx = 0;
 
 
 
 
 
 
1762		}
1763
1764		/* Node empty, walk back up to parent */
1765		c = (struct rt_trie_node *) p;
1766	} while ((p = node_parent_rcu(c)) != NULL);
 
 
 
 
 
 
1767
1768	return NULL; /* Root of trie */
1769}
1770
1771static struct leaf *trie_firstleaf(struct trie *t)
 
1772{
1773	struct tnode *n = (struct tnode *)rcu_dereference_rtnl(t->trie);
 
 
 
 
1774
1775	if (!n)
1776		return NULL;
 
 
1777
1778	if (IS_LEAF(n))          /* trie is just a leaf */
1779		return (struct leaf *) n;
1780
1781	return leaf_walk_rcu(n, NULL);
1782}
 
1783
1784static struct leaf *trie_nextleaf(struct leaf *l)
1785{
1786	struct rt_trie_node *c = (struct rt_trie_node *) l;
1787	struct tnode *p = node_parent_rcu(c);
 
 
 
1788
1789	if (!p)
1790		return NULL;	/* trie with just one leaf */
1791
1792	return leaf_walk_rcu(p, c);
1793}
 
 
1794
1795static struct leaf *trie_leafindex(struct trie *t, int index)
1796{
1797	struct leaf *l = trie_firstleaf(t);
 
1798
1799	while (l && index-- > 0)
1800		l = trie_nextleaf(l);
1801
1802	return l;
1803}
 
 
 
 
 
 
 
1804
 
 
 
1805
1806/*
1807 * Caller must hold RTNL.
1808 */
1809int fib_table_flush(struct fib_table *tb)
 
 
 
 
 
 
 
 
1810{
1811	struct trie *t = (struct trie *) tb->tb_data;
1812	struct leaf *l, *ll = NULL;
 
 
 
 
1813	int found = 0;
1814
1815	for (l = trie_firstleaf(t); l; l = trie_nextleaf(l)) {
1816		found += trie_flush_leaf(l);
 
 
1817
1818		if (ll && hlist_empty(&ll->list))
1819			trie_leaf_remove(t, ll);
1820		ll = l;
1821	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1822
1823	if (ll && hlist_empty(&ll->list))
1824		trie_leaf_remove(t, ll);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1825
1826	pr_debug("trie_flush found=%d\n", found);
1827	return found;
1828}
1829
1830void fib_free_table(struct fib_table *tb)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1831{
1832	kfree(tb);
 
 
 
 
 
 
 
 
 
1833}
1834
1835static int fn_trie_dump_fa(t_key key, int plen, struct list_head *fah,
1836			   struct fib_table *tb,
1837			   struct sk_buff *skb, struct netlink_callback *cb)
1838{
1839	int i, s_i;
1840	struct fib_alias *fa;
1841	__be32 xkey = htonl(key);
 
1842
1843	s_i = cb->args[5];
1844	i = 0;
1845
1846	/* rcu_read_lock is hold by caller */
 
1847
1848	list_for_each_entry_rcu(fa, fah, fa_list) {
1849		if (i < s_i) {
1850			i++;
 
1851			continue;
1852		}
1853
1854		if (fib_dump_info(skb, NETLINK_CB(cb->skb).portid,
1855				  cb->nlh->nlmsg_seq,
1856				  RTM_NEWROUTE,
1857				  tb->tb_id,
1858				  fa->fa_type,
1859				  xkey,
1860				  plen,
1861				  fa->fa_tos,
1862				  fa->fa_info, NLM_F_MULTI) < 0) {
1863			cb->args[5] = i;
1864			return -1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1865		}
1866		i++;
1867	}
1868	cb->args[5] = i;
1869	return skb->len;
1870}
1871
1872static int fn_trie_dump_leaf(struct leaf *l, struct fib_table *tb,
1873			struct sk_buff *skb, struct netlink_callback *cb)
1874{
1875	struct leaf_info *li;
1876	int i, s_i;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1877
1878	s_i = cb->args[4];
 
1879	i = 0;
1880
1881	/* rcu_read_lock is hold by caller */
1882	hlist_for_each_entry_rcu(li, &l->list, hlist) {
1883		if (i < s_i) {
1884			i++;
1885			continue;
1886		}
1887
1888		if (i > s_i)
1889			cb->args[5] = 0;
1890
1891		if (list_empty(&li->falh))
1892			continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1893
1894		if (fn_trie_dump_fa(l->key, li->plen, &li->falh, tb, skb, cb) < 0) {
1895			cb->args[4] = i;
1896			return -1;
1897		}
 
 
 
 
 
 
 
 
 
1898		i++;
1899	}
1900
1901	cb->args[4] = i;
1902	return skb->len;
 
 
 
 
 
1903}
1904
 
1905int fib_table_dump(struct fib_table *tb, struct sk_buff *skb,
1906		   struct netlink_callback *cb)
1907{
1908	struct leaf *l;
1909	struct trie *t = (struct trie *) tb->tb_data;
1910	t_key key = cb->args[2];
1911	int count = cb->args[3];
1912
1913	rcu_read_lock();
1914	/* Dump starting at last key.
1915	 * Note: 0.0.0.0/0 (ie default) is first key.
1916	 */
1917	if (count == 0)
1918		l = trie_firstleaf(t);
1919	else {
1920		/* Normally, continue from last key, but if that is missing
1921		 * fallback to using slow rescan
1922		 */
1923		l = fib_find_node(t, key);
1924		if (!l)
1925			l = trie_leafindex(t, count);
1926	}
1927
1928	while (l) {
1929		cb->args[2] = l->key;
1930		if (fn_trie_dump_leaf(l, tb, skb, cb) < 0) {
1931			cb->args[3] = count;
1932			rcu_read_unlock();
1933			return -1;
 
 
 
 
 
 
 
 
1934		}
1935
1936		++count;
1937		l = trie_nextleaf(l);
 
1938		memset(&cb->args[4], 0,
1939		       sizeof(cb->args) - 4*sizeof(cb->args[0]));
 
 
 
 
1940	}
1941	cb->args[3] = count;
1942	rcu_read_unlock();
1943
1944	return skb->len;
 
 
 
1945}
1946
1947void __init fib_trie_init(void)
1948{
1949	fn_alias_kmem = kmem_cache_create("ip_fib_alias",
1950					  sizeof(struct fib_alias),
1951					  0, SLAB_PANIC, NULL);
1952
1953	trie_leaf_kmem = kmem_cache_create("ip_fib_trie",
1954					   max(sizeof(struct leaf),
1955					       sizeof(struct leaf_info)),
1956					   0, SLAB_PANIC, NULL);
1957}
1958
1959
1960struct fib_table *fib_trie_table(u32 id)
1961{
1962	struct fib_table *tb;
1963	struct trie *t;
 
1964
1965	tb = kmalloc(sizeof(struct fib_table) + sizeof(struct trie),
1966		     GFP_KERNEL);
1967	if (tb == NULL)
 
 
1968		return NULL;
1969
1970	tb->tb_id = id;
1971	tb->tb_default = -1;
1972	tb->tb_num_default = 0;
 
 
 
 
1973
1974	t = (struct trie *) tb->tb_data;
1975	memset(t, 0, sizeof(*t));
 
 
 
 
 
 
 
 
1976
1977	return tb;
1978}
1979
1980#ifdef CONFIG_PROC_FS
1981/* Depth first Trie walk iterator */
1982struct fib_trie_iter {
1983	struct seq_net_private p;
1984	struct fib_table *tb;
1985	struct tnode *tnode;
1986	unsigned int index;
1987	unsigned int depth;
1988};
1989
1990static struct rt_trie_node *fib_trie_get_next(struct fib_trie_iter *iter)
1991{
1992	struct tnode *tn = iter->tnode;
1993	unsigned int cindex = iter->index;
1994	struct tnode *p;
1995
1996	/* A single entry routing table */
1997	if (!tn)
1998		return NULL;
1999
2000	pr_debug("get_next iter={node=%p index=%d depth=%d}\n",
2001		 iter->tnode, iter->index, iter->depth);
2002rescan:
2003	while (cindex < (1<<tn->bits)) {
2004		struct rt_trie_node *n = tnode_get_child_rcu(tn, cindex);
2005
2006		if (n) {
 
 
 
 
 
 
2007			if (IS_LEAF(n)) {
2008				iter->tnode = tn;
2009				iter->index = cindex + 1;
2010			} else {
2011				/* push down one level */
2012				iter->tnode = (struct tnode *) n;
2013				iter->index = 0;
2014				++iter->depth;
2015			}
 
2016			return n;
2017		}
2018
2019		++cindex;
2020	}
2021
2022	/* Current node exhausted, pop back up */
2023	p = node_parent_rcu((struct rt_trie_node *)tn);
2024	if (p) {
2025		cindex = tkey_extract_bits(tn->key, p->pos, p->bits)+1;
2026		tn = p;
2027		--iter->depth;
2028		goto rescan;
2029	}
2030
2031	/* got root? */
 
 
 
2032	return NULL;
2033}
2034
2035static struct rt_trie_node *fib_trie_get_first(struct fib_trie_iter *iter,
2036				       struct trie *t)
2037{
2038	struct rt_trie_node *n;
2039
2040	if (!t)
2041		return NULL;
2042
2043	n = rcu_dereference(t->trie);
 
2044	if (!n)
2045		return NULL;
2046
2047	if (IS_TNODE(n)) {
2048		iter->tnode = (struct tnode *) n;
2049		iter->index = 0;
2050		iter->depth = 1;
2051	} else {
2052		iter->tnode = NULL;
2053		iter->index = 0;
2054		iter->depth = 0;
2055	}
2056
2057	return n;
2058}
2059
2060static void trie_collect_stats(struct trie *t, struct trie_stat *s)
2061{
2062	struct rt_trie_node *n;
2063	struct fib_trie_iter iter;
2064
2065	memset(s, 0, sizeof(*s));
2066
2067	rcu_read_lock();
2068	for (n = fib_trie_get_first(&iter, t); n; n = fib_trie_get_next(&iter)) {
2069		if (IS_LEAF(n)) {
2070			struct leaf *l = (struct leaf *)n;
2071			struct leaf_info *li;
2072
2073			s->leaves++;
2074			s->totdepth += iter.depth;
2075			if (iter.depth > s->maxdepth)
2076				s->maxdepth = iter.depth;
2077
2078			hlist_for_each_entry_rcu(li, &l->list, hlist)
2079				++s->prefixes;
2080		} else {
2081			const struct tnode *tn = (const struct tnode *) n;
2082			int i;
2083
2084			s->tnodes++;
2085			if (tn->bits < MAX_STAT_DEPTH)
2086				s->nodesizes[tn->bits]++;
2087
2088			for (i = 0; i < (1<<tn->bits); i++)
2089				if (!tn->child[i])
2090					s->nullpointers++;
2091		}
2092	}
2093	rcu_read_unlock();
2094}
2095
2096/*
2097 *	This outputs /proc/net/fib_triestats
2098 */
2099static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat)
2100{
2101	unsigned int i, max, pointers, bytes, avdepth;
2102
2103	if (stat->leaves)
2104		avdepth = stat->totdepth*100 / stat->leaves;
2105	else
2106		avdepth = 0;
2107
2108	seq_printf(seq, "\tAver depth:     %u.%02d\n",
2109		   avdepth / 100, avdepth % 100);
2110	seq_printf(seq, "\tMax depth:      %u\n", stat->maxdepth);
2111
2112	seq_printf(seq, "\tLeaves:         %u\n", stat->leaves);
2113	bytes = sizeof(struct leaf) * stat->leaves;
2114
2115	seq_printf(seq, "\tPrefixes:       %u\n", stat->prefixes);
2116	bytes += sizeof(struct leaf_info) * stat->prefixes;
2117
2118	seq_printf(seq, "\tInternal nodes: %u\n\t", stat->tnodes);
2119	bytes += sizeof(struct tnode) * stat->tnodes;
2120
2121	max = MAX_STAT_DEPTH;
2122	while (max > 0 && stat->nodesizes[max-1] == 0)
2123		max--;
2124
2125	pointers = 0;
2126	for (i = 1; i < max; i++)
2127		if (stat->nodesizes[i] != 0) {
2128			seq_printf(seq, "  %u: %u",  i, stat->nodesizes[i]);
2129			pointers += (1<<i) * stat->nodesizes[i];
2130		}
2131	seq_putc(seq, '\n');
2132	seq_printf(seq, "\tPointers: %u\n", pointers);
2133
2134	bytes += sizeof(struct rt_trie_node *) * pointers;
2135	seq_printf(seq, "Null ptrs: %u\n", stat->nullpointers);
2136	seq_printf(seq, "Total size: %u  kB\n", (bytes + 1023) / 1024);
2137}
2138
2139#ifdef CONFIG_IP_FIB_TRIE_STATS
2140static void trie_show_usage(struct seq_file *seq,
2141			    const struct trie_use_stats *stats)
2142{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2143	seq_printf(seq, "\nCounters:\n---------\n");
2144	seq_printf(seq, "gets = %u\n", stats->gets);
2145	seq_printf(seq, "backtracks = %u\n", stats->backtrack);
2146	seq_printf(seq, "semantic match passed = %u\n",
2147		   stats->semantic_match_passed);
2148	seq_printf(seq, "semantic match miss = %u\n",
2149		   stats->semantic_match_miss);
2150	seq_printf(seq, "null node hit= %u\n", stats->null_node_hit);
2151	seq_printf(seq, "skipped node resize = %u\n\n",
2152		   stats->resize_node_skipped);
2153}
2154#endif /*  CONFIG_IP_FIB_TRIE_STATS */
2155
2156static void fib_table_print(struct seq_file *seq, struct fib_table *tb)
2157{
2158	if (tb->tb_id == RT_TABLE_LOCAL)
2159		seq_puts(seq, "Local:\n");
2160	else if (tb->tb_id == RT_TABLE_MAIN)
2161		seq_puts(seq, "Main:\n");
2162	else
2163		seq_printf(seq, "Id %d:\n", tb->tb_id);
2164}
2165
2166
2167static int fib_triestat_seq_show(struct seq_file *seq, void *v)
2168{
2169	struct net *net = (struct net *)seq->private;
2170	unsigned int h;
2171
2172	seq_printf(seq,
2173		   "Basic info: size of leaf:"
2174		   " %Zd bytes, size of tnode: %Zd bytes.\n",
2175		   sizeof(struct leaf), sizeof(struct tnode));
2176
 
2177	for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
2178		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2179		struct fib_table *tb;
2180
2181		hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2182			struct trie *t = (struct trie *) tb->tb_data;
2183			struct trie_stat stat;
2184
2185			if (!t)
2186				continue;
2187
2188			fib_table_print(seq, tb);
2189
2190			trie_collect_stats(t, &stat);
2191			trie_show_stats(seq, &stat);
2192#ifdef CONFIG_IP_FIB_TRIE_STATS
2193			trie_show_usage(seq, &t->stats);
2194#endif
2195		}
 
2196	}
 
2197
2198	return 0;
2199}
2200
2201static int fib_triestat_seq_open(struct inode *inode, struct file *file)
2202{
2203	return single_open_net(inode, file, fib_triestat_seq_show);
2204}
2205
2206static const struct file_operations fib_triestat_fops = {
2207	.owner	= THIS_MODULE,
2208	.open	= fib_triestat_seq_open,
2209	.read	= seq_read,
2210	.llseek	= seq_lseek,
2211	.release = single_release_net,
2212};
2213
2214static struct rt_trie_node *fib_trie_get_idx(struct seq_file *seq, loff_t pos)
2215{
2216	struct fib_trie_iter *iter = seq->private;
2217	struct net *net = seq_file_net(seq);
2218	loff_t idx = 0;
2219	unsigned int h;
2220
2221	for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
2222		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2223		struct fib_table *tb;
2224
2225		hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2226			struct rt_trie_node *n;
2227
2228			for (n = fib_trie_get_first(iter,
2229						    (struct trie *) tb->tb_data);
2230			     n; n = fib_trie_get_next(iter))
2231				if (pos == idx++) {
2232					iter->tb = tb;
2233					return n;
2234				}
2235		}
2236	}
2237
2238	return NULL;
2239}
2240
2241static void *fib_trie_seq_start(struct seq_file *seq, loff_t *pos)
2242	__acquires(RCU)
2243{
2244	rcu_read_lock();
2245	return fib_trie_get_idx(seq, *pos);
2246}
2247
2248static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2249{
2250	struct fib_trie_iter *iter = seq->private;
2251	struct net *net = seq_file_net(seq);
2252	struct fib_table *tb = iter->tb;
2253	struct hlist_node *tb_node;
2254	unsigned int h;
2255	struct rt_trie_node *n;
2256
2257	++*pos;
2258	/* next node in same table */
2259	n = fib_trie_get_next(iter);
2260	if (n)
2261		return n;
2262
2263	/* walk rest of this hash chain */
2264	h = tb->tb_id & (FIB_TABLE_HASHSZ - 1);
2265	while ((tb_node = rcu_dereference(hlist_next_rcu(&tb->tb_hlist)))) {
2266		tb = hlist_entry(tb_node, struct fib_table, tb_hlist);
2267		n = fib_trie_get_first(iter, (struct trie *) tb->tb_data);
2268		if (n)
2269			goto found;
2270	}
2271
2272	/* new hash chain */
2273	while (++h < FIB_TABLE_HASHSZ) {
2274		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2275		hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2276			n = fib_trie_get_first(iter, (struct trie *) tb->tb_data);
2277			if (n)
2278				goto found;
2279		}
2280	}
2281	return NULL;
2282
2283found:
2284	iter->tb = tb;
2285	return n;
2286}
2287
2288static void fib_trie_seq_stop(struct seq_file *seq, void *v)
2289	__releases(RCU)
2290{
2291	rcu_read_unlock();
2292}
2293
2294static void seq_indent(struct seq_file *seq, int n)
2295{
2296	while (n-- > 0)
2297		seq_puts(seq, "   ");
2298}
2299
2300static inline const char *rtn_scope(char *buf, size_t len, enum rt_scope_t s)
2301{
2302	switch (s) {
2303	case RT_SCOPE_UNIVERSE: return "universe";
2304	case RT_SCOPE_SITE:	return "site";
2305	case RT_SCOPE_LINK:	return "link";
2306	case RT_SCOPE_HOST:	return "host";
2307	case RT_SCOPE_NOWHERE:	return "nowhere";
2308	default:
2309		snprintf(buf, len, "scope=%d", s);
2310		return buf;
2311	}
2312}
2313
2314static const char *const rtn_type_names[__RTN_MAX] = {
2315	[RTN_UNSPEC] = "UNSPEC",
2316	[RTN_UNICAST] = "UNICAST",
2317	[RTN_LOCAL] = "LOCAL",
2318	[RTN_BROADCAST] = "BROADCAST",
2319	[RTN_ANYCAST] = "ANYCAST",
2320	[RTN_MULTICAST] = "MULTICAST",
2321	[RTN_BLACKHOLE] = "BLACKHOLE",
2322	[RTN_UNREACHABLE] = "UNREACHABLE",
2323	[RTN_PROHIBIT] = "PROHIBIT",
2324	[RTN_THROW] = "THROW",
2325	[RTN_NAT] = "NAT",
2326	[RTN_XRESOLVE] = "XRESOLVE",
2327};
2328
2329static inline const char *rtn_type(char *buf, size_t len, unsigned int t)
2330{
2331	if (t < __RTN_MAX && rtn_type_names[t])
2332		return rtn_type_names[t];
2333	snprintf(buf, len, "type %u", t);
2334	return buf;
2335}
2336
2337/* Pretty print the trie */
2338static int fib_trie_seq_show(struct seq_file *seq, void *v)
2339{
2340	const struct fib_trie_iter *iter = seq->private;
2341	struct rt_trie_node *n = v;
2342
2343	if (!node_parent_rcu(n))
2344		fib_table_print(seq, iter->tb);
2345
2346	if (IS_TNODE(n)) {
2347		struct tnode *tn = (struct tnode *) n;
2348		__be32 prf = htonl(mask_pfx(tn->key, tn->pos));
2349
2350		seq_indent(seq, iter->depth-1);
2351		seq_printf(seq, "  +-- %pI4/%d %d %d %d\n",
2352			   &prf, tn->pos, tn->bits, tn->full_children,
2353			   tn->empty_children);
2354
2355	} else {
2356		struct leaf *l = (struct leaf *) n;
2357		struct leaf_info *li;
2358		__be32 val = htonl(l->key);
2359
2360		seq_indent(seq, iter->depth);
2361		seq_printf(seq, "  |-- %pI4\n", &val);
2362
2363		hlist_for_each_entry_rcu(li, &l->list, hlist) {
2364			struct fib_alias *fa;
2365
2366			list_for_each_entry_rcu(fa, &li->falh, fa_list) {
2367				char buf1[32], buf2[32];
2368
2369				seq_indent(seq, iter->depth+1);
2370				seq_printf(seq, "  /%d %s %s", li->plen,
2371					   rtn_scope(buf1, sizeof(buf1),
2372						     fa->fa_info->fib_scope),
2373					   rtn_type(buf2, sizeof(buf2),
2374						    fa->fa_type));
2375				if (fa->fa_tos)
2376					seq_printf(seq, " tos=%d", fa->fa_tos);
2377				seq_putc(seq, '\n');
2378			}
 
2379		}
2380	}
2381
2382	return 0;
2383}
2384
2385static const struct seq_operations fib_trie_seq_ops = {
2386	.start  = fib_trie_seq_start,
2387	.next   = fib_trie_seq_next,
2388	.stop   = fib_trie_seq_stop,
2389	.show   = fib_trie_seq_show,
2390};
2391
2392static int fib_trie_seq_open(struct inode *inode, struct file *file)
2393{
2394	return seq_open_net(inode, file, &fib_trie_seq_ops,
2395			    sizeof(struct fib_trie_iter));
2396}
2397
2398static const struct file_operations fib_trie_fops = {
2399	.owner  = THIS_MODULE,
2400	.open   = fib_trie_seq_open,
2401	.read   = seq_read,
2402	.llseek = seq_lseek,
2403	.release = seq_release_net,
2404};
2405
2406struct fib_route_iter {
2407	struct seq_net_private p;
2408	struct trie *main_trie;
 
2409	loff_t	pos;
2410	t_key	key;
2411};
2412
2413static struct leaf *fib_route_get_idx(struct fib_route_iter *iter, loff_t pos)
 
2414{
2415	struct leaf *l = NULL;
2416	struct trie *t = iter->main_trie;
2417
2418	/* use cache location of last found key */
2419	if (iter->pos > 0 && pos >= iter->pos && (l = fib_find_node(t, iter->key)))
2420		pos -= iter->pos;
2421	else {
2422		iter->pos = 0;
2423		l = trie_firstleaf(t);
2424	}
2425
2426	while (l && pos-- > 0) {
 
 
 
2427		iter->pos++;
2428		l = trie_nextleaf(l);
 
 
 
 
2429	}
2430
2431	if (l)
2432		iter->key = pos;	/* remember it */
2433	else
2434		iter->pos = 0;		/* forget it */
2435
2436	return l;
2437}
2438
2439static void *fib_route_seq_start(struct seq_file *seq, loff_t *pos)
2440	__acquires(RCU)
2441{
2442	struct fib_route_iter *iter = seq->private;
2443	struct fib_table *tb;
 
2444
2445	rcu_read_lock();
 
2446	tb = fib_get_table(seq_file_net(seq), RT_TABLE_MAIN);
2447	if (!tb)
2448		return NULL;
2449
2450	iter->main_trie = (struct trie *) tb->tb_data;
2451	if (*pos == 0)
2452		return SEQ_START_TOKEN;
2453	else
2454		return fib_route_get_idx(iter, *pos - 1);
 
 
 
 
 
 
2455}
2456
2457static void *fib_route_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2458{
2459	struct fib_route_iter *iter = seq->private;
2460	struct leaf *l = v;
 
2461
2462	++*pos;
2463	if (v == SEQ_START_TOKEN) {
2464		iter->pos = 0;
2465		l = trie_firstleaf(iter->main_trie);
2466	} else {
2467		iter->pos++;
2468		l = trie_nextleaf(l);
2469	}
2470
2471	if (l)
 
 
 
 
2472		iter->key = l->key;
2473	else
 
2474		iter->pos = 0;
 
 
2475	return l;
2476}
2477
2478static void fib_route_seq_stop(struct seq_file *seq, void *v)
2479	__releases(RCU)
2480{
2481	rcu_read_unlock();
2482}
2483
2484static unsigned int fib_flag_trans(int type, __be32 mask, const struct fib_info *fi)
2485{
2486	unsigned int flags = 0;
2487
2488	if (type == RTN_UNREACHABLE || type == RTN_PROHIBIT)
2489		flags = RTF_REJECT;
2490	if (fi && fi->fib_nh->nh_gw)
2491		flags |= RTF_GATEWAY;
 
 
 
 
2492	if (mask == htonl(0xFFFFFFFF))
2493		flags |= RTF_HOST;
2494	flags |= RTF_UP;
2495	return flags;
2496}
2497
2498/*
2499 *	This outputs /proc/net/route.
2500 *	The format of the file is not supposed to be changed
2501 *	and needs to be same as fib_hash output to avoid breaking
2502 *	legacy utilities
2503 */
2504static int fib_route_seq_show(struct seq_file *seq, void *v)
2505{
2506	struct leaf *l = v;
2507	struct leaf_info *li;
 
 
 
2508
2509	if (v == SEQ_START_TOKEN) {
2510		seq_printf(seq, "%-127s\n", "Iface\tDestination\tGateway "
2511			   "\tFlags\tRefCnt\tUse\tMetric\tMask\t\tMTU"
2512			   "\tWindow\tIRTT");
2513		return 0;
2514	}
2515
2516	hlist_for_each_entry_rcu(li, &l->list, hlist) {
2517		struct fib_alias *fa;
2518		__be32 mask, prefix;
2519
2520		mask = inet_make_mask(li->plen);
2521		prefix = htonl(l->key);
2522
2523		list_for_each_entry_rcu(fa, &li->falh, fa_list) {
2524			const struct fib_info *fi = fa->fa_info;
2525			unsigned int flags = fib_flag_trans(fa->fa_type, mask, fi);
 
2526
2527			if (fa->fa_type == RTN_BROADCAST
2528			    || fa->fa_type == RTN_MULTICAST)
2529				continue;
2530
2531			seq_setwidth(seq, 127);
 
2532
2533			if (fi)
2534				seq_printf(seq,
2535					 "%s\t%08X\t%08X\t%04X\t%d\t%u\t"
2536					 "%d\t%08X\t%d\t%u\t%u",
2537					 fi->fib_dev ? fi->fib_dev->name : "*",
2538					 prefix,
2539					 fi->fib_nh->nh_gw, flags, 0, 0,
2540					 fi->fib_priority,
2541					 mask,
2542					 (fi->fib_advmss ?
2543					  fi->fib_advmss + 40 : 0),
2544					 fi->fib_window,
2545					 fi->fib_rtt >> 3);
2546			else
2547				seq_printf(seq,
2548					 "*\t%08X\t%08X\t%04X\t%d\t%u\t"
2549					 "%d\t%08X\t%d\t%u\t%u",
2550					 prefix, 0, flags, 0, 0, 0,
2551					 mask, 0, 0, 0);
2552
2553			seq_pad(seq, '\n');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2554		}
 
2555	}
2556
2557	return 0;
2558}
2559
2560static const struct seq_operations fib_route_seq_ops = {
2561	.start  = fib_route_seq_start,
2562	.next   = fib_route_seq_next,
2563	.stop   = fib_route_seq_stop,
2564	.show   = fib_route_seq_show,
2565};
2566
2567static int fib_route_seq_open(struct inode *inode, struct file *file)
2568{
2569	return seq_open_net(inode, file, &fib_route_seq_ops,
2570			    sizeof(struct fib_route_iter));
2571}
2572
2573static const struct file_operations fib_route_fops = {
2574	.owner  = THIS_MODULE,
2575	.open   = fib_route_seq_open,
2576	.read   = seq_read,
2577	.llseek = seq_lseek,
2578	.release = seq_release_net,
2579};
2580
2581int __net_init fib_proc_init(struct net *net)
2582{
2583	if (!proc_create("fib_trie", S_IRUGO, net->proc_net, &fib_trie_fops))
 
2584		goto out1;
2585
2586	if (!proc_create("fib_triestat", S_IRUGO, net->proc_net,
2587			 &fib_triestat_fops))
2588		goto out2;
2589
2590	if (!proc_create("route", S_IRUGO, net->proc_net, &fib_route_fops))
 
2591		goto out3;
2592
2593	return 0;
2594
2595out3:
2596	remove_proc_entry("fib_triestat", net->proc_net);
2597out2:
2598	remove_proc_entry("fib_trie", net->proc_net);
2599out1:
2600	return -ENOMEM;
2601}
2602
2603void __net_exit fib_proc_exit(struct net *net)
2604{
2605	remove_proc_entry("fib_trie", net->proc_net);
2606	remove_proc_entry("fib_triestat", net->proc_net);
2607	remove_proc_entry("route", net->proc_net);
2608}
2609
2610#endif /* CONFIG_PROC_FS */
v6.13.7
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
 
 
 
 
   3 *
   4 *   Robert Olsson <robert.olsson@its.uu.se> Uppsala Universitet
   5 *     & Swedish University of Agricultural Sciences.
   6 *
   7 *   Jens Laas <jens.laas@data.slu.se> Swedish University of
   8 *     Agricultural Sciences.
   9 *
  10 *   Hans Liss <hans.liss@its.uu.se>  Uppsala Universitet
  11 *
  12 * This work is based on the LPC-trie which is originally described in:
  13 *
  14 * An experimental study of compression methods for dynamic tries
  15 * Stefan Nilsson and Matti Tikkanen. Algorithmica, 33(1):19-33, 2002.
  16 * https://www.csc.kth.se/~snilsson/software/dyntrie2/
 
  17 *
  18 * IP-address lookup using LC-tries. Stefan Nilsson and Gunnar Karlsson
  19 * IEEE Journal on Selected Areas in Communications, 17(6):1083-1092, June 1999
  20 *
 
  21 * Code from fib_hash has been reused which includes the following header:
  22 *
 
  23 * INET		An implementation of the TCP/IP protocol suite for the LINUX
  24 *		operating system.  INET is implemented using the  BSD Socket
  25 *		interface as the means of communication with the user level.
  26 *
  27 *		IPv4 FIB: lookup engine and maintenance routines.
  28 *
 
  29 * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
  30 *
 
 
 
 
 
  31 * Substantial contributions to this work comes from:
  32 *
  33 *		David S. Miller, <davem@davemloft.net>
  34 *		Stephen Hemminger <shemminger@osdl.org>
  35 *		Paul E. McKenney <paulmck@us.ibm.com>
  36 *		Patrick McHardy <kaber@trash.net>
  37 */
  38#include <linux/cache.h>
  39#include <linux/uaccess.h>
 
 
  40#include <linux/bitops.h>
  41#include <linux/types.h>
  42#include <linux/kernel.h>
  43#include <linux/mm.h>
  44#include <linux/string.h>
  45#include <linux/socket.h>
  46#include <linux/sockios.h>
  47#include <linux/errno.h>
  48#include <linux/in.h>
  49#include <linux/inet.h>
  50#include <linux/inetdevice.h>
  51#include <linux/netdevice.h>
  52#include <linux/if_arp.h>
  53#include <linux/proc_fs.h>
  54#include <linux/rcupdate.h>
  55#include <linux/rcupdate_wait.h>
  56#include <linux/skbuff.h>
  57#include <linux/netlink.h>
  58#include <linux/init.h>
  59#include <linux/list.h>
  60#include <linux/slab.h>
  61#include <linux/export.h>
  62#include <linux/vmalloc.h>
  63#include <linux/notifier.h>
  64#include <net/net_namespace.h>
  65#include <net/inet_dscp.h>
  66#include <net/ip.h>
  67#include <net/protocol.h>
  68#include <net/route.h>
  69#include <net/tcp.h>
  70#include <net/sock.h>
  71#include <net/ip_fib.h>
  72#include <net/fib_notifier.h>
  73#include <trace/events/fib.h>
  74#include "fib_lookup.h"
  75
  76static int call_fib_entry_notifier(struct notifier_block *nb,
  77				   enum fib_event_type event_type, u32 dst,
  78				   int dst_len, struct fib_alias *fa,
  79				   struct netlink_ext_ack *extack)
  80{
  81	struct fib_entry_notifier_info info = {
  82		.info.extack = extack,
  83		.dst = dst,
  84		.dst_len = dst_len,
  85		.fi = fa->fa_info,
  86		.dscp = fa->fa_dscp,
  87		.type = fa->fa_type,
  88		.tb_id = fa->tb_id,
  89	};
  90	return call_fib4_notifier(nb, event_type, &info.info);
  91}
  92
  93static int call_fib_entry_notifiers(struct net *net,
  94				    enum fib_event_type event_type, u32 dst,
  95				    int dst_len, struct fib_alias *fa,
  96				    struct netlink_ext_ack *extack)
  97{
  98	struct fib_entry_notifier_info info = {
  99		.info.extack = extack,
 100		.dst = dst,
 101		.dst_len = dst_len,
 102		.fi = fa->fa_info,
 103		.dscp = fa->fa_dscp,
 104		.type = fa->fa_type,
 105		.tb_id = fa->tb_id,
 106	};
 107	return call_fib4_notifiers(net, event_type, &info.info);
 108}
 109
 110#define MAX_STAT_DEPTH 32
 
 111
 112#define KEYLENGTH	(8*sizeof(t_key))
 113#define KEY_MAX		((t_key)~0)
 
 
 114
 115typedef unsigned int t_key;
 
 
 
 
 
 116
 117#define IS_TRIE(n)	((n)->pos >= KEYLENGTH)
 118#define IS_TNODE(n)	((n)->bits)
 119#define IS_LEAF(n)	(!(n)->bits)
 
 
 
 
 120
 121struct key_vector {
 
 122	t_key key;
 123	unsigned char pos;		/* 2log(KEYLENGTH) bits needed */
 124	unsigned char bits;		/* 2log(KEYLENGTH) bits needed */
 125	unsigned char slen;
 
 126	union {
 127		/* This list pointer if valid if (pos | bits) == 0 (LEAF) */
 128		struct hlist_head leaf;
 129		/* This array is valid if (pos | bits) > 0 (TNODE) */
 130		DECLARE_FLEX_ARRAY(struct key_vector __rcu *, tnode);
 131	};
 
 132};
 133
 134struct tnode {
 135	struct rcu_head rcu;
 136	t_key empty_children;		/* KEYLENGTH bits needed */
 137	t_key full_children;		/* KEYLENGTH bits needed */
 138	struct key_vector __rcu *parent;
 139	struct key_vector kv[1];
 140#define tn_bits kv[0].bits
 141};
 142
 143#define TNODE_SIZE(n)	offsetof(struct tnode, kv[0].tnode[n])
 144#define LEAF_SIZE	TNODE_SIZE(1)
 145
 146#ifdef CONFIG_IP_FIB_TRIE_STATS
 147struct trie_use_stats {
 148	unsigned int gets;
 149	unsigned int backtrack;
 150	unsigned int semantic_match_passed;
 151	unsigned int semantic_match_miss;
 152	unsigned int null_node_hit;
 153	unsigned int resize_node_skipped;
 154};
 155#endif
 156
 157struct trie_stat {
 158	unsigned int totdepth;
 159	unsigned int maxdepth;
 160	unsigned int tnodes;
 161	unsigned int leaves;
 162	unsigned int nullpointers;
 163	unsigned int prefixes;
 164	unsigned int nodesizes[MAX_STAT_DEPTH];
 165};
 166
 167struct trie {
 168	struct key_vector kv[1];
 169#ifdef CONFIG_IP_FIB_TRIE_STATS
 170	struct trie_use_stats __percpu *stats;
 171#endif
 172};
 173
 174static struct key_vector *resize(struct trie *t, struct key_vector *tn);
 175static unsigned int tnode_free_size;
 
 
 
 
 
 
 176
 177/*
 178 * synchronize_rcu after call_rcu for outstanding dirty memory; it should be
 179 * especially useful before resizing the root node with PREEMPT_NONE configs;
 180 * the value was obtained experimentally, aiming to avoid visible slowdown.
 181 */
 182unsigned int sysctl_fib_sync_mem = 512 * 1024;
 183unsigned int sysctl_fib_sync_mem_min = 64 * 1024;
 184unsigned int sysctl_fib_sync_mem_max = 64 * 1024 * 1024;
 185
 186static struct kmem_cache *fn_alias_kmem __ro_after_init;
 187static struct kmem_cache *trie_leaf_kmem __ro_after_init;
 188
 189static inline struct tnode *tn_info(struct key_vector *kv)
 
 
 
 190{
 191	return container_of(kv, struct tnode, kv[0]);
 
 
 
 
 192}
 193
 194/* caller must hold RTNL */
 195#define node_parent(tn) rtnl_dereference(tn_info(tn)->parent)
 196#define get_child(tn, i) rtnl_dereference((tn)->tnode[i])
 
 
 
 
 
 
 197
 198/* caller must hold RCU read lock or RTNL */
 199#define node_parent_rcu(tn) rcu_dereference_rtnl(tn_info(tn)->parent)
 200#define get_child_rcu(tn, i) rcu_dereference_rtnl((tn)->tnode[i])
 201
 202/* wrapper for rcu_assign_pointer */
 203static inline void node_set_parent(struct key_vector *n, struct key_vector *tp)
 
 
 204{
 205	if (n)
 206		rcu_assign_pointer(tn_info(n)->parent, tp);
 207}
 208
 209#define NODE_INIT_PARENT(n, p) RCU_INIT_POINTER(tn_info(n)->parent, p)
 
 
 
 
 
 
 
 
 210
 211/* This provides us with the number of children in this node, in the case of a
 212 * leaf this will return 0 meaning none of the children are accessible.
 213 */
 214static inline unsigned long child_length(const struct key_vector *tn)
 215{
 216	return (1ul << tn->bits) & ~(1ul);
 
 
 217}
 218
 219#define get_cindex(key, kv) (((key) ^ (kv)->key) >> (kv)->pos)
 
 
 
 220
 221static inline unsigned long get_index(t_key key, struct key_vector *kv)
 222{
 223	unsigned long index = key ^ kv->key;
 
 224
 225	if ((BITS_PER_LONG <= KEYLENGTH) && (KEYLENGTH == kv->pos))
 
 
 
 
 226		return 0;
 
 227
 228	return index >> kv->pos;
 
 
 229}
 230
 231/* To understand this stuff, an understanding of keys and all their bits is
 232 * necessary. Every node in the trie has a key associated with it, but not
 233 * all of the bits in that key are significant.
 234 *
 235 * Consider a node 'n' and its parent 'tp'.
 236 *
 237 * If n is a leaf, every bit in its key is significant. Its presence is
 238 * necessitated by path compression, since during a tree traversal (when
 239 * searching for a leaf - unless we are doing an insertion) we will completely
 240 * ignore all skipped bits we encounter. Thus we need to verify, at the end of
 241 * a potentially successful search, that we have indeed been walking the
 242 * correct key path.
 243 *
 244 * Note that we can never "miss" the correct key in the tree if present by
 245 * following the wrong path. Path compression ensures that segments of the key
 246 * that are the same for all keys with a given prefix are skipped, but the
 247 * skipped part *is* identical for each node in the subtrie below the skipped
 248 * bit! trie_insert() in this implementation takes care of that.
 249 *
 250 * if n is an internal node - a 'tnode' here, the various parts of its key
 251 * have many different meanings.
 252 *
 253 * Example:
 254 * _________________________________________________________________
 255 * | i | i | i | i | i | i | i | N | N | N | S | S | S | S | S | C |
 256 * -----------------------------------------------------------------
 257 *  31  30  29  28  27  26  25  24  23  22  21  20  19  18  17  16
 258 *
 259 * _________________________________________________________________
 260 * | C | C | C | u | u | u | u | u | u | u | u | u | u | u | u | u |
 261 * -----------------------------------------------------------------
 262 *  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0
 263 *
 264 * tp->pos = 22
 265 * tp->bits = 3
 266 * n->pos = 13
 267 * n->bits = 4
 268 *
 269 * First, let's just ignore the bits that come before the parent tp, that is
 270 * the bits from (tp->pos + tp->bits) to 31. They are *known* but at this
 271 * point we do not use them for anything.
 272 *
 273 * The bits from (tp->pos) to (tp->pos + tp->bits - 1) - "N", above - are the
 274 * index into the parent's child array. That is, they will be used to find
 275 * 'n' among tp's children.
 276 *
 277 * The bits from (n->pos + n->bits) to (tp->pos - 1) - "S" - are skipped bits
 278 * for the node n.
 279 *
 280 * All the bits we have seen so far are significant to the node n. The rest
 281 * of the bits are really not needed or indeed known in n->key.
 282 *
 283 * The bits from (n->pos) to (n->pos + n->bits - 1) - "C" - are the index into
 284 * n's child array, and will of course be different for each child.
 285 *
 286 * The rest of the bits, from 0 to (n->pos -1) - "u" - are completely unknown
 287 * at this point.
 288 */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 289
 290static const int halve_threshold = 25;
 291static const int inflate_threshold = 50;
 292static const int halve_threshold_root = 15;
 293static const int inflate_threshold_root = 30;
 294
 
 
 
 
 
 
 295static inline void alias_free_mem_rcu(struct fib_alias *fa)
 296{
 297	kfree_rcu(fa, rcu);
 298}
 299
 300#define TNODE_VMALLOC_MAX \
 301	ilog2((SIZE_MAX - TNODE_SIZE(0)) / sizeof(struct key_vector *))
 
 
 
 302
 303static void __node_free_rcu(struct rcu_head *head)
 304{
 305	struct tnode *n = container_of(head, struct tnode, rcu);
 
 306
 307	if (!n->tn_bits)
 308		kmem_cache_free(trie_leaf_kmem, n);
 309	else
 310		kvfree(n);
 311}
 312
 313#define node_free(n) call_rcu(&tn_info(n)->rcu, __node_free_rcu)
 314
 315static struct tnode *tnode_alloc(int bits)
 316{
 317	size_t size;
 318
 319	/* verify bits is within bounds */
 320	if (bits > TNODE_VMALLOC_MAX)
 321		return NULL;
 322
 323	/* determine size and verify it is non-zero and didn't overflow */
 324	size = TNODE_SIZE(1ul << bits);
 325
 326	if (size <= PAGE_SIZE)
 327		return kzalloc(size, GFP_KERNEL);
 328	else
 329		return vzalloc(size);
 330}
 331
 332static inline void empty_child_inc(struct key_vector *n)
 333{
 334	tn_info(n)->empty_children++;
 
 
 335
 336	if (!tn_info(n)->empty_children)
 337		tn_info(n)->full_children++;
 
 
 338}
 339
 340static inline void empty_child_dec(struct key_vector *n)
 341{
 342	if (!tn_info(n)->empty_children)
 343		tn_info(n)->full_children--;
 
 
 
 344
 345	tn_info(n)->empty_children--;
 
 
 
 
 
 
 346}
 347
 348static struct key_vector *leaf_new(t_key key, struct fib_alias *fa)
 349{
 350	struct key_vector *l;
 351	struct tnode *kv;
 352
 353	kv = kmem_cache_alloc(trie_leaf_kmem, GFP_KERNEL);
 354	if (!kv)
 355		return NULL;
 
 
 356
 357	/* initialize key vector */
 358	l = kv->kv;
 359	l->key = key;
 360	l->pos = 0;
 361	l->bits = 0;
 362	l->slen = fa->fa_slen;
 363
 364	/* link leaf to fib alias */
 365	INIT_HLIST_HEAD(&l->leaf);
 366	hlist_add_head(&fa->fa_list, &l->leaf);
 367
 
 
 
 
 
 
 
 368	return l;
 369}
 370
 371static struct key_vector *tnode_new(t_key key, int pos, int bits)
 372{
 373	unsigned int shift = pos + bits;
 374	struct key_vector *tn;
 375	struct tnode *tnode;
 
 
 
 
 
 376
 377	/* verify bits and pos their msb bits clear and values are valid */
 378	BUG_ON(!bits || (shift > KEYLENGTH));
 
 
 379
 380	tnode = tnode_alloc(bits);
 381	if (!tnode)
 382		return NULL;
 
 
 
 
 
 383
 384	pr_debug("AT %p s=%zu %zu\n", tnode, TNODE_SIZE(0),
 385		 sizeof(struct key_vector *) << bits);
 
 
 386
 387	if (bits == KEYLENGTH)
 388		tnode->full_children = 1;
 389	else
 390		tnode->empty_children = 1ul << bits;
 391
 392	tn = tnode->kv;
 393	tn->key = (shift < KEYLENGTH) ? (key >> shift) << shift : 0;
 394	tn->pos = pos;
 395	tn->bits = bits;
 396	tn->slen = pos;
 397
 398	return tn;
 399}
 400
 401/* Check whether a tnode 'n' is "full", i.e. it is an internal node
 402 * and no bits are skipped. See discussion in dyntree paper p. 6
 403 */
 404static inline int tnode_full(struct key_vector *tn, struct key_vector *n)
 405{
 406	return n && ((n->pos + n->bits) == tn->pos) && IS_TNODE(n);
 407}
 408
 409/* Add a child at position i overwriting the old value.
 410 * Update the value of full_children and empty_children.
 411 */
 412static void put_child(struct key_vector *tn, unsigned long i,
 413		      struct key_vector *n)
 
 
 414{
 415	struct key_vector *chi = get_child(tn, i);
 416	int isfull, wasfull;
 417
 418	BUG_ON(i >= child_length(tn));
 419
 420	/* update emptyChildren, overflow into fullChildren */
 421	if (!n && chi)
 422		empty_child_inc(tn);
 423	if (n && !chi)
 424		empty_child_dec(tn);
 425
 426	/* update fullChildren */
 427	wasfull = tnode_full(tn, chi);
 
 
 428	isfull = tnode_full(tn, n);
 429
 430	if (wasfull && !isfull)
 431		tn_info(tn)->full_children--;
 432	else if (!wasfull && isfull)
 433		tn_info(tn)->full_children++;
 434
 435	if (n && (tn->slen < n->slen))
 436		tn->slen = n->slen;
 437
 438	rcu_assign_pointer(tn->tnode[i], n);
 439}
 440
 441static void update_children(struct key_vector *tn)
 
 442{
 443	unsigned long i;
 
 
 
 
 444
 445	/* update all of the child parent pointers */
 446	for (i = child_length(tn); i;) {
 447		struct key_vector *inode = get_child(tn, --i);
 448
 449		if (!inode)
 450			continue;
 451
 452		/* Either update the children of a tnode that
 453		 * already belongs to us or update the child
 454		 * to point to ourselves.
 455		 */
 456		if (node_parent(inode) == tn)
 457			update_children(inode);
 458		else
 459			node_set_parent(inode, tn);
 460	}
 461}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 462
 463static inline void put_child_root(struct key_vector *tp, t_key key,
 464				  struct key_vector *n)
 465{
 466	if (IS_TRIE(tp))
 467		rcu_assign_pointer(tp->tnode[0], n);
 468	else
 469		put_child(tp, get_index(key, tp), n);
 470}
 471
 472static inline void tnode_free_init(struct key_vector *tn)
 473{
 474	tn_info(tn)->rcu.next = NULL;
 475}
 476
 477static inline void tnode_free_append(struct key_vector *tn,
 478				     struct key_vector *n)
 479{
 480	tn_info(n)->rcu.next = tn_info(tn)->rcu.next;
 481	tn_info(tn)->rcu.next = &tn_info(n)->rcu;
 482}
 
 483
 484static void tnode_free(struct key_vector *tn)
 485{
 486	struct callback_head *head = &tn_info(tn)->rcu;
 
 
 487
 488	while (head) {
 489		head = head->next;
 490		tnode_free_size += TNODE_SIZE(1ul << tn->bits);
 491		node_free(tn);
 492
 493		tn = container_of(head, struct tnode, rcu)->kv;
 
 
 
 
 
 
 494	}
 495
 496	if (tnode_free_size >= READ_ONCE(sysctl_fib_sync_mem)) {
 497		tnode_free_size = 0;
 498		synchronize_net();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 499	}
 500}
 501
 502static struct key_vector *replace(struct trie *t,
 503				  struct key_vector *oldtnode,
 504				  struct key_vector *tn)
 505{
 506	struct key_vector *tp = node_parent(oldtnode);
 507	unsigned long i;
 508
 509	/* setup the parent pointer out of and back into this node */
 510	NODE_INIT_PARENT(tn, tp);
 511	put_child_root(tp, tn->key, tn);
 
 
 512
 513	/* update all of the child parent pointers */
 514	update_children(tn);
 
 515
 516	/* all pointers should be clean so we are done */
 517	tnode_free(oldtnode);
 518
 519	/* resize children now that oldtnode is freed */
 520	for (i = child_length(tn); i;) {
 521		struct key_vector *inode = get_child(tn, --i);
 
 
 
 
 
 
 
 
 
 
 522
 523		/* resize child node */
 524		if (tnode_full(tn, inode))
 525			tn = resize(t, inode);
 
 526	}
 527
 528	return tp;
 529}
 530
 531static struct key_vector *inflate(struct trie *t,
 532				  struct key_vector *oldtnode)
 533{
 534	struct key_vector *tn;
 535	unsigned long i;
 536	t_key m;
 537
 538	pr_debug("In inflate\n");
 539
 540	tn = tnode_new(oldtnode->key, oldtnode->pos - 1, oldtnode->bits + 1);
 
 541	if (!tn)
 542		goto notnode;
 543
 544	/* prepare oldtnode to be freed */
 545	tnode_free_init(oldtnode);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 546
 547	/* Assemble all of the pointers in our cluster, in this case that
 548	 * represents all of the pointers out of our allocated nodes that
 549	 * point to existing tnodes and the links between our allocated
 550	 * nodes.
 551	 */
 552	for (i = child_length(oldtnode), m = 1u << tn->pos; i;) {
 553		struct key_vector *inode = get_child(oldtnode, --i);
 554		struct key_vector *node0, *node1;
 555		unsigned long j, k;
 
 556
 557		/* An empty child */
 558		if (!inode)
 559			continue;
 560
 561		/* A leaf or an internal node with skipped bits */
 562		if (!tnode_full(oldtnode, inode)) {
 563			put_child(tn, get_index(inode->key, tn), inode);
 
 
 
 
 564			continue;
 565		}
 566
 567		/* drop the node in the old tnode free list */
 568		tnode_free_append(oldtnode, inode);
 569
 570		/* An internal node with two children */
 571		if (inode->bits == 1) {
 572			put_child(tn, 2 * i + 1, get_child(inode, 1));
 573			put_child(tn, 2 * i, get_child(inode, 0));
 
 
 574			continue;
 575		}
 576
 
 
 577		/* We will replace this node 'inode' with two new
 578		 * ones, 'node0' and 'node1', each with half of the
 579		 * original children. The two new nodes will have
 580		 * a position one bit further down the key and this
 581		 * means that the "significant" part of their keys
 582		 * (see the discussion near the top of this file)
 583		 * will differ by one bit, which will be "0" in
 584		 * node0's key and "1" in node1's key. Since we are
 585		 * moving the key position by one step, the bit that
 586		 * we are moving away from - the bit at position
 587		 * (tn->pos) - is the one that will differ between
 588		 * node0 and node1. So... we synthesize that bit in the
 589		 * two new keys.
 
 
 590		 */
 591		node1 = tnode_new(inode->key | m, inode->pos, inode->bits - 1);
 592		if (!node1)
 593			goto nomem;
 594		node0 = tnode_new(inode->key, inode->pos, inode->bits - 1);
 595
 596		tnode_free_append(tn, node1);
 597		if (!node0)
 598			goto nomem;
 599		tnode_free_append(tn, node0);
 600
 601		/* populate child pointers in new nodes */
 602		for (k = child_length(inode), j = k / 2; j;) {
 603			put_child(node1, --j, get_child(inode, --k));
 604			put_child(node0, j, get_child(inode, j));
 605			put_child(node1, --j, get_child(inode, --k));
 606			put_child(node0, j, get_child(inode, j));
 607		}
 608
 609		/* link new nodes to parent */
 610		NODE_INIT_PARENT(node1, tn);
 611		NODE_INIT_PARENT(node0, tn);
 612
 613		/* link parent to nodes */
 614		put_child(tn, 2 * i + 1, node1);
 615		put_child(tn, 2 * i, node0);
 616	}
 617
 618	/* setup the parent pointers into and out of this node */
 619	return replace(t, oldtnode, tn);
 620nomem:
 621	/* all pointers should be clean so we are done */
 622	tnode_free(tn);
 623notnode:
 624	return NULL;
 625}
 626
 627static struct key_vector *halve(struct trie *t,
 628				struct key_vector *oldtnode)
 629{
 630	struct key_vector *tn;
 631	unsigned long i;
 632
 633	pr_debug("In halve\n");
 
 634
 635	tn = tnode_new(oldtnode->key, oldtnode->pos + 1, oldtnode->bits - 1);
 636	if (!tn)
 637		goto notnode;
 638
 639	/* prepare oldtnode to be freed */
 640	tnode_free_init(oldtnode);
 641
 642	/* Assemble all of the pointers in our cluster, in this case that
 643	 * represents all of the pointers out of our allocated nodes that
 644	 * point to existing tnodes and the links between our allocated
 645	 * nodes.
 646	 */
 647	for (i = child_length(oldtnode); i;) {
 648		struct key_vector *node1 = get_child(oldtnode, --i);
 649		struct key_vector *node0 = get_child(oldtnode, --i);
 650		struct key_vector *inode;
 651
 652		/* At least one of the children is empty */
 653		if (!node1 || !node0) {
 654			put_child(tn, i / 2, node1 ? : node0);
 655			continue;
 656		}
 
 
 657
 658		/* Two nonempty children */
 659		inode = tnode_new(node0->key, oldtnode->pos, 1);
 660		if (!inode)
 661			goto nomem;
 662		tnode_free_append(tn, inode);
 663
 664		/* initialize pointers out of node */
 665		put_child(inode, 1, node1);
 666		put_child(inode, 0, node0);
 667		NODE_INIT_PARENT(inode, tn);
 668
 669		/* link parent to node */
 670		put_child(tn, i / 2, inode);
 671	}
 672
 673	/* setup the parent pointers into and out of this node */
 674	return replace(t, oldtnode, tn);
 675nomem:
 676	/* all pointers should be clean so we are done */
 677	tnode_free(tn);
 678notnode:
 679	return NULL;
 680}
 681
 682static struct key_vector *collapse(struct trie *t,
 683				   struct key_vector *oldtnode)
 684{
 685	struct key_vector *n, *tp;
 686	unsigned long i;
 
 
 687
 688	/* scan the tnode looking for that one child that might still exist */
 689	for (n = NULL, i = child_length(oldtnode); !n && i;)
 690		n = get_child(oldtnode, --i);
 691
 692	/* compress one level */
 693	tp = node_parent(oldtnode);
 694	put_child_root(tp, oldtnode->key, n);
 695	node_set_parent(n, tp);
 696
 697	/* drop dead node */
 698	node_free(oldtnode);
 699
 700	return tp;
 701}
 
 
 
 
 702
 703static unsigned char update_suffix(struct key_vector *tn)
 704{
 705	unsigned char slen = tn->pos;
 706	unsigned long stride, i;
 707	unsigned char slen_max;
 708
 709	/* only vector 0 can have a suffix length greater than or equal to
 710	 * tn->pos + tn->bits, the second highest node will have a suffix
 711	 * length at most of tn->pos + tn->bits - 1
 712	 */
 713	slen_max = min_t(unsigned char, tn->pos + tn->bits - 1, tn->slen);
 714
 715	/* search though the list of children looking for nodes that might
 716	 * have a suffix greater than the one we currently have.  This is
 717	 * why we start with a stride of 2 since a stride of 1 would
 718	 * represent the nodes with suffix length equal to tn->pos
 719	 */
 720	for (i = 0, stride = 0x2ul ; i < child_length(tn); i += stride) {
 721		struct key_vector *n = get_child(tn, i);
 722
 723		if (!n || (n->slen <= slen))
 724			continue;
 725
 726		/* update stride and slen based on new value */
 727		stride <<= (n->slen - slen);
 728		slen = n->slen;
 729		i &= ~(stride - 1);
 730
 731		/* stop searching if we have hit the maximum possible value */
 732		if (slen >= slen_max)
 733			break;
 734	}
 735
 736	tn->slen = slen;
 
 737
 738	return slen;
 739}
 740
 741/* From "Implementing a dynamic compressed trie" by Stefan Nilsson of
 742 * the Helsinki University of Technology and Matti Tikkanen of Nokia
 743 * Telecommunications, page 6:
 744 * "A node is doubled if the ratio of non-empty children to all
 745 * children in the *doubled* node is at least 'high'."
 746 *
 747 * 'high' in this instance is the variable 'inflate_threshold'. It
 748 * is expressed as a percentage, so we multiply it with
 749 * child_length() and instead of multiplying by 2 (since the
 750 * child array will be doubled by inflate()) and multiplying
 751 * the left-hand side by 100 (to handle the percentage thing) we
 752 * multiply the left-hand side by 50.
 753 *
 754 * The left-hand side may look a bit weird: child_length(tn)
 755 * - tn->empty_children is of course the number of non-null children
 756 * in the current node. tn->full_children is the number of "full"
 757 * children, that is non-null tnodes with a skip value of 0.
 758 * All of those will be doubled in the resulting inflated tnode, so
 759 * we just count them one extra time here.
 760 *
 761 * A clearer way to write this would be:
 762 *
 763 * to_be_doubled = tn->full_children;
 764 * not_to_be_doubled = child_length(tn) - tn->empty_children -
 765 *     tn->full_children;
 766 *
 767 * new_child_length = child_length(tn) * 2;
 768 *
 769 * new_fill_factor = 100 * (not_to_be_doubled + 2*to_be_doubled) /
 770 *      new_child_length;
 771 * if (new_fill_factor >= inflate_threshold)
 772 *
 773 * ...and so on, tho it would mess up the while () loop.
 774 *
 775 * anyway,
 776 * 100 * (not_to_be_doubled + 2*to_be_doubled) / new_child_length >=
 777 *      inflate_threshold
 778 *
 779 * avoid a division:
 780 * 100 * (not_to_be_doubled + 2*to_be_doubled) >=
 781 *      inflate_threshold * new_child_length
 782 *
 783 * expand not_to_be_doubled and to_be_doubled, and shorten:
 784 * 100 * (child_length(tn) - tn->empty_children +
 785 *    tn->full_children) >= inflate_threshold * new_child_length
 786 *
 787 * expand new_child_length:
 788 * 100 * (child_length(tn) - tn->empty_children +
 789 *    tn->full_children) >=
 790 *      inflate_threshold * child_length(tn) * 2
 791 *
 792 * shorten again:
 793 * 50 * (tn->full_children + child_length(tn) -
 794 *    tn->empty_children) >= inflate_threshold *
 795 *    child_length(tn)
 796 *
 797 */
 798static inline bool should_inflate(struct key_vector *tp, struct key_vector *tn)
 799{
 800	unsigned long used = child_length(tn);
 801	unsigned long threshold = used;
 802
 803	/* Keep root node larger */
 804	threshold *= IS_TRIE(tp) ? inflate_threshold_root : inflate_threshold;
 805	used -= tn_info(tn)->empty_children;
 806	used += tn_info(tn)->full_children;
 807
 808	/* if bits == KEYLENGTH then pos = 0, and will fail below */
 
 
 
 
 
 
 
 
 
 
 
 
 809
 810	return (used > 1) && tn->pos && ((50 * used) >= threshold);
 811}
 812
 813static inline bool should_halve(struct key_vector *tp, struct key_vector *tn)
 814{
 815	unsigned long used = child_length(tn);
 816	unsigned long threshold = used;
 817
 818	/* Keep root node larger */
 819	threshold *= IS_TRIE(tp) ? halve_threshold_root : halve_threshold;
 820	used -= tn_info(tn)->empty_children;
 821
 822	/* if bits == KEYLENGTH then used = 100% on wrap, and will fail below */
 823
 824	return (used > 1) && (tn->bits > 1) && ((100 * used) < threshold);
 825}
 826
 827static inline bool should_collapse(struct key_vector *tn)
 828{
 829	unsigned long used = child_length(tn);
 830
 831	used -= tn_info(tn)->empty_children;
 832
 833	/* account for bits == KEYLENGTH case */
 834	if ((tn->bits == KEYLENGTH) && tn_info(tn)->full_children)
 835		used -= KEY_MAX;
 836
 837	/* One child or none, time to drop us from the trie */
 838	return used < 2;
 839}
 840
 841#define MAX_WORK 10
 842static struct key_vector *resize(struct trie *t, struct key_vector *tn)
 843{
 844#ifdef CONFIG_IP_FIB_TRIE_STATS
 845	struct trie_use_stats __percpu *stats = t->stats;
 846#endif
 847	struct key_vector *tp = node_parent(tn);
 848	unsigned long cindex = get_index(tn->key, tp);
 849	int max_work = MAX_WORK;
 850
 851	pr_debug("In tnode_resize %p inflate_threshold=%d threshold=%d\n",
 852		 tn, inflate_threshold, halve_threshold);
 
 
 
 
 853
 854	/* track the tnode via the pointer from the parent instead of
 855	 * doing it ourselves.  This way we can let RCU fully do its
 856	 * thing without us interfering
 857	 */
 858	BUG_ON(tn != get_child(tp, cindex));
 859
 860	/* Double as long as the resulting node has a number of
 861	 * nonempty nodes that are above the threshold.
 862	 */
 863	while (should_inflate(tp, tn) && max_work) {
 864		tp = inflate(t, tn);
 865		if (!tp) {
 866#ifdef CONFIG_IP_FIB_TRIE_STATS
 867			this_cpu_inc(stats->resize_node_skipped);
 868#endif
 869			break;
 870		}
 871
 872		max_work--;
 873		tn = get_child(tp, cindex);
 
 874	}
 
 875
 876	/* update parent in case inflate failed */
 877	tp = node_parent(tn);
 878
 879	/* Return if at least one inflate is run */
 880	if (max_work != MAX_WORK)
 881		return tp;
 882
 883	/* Halve as long as the number of empty children in this
 884	 * node is above threshold.
 885	 */
 886	while (should_halve(tp, tn) && max_work) {
 887		tp = halve(t, tn);
 888		if (!tp) {
 889#ifdef CONFIG_IP_FIB_TRIE_STATS
 890			this_cpu_inc(stats->resize_node_skipped);
 891#endif
 
 
 
 
 
 
 
 
 
 892			break;
 893		}
 894
 895		max_work--;
 896		tn = get_child(tp, cindex);
 897	}
 
 898
 899	/* Only one child remains */
 900	if (should_collapse(tn))
 901		return collapse(t, tn);
 902
 903	/* update parent in case halve failed */
 904	return node_parent(tn);
 905}
 906
 907static void node_pull_suffix(struct key_vector *tn, unsigned char slen)
 908{
 909	unsigned char node_slen = tn->slen;
 
 
 910
 911	while ((node_slen > tn->pos) && (node_slen > slen)) {
 912		slen = update_suffix(tn);
 913		if (node_slen == slen)
 914			break;
 915
 916		tn = node_parent(tn);
 917		node_slen = tn->slen;
 918	}
 919}
 920
 921static void node_push_suffix(struct key_vector *tn, unsigned char slen)
 922{
 923	while (tn->slen < slen) {
 924		tn->slen = slen;
 925		tn = node_parent(tn);
 926	}
 927}
 928
 929/* rcu_read_lock needs to be hold by caller from readside */
 930static struct key_vector *fib_find_node(struct trie *t,
 931					struct key_vector **tp, u32 key)
 932{
 933	struct key_vector *pn, *n = t->kv;
 934	unsigned long index = 0;
 935
 936	do {
 937		pn = n;
 938		n = get_child_rcu(n, index);
 939
 940		if (!n)
 
 941			break;
 
 
 942
 943		index = get_cindex(key, n);
 
 
 944
 945		/* This bit of code is a bit tricky but it combines multiple
 946		 * checks into a single check.  The prefix consists of the
 947		 * prefix plus zeros for the bits in the cindex. The index
 948		 * is the difference between the key and this value.  From
 949		 * this we can actually derive several pieces of data.
 950		 *   if (index >= (1ul << bits))
 951		 *     we have a mismatch in skip bits and failed
 952		 *   else
 953		 *     we know the value is cindex
 954		 *
 955		 * This check is safe even if bits == KEYLENGTH due to the
 956		 * fact that we can only allocate a node with 32 bits if a
 957		 * long is greater than 32 bits.
 958		 */
 959		if (index >= (1ul << n->bits)) {
 960			n = NULL;
 961			break;
 962		}
 963
 964		/* keep searching until we find a perfect match leaf or NULL */
 965	} while (IS_TNODE(n));
 966
 967	*tp = pn;
 968
 969	return n;
 970}
 971
 972/* Return the first fib alias matching DSCP with
 973 * priority less than or equal to PRIO.
 974 * If 'find_first' is set, return the first matching
 975 * fib alias, regardless of DSCP and priority.
 976 */
 977static struct fib_alias *fib_find_alias(struct hlist_head *fah, u8 slen,
 978					dscp_t dscp, u32 prio, u32 tb_id,
 979					bool find_first)
 980{
 981	struct fib_alias *fa;
 
 
 
 
 
 
 
 982
 983	if (!fah)
 984		return NULL;
 985
 986	hlist_for_each_entry(fa, fah, fa_list) {
 987		/* Avoid Sparse warning when using dscp_t in inequalities */
 988		u8 __fa_dscp = inet_dscp_to_dsfield(fa->fa_dscp);
 989		u8 __dscp = inet_dscp_to_dsfield(dscp);
 
 
 
 
 
 
 
 
 
 
 
 
 
 990
 991		if (fa->fa_slen < slen)
 992			continue;
 993		if (fa->fa_slen != slen)
 994			break;
 995		if (fa->tb_id > tb_id)
 996			continue;
 997		if (fa->tb_id != tb_id)
 998			break;
 999		if (find_first)
1000			return fa;
1001		if (__fa_dscp > __dscp)
1002			continue;
1003		if (fa->fa_info->fib_priority >= prio || __fa_dscp < __dscp)
1004			return fa;
1005	}
1006
1007	return NULL;
1008}
1009
1010static struct fib_alias *
1011fib_find_matching_alias(struct net *net, const struct fib_rt_info *fri)
1012{
1013	u8 slen = KEYLENGTH - fri->dst_len;
1014	struct key_vector *l, *tp;
1015	struct fib_table *tb;
1016	struct fib_alias *fa;
1017	struct trie *t;
1018
1019	tb = fib_get_table(net, fri->tb_id);
1020	if (!tb)
1021		return NULL;
1022
1023	t = (struct trie *)tb->tb_data;
1024	l = fib_find_node(t, &tp, be32_to_cpu(fri->dst));
1025	if (!l)
1026		return NULL;
1027
1028	hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
1029		if (fa->fa_slen == slen && fa->tb_id == fri->tb_id &&
1030		    fa->fa_dscp == fri->dscp && fa->fa_info == fri->fi &&
1031		    fa->fa_type == fri->type)
1032			return fa;
1033	}
1034
1035	return NULL;
1036}
1037
1038void fib_alias_hw_flags_set(struct net *net, const struct fib_rt_info *fri)
1039{
1040	u8 fib_notify_on_flag_change;
1041	struct fib_alias *fa_match;
1042	struct sk_buff *skb;
1043	int err;
1044
1045	rcu_read_lock();
1046
1047	fa_match = fib_find_matching_alias(net, fri);
1048	if (!fa_match)
1049		goto out;
1050
1051	/* These are paired with the WRITE_ONCE() happening in this function.
1052	 * The reason is that we are only protected by RCU at this point.
1053	 */
1054	if (READ_ONCE(fa_match->offload) == fri->offload &&
1055	    READ_ONCE(fa_match->trap) == fri->trap &&
1056	    READ_ONCE(fa_match->offload_failed) == fri->offload_failed)
1057		goto out;
1058
1059	WRITE_ONCE(fa_match->offload, fri->offload);
1060	WRITE_ONCE(fa_match->trap, fri->trap);
1061
1062	fib_notify_on_flag_change = READ_ONCE(net->ipv4.sysctl_fib_notify_on_flag_change);
1063
1064	/* 2 means send notifications only if offload_failed was changed. */
1065	if (fib_notify_on_flag_change == 2 &&
1066	    READ_ONCE(fa_match->offload_failed) == fri->offload_failed)
1067		goto out;
1068
1069	WRITE_ONCE(fa_match->offload_failed, fri->offload_failed);
 
1070
1071	if (!fib_notify_on_flag_change)
1072		goto out;
1073
1074	skb = nlmsg_new(fib_nlmsg_size(fa_match->fa_info), GFP_ATOMIC);
1075	if (!skb) {
1076		err = -ENOBUFS;
1077		goto errout;
1078	}
1079
1080	err = fib_dump_info(skb, 0, 0, RTM_NEWROUTE, fri, 0);
1081	if (err < 0) {
1082		/* -EMSGSIZE implies BUG in fib_nlmsg_size() */
1083		WARN_ON(err == -EMSGSIZE);
1084		kfree_skb(skb);
1085		goto errout;
1086	}
 
1087
1088	rtnl_notify(skb, net, 0, RTNLGRP_IPV4_ROUTE, NULL, GFP_ATOMIC);
1089	goto out;
1090
1091errout:
1092	rtnl_set_sk_err(net, RTNLGRP_IPV4_ROUTE, err);
1093out:
1094	rcu_read_unlock();
1095}
1096EXPORT_SYMBOL_GPL(fib_alias_hw_flags_set);
1097
1098static void trie_rebalance(struct trie *t, struct key_vector *tn)
1099{
1100	while (!IS_TRIE(tn))
1101		tn = resize(t, tn);
1102}
1103
1104static int fib_insert_node(struct trie *t, struct key_vector *tp,
1105			   struct fib_alias *new, t_key key)
1106{
1107	struct key_vector *n, *l;
1108
1109	l = leaf_new(key, new);
1110	if (!l)
1111		goto noleaf;
1112
1113	/* retrieve child from parent node */
1114	n = get_child(tp, get_index(key, tp));
1115
1116	/* Case 2: n is a LEAF or a TNODE and the key doesn't match.
1117	 *
1118	 *  Add a new tnode here
1119	 *  first tnode need some special handling
1120	 *  leaves us in position for handling as case 3
1121	 */
1122	if (n) {
1123		struct key_vector *tn;
1124
1125		tn = tnode_new(key, __fls(key ^ n->key), 1);
1126		if (!tn)
1127			goto notnode;
1128
1129		/* initialize routes out of node */
1130		NODE_INIT_PARENT(tn, tp);
1131		put_child(tn, get_index(key, tn) ^ 1, n);
1132
1133		/* start adding routes into the node */
1134		put_child_root(tp, key, tn);
1135		node_set_parent(n, tn);
1136
1137		/* parent now has a NULL spot where the leaf can go */
1138		tp = tn;
1139	}
1140
1141	/* Case 3: n is NULL, and will just insert a new leaf */
1142	node_push_suffix(tp, new->fa_slen);
1143	NODE_INIT_PARENT(l, tp);
1144	put_child_root(tp, key, l);
1145	trie_rebalance(t, tp);
1146
1147	return 0;
1148notnode:
1149	node_free(l);
1150noleaf:
1151	return -ENOMEM;
1152}
1153
1154static int fib_insert_alias(struct trie *t, struct key_vector *tp,
1155			    struct key_vector *l, struct fib_alias *new,
1156			    struct fib_alias *fa, t_key key)
1157{
1158	if (!l)
1159		return fib_insert_node(t, tp, new, key);
1160
1161	if (fa) {
1162		hlist_add_before_rcu(&new->fa_list, &fa->fa_list);
1163	} else {
1164		struct fib_alias *last;
 
 
 
 
1165
1166		hlist_for_each_entry(last, &l->leaf, fa_list) {
1167			if (new->fa_slen < last->fa_slen)
1168				break;
1169			if ((new->fa_slen == last->fa_slen) &&
1170			    (new->tb_id > last->tb_id))
1171				break;
1172			fa = last;
1173		}
1174
1175		if (fa)
1176			hlist_add_behind_rcu(&new->fa_list, &fa->fa_list);
1177		else
1178			hlist_add_head_rcu(&new->fa_list, &l->leaf);
1179	}
1180
1181	/* if we added to the tail node then we need to update slen */
1182	if (l->slen < new->fa_slen) {
1183		l->slen = new->fa_slen;
1184		node_push_suffix(tp, new->fa_slen);
1185	}
1186
1187	return 0;
1188}
 
1189
1190static bool fib_valid_key_len(u32 key, u8 plen, struct netlink_ext_ack *extack)
1191{
1192	if (plen > KEYLENGTH) {
1193		NL_SET_ERR_MSG(extack, "Invalid prefix length");
1194		return false;
 
 
1195	}
1196
1197	if ((plen < KEYLENGTH) && (key << plen)) {
1198		NL_SET_ERR_MSG(extack,
1199			       "Invalid prefix for given prefix length");
1200		return false;
1201	}
1202
1203	return true;
 
 
1204}
1205
1206static void fib_remove_alias(struct trie *t, struct key_vector *tp,
1207			     struct key_vector *l, struct fib_alias *old);
1208
1209/* Caller must hold RTNL. */
1210int fib_table_insert(struct net *net, struct fib_table *tb,
1211		     struct fib_config *cfg, struct netlink_ext_ack *extack)
1212{
1213	struct trie *t = (struct trie *)tb->tb_data;
1214	struct fib_alias *fa, *new_fa;
1215	struct key_vector *l, *tp;
1216	u16 nlflags = NLM_F_EXCL;
1217	struct fib_info *fi;
1218	u8 plen = cfg->fc_dst_len;
1219	u8 slen = KEYLENGTH - plen;
1220	dscp_t dscp;
1221	u32 key;
1222	int err;
 
 
 
 
1223
1224	key = ntohl(cfg->fc_dst);
1225
1226	if (!fib_valid_key_len(key, plen, extack))
 
 
 
 
1227		return -EINVAL;
1228
1229	pr_debug("Insert table=%u %08x/%d\n", tb->tb_id, key, plen);
1230
1231	fi = fib_create_info(cfg, extack);
1232	if (IS_ERR(fi)) {
1233		err = PTR_ERR(fi);
1234		goto err;
1235	}
1236
1237	dscp = cfg->fc_dscp;
1238	l = fib_find_node(t, &tp, key);
1239	fa = l ? fib_find_alias(&l->leaf, slen, dscp, fi->fib_priority,
1240				tb->tb_id, false) : NULL;
 
 
 
1241
1242	/* Now fa, if non-NULL, points to the first fib alias
1243	 * with the same keys [prefix,dscp,priority], if such key already
1244	 * exists or to the node before which we will insert new one.
1245	 *
1246	 * If fa is NULL, we will need to allocate a new one and
1247	 * insert to the tail of the section matching the suffix length
1248	 * of the new alias.
 
 
1249	 */
1250
1251	if (fa && fa->fa_dscp == dscp &&
1252	    fa->fa_info->fib_priority == fi->fib_priority) {
1253		struct fib_alias *fa_first, *fa_match;
1254
1255		err = -EEXIST;
1256		if (cfg->fc_nlflags & NLM_F_EXCL)
1257			goto out;
1258
1259		nlflags &= ~NLM_F_EXCL;
1260
1261		/* We have 2 goals:
1262		 * 1. Find exact match for type, scope, fib_info to avoid
1263		 * duplicate routes
1264		 * 2. Find next 'fa' (or head), NLM_F_APPEND inserts before it
1265		 */
1266		fa_match = NULL;
1267		fa_first = fa;
1268		hlist_for_each_entry_from(fa, fa_list) {
1269			if ((fa->fa_slen != slen) ||
1270			    (fa->tb_id != tb->tb_id) ||
1271			    (fa->fa_dscp != dscp))
1272				break;
1273			if (fa->fa_info->fib_priority != fi->fib_priority)
1274				break;
1275			if (fa->fa_type == cfg->fc_type &&
1276			    fa->fa_info == fi) {
1277				fa_match = fa;
1278				break;
1279			}
1280		}
1281
1282		if (cfg->fc_nlflags & NLM_F_REPLACE) {
1283			struct fib_info *fi_drop;
1284			u8 state;
1285
1286			nlflags |= NLM_F_REPLACE;
1287			fa = fa_first;
1288			if (fa_match) {
1289				if (fa == fa_match)
1290					err = 0;
1291				goto out;
1292			}
1293			err = -ENOBUFS;
1294			new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL);
1295			if (!new_fa)
1296				goto out;
1297
1298			fi_drop = fa->fa_info;
1299			new_fa->fa_dscp = fa->fa_dscp;
1300			new_fa->fa_info = fi;
1301			new_fa->fa_type = cfg->fc_type;
1302			state = fa->fa_state;
1303			new_fa->fa_state = state & ~FA_S_ACCESSED;
1304			new_fa->fa_slen = fa->fa_slen;
1305			new_fa->tb_id = tb->tb_id;
1306			new_fa->fa_default = -1;
1307			new_fa->offload = 0;
1308			new_fa->trap = 0;
1309			new_fa->offload_failed = 0;
1310
1311			hlist_replace_rcu(&fa->fa_list, &new_fa->fa_list);
1312
1313			if (fib_find_alias(&l->leaf, fa->fa_slen, 0, 0,
1314					   tb->tb_id, true) == new_fa) {
1315				enum fib_event_type fib_event;
1316
1317				fib_event = FIB_EVENT_ENTRY_REPLACE;
1318				err = call_fib_entry_notifiers(net, fib_event,
1319							       key, plen,
1320							       new_fa, extack);
1321				if (err) {
1322					hlist_replace_rcu(&new_fa->fa_list,
1323							  &fa->fa_list);
1324					goto out_free_new_fa;
1325				}
1326			}
1327
1328			rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen,
1329				  tb->tb_id, &cfg->fc_nlinfo, nlflags);
1330
 
1331			alias_free_mem_rcu(fa);
1332
1333			fib_release_info(fi_drop);
1334			if (state & FA_S_ACCESSED)
1335				rt_cache_flush(cfg->fc_nlinfo.nl_net);
 
 
1336
1337			goto succeeded;
1338		}
1339		/* Error if we find a perfect match which
1340		 * uses the same scope, type, and nexthop
1341		 * information.
1342		 */
1343		if (fa_match)
1344			goto out;
1345
1346		if (cfg->fc_nlflags & NLM_F_APPEND)
1347			nlflags |= NLM_F_APPEND;
1348		else
1349			fa = fa_first;
1350	}
1351	err = -ENOENT;
1352	if (!(cfg->fc_nlflags & NLM_F_CREATE))
1353		goto out;
1354
1355	nlflags |= NLM_F_CREATE;
1356	err = -ENOBUFS;
1357	new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL);
1358	if (!new_fa)
1359		goto out;
1360
1361	new_fa->fa_info = fi;
1362	new_fa->fa_dscp = dscp;
1363	new_fa->fa_type = cfg->fc_type;
1364	new_fa->fa_state = 0;
1365	new_fa->fa_slen = slen;
1366	new_fa->tb_id = tb->tb_id;
1367	new_fa->fa_default = -1;
1368	new_fa->offload = 0;
1369	new_fa->trap = 0;
1370	new_fa->offload_failed = 0;
1371
1372	/* Insert new entry to the list. */
1373	err = fib_insert_alias(t, tp, l, new_fa, fa, key);
1374	if (err)
1375		goto out_free_new_fa;
1376
1377	/* The alias was already inserted, so the node must exist. */
1378	l = l ? l : fib_find_node(t, &tp, key);
1379	if (WARN_ON_ONCE(!l)) {
1380		err = -ENOENT;
1381		goto out_free_new_fa;
1382	}
1383
1384	if (fib_find_alias(&l->leaf, new_fa->fa_slen, 0, 0, tb->tb_id, true) ==
1385	    new_fa) {
1386		enum fib_event_type fib_event;
1387
1388		fib_event = FIB_EVENT_ENTRY_REPLACE;
1389		err = call_fib_entry_notifiers(net, fib_event, key, plen,
1390					       new_fa, extack);
1391		if (err)
1392			goto out_remove_new_fa;
1393	}
1394
1395	if (!plen)
1396		tb->tb_num_default++;
1397
 
 
 
1398	rt_cache_flush(cfg->fc_nlinfo.nl_net);
1399	rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, new_fa->tb_id,
1400		  &cfg->fc_nlinfo, nlflags);
1401succeeded:
1402	return 0;
1403
1404out_remove_new_fa:
1405	fib_remove_alias(t, tp, l, new_fa);
1406out_free_new_fa:
1407	kmem_cache_free(fn_alias_kmem, new_fa);
1408out:
1409	fib_release_info(fi);
1410err:
1411	return err;
1412}
1413
1414static inline t_key prefix_mismatch(t_key key, struct key_vector *n)
 
 
 
1415{
1416	t_key prefix = n->key;
 
 
 
 
 
 
 
1417
1418	return (key ^ prefix) & (prefix | -prefix);
1419}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1420
1421bool fib_lookup_good_nhc(const struct fib_nh_common *nhc, int fib_flags,
1422			 const struct flowi4 *flp)
1423{
1424	if (nhc->nhc_flags & RTNH_F_DEAD)
1425		return false;
1426
1427	if (ip_ignore_linkdown(nhc->nhc_dev) &&
1428	    nhc->nhc_flags & RTNH_F_LINKDOWN &&
1429	    !(fib_flags & FIB_LOOKUP_IGNORE_LINKSTATE))
1430		return false;
 
 
 
 
 
 
 
 
 
 
 
1431
1432	if (flp->flowi4_oif && flp->flowi4_oif != nhc->nhc_oif)
1433		return false;
 
 
1434
1435	return true;
1436}
1437
1438/* should be called with rcu_read_lock */
1439int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
1440		     struct fib_result *res, int fib_flags)
1441{
1442	struct trie *t = (struct trie *) tb->tb_data;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1443#ifdef CONFIG_IP_FIB_TRIE_STATS
1444	struct trie_use_stats __percpu *stats = t->stats;
1445#endif
1446	const t_key key = ntohl(flp->daddr);
1447	struct key_vector *n, *pn;
1448	struct fib_alias *fa;
1449	unsigned long index;
1450	t_key cindex;
1451
1452	pn = t->kv;
1453	cindex = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1454
1455	n = get_child_rcu(pn, cindex);
1456	if (!n) {
1457		trace_fib_table_lookup(tb->tb_id, flp, NULL, -EAGAIN);
1458		return -EAGAIN;
1459	}
1460
 
1461#ifdef CONFIG_IP_FIB_TRIE_STATS
1462	this_cpu_inc(stats->gets);
1463#endif
 
 
 
 
 
 
 
 
 
 
 
1464
1465	/* Step 1: Travel to the longest prefix match in the trie */
1466	for (;;) {
1467		index = get_cindex(key, n);
1468
1469		/* This bit of code is a bit tricky but it combines multiple
1470		 * checks into a single check.  The prefix consists of the
1471		 * prefix plus zeros for the "bits" in the prefix. The index
1472		 * is the difference between the key and this value.  From
1473		 * this we can actually derive several pieces of data.
1474		 *   if (index >= (1ul << bits))
1475		 *     we have a mismatch in skip bits and failed
1476		 *   else
1477		 *     we know the value is cindex
1478		 *
1479		 * This check is safe even if bits == KEYLENGTH due to the
1480		 * fact that we can only allocate a node with 32 bits if a
1481		 * long is greater than 32 bits.
 
 
 
 
 
 
 
 
1482		 */
1483		if (index >= (1ul << n->bits))
1484			break;
1485
1486		/* we have found a leaf. Prefixes have already been compared */
1487		if (IS_LEAF(n))
1488			goto found;
1489
1490		/* only record pn and cindex if we are going to be chopping
1491		 * bits later.  Otherwise we are just wasting cycles.
 
 
 
 
 
 
 
 
 
 
 
 
 
1492		 */
1493		if (n->slen > n->pos) {
1494			pn = n;
1495			cindex = index;
1496		}
1497
1498		n = get_child_rcu(n, index);
1499		if (unlikely(!n))
1500			goto backtrace;
1501	}
 
 
 
 
1502
1503	/* Step 2: Sort out leaves and begin backtracing for longest prefix */
1504	for (;;) {
1505		/* record the pointer where our next node pointer is stored */
1506		struct key_vector __rcu **cptr = n->tnode;
1507
1508		/* This test verifies that none of the bits that differ
1509		 * between the key and the prefix exist in the region of
1510		 * the lsb and higher in the prefix.
 
 
 
1511		 */
1512		if (unlikely(prefix_mismatch(key, n)) || (n->slen == n->pos))
1513			goto backtrace;
1514
1515		/* exit out and process leaf */
1516		if (unlikely(IS_LEAF(n)))
1517			break;
1518
1519		/* Don't bother recording parent info.  Since we are in
1520		 * prefix match mode we will have to come back to wherever
1521		 * we started this traversal anyway
 
1522		 */
 
 
 
1523
1524		while ((n = rcu_dereference(*cptr)) == NULL) {
1525backtrace:
1526#ifdef CONFIG_IP_FIB_TRIE_STATS
1527			if (!n)
1528				this_cpu_inc(stats->null_node_hit);
1529#endif
1530			/* If we are at cindex 0 there are no more bits for
1531			 * us to strip at this level so we must ascend back
1532			 * up one level to see if there are any more bits to
1533			 * be stripped there.
1534			 */
1535			while (!cindex) {
1536				t_key pkey = pn->key;
1537
1538				/* If we don't have a parent then there is
1539				 * nothing for us to do as we do not have any
1540				 * further nodes to parse.
1541				 */
1542				if (IS_TRIE(pn)) {
1543					trace_fib_table_lookup(tb->tb_id, flp,
1544							       NULL, -EAGAIN);
1545					return -EAGAIN;
1546				}
1547#ifdef CONFIG_IP_FIB_TRIE_STATS
1548				this_cpu_inc(stats->backtrack);
1549#endif
1550				/* Get Child's index */
1551				pn = node_parent_rcu(pn);
1552				cindex = get_index(pkey, pn);
1553			}
1554
1555			/* strip the least significant bit from the cindex */
1556			cindex &= cindex - 1;
1557
1558			/* grab pointer for next child node */
1559			cptr = &pn->tnode[cindex];
1560		}
1561	}
1562
1563found:
1564	/* this line carries forward the xor from earlier in the function */
1565	index = key ^ n->key;
1566
1567	/* Step 3: Process the leaf, if that fails fall back to backtracing */
1568	hlist_for_each_entry_rcu(fa, &n->leaf, fa_list) {
1569		struct fib_info *fi = fa->fa_info;
1570		struct fib_nh_common *nhc;
1571		int nhsel, err;
1572
1573		if ((BITS_PER_LONG > KEYLENGTH) || (fa->fa_slen < KEYLENGTH)) {
1574			if (index >= (1ul << fa->fa_slen))
1575				continue;
1576		}
1577		if (fa->fa_dscp && !fib_dscp_masked_match(fa->fa_dscp, flp))
1578			continue;
1579		/* Paired with WRITE_ONCE() in fib_release_info() */
1580		if (READ_ONCE(fi->fib_dead))
1581			continue;
1582		if (fa->fa_info->fib_scope < flp->flowi4_scope)
1583			continue;
1584		fib_alias_accessed(fa);
1585		err = fib_props[fa->fa_type].error;
1586		if (unlikely(err < 0)) {
1587out_reject:
1588#ifdef CONFIG_IP_FIB_TRIE_STATS
1589			this_cpu_inc(stats->semantic_match_passed);
1590#endif
1591			trace_fib_table_lookup(tb->tb_id, flp, NULL, err);
1592			return err;
1593		}
1594		if (fi->fib_flags & RTNH_F_DEAD)
1595			continue;
1596
1597		if (unlikely(fi->nh)) {
1598			if (nexthop_is_blackhole(fi->nh)) {
1599				err = fib_props[RTN_BLACKHOLE].error;
1600				goto out_reject;
1601			}
1602
1603			nhc = nexthop_get_nhc_lookup(fi->nh, fib_flags, flp,
1604						     &nhsel);
1605			if (nhc)
1606				goto set_result;
1607			goto miss;
1608		}
1609
1610		for (nhsel = 0; nhsel < fib_info_num_path(fi); nhsel++) {
1611			nhc = fib_info_nhc(fi, nhsel);
1612
1613			if (!fib_lookup_good_nhc(nhc, fib_flags, flp))
1614				continue;
1615set_result:
1616			if (!(fib_flags & FIB_LOOKUP_NOREF))
1617				refcount_inc(&fi->fib_clntref);
1618
1619			res->prefix = htonl(n->key);
1620			res->prefixlen = KEYLENGTH - fa->fa_slen;
1621			res->nh_sel = nhsel;
1622			res->nhc = nhc;
1623			res->type = fa->fa_type;
1624			res->scope = fi->fib_scope;
1625			res->dscp = fa->fa_dscp;
1626			res->fi = fi;
1627			res->table = tb;
1628			res->fa_head = &n->leaf;
1629#ifdef CONFIG_IP_FIB_TRIE_STATS
1630			this_cpu_inc(stats->semantic_match_passed);
1631#endif
1632			trace_fib_table_lookup(tb->tb_id, flp, nhc, err);
1633
1634			return err;
1635		}
1636	}
1637miss:
1638#ifdef CONFIG_IP_FIB_TRIE_STATS
1639	this_cpu_inc(stats->semantic_match_miss);
1640#endif
1641	goto backtrace;
1642}
1643EXPORT_SYMBOL_GPL(fib_table_lookup);
1644
1645static void fib_remove_alias(struct trie *t, struct key_vector *tp,
1646			     struct key_vector *l, struct fib_alias *old)
 
 
1647{
1648	/* record the location of the previous list_info entry */
1649	struct hlist_node **pprev = old->fa_list.pprev;
1650	struct fib_alias *fa = hlist_entry(pprev, typeof(*fa), fa_list.next);
1651
1652	/* remove the fib_alias from the list */
1653	hlist_del_rcu(&old->fa_list);
1654
1655	/* if we emptied the list this leaf will be freed and we can sort
1656	 * out parent suffix lengths as a part of trie_rebalance
1657	 */
1658	if (hlist_empty(&l->leaf)) {
1659		if (tp->slen == l->slen)
1660			node_pull_suffix(tp, tp->pos);
1661		put_child_root(tp, l->key, NULL);
1662		node_free(l);
1663		trie_rebalance(t, tp);
1664		return;
1665	}
1666
1667	/* only access fa if it is pointing at the last valid hlist_node */
1668	if (*pprev)
1669		return;
1670
1671	/* update the trie with the latest suffix length */
1672	l->slen = fa->fa_slen;
1673	node_pull_suffix(tp, fa->fa_slen);
1674}
1675
1676static void fib_notify_alias_delete(struct net *net, u32 key,
1677				    struct hlist_head *fah,
1678				    struct fib_alias *fa_to_delete,
1679				    struct netlink_ext_ack *extack)
1680{
1681	struct fib_alias *fa_next, *fa_to_notify;
1682	u32 tb_id = fa_to_delete->tb_id;
1683	u8 slen = fa_to_delete->fa_slen;
1684	enum fib_event_type fib_event;
1685
1686	/* Do not notify if we do not care about the route. */
1687	if (fib_find_alias(fah, slen, 0, 0, tb_id, true) != fa_to_delete)
1688		return;
1689
1690	/* Determine if the route should be replaced by the next route in the
1691	 * list.
1692	 */
1693	fa_next = hlist_entry_safe(fa_to_delete->fa_list.next,
1694				   struct fib_alias, fa_list);
1695	if (fa_next && fa_next->fa_slen == slen && fa_next->tb_id == tb_id) {
1696		fib_event = FIB_EVENT_ENTRY_REPLACE;
1697		fa_to_notify = fa_next;
1698	} else {
1699		fib_event = FIB_EVENT_ENTRY_DEL;
1700		fa_to_notify = fa_to_delete;
1701	}
1702	call_fib_entry_notifiers(net, fib_event, key, KEYLENGTH - slen,
1703				 fa_to_notify, extack);
1704}
1705
1706/* Caller must hold RTNL. */
1707int fib_table_delete(struct net *net, struct fib_table *tb,
1708		     struct fib_config *cfg, struct netlink_ext_ack *extack)
1709{
1710	struct trie *t = (struct trie *) tb->tb_data;
 
 
 
1711	struct fib_alias *fa, *fa_to_delete;
1712	struct key_vector *l, *tp;
1713	u8 plen = cfg->fc_dst_len;
1714	u8 slen = KEYLENGTH - plen;
1715	dscp_t dscp;
1716	u32 key;
 
1717
1718	key = ntohl(cfg->fc_dst);
 
1719
1720	if (!fib_valid_key_len(key, plen, extack))
1721		return -EINVAL;
1722
1723	l = fib_find_node(t, &tp, key);
 
 
1724	if (!l)
1725		return -ESRCH;
1726
1727	dscp = cfg->fc_dscp;
1728	fa = fib_find_alias(&l->leaf, slen, dscp, 0, tb->tb_id, false);
 
 
 
 
 
 
1729	if (!fa)
1730		return -ESRCH;
1731
1732	pr_debug("Deleting %08x/%d dsfield=0x%02x t=%p\n", key, plen,
1733		 inet_dscp_to_dsfield(dscp), t);
1734
1735	fa_to_delete = NULL;
1736	hlist_for_each_entry_from(fa, fa_list) {
 
1737		struct fib_info *fi = fa->fa_info;
1738
1739		if ((fa->fa_slen != slen) ||
1740		    (fa->tb_id != tb->tb_id) ||
1741		    (fa->fa_dscp != dscp))
1742			break;
1743
1744		if ((!cfg->fc_type || fa->fa_type == cfg->fc_type) &&
1745		    (cfg->fc_scope == RT_SCOPE_NOWHERE ||
1746		     fa->fa_info->fib_scope == cfg->fc_scope) &&
1747		    (!cfg->fc_prefsrc ||
1748		     fi->fib_prefsrc == cfg->fc_prefsrc) &&
1749		    (!cfg->fc_protocol ||
1750		     fi->fib_protocol == cfg->fc_protocol) &&
1751		    fib_nh_match(net, cfg, fi, extack) == 0 &&
1752		    fib_metrics_match(cfg, fi)) {
1753			fa_to_delete = fa;
1754			break;
1755		}
1756	}
1757
1758	if (!fa_to_delete)
1759		return -ESRCH;
1760
1761	fib_notify_alias_delete(net, key, &l->leaf, fa_to_delete, extack);
1762	rtmsg_fib(RTM_DELROUTE, htonl(key), fa_to_delete, plen, tb->tb_id,
1763		  &cfg->fc_nlinfo, 0);
1764
 
 
1765	if (!plen)
1766		tb->tb_num_default--;
1767
1768	fib_remove_alias(t, tp, l, fa_to_delete);
 
 
 
1769
1770	if (fa_to_delete->fa_state & FA_S_ACCESSED)
 
 
 
1771		rt_cache_flush(cfg->fc_nlinfo.nl_net);
1772
1773	fib_release_info(fa_to_delete->fa_info);
1774	alias_free_mem_rcu(fa_to_delete);
1775	return 0;
1776}
1777
1778/* Scan for the next leaf starting at the provided key value */
1779static struct key_vector *leaf_walk_rcu(struct key_vector **tn, t_key key)
1780{
1781	struct key_vector *pn, *n = *tn;
1782	unsigned long cindex;
1783
1784	/* this loop is meant to try and find the key in the trie */
1785	do {
1786		/* record parent and next child index */
1787		pn = n;
1788		cindex = (key > pn->key) ? get_index(key, pn) : 0;
1789
1790		if (cindex >> pn->bits)
1791			break;
1792
1793		/* descend into the next child */
1794		n = get_child_rcu(pn, cindex++);
1795		if (!n)
1796			break;
1797
1798		/* guarantee forward progress on the keys */
1799		if (IS_LEAF(n) && (n->key >= key))
1800			goto found;
1801	} while (IS_TNODE(n));
1802
1803	/* this loop will search for the next leaf with a greater key */
1804	while (!IS_TRIE(pn)) {
1805		/* if we exhausted the parent node we will need to climb */
1806		if (cindex >= (1ul << pn->bits)) {
1807			t_key pkey = pn->key;
1808
1809			pn = node_parent_rcu(pn);
1810			cindex = get_index(pkey, pn) + 1;
1811			continue;
1812		}
1813
1814		/* grab the next available node */
1815		n = get_child_rcu(pn, cindex++);
1816		if (!n)
1817			continue;
1818
1819		/* no need to compare keys since we bumped the index */
1820		if (IS_LEAF(n))
1821			goto found;
1822
1823		/* Rescan start scanning in new node */
1824		pn = n;
1825		cindex = 0;
1826	}
1827
1828	*tn = pn;
1829	return NULL; /* Root of trie */
1830found:
1831	/* if we are at the limit for keys just return NULL for the tnode */
1832	*tn = pn;
1833	return n;
1834}
1835
1836static void fib_trie_free(struct fib_table *tb)
1837{
1838	struct trie *t = (struct trie *)tb->tb_data;
1839	struct key_vector *pn = t->kv;
1840	unsigned long cindex = 1;
1841	struct hlist_node *tmp;
1842	struct fib_alias *fa;
1843
1844	/* walk trie in reverse order and free everything */
1845	for (;;) {
1846		struct key_vector *n;
1847
1848		if (!(cindex--)) {
1849			t_key pkey = pn->key;
1850
1851			if (IS_TRIE(pn))
1852				break;
1853
1854			n = pn;
1855			pn = node_parent(pn);
1856
1857			/* drop emptied tnode */
1858			put_child_root(pn, n->key, NULL);
1859			node_free(n);
1860
1861			cindex = get_index(pkey, pn);
1862
1863			continue;
1864		}
1865
1866		/* grab the next available node */
1867		n = get_child(pn, cindex);
1868		if (!n)
1869			continue;
1870
1871		if (IS_TNODE(n)) {
1872			/* record pn and cindex for leaf walking */
1873			pn = n;
1874			cindex = 1ul << n->bits;
1875
1876			continue;
1877		}
1878
1879		hlist_for_each_entry_safe(fa, tmp, &n->leaf, fa_list) {
1880			hlist_del_rcu(&fa->fa_list);
1881			alias_free_mem_rcu(fa);
1882		}
1883
1884		put_child_root(pn, n->key, NULL);
1885		node_free(n);
1886	}
1887
1888#ifdef CONFIG_IP_FIB_TRIE_STATS
1889	free_percpu(t->stats);
1890#endif
1891	kfree(tb);
1892}
1893
1894struct fib_table *fib_trie_unmerge(struct fib_table *oldtb)
 
 
 
 
1895{
1896	struct trie *ot = (struct trie *)oldtb->tb_data;
1897	struct key_vector *l, *tp = ot->kv;
1898	struct fib_table *local_tb;
1899	struct fib_alias *fa;
1900	struct trie *lt;
1901	t_key key = 0;
1902
1903	if (oldtb->tb_data == oldtb->__data)
1904		return oldtb;
1905
1906	local_tb = fib_trie_table(RT_TABLE_LOCAL, NULL);
1907	if (!local_tb)
1908		return NULL;
1909
1910	lt = (struct trie *)local_tb->tb_data;
1911
1912	while ((l = leaf_walk_rcu(&tp, key)) != NULL) {
1913		struct key_vector *local_l = NULL, *local_tp;
1914
1915		hlist_for_each_entry(fa, &l->leaf, fa_list) {
1916			struct fib_alias *new_fa;
1917
1918			if (local_tb->tb_id != fa->tb_id)
1919				continue;
1920
1921			/* clone fa for new local table */
1922			new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL);
1923			if (!new_fa)
1924				goto out;
1925
1926			memcpy(new_fa, fa, sizeof(*fa));
1927
1928			/* insert clone into table */
1929			if (!local_l)
1930				local_l = fib_find_node(lt, &local_tp, l->key);
1931
1932			if (fib_insert_alias(lt, local_tp, local_l, new_fa,
1933					     NULL, l->key)) {
1934				kmem_cache_free(fn_alias_kmem, new_fa);
1935				goto out;
1936			}
1937		}
1938
1939		/* stop loop if key wrapped back to 0 */
1940		key = l->key + 1;
1941		if (key < l->key)
1942			break;
1943	}
1944
1945	return local_tb;
1946out:
1947	fib_trie_free(local_tb);
1948
1949	return NULL;
1950}
1951
1952/* Caller must hold RTNL */
1953void fib_table_flush_external(struct fib_table *tb)
1954{
1955	struct trie *t = (struct trie *)tb->tb_data;
1956	struct key_vector *pn = t->kv;
1957	unsigned long cindex = 1;
1958	struct hlist_node *tmp;
1959	struct fib_alias *fa;
1960
1961	/* walk trie in reverse order */
1962	for (;;) {
1963		unsigned char slen = 0;
1964		struct key_vector *n;
1965
1966		if (!(cindex--)) {
1967			t_key pkey = pn->key;
1968
1969			/* cannot resize the trie vector */
1970			if (IS_TRIE(pn))
1971				break;
1972
1973			/* update the suffix to address pulled leaves */
1974			if (pn->slen > pn->pos)
1975				update_suffix(pn);
1976
1977			/* resize completed node */
1978			pn = resize(t, pn);
1979			cindex = get_index(pkey, pn);
1980
1981			continue;
1982		}
1983
1984		/* grab the next available node */
1985		n = get_child(pn, cindex);
1986		if (!n)
1987			continue;
1988
1989		if (IS_TNODE(n)) {
1990			/* record pn and cindex for leaf walking */
1991			pn = n;
1992			cindex = 1ul << n->bits;
1993
1994			continue;
1995		}
1996
1997		hlist_for_each_entry_safe(fa, tmp, &n->leaf, fa_list) {
1998			/* if alias was cloned to local then we just
1999			 * need to remove the local copy from main
2000			 */
2001			if (tb->tb_id != fa->tb_id) {
2002				hlist_del_rcu(&fa->fa_list);
2003				alias_free_mem_rcu(fa);
2004				continue;
2005			}
2006
2007			/* record local slen */
2008			slen = fa->fa_slen;
2009		}
2010
2011		/* update leaf slen */
2012		n->slen = slen;
2013
2014		if (hlist_empty(&n->leaf)) {
2015			put_child_root(pn, n->key, NULL);
2016			node_free(n);
2017		}
2018	}
2019}
2020
2021/* Caller must hold RTNL. */
2022int fib_table_flush(struct net *net, struct fib_table *tb, bool flush_all)
2023{
2024	struct trie *t = (struct trie *)tb->tb_data;
2025	struct nl_info info = { .nl_net = net };
2026	struct key_vector *pn = t->kv;
2027	unsigned long cindex = 1;
2028	struct hlist_node *tmp;
2029	struct fib_alias *fa;
2030	int found = 0;
2031
2032	/* walk trie in reverse order */
2033	for (;;) {
2034		unsigned char slen = 0;
2035		struct key_vector *n;
2036
2037		if (!(cindex--)) {
2038			t_key pkey = pn->key;
2039
2040			/* cannot resize the trie vector */
2041			if (IS_TRIE(pn))
2042				break;
2043
2044			/* update the suffix to address pulled leaves */
2045			if (pn->slen > pn->pos)
2046				update_suffix(pn);
2047
2048			/* resize completed node */
2049			pn = resize(t, pn);
2050			cindex = get_index(pkey, pn);
2051
2052			continue;
2053		}
2054
2055		/* grab the next available node */
2056		n = get_child(pn, cindex);
2057		if (!n)
2058			continue;
2059
2060		if (IS_TNODE(n)) {
2061			/* record pn and cindex for leaf walking */
2062			pn = n;
2063			cindex = 1ul << n->bits;
2064
2065			continue;
2066		}
2067
2068		hlist_for_each_entry_safe(fa, tmp, &n->leaf, fa_list) {
2069			struct fib_info *fi = fa->fa_info;
2070
2071			if (!fi || tb->tb_id != fa->tb_id ||
2072			    (!(fi->fib_flags & RTNH_F_DEAD) &&
2073			     !fib_props[fa->fa_type].error)) {
2074				slen = fa->fa_slen;
2075				continue;
2076			}
2077
2078			/* Do not flush error routes if network namespace is
2079			 * not being dismantled
2080			 */
2081			if (!flush_all && fib_props[fa->fa_type].error) {
2082				slen = fa->fa_slen;
2083				continue;
2084			}
2085
2086			fib_notify_alias_delete(net, n->key, &n->leaf, fa,
2087						NULL);
2088			if (fi->pfsrc_removed)
2089				rtmsg_fib(RTM_DELROUTE, htonl(n->key), fa,
2090					  KEYLENGTH - fa->fa_slen, tb->tb_id, &info, 0);
2091			hlist_del_rcu(&fa->fa_list);
2092			fib_release_info(fa->fa_info);
2093			alias_free_mem_rcu(fa);
2094			found++;
2095		}
2096
2097		/* update leaf slen */
2098		n->slen = slen;
2099
2100		if (hlist_empty(&n->leaf)) {
2101			put_child_root(pn, n->key, NULL);
2102			node_free(n);
2103		}
2104	}
2105
2106	pr_debug("trie_flush found=%d\n", found);
2107	return found;
2108}
2109
2110/* derived from fib_trie_free */
2111static void __fib_info_notify_update(struct net *net, struct fib_table *tb,
2112				     struct nl_info *info)
2113{
2114	struct trie *t = (struct trie *)tb->tb_data;
2115	struct key_vector *pn = t->kv;
2116	unsigned long cindex = 1;
2117	struct fib_alias *fa;
2118
2119	for (;;) {
2120		struct key_vector *n;
2121
2122		if (!(cindex--)) {
2123			t_key pkey = pn->key;
2124
2125			if (IS_TRIE(pn))
2126				break;
2127
2128			pn = node_parent(pn);
2129			cindex = get_index(pkey, pn);
2130			continue;
2131		}
2132
2133		/* grab the next available node */
2134		n = get_child(pn, cindex);
2135		if (!n)
2136			continue;
2137
2138		if (IS_TNODE(n)) {
2139			/* record pn and cindex for leaf walking */
2140			pn = n;
2141			cindex = 1ul << n->bits;
2142
2143			continue;
2144		}
2145
2146		hlist_for_each_entry(fa, &n->leaf, fa_list) {
2147			struct fib_info *fi = fa->fa_info;
2148
2149			if (!fi || !fi->nh_updated || fa->tb_id != tb->tb_id)
2150				continue;
2151
2152			rtmsg_fib(RTM_NEWROUTE, htonl(n->key), fa,
2153				  KEYLENGTH - fa->fa_slen, tb->tb_id,
2154				  info, NLM_F_REPLACE);
2155		}
2156	}
2157}
2158
2159void fib_info_notify_update(struct net *net, struct nl_info *info)
2160{
2161	unsigned int h;
2162
2163	for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
2164		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2165		struct fib_table *tb;
2166
2167		hlist_for_each_entry_rcu(tb, head, tb_hlist,
2168					 lockdep_rtnl_is_held())
2169			__fib_info_notify_update(net, tb, info);
2170	}
2171}
2172
2173static int fib_leaf_notify(struct key_vector *l, struct fib_table *tb,
2174			   struct notifier_block *nb,
2175			   struct netlink_ext_ack *extack)
2176{
 
2177	struct fib_alias *fa;
2178	int last_slen = -1;
2179	int err;
2180
2181	hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
2182		struct fib_info *fi = fa->fa_info;
2183
2184		if (!fi)
2185			continue;
2186
2187		/* local and main table can share the same trie,
2188		 * so don't notify twice for the same entry.
2189		 */
2190		if (tb->tb_id != fa->tb_id)
2191			continue;
 
2192
2193		if (fa->fa_slen == last_slen)
2194			continue;
2195
2196		last_slen = fa->fa_slen;
2197		err = call_fib_entry_notifier(nb, FIB_EVENT_ENTRY_REPLACE,
2198					      l->key, KEYLENGTH - fa->fa_slen,
2199					      fa, extack);
2200		if (err)
2201			return err;
2202	}
2203	return 0;
2204}
2205
2206static int fib_table_notify(struct fib_table *tb, struct notifier_block *nb,
2207			    struct netlink_ext_ack *extack)
2208{
2209	struct trie *t = (struct trie *)tb->tb_data;
2210	struct key_vector *l, *tp = t->kv;
2211	t_key key = 0;
2212	int err;
2213
2214	while ((l = leaf_walk_rcu(&tp, key)) != NULL) {
2215		err = fib_leaf_notify(l, tb, nb, extack);
2216		if (err)
2217			return err;
2218
2219		key = l->key + 1;
2220		/* stop in case of wrap around */
2221		if (key < l->key)
2222			break;
2223	}
2224	return 0;
2225}
2226
2227int fib_notify(struct net *net, struct notifier_block *nb,
2228	       struct netlink_ext_ack *extack)
2229{
2230	unsigned int h;
2231	int err;
2232
2233	for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
2234		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2235		struct fib_table *tb;
2236
2237		hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2238			err = fib_table_notify(tb, nb, extack);
2239			if (err)
2240				return err;
2241		}
 
2242	}
2243	return 0;
 
2244}
2245
2246static void __trie_free_rcu(struct rcu_head *head)
 
2247{
2248	struct fib_table *tb = container_of(head, struct fib_table, rcu);
2249#ifdef CONFIG_IP_FIB_TRIE_STATS
2250	struct trie *t = (struct trie *)tb->tb_data;
2251
2252	if (tb->tb_data == tb->__data)
2253		free_percpu(t->stats);
2254#endif /* CONFIG_IP_FIB_TRIE_STATS */
2255	kfree(tb);
2256}
2257
2258void fib_free_table(struct fib_table *tb)
2259{
2260	call_rcu(&tb->rcu, __trie_free_rcu);
2261}
2262
2263static int fn_trie_dump_leaf(struct key_vector *l, struct fib_table *tb,
2264			     struct sk_buff *skb, struct netlink_callback *cb,
2265			     struct fib_dump_filter *filter)
2266{
2267	unsigned int flags = NLM_F_MULTI;
2268	__be32 xkey = htonl(l->key);
2269	int i, s_i, i_fa, s_fa, err;
2270	struct fib_alias *fa;
2271
2272	if (filter->filter_set ||
2273	    !filter->dump_exceptions || !filter->dump_routes)
2274		flags |= NLM_F_DUMP_FILTERED;
2275
2276	s_i = cb->args[4];
2277	s_fa = cb->args[5];
2278	i = 0;
2279
2280	/* rcu_read_lock is hold by caller */
2281	hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
2282		struct fib_info *fi = fa->fa_info;
 
 
 
2283
2284		if (i < s_i)
2285			goto next;
2286
2287		i_fa = 0;
2288
2289		if (tb->tb_id != fa->tb_id)
2290			goto next;
2291
2292		if (filter->filter_set) {
2293			if (filter->rt_type && fa->fa_type != filter->rt_type)
2294				goto next;
2295
2296			if ((filter->protocol &&
2297			     fi->fib_protocol != filter->protocol))
2298				goto next;
2299
2300			if (filter->dev &&
2301			    !fib_info_nh_uses_dev(fi, filter->dev))
2302				goto next;
2303		}
2304
2305		if (filter->dump_routes) {
2306			if (!s_fa) {
2307				struct fib_rt_info fri;
2308
2309				fri.fi = fi;
2310				fri.tb_id = tb->tb_id;
2311				fri.dst = xkey;
2312				fri.dst_len = KEYLENGTH - fa->fa_slen;
2313				fri.dscp = fa->fa_dscp;
2314				fri.type = fa->fa_type;
2315				fri.offload = READ_ONCE(fa->offload);
2316				fri.trap = READ_ONCE(fa->trap);
2317				fri.offload_failed = READ_ONCE(fa->offload_failed);
2318				err = fib_dump_info(skb,
2319						    NETLINK_CB(cb->skb).portid,
2320						    cb->nlh->nlmsg_seq,
2321						    RTM_NEWROUTE, &fri, flags);
2322				if (err < 0)
2323					goto stop;
2324			}
2325
2326			i_fa++;
 
 
2327		}
2328
2329		if (filter->dump_exceptions) {
2330			err = fib_dump_info_fnhe(skb, cb, tb->tb_id, fi,
2331						 &i_fa, s_fa, flags);
2332			if (err < 0)
2333				goto stop;
2334		}
2335
2336next:
2337		i++;
2338	}
2339
2340	cb->args[4] = i;
2341	return skb->len;
2342
2343stop:
2344	cb->args[4] = i;
2345	cb->args[5] = i_fa;
2346	return err;
2347}
2348
2349/* rcu_read_lock needs to be hold by caller from readside */
2350int fib_table_dump(struct fib_table *tb, struct sk_buff *skb,
2351		   struct netlink_callback *cb, struct fib_dump_filter *filter)
2352{
2353	struct trie *t = (struct trie *)tb->tb_data;
2354	struct key_vector *l, *tp = t->kv;
 
 
 
 
2355	/* Dump starting at last key.
2356	 * Note: 0.0.0.0/0 (ie default) is first key.
2357	 */
2358	int count = cb->args[2];
2359	t_key key = cb->args[3];
 
 
 
 
 
 
 
 
2360
2361	/* First time here, count and key are both always 0. Count > 0
2362	 * and key == 0 means the dump has wrapped around and we are done.
2363	 */
2364	if (count && !key)
2365		return 0;
2366
2367	while ((l = leaf_walk_rcu(&tp, key)) != NULL) {
2368		int err;
2369
2370		err = fn_trie_dump_leaf(l, tb, skb, cb, filter);
2371		if (err < 0) {
2372			cb->args[3] = key;
2373			cb->args[2] = count;
2374			return err;
2375		}
2376
2377		++count;
2378		key = l->key + 1;
2379
2380		memset(&cb->args[4], 0,
2381		       sizeof(cb->args) - 4*sizeof(cb->args[0]));
2382
2383		/* stop loop if key wrapped back to 0 */
2384		if (key < l->key)
2385			break;
2386	}
 
 
2387
2388	cb->args[3] = key;
2389	cb->args[2] = count;
2390
2391	return 0;
2392}
2393
2394void __init fib_trie_init(void)
2395{
2396	fn_alias_kmem = kmem_cache_create("ip_fib_alias",
2397					  sizeof(struct fib_alias),
2398					  0, SLAB_PANIC | SLAB_ACCOUNT, NULL);
2399
2400	trie_leaf_kmem = kmem_cache_create("ip_fib_trie",
2401					   LEAF_SIZE,
2402					   0, SLAB_PANIC | SLAB_ACCOUNT, NULL);
 
2403}
2404
2405struct fib_table *fib_trie_table(u32 id, struct fib_table *alias)
 
2406{
2407	struct fib_table *tb;
2408	struct trie *t;
2409	size_t sz = sizeof(*tb);
2410
2411	if (!alias)
2412		sz += sizeof(struct trie);
2413
2414	tb = kzalloc(sz, GFP_KERNEL);
2415	if (!tb)
2416		return NULL;
2417
2418	tb->tb_id = id;
 
2419	tb->tb_num_default = 0;
2420	tb->tb_data = (alias ? alias->__data : tb->__data);
2421
2422	if (alias)
2423		return tb;
2424
2425	t = (struct trie *) tb->tb_data;
2426	t->kv[0].pos = KEYLENGTH;
2427	t->kv[0].slen = KEYLENGTH;
2428#ifdef CONFIG_IP_FIB_TRIE_STATS
2429	t->stats = alloc_percpu(struct trie_use_stats);
2430	if (!t->stats) {
2431		kfree(tb);
2432		tb = NULL;
2433	}
2434#endif
2435
2436	return tb;
2437}
2438
2439#ifdef CONFIG_PROC_FS
2440/* Depth first Trie walk iterator */
2441struct fib_trie_iter {
2442	struct seq_net_private p;
2443	struct fib_table *tb;
2444	struct key_vector *tnode;
2445	unsigned int index;
2446	unsigned int depth;
2447};
2448
2449static struct key_vector *fib_trie_get_next(struct fib_trie_iter *iter)
2450{
2451	unsigned long cindex = iter->index;
2452	struct key_vector *pn = iter->tnode;
2453	t_key pkey;
 
 
 
 
2454
2455	pr_debug("get_next iter={node=%p index=%d depth=%d}\n",
2456		 iter->tnode, iter->index, iter->depth);
 
 
 
2457
2458	while (!IS_TRIE(pn)) {
2459		while (cindex < child_length(pn)) {
2460			struct key_vector *n = get_child_rcu(pn, cindex++);
2461
2462			if (!n)
2463				continue;
2464
2465			if (IS_LEAF(n)) {
2466				iter->tnode = pn;
2467				iter->index = cindex;
2468			} else {
2469				/* push down one level */
2470				iter->tnode = n;
2471				iter->index = 0;
2472				++iter->depth;
2473			}
2474
2475			return n;
2476		}
2477
2478		/* Current node exhausted, pop back up */
2479		pkey = pn->key;
2480		pn = node_parent_rcu(pn);
2481		cindex = get_index(pkey, pn) + 1;
 
 
 
 
2482		--iter->depth;
 
2483	}
2484
2485	/* record root node so further searches know we are done */
2486	iter->tnode = pn;
2487	iter->index = 0;
2488
2489	return NULL;
2490}
2491
2492static struct key_vector *fib_trie_get_first(struct fib_trie_iter *iter,
2493					     struct trie *t)
2494{
2495	struct key_vector *n, *pn;
2496
2497	if (!t)
2498		return NULL;
2499
2500	pn = t->kv;
2501	n = rcu_dereference(pn->tnode[0]);
2502	if (!n)
2503		return NULL;
2504
2505	if (IS_TNODE(n)) {
2506		iter->tnode = n;
2507		iter->index = 0;
2508		iter->depth = 1;
2509	} else {
2510		iter->tnode = pn;
2511		iter->index = 0;
2512		iter->depth = 0;
2513	}
2514
2515	return n;
2516}
2517
2518static void trie_collect_stats(struct trie *t, struct trie_stat *s)
2519{
2520	struct key_vector *n;
2521	struct fib_trie_iter iter;
2522
2523	memset(s, 0, sizeof(*s));
2524
2525	rcu_read_lock();
2526	for (n = fib_trie_get_first(&iter, t); n; n = fib_trie_get_next(&iter)) {
2527		if (IS_LEAF(n)) {
2528			struct fib_alias *fa;
 
2529
2530			s->leaves++;
2531			s->totdepth += iter.depth;
2532			if (iter.depth > s->maxdepth)
2533				s->maxdepth = iter.depth;
2534
2535			hlist_for_each_entry_rcu(fa, &n->leaf, fa_list)
2536				++s->prefixes;
2537		} else {
 
 
 
2538			s->tnodes++;
2539			if (n->bits < MAX_STAT_DEPTH)
2540				s->nodesizes[n->bits]++;
2541			s->nullpointers += tn_info(n)->empty_children;
 
 
 
2542		}
2543	}
2544	rcu_read_unlock();
2545}
2546
2547/*
2548 *	This outputs /proc/net/fib_triestats
2549 */
2550static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat)
2551{
2552	unsigned int i, max, pointers, bytes, avdepth;
2553
2554	if (stat->leaves)
2555		avdepth = stat->totdepth*100 / stat->leaves;
2556	else
2557		avdepth = 0;
2558
2559	seq_printf(seq, "\tAver depth:     %u.%02d\n",
2560		   avdepth / 100, avdepth % 100);
2561	seq_printf(seq, "\tMax depth:      %u\n", stat->maxdepth);
2562
2563	seq_printf(seq, "\tLeaves:         %u\n", stat->leaves);
2564	bytes = LEAF_SIZE * stat->leaves;
2565
2566	seq_printf(seq, "\tPrefixes:       %u\n", stat->prefixes);
2567	bytes += sizeof(struct fib_alias) * stat->prefixes;
2568
2569	seq_printf(seq, "\tInternal nodes: %u\n\t", stat->tnodes);
2570	bytes += TNODE_SIZE(0) * stat->tnodes;
2571
2572	max = MAX_STAT_DEPTH;
2573	while (max > 0 && stat->nodesizes[max-1] == 0)
2574		max--;
2575
2576	pointers = 0;
2577	for (i = 1; i < max; i++)
2578		if (stat->nodesizes[i] != 0) {
2579			seq_printf(seq, "  %u: %u",  i, stat->nodesizes[i]);
2580			pointers += (1<<i) * stat->nodesizes[i];
2581		}
2582	seq_putc(seq, '\n');
2583	seq_printf(seq, "\tPointers: %u\n", pointers);
2584
2585	bytes += sizeof(struct key_vector *) * pointers;
2586	seq_printf(seq, "Null ptrs: %u\n", stat->nullpointers);
2587	seq_printf(seq, "Total size: %u  kB\n", (bytes + 1023) / 1024);
2588}
2589
2590#ifdef CONFIG_IP_FIB_TRIE_STATS
2591static void trie_show_usage(struct seq_file *seq,
2592			    const struct trie_use_stats __percpu *stats)
2593{
2594	struct trie_use_stats s = { 0 };
2595	int cpu;
2596
2597	/* loop through all of the CPUs and gather up the stats */
2598	for_each_possible_cpu(cpu) {
2599		const struct trie_use_stats *pcpu = per_cpu_ptr(stats, cpu);
2600
2601		s.gets += pcpu->gets;
2602		s.backtrack += pcpu->backtrack;
2603		s.semantic_match_passed += pcpu->semantic_match_passed;
2604		s.semantic_match_miss += pcpu->semantic_match_miss;
2605		s.null_node_hit += pcpu->null_node_hit;
2606		s.resize_node_skipped += pcpu->resize_node_skipped;
2607	}
2608
2609	seq_printf(seq, "\nCounters:\n---------\n");
2610	seq_printf(seq, "gets = %u\n", s.gets);
2611	seq_printf(seq, "backtracks = %u\n", s.backtrack);
2612	seq_printf(seq, "semantic match passed = %u\n",
2613		   s.semantic_match_passed);
2614	seq_printf(seq, "semantic match miss = %u\n", s.semantic_match_miss);
2615	seq_printf(seq, "null node hit= %u\n", s.null_node_hit);
2616	seq_printf(seq, "skipped node resize = %u\n\n", s.resize_node_skipped);
 
 
2617}
2618#endif /*  CONFIG_IP_FIB_TRIE_STATS */
2619
2620static void fib_table_print(struct seq_file *seq, struct fib_table *tb)
2621{
2622	if (tb->tb_id == RT_TABLE_LOCAL)
2623		seq_puts(seq, "Local:\n");
2624	else if (tb->tb_id == RT_TABLE_MAIN)
2625		seq_puts(seq, "Main:\n");
2626	else
2627		seq_printf(seq, "Id %d:\n", tb->tb_id);
2628}
2629
2630
2631static int fib_triestat_seq_show(struct seq_file *seq, void *v)
2632{
2633	struct net *net = seq->private;
2634	unsigned int h;
2635
2636	seq_printf(seq,
2637		   "Basic info: size of leaf:"
2638		   " %zd bytes, size of tnode: %zd bytes.\n",
2639		   LEAF_SIZE, TNODE_SIZE(0));
2640
2641	rcu_read_lock();
2642	for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
2643		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2644		struct fib_table *tb;
2645
2646		hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2647			struct trie *t = (struct trie *) tb->tb_data;
2648			struct trie_stat stat;
2649
2650			if (!t)
2651				continue;
2652
2653			fib_table_print(seq, tb);
2654
2655			trie_collect_stats(t, &stat);
2656			trie_show_stats(seq, &stat);
2657#ifdef CONFIG_IP_FIB_TRIE_STATS
2658			trie_show_usage(seq, t->stats);
2659#endif
2660		}
2661		cond_resched_rcu();
2662	}
2663	rcu_read_unlock();
2664
2665	return 0;
2666}
2667
2668static struct key_vector *fib_trie_get_idx(struct seq_file *seq, loff_t pos)
 
 
 
 
 
 
 
 
 
 
 
 
 
2669{
2670	struct fib_trie_iter *iter = seq->private;
2671	struct net *net = seq_file_net(seq);
2672	loff_t idx = 0;
2673	unsigned int h;
2674
2675	for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
2676		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2677		struct fib_table *tb;
2678
2679		hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2680			struct key_vector *n;
2681
2682			for (n = fib_trie_get_first(iter,
2683						    (struct trie *) tb->tb_data);
2684			     n; n = fib_trie_get_next(iter))
2685				if (pos == idx++) {
2686					iter->tb = tb;
2687					return n;
2688				}
2689		}
2690	}
2691
2692	return NULL;
2693}
2694
2695static void *fib_trie_seq_start(struct seq_file *seq, loff_t *pos)
2696	__acquires(RCU)
2697{
2698	rcu_read_lock();
2699	return fib_trie_get_idx(seq, *pos);
2700}
2701
2702static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2703{
2704	struct fib_trie_iter *iter = seq->private;
2705	struct net *net = seq_file_net(seq);
2706	struct fib_table *tb = iter->tb;
2707	struct hlist_node *tb_node;
2708	unsigned int h;
2709	struct key_vector *n;
2710
2711	++*pos;
2712	/* next node in same table */
2713	n = fib_trie_get_next(iter);
2714	if (n)
2715		return n;
2716
2717	/* walk rest of this hash chain */
2718	h = tb->tb_id & (FIB_TABLE_HASHSZ - 1);
2719	while ((tb_node = rcu_dereference(hlist_next_rcu(&tb->tb_hlist)))) {
2720		tb = hlist_entry(tb_node, struct fib_table, tb_hlist);
2721		n = fib_trie_get_first(iter, (struct trie *) tb->tb_data);
2722		if (n)
2723			goto found;
2724	}
2725
2726	/* new hash chain */
2727	while (++h < FIB_TABLE_HASHSZ) {
2728		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2729		hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2730			n = fib_trie_get_first(iter, (struct trie *) tb->tb_data);
2731			if (n)
2732				goto found;
2733		}
2734	}
2735	return NULL;
2736
2737found:
2738	iter->tb = tb;
2739	return n;
2740}
2741
2742static void fib_trie_seq_stop(struct seq_file *seq, void *v)
2743	__releases(RCU)
2744{
2745	rcu_read_unlock();
2746}
2747
2748static void seq_indent(struct seq_file *seq, int n)
2749{
2750	while (n-- > 0)
2751		seq_puts(seq, "   ");
2752}
2753
2754static inline const char *rtn_scope(char *buf, size_t len, enum rt_scope_t s)
2755{
2756	switch (s) {
2757	case RT_SCOPE_UNIVERSE: return "universe";
2758	case RT_SCOPE_SITE:	return "site";
2759	case RT_SCOPE_LINK:	return "link";
2760	case RT_SCOPE_HOST:	return "host";
2761	case RT_SCOPE_NOWHERE:	return "nowhere";
2762	default:
2763		snprintf(buf, len, "scope=%d", s);
2764		return buf;
2765	}
2766}
2767
2768static const char *const rtn_type_names[__RTN_MAX] = {
2769	[RTN_UNSPEC] = "UNSPEC",
2770	[RTN_UNICAST] = "UNICAST",
2771	[RTN_LOCAL] = "LOCAL",
2772	[RTN_BROADCAST] = "BROADCAST",
2773	[RTN_ANYCAST] = "ANYCAST",
2774	[RTN_MULTICAST] = "MULTICAST",
2775	[RTN_BLACKHOLE] = "BLACKHOLE",
2776	[RTN_UNREACHABLE] = "UNREACHABLE",
2777	[RTN_PROHIBIT] = "PROHIBIT",
2778	[RTN_THROW] = "THROW",
2779	[RTN_NAT] = "NAT",
2780	[RTN_XRESOLVE] = "XRESOLVE",
2781};
2782
2783static inline const char *rtn_type(char *buf, size_t len, unsigned int t)
2784{
2785	if (t < __RTN_MAX && rtn_type_names[t])
2786		return rtn_type_names[t];
2787	snprintf(buf, len, "type %u", t);
2788	return buf;
2789}
2790
2791/* Pretty print the trie */
2792static int fib_trie_seq_show(struct seq_file *seq, void *v)
2793{
2794	const struct fib_trie_iter *iter = seq->private;
2795	struct key_vector *n = v;
2796
2797	if (IS_TRIE(node_parent_rcu(n)))
2798		fib_table_print(seq, iter->tb);
2799
2800	if (IS_TNODE(n)) {
2801		__be32 prf = htonl(n->key);
 
2802
2803		seq_indent(seq, iter->depth-1);
2804		seq_printf(seq, "  +-- %pI4/%zu %u %u %u\n",
2805			   &prf, KEYLENGTH - n->pos - n->bits, n->bits,
2806			   tn_info(n)->full_children,
2807			   tn_info(n)->empty_children);
2808	} else {
2809		__be32 val = htonl(n->key);
2810		struct fib_alias *fa;
 
2811
2812		seq_indent(seq, iter->depth);
2813		seq_printf(seq, "  |-- %pI4\n", &val);
2814
2815		hlist_for_each_entry_rcu(fa, &n->leaf, fa_list) {
2816			char buf1[32], buf2[32];
 
 
 
2817
2818			seq_indent(seq, iter->depth + 1);
2819			seq_printf(seq, "  /%zu %s %s",
2820				   KEYLENGTH - fa->fa_slen,
2821				   rtn_scope(buf1, sizeof(buf1),
2822					     fa->fa_info->fib_scope),
2823				   rtn_type(buf2, sizeof(buf2),
2824					    fa->fa_type));
2825			if (fa->fa_dscp)
2826				seq_printf(seq, " tos=%d",
2827					   inet_dscp_to_dsfield(fa->fa_dscp));
2828			seq_putc(seq, '\n');
2829		}
2830	}
2831
2832	return 0;
2833}
2834
2835static const struct seq_operations fib_trie_seq_ops = {
2836	.start  = fib_trie_seq_start,
2837	.next   = fib_trie_seq_next,
2838	.stop   = fib_trie_seq_stop,
2839	.show   = fib_trie_seq_show,
2840};
2841
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2842struct fib_route_iter {
2843	struct seq_net_private p;
2844	struct fib_table *main_tb;
2845	struct key_vector *tnode;
2846	loff_t	pos;
2847	t_key	key;
2848};
2849
2850static struct key_vector *fib_route_get_idx(struct fib_route_iter *iter,
2851					    loff_t pos)
2852{
2853	struct key_vector *l, **tp = &iter->tnode;
2854	t_key key;
2855
2856	/* use cached location of previously found key */
2857	if (iter->pos > 0 && pos >= iter->pos) {
2858		key = iter->key;
2859	} else {
2860		iter->pos = 1;
2861		key = 0;
2862	}
2863
2864	pos -= iter->pos;
2865
2866	while ((l = leaf_walk_rcu(tp, key)) && (pos-- > 0)) {
2867		key = l->key + 1;
2868		iter->pos++;
2869		l = NULL;
2870
2871		/* handle unlikely case of a key wrap */
2872		if (!key)
2873			break;
2874	}
2875
2876	if (l)
2877		iter->key = l->key;	/* remember it */
2878	else
2879		iter->pos = 0;		/* forget it */
2880
2881	return l;
2882}
2883
2884static void *fib_route_seq_start(struct seq_file *seq, loff_t *pos)
2885	__acquires(RCU)
2886{
2887	struct fib_route_iter *iter = seq->private;
2888	struct fib_table *tb;
2889	struct trie *t;
2890
2891	rcu_read_lock();
2892
2893	tb = fib_get_table(seq_file_net(seq), RT_TABLE_MAIN);
2894	if (!tb)
2895		return NULL;
2896
2897	iter->main_tb = tb;
2898	t = (struct trie *)tb->tb_data;
2899	iter->tnode = t->kv;
2900
2901	if (*pos != 0)
2902		return fib_route_get_idx(iter, *pos);
2903
2904	iter->pos = 0;
2905	iter->key = KEY_MAX;
2906
2907	return SEQ_START_TOKEN;
2908}
2909
2910static void *fib_route_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2911{
2912	struct fib_route_iter *iter = seq->private;
2913	struct key_vector *l = NULL;
2914	t_key key = iter->key + 1;
2915
2916	++*pos;
 
 
 
 
 
 
 
2917
2918	/* only allow key of 0 for start of sequence */
2919	if ((v == SEQ_START_TOKEN) || key)
2920		l = leaf_walk_rcu(&iter->tnode, key);
2921
2922	if (l) {
2923		iter->key = l->key;
2924		iter->pos++;
2925	} else {
2926		iter->pos = 0;
2927	}
2928
2929	return l;
2930}
2931
2932static void fib_route_seq_stop(struct seq_file *seq, void *v)
2933	__releases(RCU)
2934{
2935	rcu_read_unlock();
2936}
2937
2938static unsigned int fib_flag_trans(int type, __be32 mask, struct fib_info *fi)
2939{
2940	unsigned int flags = 0;
2941
2942	if (type == RTN_UNREACHABLE || type == RTN_PROHIBIT)
2943		flags = RTF_REJECT;
2944	if (fi) {
2945		const struct fib_nh_common *nhc = fib_info_nhc(fi, 0);
2946
2947		if (nhc->nhc_gw.ipv4)
2948			flags |= RTF_GATEWAY;
2949	}
2950	if (mask == htonl(0xFFFFFFFF))
2951		flags |= RTF_HOST;
2952	flags |= RTF_UP;
2953	return flags;
2954}
2955
2956/*
2957 *	This outputs /proc/net/route.
2958 *	The format of the file is not supposed to be changed
2959 *	and needs to be same as fib_hash output to avoid breaking
2960 *	legacy utilities
2961 */
2962static int fib_route_seq_show(struct seq_file *seq, void *v)
2963{
2964	struct fib_route_iter *iter = seq->private;
2965	struct fib_table *tb = iter->main_tb;
2966	struct fib_alias *fa;
2967	struct key_vector *l = v;
2968	__be32 prefix;
2969
2970	if (v == SEQ_START_TOKEN) {
2971		seq_printf(seq, "%-127s\n", "Iface\tDestination\tGateway "
2972			   "\tFlags\tRefCnt\tUse\tMetric\tMask\t\tMTU"
2973			   "\tWindow\tIRTT");
2974		return 0;
2975	}
2976
2977	prefix = htonl(l->key);
 
 
 
 
 
2978
2979	hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
2980		struct fib_info *fi = fa->fa_info;
2981		__be32 mask = inet_make_mask(KEYLENGTH - fa->fa_slen);
2982		unsigned int flags = fib_flag_trans(fa->fa_type, mask, fi);
2983
2984		if ((fa->fa_type == RTN_BROADCAST) ||
2985		    (fa->fa_type == RTN_MULTICAST))
2986			continue;
2987
2988		if (fa->tb_id != tb->tb_id)
2989			continue;
2990
2991		seq_setwidth(seq, 127);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2992
2993		if (fi) {
2994			struct fib_nh_common *nhc = fib_info_nhc(fi, 0);
2995			__be32 gw = 0;
2996
2997			if (nhc->nhc_gw_family == AF_INET)
2998				gw = nhc->nhc_gw.ipv4;
2999
3000			seq_printf(seq,
3001				   "%s\t%08X\t%08X\t%04X\t%d\t%u\t"
3002				   "%d\t%08X\t%d\t%u\t%u",
3003				   nhc->nhc_dev ? nhc->nhc_dev->name : "*",
3004				   prefix, gw, flags, 0, 0,
3005				   fi->fib_priority,
3006				   mask,
3007				   (fi->fib_advmss ?
3008				    fi->fib_advmss + 40 : 0),
3009				   fi->fib_window,
3010				   fi->fib_rtt >> 3);
3011		} else {
3012			seq_printf(seq,
3013				   "*\t%08X\t%08X\t%04X\t%d\t%u\t"
3014				   "%d\t%08X\t%d\t%u\t%u",
3015				   prefix, 0, flags, 0, 0, 0,
3016				   mask, 0, 0, 0);
3017		}
3018		seq_pad(seq, '\n');
3019	}
3020
3021	return 0;
3022}
3023
3024static const struct seq_operations fib_route_seq_ops = {
3025	.start  = fib_route_seq_start,
3026	.next   = fib_route_seq_next,
3027	.stop   = fib_route_seq_stop,
3028	.show   = fib_route_seq_show,
3029};
3030
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3031int __net_init fib_proc_init(struct net *net)
3032{
3033	if (!proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops,
3034			sizeof(struct fib_trie_iter)))
3035		goto out1;
3036
3037	if (!proc_create_net_single("fib_triestat", 0444, net->proc_net,
3038			fib_triestat_seq_show, NULL))
3039		goto out2;
3040
3041	if (!proc_create_net("route", 0444, net->proc_net, &fib_route_seq_ops,
3042			sizeof(struct fib_route_iter)))
3043		goto out3;
3044
3045	return 0;
3046
3047out3:
3048	remove_proc_entry("fib_triestat", net->proc_net);
3049out2:
3050	remove_proc_entry("fib_trie", net->proc_net);
3051out1:
3052	return -ENOMEM;
3053}
3054
3055void __net_exit fib_proc_exit(struct net *net)
3056{
3057	remove_proc_entry("fib_trie", net->proc_net);
3058	remove_proc_entry("fib_triestat", net->proc_net);
3059	remove_proc_entry("route", net->proc_net);
3060}
3061
3062#endif /* CONFIG_PROC_FS */