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