fib_trie.c 60.3 KB
Newer Older
1 2 3 4 5 6 7 8 9
/*
 *   This program is free software; you can redistribute it and/or
 *   modify it under the terms of the GNU General Public License
 *   as published by the Free Software Foundation; either version
 *   2 of the License, or (at your option) any later version.
 *
 *   Robert Olsson <robert.olsson@its.uu.se> Uppsala Universitet
 *     & Swedish University of Agricultural Sciences.
 *
10
 *   Jens Laas <jens.laas@data.slu.se> Swedish University of
11
 *     Agricultural Sciences.
12
 *
13 14
 *   Hans Liss <hans.liss@its.uu.se>  Uppsala Universitet
 *
L
Lucas De Marchi 已提交
15
 * This work is based on the LPC-trie which is originally described in:
16
 *
17 18
 * An experimental study of compression methods for dynamic tries
 * Stefan Nilsson and Matti Tikkanen. Algorithmica, 33(1):19-33, 2002.
19
 * http://www.csc.kth.se/~snilsson/software/dyntrie2/
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
 *
 *
 * IP-address lookup using LC-tries. Stefan Nilsson and Gunnar Karlsson
 * IEEE Journal on Selected Areas in Communications, 17(6):1083-1092, June 1999
 *
 *
 * Code from fib_hash has been reused which includes the following header:
 *
 *
 * INET		An implementation of the TCP/IP protocol suite for the LINUX
 *		operating system.  INET is implemented using the  BSD Socket
 *		interface as the means of communication with the user level.
 *
 *		IPv4 FIB: lookup engine and maintenance routines.
 *
 *
 * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
 *
 *		This program is free software; you can redistribute it and/or
 *		modify it under the terms of the GNU General Public License
 *		as published by the Free Software Foundation; either version
 *		2 of the License, or (at your option) any later version.
R
Robert Olsson 已提交
42 43 44 45 46 47 48
 *
 * Substantial contributions to this work comes from:
 *
 *		David S. Miller, <davem@davemloft.net>
 *		Stephen Hemminger <shemminger@osdl.org>
 *		Paul E. McKenney <paulmck@us.ibm.com>
 *		Patrick McHardy <kaber@trash.net>
49 50
 */

J
Jens Låås 已提交
51
#define VERSION "0.409"
52 53

#include <asm/uaccess.h>
J
Jiri Slaby 已提交
54
#include <linux/bitops.h>
55 56 57 58 59 60 61 62 63
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/string.h>
#include <linux/socket.h>
#include <linux/sockios.h>
#include <linux/errno.h>
#include <linux/in.h>
#include <linux/inet.h>
S
Stephen Hemminger 已提交
64
#include <linux/inetdevice.h>
65 66 67
#include <linux/netdevice.h>
#include <linux/if_arp.h>
#include <linux/proc_fs.h>
R
Robert Olsson 已提交
68
#include <linux/rcupdate.h>
69 70 71 72
#include <linux/skbuff.h>
#include <linux/netlink.h>
#include <linux/init.h>
#include <linux/list.h>
73
#include <linux/slab.h>
74
#include <linux/export.h>
75
#include <net/net_namespace.h>
76 77 78 79 80 81
#include <net/ip.h>
#include <net/protocol.h>
#include <net/route.h>
#include <net/tcp.h>
#include <net/sock.h>
#include <net/ip_fib.h>
82
#include <net/switchdev.h>
83 84
#include "fib_lookup.h"

R
Robert Olsson 已提交
85
#define MAX_STAT_DEPTH 32
86

87 88
#define KEYLENGTH	(8*sizeof(t_key))
#define KEY_MAX		((t_key)~0)
89 90 91

typedef unsigned int t_key;

92 93 94
#define IS_TRIE(n)	((n)->pos >= KEYLENGTH)
#define IS_TNODE(n)	((n)->bits)
#define IS_LEAF(n)	(!(n)->bits)
R
Robert Olsson 已提交
95

96
struct key_vector {
97 98
	t_key key;
	unsigned char pos;		/* 2log(KEYLENGTH) bits needed */
99
	unsigned char bits;		/* 2log(KEYLENGTH) bits needed */
100
	unsigned char slen;
A
Alexander Duyck 已提交
101
	union {
102
		/* This list pointer if valid if (pos | bits) == 0 (LEAF) */
A
Alexander Duyck 已提交
103
		struct hlist_head leaf;
104
		/* This array is valid if (pos | bits) > 0 (TNODE) */
105
		struct key_vector __rcu *tnode[0];
A
Alexander Duyck 已提交
106
	};
107 108
};

109
struct tnode {
110
	struct rcu_head rcu;
111 112
	t_key empty_children;		/* KEYLENGTH bits needed */
	t_key full_children;		/* KEYLENGTH bits needed */
113
	struct key_vector __rcu *parent;
114
	struct key_vector kv[1];
115
#define tn_bits kv[0].bits
116 117 118
};

#define TNODE_SIZE(n)	offsetof(struct tnode, kv[0].tnode[n])
119 120
#define LEAF_SIZE	TNODE_SIZE(1)

121 122 123 124 125 126 127
#ifdef CONFIG_IP_FIB_TRIE_STATS
struct trie_use_stats {
	unsigned int gets;
	unsigned int backtrack;
	unsigned int semantic_match_passed;
	unsigned int semantic_match_miss;
	unsigned int null_node_hit;
128
	unsigned int resize_node_skipped;
129 130 131 132 133 134 135 136 137
};
#endif

struct trie_stat {
	unsigned int totdepth;
	unsigned int maxdepth;
	unsigned int tnodes;
	unsigned int leaves;
	unsigned int nullpointers;
138
	unsigned int prefixes;
R
Robert Olsson 已提交
139
	unsigned int nodesizes[MAX_STAT_DEPTH];
140
};
141 142

struct trie {
143
	struct key_vector kv[1];
144
#ifdef CONFIG_IP_FIB_TRIE_STATS
145
	struct trie_use_stats __percpu *stats;
146 147 148
#endif
};

149
static struct key_vector *resize(struct trie *t, struct key_vector *tn);
150 151 152 153 154 155 156 157
static size_t tnode_free_size;

/*
 * synchronize_rcu after call_rcu for that many pages; it should be especially
 * useful before resizing the root node with PREEMPT_NONE configs; the value was
 * obtained experimentally, aiming to avoid visible slowdown.
 */
static const int sync_pages = 128;
158

159
static struct kmem_cache *fn_alias_kmem __read_mostly;
160
static struct kmem_cache *trie_leaf_kmem __read_mostly;
161

162 163 164 165 166
static inline struct tnode *tn_info(struct key_vector *kv)
{
	return container_of(kv, struct tnode, kv[0]);
}

167
/* caller must hold RTNL */
168
#define node_parent(tn) rtnl_dereference(tn_info(tn)->parent)
169
#define get_child(tn, i) rtnl_dereference((tn)->tnode[i])
E
Eric Dumazet 已提交
170

171
/* caller must hold RCU read lock or RTNL */
172
#define node_parent_rcu(tn) rcu_dereference_rtnl(tn_info(tn)->parent)
173
#define get_child_rcu(tn, i) rcu_dereference_rtnl((tn)->tnode[i])
E
Eric Dumazet 已提交
174

175
/* wrapper for rcu_assign_pointer */
176
static inline void node_set_parent(struct key_vector *n, struct key_vector *tp)
177
{
A
Alexander Duyck 已提交
178
	if (n)
179
		rcu_assign_pointer(tn_info(n)->parent, tp);
S
Stephen Hemminger 已提交
180 181
}

182
#define NODE_INIT_PARENT(n, p) RCU_INIT_POINTER(tn_info(n)->parent, p)
183 184 185

/* This provides us with the number of children in this node, in the case of a
 * leaf this will return 0 meaning none of the children are accessible.
186
 */
187
static inline unsigned long child_length(const struct key_vector *tn)
S
Stephen Hemminger 已提交
188
{
189
	return (1ul << tn->bits) & ~(1ul);
S
Stephen Hemminger 已提交
190
}
R
Robert Olsson 已提交
191

192 193
#define get_cindex(key, kv) (((key) ^ (kv)->key) >> (kv)->pos)

194 195 196 197
static inline unsigned long get_index(t_key key, struct key_vector *kv)
{
	unsigned long index = key ^ kv->key;

198 199 200
	if ((BITS_PER_LONG <= KEYLENGTH) && (KEYLENGTH == kv->pos))
		return 0;

201 202 203
	return index >> kv->pos;
}

204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
/* To understand this stuff, an understanding of keys and all their bits is
 * necessary. Every node in the trie has a key associated with it, but not
 * all of the bits in that key are significant.
 *
 * Consider a node 'n' and its parent 'tp'.
 *
 * If n is a leaf, every bit in its key is significant. Its presence is
 * necessitated by path compression, since during a tree traversal (when
 * searching for a leaf - unless we are doing an insertion) we will completely
 * ignore all skipped bits we encounter. Thus we need to verify, at the end of
 * a potentially successful search, that we have indeed been walking the
 * correct key path.
 *
 * Note that we can never "miss" the correct key in the tree if present by
 * following the wrong path. Path compression ensures that segments of the key
 * that are the same for all keys with a given prefix are skipped, but the
 * skipped part *is* identical for each node in the subtrie below the skipped
 * bit! trie_insert() in this implementation takes care of that.
 *
 * if n is an internal node - a 'tnode' here, the various parts of its key
 * have many different meanings.
 *
 * Example:
 * _________________________________________________________________
 * | i | i | i | i | i | i | i | N | N | N | S | S | S | S | S | C |
 * -----------------------------------------------------------------
 *  31  30  29  28  27  26  25  24  23  22  21  20  19  18  17  16
 *
 * _________________________________________________________________
 * | C | C | C | u | u | u | u | u | u | u | u | u | u | u | u | u |
 * -----------------------------------------------------------------
 *  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0
 *
 * tp->pos = 22
 * tp->bits = 3
 * n->pos = 13
 * n->bits = 4
 *
 * First, let's just ignore the bits that come before the parent tp, that is
 * the bits from (tp->pos + tp->bits) to 31. They are *known* but at this
 * point we do not use them for anything.
 *
 * The bits from (tp->pos) to (tp->pos + tp->bits - 1) - "N", above - are the
 * index into the parent's child array. That is, they will be used to find
 * 'n' among tp's children.
 *
 * The bits from (n->pos + n->bits) to (tn->pos - 1) - "S" - are skipped bits
 * for the node n.
 *
 * All the bits we have seen so far are significant to the node n. The rest
 * of the bits are really not needed or indeed known in n->key.
 *
 * The bits from (n->pos) to (n->pos + n->bits - 1) - "C" - are the index into
 * n's child array, and will of course be different for each child.
 *
 * The rest of the bits, from 0 to (n->pos + n->bits), are completely unknown
 * at this point.
 */
262

263 264
static const int halve_threshold = 25;
static const int inflate_threshold = 50;
265
static const int halve_threshold_root = 15;
J
Jens Låås 已提交
266
static const int inflate_threshold_root = 30;
R
Robert Olsson 已提交
267 268

static void __alias_free_mem(struct rcu_head *head)
269
{
R
Robert Olsson 已提交
270 271
	struct fib_alias *fa = container_of(head, struct fib_alias, rcu);
	kmem_cache_free(fn_alias_kmem, fa);
272 273
}

R
Robert Olsson 已提交
274
static inline void alias_free_mem_rcu(struct fib_alias *fa)
275
{
R
Robert Olsson 已提交
276 277
	call_rcu(&fa->rcu, __alias_free_mem);
}
O
Olof Johansson 已提交
278

279
#define TNODE_KMALLOC_MAX \
280
	ilog2((PAGE_SIZE - TNODE_SIZE(0)) / sizeof(struct key_vector *))
281
#define TNODE_VMALLOC_MAX \
282
	ilog2((SIZE_MAX - TNODE_SIZE(0)) / sizeof(struct key_vector *))
O
Olof Johansson 已提交
283

284
static void __node_free_rcu(struct rcu_head *head)
285
{
286
	struct tnode *n = container_of(head, struct tnode, rcu);
287

288
	if (!n->tn_bits)
289
		kmem_cache_free(trie_leaf_kmem, n);
290
	else if (n->tn_bits <= TNODE_KMALLOC_MAX)
291 292 293
		kfree(n);
	else
		vfree(n);
294 295
}

296
#define node_free(n) call_rcu(&tn_info(n)->rcu, __node_free_rcu)
297

298
static struct tnode *tnode_alloc(int bits)
299
{
300 301 302 303 304 305 306 307 308
	size_t size;

	/* verify bits is within bounds */
	if (bits > TNODE_VMALLOC_MAX)
		return NULL;

	/* determine size and verify it is non-zero and didn't overflow */
	size = TNODE_SIZE(1ul << bits);

R
Robert Olsson 已提交
309
	if (size <= PAGE_SIZE)
310
		return kzalloc(size, GFP_KERNEL);
311
	else
312
		return vzalloc(size);
313
}
R
Robert Olsson 已提交
314

315
static inline void empty_child_inc(struct key_vector *n)
316
{
317
	++tn_info(n)->empty_children ? : ++tn_info(n)->full_children;
318 319
}

320
static inline void empty_child_dec(struct key_vector *n)
321
{
322
	tn_info(n)->empty_children-- ? : tn_info(n)->full_children--;
323 324
}

325
static struct key_vector *leaf_new(t_key key, struct fib_alias *fa)
R
Robert Olsson 已提交
326
{
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
	struct tnode *kv = kmem_cache_alloc(trie_leaf_kmem, GFP_KERNEL);
	struct key_vector *l = kv->kv;

	if (!kv)
		return NULL;

	/* initialize key vector */
	l->key = key;
	l->pos = 0;
	l->bits = 0;
	l->slen = fa->fa_slen;

	/* link leaf to fib alias */
	INIT_HLIST_HEAD(&l->leaf);
	hlist_add_head(&fa->fa_list, &l->leaf);

R
Robert Olsson 已提交
343 344 345
	return l;
}

346
static struct key_vector *tnode_new(t_key key, int pos, int bits)
347
{
348
	struct tnode *tnode = tnode_alloc(bits);
349
	unsigned int shift = pos + bits;
350
	struct key_vector *tn = tnode->kv;
351 352 353

	/* verify bits and pos their msb bits clear and values are valid */
	BUG_ON(!bits || (shift > KEYLENGTH));
354

355
	pr_debug("AT %p s=%zu %zu\n", tnode, TNODE_SIZE(0),
356
		 sizeof(struct key_vector *) << bits);
357 358 359 360 361

	if (!tnode)
		return NULL;

	if (bits == KEYLENGTH)
362
		tnode->full_children = 1;
363
	else
364
		tnode->empty_children = 1ul << bits;
365 366 367 368 369 370

	tn->key = (shift < KEYLENGTH) ? (key >> shift) << shift : 0;
	tn->pos = pos;
	tn->bits = bits;
	tn->slen = pos;

371 372 373
	return tn;
}

374
/* Check whether a tnode 'n' is "full", i.e. it is an internal node
375 376
 * and no bits are skipped. See discussion in dyntree paper p. 6
 */
377
static inline int tnode_full(struct key_vector *tn, struct key_vector *n)
378
{
379
	return n && ((n->pos + n->bits) == tn->pos) && IS_TNODE(n);
380 381
}

382 383 384
/* Add a child at position i overwriting the old value.
 * Update the value of full_children and empty_children.
 */
385 386
static void put_child(struct key_vector *tn, unsigned long i,
		      struct key_vector *n)
387
{
388
	struct key_vector *chi = get_child(tn, i);
389
	int isfull, wasfull;
390

391
	BUG_ON(i >= child_length(tn));
S
Stephen Hemminger 已提交
392

393
	/* update emptyChildren, overflow into fullChildren */
394
	if (n == NULL && chi != NULL)
395 396 397
		empty_child_inc(tn);
	if (n != NULL && chi == NULL)
		empty_child_dec(tn);
398

399
	/* update fullChildren */
400
	wasfull = tnode_full(tn, chi);
401
	isfull = tnode_full(tn, n);
402

403
	if (wasfull && !isfull)
404
		tn_info(tn)->full_children--;
405
	else if (!wasfull && isfull)
406
		tn_info(tn)->full_children++;
O
Olof Johansson 已提交
407

408 409 410
	if (n && (tn->slen < n->slen))
		tn->slen = n->slen;

411
	rcu_assign_pointer(tn->tnode[i], n);
412 413
}

414
static void update_children(struct key_vector *tn)
415 416 417 418
{
	unsigned long i;

	/* update all of the child parent pointers */
419
	for (i = child_length(tn); i;) {
420
		struct key_vector *inode = get_child(tn, --i);
421 422 423 424 425 426 427 428 429 430 431 432 433 434 435

		if (!inode)
			continue;

		/* Either update the children of a tnode that
		 * already belongs to us or update the child
		 * to point to ourselves.
		 */
		if (node_parent(inode) == tn)
			update_children(inode);
		else
			node_set_parent(inode, tn);
	}
}

436 437
static inline void put_child_root(struct key_vector *tp, t_key key,
				  struct key_vector *n)
438
{
439 440
	if (IS_TRIE(tp))
		rcu_assign_pointer(tp->tnode[0], n);
441
	else
442
		put_child(tp, get_index(key, tp), n);
443 444
}

445
static inline void tnode_free_init(struct key_vector *tn)
E
Eric Dumazet 已提交
446
{
447
	tn_info(tn)->rcu.next = NULL;
448 449
}

450 451
static inline void tnode_free_append(struct key_vector *tn,
				     struct key_vector *n)
452
{
453 454
	tn_info(n)->rcu.next = tn_info(tn)->rcu.next;
	tn_info(tn)->rcu.next = &tn_info(n)->rcu;
455
}
E
Eric Dumazet 已提交
456

457
static void tnode_free(struct key_vector *tn)
458
{
459
	struct callback_head *head = &tn_info(tn)->rcu;
460 461 462

	while (head) {
		head = head->next;
463
		tnode_free_size += TNODE_SIZE(1ul << tn->bits);
464 465
		node_free(tn);

466
		tn = container_of(head, struct tnode, rcu)->kv;
467 468 469 470 471
	}

	if (tnode_free_size >= PAGE_SIZE * sync_pages) {
		tnode_free_size = 0;
		synchronize_rcu();
E
Eric Dumazet 已提交
472 473 474
	}
}

475 476 477
static struct key_vector *replace(struct trie *t,
				  struct key_vector *oldtnode,
				  struct key_vector *tn)
478
{
479
	struct key_vector *tp = node_parent(oldtnode);
480 481 482 483
	unsigned long i;

	/* setup the parent pointer out of and back into this node */
	NODE_INIT_PARENT(tn, tp);
484
	put_child_root(tp, tn->key, tn);
485 486 487 488 489 490 491 492

	/* update all of the child parent pointers */
	update_children(tn);

	/* all pointers should be clean so we are done */
	tnode_free(oldtnode);

	/* resize children now that oldtnode is freed */
493
	for (i = child_length(tn); i;) {
494
		struct key_vector *inode = get_child(tn, --i);
495 496 497

		/* resize child node */
		if (tnode_full(tn, inode))
498
			tn = resize(t, inode);
499
	}
500

501
	return tp;
502 503
}

504 505
static struct key_vector *inflate(struct trie *t,
				  struct key_vector *oldtnode)
506
{
507
	struct key_vector *tn;
508
	unsigned long i;
509
	t_key m;
510

S
Stephen Hemminger 已提交
511
	pr_debug("In inflate\n");
512

513
	tn = tnode_new(oldtnode->key, oldtnode->pos - 1, oldtnode->bits + 1);
S
Stephen Hemminger 已提交
514
	if (!tn)
515
		goto notnode;
516

517 518 519
	/* prepare oldtnode to be freed */
	tnode_free_init(oldtnode);

520 521 522 523
	/* Assemble all of the pointers in our cluster, in this case that
	 * represents all of the pointers out of our allocated nodes that
	 * point to existing tnodes and the links between our allocated
	 * nodes.
524
	 */
525
	for (i = child_length(oldtnode), m = 1u << tn->pos; i;) {
526
		struct key_vector *inode = get_child(oldtnode, --i);
527
		struct key_vector *node0, *node1;
528
		unsigned long j, k;
529

530
		/* An empty child */
A
Alexander Duyck 已提交
531
		if (inode == NULL)
532 533 534
			continue;

		/* A leaf or an internal node with skipped bits */
A
Alexander Duyck 已提交
535
		if (!tnode_full(oldtnode, inode)) {
536
			put_child(tn, get_index(inode->key, tn), inode);
537 538 539
			continue;
		}

540 541 542
		/* drop the node in the old tnode free list */
		tnode_free_append(oldtnode, inode);

543 544
		/* An internal node with two children */
		if (inode->bits == 1) {
545 546
			put_child(tn, 2 * i + 1, get_child(inode, 1));
			put_child(tn, 2 * i, get_child(inode, 0));
O
Olof Johansson 已提交
547
			continue;
548 549
		}

O
Olof Johansson 已提交
550
		/* We will replace this node 'inode' with two new
551
		 * ones, 'node0' and 'node1', each with half of the
O
Olof Johansson 已提交
552 553 554 555 556
		 * original children. The two new nodes will have
		 * a position one bit further down the key and this
		 * means that the "significant" part of their keys
		 * (see the discussion near the top of this file)
		 * will differ by one bit, which will be "0" in
557
		 * node0's key and "1" in node1's key. Since we are
O
Olof Johansson 已提交
558 559
		 * moving the key position by one step, the bit that
		 * we are moving away from - the bit at position
560 561 562
		 * (tn->pos) - is the one that will differ between
		 * node0 and node1. So... we synthesize that bit in the
		 * two new keys.
O
Olof Johansson 已提交
563
		 */
564 565 566
		node1 = tnode_new(inode->key | m, inode->pos, inode->bits - 1);
		if (!node1)
			goto nomem;
567
		node0 = tnode_new(inode->key, inode->pos, inode->bits - 1);
568

569
		tnode_free_append(tn, node1);
570 571 572 573 574
		if (!node0)
			goto nomem;
		tnode_free_append(tn, node0);

		/* populate child pointers in new nodes */
575
		for (k = child_length(inode), j = k / 2; j;) {
576 577 578 579
			put_child(node1, --j, get_child(inode, --k));
			put_child(node0, j, get_child(inode, j));
			put_child(node1, --j, get_child(inode, --k));
			put_child(node0, j, get_child(inode, j));
580
		}
581

582 583 584
		/* link new nodes to parent */
		NODE_INIT_PARENT(node1, tn);
		NODE_INIT_PARENT(node0, tn);
585

586 587 588 589
		/* link parent to nodes */
		put_child(tn, 2 * i + 1, node1);
		put_child(tn, 2 * i, node0);
	}
590

591
	/* setup the parent pointers into and out of this node */
592
	return replace(t, oldtnode, tn);
593
nomem:
594 595
	/* all pointers should be clean so we are done */
	tnode_free(tn);
596 597
notnode:
	return NULL;
598 599
}

600 601
static struct key_vector *halve(struct trie *t,
				struct key_vector *oldtnode)
602
{
603
	struct key_vector *tn;
604
	unsigned long i;
605

S
Stephen Hemminger 已提交
606
	pr_debug("In halve\n");
607

608
	tn = tnode_new(oldtnode->key, oldtnode->pos + 1, oldtnode->bits - 1);
609
	if (!tn)
610
		goto notnode;
611

612 613 614
	/* prepare oldtnode to be freed */
	tnode_free_init(oldtnode);

615 616 617 618
	/* Assemble all of the pointers in our cluster, in this case that
	 * represents all of the pointers out of our allocated nodes that
	 * point to existing tnodes and the links between our allocated
	 * nodes.
619
	 */
620
	for (i = child_length(oldtnode); i;) {
621 622
		struct key_vector *node1 = get_child(oldtnode, --i);
		struct key_vector *node0 = get_child(oldtnode, --i);
623
		struct key_vector *inode;
624

625 626 627 628 629
		/* At least one of the children is empty */
		if (!node1 || !node0) {
			put_child(tn, i / 2, node1 ? : node0);
			continue;
		}
630

631
		/* Two nonempty children */
632
		inode = tnode_new(node0->key, oldtnode->pos, 1);
633 634
		if (!inode)
			goto nomem;
635
		tnode_free_append(tn, inode);
636

637 638 639 640 641 642 643
		/* initialize pointers out of node */
		put_child(inode, 1, node1);
		put_child(inode, 0, node0);
		NODE_INIT_PARENT(inode, tn);

		/* link parent to node */
		put_child(tn, i / 2, inode);
644
	}
645

646
	/* setup the parent pointers into and out of this node */
647 648 649 650 651 652
	return replace(t, oldtnode, tn);
nomem:
	/* all pointers should be clean so we are done */
	tnode_free(tn);
notnode:
	return NULL;
653 654
}

655 656
static struct key_vector *collapse(struct trie *t,
				   struct key_vector *oldtnode)
657
{
658
	struct key_vector *n, *tp;
659 660 661
	unsigned long i;

	/* scan the tnode looking for that one child that might still exist */
662
	for (n = NULL, i = child_length(oldtnode); !n && i;)
663
		n = get_child(oldtnode, --i);
664 665 666

	/* compress one level */
	tp = node_parent(oldtnode);
667
	put_child_root(tp, oldtnode->key, n);
668 669 670 671
	node_set_parent(n, tp);

	/* drop dead node */
	node_free(oldtnode);
672 673

	return tp;
674 675
}

676
static unsigned char update_suffix(struct key_vector *tn)
677 678 679 680 681 682 683 684 685
{
	unsigned char slen = tn->pos;
	unsigned long stride, i;

	/* search though the list of children looking for nodes that might
	 * have a suffix greater than the one we currently have.  This is
	 * why we start with a stride of 2 since a stride of 1 would
	 * represent the nodes with suffix length equal to tn->pos
	 */
686
	for (i = 0, stride = 0x2ul ; i < child_length(tn); i += stride) {
687
		struct key_vector *n = get_child(tn, i);
688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710

		if (!n || (n->slen <= slen))
			continue;

		/* update stride and slen based on new value */
		stride <<= (n->slen - slen);
		slen = n->slen;
		i &= ~(stride - 1);

		/* if slen covers all but the last bit we can stop here
		 * there will be nothing longer than that since only node
		 * 0 and 1 << (bits - 1) could have that as their suffix
		 * length.
		 */
		if ((slen + 1) >= (tn->pos + tn->bits))
			break;
	}

	tn->slen = slen;

	return slen;
}

711 712 713 714 715 716 717 718
/* From "Implementing a dynamic compressed trie" by Stefan Nilsson of
 * the Helsinki University of Technology and Matti Tikkanen of Nokia
 * Telecommunications, page 6:
 * "A node is doubled if the ratio of non-empty children to all
 * children in the *doubled* node is at least 'high'."
 *
 * 'high' in this instance is the variable 'inflate_threshold'. It
 * is expressed as a percentage, so we multiply it with
719
 * child_length() and instead of multiplying by 2 (since the
720 721 722 723
 * child array will be doubled by inflate()) and multiplying
 * the left-hand side by 100 (to handle the percentage thing) we
 * multiply the left-hand side by 50.
 *
724
 * The left-hand side may look a bit weird: child_length(tn)
725 726 727 728 729 730 731 732 733
 * - tn->empty_children is of course the number of non-null children
 * in the current node. tn->full_children is the number of "full"
 * children, that is non-null tnodes with a skip value of 0.
 * All of those will be doubled in the resulting inflated tnode, so
 * we just count them one extra time here.
 *
 * A clearer way to write this would be:
 *
 * to_be_doubled = tn->full_children;
734
 * not_to_be_doubled = child_length(tn) - tn->empty_children -
735 736
 *     tn->full_children;
 *
737
 * new_child_length = child_length(tn) * 2;
738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753
 *
 * new_fill_factor = 100 * (not_to_be_doubled + 2*to_be_doubled) /
 *      new_child_length;
 * if (new_fill_factor >= inflate_threshold)
 *
 * ...and so on, tho it would mess up the while () loop.
 *
 * anyway,
 * 100 * (not_to_be_doubled + 2*to_be_doubled) / new_child_length >=
 *      inflate_threshold
 *
 * avoid a division:
 * 100 * (not_to_be_doubled + 2*to_be_doubled) >=
 *      inflate_threshold * new_child_length
 *
 * expand not_to_be_doubled and to_be_doubled, and shorten:
754
 * 100 * (child_length(tn) - tn->empty_children +
755 756 757
 *    tn->full_children) >= inflate_threshold * new_child_length
 *
 * expand new_child_length:
758
 * 100 * (child_length(tn) - tn->empty_children +
759
 *    tn->full_children) >=
760
 *      inflate_threshold * child_length(tn) * 2
761 762
 *
 * shorten again:
763
 * 50 * (tn->full_children + child_length(tn) -
764
 *    tn->empty_children) >= inflate_threshold *
765
 *    child_length(tn)
766 767
 *
 */
768
static inline bool should_inflate(struct key_vector *tp, struct key_vector *tn)
769
{
770
	unsigned long used = child_length(tn);
771 772 773
	unsigned long threshold = used;

	/* Keep root node larger */
774
	threshold *= IS_TRIE(tp) ? inflate_threshold_root : inflate_threshold;
775 776
	used -= tn_info(tn)->empty_children;
	used += tn_info(tn)->full_children;
777

778 779 780
	/* if bits == KEYLENGTH then pos = 0, and will fail below */

	return (used > 1) && tn->pos && ((50 * used) >= threshold);
781 782
}

783
static inline bool should_halve(struct key_vector *tp, struct key_vector *tn)
784
{
785
	unsigned long used = child_length(tn);
786 787 788
	unsigned long threshold = used;

	/* Keep root node larger */
789
	threshold *= IS_TRIE(tp) ? halve_threshold_root : halve_threshold;
790
	used -= tn_info(tn)->empty_children;
791

792 793 794 795 796
	/* if bits == KEYLENGTH then used = 100% on wrap, and will fail below */

	return (used > 1) && (tn->bits > 1) && ((100 * used) < threshold);
}

797
static inline bool should_collapse(struct key_vector *tn)
798
{
799
	unsigned long used = child_length(tn);
800

801
	used -= tn_info(tn)->empty_children;
802 803

	/* account for bits == KEYLENGTH case */
804
	if ((tn->bits == KEYLENGTH) && tn_info(tn)->full_children)
805 806 807 808
		used -= KEY_MAX;

	/* One child or none, time to drop us from the trie */
	return used < 2;
809 810
}

811
#define MAX_WORK 10
812
static struct key_vector *resize(struct trie *t, struct key_vector *tn)
813
{
814 815 816
#ifdef CONFIG_IP_FIB_TRIE_STATS
	struct trie_use_stats __percpu *stats = t->stats;
#endif
817
	struct key_vector *tp = node_parent(tn);
818
	unsigned long cindex = get_index(tn->key, tp);
819
	int max_work = MAX_WORK;
820 821 822 823

	pr_debug("In tnode_resize %p inflate_threshold=%d threshold=%d\n",
		 tn, inflate_threshold, halve_threshold);

824 825 826 827
	/* track the tnode via the pointer from the parent instead of
	 * doing it ourselves.  This way we can let RCU fully do its
	 * thing without us interfering
	 */
828
	BUG_ON(tn != get_child(tp, cindex));
829

830 831
	/* Double as long as the resulting node has a number of
	 * nonempty nodes that are above the threshold.
832
	 */
833
	while (should_inflate(tp, tn) && max_work) {
834 835
		tp = inflate(t, tn);
		if (!tp) {
836
#ifdef CONFIG_IP_FIB_TRIE_STATS
837
			this_cpu_inc(stats->resize_node_skipped);
838 839 840
#endif
			break;
		}
841

842
		max_work--;
843
		tn = get_child(tp, cindex);
844 845 846 847
	}

	/* Return if at least one inflate is run */
	if (max_work != MAX_WORK)
848
		return node_parent(tn);
849

850
	/* Halve as long as the number of empty children in this
851 852
	 * node is above threshold.
	 */
853
	while (should_halve(tp, tn) && max_work) {
854 855
		tp = halve(t, tn);
		if (!tp) {
856
#ifdef CONFIG_IP_FIB_TRIE_STATS
857
			this_cpu_inc(stats->resize_node_skipped);
858 859 860 861
#endif
			break;
		}

862
		max_work--;
863
		tn = get_child(tp, cindex);
864
	}
865 866

	/* Only one child remains */
867 868 869 870 871
	if (should_collapse(tn))
		return collapse(t, tn);

	/* update parent in case inflate or halve failed */
	tp = node_parent(tn);
872 873 874

	/* Return if at least one deflate was run */
	if (max_work != MAX_WORK)
875
		return tp;
876 877 878 879 880

	/* push the suffix length to the parent node */
	if (tn->slen > tn->pos) {
		unsigned char slen = update_suffix(tn);

881
		if (slen > tp->slen)
882
			tp->slen = slen;
883
	}
884

885
	return tp;
886 887
}

888
static void leaf_pull_suffix(struct key_vector *tp, struct key_vector *l)
889
{
890
	while ((tp->slen > tp->pos) && (tp->slen > l->slen)) {
891 892 893 894 895 896
		if (update_suffix(tp) > l->slen)
			break;
		tp = node_parent(tp);
	}
}

897
static void leaf_push_suffix(struct key_vector *tn, struct key_vector *l)
898
{
899 900 901
	/* if this is a new leaf then tn will be NULL and we can sort
	 * out parent suffix lengths as a part of trie_rebalance
	 */
902
	while (tn->slen < l->slen) {
903 904 905 906 907
		tn->slen = l->slen;
		tn = node_parent(tn);
	}
}

R
Robert Olsson 已提交
908
/* rcu_read_lock needs to be hold by caller from readside */
909 910
static struct key_vector *fib_find_node(struct trie *t,
					struct key_vector **tp, u32 key)
911
{
912 913 914 915 916 917 918 919 920
	struct key_vector *pn, *n = t->kv;
	unsigned long index = 0;

	do {
		pn = n;
		n = get_child_rcu(n, index);

		if (!n)
			break;
A
Alexander Duyck 已提交
921

922
		index = get_cindex(key, n);
A
Alexander Duyck 已提交
923 924 925 926 927 928

		/* This bit of code is a bit tricky but it combines multiple
		 * checks into a single check.  The prefix consists of the
		 * prefix plus zeros for the bits in the cindex. The index
		 * is the difference between the key and this value.  From
		 * this we can actually derive several pieces of data.
929
		 *   if (index >= (1ul << bits))
A
Alexander Duyck 已提交
930
		 *     we have a mismatch in skip bits and failed
931 932
		 *   else
		 *     we know the value is cindex
933 934 935 936
		 *
		 * This check is safe even if bits == KEYLENGTH due to the
		 * fact that we can only allocate a node with 32 bits if a
		 * long is greater than 32 bits.
A
Alexander Duyck 已提交
937
		 */
938 939 940 941
		if (index >= (1ul << n->bits)) {
			n = NULL;
			break;
		}
A
Alexander Duyck 已提交
942

943 944
		/* keep searching until we find a perfect match leaf or NULL */
	} while (IS_TNODE(n));
O
Olof Johansson 已提交
945

946
	*tp = pn;
947

A
Alexander Duyck 已提交
948
	return n;
949 950
}

951 952 953
/* Return the first fib alias matching TOS with
 * priority less than or equal to PRIO.
 */
A
Alexander Duyck 已提交
954 955
static struct fib_alias *fib_find_alias(struct hlist_head *fah, u8 slen,
					u8 tos, u32 prio)
956 957 958 959 960 961
{
	struct fib_alias *fa;

	if (!fah)
		return NULL;

962
	hlist_for_each_entry(fa, fah, fa_list) {
A
Alexander Duyck 已提交
963 964 965 966
		if (fa->fa_slen < slen)
			continue;
		if (fa->fa_slen != slen)
			break;
967 968 969 970 971 972 973 974 975
		if (fa->fa_tos > tos)
			continue;
		if (fa->fa_info->fib_priority >= prio || fa->fa_tos < tos)
			return fa;
	}

	return NULL;
}

976
static void trie_rebalance(struct trie *t, struct key_vector *tn)
977
{
978 979
	while (!IS_TRIE(tn))
		tn = resize(t, tn);
980 981
}

982
static int fib_insert_node(struct trie *t, struct key_vector *tp,
983
			   struct fib_alias *new, t_key key)
984
{
985
	struct key_vector *n, *l;
986

987
	l = leaf_new(key, new);
A
Alexander Duyck 已提交
988
	if (!l)
989
		goto noleaf;
990 991

	/* retrieve child from parent node */
992
	n = get_child(tp, get_index(key, tp));
993

994 995 996 997 998 999 1000
	/* Case 2: n is a LEAF or a TNODE and the key doesn't match.
	 *
	 *  Add a new tnode here
	 *  first tnode need some special handling
	 *  leaves us in position for handling as case 3
	 */
	if (n) {
1001
		struct key_vector *tn;
1002

1003
		tn = tnode_new(key, __fls(key ^ n->key), 1);
1004 1005
		if (!tn)
			goto notnode;
O
Olof Johansson 已提交
1006

1007 1008 1009
		/* initialize routes out of node */
		NODE_INIT_PARENT(tn, tp);
		put_child(tn, get_index(key, tn) ^ 1, n);
1010

1011
		/* start adding routes into the node */
1012
		put_child_root(tp, key, tn);
1013
		node_set_parent(n, tn);
1014

1015
		/* parent now has a NULL spot where the leaf can go */
1016
		tp = tn;
1017
	}
O
Olof Johansson 已提交
1018

1019
	/* Case 3: n is NULL, and will just insert a new leaf */
1020
	NODE_INIT_PARENT(l, tp);
1021
	put_child_root(tp, key, l);
1022 1023 1024
	trie_rebalance(t, tp);

	return 0;
1025 1026 1027 1028
notnode:
	node_free(l);
noleaf:
	return -ENOMEM;
1029 1030
}

1031 1032
static int fib_insert_alias(struct trie *t, struct key_vector *tp,
			    struct key_vector *l, struct fib_alias *new,
1033 1034 1035 1036 1037 1038 1039
			    struct fib_alias *fa, t_key key)
{
	if (!l)
		return fib_insert_node(t, tp, new, key);

	if (fa) {
		hlist_add_before_rcu(&new->fa_list, &fa->fa_list);
1040
	} else {
1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052
		struct fib_alias *last;

		hlist_for_each_entry(last, &l->leaf, fa_list) {
			if (new->fa_slen < last->fa_slen)
				break;
			fa = last;
		}

		if (fa)
			hlist_add_behind_rcu(&new->fa_list, &fa->fa_list);
		else
			hlist_add_head_rcu(&new->fa_list, &l->leaf);
1053
	}
R
Robert Olsson 已提交
1054

1055 1056 1057 1058 1059 1060 1061
	/* if we added to the tail node then we need to update slen */
	if (l->slen < new->fa_slen) {
		l->slen = new->fa_slen;
		leaf_push_suffix(tp, l);
	}

	return 0;
1062 1063
}

1064
/* Caller must hold RTNL. */
1065
int fib_table_insert(struct fib_table *tb, struct fib_config *cfg)
1066
{
1067
	struct trie *t = (struct trie *)tb->tb_data;
1068
	struct fib_alias *fa, *new_fa;
1069
	struct key_vector *l, *tp;
1070
	struct fib_info *fi;
A
Alexander Duyck 已提交
1071 1072
	u8 plen = cfg->fc_dst_len;
	u8 slen = KEYLENGTH - plen;
1073
	u8 tos = cfg->fc_tos;
1074
	u32 key;
1075 1076
	int err;

1077
	if (plen > KEYLENGTH)
1078 1079
		return -EINVAL;

1080
	key = ntohl(cfg->fc_dst);
1081

1082
	pr_debug("Insert table=%u %08x/%d\n", tb->tb_id, key, plen);
1083

1084
	if ((plen < KEYLENGTH) && (key << plen))
1085 1086
		return -EINVAL;

1087 1088 1089
	fi = fib_create_info(cfg);
	if (IS_ERR(fi)) {
		err = PTR_ERR(fi);
1090
		goto err;
1091
	}
1092

1093
	l = fib_find_node(t, &tp, key);
A
Alexander Duyck 已提交
1094
	fa = l ? fib_find_alias(&l->leaf, slen, tos, fi->fib_priority) : NULL;
1095 1096 1097 1098 1099 1100

	/* Now fa, if non-NULL, points to the first fib alias
	 * with the same keys [prefix,tos,priority], if such key already
	 * exists or to the node before which we will insert new one.
	 *
	 * If fa is NULL, we will need to allocate a new one and
1101 1102
	 * insert to the tail of the section matching the suffix length
	 * of the new alias.
1103 1104
	 */

1105 1106 1107
	if (fa && fa->fa_tos == tos &&
	    fa->fa_info->fib_priority == fi->fib_priority) {
		struct fib_alias *fa_first, *fa_match;
1108 1109

		err = -EEXIST;
1110
		if (cfg->fc_nlflags & NLM_F_EXCL)
1111 1112
			goto out;

1113 1114 1115 1116 1117 1118 1119
		/* We have 2 goals:
		 * 1. Find exact match for type, scope, fib_info to avoid
		 * duplicate routes
		 * 2. Find next 'fa' (or head), NLM_F_APPEND inserts before it
		 */
		fa_match = NULL;
		fa_first = fa;
1120
		hlist_for_each_entry_from(fa, fa_list) {
A
Alexander Duyck 已提交
1121
			if ((fa->fa_slen != slen) || (fa->fa_tos != tos))
1122 1123 1124 1125 1126 1127 1128 1129 1130 1131
				break;
			if (fa->fa_info->fib_priority != fi->fib_priority)
				break;
			if (fa->fa_type == cfg->fc_type &&
			    fa->fa_info == fi) {
				fa_match = fa;
				break;
			}
		}

1132
		if (cfg->fc_nlflags & NLM_F_REPLACE) {
1133 1134 1135
			struct fib_info *fi_drop;
			u8 state;

1136 1137 1138 1139
			fa = fa_first;
			if (fa_match) {
				if (fa == fa_match)
					err = 0;
1140
				goto out;
1141
			}
R
Robert Olsson 已提交
1142
			err = -ENOBUFS;
1143
			new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL);
R
Robert Olsson 已提交
1144 1145
			if (new_fa == NULL)
				goto out;
1146 1147

			fi_drop = fa->fa_info;
R
Robert Olsson 已提交
1148 1149
			new_fa->fa_tos = fa->fa_tos;
			new_fa->fa_info = fi;
1150
			new_fa->fa_type = cfg->fc_type;
1151
			state = fa->fa_state;
1152
			new_fa->fa_state = state & ~FA_S_ACCESSED;
1153
			new_fa->fa_slen = fa->fa_slen;
1154

1155 1156 1157 1158 1159 1160 1161 1162 1163 1164
			err = netdev_switch_fib_ipv4_add(key, plen, fi,
							 new_fa->fa_tos,
							 cfg->fc_type,
							 tb->tb_id);
			if (err) {
				netdev_switch_fib_ipv4_abort(fi);
				kmem_cache_free(fn_alias_kmem, new_fa);
				goto out;
			}

1165
			hlist_replace_rcu(&fa->fa_list, &new_fa->fa_list);
1166

R
Robert Olsson 已提交
1167
			alias_free_mem_rcu(fa);
1168 1169 1170

			fib_release_info(fi_drop);
			if (state & FA_S_ACCESSED)
1171
				rt_cache_flush(cfg->fc_nlinfo.nl_net);
1172 1173
			rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen,
				tb->tb_id, &cfg->fc_nlinfo, NLM_F_REPLACE);
1174

O
Olof Johansson 已提交
1175
			goto succeeded;
1176 1177 1178 1179 1180
		}
		/* Error if we find a perfect match which
		 * uses the same scope, type, and nexthop
		 * information.
		 */
1181 1182
		if (fa_match)
			goto out;
1183

1184
		if (!(cfg->fc_nlflags & NLM_F_APPEND))
1185
			fa = fa_first;
1186 1187
	}
	err = -ENOENT;
1188
	if (!(cfg->fc_nlflags & NLM_F_CREATE))
1189 1190 1191
		goto out;

	err = -ENOBUFS;
1192
	new_fa = kmem_cache_alloc(fn_alias_kmem, GFP_KERNEL);
1193 1194 1195 1196 1197
	if (new_fa == NULL)
		goto out;

	new_fa->fa_info = fi;
	new_fa->fa_tos = tos;
1198
	new_fa->fa_type = cfg->fc_type;
1199
	new_fa->fa_state = 0;
A
Alexander Duyck 已提交
1200
	new_fa->fa_slen = slen;
1201

1202 1203 1204 1205 1206 1207 1208 1209
	/* (Optionally) offload fib entry to switch hardware. */
	err = netdev_switch_fib_ipv4_add(key, plen, fi, tos,
					 cfg->fc_type, tb->tb_id);
	if (err) {
		netdev_switch_fib_ipv4_abort(fi);
		goto out_free_new_fa;
	}

1210
	/* Insert new entry to the list. */
1211 1212
	err = fib_insert_alias(t, tp, l, new_fa, fa, key);
	if (err)
1213
		goto out_sw_fib_del;
1214

1215 1216 1217
	if (!plen)
		tb->tb_num_default++;

1218
	rt_cache_flush(cfg->fc_nlinfo.nl_net);
1219
	rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id,
1220
		  &cfg->fc_nlinfo, 0);
1221 1222
succeeded:
	return 0;
1223

1224 1225
out_sw_fib_del:
	netdev_switch_fib_ipv4_del(key, plen, fi, tos, cfg->fc_type, tb->tb_id);
1226 1227
out_free_new_fa:
	kmem_cache_free(fn_alias_kmem, new_fa);
1228 1229
out:
	fib_release_info(fi);
O
Olof Johansson 已提交
1230
err:
1231 1232 1233
	return err;
}

1234
static inline t_key prefix_mismatch(t_key key, struct key_vector *n)
1235 1236 1237 1238 1239 1240
{
	t_key prefix = n->key;

	return (key ^ prefix) & (prefix | -prefix);
}

1241
/* should be called with rcu_read_lock */
1242
int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
E
Eric Dumazet 已提交
1243
		     struct fib_result *res, int fib_flags)
1244
{
1245
	struct trie *t = (struct trie *)tb->tb_data;
1246 1247 1248
#ifdef CONFIG_IP_FIB_TRIE_STATS
	struct trie_use_stats __percpu *stats = t->stats;
#endif
1249
	const t_key key = ntohl(flp->daddr);
1250
	struct key_vector *n, *pn;
A
Alexander Duyck 已提交
1251
	struct fib_alias *fa;
1252
	unsigned long index;
1253
	t_key cindex;
O
Olof Johansson 已提交
1254

1255 1256 1257 1258
	pn = t->kv;
	cindex = 0;

	n = get_child_rcu(pn, cindex);
1259
	if (!n)
1260
		return -EAGAIN;
1261 1262

#ifdef CONFIG_IP_FIB_TRIE_STATS
1263
	this_cpu_inc(stats->gets);
1264 1265
#endif

1266 1267
	/* Step 1: Travel to the longest prefix match in the trie */
	for (;;) {
1268
		index = get_cindex(key, n);
1269 1270 1271 1272 1273 1274

		/* This bit of code is a bit tricky but it combines multiple
		 * checks into a single check.  The prefix consists of the
		 * prefix plus zeros for the "bits" in the prefix. The index
		 * is the difference between the key and this value.  From
		 * this we can actually derive several pieces of data.
1275
		 *   if (index >= (1ul << bits))
1276
		 *     we have a mismatch in skip bits and failed
1277 1278
		 *   else
		 *     we know the value is cindex
1279 1280 1281 1282
		 *
		 * This check is safe even if bits == KEYLENGTH due to the
		 * fact that we can only allocate a node with 32 bits if a
		 * long is greater than 32 bits.
1283
		 */
1284
		if (index >= (1ul << n->bits))
1285
			break;
1286

1287 1288
		/* we have found a leaf. Prefixes have already been compared */
		if (IS_LEAF(n))
1289
			goto found;
1290

1291 1292
		/* only record pn and cindex if we are going to be chopping
		 * bits later.  Otherwise we are just wasting cycles.
O
Olof Johansson 已提交
1293
		 */
1294
		if (n->slen > n->pos) {
1295 1296
			pn = n;
			cindex = index;
O
Olof Johansson 已提交
1297
		}
1298

1299
		n = get_child_rcu(n, index);
1300 1301 1302
		if (unlikely(!n))
			goto backtrace;
	}
1303

1304 1305 1306
	/* Step 2: Sort out leaves and begin backtracing for longest prefix */
	for (;;) {
		/* record the pointer where our next node pointer is stored */
1307
		struct key_vector __rcu **cptr = n->tnode;
1308

1309 1310 1311
		/* This test verifies that none of the bits that differ
		 * between the key and the prefix exist in the region of
		 * the lsb and higher in the prefix.
O
Olof Johansson 已提交
1312
		 */
1313
		if (unlikely(prefix_mismatch(key, n)) || (n->slen == n->pos))
1314
			goto backtrace;
O
Olof Johansson 已提交
1315

1316 1317 1318
		/* exit out and process leaf */
		if (unlikely(IS_LEAF(n)))
			break;
O
Olof Johansson 已提交
1319

1320 1321 1322
		/* Don't bother recording parent info.  Since we are in
		 * prefix match mode we will have to come back to wherever
		 * we started this traversal anyway
O
Olof Johansson 已提交
1323 1324
		 */

1325
		while ((n = rcu_dereference(*cptr)) == NULL) {
1326 1327
backtrace:
#ifdef CONFIG_IP_FIB_TRIE_STATS
1328 1329
			if (!n)
				this_cpu_inc(stats->null_node_hit);
1330
#endif
1331 1332 1333 1334 1335 1336 1337 1338
			/* If we are at cindex 0 there are no more bits for
			 * us to strip at this level so we must ascend back
			 * up one level to see if there are any more bits to
			 * be stripped there.
			 */
			while (!cindex) {
				t_key pkey = pn->key;

1339 1340 1341 1342 1343
				/* If we don't have a parent then there is
				 * nothing for us to do as we do not have any
				 * further nodes to parse.
				 */
				if (IS_TRIE(pn))
1344
					return -EAGAIN;
1345 1346 1347 1348
#ifdef CONFIG_IP_FIB_TRIE_STATS
				this_cpu_inc(stats->backtrack);
#endif
				/* Get Child's index */
1349
				pn = node_parent_rcu(pn);
1350 1351 1352 1353 1354 1355 1356
				cindex = get_index(pkey, pn);
			}

			/* strip the least significant bit from the cindex */
			cindex &= cindex - 1;

			/* grab pointer for next child node */
1357
			cptr = &pn->tnode[cindex];
1358
		}
1359
	}
1360

1361
found:
1362 1363 1364
	/* this line carries forward the xor from earlier in the function */
	index = key ^ n->key;

1365
	/* Step 3: Process the leaf, if that fails fall back to backtracing */
A
Alexander Duyck 已提交
1366 1367 1368
	hlist_for_each_entry_rcu(fa, &n->leaf, fa_list) {
		struct fib_info *fi = fa->fa_info;
		int nhsel, err;
1369

1370
		if ((index >= (1ul << fa->fa_slen)) &&
A
Alexander Duyck 已提交
1371
		    ((BITS_PER_LONG > KEYLENGTH) || (fa->fa_slen != KEYLENGTH)))
1372
			continue;
A
Alexander Duyck 已提交
1373 1374 1375 1376 1377 1378 1379 1380 1381
		if (fa->fa_tos && fa->fa_tos != flp->flowi4_tos)
			continue;
		if (fi->fib_dead)
			continue;
		if (fa->fa_info->fib_scope < flp->flowi4_scope)
			continue;
		fib_alias_accessed(fa);
		err = fib_props[fa->fa_type].error;
		if (unlikely(err < 0)) {
1382
#ifdef CONFIG_IP_FIB_TRIE_STATS
A
Alexander Duyck 已提交
1383
			this_cpu_inc(stats->semantic_match_passed);
1384
#endif
A
Alexander Duyck 已提交
1385 1386 1387 1388 1389 1390 1391 1392 1393 1394
			return err;
		}
		if (fi->fib_flags & RTNH_F_DEAD)
			continue;
		for (nhsel = 0; nhsel < fi->fib_nhs; nhsel++) {
			const struct fib_nh *nh = &fi->fib_nh[nhsel];

			if (nh->nh_flags & RTNH_F_DEAD)
				continue;
			if (flp->flowi4_oif && flp->flowi4_oif != nh->nh_oif)
1395
				continue;
A
Alexander Duyck 已提交
1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406

			if (!(fib_flags & FIB_LOOKUP_NOREF))
				atomic_inc(&fi->fib_clntref);

			res->prefixlen = KEYLENGTH - fa->fa_slen;
			res->nh_sel = nhsel;
			res->type = fa->fa_type;
			res->scope = fi->fib_scope;
			res->fi = fi;
			res->table = tb;
			res->fa_head = &n->leaf;
1407
#ifdef CONFIG_IP_FIB_TRIE_STATS
A
Alexander Duyck 已提交
1408
			this_cpu_inc(stats->semantic_match_passed);
1409
#endif
A
Alexander Duyck 已提交
1410
			return err;
1411
		}
1412
	}
1413
#ifdef CONFIG_IP_FIB_TRIE_STATS
1414
	this_cpu_inc(stats->semantic_match_miss);
1415 1416
#endif
	goto backtrace;
1417
}
1418
EXPORT_SYMBOL_GPL(fib_table_lookup);
1419

1420 1421
static void fib_remove_alias(struct trie *t, struct key_vector *tp,
			     struct key_vector *l, struct fib_alias *old)
1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433
{
	/* record the location of the previous list_info entry */
	struct hlist_node **pprev = old->fa_list.pprev;
	struct fib_alias *fa = hlist_entry(pprev, typeof(*fa), fa_list.next);

	/* remove the fib_alias from the list */
	hlist_del_rcu(&old->fa_list);

	/* if we emptied the list this leaf will be freed and we can sort
	 * out parent suffix lengths as a part of trie_rebalance
	 */
	if (hlist_empty(&l->leaf)) {
1434
		put_child_root(tp, l->key, NULL);
1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449
		node_free(l);
		trie_rebalance(t, tp);
		return;
	}

	/* only access fa if it is pointing at the last valid hlist_node */
	if (*pprev)
		return;

	/* update the trie with the latest suffix length */
	l->slen = fa->fa_slen;
	leaf_pull_suffix(tp, l);
}

/* Caller must hold RTNL. */
1450
int fib_table_delete(struct fib_table *tb, struct fib_config *cfg)
1451 1452 1453
{
	struct trie *t = (struct trie *) tb->tb_data;
	struct fib_alias *fa, *fa_to_delete;
1454
	struct key_vector *l, *tp;
A
Alexander Duyck 已提交
1455 1456
	u8 plen = cfg->fc_dst_len;
	u8 slen = KEYLENGTH - plen;
1457 1458
	u8 tos = cfg->fc_tos;
	u32 key;
O
Olof Johansson 已提交
1459

A
Alexander Duyck 已提交
1460
	if (plen > KEYLENGTH)
1461 1462
		return -EINVAL;

1463
	key = ntohl(cfg->fc_dst);
1464

1465
	if ((plen < KEYLENGTH) && (key << plen))
1466 1467
		return -EINVAL;

1468
	l = fib_find_node(t, &tp, key);
1469
	if (!l)
1470 1471
		return -ESRCH;

A
Alexander Duyck 已提交
1472
	fa = fib_find_alias(&l->leaf, slen, tos, 0);
1473 1474 1475
	if (!fa)
		return -ESRCH;

S
Stephen Hemminger 已提交
1476
	pr_debug("Deleting %08x/%d tos=%d t=%p\n", key, plen, tos, t);
1477 1478

	fa_to_delete = NULL;
1479
	hlist_for_each_entry_from(fa, fa_list) {
1480 1481
		struct fib_info *fi = fa->fa_info;

A
Alexander Duyck 已提交
1482
		if ((fa->fa_slen != slen) || (fa->fa_tos != tos))
1483 1484
			break;

1485 1486
		if ((!cfg->fc_type || fa->fa_type == cfg->fc_type) &&
		    (cfg->fc_scope == RT_SCOPE_NOWHERE ||
1487
		     fa->fa_info->fib_scope == cfg->fc_scope) &&
1488 1489
		    (!cfg->fc_prefsrc ||
		     fi->fib_prefsrc == cfg->fc_prefsrc) &&
1490 1491 1492
		    (!cfg->fc_protocol ||
		     fi->fib_protocol == cfg->fc_protocol) &&
		    fib_nh_match(cfg, fi) == 0) {
1493 1494 1495 1496 1497
			fa_to_delete = fa;
			break;
		}
	}

O
Olof Johansson 已提交
1498 1499
	if (!fa_to_delete)
		return -ESRCH;
1500

1501 1502 1503
	netdev_switch_fib_ipv4_del(key, plen, fa_to_delete->fa_info, tos,
				   cfg->fc_type, tb->tb_id);

1504
	rtmsg_fib(RTM_DELROUTE, htonl(key), fa_to_delete, plen, tb->tb_id,
1505
		  &cfg->fc_nlinfo, 0);
O
Olof Johansson 已提交
1506

1507 1508 1509
	if (!plen)
		tb->tb_num_default--;

1510
	fib_remove_alias(t, tp, l, fa_to_delete);
1511

1512
	if (fa_to_delete->fa_state & FA_S_ACCESSED)
1513
		rt_cache_flush(cfg->fc_nlinfo.nl_net);
1514

1515 1516
	fib_release_info(fa_to_delete->fa_info);
	alias_free_mem_rcu(fa_to_delete);
O
Olof Johansson 已提交
1517
	return 0;
1518 1519
}

1520
/* Scan for the next leaf starting at the provided key value */
1521
static struct key_vector *leaf_walk_rcu(struct key_vector **tn, t_key key)
1522
{
1523
	struct key_vector *pn, *n = *tn;
1524
	unsigned long cindex;
1525

1526
	/* this loop is meant to try and find the key in the trie */
1527
	do {
1528 1529
		/* record parent and next child index */
		pn = n;
1530 1531 1532 1533
		cindex = get_index(key, pn);

		if (cindex >> pn->bits)
			break;
1534

1535
		/* descend into the next child */
1536
		n = get_child_rcu(pn, cindex++);
1537 1538 1539 1540 1541 1542 1543
		if (!n)
			break;

		/* guarantee forward progress on the keys */
		if (IS_LEAF(n) && (n->key >= key))
			goto found;
	} while (IS_TNODE(n));
1544

1545
	/* this loop will search for the next leaf with a greater key */
1546
	while (!IS_TRIE(pn)) {
1547 1548 1549
		/* if we exhausted the parent node we will need to climb */
		if (cindex >= (1ul << pn->bits)) {
			t_key pkey = pn->key;
1550

1551 1552 1553 1554
			pn = node_parent_rcu(pn);
			cindex = get_index(pkey, pn) + 1;
			continue;
		}
1555

1556
		/* grab the next available node */
1557
		n = get_child_rcu(pn, cindex++);
1558 1559
		if (!n)
			continue;
1560

1561 1562 1563
		/* no need to compare keys since we bumped the index */
		if (IS_LEAF(n))
			goto found;
1564

1565 1566 1567 1568
		/* Rescan start scanning in new node */
		pn = n;
		cindex = 0;
	}
S
Stephen Hemminger 已提交
1569

1570 1571 1572 1573
	*tn = pn;
	return NULL; /* Root of trie */
found:
	/* if we are at the limit for keys just return NULL for the tnode */
1574
	*tn = pn;
1575
	return n;
1576 1577
}

1578 1579 1580 1581
/* Caller must hold RTNL */
void fib_table_flush_external(struct fib_table *tb)
{
	struct trie *t = (struct trie *)tb->tb_data;
1582 1583 1584
	struct key_vector *pn = t->kv;
	unsigned long cindex = 1;
	struct hlist_node *tmp;
1585 1586
	struct fib_alias *fa;

1587 1588 1589
	/* walk trie in reverse order */
	for (;;) {
		struct key_vector *n;
1590

1591 1592
		if (!(cindex--)) {
			t_key pkey = pn->key;
1593

1594 1595 1596
			/* cannot resize the trie vector */
			if (IS_TRIE(pn))
				break;
1597

1598 1599 1600
			/* no need to resize like in flush below */
			pn = node_parent(pn);
			cindex = get_index(pkey, pn);
1601

1602 1603
			continue;
		}
1604

1605 1606 1607 1608
		/* grab the next available node */
		n = get_child(pn, cindex);
		if (!n)
			continue;
1609

1610 1611 1612 1613
		if (IS_TNODE(n)) {
			/* record pn and cindex for leaf walking */
			pn = n;
			cindex = 1ul << n->bits;
1614

1615
			continue;
1616
		}
1617

1618 1619 1620 1621 1622
		hlist_for_each_entry_safe(fa, tmp, &n->leaf, fa_list) {
			struct fib_info *fi = fa->fa_info;

			if (!fi || !(fi->fib_flags & RTNH_F_EXTERNAL))
				continue;
1623

1624 1625 1626 1627 1628 1629
			netdev_switch_fib_ipv4_del(n->key,
						   KEYLENGTH - fa->fa_slen,
						   fi, fa->fa_tos,
						   fa->fa_type, tb->tb_id);
		}
	}
1630 1631
}

1632
/* Caller must hold RTNL. */
1633
int fib_table_flush(struct fib_table *tb)
1634
{
1635
	struct trie *t = (struct trie *)tb->tb_data;
1636 1637
	struct key_vector *pn = t->kv;
	unsigned long cindex = 1;
1638 1639
	struct hlist_node *tmp;
	struct fib_alias *fa;
1640
	int found = 0;
1641

1642 1643 1644 1645
	/* walk trie in reverse order */
	for (;;) {
		unsigned char slen = 0;
		struct key_vector *n;
1646

1647 1648
		if (!(cindex--)) {
			t_key pkey = pn->key;
1649

1650 1651 1652
			/* cannot resize the trie vector */
			if (IS_TRIE(pn))
				break;
1653

1654 1655 1656
			/* resize completed node */
			pn = resize(t, pn);
			cindex = get_index(pkey, pn);
1657

1658 1659
			continue;
		}
1660

1661 1662 1663 1664
		/* grab the next available node */
		n = get_child(pn, cindex);
		if (!n)
			continue;
1665

1666 1667 1668 1669
		if (IS_TNODE(n)) {
			/* record pn and cindex for leaf walking */
			pn = n;
			cindex = 1ul << n->bits;
1670

1671 1672
			continue;
		}
1673

1674 1675
		hlist_for_each_entry_safe(fa, tmp, &n->leaf, fa_list) {
			struct fib_info *fi = fa->fa_info;
1676

1677 1678 1679 1680
			if (!fi || !(fi->fib_flags & RTNH_F_DEAD)) {
				slen = fa->fa_slen;
				continue;
			}
1681

1682 1683 1684 1685
			netdev_switch_fib_ipv4_del(n->key,
						   KEYLENGTH - fa->fa_slen,
						   fi, fa->fa_tos,
						   fa->fa_type, tb->tb_id);
1686 1687 1688 1689
			hlist_del_rcu(&fa->fa_list);
			fib_release_info(fa->fa_info);
			alias_free_mem_rcu(fa);
			found++;
1690 1691
		}

1692 1693
		/* update leaf slen */
		n->slen = slen;
1694

1695 1696 1697 1698 1699 1700
		if (hlist_empty(&n->leaf)) {
			put_child_root(pn, n->key, NULL);
			node_free(n);
		} else {
			leaf_pull_suffix(pn, n);
		}
1701
	}
1702

S
Stephen Hemminger 已提交
1703
	pr_debug("trie_flush found=%d\n", found);
1704 1705 1706
	return found;
}

1707
static void __trie_free_rcu(struct rcu_head *head)
1708
{
1709
	struct fib_table *tb = container_of(head, struct fib_table, rcu);
1710 1711 1712 1713 1714
#ifdef CONFIG_IP_FIB_TRIE_STATS
	struct trie *t = (struct trie *)tb->tb_data;

	free_percpu(t->stats);
#endif /* CONFIG_IP_FIB_TRIE_STATS */
1715 1716 1717
	kfree(tb);
}

1718 1719 1720 1721 1722
void fib_free_table(struct fib_table *tb)
{
	call_rcu(&tb->rcu, __trie_free_rcu);
}

1723
static int fn_trie_dump_leaf(struct key_vector *l, struct fib_table *tb,
A
Alexander Duyck 已提交
1724
			     struct sk_buff *skb, struct netlink_callback *cb)
1725
{
A
Alexander Duyck 已提交
1726
	__be32 xkey = htonl(l->key);
1727
	struct fib_alias *fa;
A
Alexander Duyck 已提交
1728
	int i, s_i;
1729

A
Alexander Duyck 已提交
1730
	s_i = cb->args[4];
1731 1732
	i = 0;

R
Robert Olsson 已提交
1733
	/* rcu_read_lock is hold by caller */
A
Alexander Duyck 已提交
1734
	hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
1735 1736 1737 1738 1739
		if (i < s_i) {
			i++;
			continue;
		}

1740
		if (fib_dump_info(skb, NETLINK_CB(cb->skb).portid,
1741 1742 1743 1744
				  cb->nlh->nlmsg_seq,
				  RTM_NEWROUTE,
				  tb->tb_id,
				  fa->fa_type,
1745
				  xkey,
1746
				  KEYLENGTH - fa->fa_slen,
1747
				  fa->fa_tos,
1748
				  fa->fa_info, NLM_F_MULTI) < 0) {
1749
			cb->args[4] = i;
1750 1751
			return -1;
		}
1752
		i++;
1753
	}
1754

1755
	cb->args[4] = i;
1756 1757 1758
	return skb->len;
}

1759
/* rcu_read_lock needs to be hold by caller from readside */
1760 1761
int fib_table_dump(struct fib_table *tb, struct sk_buff *skb,
		   struct netlink_callback *cb)
1762
{
1763
	struct trie *t = (struct trie *)tb->tb_data;
1764
	struct key_vector *l, *tp = t->kv;
1765 1766 1767
	/* Dump starting at last key.
	 * Note: 0.0.0.0/0 (ie default) is first key.
	 */
1768 1769
	int count = cb->args[2];
	t_key key = cb->args[3];
1770

1771
	while ((l = leaf_walk_rcu(&tp, key)) != NULL) {
1772
		if (fn_trie_dump_leaf(l, tb, skb, cb) < 0) {
1773 1774
			cb->args[3] = key;
			cb->args[2] = count;
1775
			return -1;
1776
		}
1777

1778
		++count;
1779 1780
		key = l->key + 1;

1781 1782
		memset(&cb->args[4], 0,
		       sizeof(cb->args) - 4*sizeof(cb->args[0]));
1783 1784 1785 1786

		/* stop loop if key wrapped back to 0 */
		if (key < l->key)
			break;
1787
	}
1788 1789 1790 1791

	cb->args[3] = key;
	cb->args[2] = count;

1792 1793 1794
	return skb->len;
}

1795
void __init fib_trie_init(void)
1796
{
1797 1798
	fn_alias_kmem = kmem_cache_create("ip_fib_alias",
					  sizeof(struct fib_alias),
1799 1800 1801
					  0, SLAB_PANIC, NULL);

	trie_leaf_kmem = kmem_cache_create("ip_fib_trie",
1802
					   LEAF_SIZE,
1803
					   0, SLAB_PANIC, NULL);
1804
}
1805

1806
struct fib_table *fib_trie_table(u32 id)
1807 1808 1809 1810
{
	struct fib_table *tb;
	struct trie *t;

1811
	tb = kzalloc(sizeof(*tb) + sizeof(struct trie), GFP_KERNEL);
1812 1813 1814 1815
	if (tb == NULL)
		return NULL;

	tb->tb_id = id;
1816
	tb->tb_default = -1;
1817
	tb->tb_num_default = 0;
1818 1819

	t = (struct trie *) tb->tb_data;
1820 1821
	t->kv[0].pos = KEYLENGTH;
	t->kv[0].slen = KEYLENGTH;
1822 1823 1824 1825 1826 1827 1828
#ifdef CONFIG_IP_FIB_TRIE_STATS
	t->stats = alloc_percpu(struct trie_use_stats);
	if (!t->stats) {
		kfree(tb);
		tb = NULL;
	}
#endif
1829 1830 1831 1832

	return tb;
}

1833 1834 1835
#ifdef CONFIG_PROC_FS
/* Depth first Trie walk iterator */
struct fib_trie_iter {
1836
	struct seq_net_private p;
1837
	struct fib_table *tb;
1838
	struct key_vector *tnode;
E
Eric Dumazet 已提交
1839 1840
	unsigned int index;
	unsigned int depth;
1841
};
1842

1843
static struct key_vector *fib_trie_get_next(struct fib_trie_iter *iter)
1844
{
1845
	unsigned long cindex = iter->index;
1846 1847
	struct key_vector *pn = iter->tnode;
	t_key pkey;
1848

1849 1850
	pr_debug("get_next iter={node=%p index=%d depth=%d}\n",
		 iter->tnode, iter->index, iter->depth);
1851

1852 1853 1854 1855 1856 1857 1858
	while (!IS_TRIE(pn)) {
		while (cindex < child_length(pn)) {
			struct key_vector *n = get_child_rcu(pn, cindex++);

			if (!n)
				continue;

1859
			if (IS_LEAF(n)) {
1860 1861
				iter->tnode = pn;
				iter->index = cindex;
1862 1863
			} else {
				/* push down one level */
A
Alexander Duyck 已提交
1864
				iter->tnode = n;
1865 1866 1867
				iter->index = 0;
				++iter->depth;
			}
1868

1869 1870
			return n;
		}
1871

1872 1873 1874 1875
		/* Current node exhausted, pop back up */
		pkey = pn->key;
		pn = node_parent_rcu(pn);
		cindex = get_index(pkey, pn) + 1;
1876
		--iter->depth;
1877
	}
1878

1879 1880 1881 1882
	/* record root node so further searches know we are done */
	iter->tnode = pn;
	iter->index = 0;

1883
	return NULL;
1884 1885
}

1886 1887
static struct key_vector *fib_trie_get_first(struct fib_trie_iter *iter,
					     struct trie *t)
1888
{
1889
	struct key_vector *n, *pn = t->kv;
1890

S
Stephen Hemminger 已提交
1891
	if (!t)
1892 1893
		return NULL;

1894
	n = rcu_dereference(pn->tnode[0]);
1895
	if (!n)
1896
		return NULL;
1897

1898
	if (IS_TNODE(n)) {
A
Alexander Duyck 已提交
1899
		iter->tnode = n;
1900 1901 1902
		iter->index = 0;
		iter->depth = 1;
	} else {
1903
		iter->tnode = pn;
1904 1905
		iter->index = 0;
		iter->depth = 0;
O
Olof Johansson 已提交
1906
	}
1907 1908

	return n;
1909
}
O
Olof Johansson 已提交
1910

1911 1912
static void trie_collect_stats(struct trie *t, struct trie_stat *s)
{
1913
	struct key_vector *n;
1914
	struct fib_trie_iter iter;
O
Olof Johansson 已提交
1915

1916
	memset(s, 0, sizeof(*s));
O
Olof Johansson 已提交
1917

1918
	rcu_read_lock();
1919
	for (n = fib_trie_get_first(&iter, t); n; n = fib_trie_get_next(&iter)) {
1920
		if (IS_LEAF(n)) {
A
Alexander Duyck 已提交
1921
			struct fib_alias *fa;
1922

1923 1924 1925 1926
			s->leaves++;
			s->totdepth += iter.depth;
			if (iter.depth > s->maxdepth)
				s->maxdepth = iter.depth;
1927

A
Alexander Duyck 已提交
1928
			hlist_for_each_entry_rcu(fa, &n->leaf, fa_list)
1929
				++s->prefixes;
1930 1931
		} else {
			s->tnodes++;
A
Alexander Duyck 已提交
1932 1933
			if (n->bits < MAX_STAT_DEPTH)
				s->nodesizes[n->bits]++;
1934
			s->nullpointers += tn_info(n)->empty_children;
1935 1936
		}
	}
R
Robert Olsson 已提交
1937
	rcu_read_unlock();
1938 1939
}

1940 1941 1942 1943
/*
 *	This outputs /proc/net/fib_triestats
 */
static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat)
1944
{
E
Eric Dumazet 已提交
1945
	unsigned int i, max, pointers, bytes, avdepth;
1946

1947 1948 1949 1950
	if (stat->leaves)
		avdepth = stat->totdepth*100 / stat->leaves;
	else
		avdepth = 0;
O
Olof Johansson 已提交
1951

1952 1953
	seq_printf(seq, "\tAver depth:     %u.%02d\n",
		   avdepth / 100, avdepth % 100);
1954
	seq_printf(seq, "\tMax depth:      %u\n", stat->maxdepth);
O
Olof Johansson 已提交
1955

1956
	seq_printf(seq, "\tLeaves:         %u\n", stat->leaves);
1957
	bytes = LEAF_SIZE * stat->leaves;
1958 1959

	seq_printf(seq, "\tPrefixes:       %u\n", stat->prefixes);
A
Alexander Duyck 已提交
1960
	bytes += sizeof(struct fib_alias) * stat->prefixes;
1961

1962
	seq_printf(seq, "\tInternal nodes: %u\n\t", stat->tnodes);
1963
	bytes += TNODE_SIZE(0) * stat->tnodes;
1964

R
Robert Olsson 已提交
1965 1966
	max = MAX_STAT_DEPTH;
	while (max > 0 && stat->nodesizes[max-1] == 0)
1967
		max--;
1968

1969
	pointers = 0;
1970
	for (i = 1; i < max; i++)
1971
		if (stat->nodesizes[i] != 0) {
1972
			seq_printf(seq, "  %u: %u",  i, stat->nodesizes[i]);
1973 1974 1975
			pointers += (1<<i) * stat->nodesizes[i];
		}
	seq_putc(seq, '\n');
1976
	seq_printf(seq, "\tPointers: %u\n", pointers);
R
Robert Olsson 已提交
1977

1978
	bytes += sizeof(struct key_vector *) * pointers;
1979 1980
	seq_printf(seq, "Null ptrs: %u\n", stat->nullpointers);
	seq_printf(seq, "Total size: %u  kB\n", (bytes + 1023) / 1024);
1981
}
R
Robert Olsson 已提交
1982

1983
#ifdef CONFIG_IP_FIB_TRIE_STATS
1984
static void trie_show_usage(struct seq_file *seq,
1985
			    const struct trie_use_stats __percpu *stats)
1986
{
1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001
	struct trie_use_stats s = { 0 };
	int cpu;

	/* loop through all of the CPUs and gather up the stats */
	for_each_possible_cpu(cpu) {
		const struct trie_use_stats *pcpu = per_cpu_ptr(stats, cpu);

		s.gets += pcpu->gets;
		s.backtrack += pcpu->backtrack;
		s.semantic_match_passed += pcpu->semantic_match_passed;
		s.semantic_match_miss += pcpu->semantic_match_miss;
		s.null_node_hit += pcpu->null_node_hit;
		s.resize_node_skipped += pcpu->resize_node_skipped;
	}

2002
	seq_printf(seq, "\nCounters:\n---------\n");
2003 2004
	seq_printf(seq, "gets = %u\n", s.gets);
	seq_printf(seq, "backtracks = %u\n", s.backtrack);
2005
	seq_printf(seq, "semantic match passed = %u\n",
2006 2007 2008 2009
		   s.semantic_match_passed);
	seq_printf(seq, "semantic match miss = %u\n", s.semantic_match_miss);
	seq_printf(seq, "null node hit= %u\n", s.null_node_hit);
	seq_printf(seq, "skipped node resize = %u\n\n", s.resize_node_skipped);
2010
}
2011 2012
#endif /*  CONFIG_IP_FIB_TRIE_STATS */

2013
static void fib_table_print(struct seq_file *seq, struct fib_table *tb)
2014
{
2015 2016 2017 2018 2019 2020
	if (tb->tb_id == RT_TABLE_LOCAL)
		seq_puts(seq, "Local:\n");
	else if (tb->tb_id == RT_TABLE_MAIN)
		seq_puts(seq, "Main:\n");
	else
		seq_printf(seq, "Id %d:\n", tb->tb_id);
2021
}
2022

2023

2024 2025
static int fib_triestat_seq_show(struct seq_file *seq, void *v)
{
2026
	struct net *net = (struct net *)seq->private;
2027
	unsigned int h;
2028

2029
	seq_printf(seq,
2030 2031
		   "Basic info: size of leaf:"
		   " %Zd bytes, size of tnode: %Zd bytes.\n",
2032
		   LEAF_SIZE, TNODE_SIZE(0));
2033

2034 2035 2036 2037
	for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
		struct fib_table *tb;

2038
		hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2039 2040
			struct trie *t = (struct trie *) tb->tb_data;
			struct trie_stat stat;
2041

2042 2043 2044 2045 2046 2047 2048 2049
			if (!t)
				continue;

			fib_table_print(seq, tb);

			trie_collect_stats(t, &stat);
			trie_show_stats(seq, &stat);
#ifdef CONFIG_IP_FIB_TRIE_STATS
2050
			trie_show_usage(seq, t->stats);
2051 2052 2053
#endif
		}
	}
2054

2055
	return 0;
2056 2057
}

2058
static int fib_triestat_seq_open(struct inode *inode, struct file *file)
2059
{
2060
	return single_open_net(inode, file, fib_triestat_seq_show);
2061 2062
}

2063
static const struct file_operations fib_triestat_fops = {
2064 2065 2066 2067
	.owner	= THIS_MODULE,
	.open	= fib_triestat_seq_open,
	.read	= seq_read,
	.llseek	= seq_lseek,
2068
	.release = single_release_net,
2069 2070
};

2071
static struct key_vector *fib_trie_get_idx(struct seq_file *seq, loff_t pos)
2072
{
2073 2074
	struct fib_trie_iter *iter = seq->private;
	struct net *net = seq_file_net(seq);
2075
	loff_t idx = 0;
2076
	unsigned int h;
2077

2078 2079 2080
	for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
		struct fib_table *tb;
2081

2082
		hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2083
			struct key_vector *n;
2084 2085 2086 2087 2088 2089 2090 2091 2092

			for (n = fib_trie_get_first(iter,
						    (struct trie *) tb->tb_data);
			     n; n = fib_trie_get_next(iter))
				if (pos == idx++) {
					iter->tb = tb;
					return n;
				}
		}
2093
	}
2094

2095 2096 2097
	return NULL;
}

2098
static void *fib_trie_seq_start(struct seq_file *seq, loff_t *pos)
2099
	__acquires(RCU)
2100
{
2101
	rcu_read_lock();
2102
	return fib_trie_get_idx(seq, *pos);
2103 2104
}

2105
static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2106
{
2107
	struct fib_trie_iter *iter = seq->private;
2108
	struct net *net = seq_file_net(seq);
2109 2110 2111
	struct fib_table *tb = iter->tb;
	struct hlist_node *tb_node;
	unsigned int h;
2112
	struct key_vector *n;
2113

2114
	++*pos;
2115 2116 2117 2118
	/* next node in same table */
	n = fib_trie_get_next(iter);
	if (n)
		return n;
2119

2120 2121
	/* walk rest of this hash chain */
	h = tb->tb_id & (FIB_TABLE_HASHSZ - 1);
E
Eric Dumazet 已提交
2122
	while ((tb_node = rcu_dereference(hlist_next_rcu(&tb->tb_hlist)))) {
2123 2124 2125 2126 2127
		tb = hlist_entry(tb_node, struct fib_table, tb_hlist);
		n = fib_trie_get_first(iter, (struct trie *) tb->tb_data);
		if (n)
			goto found;
	}
2128

2129 2130 2131
	/* new hash chain */
	while (++h < FIB_TABLE_HASHSZ) {
		struct hlist_head *head = &net->ipv4.fib_table_hash[h];
2132
		hlist_for_each_entry_rcu(tb, head, tb_hlist) {
2133 2134 2135 2136 2137
			n = fib_trie_get_first(iter, (struct trie *) tb->tb_data);
			if (n)
				goto found;
		}
	}
2138
	return NULL;
2139 2140 2141 2142

found:
	iter->tb = tb;
	return n;
2143
}
2144

2145
static void fib_trie_seq_stop(struct seq_file *seq, void *v)
2146
	__releases(RCU)
2147
{
2148 2149
	rcu_read_unlock();
}
O
Olof Johansson 已提交
2150

2151 2152
static void seq_indent(struct seq_file *seq, int n)
{
E
Eric Dumazet 已提交
2153 2154
	while (n-- > 0)
		seq_puts(seq, "   ");
2155
}
2156

2157
static inline const char *rtn_scope(char *buf, size_t len, enum rt_scope_t s)
2158
{
S
Stephen Hemminger 已提交
2159
	switch (s) {
2160 2161 2162 2163 2164 2165
	case RT_SCOPE_UNIVERSE: return "universe";
	case RT_SCOPE_SITE:	return "site";
	case RT_SCOPE_LINK:	return "link";
	case RT_SCOPE_HOST:	return "host";
	case RT_SCOPE_NOWHERE:	return "nowhere";
	default:
2166
		snprintf(buf, len, "scope=%d", s);
2167 2168 2169
		return buf;
	}
}
2170

2171
static const char *const rtn_type_names[__RTN_MAX] = {
2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184
	[RTN_UNSPEC] = "UNSPEC",
	[RTN_UNICAST] = "UNICAST",
	[RTN_LOCAL] = "LOCAL",
	[RTN_BROADCAST] = "BROADCAST",
	[RTN_ANYCAST] = "ANYCAST",
	[RTN_MULTICAST] = "MULTICAST",
	[RTN_BLACKHOLE] = "BLACKHOLE",
	[RTN_UNREACHABLE] = "UNREACHABLE",
	[RTN_PROHIBIT] = "PROHIBIT",
	[RTN_THROW] = "THROW",
	[RTN_NAT] = "NAT",
	[RTN_XRESOLVE] = "XRESOLVE",
};
2185

E
Eric Dumazet 已提交
2186
static inline const char *rtn_type(char *buf, size_t len, unsigned int t)
2187 2188 2189
{
	if (t < __RTN_MAX && rtn_type_names[t])
		return rtn_type_names[t];
2190
	snprintf(buf, len, "type %u", t);
2191
	return buf;
2192 2193
}

2194 2195
/* Pretty print the trie */
static int fib_trie_seq_show(struct seq_file *seq, void *v)
2196
{
2197
	const struct fib_trie_iter *iter = seq->private;
2198
	struct key_vector *n = v;
2199

2200
	if (IS_TRIE(node_parent_rcu(n)))
2201
		fib_table_print(seq, iter->tb);
2202

2203
	if (IS_TNODE(n)) {
A
Alexander Duyck 已提交
2204
		__be32 prf = htonl(n->key);
O
Olof Johansson 已提交
2205

2206 2207 2208
		seq_indent(seq, iter->depth-1);
		seq_printf(seq, "  +-- %pI4/%zu %u %u %u\n",
			   &prf, KEYLENGTH - n->pos - n->bits, n->bits,
2209 2210
			   tn_info(n)->full_children,
			   tn_info(n)->empty_children);
2211
	} else {
A
Alexander Duyck 已提交
2212
		__be32 val = htonl(n->key);
A
Alexander Duyck 已提交
2213
		struct fib_alias *fa;
2214 2215

		seq_indent(seq, iter->depth);
2216
		seq_printf(seq, "  |-- %pI4\n", &val);
2217

A
Alexander Duyck 已提交
2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230
		hlist_for_each_entry_rcu(fa, &n->leaf, fa_list) {
			char buf1[32], buf2[32];

			seq_indent(seq, iter->depth + 1);
			seq_printf(seq, "  /%zu %s %s",
				   KEYLENGTH - fa->fa_slen,
				   rtn_scope(buf1, sizeof(buf1),
					     fa->fa_info->fib_scope),
				   rtn_type(buf2, sizeof(buf2),
					    fa->fa_type));
			if (fa->fa_tos)
				seq_printf(seq, " tos=%d", fa->fa_tos);
			seq_putc(seq, '\n');
2231
		}
2232
	}
2233

2234 2235 2236
	return 0;
}

2237
static const struct seq_operations fib_trie_seq_ops = {
2238 2239 2240 2241
	.start  = fib_trie_seq_start,
	.next   = fib_trie_seq_next,
	.stop   = fib_trie_seq_stop,
	.show   = fib_trie_seq_show,
2242 2243
};

2244
static int fib_trie_seq_open(struct inode *inode, struct file *file)
2245
{
2246 2247
	return seq_open_net(inode, file, &fib_trie_seq_ops,
			    sizeof(struct fib_trie_iter));
2248 2249
}

2250
static const struct file_operations fib_trie_fops = {
2251 2252 2253 2254
	.owner  = THIS_MODULE,
	.open   = fib_trie_seq_open,
	.read   = seq_read,
	.llseek = seq_lseek,
2255
	.release = seq_release_net,
2256 2257
};

2258 2259
struct fib_route_iter {
	struct seq_net_private p;
2260
	struct fib_table *main_tb;
2261
	struct key_vector *tnode;
2262 2263 2264 2265
	loff_t	pos;
	t_key	key;
};

2266 2267
static struct key_vector *fib_route_get_idx(struct fib_route_iter *iter,
					    loff_t pos)
2268
{
2269
	struct fib_table *tb = iter->main_tb;
2270
	struct key_vector *l, **tp = &iter->tnode;
2271 2272
	struct trie *t;
	t_key key;
2273

2274 2275
	/* use cache location of next-to-find key */
	if (iter->pos > 0 && pos >= iter->pos) {
2276
		pos -= iter->pos;
2277 2278 2279
		key = iter->key;
	} else {
		t = (struct trie *)tb->tb_data;
2280
		iter->tnode = t->kv;
2281
		iter->pos = 0;
2282
		key = 0;
2283 2284
	}

2285 2286
	while ((l = leaf_walk_rcu(tp, key)) != NULL) {
		key = l->key + 1;
2287
		iter->pos++;
2288 2289 2290 2291 2292 2293 2294 2295 2296

		if (pos-- <= 0)
			break;

		l = NULL;

		/* handle unlikely case of a key wrap */
		if (!key)
			break;
2297 2298 2299
	}

	if (l)
2300
		iter->key = key;	/* remember it */
2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311
	else
		iter->pos = 0;		/* forget it */

	return l;
}

static void *fib_route_seq_start(struct seq_file *seq, loff_t *pos)
	__acquires(RCU)
{
	struct fib_route_iter *iter = seq->private;
	struct fib_table *tb;
2312
	struct trie *t;
2313 2314

	rcu_read_lock();
2315

2316
	tb = fib_get_table(seq_file_net(seq), RT_TABLE_MAIN);
2317 2318 2319
	if (!tb)
		return NULL;

2320 2321 2322 2323 2324 2325
	iter->main_tb = tb;

	if (*pos != 0)
		return fib_route_get_idx(iter, *pos);

	t = (struct trie *)tb->tb_data;
2326
	iter->tnode = t->kv;
2327 2328 2329 2330
	iter->pos = 0;
	iter->key = 0;

	return SEQ_START_TOKEN;
2331 2332 2333 2334 2335
}

static void *fib_route_seq_next(struct seq_file *seq, void *v, loff_t *pos)
{
	struct fib_route_iter *iter = seq->private;
2336
	struct key_vector *l = NULL;
2337
	t_key key = iter->key;
2338 2339

	++*pos;
2340 2341 2342 2343 2344 2345 2346

	/* only allow key of 0 for start of sequence */
	if ((v == SEQ_START_TOKEN) || key)
		l = leaf_walk_rcu(&iter->tnode, key);

	if (l) {
		iter->key = l->key + 1;
2347
		iter->pos++;
2348 2349
	} else {
		iter->pos = 0;
2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360
	}

	return l;
}

static void fib_route_seq_stop(struct seq_file *seq, void *v)
	__releases(RCU)
{
	rcu_read_unlock();
}

E
Eric Dumazet 已提交
2361
static unsigned int fib_flag_trans(int type, __be32 mask, const struct fib_info *fi)
2362
{
E
Eric Dumazet 已提交
2363
	unsigned int flags = 0;
2364

E
Eric Dumazet 已提交
2365 2366
	if (type == RTN_UNREACHABLE || type == RTN_PROHIBIT)
		flags = RTF_REJECT;
2367 2368
	if (fi && fi->fib_nh->nh_gw)
		flags |= RTF_GATEWAY;
A
Al Viro 已提交
2369
	if (mask == htonl(0xFFFFFFFF))
2370 2371 2372
		flags |= RTF_HOST;
	flags |= RTF_UP;
	return flags;
2373 2374
}

2375 2376 2377
/*
 *	This outputs /proc/net/route.
 *	The format of the file is not supposed to be changed
E
Eric Dumazet 已提交
2378
 *	and needs to be same as fib_hash output to avoid breaking
2379 2380 2381
 *	legacy utilities
 */
static int fib_route_seq_show(struct seq_file *seq, void *v)
2382
{
A
Alexander Duyck 已提交
2383
	struct fib_alias *fa;
2384
	struct key_vector *l = v;
2385
	__be32 prefix;
2386

2387 2388 2389 2390 2391 2392
	if (v == SEQ_START_TOKEN) {
		seq_printf(seq, "%-127s\n", "Iface\tDestination\tGateway "
			   "\tFlags\tRefCnt\tUse\tMetric\tMask\t\tMTU"
			   "\tWindow\tIRTT");
		return 0;
	}
2393

2394 2395
	prefix = htonl(l->key);

A
Alexander Duyck 已提交
2396 2397 2398 2399
	hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) {
		const struct fib_info *fi = fa->fa_info;
		__be32 mask = inet_make_mask(KEYLENGTH - fa->fa_slen);
		unsigned int flags = fib_flag_trans(fa->fa_type, mask, fi);
2400

A
Alexander Duyck 已提交
2401 2402 2403
		if ((fa->fa_type == RTN_BROADCAST) ||
		    (fa->fa_type == RTN_MULTICAST))
			continue;
2404

A
Alexander Duyck 已提交
2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425
		seq_setwidth(seq, 127);

		if (fi)
			seq_printf(seq,
				   "%s\t%08X\t%08X\t%04X\t%d\t%u\t"
				   "%d\t%08X\t%d\t%u\t%u",
				   fi->fib_dev ? fi->fib_dev->name : "*",
				   prefix,
				   fi->fib_nh->nh_gw, flags, 0, 0,
				   fi->fib_priority,
				   mask,
				   (fi->fib_advmss ?
				    fi->fib_advmss + 40 : 0),
				   fi->fib_window,
				   fi->fib_rtt >> 3);
		else
			seq_printf(seq,
				   "*\t%08X\t%08X\t%04X\t%d\t%u\t"
				   "%d\t%08X\t%d\t%u\t%u",
				   prefix, 0, flags, 0, 0, 0,
				   mask, 0, 0, 0);
2426

A
Alexander Duyck 已提交
2427
		seq_pad(seq, '\n');
2428 2429 2430 2431 2432
	}

	return 0;
}

2433
static const struct seq_operations fib_route_seq_ops = {
2434 2435 2436
	.start  = fib_route_seq_start,
	.next   = fib_route_seq_next,
	.stop   = fib_route_seq_stop,
2437
	.show   = fib_route_seq_show,
2438 2439
};

2440
static int fib_route_seq_open(struct inode *inode, struct file *file)
2441
{
2442
	return seq_open_net(inode, file, &fib_route_seq_ops,
2443
			    sizeof(struct fib_route_iter));
2444 2445
}

2446
static const struct file_operations fib_route_fops = {
2447 2448 2449 2450
	.owner  = THIS_MODULE,
	.open   = fib_route_seq_open,
	.read   = seq_read,
	.llseek = seq_lseek,
2451
	.release = seq_release_net,
2452 2453
};

2454
int __net_init fib_proc_init(struct net *net)
2455
{
2456
	if (!proc_create("fib_trie", S_IRUGO, net->proc_net, &fib_trie_fops))
2457 2458
		goto out1;

2459 2460
	if (!proc_create("fib_triestat", S_IRUGO, net->proc_net,
			 &fib_triestat_fops))
2461 2462
		goto out2;

2463
	if (!proc_create("route", S_IRUGO, net->proc_net, &fib_route_fops))
2464 2465
		goto out3;

2466
	return 0;
2467 2468

out3:
2469
	remove_proc_entry("fib_triestat", net->proc_net);
2470
out2:
2471
	remove_proc_entry("fib_trie", net->proc_net);
2472 2473
out1:
	return -ENOMEM;
2474 2475
}

2476
void __net_exit fib_proc_exit(struct net *net)
2477
{
2478 2479 2480
	remove_proc_entry("fib_trie", net->proc_net);
	remove_proc_entry("fib_triestat", net->proc_net);
	remove_proc_entry("route", net->proc_net);
2481 2482 2483
}

#endif /* CONFIG_PROC_FS */