Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=93456b6d7753def8760b423ac6b986eb9d5a4a95
Commit:     93456b6d7753def8760b423ac6b986eb9d5a4a95
Parent:     7b1a74fdbb9ec38a9780620fae25519fde4b21ee
Author:     Denis V. Lunev <[EMAIL PROTECTED]>
AuthorDate: Thu Jan 10 03:23:38 2008 -0800
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Mon Jan 28 15:01:26 2008 -0800

    [IPV4]: Unify access to the routing tables.
    
    Replace the direct pointers to local and main tables with
    calls to fib_get_table() with appropriate argument.
    
    This doesn't introduce additional dereferences, but makes the access to fib
    tables uniform in any (CONFIG_IP_MULTIPLE_TABLES) case.
    
    Acked-by: Benjamin Thery <[EMAIL PROTECTED]>
    Acked-by: Daniel Lezcano <[EMAIL PROTECTED]>
    Signed-off-by: Denis V. Lunev <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 include/net/ip_fib.h    |   39 ++++++++++++++++++++++++++++-----------
 net/ipv4/fib_frontend.c |   29 ++++++++++++-----------------
 2 files changed, 40 insertions(+), 28 deletions(-)

diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index 338d3ed..249af66 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h
@@ -120,16 +120,22 @@ struct fib_result_nl {
        int             err;      
 };
 
+extern struct hlist_head fib_table_hash[];
+
 #ifdef CONFIG_IP_ROUTE_MULTIPATH
 
 #define FIB_RES_NH(res)                ((res).fi->fib_nh[(res).nh_sel])
 #define FIB_RES_RESET(res)     ((res).nh_sel = 0)
 
+#define FIB_TABLE_HASHSZ 2
+
 #else /* CONFIG_IP_ROUTE_MULTIPATH */
 
 #define FIB_RES_NH(res)                ((res).fi->fib_nh[0])
 #define FIB_RES_RESET(res)
 
+#define FIB_TABLE_HASHSZ 256
+
 #endif /* CONFIG_IP_ROUTE_MULTIPATH */
 
 #define FIB_RES_PREFSRC(res)           ((res).fi->fib_prefsrc ? : 
__fib_res_prefsrc(&res))
@@ -156,14 +162,17 @@ struct fib_table {
 
 #ifndef CONFIG_IP_MULTIPLE_TABLES
 
-extern struct fib_table *ip_fib_local_table;
-extern struct fib_table *ip_fib_main_table;
+#define TABLE_LOCAL_INDEX      0
+#define TABLE_MAIN_INDEX       1
 
 static inline struct fib_table *fib_get_table(u32 id)
 {
-       if (id != RT_TABLE_LOCAL)
-               return ip_fib_main_table;
-       return ip_fib_local_table;
+       struct hlist_head *ptr;
+
+       ptr = id == RT_TABLE_LOCAL ?
+               &fib_table_hash[TABLE_LOCAL_INDEX] :
+               &fib_table_hash[TABLE_MAIN_INDEX];
+       return hlist_entry(ptr->first, struct fib_table, tb_hlist);
 }
 
 static inline struct fib_table *fib_new_table(u32 id)
@@ -173,16 +182,24 @@ static inline struct fib_table *fib_new_table(u32 id)
 
 static inline int fib_lookup(const struct flowi *flp, struct fib_result *res)
 {
-       if (ip_fib_local_table->tb_lookup(ip_fib_local_table, flp, res) &&
-           ip_fib_main_table->tb_lookup(ip_fib_main_table, flp, res))
-               return -ENETUNREACH;
-       return 0;
+       struct fib_table *table;
+
+       table = fib_get_table(RT_TABLE_LOCAL);
+       if (!table->tb_lookup(table, flp, res))
+               return 0;
+
+       table = fib_get_table(RT_TABLE_MAIN);
+       if (!table->tb_lookup(table, flp, res))
+               return 0;
+       return -ENETUNREACH;
 }
 
-static inline void fib_select_default(const struct flowi *flp, struct 
fib_result *res)
+static inline void fib_select_default(const struct flowi *flp,
+                                     struct fib_result *res)
 {
+       struct fib_table *table = fib_get_table(RT_TABLE_MAIN);
        if (FIB_RES_GW(*res) && FIB_RES_NH(*res).nh_scope == RT_SCOPE_LINK)
-               ip_fib_main_table->tb_select_default(ip_fib_main_table, flp, 
res);
+               table->tb_select_default(table, flp, res);
 }
 
 #else /* CONFIG_IP_MULTIPLE_TABLES */
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index 0484cae..9ff1e66 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -50,39 +50,34 @@
 #define FFprint(a...) printk(KERN_DEBUG a)
 
 static struct sock *fibnl;
+struct hlist_head fib_table_hash[FIB_TABLE_HASHSZ];
 
 #ifndef CONFIG_IP_MULTIPLE_TABLES
 
-struct fib_table *ip_fib_local_table;
-struct fib_table *ip_fib_main_table;
-
-#define FIB_TABLE_HASHSZ 1
-static struct hlist_head fib_table_hash[FIB_TABLE_HASHSZ];
-
 static int __net_init fib4_rules_init(struct net *net)
 {
-       ip_fib_local_table = fib_hash_init(RT_TABLE_LOCAL);
-       if (ip_fib_local_table == NULL)
+       struct fib_table *local_table, *main_table;
+
+       local_table = fib_hash_init(RT_TABLE_LOCAL);
+       if (local_table == NULL)
                return -ENOMEM;
 
-       ip_fib_main_table  = fib_hash_init(RT_TABLE_MAIN);
-       if (ip_fib_main_table == NULL)
+       main_table  = fib_hash_init(RT_TABLE_MAIN);
+       if (main_table == NULL)
                goto fail;
 
-       hlist_add_head_rcu(&ip_fib_local_table->tb_hlist, &fib_table_hash[0]);
-       hlist_add_head_rcu(&ip_fib_main_table->tb_hlist, &fib_table_hash[0]);
+       hlist_add_head_rcu(&local_table->tb_hlist,
+                               &fib_table_hash[TABLE_LOCAL_INDEX]);
+       hlist_add_head_rcu(&main_table->tb_hlist,
+                               &fib_table_hash[TABLE_MAIN_INDEX]);
        return 0;
 
 fail:
-       kfree(ip_fib_local_table);
-       ip_fib_local_table = NULL;
+       kfree(local_table);
        return -ENOMEM;
 }
 #else
 
-#define FIB_TABLE_HASHSZ 256
-static struct hlist_head fib_table_hash[FIB_TABLE_HASHSZ];
-
 struct fib_table *fib_new_table(u32 id)
 {
        struct fib_table *tb;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to