aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/ip_fib.h
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2006-08-11 02:10:46 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2006-09-22 17:54:26 -0400
commit1af5a8c4a11cfed0c9a7f30fcfb689981750599c (patch)
tree9affafefd0b4a023d527e3f5d386957bd1dace7b /include/net/ip_fib.h
parent9e762a4a89b302cb3b26a1f9bb33eff459eaeca9 (diff)
[IPV4]: Increase number of possible routing tables to 2^32
Increase the number of possible routing tables to 2^32 by replacing the fixed sized array of pointers by a hash table and replacing iterations over all possible table IDs by hash table walking. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/ip_fib.h')
-rw-r--r--include/net/ip_fib.h25
1 files changed, 5 insertions, 20 deletions
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index 0dcbf166eb94..8e9ba563d342 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h
@@ -150,6 +150,7 @@ struct fib_result_nl {
150#endif /* CONFIG_IP_ROUTE_MULTIPATH_WRANDOM */ 150#endif /* CONFIG_IP_ROUTE_MULTIPATH_WRANDOM */
151 151
152struct fib_table { 152struct fib_table {
153 struct hlist_node tb_hlist;
153 u32 tb_id; 154 u32 tb_id;
154 unsigned tb_stamp; 155 unsigned tb_stamp;
155 int (*tb_lookup)(struct fib_table *tb, const struct flowi *flp, struct fib_result *res); 156 int (*tb_lookup)(struct fib_table *tb, const struct flowi *flp, struct fib_result *res);
@@ -200,29 +201,13 @@ static inline void fib_select_default(const struct flowi *flp, struct fib_result
200} 201}
201 202
202#else /* CONFIG_IP_MULTIPLE_TABLES */ 203#else /* CONFIG_IP_MULTIPLE_TABLES */
203#define ip_fib_local_table (fib_tables[RT_TABLE_LOCAL]) 204#define ip_fib_local_table fib_get_table(RT_TABLE_LOCAL)
204#define ip_fib_main_table (fib_tables[RT_TABLE_MAIN]) 205#define ip_fib_main_table fib_get_table(RT_TABLE_MAIN)
205 206
206extern struct fib_table * fib_tables[RT_TABLE_MAX+1];
207extern int fib_lookup(struct flowi *flp, struct fib_result *res); 207extern int fib_lookup(struct flowi *flp, struct fib_result *res);
208extern struct fib_table *__fib_new_table(u32 id);
209
210static inline struct fib_table *fib_get_table(u32 id)
211{
212 if (id == 0)
213 id = RT_TABLE_MAIN;
214
215 return fib_tables[id];
216}
217
218static inline struct fib_table *fib_new_table(u32 id)
219{
220 if (id == 0)
221 id = RT_TABLE_MAIN;
222
223 return fib_tables[id] ? : __fib_new_table(id);
224}
225 208
209extern struct fib_table *fib_new_table(u32 id);
210extern struct fib_table *fib_get_table(u32 id);
226extern void fib_select_default(const struct flowi *flp, struct fib_result *res); 211extern void fib_select_default(const struct flowi *flp, struct fib_result *res);
227 212
228#endif /* CONFIG_IP_MULTIPLE_TABLES */ 213#endif /* CONFIG_IP_MULTIPLE_TABLES */