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