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 */
v3.5.6
   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/prefetch.h>
  75#include <linux/export.h>
  76#include <net/net_namespace.h>
  77#include <net/ip.h>
  78#include <net/protocol.h>
  79#include <net/route.h>
  80#include <net/tcp.h>
  81#include <net/sock.h>
  82#include <net/ip_fib.h>
  83#include "fib_lookup.h"
  84
  85#define MAX_STAT_DEPTH 32
  86
  87#define KEYLENGTH (8*sizeof(t_key))
  88
  89typedef unsigned int t_key;
  90
  91#define T_TNODE 0
  92#define T_LEAF  1
  93#define NODE_TYPE_MASK	0x1UL
  94#define NODE_TYPE(node) ((node)->parent & NODE_TYPE_MASK)
  95
  96#define IS_TNODE(n) (!(n->parent & T_LEAF))
  97#define IS_LEAF(n) (n->parent & T_LEAF)
  98
  99struct rt_trie_node {
 100	unsigned long parent;
 101	t_key key;
 102};
 103
 104struct leaf {
 105	unsigned long parent;
 106	t_key key;
 107	struct hlist_head list;
 108	struct rcu_head rcu;
 109};
 110
 111struct leaf_info {
 112	struct hlist_node hlist;
 113	int plen;
 114	u32 mask_plen; /* ntohl(inet_make_mask(plen)) */
 115	struct list_head falh;
 116	struct rcu_head rcu;
 117};
 118
 119struct tnode {
 120	unsigned long parent;
 121	t_key key;
 122	unsigned char pos;		/* 2log(KEYLENGTH) bits needed */
 123	unsigned char bits;		/* 2log(KEYLENGTH) bits needed */
 124	unsigned int full_children;	/* KEYLENGTH bits needed */
 125	unsigned int empty_children;	/* KEYLENGTH bits needed */
 126	union {
 127		struct rcu_head rcu;
 128		struct work_struct work;
 129		struct tnode *tnode_free;
 130	};
 131	struct rt_trie_node __rcu *child[0];
 132};
 133
 134#ifdef CONFIG_IP_FIB_TRIE_STATS
 135struct trie_use_stats {
 136	unsigned int gets;
 137	unsigned int backtrack;
 138	unsigned int semantic_match_passed;
 139	unsigned int semantic_match_miss;
 140	unsigned int null_node_hit;
 141	unsigned int resize_node_skipped;
 142};
 143#endif
 144
 145struct trie_stat {
 146	unsigned int totdepth;
 147	unsigned int maxdepth;
 148	unsigned int tnodes;
 149	unsigned int leaves;
 150	unsigned int nullpointers;
 151	unsigned int prefixes;
 152	unsigned int nodesizes[MAX_STAT_DEPTH];
 153};
 154
 155struct trie {
 156	struct rt_trie_node __rcu *trie;
 157#ifdef CONFIG_IP_FIB_TRIE_STATS
 158	struct trie_use_stats stats;
 159#endif
 160};
 161
 162static void put_child(struct trie *t, struct tnode *tn, int i, struct rt_trie_node *n);
 163static void tnode_put_child_reorg(struct tnode *tn, int i, struct rt_trie_node *n,
 164				  int wasfull);
 165static struct rt_trie_node *resize(struct trie *t, struct tnode *tn);
 166static struct tnode *inflate(struct trie *t, struct tnode *tn);
 167static struct tnode *halve(struct trie *t, struct tnode *tn);
 168/* tnodes to free after resize(); protected by RTNL */
 169static struct tnode *tnode_free_head;
 170static size_t tnode_free_size;
 171
 172/*
 173 * synchronize_rcu after call_rcu for that many pages; it should be especially
 174 * useful before resizing the root node with PREEMPT_NONE configs; the value was
 175 * obtained experimentally, aiming to avoid visible slowdown.
 176 */
 177static const int sync_pages = 128;
 178
 179static struct kmem_cache *fn_alias_kmem __read_mostly;
 180static struct kmem_cache *trie_leaf_kmem __read_mostly;
 181
 182/*
 183 * caller must hold RTNL
 184 */
 185static inline struct tnode *node_parent(const struct rt_trie_node *node)
 186{
 187	unsigned long parent;
 188
 189	parent = rcu_dereference_index_check(node->parent, lockdep_rtnl_is_held());
 190
 191	return (struct tnode *)(parent & ~NODE_TYPE_MASK);
 192}
 193
 194/*
 195 * caller must hold RCU read lock or RTNL
 196 */
 197static inline struct tnode *node_parent_rcu(const struct rt_trie_node *node)
 198{
 199	unsigned long parent;
 200
 201	parent = rcu_dereference_index_check(node->parent, rcu_read_lock_held() ||
 202							   lockdep_rtnl_is_held());
 203
 204	return (struct tnode *)(parent & ~NODE_TYPE_MASK);
 205}
 206
 207/* Same as rcu_assign_pointer
 208 * but that macro() assumes that value is a pointer.
 209 */
 210static inline void node_set_parent(struct rt_trie_node *node, struct tnode *ptr)
 211{
 212	smp_wmb();
 213	node->parent = (unsigned long)ptr | NODE_TYPE(node);
 214}
 215
 216/*
 217 * caller must hold RTNL
 218 */
 219static inline struct rt_trie_node *tnode_get_child(const struct tnode *tn, unsigned int i)
 220{
 221	BUG_ON(i >= 1U << tn->bits);
 222
 223	return rtnl_dereference(tn->child[i]);
 224}
 225
 226/*
 227 * caller must hold RCU read lock or RTNL
 228 */
 229static inline struct rt_trie_node *tnode_get_child_rcu(const struct tnode *tn, unsigned int i)
 230{
 231	BUG_ON(i >= 1U << tn->bits);
 232
 233	return rcu_dereference_rtnl(tn->child[i]);
 234}
 235
 236static inline int tnode_child_length(const struct tnode *tn)
 237{
 238	return 1 << tn->bits;
 239}
 240
 241static inline t_key mask_pfx(t_key k, unsigned int l)
 242{
 243	return (l == 0) ? 0 : k >> (KEYLENGTH-l) << (KEYLENGTH-l);
 244}
 245
 246static inline t_key tkey_extract_bits(t_key a, unsigned int offset, unsigned int bits)
 247{
 248	if (offset < KEYLENGTH)
 249		return ((t_key)(a << offset)) >> (KEYLENGTH - bits);
 250	else
 251		return 0;
 252}
 253
 254static inline int tkey_equals(t_key a, t_key b)
 255{
 256	return a == b;
 257}
 258
 259static inline int tkey_sub_equals(t_key a, int offset, int bits, t_key b)
 260{
 261	if (bits == 0 || offset >= KEYLENGTH)
 262		return 1;
 263	bits = bits > KEYLENGTH ? KEYLENGTH : bits;
 264	return ((a ^ b) << offset) >> (KEYLENGTH - bits) == 0;
 265}
 266
 267static inline int tkey_mismatch(t_key a, int offset, t_key b)
 268{
 269	t_key diff = a ^ b;
 270	int i = offset;
 271
 272	if (!diff)
 273		return 0;
 274	while ((diff << i) >> (KEYLENGTH-1) == 0)
 275		i++;
 276	return i;
 277}
 278
 279/*
 280  To understand this stuff, an understanding of keys and all their bits is
 281  necessary. Every node in the trie has a key associated with it, but not
 282  all of the bits in that key are significant.
 283
 284  Consider a node 'n' and its parent 'tp'.
 285
 286  If n is a leaf, every bit in its key is significant. Its presence is
 287  necessitated by path compression, since during a tree traversal (when
 288  searching for a leaf - unless we are doing an insertion) we will completely
 289  ignore all skipped bits we encounter. Thus we need to verify, at the end of
 290  a potentially successful search, that we have indeed been walking the
 291  correct key path.
 292
 293  Note that we can never "miss" the correct key in the tree if present by
 294  following the wrong path. Path compression ensures that segments of the key
 295  that are the same for all keys with a given prefix are skipped, but the
 296  skipped part *is* identical for each node in the subtrie below the skipped
 297  bit! trie_insert() in this implementation takes care of that - note the
 298  call to tkey_sub_equals() in trie_insert().
 299
 300  if n is an internal node - a 'tnode' here, the various parts of its key
 301  have many different meanings.
 302
 303  Example:
 304  _________________________________________________________________
 305  | i | i | i | i | i | i | i | N | N | N | S | S | S | S | S | C |
 306  -----------------------------------------------------------------
 307    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
 308
 309  _________________________________________________________________
 310  | C | C | C | u | u | u | u | u | u | u | u | u | u | u | u | u |
 311  -----------------------------------------------------------------
 312   16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31
 313
 314  tp->pos = 7
 315  tp->bits = 3
 316  n->pos = 15
 317  n->bits = 4
 318
 319  First, let's just ignore the bits that come before the parent tp, that is
 320  the bits from 0 to (tp->pos-1). They are *known* but at this point we do
 321  not use them for anything.
 322
 323  The bits from (tp->pos) to (tp->pos + tp->bits - 1) - "N", above - are the
 324  index into the parent's child array. That is, they will be used to find
 325  'n' among tp's children.
 326
 327  The bits from (tp->pos + tp->bits) to (n->pos - 1) - "S" - are skipped bits
 328  for the node n.
 329
 330  All the bits we have seen so far are significant to the node n. The rest
 331  of the bits are really not needed or indeed known in n->key.
 332
 333  The bits from (n->pos) to (n->pos + n->bits - 1) - "C" - are the index into
 334  n's child array, and will of course be different for each child.
 335
 336
 337  The rest of the bits, from (n->pos + n->bits) onward, are completely unknown
 338  at this point.
 339
 340*/
 341
 342static inline void check_tnode(const struct tnode *tn)
 343{
 344	WARN_ON(tn && tn->pos+tn->bits > 32);
 345}
 346
 347static const int halve_threshold = 25;
 348static const int inflate_threshold = 50;
 349static const int halve_threshold_root = 15;
 350static const int inflate_threshold_root = 30;
 351
 352static void __alias_free_mem(struct rcu_head *head)
 353{
 354	struct fib_alias *fa = container_of(head, struct fib_alias, rcu);
 355	kmem_cache_free(fn_alias_kmem, fa);
 356}
 357
 358static inline void alias_free_mem_rcu(struct fib_alias *fa)
 359{
 360	call_rcu(&fa->rcu, __alias_free_mem);
 361}
 362
 363static void __leaf_free_rcu(struct rcu_head *head)
 364{
 365	struct leaf *l = container_of(head, struct leaf, rcu);
 366	kmem_cache_free(trie_leaf_kmem, l);
 367}
 368
 369static inline void free_leaf(struct leaf *l)
 370{
 371	call_rcu_bh(&l->rcu, __leaf_free_rcu);
 372}
 373
 374static inline void free_leaf_info(struct leaf_info *leaf)
 375{
 376	kfree_rcu(leaf, rcu);
 377}
 378
 379static struct tnode *tnode_alloc(size_t size)
 380{
 381	if (size <= PAGE_SIZE)
 382		return kzalloc(size, GFP_KERNEL);
 383	else
 384		return vzalloc(size);
 385}
 386
 387static void __tnode_vfree(struct work_struct *arg)
 388{
 389	struct tnode *tn = container_of(arg, struct tnode, work);
 390	vfree(tn);
 391}
 392
 393static void __tnode_free_rcu(struct rcu_head *head)
 394{
 395	struct tnode *tn = container_of(head, struct tnode, rcu);
 396	size_t size = sizeof(struct tnode) +
 397		      (sizeof(struct rt_trie_node *) << tn->bits);
 398
 399	if (size <= PAGE_SIZE)
 400		kfree(tn);
 401	else {
 402		INIT_WORK(&tn->work, __tnode_vfree);
 403		schedule_work(&tn->work);
 404	}
 405}
 406
 407static inline void tnode_free(struct tnode *tn)
 408{
 409	if (IS_LEAF(tn))
 410		free_leaf((struct leaf *) tn);
 411	else
 412		call_rcu(&tn->rcu, __tnode_free_rcu);
 413}
 414
 415static void tnode_free_safe(struct tnode *tn)
 416{
 417	BUG_ON(IS_LEAF(tn));
 418	tn->tnode_free = tnode_free_head;
 419	tnode_free_head = tn;
 420	tnode_free_size += sizeof(struct tnode) +
 421			   (sizeof(struct rt_trie_node *) << tn->bits);
 422}
 423
 424static void tnode_free_flush(void)
 425{
 426	struct tnode *tn;
 427
 428	while ((tn = tnode_free_head)) {
 429		tnode_free_head = tn->tnode_free;
 430		tn->tnode_free = NULL;
 431		tnode_free(tn);
 432	}
 433
 434	if (tnode_free_size >= PAGE_SIZE * sync_pages) {
 435		tnode_free_size = 0;
 436		synchronize_rcu();
 437	}
 438}
 439
 440static struct leaf *leaf_new(void)
 441{
 442	struct leaf *l = kmem_cache_alloc(trie_leaf_kmem, GFP_KERNEL);
 443	if (l) {
 444		l->parent = T_LEAF;
 445		INIT_HLIST_HEAD(&l->list);
 446	}
 447	return l;
 448}
 449
 450static struct leaf_info *leaf_info_new(int plen)
 451{
 452	struct leaf_info *li = kmalloc(sizeof(struct leaf_info),  GFP_KERNEL);
 453	if (li) {
 454		li->plen = plen;
 455		li->mask_plen = ntohl(inet_make_mask(plen));
 456		INIT_LIST_HEAD(&li->falh);
 457	}
 458	return li;
 459}
 460
 461static struct tnode *tnode_new(t_key key, int pos, int bits)
 462{
 463	size_t sz = sizeof(struct tnode) + (sizeof(struct rt_trie_node *) << bits);
 464	struct tnode *tn = tnode_alloc(sz);
 465
 466	if (tn) {
 467		tn->parent = T_TNODE;
 468		tn->pos = pos;
 469		tn->bits = bits;
 470		tn->key = key;
 471		tn->full_children = 0;
 472		tn->empty_children = 1<<bits;
 473	}
 474
 475	pr_debug("AT %p s=%zu %zu\n", tn, sizeof(struct tnode),
 476		 sizeof(struct rt_trie_node) << bits);
 477	return tn;
 478}
 479
 480/*
 481 * Check whether a tnode 'n' is "full", i.e. it is an internal node
 482 * and no bits are skipped. See discussion in dyntree paper p. 6
 483 */
 484
 485static inline int tnode_full(const struct tnode *tn, const struct rt_trie_node *n)
 486{
 487	if (n == NULL || IS_LEAF(n))
 488		return 0;
 489
 490	return ((struct tnode *) n)->pos == tn->pos + tn->bits;
 491}
 492
 493static inline void put_child(struct trie *t, struct tnode *tn, int i,
 494			     struct rt_trie_node *n)
 495{
 496	tnode_put_child_reorg(tn, i, n, -1);
 497}
 498
 499 /*
 500  * Add a child at position i overwriting the old value.
 501  * Update the value of full_children and empty_children.
 502  */
 503
 504static void tnode_put_child_reorg(struct tnode *tn, int i, struct rt_trie_node *n,
 505				  int wasfull)
 506{
 507	struct rt_trie_node *chi = rtnl_dereference(tn->child[i]);
 508	int isfull;
 509
 510	BUG_ON(i >= 1<<tn->bits);
 511
 512	/* update emptyChildren */
 513	if (n == NULL && chi != NULL)
 514		tn->empty_children++;
 515	else if (n != NULL && chi == NULL)
 516		tn->empty_children--;
 517
 518	/* update fullChildren */
 519	if (wasfull == -1)
 520		wasfull = tnode_full(tn, chi);
 521
 522	isfull = tnode_full(tn, n);
 523	if (wasfull && !isfull)
 524		tn->full_children--;
 525	else if (!wasfull && isfull)
 526		tn->full_children++;
 527
 528	if (n)
 529		node_set_parent(n, tn);
 530
 531	rcu_assign_pointer(tn->child[i], n);
 532}
 533
 534#define MAX_WORK 10
 535static struct rt_trie_node *resize(struct trie *t, struct tnode *tn)
 536{
 537	int i;
 538	struct tnode *old_tn;
 539	int inflate_threshold_use;
 540	int halve_threshold_use;
 541	int max_work;
 542
 543	if (!tn)
 544		return NULL;
 545
 546	pr_debug("In tnode_resize %p inflate_threshold=%d threshold=%d\n",
 547		 tn, inflate_threshold, halve_threshold);
 548
 549	/* No children */
 550	if (tn->empty_children == tnode_child_length(tn)) {
 551		tnode_free_safe(tn);
 552		return NULL;
 553	}
 554	/* One child */
 555	if (tn->empty_children == tnode_child_length(tn) - 1)
 556		goto one_child;
 557	/*
 558	 * Double as long as the resulting node has a number of
 559	 * nonempty nodes that are above the threshold.
 560	 */
 561
 562	/*
 563	 * From "Implementing a dynamic compressed trie" by Stefan Nilsson of
 564	 * the Helsinki University of Technology and Matti Tikkanen of Nokia
 565	 * Telecommunications, page 6:
 566	 * "A node is doubled if the ratio of non-empty children to all
 567	 * children in the *doubled* node is at least 'high'."
 568	 *
 569	 * 'high' in this instance is the variable 'inflate_threshold'. It
 570	 * is expressed as a percentage, so we multiply it with
 571	 * tnode_child_length() and instead of multiplying by 2 (since the
 572	 * child array will be doubled by inflate()) and multiplying
 573	 * the left-hand side by 100 (to handle the percentage thing) we
 574	 * multiply the left-hand side by 50.
 575	 *
 576	 * The left-hand side may look a bit weird: tnode_child_length(tn)
 577	 * - tn->empty_children is of course the number of non-null children
 578	 * in the current node. tn->full_children is the number of "full"
 579	 * children, that is non-null tnodes with a skip value of 0.
 580	 * All of those will be doubled in the resulting inflated tnode, so
 581	 * we just count them one extra time here.
 582	 *
 583	 * A clearer way to write this would be:
 584	 *
 585	 * to_be_doubled = tn->full_children;
 586	 * not_to_be_doubled = tnode_child_length(tn) - tn->empty_children -
 587	 *     tn->full_children;
 588	 *
 589	 * new_child_length = tnode_child_length(tn) * 2;
 590	 *
 591	 * new_fill_factor = 100 * (not_to_be_doubled + 2*to_be_doubled) /
 592	 *      new_child_length;
 593	 * if (new_fill_factor >= inflate_threshold)
 594	 *
 595	 * ...and so on, tho it would mess up the while () loop.
 596	 *
 597	 * anyway,
 598	 * 100 * (not_to_be_doubled + 2*to_be_doubled) / new_child_length >=
 599	 *      inflate_threshold
 600	 *
 601	 * avoid a division:
 602	 * 100 * (not_to_be_doubled + 2*to_be_doubled) >=
 603	 *      inflate_threshold * new_child_length
 604	 *
 605	 * expand not_to_be_doubled and to_be_doubled, and shorten:
 606	 * 100 * (tnode_child_length(tn) - tn->empty_children +
 607	 *    tn->full_children) >= inflate_threshold * new_child_length
 608	 *
 609	 * expand new_child_length:
 610	 * 100 * (tnode_child_length(tn) - tn->empty_children +
 611	 *    tn->full_children) >=
 612	 *      inflate_threshold * tnode_child_length(tn) * 2
 613	 *
 614	 * shorten again:
 615	 * 50 * (tn->full_children + tnode_child_length(tn) -
 616	 *    tn->empty_children) >= inflate_threshold *
 617	 *    tnode_child_length(tn)
 618	 *
 619	 */
 620
 621	check_tnode(tn);
 622
 623	/* Keep root node larger  */
 624
 625	if (!node_parent((struct rt_trie_node *)tn)) {
 626		inflate_threshold_use = inflate_threshold_root;
 627		halve_threshold_use = halve_threshold_root;
 628	} else {
 629		inflate_threshold_use = inflate_threshold;
 630		halve_threshold_use = halve_threshold;
 631	}
 632
 633	max_work = MAX_WORK;
 634	while ((tn->full_children > 0 &&  max_work-- &&
 635		50 * (tn->full_children + tnode_child_length(tn)
 636		      - tn->empty_children)
 637		>= inflate_threshold_use * tnode_child_length(tn))) {
 638
 639		old_tn = tn;
 640		tn = inflate(t, tn);
 641
 642		if (IS_ERR(tn)) {
 643			tn = old_tn;
 644#ifdef CONFIG_IP_FIB_TRIE_STATS
 645			t->stats.resize_node_skipped++;
 646#endif
 647			break;
 648		}
 649	}
 650
 651	check_tnode(tn);
 652
 653	/* Return if at least one inflate is run */
 654	if (max_work != MAX_WORK)
 655		return (struct rt_trie_node *) tn;
 656
 657	/*
 658	 * Halve as long as the number of empty children in this
 659	 * node is above threshold.
 660	 */
 661
 662	max_work = MAX_WORK;
 663	while (tn->bits > 1 &&  max_work-- &&
 664	       100 * (tnode_child_length(tn) - tn->empty_children) <
 665	       halve_threshold_use * tnode_child_length(tn)) {
 666
 667		old_tn = tn;
 668		tn = halve(t, tn);
 669		if (IS_ERR(tn)) {
 670			tn = old_tn;
 671#ifdef CONFIG_IP_FIB_TRIE_STATS
 672			t->stats.resize_node_skipped++;
 673#endif
 674			break;
 675		}
 676	}
 677
 678
 679	/* Only one child remains */
 680	if (tn->empty_children == tnode_child_length(tn) - 1) {
 681one_child:
 682		for (i = 0; i < tnode_child_length(tn); i++) {
 683			struct rt_trie_node *n;
 684
 685			n = rtnl_dereference(tn->child[i]);
 686			if (!n)
 687				continue;
 688
 689			/* compress one level */
 690
 691			node_set_parent(n, NULL);
 692			tnode_free_safe(tn);
 693			return n;
 694		}
 695	}
 696	return (struct rt_trie_node *) tn;
 697}
 698
 699
 700static void tnode_clean_free(struct tnode *tn)
 701{
 702	int i;
 703	struct tnode *tofree;
 704
 705	for (i = 0; i < tnode_child_length(tn); i++) {
 706		tofree = (struct tnode *)rtnl_dereference(tn->child[i]);
 707		if (tofree)
 708			tnode_free(tofree);
 709	}
 710	tnode_free(tn);
 711}
 712
 713static struct tnode *inflate(struct trie *t, struct tnode *tn)
 714{
 715	struct tnode *oldtnode = tn;
 716	int olen = tnode_child_length(tn);
 717	int i;
 718
 719	pr_debug("In inflate\n");
 720
 721	tn = tnode_new(oldtnode->key, oldtnode->pos, oldtnode->bits + 1);
 722
 723	if (!tn)
 724		return ERR_PTR(-ENOMEM);
 725
 726	/*
 727	 * Preallocate and store tnodes before the actual work so we
 728	 * don't get into an inconsistent state if memory allocation
 729	 * fails. In case of failure we return the oldnode and  inflate
 730	 * of tnode is ignored.
 731	 */
 732
 733	for (i = 0; i < olen; i++) {
 734		struct tnode *inode;
 735
 736		inode = (struct tnode *) tnode_get_child(oldtnode, i);
 737		if (inode &&
 738		    IS_TNODE(inode) &&
 739		    inode->pos == oldtnode->pos + oldtnode->bits &&
 740		    inode->bits > 1) {
 741			struct tnode *left, *right;
 742			t_key m = ~0U << (KEYLENGTH - 1) >> inode->pos;
 743
 744			left = tnode_new(inode->key&(~m), inode->pos + 1,
 745					 inode->bits - 1);
 746			if (!left)
 747				goto nomem;
 748
 749			right = tnode_new(inode->key|m, inode->pos + 1,
 750					  inode->bits - 1);
 751
 752			if (!right) {
 753				tnode_free(left);
 754				goto nomem;
 755			}
 756
 757			put_child(t, tn, 2*i, (struct rt_trie_node *) left);
 758			put_child(t, tn, 2*i+1, (struct rt_trie_node *) right);
 759		}
 760	}
 761
 762	for (i = 0; i < olen; i++) {
 763		struct tnode *inode;
 764		struct rt_trie_node *node = tnode_get_child(oldtnode, i);
 765		struct tnode *left, *right;
 766		int size, j;
 767
 768		/* An empty child */
 769		if (node == NULL)
 770			continue;
 771
 772		/* A leaf or an internal node with skipped bits */
 773
 774		if (IS_LEAF(node) || ((struct tnode *) node)->pos >
 775		   tn->pos + tn->bits - 1) {
 776			if (tkey_extract_bits(node->key,
 777					      oldtnode->pos + oldtnode->bits,
 778					      1) == 0)
 779				put_child(t, tn, 2*i, node);
 780			else
 781				put_child(t, tn, 2*i+1, node);
 782			continue;
 783		}
 784
 785		/* An internal node with two children */
 786		inode = (struct tnode *) node;
 787
 788		if (inode->bits == 1) {
 789			put_child(t, tn, 2*i, rtnl_dereference(inode->child[0]));
 790			put_child(t, tn, 2*i+1, rtnl_dereference(inode->child[1]));
 791
 792			tnode_free_safe(inode);
 793			continue;
 794		}
 795
 796		/* An internal node with more than two children */
 797
 798		/* We will replace this node 'inode' with two new
 799		 * ones, 'left' and 'right', each with half of the
 800		 * original children. The two new nodes will have
 801		 * a position one bit further down the key and this
 802		 * means that the "significant" part of their keys
 803		 * (see the discussion near the top of this file)
 804		 * will differ by one bit, which will be "0" in
 805		 * left's key and "1" in right's key. Since we are
 806		 * moving the key position by one step, the bit that
 807		 * we are moving away from - the bit at position
 808		 * (inode->pos) - is the one that will differ between
 809		 * left and right. So... we synthesize that bit in the
 810		 * two  new keys.
 811		 * The mask 'm' below will be a single "one" bit at
 812		 * the position (inode->pos)
 813		 */
 814
 815		/* Use the old key, but set the new significant
 816		 *   bit to zero.
 817		 */
 818
 819		left = (struct tnode *) tnode_get_child(tn, 2*i);
 820		put_child(t, tn, 2*i, NULL);
 821
 822		BUG_ON(!left);
 823
 824		right = (struct tnode *) tnode_get_child(tn, 2*i+1);
 825		put_child(t, tn, 2*i+1, NULL);
 826
 827		BUG_ON(!right);
 828
 829		size = tnode_child_length(left);
 830		for (j = 0; j < size; j++) {
 831			put_child(t, left, j, rtnl_dereference(inode->child[j]));
 832			put_child(t, right, j, rtnl_dereference(inode->child[j + size]));
 833		}
 834		put_child(t, tn, 2*i, resize(t, left));
 835		put_child(t, tn, 2*i+1, resize(t, right));
 836
 837		tnode_free_safe(inode);
 838	}
 839	tnode_free_safe(oldtnode);
 840	return tn;
 841nomem:
 842	tnode_clean_free(tn);
 843	return ERR_PTR(-ENOMEM);
 844}
 845
 846static struct tnode *halve(struct trie *t, struct tnode *tn)
 847{
 848	struct tnode *oldtnode = tn;
 849	struct rt_trie_node *left, *right;
 850	int i;
 851	int olen = tnode_child_length(tn);
 852
 853	pr_debug("In halve\n");
 854
 855	tn = tnode_new(oldtnode->key, oldtnode->pos, oldtnode->bits - 1);
 856
 857	if (!tn)
 858		return ERR_PTR(-ENOMEM);
 859
 860	/*
 861	 * Preallocate and store tnodes before the actual work so we
 862	 * don't get into an inconsistent state if memory allocation
 863	 * fails. In case of failure we return the oldnode and halve
 864	 * of tnode is ignored.
 865	 */
 866
 867	for (i = 0; i < olen; i += 2) {
 868		left = tnode_get_child(oldtnode, i);
 869		right = tnode_get_child(oldtnode, i+1);
 870
 871		/* Two nonempty children */
 872		if (left && right) {
 873			struct tnode *newn;
 874
 875			newn = tnode_new(left->key, tn->pos + tn->bits, 1);
 876
 877			if (!newn)
 878				goto nomem;
 879
 880			put_child(t, tn, i/2, (struct rt_trie_node *)newn);
 881		}
 882
 883	}
 884
 885	for (i = 0; i < olen; i += 2) {
 886		struct tnode *newBinNode;
 887
 888		left = tnode_get_child(oldtnode, i);
 889		right = tnode_get_child(oldtnode, i+1);
 890
 891		/* At least one of the children is empty */
 892		if (left == NULL) {
 893			if (right == NULL)    /* Both are empty */
 894				continue;
 895			put_child(t, tn, i/2, right);
 896			continue;
 897		}
 898
 899		if (right == NULL) {
 900			put_child(t, tn, i/2, left);
 901			continue;
 902		}
 903
 904		/* Two nonempty children */
 905		newBinNode = (struct tnode *) tnode_get_child(tn, i/2);
 906		put_child(t, tn, i/2, NULL);
 907		put_child(t, newBinNode, 0, left);
 908		put_child(t, newBinNode, 1, right);
 909		put_child(t, tn, i/2, resize(t, newBinNode));
 910	}
 911	tnode_free_safe(oldtnode);
 912	return tn;
 913nomem:
 914	tnode_clean_free(tn);
 915	return ERR_PTR(-ENOMEM);
 916}
 917
 918/* readside must use rcu_read_lock currently dump routines
 919 via get_fa_head and dump */
 920
 921static struct leaf_info *find_leaf_info(struct leaf *l, int plen)
 922{
 923	struct hlist_head *head = &l->list;
 924	struct hlist_node *node;
 925	struct leaf_info *li;
 926
 927	hlist_for_each_entry_rcu(li, node, head, hlist)
 928		if (li->plen == plen)
 929			return li;
 930
 931	return NULL;
 932}
 933
 934static inline struct list_head *get_fa_head(struct leaf *l, int plen)
 935{
 936	struct leaf_info *li = find_leaf_info(l, plen);
 937
 938	if (!li)
 939		return NULL;
 940
 941	return &li->falh;
 942}
 943
 944static void insert_leaf_info(struct hlist_head *head, struct leaf_info *new)
 945{
 946	struct leaf_info *li = NULL, *last = NULL;
 947	struct hlist_node *node;
 948
 949	if (hlist_empty(head)) {
 950		hlist_add_head_rcu(&new->hlist, head);
 951	} else {
 952		hlist_for_each_entry(li, node, head, hlist) {
 953			if (new->plen > li->plen)
 954				break;
 955
 956			last = li;
 957		}
 958		if (last)
 959			hlist_add_after_rcu(&last->hlist, &new->hlist);
 960		else
 961			hlist_add_before_rcu(&new->hlist, &li->hlist);
 962	}
 963}
 964
 965/* rcu_read_lock needs to be hold by caller from readside */
 966
 967static struct leaf *
 968fib_find_node(struct trie *t, u32 key)
 969{
 970	int pos;
 971	struct tnode *tn;
 972	struct rt_trie_node *n;
 973
 974	pos = 0;
 975	n = rcu_dereference_rtnl(t->trie);
 976
 977	while (n != NULL &&  NODE_TYPE(n) == T_TNODE) {
 978		tn = (struct tnode *) n;
 979
 980		check_tnode(tn);
 981
 982		if (tkey_sub_equals(tn->key, pos, tn->pos-pos, key)) {
 983			pos = tn->pos + tn->bits;
 984			n = tnode_get_child_rcu(tn,
 985						tkey_extract_bits(key,
 986								  tn->pos,
 987								  tn->bits));
 988		} else
 989			break;
 990	}
 991	/* Case we have found a leaf. Compare prefixes */
 992
 993	if (n != NULL && IS_LEAF(n) && tkey_equals(key, n->key))
 994		return (struct leaf *)n;
 995
 996	return NULL;
 997}
 998
 999static void trie_rebalance(struct trie *t, struct tnode *tn)
1000{
1001	int wasfull;
1002	t_key cindex, key;
1003	struct tnode *tp;
1004
1005	key = tn->key;
1006
1007	while (tn != NULL && (tp = node_parent((struct rt_trie_node *)tn)) != NULL) {
1008		cindex = tkey_extract_bits(key, tp->pos, tp->bits);
1009		wasfull = tnode_full(tp, tnode_get_child(tp, cindex));
1010		tn = (struct tnode *) resize(t, (struct tnode *)tn);
1011
1012		tnode_put_child_reorg((struct tnode *)tp, cindex,
1013				      (struct rt_trie_node *)tn, wasfull);
1014
1015		tp = node_parent((struct rt_trie_node *) tn);
1016		if (!tp)
1017			rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
1018
1019		tnode_free_flush();
1020		if (!tp)
1021			break;
1022		tn = tp;
1023	}
1024
1025	/* Handle last (top) tnode */
1026	if (IS_TNODE(tn))
1027		tn = (struct tnode *)resize(t, (struct tnode *)tn);
1028
1029	rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
1030	tnode_free_flush();
1031}
1032
1033/* only used from updater-side */
1034
1035static struct list_head *fib_insert_node(struct trie *t, u32 key, int plen)
1036{
1037	int pos, newpos;
1038	struct tnode *tp = NULL, *tn = NULL;
1039	struct rt_trie_node *n;
1040	struct leaf *l;
1041	int missbit;
1042	struct list_head *fa_head = NULL;
1043	struct leaf_info *li;
1044	t_key cindex;
1045
1046	pos = 0;
1047	n = rtnl_dereference(t->trie);
1048
1049	/* If we point to NULL, stop. Either the tree is empty and we should
1050	 * just put a new leaf in if, or we have reached an empty child slot,
1051	 * and we should just put our new leaf in that.
1052	 * If we point to a T_TNODE, check if it matches our key. Note that
1053	 * a T_TNODE might be skipping any number of bits - its 'pos' need
1054	 * not be the parent's 'pos'+'bits'!
1055	 *
1056	 * If it does match the current key, get pos/bits from it, extract
1057	 * the index from our key, push the T_TNODE and walk the tree.
1058	 *
1059	 * If it doesn't, we have to replace it with a new T_TNODE.
1060	 *
1061	 * If we point to a T_LEAF, it might or might not have the same key
1062	 * as we do. If it does, just change the value, update the T_LEAF's
1063	 * value, and return it.
1064	 * If it doesn't, we need to replace it with a T_TNODE.
1065	 */
1066
1067	while (n != NULL &&  NODE_TYPE(n) == T_TNODE) {
1068		tn = (struct tnode *) n;
1069
1070		check_tnode(tn);
1071
1072		if (tkey_sub_equals(tn->key, pos, tn->pos-pos, key)) {
1073			tp = tn;
1074			pos = tn->pos + tn->bits;
1075			n = tnode_get_child(tn,
1076					    tkey_extract_bits(key,
1077							      tn->pos,
1078							      tn->bits));
1079
1080			BUG_ON(n && node_parent(n) != tn);
1081		} else
1082			break;
1083	}
1084
1085	/*
1086	 * n  ----> NULL, LEAF or TNODE
1087	 *
1088	 * tp is n's (parent) ----> NULL or TNODE
1089	 */
1090
1091	BUG_ON(tp && IS_LEAF(tp));
1092
1093	/* Case 1: n is a leaf. Compare prefixes */
1094
1095	if (n != NULL && IS_LEAF(n) && tkey_equals(key, n->key)) {
1096		l = (struct leaf *) n;
1097		li = leaf_info_new(plen);
1098
1099		if (!li)
1100			return NULL;
1101
1102		fa_head = &li->falh;
1103		insert_leaf_info(&l->list, li);
1104		goto done;
1105	}
1106	l = leaf_new();
1107
1108	if (!l)
1109		return NULL;
1110
1111	l->key = key;
1112	li = leaf_info_new(plen);
1113
1114	if (!li) {
1115		free_leaf(l);
1116		return NULL;
1117	}
1118
1119	fa_head = &li->falh;
1120	insert_leaf_info(&l->list, li);
1121
1122	if (t->trie && n == NULL) {
1123		/* Case 2: n is NULL, and will just insert a new leaf */
1124
1125		node_set_parent((struct rt_trie_node *)l, tp);
1126
1127		cindex = tkey_extract_bits(key, tp->pos, tp->bits);
1128		put_child(t, (struct tnode *)tp, cindex, (struct rt_trie_node *)l);
1129	} else {
1130		/* Case 3: n is a LEAF or a TNODE and the key doesn't match. */
1131		/*
1132		 *  Add a new tnode here
1133		 *  first tnode need some special handling
1134		 */
1135
1136		if (tp)
1137			pos = tp->pos+tp->bits;
1138		else
1139			pos = 0;
1140
1141		if (n) {
 
1142			newpos = tkey_mismatch(key, pos, n->key);
1143			tn = tnode_new(n->key, newpos, 1);
1144		} else {
1145			newpos = 0;
1146			tn = tnode_new(key, newpos, 1); /* First tnode */
1147		}
1148
1149		if (!tn) {
1150			free_leaf_info(li);
1151			free_leaf(l);
1152			return NULL;
1153		}
1154
1155		node_set_parent((struct rt_trie_node *)tn, tp);
1156
1157		missbit = tkey_extract_bits(key, newpos, 1);
1158		put_child(t, tn, missbit, (struct rt_trie_node *)l);
1159		put_child(t, tn, 1-missbit, n);
1160
1161		if (tp) {
1162			cindex = tkey_extract_bits(key, tp->pos, tp->bits);
1163			put_child(t, (struct tnode *)tp, cindex,
1164				  (struct rt_trie_node *)tn);
1165		} else {
1166			rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn);
1167			tp = tn;
1168		}
1169	}
1170
1171	if (tp && tp->pos + tp->bits > 32)
1172		pr_warn("fib_trie tp=%p pos=%d, bits=%d, key=%0x plen=%d\n",
1173			tp, tp->pos, tp->bits, key, plen);
1174
1175	/* Rebalance the trie */
1176
1177	trie_rebalance(t, tp);
1178done:
1179	return fa_head;
1180}
1181
1182/*
1183 * Caller must hold RTNL.
1184 */
1185int fib_table_insert(struct fib_table *tb, struct fib_config *cfg)
1186{
1187	struct trie *t = (struct trie *) tb->tb_data;
1188	struct fib_alias *fa, *new_fa;
1189	struct list_head *fa_head = NULL;
1190	struct fib_info *fi;
1191	int plen = cfg->fc_dst_len;
1192	u8 tos = cfg->fc_tos;
1193	u32 key, mask;
1194	int err;
1195	struct leaf *l;
1196
1197	if (plen > 32)
1198		return -EINVAL;
1199
1200	key = ntohl(cfg->fc_dst);
1201
1202	pr_debug("Insert table=%u %08x/%d\n", tb->tb_id, key, plen);
1203
1204	mask = ntohl(inet_make_mask(plen));
1205
1206	if (key & ~mask)
1207		return -EINVAL;
1208
1209	key = key & mask;
1210
1211	fi = fib_create_info(cfg);
1212	if (IS_ERR(fi)) {
1213		err = PTR_ERR(fi);
1214		goto err;
1215	}
1216
1217	l = fib_find_node(t, key);
1218	fa = NULL;
1219
1220	if (l) {
1221		fa_head = get_fa_head(l, plen);
1222		fa = fib_find_alias(fa_head, tos, fi->fib_priority);
1223	}
1224
1225	/* Now fa, if non-NULL, points to the first fib alias
1226	 * with the same keys [prefix,tos,priority], if such key already
1227	 * exists or to the node before which we will insert new one.
1228	 *
1229	 * If fa is NULL, we will need to allocate a new one and
1230	 * insert to the head of f.
1231	 *
1232	 * If f is NULL, no fib node matched the destination key
1233	 * and we need to allocate a new one of those as well.
1234	 */
1235
1236	if (fa && fa->fa_tos == tos &&
1237	    fa->fa_info->fib_priority == fi->fib_priority) {
1238		struct fib_alias *fa_first, *fa_match;
1239
1240		err = -EEXIST;
1241		if (cfg->fc_nlflags & NLM_F_EXCL)
1242			goto out;
1243
1244		/* We have 2 goals:
1245		 * 1. Find exact match for type, scope, fib_info to avoid
1246		 * duplicate routes
1247		 * 2. Find next 'fa' (or head), NLM_F_APPEND inserts before it
1248		 */
1249		fa_match = NULL;
1250		fa_first = fa;
1251		fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list);
1252		list_for_each_entry_continue(fa, fa_head, fa_list) {
1253			if (fa->fa_tos != tos)
1254				break;
1255			if (fa->fa_info->fib_priority != fi->fib_priority)
1256				break;
1257			if (fa->fa_type == cfg->fc_type &&
1258			    fa->fa_info == fi) {
1259				fa_match = fa;
1260				break;
1261			}
1262		}
1263
1264		if (cfg->fc_nlflags & NLM_F_REPLACE) {
1265			struct fib_info *fi_drop;
1266			u8 state;
1267
1268			fa = fa_first;
1269			if (fa_match) {
1270				if (fa == fa_match)
1271					err = 0;
1272				goto out;
1273			}
1274			err = -ENOBUFS;
1275			new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL);
1276			if (new_fa == NULL)
1277				goto out;
1278
1279			fi_drop = fa->fa_info;
1280			new_fa->fa_tos = fa->fa_tos;
1281			new_fa->fa_info = fi;
1282			new_fa->fa_type = cfg->fc_type;
1283			state = fa->fa_state;
1284			new_fa->fa_state = state & ~FA_S_ACCESSED;
1285
1286			list_replace_rcu(&fa->fa_list, &new_fa->fa_list);
1287			alias_free_mem_rcu(fa);
1288
1289			fib_release_info(fi_drop);
1290			if (state & FA_S_ACCESSED)
1291				rt_cache_flush(cfg->fc_nlinfo.nl_net, -1);
1292			rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen,
1293				tb->tb_id, &cfg->fc_nlinfo, NLM_F_REPLACE);
1294
1295			goto succeeded;
1296		}
1297		/* Error if we find a perfect match which
1298		 * uses the same scope, type, and nexthop
1299		 * information.
1300		 */
1301		if (fa_match)
1302			goto out;
1303
1304		if (!(cfg->fc_nlflags & NLM_F_APPEND))
1305			fa = fa_first;
1306	}
1307	err = -ENOENT;
1308	if (!(cfg->fc_nlflags & NLM_F_CREATE))
1309		goto out;
1310
1311	err = -ENOBUFS;
1312	new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL);
1313	if (new_fa == NULL)
1314		goto out;
1315
1316	new_fa->fa_info = fi;
1317	new_fa->fa_tos = tos;
1318	new_fa->fa_type = cfg->fc_type;
1319	new_fa->fa_state = 0;
1320	/*
1321	 * Insert new entry to the list.
1322	 */
1323
1324	if (!fa_head) {
1325		fa_head = fib_insert_node(t, key, plen);
1326		if (unlikely(!fa_head)) {
1327			err = -ENOMEM;
1328			goto out_free_new_fa;
1329		}
1330	}
1331
1332	if (!plen)
1333		tb->tb_num_default++;
1334
1335	list_add_tail_rcu(&new_fa->fa_list,
1336			  (fa ? &fa->fa_list : fa_head));
1337
1338	rt_cache_flush(cfg->fc_nlinfo.nl_net, -1);
1339	rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id,
1340		  &cfg->fc_nlinfo, 0);
1341succeeded:
1342	return 0;
1343
1344out_free_new_fa:
1345	kmem_cache_free(fn_alias_kmem, new_fa);
1346out:
1347	fib_release_info(fi);
1348err:
1349	return err;
1350}
1351
1352/* should be called with rcu_read_lock */
1353static int check_leaf(struct fib_table *tb, struct trie *t, struct leaf *l,
1354		      t_key key,  const struct flowi4 *flp,
1355		      struct fib_result *res, int fib_flags)
1356{
1357	struct leaf_info *li;
1358	struct hlist_head *hhead = &l->list;
1359	struct hlist_node *node;
1360
1361	hlist_for_each_entry_rcu(li, node, hhead, hlist) {
1362		struct fib_alias *fa;
1363
1364		if (l->key != (key & li->mask_plen))
1365			continue;
1366
1367		list_for_each_entry_rcu(fa, &li->falh, fa_list) {
1368			struct fib_info *fi = fa->fa_info;
1369			int nhsel, err;
1370
1371			if (fa->fa_tos && fa->fa_tos != flp->flowi4_tos)
1372				continue;
1373			if (fi->fib_dead)
1374				continue;
1375			if (fa->fa_info->fib_scope < flp->flowi4_scope)
1376				continue;
1377			fib_alias_accessed(fa);
1378			err = fib_props[fa->fa_type].error;
1379			if (err) {
1380#ifdef CONFIG_IP_FIB_TRIE_STATS
1381				t->stats.semantic_match_passed++;
1382#endif
1383				return err;
1384			}
1385			if (fi->fib_flags & RTNH_F_DEAD)
1386				continue;
1387			for (nhsel = 0; nhsel < fi->fib_nhs; nhsel++) {
1388				const struct fib_nh *nh = &fi->fib_nh[nhsel];
1389
1390				if (nh->nh_flags & RTNH_F_DEAD)
1391					continue;
1392				if (flp->flowi4_oif && flp->flowi4_oif != nh->nh_oif)
1393					continue;
1394
1395#ifdef CONFIG_IP_FIB_TRIE_STATS
1396				t->stats.semantic_match_passed++;
1397#endif
1398				res->prefixlen = li->plen;
1399				res->nh_sel = nhsel;
1400				res->type = fa->fa_type;
1401				res->scope = fa->fa_info->fib_scope;
1402				res->fi = fi;
1403				res->table = tb;
1404				res->fa_head = &li->falh;
1405				if (!(fib_flags & FIB_LOOKUP_NOREF))
1406					atomic_inc(&fi->fib_clntref);
1407				return 0;
1408			}
1409		}
1410
1411#ifdef CONFIG_IP_FIB_TRIE_STATS
1412		t->stats.semantic_match_miss++;
1413#endif
1414	}
1415
1416	return 1;
1417}
1418
1419int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
1420		     struct fib_result *res, int fib_flags)
1421{
1422	struct trie *t = (struct trie *) tb->tb_data;
1423	int ret;
1424	struct rt_trie_node *n;
1425	struct tnode *pn;
1426	unsigned int pos, bits;
1427	t_key key = ntohl(flp->daddr);
1428	unsigned int chopped_off;
1429	t_key cindex = 0;
1430	unsigned int current_prefix_length = KEYLENGTH;
1431	struct tnode *cn;
1432	t_key pref_mismatch;
1433
1434	rcu_read_lock();
1435
1436	n = rcu_dereference(t->trie);
1437	if (!n)
1438		goto failed;
1439
1440#ifdef CONFIG_IP_FIB_TRIE_STATS
1441	t->stats.gets++;
1442#endif
1443
1444	/* Just a leaf? */
1445	if (IS_LEAF(n)) {
1446		ret = check_leaf(tb, t, (struct leaf *)n, key, flp, res, fib_flags);
1447		goto found;
1448	}
1449
1450	pn = (struct tnode *) n;
1451	chopped_off = 0;
1452
1453	while (pn) {
1454		pos = pn->pos;
1455		bits = pn->bits;
1456
1457		if (!chopped_off)
1458			cindex = tkey_extract_bits(mask_pfx(key, current_prefix_length),
1459						   pos, bits);
1460
1461		n = tnode_get_child_rcu(pn, cindex);
1462
1463		if (n == NULL) {
1464#ifdef CONFIG_IP_FIB_TRIE_STATS
1465			t->stats.null_node_hit++;
1466#endif
1467			goto backtrace;
1468		}
1469
1470		if (IS_LEAF(n)) {
1471			ret = check_leaf(tb, t, (struct leaf *)n, key, flp, res, fib_flags);
1472			if (ret > 0)
1473				goto backtrace;
1474			goto found;
1475		}
1476
1477		cn = (struct tnode *)n;
1478
1479		/*
1480		 * It's a tnode, and we can do some extra checks here if we
1481		 * like, to avoid descending into a dead-end branch.
1482		 * This tnode is in the parent's child array at index
1483		 * key[p_pos..p_pos+p_bits] but potentially with some bits
1484		 * chopped off, so in reality the index may be just a
1485		 * subprefix, padded with zero at the end.
1486		 * We can also take a look at any skipped bits in this
1487		 * tnode - everything up to p_pos is supposed to be ok,
1488		 * and the non-chopped bits of the index (se previous
1489		 * paragraph) are also guaranteed ok, but the rest is
1490		 * considered unknown.
1491		 *
1492		 * The skipped bits are key[pos+bits..cn->pos].
1493		 */
1494
1495		/* If current_prefix_length < pos+bits, we are already doing
1496		 * actual prefix  matching, which means everything from
1497		 * pos+(bits-chopped_off) onward must be zero along some
1498		 * branch of this subtree - otherwise there is *no* valid
1499		 * prefix present. Here we can only check the skipped
1500		 * bits. Remember, since we have already indexed into the
1501		 * parent's child array, we know that the bits we chopped of
1502		 * *are* zero.
1503		 */
1504
1505		/* NOTA BENE: Checking only skipped bits
1506		   for the new node here */
1507
1508		if (current_prefix_length < pos+bits) {
1509			if (tkey_extract_bits(cn->key, current_prefix_length,
1510						cn->pos - current_prefix_length)
1511			    || !(cn->child[0]))
1512				goto backtrace;
1513		}
1514
1515		/*
1516		 * If chopped_off=0, the index is fully validated and we
1517		 * only need to look at the skipped bits for this, the new,
1518		 * tnode. What we actually want to do is to find out if
1519		 * these skipped bits match our key perfectly, or if we will
1520		 * have to count on finding a matching prefix further down,
1521		 * because if we do, we would like to have some way of
1522		 * verifying the existence of such a prefix at this point.
1523		 */
1524
1525		/* The only thing we can do at this point is to verify that
1526		 * any such matching prefix can indeed be a prefix to our
1527		 * key, and if the bits in the node we are inspecting that
1528		 * do not match our key are not ZERO, this cannot be true.
1529		 * Thus, find out where there is a mismatch (before cn->pos)
1530		 * and verify that all the mismatching bits are zero in the
1531		 * new tnode's key.
1532		 */
1533
1534		/*
1535		 * Note: We aren't very concerned about the piece of
1536		 * the key that precede pn->pos+pn->bits, since these
1537		 * have already been checked. The bits after cn->pos
1538		 * aren't checked since these are by definition
1539		 * "unknown" at this point. Thus, what we want to see
1540		 * is if we are about to enter the "prefix matching"
1541		 * state, and in that case verify that the skipped
1542		 * bits that will prevail throughout this subtree are
1543		 * zero, as they have to be if we are to find a
1544		 * matching prefix.
1545		 */
1546
1547		pref_mismatch = mask_pfx(cn->key ^ key, cn->pos);
1548
1549		/*
1550		 * In short: If skipped bits in this node do not match
1551		 * the search key, enter the "prefix matching"
1552		 * state.directly.
1553		 */
1554		if (pref_mismatch) {
1555			int mp = KEYLENGTH - fls(pref_mismatch);
 
1556
1557			if (tkey_extract_bits(cn->key, mp, cn->pos - mp) != 0)
1558				goto backtrace;
1559
1560			if (current_prefix_length >= cn->pos)
1561				current_prefix_length = mp;
1562		}
1563
1564		pn = (struct tnode *)n; /* Descend */
1565		chopped_off = 0;
1566		continue;
1567
1568backtrace:
1569		chopped_off++;
1570
1571		/* As zero don't change the child key (cindex) */
1572		while ((chopped_off <= pn->bits)
1573		       && !(cindex & (1<<(chopped_off-1))))
1574			chopped_off++;
1575
1576		/* Decrease current_... with bits chopped off */
1577		if (current_prefix_length > pn->pos + pn->bits - chopped_off)
1578			current_prefix_length = pn->pos + pn->bits
1579				- chopped_off;
1580
1581		/*
1582		 * Either we do the actual chop off according or if we have
1583		 * chopped off all bits in this tnode walk up to our parent.
1584		 */
1585
1586		if (chopped_off <= pn->bits) {
1587			cindex &= ~(1 << (chopped_off-1));
1588		} else {
1589			struct tnode *parent = node_parent_rcu((struct rt_trie_node *) pn);
1590			if (!parent)
1591				goto failed;
1592
1593			/* Get Child's index */
1594			cindex = tkey_extract_bits(pn->key, parent->pos, parent->bits);
1595			pn = parent;
1596			chopped_off = 0;
1597
1598#ifdef CONFIG_IP_FIB_TRIE_STATS
1599			t->stats.backtrack++;
1600#endif
1601			goto backtrace;
1602		}
1603	}
1604failed:
1605	ret = 1;
1606found:
1607	rcu_read_unlock();
1608	return ret;
1609}
1610EXPORT_SYMBOL_GPL(fib_table_lookup);
1611
1612/*
1613 * Remove the leaf and return parent.
1614 */
1615static void trie_leaf_remove(struct trie *t, struct leaf *l)
1616{
1617	struct tnode *tp = node_parent((struct rt_trie_node *) l);
1618
1619	pr_debug("entering trie_leaf_remove(%p)\n", l);
1620
1621	if (tp) {
1622		t_key cindex = tkey_extract_bits(l->key, tp->pos, tp->bits);
1623		put_child(t, (struct tnode *)tp, cindex, NULL);
1624		trie_rebalance(t, tp);
1625	} else
1626		RCU_INIT_POINTER(t->trie, NULL);
1627
1628	free_leaf(l);
1629}
1630
1631/*
1632 * Caller must hold RTNL.
1633 */
1634int fib_table_delete(struct fib_table *tb, struct fib_config *cfg)
1635{
1636	struct trie *t = (struct trie *) tb->tb_data;
1637	u32 key, mask;
1638	int plen = cfg->fc_dst_len;
1639	u8 tos = cfg->fc_tos;
1640	struct fib_alias *fa, *fa_to_delete;
1641	struct list_head *fa_head;
1642	struct leaf *l;
1643	struct leaf_info *li;
1644
1645	if (plen > 32)
1646		return -EINVAL;
1647
1648	key = ntohl(cfg->fc_dst);
1649	mask = ntohl(inet_make_mask(plen));
1650
1651	if (key & ~mask)
1652		return -EINVAL;
1653
1654	key = key & mask;
1655	l = fib_find_node(t, key);
1656
1657	if (!l)
1658		return -ESRCH;
1659
1660	fa_head = get_fa_head(l, plen);
 
 
 
 
 
1661	fa = fib_find_alias(fa_head, tos, 0);
1662
1663	if (!fa)
1664		return -ESRCH;
1665
1666	pr_debug("Deleting %08x/%d tos=%d t=%p\n", key, plen, tos, t);
1667
1668	fa_to_delete = NULL;
1669	fa = list_entry(fa->fa_list.prev, struct fib_alias, fa_list);
1670	list_for_each_entry_continue(fa, fa_head, fa_list) {
1671		struct fib_info *fi = fa->fa_info;
1672
1673		if (fa->fa_tos != tos)
1674			break;
1675
1676		if ((!cfg->fc_type || fa->fa_type == cfg->fc_type) &&
1677		    (cfg->fc_scope == RT_SCOPE_NOWHERE ||
1678		     fa->fa_info->fib_scope == cfg->fc_scope) &&
1679		    (!cfg->fc_prefsrc ||
1680		     fi->fib_prefsrc == cfg->fc_prefsrc) &&
1681		    (!cfg->fc_protocol ||
1682		     fi->fib_protocol == cfg->fc_protocol) &&
1683		    fib_nh_match(cfg, fi) == 0) {
1684			fa_to_delete = fa;
1685			break;
1686		}
1687	}
1688
1689	if (!fa_to_delete)
1690		return -ESRCH;
1691
1692	fa = fa_to_delete;
1693	rtmsg_fib(RTM_DELROUTE, htonl(key), fa, plen, tb->tb_id,
1694		  &cfg->fc_nlinfo, 0);
1695
1696	l = fib_find_node(t, key);
1697	li = find_leaf_info(l, plen);
1698
1699	list_del_rcu(&fa->fa_list);
1700
1701	if (!plen)
1702		tb->tb_num_default--;
1703
1704	if (list_empty(fa_head)) {
1705		hlist_del_rcu(&li->hlist);
1706		free_leaf_info(li);
1707	}
1708
1709	if (hlist_empty(&l->list))
1710		trie_leaf_remove(t, l);
1711
1712	if (fa->fa_state & FA_S_ACCESSED)
1713		rt_cache_flush(cfg->fc_nlinfo.nl_net, -1);
1714
1715	fib_release_info(fa->fa_info);
1716	alias_free_mem_rcu(fa);
1717	return 0;
1718}
1719
1720static int trie_flush_list(struct list_head *head)
1721{
1722	struct fib_alias *fa, *fa_node;
1723	int found = 0;
1724
1725	list_for_each_entry_safe(fa, fa_node, head, fa_list) {
1726		struct fib_info *fi = fa->fa_info;
1727
1728		if (fi && (fi->fib_flags & RTNH_F_DEAD)) {
1729			list_del_rcu(&fa->fa_list);
1730			fib_release_info(fa->fa_info);
1731			alias_free_mem_rcu(fa);
1732			found++;
1733		}
1734	}
1735	return found;
1736}
1737
1738static int trie_flush_leaf(struct leaf *l)
1739{
1740	int found = 0;
1741	struct hlist_head *lih = &l->list;
1742	struct hlist_node *node, *tmp;
1743	struct leaf_info *li = NULL;
1744
1745	hlist_for_each_entry_safe(li, node, tmp, lih, hlist) {
1746		found += trie_flush_list(&li->falh);
1747
1748		if (list_empty(&li->falh)) {
1749			hlist_del_rcu(&li->hlist);
1750			free_leaf_info(li);
1751		}
1752	}
1753	return found;
1754}
1755
1756/*
1757 * Scan for the next right leaf starting at node p->child[idx]
1758 * Since we have back pointer, no recursion necessary.
1759 */
1760static struct leaf *leaf_walk_rcu(struct tnode *p, struct rt_trie_node *c)
1761{
1762	do {
1763		t_key idx;
1764
1765		if (c)
1766			idx = tkey_extract_bits(c->key, p->pos, p->bits) + 1;
1767		else
1768			idx = 0;
1769
1770		while (idx < 1u << p->bits) {
1771			c = tnode_get_child_rcu(p, idx++);
1772			if (!c)
1773				continue;
1774
1775			if (IS_LEAF(c)) {
1776				prefetch(rcu_dereference_rtnl(p->child[idx]));
1777				return (struct leaf *) c;
1778			}
1779
1780			/* Rescan start scanning in new node */
1781			p = (struct tnode *) c;
1782			idx = 0;
1783		}
1784
1785		/* Node empty, walk back up to parent */
1786		c = (struct rt_trie_node *) p;
1787	} while ((p = node_parent_rcu(c)) != NULL);
1788
1789	return NULL; /* Root of trie */
1790}
1791
1792static struct leaf *trie_firstleaf(struct trie *t)
1793{
1794	struct tnode *n = (struct tnode *)rcu_dereference_rtnl(t->trie);
1795
1796	if (!n)
1797		return NULL;
1798
1799	if (IS_LEAF(n))          /* trie is just a leaf */
1800		return (struct leaf *) n;
1801
1802	return leaf_walk_rcu(n, NULL);
1803}
1804
1805static struct leaf *trie_nextleaf(struct leaf *l)
1806{
1807	struct rt_trie_node *c = (struct rt_trie_node *) l;
1808	struct tnode *p = node_parent_rcu(c);
1809
1810	if (!p)
1811		return NULL;	/* trie with just one leaf */
1812
1813	return leaf_walk_rcu(p, c);
1814}
1815
1816static struct leaf *trie_leafindex(struct trie *t, int index)
1817{
1818	struct leaf *l = trie_firstleaf(t);
1819
1820	while (l && index-- > 0)
1821		l = trie_nextleaf(l);
1822
1823	return l;
1824}
1825
1826
1827/*
1828 * Caller must hold RTNL.
1829 */
1830int fib_table_flush(struct fib_table *tb)
1831{
1832	struct trie *t = (struct trie *) tb->tb_data;
1833	struct leaf *l, *ll = NULL;
1834	int found = 0;
1835
1836	for (l = trie_firstleaf(t); l; l = trie_nextleaf(l)) {
1837		found += trie_flush_leaf(l);
1838
1839		if (ll && hlist_empty(&ll->list))
1840			trie_leaf_remove(t, ll);
1841		ll = l;
1842	}
1843
1844	if (ll && hlist_empty(&ll->list))
1845		trie_leaf_remove(t, ll);
1846
1847	pr_debug("trie_flush found=%d\n", found);
1848	return found;
1849}
1850
1851void fib_free_table(struct fib_table *tb)
1852{
1853	kfree(tb);
1854}
1855
1856static int fn_trie_dump_fa(t_key key, int plen, struct list_head *fah,
1857			   struct fib_table *tb,
1858			   struct sk_buff *skb, struct netlink_callback *cb)
1859{
1860	int i, s_i;
1861	struct fib_alias *fa;
1862	__be32 xkey = htonl(key);
1863
1864	s_i = cb->args[5];
1865	i = 0;
1866
1867	/* rcu_read_lock is hold by caller */
1868
1869	list_for_each_entry_rcu(fa, fah, fa_list) {
1870		if (i < s_i) {
1871			i++;
1872			continue;
1873		}
1874
1875		if (fib_dump_info(skb, NETLINK_CB(cb->skb).pid,
1876				  cb->nlh->nlmsg_seq,
1877				  RTM_NEWROUTE,
1878				  tb->tb_id,
1879				  fa->fa_type,
1880				  xkey,
1881				  plen,
1882				  fa->fa_tos,
1883				  fa->fa_info, NLM_F_MULTI) < 0) {
1884			cb->args[5] = i;
1885			return -1;
1886		}
1887		i++;
1888	}
1889	cb->args[5] = i;
1890	return skb->len;
1891}
1892
1893static int fn_trie_dump_leaf(struct leaf *l, struct fib_table *tb,
1894			struct sk_buff *skb, struct netlink_callback *cb)
1895{
1896	struct leaf_info *li;
1897	struct hlist_node *node;
1898	int i, s_i;
1899
1900	s_i = cb->args[4];
1901	i = 0;
1902
1903	/* rcu_read_lock is hold by caller */
1904	hlist_for_each_entry_rcu(li, node, &l->list, hlist) {
1905		if (i < s_i) {
1906			i++;
1907			continue;
1908		}
1909
1910		if (i > s_i)
1911			cb->args[5] = 0;
1912
1913		if (list_empty(&li->falh))
1914			continue;
1915
1916		if (fn_trie_dump_fa(l->key, li->plen, &li->falh, tb, skb, cb) < 0) {
1917			cb->args[4] = i;
1918			return -1;
1919		}
1920		i++;
1921	}
1922
1923	cb->args[4] = i;
1924	return skb->len;
1925}
1926
1927int fib_table_dump(struct fib_table *tb, struct sk_buff *skb,
1928		   struct netlink_callback *cb)
1929{
1930	struct leaf *l;
1931	struct trie *t = (struct trie *) tb->tb_data;
1932	t_key key = cb->args[2];
1933	int count = cb->args[3];
1934
1935	rcu_read_lock();
1936	/* Dump starting at last key.
1937	 * Note: 0.0.0.0/0 (ie default) is first key.
1938	 */
1939	if (count == 0)
1940		l = trie_firstleaf(t);
1941	else {
1942		/* Normally, continue from last key, but if that is missing
1943		 * fallback to using slow rescan
1944		 */
1945		l = fib_find_node(t, key);
1946		if (!l)
1947			l = trie_leafindex(t, count);
1948	}
1949
1950	while (l) {
1951		cb->args[2] = l->key;
1952		if (fn_trie_dump_leaf(l, tb, skb, cb) < 0) {
1953			cb->args[3] = count;
1954			rcu_read_unlock();
1955			return -1;
1956		}
1957
1958		++count;
1959		l = trie_nextleaf(l);
1960		memset(&cb->args[4], 0,
1961		       sizeof(cb->args) - 4*sizeof(cb->args[0]));
1962	}
1963	cb->args[3] = count;
1964	rcu_read_unlock();
1965
1966	return skb->len;
1967}
1968
1969void __init fib_trie_init(void)
1970{
1971	fn_alias_kmem = kmem_cache_create("ip_fib_alias",
1972					  sizeof(struct fib_alias),
1973					  0, SLAB_PANIC, NULL);
1974
1975	trie_leaf_kmem = kmem_cache_create("ip_fib_trie",
1976					   max(sizeof(struct leaf),
1977					       sizeof(struct leaf_info)),
1978					   0, SLAB_PANIC, NULL);
1979}
1980
1981
1982struct fib_table *fib_trie_table(u32 id)
1983{
1984	struct fib_table *tb;
1985	struct trie *t;
1986
1987	tb = kmalloc(sizeof(struct fib_table) + sizeof(struct trie),
1988		     GFP_KERNEL);
1989	if (tb == NULL)
1990		return NULL;
1991
1992	tb->tb_id = id;
1993	tb->tb_default = -1;
1994	tb->tb_num_default = 0;
1995
1996	t = (struct trie *) tb->tb_data;
1997	memset(t, 0, sizeof(*t));
1998
1999	return tb;
2000}
2001
2002#ifdef CONFIG_PROC_FS
2003/* Depth first Trie walk iterator */
2004struct fib_trie_iter {
2005	struct seq_net_private p;
2006	struct fib_table *tb;
2007	struct tnode *tnode;
2008	unsigned int index;
2009	unsigned int depth;
2010};
2011
2012static struct rt_trie_node *fib_trie_get_next(struct fib_trie_iter *iter)
2013{
2014	struct tnode *tn = iter->tnode;
2015	unsigned int cindex = iter->index;
2016	struct tnode *p;
2017
2018	/* A single entry routing table */
2019	if (!tn)
2020		return NULL;
2021
2022	pr_debug("get_next iter={node=%p index=%d depth=%d}\n",
2023		 iter->tnode, iter->index, iter->depth);
2024rescan:
2025	while (cindex < (1<<tn->bits)) {
2026		struct rt_trie_node *n = tnode_get_child_rcu(tn, cindex);
2027
2028		if (n) {
2029			if (IS_LEAF(n)) {
2030				iter->tnode = tn;
2031				iter->index = cindex + 1;
2032			} else {
2033				/* push down one level */
2034				iter->tnode = (struct tnode *) n;
2035				iter->index = 0;
2036				++iter->depth;
2037			}
2038			return n;
2039		}
2040
2041		++cindex;
2042	}
2043
2044	/* Current node exhausted, pop back up */
2045	p = node_parent_rcu((struct rt_trie_node *)tn);
2046	if (p) {
2047		cindex = tkey_extract_bits(tn->key, p->pos, p->bits)+1;
2048		tn = p;
2049		--iter->depth;
2050		goto rescan;
2051	}
2052
2053	/* got root? */
2054	return NULL;
2055}
2056
2057static struct rt_trie_node *fib_trie_get_first(struct fib_trie_iter *iter,
2058				       struct trie *t)
2059{
2060	struct rt_trie_node *n;
2061
2062	if (!t)
2063		return NULL;
2064
2065	n = rcu_dereference(t->trie);
2066	if (!n)
2067		return NULL;
2068
2069	if (IS_TNODE(n)) {
2070		iter->tnode = (struct tnode *) n;
2071		iter->index = 0;
2072		iter->depth = 1;
2073	} else {
2074		iter->tnode = NULL;
2075		iter->index = 0;
2076		iter->depth = 0;
2077	}
2078
2079	return n;
2080}
2081
2082static void trie_collect_stats(struct trie *t, struct trie_stat *s)
2083{
2084	struct rt_trie_node *n;
2085	struct fib_trie_iter iter;
2086
2087	memset(s, 0, sizeof(*s));
2088
2089	rcu_read_lock();
2090	for (n = fib_trie_get_first(&iter, t); n; n = fib_trie_get_next(&iter)) {
2091		if (IS_LEAF(n)) {
2092			struct leaf *l = (struct leaf *)n;
2093			struct leaf_info *li;
2094			struct hlist_node *tmp;
2095
2096			s->leaves++;
2097			s->totdepth += iter.depth;
2098			if (iter.depth > s->maxdepth)
2099				s->maxdepth = iter.depth;
2100
2101			hlist_for_each_entry_rcu(li, tmp, &l->list, hlist)
2102				++s->prefixes;
2103		} else {
2104			const struct tnode *tn = (const struct tnode *) n;
2105			int i;
2106
2107			s->tnodes++;
2108			if (tn->bits < MAX_STAT_DEPTH)
2109				s->nodesizes[tn->bits]++;
2110
2111			for (i = 0; i < (1<<tn->bits); i++)
2112				if (!tn->child[i])
2113					s->nullpointers++;
2114		}
2115	}
2116	rcu_read_unlock();
2117}
2118
2119/*
2120 *	This outputs /proc/net/fib_triestats
2121 */
2122static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat)
2123{
2124	unsigned int i, max, pointers, bytes, avdepth;
2125
2126	if (stat->leaves)
2127		avdepth = stat->totdepth*100 / stat->leaves;
2128	else
2129		avdepth = 0;
2130
2131	seq_printf(seq, "\tAver depth:     %u.%02d\n",
2132		   avdepth / 100, avdepth % 100);
2133	seq_printf(seq, "\tMax depth:      %u\n", stat->maxdepth);
2134
2135	seq_printf(seq, "\tLeaves:         %u\n", stat->leaves);
2136	bytes = sizeof(struct leaf) * stat->leaves;
2137
2138	seq_printf(seq, "\tPrefixes:       %u\n", stat->prefixes);
2139	bytes += sizeof(struct leaf_info) * stat->prefixes;
2140
2141	seq_printf(seq, "\tInternal nodes: %u\n\t", stat->tnodes);
2142	bytes += sizeof(struct tnode) * stat->tnodes;
2143
2144	max = MAX_STAT_DEPTH;
2145	while (max > 0 && stat->nodesizes[max-1] == 0)
2146		max--;
2147
2148	pointers = 0;
2149	for (i = 1; i <= max; i++)
2150		if (stat->nodesizes[i] != 0) {
2151			seq_printf(seq, "  %u: %u",  i, stat->nodesizes[i]);
2152			pointers += (1<<i) * stat->nodesizes[i];
2153		}
2154	seq_putc(seq, '\n');
2155	seq_printf(seq, "\tPointers: %u\n", pointers);
2156
2157	bytes += sizeof(struct rt_trie_node *) * pointers;
2158	seq_printf(seq, "Null ptrs: %u\n", stat->nullpointers);
2159	seq_printf(seq, "Total size: %u  kB\n", (bytes + 1023) / 1024);
2160}
2161
2162#ifdef CONFIG_IP_FIB_TRIE_STATS
2163static void trie_show_usage(struct seq_file *seq,
2164			    const struct trie_use_stats *stats)
2165{
2166	seq_printf(seq, "\nCounters:\n---------\n");
2167	seq_printf(seq, "gets = %u\n", stats->gets);
2168	seq_printf(seq, "backtracks = %u\n", stats->backtrack);
2169	seq_printf(seq, "semantic match passed = %u\n",
2170		   stats->semantic_match_passed);
2171	seq_printf(seq, "semantic match miss = %u\n",
2172		   stats->semantic_match_miss);
2173	seq_printf(seq, "null node hit= %u\n", stats->null_node_hit);
2174	seq_printf(seq, "skipped node resize = %u\n\n",
2175		   stats->resize_node_skipped);
2176}
2177#endif /*  CONFIG_IP_FIB_TRIE_STATS */
2178
2179static void fib_table_print(struct seq_file *seq, struct fib_table *tb)
2180{
2181	if (tb->tb_id == RT_TABLE_LOCAL)
2182		seq_puts(seq, "Local:\n");
2183	else if (tb->tb_id == RT_TABLE_MAIN)
2184		seq_puts(seq, "Main:\n");
2185	else
2186		seq_printf(seq, "Id %d:\n", tb->tb_id);
2187}
2188
2189
2190static int fib_triestat_seq_show(struct seq_file *seq, void *v)
2191{
2192	struct net *net = (struct net *)seq->private;
2193	unsigned int h;
2194
2195	seq_printf(seq,
2196		   "Basic info: size of leaf:"
2197		   " %Zd bytes, size of tnode: %Zd bytes.\n",
2198		   sizeof(struct leaf), sizeof(struct tnode));
2199
2200	for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
2201		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2202		struct hlist_node *node;
2203		struct fib_table *tb;
2204
2205		hlist_for_each_entry_rcu(tb, node, head, tb_hlist) {
2206			struct trie *t = (struct trie *) tb->tb_data;
2207			struct trie_stat stat;
2208
2209			if (!t)
2210				continue;
2211
2212			fib_table_print(seq, tb);
2213
2214			trie_collect_stats(t, &stat);
2215			trie_show_stats(seq, &stat);
2216#ifdef CONFIG_IP_FIB_TRIE_STATS
2217			trie_show_usage(seq, &t->stats);
2218#endif
2219		}
2220	}
2221
2222	return 0;
2223}
2224
2225static int fib_triestat_seq_open(struct inode *inode, struct file *file)
2226{
2227	return single_open_net(inode, file, fib_triestat_seq_show);
2228}
2229
2230static const struct file_operations fib_triestat_fops = {
2231	.owner	= THIS_MODULE,
2232	.open	= fib_triestat_seq_open,
2233	.read	= seq_read,
2234	.llseek	= seq_lseek,
2235	.release = single_release_net,
2236};
2237
2238static struct rt_trie_node *fib_trie_get_idx(struct seq_file *seq, loff_t pos)
2239{
2240	struct fib_trie_iter *iter = seq->private;
2241	struct net *net = seq_file_net(seq);
2242	loff_t idx = 0;
2243	unsigned int h;
2244
2245	for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
2246		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2247		struct hlist_node *node;
2248		struct fib_table *tb;
2249
2250		hlist_for_each_entry_rcu(tb, node, head, tb_hlist) {
2251			struct rt_trie_node *n;
2252
2253			for (n = fib_trie_get_first(iter,
2254						    (struct trie *) tb->tb_data);
2255			     n; n = fib_trie_get_next(iter))
2256				if (pos == idx++) {
2257					iter->tb = tb;
2258					return n;
2259				}
2260		}
2261	}
2262
2263	return NULL;
2264}
2265
2266static void *fib_trie_seq_start(struct seq_file *seq, loff_t *pos)
2267	__acquires(RCU)
2268{
2269	rcu_read_lock();
2270	return fib_trie_get_idx(seq, *pos);
2271}
2272
2273static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2274{
2275	struct fib_trie_iter *iter = seq->private;
2276	struct net *net = seq_file_net(seq);
2277	struct fib_table *tb = iter->tb;
2278	struct hlist_node *tb_node;
2279	unsigned int h;
2280	struct rt_trie_node *n;
2281
2282	++*pos;
2283	/* next node in same table */
2284	n = fib_trie_get_next(iter);
2285	if (n)
2286		return n;
2287
2288	/* walk rest of this hash chain */
2289	h = tb->tb_id & (FIB_TABLE_HASHSZ - 1);
2290	while ((tb_node = rcu_dereference(hlist_next_rcu(&tb->tb_hlist)))) {
2291		tb = hlist_entry(tb_node, struct fib_table, tb_hlist);
2292		n = fib_trie_get_first(iter, (struct trie *) tb->tb_data);
2293		if (n)
2294			goto found;
2295	}
2296
2297	/* new hash chain */
2298	while (++h < FIB_TABLE_HASHSZ) {
2299		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2300		hlist_for_each_entry_rcu(tb, tb_node, head, tb_hlist) {
2301			n = fib_trie_get_first(iter, (struct trie *) tb->tb_data);
2302			if (n)
2303				goto found;
2304		}
2305	}
2306	return NULL;
2307
2308found:
2309	iter->tb = tb;
2310	return n;
2311}
2312
2313static void fib_trie_seq_stop(struct seq_file *seq, void *v)
2314	__releases(RCU)
2315{
2316	rcu_read_unlock();
2317}
2318
2319static void seq_indent(struct seq_file *seq, int n)
2320{
2321	while (n-- > 0)
2322		seq_puts(seq, "   ");
2323}
2324
2325static inline const char *rtn_scope(char *buf, size_t len, enum rt_scope_t s)
2326{
2327	switch (s) {
2328	case RT_SCOPE_UNIVERSE: return "universe";
2329	case RT_SCOPE_SITE:	return "site";
2330	case RT_SCOPE_LINK:	return "link";
2331	case RT_SCOPE_HOST:	return "host";
2332	case RT_SCOPE_NOWHERE:	return "nowhere";
2333	default:
2334		snprintf(buf, len, "scope=%d", s);
2335		return buf;
2336	}
2337}
2338
2339static const char *const rtn_type_names[__RTN_MAX] = {
2340	[RTN_UNSPEC] = "UNSPEC",
2341	[RTN_UNICAST] = "UNICAST",
2342	[RTN_LOCAL] = "LOCAL",
2343	[RTN_BROADCAST] = "BROADCAST",
2344	[RTN_ANYCAST] = "ANYCAST",
2345	[RTN_MULTICAST] = "MULTICAST",
2346	[RTN_BLACKHOLE] = "BLACKHOLE",
2347	[RTN_UNREACHABLE] = "UNREACHABLE",
2348	[RTN_PROHIBIT] = "PROHIBIT",
2349	[RTN_THROW] = "THROW",
2350	[RTN_NAT] = "NAT",
2351	[RTN_XRESOLVE] = "XRESOLVE",
2352};
2353
2354static inline const char *rtn_type(char *buf, size_t len, unsigned int t)
2355{
2356	if (t < __RTN_MAX && rtn_type_names[t])
2357		return rtn_type_names[t];
2358	snprintf(buf, len, "type %u", t);
2359	return buf;
2360}
2361
2362/* Pretty print the trie */
2363static int fib_trie_seq_show(struct seq_file *seq, void *v)
2364{
2365	const struct fib_trie_iter *iter = seq->private;
2366	struct rt_trie_node *n = v;
2367
2368	if (!node_parent_rcu(n))
2369		fib_table_print(seq, iter->tb);
2370
2371	if (IS_TNODE(n)) {
2372		struct tnode *tn = (struct tnode *) n;
2373		__be32 prf = htonl(mask_pfx(tn->key, tn->pos));
2374
2375		seq_indent(seq, iter->depth-1);
2376		seq_printf(seq, "  +-- %pI4/%d %d %d %d\n",
2377			   &prf, tn->pos, tn->bits, tn->full_children,
2378			   tn->empty_children);
2379
2380	} else {
2381		struct leaf *l = (struct leaf *) n;
2382		struct leaf_info *li;
2383		struct hlist_node *node;
2384		__be32 val = htonl(l->key);
2385
2386		seq_indent(seq, iter->depth);
2387		seq_printf(seq, "  |-- %pI4\n", &val);
2388
2389		hlist_for_each_entry_rcu(li, node, &l->list, hlist) {
2390			struct fib_alias *fa;
2391
2392			list_for_each_entry_rcu(fa, &li->falh, fa_list) {
2393				char buf1[32], buf2[32];
2394
2395				seq_indent(seq, iter->depth+1);
2396				seq_printf(seq, "  /%d %s %s", li->plen,
2397					   rtn_scope(buf1, sizeof(buf1),
2398						     fa->fa_info->fib_scope),
2399					   rtn_type(buf2, sizeof(buf2),
2400						    fa->fa_type));
2401				if (fa->fa_tos)
2402					seq_printf(seq, " tos=%d", fa->fa_tos);
2403				seq_putc(seq, '\n');
2404			}
2405		}
2406	}
2407
2408	return 0;
2409}
2410
2411static const struct seq_operations fib_trie_seq_ops = {
2412	.start  = fib_trie_seq_start,
2413	.next   = fib_trie_seq_next,
2414	.stop   = fib_trie_seq_stop,
2415	.show   = fib_trie_seq_show,
2416};
2417
2418static int fib_trie_seq_open(struct inode *inode, struct file *file)
2419{
2420	return seq_open_net(inode, file, &fib_trie_seq_ops,
2421			    sizeof(struct fib_trie_iter));
2422}
2423
2424static const struct file_operations fib_trie_fops = {
2425	.owner  = THIS_MODULE,
2426	.open   = fib_trie_seq_open,
2427	.read   = seq_read,
2428	.llseek = seq_lseek,
2429	.release = seq_release_net,
2430};
2431
2432struct fib_route_iter {
2433	struct seq_net_private p;
2434	struct trie *main_trie;
2435	loff_t	pos;
2436	t_key	key;
2437};
2438
2439static struct leaf *fib_route_get_idx(struct fib_route_iter *iter, loff_t pos)
2440{
2441	struct leaf *l = NULL;
2442	struct trie *t = iter->main_trie;
2443
2444	/* use cache location of last found key */
2445	if (iter->pos > 0 && pos >= iter->pos && (l = fib_find_node(t, iter->key)))
2446		pos -= iter->pos;
2447	else {
2448		iter->pos = 0;
2449		l = trie_firstleaf(t);
2450	}
2451
2452	while (l && pos-- > 0) {
2453		iter->pos++;
2454		l = trie_nextleaf(l);
2455	}
2456
2457	if (l)
2458		iter->key = pos;	/* remember it */
2459	else
2460		iter->pos = 0;		/* forget it */
2461
2462	return l;
2463}
2464
2465static void *fib_route_seq_start(struct seq_file *seq, loff_t *pos)
2466	__acquires(RCU)
2467{
2468	struct fib_route_iter *iter = seq->private;
2469	struct fib_table *tb;
2470
2471	rcu_read_lock();
2472	tb = fib_get_table(seq_file_net(seq), RT_TABLE_MAIN);
2473	if (!tb)
2474		return NULL;
2475
2476	iter->main_trie = (struct trie *) tb->tb_data;
2477	if (*pos == 0)
2478		return SEQ_START_TOKEN;
2479	else
2480		return fib_route_get_idx(iter, *pos - 1);
2481}
2482
2483static void *fib_route_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2484{
2485	struct fib_route_iter *iter = seq->private;
2486	struct leaf *l = v;
2487
2488	++*pos;
2489	if (v == SEQ_START_TOKEN) {
2490		iter->pos = 0;
2491		l = trie_firstleaf(iter->main_trie);
2492	} else {
2493		iter->pos++;
2494		l = trie_nextleaf(l);
2495	}
2496
2497	if (l)
2498		iter->key = l->key;
2499	else
2500		iter->pos = 0;
2501	return l;
2502}
2503
2504static void fib_route_seq_stop(struct seq_file *seq, void *v)
2505	__releases(RCU)
2506{
2507	rcu_read_unlock();
2508}
2509
2510static unsigned int fib_flag_trans(int type, __be32 mask, const struct fib_info *fi)
2511{
2512	unsigned int flags = 0;
2513
2514	if (type == RTN_UNREACHABLE || type == RTN_PROHIBIT)
2515		flags = RTF_REJECT;
2516	if (fi && fi->fib_nh->nh_gw)
2517		flags |= RTF_GATEWAY;
2518	if (mask == htonl(0xFFFFFFFF))
2519		flags |= RTF_HOST;
2520	flags |= RTF_UP;
2521	return flags;
2522}
2523
2524/*
2525 *	This outputs /proc/net/route.
2526 *	The format of the file is not supposed to be changed
2527 *	and needs to be same as fib_hash output to avoid breaking
2528 *	legacy utilities
2529 */
2530static int fib_route_seq_show(struct seq_file *seq, void *v)
2531{
2532	struct leaf *l = v;
2533	struct leaf_info *li;
2534	struct hlist_node *node;
2535
2536	if (v == SEQ_START_TOKEN) {
2537		seq_printf(seq, "%-127s\n", "Iface\tDestination\tGateway "
2538			   "\tFlags\tRefCnt\tUse\tMetric\tMask\t\tMTU"
2539			   "\tWindow\tIRTT");
2540		return 0;
2541	}
2542
2543	hlist_for_each_entry_rcu(li, node, &l->list, hlist) {
2544		struct fib_alias *fa;
2545		__be32 mask, prefix;
2546
2547		mask = inet_make_mask(li->plen);
2548		prefix = htonl(l->key);
2549
2550		list_for_each_entry_rcu(fa, &li->falh, fa_list) {
2551			const struct fib_info *fi = fa->fa_info;
2552			unsigned int flags = fib_flag_trans(fa->fa_type, mask, fi);
2553			int len;
2554
2555			if (fa->fa_type == RTN_BROADCAST
2556			    || fa->fa_type == RTN_MULTICAST)
2557				continue;
2558
 
 
2559			if (fi)
2560				seq_printf(seq,
2561					 "%s\t%08X\t%08X\t%04X\t%d\t%u\t"
2562					 "%d\t%08X\t%d\t%u\t%u%n",
2563					 fi->fib_dev ? fi->fib_dev->name : "*",
2564					 prefix,
2565					 fi->fib_nh->nh_gw, flags, 0, 0,
2566					 fi->fib_priority,
2567					 mask,
2568					 (fi->fib_advmss ?
2569					  fi->fib_advmss + 40 : 0),
2570					 fi->fib_window,
2571					 fi->fib_rtt >> 3, &len);
2572			else
2573				seq_printf(seq,
2574					 "*\t%08X\t%08X\t%04X\t%d\t%u\t"
2575					 "%d\t%08X\t%d\t%u\t%u%n",
2576					 prefix, 0, flags, 0, 0, 0,
2577					 mask, 0, 0, 0, &len);
2578
2579			seq_printf(seq, "%*s\n", 127 - len, "");
2580		}
2581	}
2582
2583	return 0;
2584}
2585
2586static const struct seq_operations fib_route_seq_ops = {
2587	.start  = fib_route_seq_start,
2588	.next   = fib_route_seq_next,
2589	.stop   = fib_route_seq_stop,
2590	.show   = fib_route_seq_show,
2591};
2592
2593static int fib_route_seq_open(struct inode *inode, struct file *file)
2594{
2595	return seq_open_net(inode, file, &fib_route_seq_ops,
2596			    sizeof(struct fib_route_iter));
2597}
2598
2599static const struct file_operations fib_route_fops = {
2600	.owner  = THIS_MODULE,
2601	.open   = fib_route_seq_open,
2602	.read   = seq_read,
2603	.llseek = seq_lseek,
2604	.release = seq_release_net,
2605};
2606
2607int __net_init fib_proc_init(struct net *net)
2608{
2609	if (!proc_net_fops_create(net, "fib_trie", S_IRUGO, &fib_trie_fops))
2610		goto out1;
2611
2612	if (!proc_net_fops_create(net, "fib_triestat", S_IRUGO,
2613				  &fib_triestat_fops))
2614		goto out2;
2615
2616	if (!proc_net_fops_create(net, "route", S_IRUGO, &fib_route_fops))
2617		goto out3;
2618
2619	return 0;
2620
2621out3:
2622	proc_net_remove(net, "fib_triestat");
2623out2:
2624	proc_net_remove(net, "fib_trie");
2625out1:
2626	return -ENOMEM;
2627}
2628
2629void __net_exit fib_proc_exit(struct net *net)
2630{
2631	proc_net_remove(net, "fib_trie");
2632	proc_net_remove(net, "fib_triestat");
2633	proc_net_remove(net, "route");
2634}
2635
2636#endif /* CONFIG_PROC_FS */