|
@@ -164,7 +164,6 @@ static struct tnode *halve(struct trie *t, struct tnode *tn);
|
|
|
static void tnode_free(struct tnode *tn);
|
|
|
|
|
|
static struct kmem_cache *fn_alias_kmem __read_mostly;
|
|
|
-static struct trie *trie_local = NULL, *trie_main = NULL;
|
|
|
|
|
|
static inline struct tnode *node_parent(struct node *node)
|
|
|
{
|
|
@@ -2002,11 +2001,6 @@ struct fib_table * __init fib_hash_init(u32 id)
|
|
|
|
|
|
trie_init(t);
|
|
|
|
|
|
- if (id == RT_TABLE_LOCAL)
|
|
|
- trie_local = t;
|
|
|
- else if (id == RT_TABLE_MAIN)
|
|
|
- trie_main = t;
|
|
|
-
|
|
|
if (id == RT_TABLE_LOCAL)
|
|
|
printk(KERN_INFO "IPv4 FIB: Using LC-trie version %s\n", VERSION);
|
|
|
|
|
@@ -2016,6 +2010,7 @@ struct fib_table * __init fib_hash_init(u32 id)
|
|
|
#ifdef CONFIG_PROC_FS
|
|
|
/* Depth first Trie walk iterator */
|
|
|
struct fib_trie_iter {
|
|
|
+ struct trie *trie_local, *trie_main;
|
|
|
struct tnode *tnode;
|
|
|
struct trie *trie;
|
|
|
unsigned index;
|
|
@@ -2182,7 +2177,20 @@ static void trie_show_stats(struct seq_file *seq, struct trie_stat *stat)
|
|
|
|
|
|
static int fib_triestat_seq_show(struct seq_file *seq, void *v)
|
|
|
{
|
|
|
+ struct trie *trie_local, *trie_main;
|
|
|
struct trie_stat *stat;
|
|
|
+ struct fib_table *tb;
|
|
|
+
|
|
|
+ trie_local = NULL;
|
|
|
+ tb = fib_get_table(RT_TABLE_LOCAL);
|
|
|
+ if (tb)
|
|
|
+ trie_local = (struct trie *) tb->tb_data;
|
|
|
+
|
|
|
+ trie_main = NULL;
|
|
|
+ tb = fib_get_table(RT_TABLE_MAIN);
|
|
|
+ if (tb)
|
|
|
+ trie_main = (struct trie *) tb->tb_data;
|
|
|
+
|
|
|
|
|
|
stat = kmalloc(sizeof(*stat), GFP_KERNEL);
|
|
|
if (!stat)
|
|
@@ -2226,13 +2234,13 @@ static struct node *fib_trie_get_idx(struct fib_trie_iter *iter,
|
|
|
loff_t idx = 0;
|
|
|
struct node *n;
|
|
|
|
|
|
- for (n = fib_trie_get_first(iter, trie_local);
|
|
|
+ for (n = fib_trie_get_first(iter, iter->trie_local);
|
|
|
n; ++idx, n = fib_trie_get_next(iter)) {
|
|
|
if (pos == idx)
|
|
|
return n;
|
|
|
}
|
|
|
|
|
|
- for (n = fib_trie_get_first(iter, trie_main);
|
|
|
+ for (n = fib_trie_get_first(iter, iter->trie_main);
|
|
|
n; ++idx, n = fib_trie_get_next(iter)) {
|
|
|
if (pos == idx)
|
|
|
return n;
|
|
@@ -2242,10 +2250,23 @@ static struct node *fib_trie_get_idx(struct fib_trie_iter *iter,
|
|
|
|
|
|
static void *fib_trie_seq_start(struct seq_file *seq, loff_t *pos)
|
|
|
{
|
|
|
+ struct fib_trie_iter *iter = seq->private;
|
|
|
+ struct fib_table *tb;
|
|
|
+
|
|
|
+ if (!iter->trie_local) {
|
|
|
+ tb = fib_get_table(RT_TABLE_LOCAL);
|
|
|
+ if (tb)
|
|
|
+ iter->trie_local = (struct trie *) tb->tb_data;
|
|
|
+ }
|
|
|
+ if (!iter->trie_main) {
|
|
|
+ tb = fib_get_table(RT_TABLE_MAIN);
|
|
|
+ if (tb)
|
|
|
+ iter->trie_main = (struct trie *) tb->tb_data;
|
|
|
+ }
|
|
|
rcu_read_lock();
|
|
|
if (*pos == 0)
|
|
|
return SEQ_START_TOKEN;
|
|
|
- return fib_trie_get_idx(seq->private, *pos - 1);
|
|
|
+ return fib_trie_get_idx(iter, *pos - 1);
|
|
|
}
|
|
|
|
|
|
static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|
@@ -2263,8 +2284,8 @@ static void *fib_trie_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
|
|
return v;
|
|
|
|
|
|
/* continue scan in next trie */
|
|
|
- if (iter->trie == trie_local)
|
|
|
- return fib_trie_get_first(iter, trie_main);
|
|
|
+ if (iter->trie == iter->trie_local)
|
|
|
+ return fib_trie_get_first(iter, iter->trie_main);
|
|
|
|
|
|
return NULL;
|
|
|
}
|
|
@@ -2330,7 +2351,7 @@ static int fib_trie_seq_show(struct seq_file *seq, void *v)
|
|
|
return 0;
|
|
|
|
|
|
if (!node_parent(n)) {
|
|
|
- if (iter->trie == trie_local)
|
|
|
+ if (iter->trie == iter->trie_local)
|
|
|
seq_puts(seq, "<local>:\n");
|
|
|
else
|
|
|
seq_puts(seq, "<main>:\n");
|
|
@@ -2429,7 +2450,7 @@ static int fib_route_seq_show(struct seq_file *seq, void *v)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- if (iter->trie == trie_local)
|
|
|
+ if (iter->trie == iter->trie_local)
|
|
|
return 0;
|
|
|
if (IS_TNODE(l))
|
|
|
return 0;
|