]> err.no Git - linux-2.6/commitdiff
[IPV4]: last default route is a fib table property
authorDenis V. Lunev <den@openvz.org>
Sat, 8 Dec 2007 08:32:23 +0000 (00:32 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Jan 2008 22:57:01 +0000 (14:57 -0800)
Signed-off-by: Denis V. Lunev <den@openvz.org>
Acked-by: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip_fib.h
net/ipv4/fib_hash.c
net/ipv4/fib_trie.c

index 690fb4dd75056b7bb4ed5b3e496a0102bb5c3a7a..d70b9b49f8b154a541b5e2db5135f58321c34e2c 100644 (file)
@@ -141,6 +141,7 @@ struct fib_table {
        struct hlist_node tb_hlist;
        u32             tb_id;
        unsigned        tb_stamp;
+       int             tb_default;
        int             (*tb_lookup)(struct fib_table *tb, const struct flowi *flp, struct fib_result *res);
        int             (*tb_insert)(struct fib_table *, struct fib_config *);
        int             (*tb_delete)(struct fib_table *, struct fib_config *);
index 86087d45c64e29548fdc134fe5dcf330f6f65654..9d5404158476dc6e504aea717243e8ea72866e44 100644 (file)
@@ -272,8 +272,6 @@ out:
        return err;
 }
 
-static int fn_hash_last_dflt=-1;
-
 static void
 fn_hash_select_default(struct fib_table *tb, const struct flowi *flp, struct fib_result *res)
 {
@@ -314,9 +312,9 @@ fn_hash_select_default(struct fib_table *tb, const struct flowi *flp, struct fib
                                if (next_fi != res->fi)
                                        break;
                        } else if (!fib_detect_death(fi, order, &last_resort,
-                                                    &last_idx, fn_hash_last_dflt)) {
+                                               &last_idx, tb->tb_default)) {
                                fib_result_assign(res, fi);
-                               fn_hash_last_dflt = order;
+                               tb->tb_default = order;
                                goto out;
                        }
                        fi = next_fi;
@@ -325,19 +323,20 @@ fn_hash_select_default(struct fib_table *tb, const struct flowi *flp, struct fib
        }
 
        if (order <= 0 || fi == NULL) {
-               fn_hash_last_dflt = -1;
+               tb->tb_default = -1;
                goto out;
        }
 
-       if (!fib_detect_death(fi, order, &last_resort, &last_idx, fn_hash_last_dflt)) {
+       if (!fib_detect_death(fi, order, &last_resort, &last_idx,
+                               tb->tb_default)) {
                fib_result_assign(res, fi);
-               fn_hash_last_dflt = order;
+               tb->tb_default = order;
                goto out;
        }
 
        if (last_idx >= 0)
                fib_result_assign(res, last_resort);
-       fn_hash_last_dflt = last_idx;
+       tb->tb_default = last_idx;
 out:
        read_unlock(&fib_hash_lock);
 }
@@ -773,6 +772,7 @@ struct fib_table * __init fib_hash_init(u32 id)
                return NULL;
 
        tb->tb_id = id;
+       tb->tb_default = -1;
        tb->tb_lookup = fn_hash_lookup;
        tb->tb_insert = fn_hash_insert;
        tb->tb_delete = fn_hash_delete;
index c7c5c6c802dfd2edc58756f0b071b5220bf6f46f..9126eea71670b59b627c6605d5ca8cce034bcda4 100644 (file)
@@ -1782,8 +1782,6 @@ static int fn_trie_flush(struct fib_table *tb)
        return found;
 }
 
-static int trie_last_dflt = -1;
-
 static void
 fn_trie_select_default(struct fib_table *tb, const struct flowi *flp, struct fib_result *res)
 {
@@ -1830,28 +1828,29 @@ fn_trie_select_default(struct fib_table *tb, const struct flowi *flp, struct fib
                        if (next_fi != res->fi)
                                break;
                } else if (!fib_detect_death(fi, order, &last_resort,
-                                            &last_idx, trie_last_dflt)) {
+                                            &last_idx, tb->tb_default)) {
                        fib_result_assign(res, fi);
-                       trie_last_dflt = order;
+                       tb->tb_default = order;
                        goto out;
                }
                fi = next_fi;
                order++;
        }
        if (order <= 0 || fi == NULL) {
-               trie_last_dflt = -1;
+               tb->tb_default = -1;
                goto out;
        }
 
-       if (!fib_detect_death(fi, order, &last_resort, &last_idx, trie_last_dflt)) {
+       if (!fib_detect_death(fi, order, &last_resort, &last_idx,
+                               tb->tb_default)) {
                fib_result_assign(res, fi);
-               trie_last_dflt = order;
+               tb->tb_default = order;
                goto out;
        }
        if (last_idx >= 0)
                fib_result_assign(res, last_resort);
-       trie_last_dflt = last_idx;
- out:;
+       tb->tb_default = last_idx;
+out:
        rcu_read_unlock();
 }
 
@@ -1978,6 +1977,7 @@ struct fib_table * __init fib_hash_init(u32 id)
                return NULL;
 
        tb->tb_id = id;
+       tb->tb_default = -1;
        tb->tb_lookup = fn_trie_lookup;
        tb->tb_insert = fn_trie_insert;
        tb->tb_delete = fn_trie_delete;