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