提交 8e773277 编写于 作者: D David S. Miller

inet: Add inetpeer tree roots to the FIB tables.

Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 b48c80ec
...@@ -237,6 +237,7 @@ struct fib6_table { ...@@ -237,6 +237,7 @@ struct fib6_table {
u32 tb6_id; u32 tb6_id;
rwlock_t tb6_lock; rwlock_t tb6_lock;
struct fib6_node tb6_root; struct fib6_node tb6_root;
struct inet_peer_base tb6_peers;
}; };
#define RT6_TABLE_UNSPEC RT_TABLE_UNSPEC #define RT6_TABLE_UNSPEC RT_TABLE_UNSPEC
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <net/flow.h> #include <net/flow.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <net/fib_rules.h> #include <net/fib_rules.h>
#include <net/inetpeer.h>
struct fib_config { struct fib_config {
u8 fc_dst_len; u8 fc_dst_len;
...@@ -161,6 +162,7 @@ struct fib_table { ...@@ -161,6 +162,7 @@ struct fib_table {
u32 tb_id; u32 tb_id;
int tb_default; int tb_default;
int tb_num_default; int tb_num_default;
struct inet_peer_base tb_peers;
unsigned long tb_data[0]; unsigned long tb_data[0];
}; };
......
...@@ -1843,6 +1843,8 @@ int fib_table_flush(struct fib_table *tb) ...@@ -1843,6 +1843,8 @@ int fib_table_flush(struct fib_table *tb)
if (ll && hlist_empty(&ll->list)) if (ll && hlist_empty(&ll->list))
trie_leaf_remove(t, ll); trie_leaf_remove(t, ll);
inetpeer_invalidate_tree(&tb->tb_peers);
pr_debug("trie_flush found=%d\n", found); pr_debug("trie_flush found=%d\n", found);
return found; return found;
} }
...@@ -1991,6 +1993,7 @@ struct fib_table *fib_trie_table(u32 id) ...@@ -1991,6 +1993,7 @@ struct fib_table *fib_trie_table(u32 id)
tb->tb_id = id; tb->tb_id = id;
tb->tb_default = -1; tb->tb_default = -1;
tb->tb_num_default = 0; tb->tb_num_default = 0;
inet_peer_base_init(&tb->tb_peers);
t = (struct trie *) tb->tb_data; t = (struct trie *) tb->tb_data;
memset(t, 0, sizeof(*t)); memset(t, 0, sizeof(*t));
......
...@@ -197,6 +197,7 @@ static struct fib6_table *fib6_alloc_table(struct net *net, u32 id) ...@@ -197,6 +197,7 @@ static struct fib6_table *fib6_alloc_table(struct net *net, u32 id)
table->tb6_id = id; table->tb6_id = id;
table->tb6_root.leaf = net->ipv6.ip6_null_entry; table->tb6_root.leaf = net->ipv6.ip6_null_entry;
table->tb6_root.fn_flags = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO; table->tb6_root.fn_flags = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO;
inet_peer_base_init(&table->tb6_peers);
} }
return table; return table;
...@@ -1633,6 +1634,7 @@ static int __net_init fib6_net_init(struct net *net) ...@@ -1633,6 +1634,7 @@ static int __net_init fib6_net_init(struct net *net)
net->ipv6.fib6_main_tbl->tb6_root.leaf = net->ipv6.ip6_null_entry; net->ipv6.fib6_main_tbl->tb6_root.leaf = net->ipv6.ip6_null_entry;
net->ipv6.fib6_main_tbl->tb6_root.fn_flags = net->ipv6.fib6_main_tbl->tb6_root.fn_flags =
RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO; RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO;
inet_peer_base_init(&net->ipv6.fib6_main_tbl->tb6_peers);
#ifdef CONFIG_IPV6_MULTIPLE_TABLES #ifdef CONFIG_IPV6_MULTIPLE_TABLES
net->ipv6.fib6_local_tbl = kzalloc(sizeof(*net->ipv6.fib6_local_tbl), net->ipv6.fib6_local_tbl = kzalloc(sizeof(*net->ipv6.fib6_local_tbl),
...@@ -1643,6 +1645,7 @@ static int __net_init fib6_net_init(struct net *net) ...@@ -1643,6 +1645,7 @@ static int __net_init fib6_net_init(struct net *net)
net->ipv6.fib6_local_tbl->tb6_root.leaf = net->ipv6.ip6_null_entry; net->ipv6.fib6_local_tbl->tb6_root.leaf = net->ipv6.ip6_null_entry;
net->ipv6.fib6_local_tbl->tb6_root.fn_flags = net->ipv6.fib6_local_tbl->tb6_root.fn_flags =
RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO; RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO;
inet_peer_base_init(&net->ipv6.fib6_local_tbl->tb6_peers);
#endif #endif
fib6_tables_init(net); fib6_tables_init(net);
...@@ -1666,8 +1669,10 @@ static void fib6_net_exit(struct net *net) ...@@ -1666,8 +1669,10 @@ static void fib6_net_exit(struct net *net)
del_timer_sync(&net->ipv6.ip6_fib_timer); del_timer_sync(&net->ipv6.ip6_fib_timer);
#ifdef CONFIG_IPV6_MULTIPLE_TABLES #ifdef CONFIG_IPV6_MULTIPLE_TABLES
inetpeer_invalidate_tree(&net->ipv6.fib6_local_tbl->tb6_peers);
kfree(net->ipv6.fib6_local_tbl); kfree(net->ipv6.fib6_local_tbl);
#endif #endif
inetpeer_invalidate_tree(&net->ipv6.fib6_main_tbl->tb6_peers);
kfree(net->ipv6.fib6_main_tbl); kfree(net->ipv6.fib6_main_tbl);
kfree(net->ipv6.fib_table_hash); kfree(net->ipv6.fib_table_hash);
kfree(net->ipv6.rt6_stats); kfree(net->ipv6.rt6_stats);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册