The fib tables are dynamically allocated at the init and exit functions.
That provides the ability to do multiple instanciations of these tables.

Signed-off-by: Daniel Lezcano <[EMAIL PROTECTED]>
Signed-off-by: Benjamin Thery <[EMAIL PROTECTED]>
---
 net/ipv6/ip6_fib.c |   43 +++++++++++++++++++++++++------------------
 1 file changed, 25 insertions(+), 18 deletions(-)

Index: linux-2.6-netns/net/ipv6/ip6_fib.c
===================================================================
--- linux-2.6-netns.orig/net/ipv6/ip6_fib.c
+++ linux-2.6-netns/net/ipv6/ip6_fib.c
@@ -166,22 +166,14 @@ static __inline__ void rt6_release(struc
                dst_free(&rt->u.dst);
 }
 
-static struct fib6_table __fib6_main_tbl = {
-       .tb6_id         = RT6_TABLE_MAIN,
-       .tb6_root       = {
-               .leaf           = &ip6_null_entry,
-               .fn_flags       = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO,
-       },
-};
-
-static struct fib6_table *fib6_main_tbl = &__fib6_main_tbl;
+static struct fib6_table *fib6_main_tbl;
 
 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
 #define FIB_TABLE_HASHSZ 256
 #else
 #define FIB_TABLE_HASHSZ 1
 #endif
-static struct hlist_head fib_table_hash[FIB_TABLE_HASHSZ];
+static struct hlist_head *fib_table_hash;
 
 static void fib6_link_table(struct fib6_table *tb)
 {
@@ -203,15 +195,8 @@ static void fib6_link_table(struct fib6_
 }
 
 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
-static struct fib6_table __fib6_local_tbl = {
-       .tb6_id         = RT6_TABLE_LOCAL,
-       .tb6_root       = {
-               .leaf           = &ip6_null_entry,
-               .fn_flags       = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO,
-       },
-};
 
-static struct fib6_table *fib6_local_tbl = &__fib6_local_tbl;
+static struct fib6_table *fib6_local_tbl;
 
 static struct fib6_table *fib6_alloc_table(u32 id)
 {
@@ -1484,6 +1469,28 @@ void __init fib6_init(void)
                                           0, SLAB_HWCACHE_ALIGN|SLAB_PANIC,
                                           NULL);
 
+       fib_table_hash = kzalloc(sizeof(*fib_table_hash)*FIB_TABLE_HASHSZ, 
GFP_KERNEL);
+       if (!fib_table_hash)
+               panic("IPV6: Failed to allocate fib_table_hash.\n");
+
+       fib6_main_tbl = kzalloc(sizeof(*fib6_main_tbl), GFP_KERNEL);
+       if (!fib6_main_tbl)
+               panic("IPV6: Failed to allocate fib6_main_tbl.\n");
+
+       fib6_main_tbl->tb6_id = RT6_TABLE_MAIN;
+       fib6_main_tbl->tb6_root.leaf = &ip6_null_entry;
+       fib6_main_tbl->tb6_root.fn_flags = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO;
+
+#ifdef CONFIG_IPV6_MULTIPLE_TABLES
+       fib6_local_tbl = kzalloc(sizeof(*fib6_local_tbl), GFP_KERNEL);
+       if (!fib6_local_tbl)
+               panic("IPV6: Failed to allocate fib6_local_tbl.\n");
+
+       fib6_local_tbl->tb6_id = RT6_TABLE_LOCAL;
+       fib6_local_tbl->tb6_root.leaf = &ip6_null_entry;
+       fib6_local_tbl->tb6_root.fn_flags = RTN_ROOT | RTN_TL_ROOT | RTN_RTINFO;
+#endif
+
        fib6_tables_init();
 
        __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib);

-- 
_______________________________________________
Containers mailing list
[EMAIL PROTECTED]
https://lists.linux-foundation.org/mailman/listinfo/containers

_______________________________________________
Devel mailing list
[email protected]
https://openvz.org/mailman/listinfo/devel

Reply via email to