12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- From: Alexander Duyck <alexander.h.duyck@redhat.com>
- Date: Tue, 2 Dec 2014 10:58:21 -0800
- Subject: [PATCH] fib_trie: Fix /proc/net/fib_trie when
- CONFIG_IP_MULTIPLE_TABLES is not defined
- In recent testing I had disabled CONFIG_IP_MULTIPLE_TABLES and as a result
- when I ran "cat /proc/net/fib_trie" the main trie was displayed multiple
- times. I found that the problem line of code was in the function
- fib_trie_seq_next. Specifically the line below caused the indexes to go in
- the opposite direction of our traversal:
- h = tb->tb_id & (FIB_TABLE_HASHSZ - 1);
- This issue was that the RT tables are defined such that RT_TABLE_LOCAL is ID
- 255, while it is located at TABLE_LOCAL_INDEX of 0, and RT_TABLE_MAIN is 254
- with a TABLE_MAIN_INDEX of 1. This means that the above line will return 1
- for the local table and 0 for main. The result is that fib_trie_seq_next
- will return NULL at the end of the local table, fib_trie_seq_start will
- return the start of the main table, and then fib_trie_seq_next will loop on
- main forever as h will always return 0.
- The fix for this is to reverse the ordering of the two tables. It has the
- advantage of making it so that the tables now print in the same order
- regardless of if multiple tables are enabled or not. In order to make the
- definition consistent with the multiple tables case I simply masked the to
- RT_TABLE_XXX values by (FIB_TABLE_HASHSZ - 1). This way the two table
- layouts should always stay consistent.
- Fixes: 93456b6 ("[IPV4]: Unify access to the routing tables")
- Signed-off-by: Alexander Duyck <alexander.h.duyck@redhat.com>
- Signed-off-by: David S. Miller <davem@davemloft.net>
- ---
- --- a/include/net/ip_fib.h
- +++ b/include/net/ip_fib.h
- @@ -201,8 +201,8 @@ void fib_free_table(struct fib_table *tb
-
- #ifndef CONFIG_IP_MULTIPLE_TABLES
-
- -#define TABLE_LOCAL_INDEX 0
- -#define TABLE_MAIN_INDEX 1
- +#define TABLE_LOCAL_INDEX (RT_TABLE_LOCAL & (FIB_TABLE_HASHSZ - 1))
- +#define TABLE_MAIN_INDEX (RT_TABLE_MAIN & (FIB_TABLE_HASHSZ - 1))
-
- static inline struct fib_table *fib_get_table(struct net *net, u32 id)
- {
|