Commit 93456b6d authored by Denis V. Lunev's avatar Denis V. Lunev Committed by David S. Miller

[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: default avatarBenjamin Thery <benjamin.thery@bull.net>
Acked-by: default avatarDaniel Lezcano <dlezcano@fr.ibm.com>
Signed-off-by: default avatarDenis V. Lunev <den@openvz.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7b1a74fd
...@@ -120,16 +120,22 @@ struct fib_result_nl { ...@@ -120,16 +120,22 @@ struct fib_result_nl {
int err; int err;
}; };
extern struct hlist_head fib_table_hash[];
#ifdef CONFIG_IP_ROUTE_MULTIPATH #ifdef CONFIG_IP_ROUTE_MULTIPATH
#define FIB_RES_NH(res) ((res).fi->fib_nh[(res).nh_sel]) #define FIB_RES_NH(res) ((res).fi->fib_nh[(res).nh_sel])
#define FIB_RES_RESET(res) ((res).nh_sel = 0) #define FIB_RES_RESET(res) ((res).nh_sel = 0)
#define FIB_TABLE_HASHSZ 2
#else /* CONFIG_IP_ROUTE_MULTIPATH */ #else /* CONFIG_IP_ROUTE_MULTIPATH */
#define FIB_RES_NH(res) ((res).fi->fib_nh[0]) #define FIB_RES_NH(res) ((res).fi->fib_nh[0])
#define FIB_RES_RESET(res) #define FIB_RES_RESET(res)
#define FIB_TABLE_HASHSZ 256
#endif /* CONFIG_IP_ROUTE_MULTIPATH */ #endif /* CONFIG_IP_ROUTE_MULTIPATH */
#define FIB_RES_PREFSRC(res) ((res).fi->fib_prefsrc ? : __fib_res_prefsrc(&res)) #define FIB_RES_PREFSRC(res) ((res).fi->fib_prefsrc ? : __fib_res_prefsrc(&res))
...@@ -156,14 +162,17 @@ struct fib_table { ...@@ -156,14 +162,17 @@ struct fib_table {
#ifndef CONFIG_IP_MULTIPLE_TABLES #ifndef CONFIG_IP_MULTIPLE_TABLES
extern struct fib_table *ip_fib_local_table; #define TABLE_LOCAL_INDEX 0
extern struct fib_table *ip_fib_main_table; #define TABLE_MAIN_INDEX 1
static inline struct fib_table *fib_get_table(u32 id) static inline struct fib_table *fib_get_table(u32 id)
{ {
if (id != RT_TABLE_LOCAL) struct hlist_head *ptr;
return ip_fib_main_table;
return ip_fib_local_table; 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) static inline struct fib_table *fib_new_table(u32 id)
...@@ -173,16 +182,24 @@ 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) 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) && struct fib_table *table;
ip_fib_main_table->tb_lookup(ip_fib_main_table, flp, res))
return -ENETUNREACH; 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 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) 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 */ #else /* CONFIG_IP_MULTIPLE_TABLES */
......
...@@ -50,39 +50,34 @@ ...@@ -50,39 +50,34 @@
#define FFprint(a...) printk(KERN_DEBUG a) #define FFprint(a...) printk(KERN_DEBUG a)
static struct sock *fibnl; static struct sock *fibnl;
struct hlist_head fib_table_hash[FIB_TABLE_HASHSZ];
#ifndef CONFIG_IP_MULTIPLE_TABLES #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) static int __net_init fib4_rules_init(struct net *net)
{ {
ip_fib_local_table = fib_hash_init(RT_TABLE_LOCAL); struct fib_table *local_table, *main_table;
if (ip_fib_local_table == NULL)
local_table = fib_hash_init(RT_TABLE_LOCAL);
if (local_table == NULL)
return -ENOMEM; return -ENOMEM;
ip_fib_main_table = fib_hash_init(RT_TABLE_MAIN); main_table = fib_hash_init(RT_TABLE_MAIN);
if (ip_fib_main_table == NULL) if (main_table == NULL)
goto fail; goto fail;
hlist_add_head_rcu(&ip_fib_local_table->tb_hlist, &fib_table_hash[0]); hlist_add_head_rcu(&local_table->tb_hlist,
hlist_add_head_rcu(&ip_fib_main_table->tb_hlist, &fib_table_hash[0]); &fib_table_hash[TABLE_LOCAL_INDEX]);
hlist_add_head_rcu(&main_table->tb_hlist,
&fib_table_hash[TABLE_MAIN_INDEX]);
return 0; return 0;
fail: fail:
kfree(ip_fib_local_table); kfree(local_table);
ip_fib_local_table = NULL;
return -ENOMEM; return -ENOMEM;
} }
#else #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 *fib_new_table(u32 id)
{ {
struct fib_table *tb; struct fib_table *tb;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment