Separate heap for IPv4 mtries
[vpp.git] / src / vnet / mfib / mfib_table.c
index e5550ad..82431e3 100644 (file)
@@ -422,10 +422,11 @@ mfib_table_find (fib_protocol_t proto,
     return (~0);
 }
 
-u32
-mfib_table_find_or_create_and_lock (fib_protocol_t proto,
-                                    u32 table_id,
-                                    mfib_source_t src)
+static u32
+mfib_table_find_or_create_and_lock_i (fib_protocol_t proto,
+                                      u32 table_id,
+                                      mfib_source_t src,
+                                      const u8 *name)
 {
     mfib_table_t *mfib_table;
     fib_node_index_t fi;
@@ -445,13 +446,42 @@ mfib_table_find_or_create_and_lock (fib_protocol_t proto,
 
     mfib_table = mfib_table_get(fi, proto);
 
-    mfib_table->mft_desc = format(NULL, "%U-VRF:%d",
-                                  format_fib_protocol, proto,
-                                  table_id);
+    if (NULL == mfib_table->mft_desc)
+    {
+        if (name && name[0])
+        {
+            mfib_table->mft_desc = format(NULL, "%s", name);
+        }
+        else
+        {
+            mfib_table->mft_desc = format(NULL, "%U-VRF:%d",
+                                          format_fib_protocol, proto,
+                                          table_id);
+        }
+    }
 
     return (fi);
 }
 
+u32
+mfib_table_find_or_create_and_lock (fib_protocol_t proto,
+                                    u32 table_id,
+                                    mfib_source_t src)
+{
+    return (mfib_table_find_or_create_and_lock_i(proto, table_id,
+                                                 src, NULL));
+}
+
+u32
+mfib_table_find_or_create_and_lock_w_name (fib_protocol_t proto,
+                                           u32 table_id,
+                                           mfib_source_t src,
+                                           const u8 *name)
+{
+    return (mfib_table_find_or_create_and_lock_i(proto, table_id,
+                                                 src, name));
+}
+
 /**
  * @brief Table flush context. Store the indicies of matching FIB entries
  * that need to be removed.
@@ -585,10 +615,10 @@ mfib_table_walk (u32 fib_index,
 }
 
 u8*
-format_mfib_table_name (u8* s, va_list ap)
+format_mfib_table_name (u8* s, va_list *ap)
 {
-    fib_node_index_t fib_index = va_arg(ap, fib_node_index_t);
-    fib_protocol_t proto = va_arg(ap, int); // int promotion
+    fib_node_index_t fib_index = va_arg(*ap, fib_node_index_t);
+    fib_protocol_t proto = va_arg(*ap, int); // int promotion
     mfib_table_t *mfib_table;
 
     mfib_table = mfib_table_get(fib_index, proto);
@@ -598,19 +628,28 @@ format_mfib_table_name (u8* s, va_list ap)
     return (s);
 }
 
+u8 *
+format_mfib_table_memory (u8 *s, va_list *args)
+{
+    s = format(s, "%U", format_ip4_mfib_table_memory);
+    s = format(s, "%U", format_ip6_mfib_table_memory);
+
+    return (s);
+}
+
 static clib_error_t *
 mfib_module_init (vlib_main_t * vm)
 {
     clib_error_t * error;
 
+    mfib_entry_module_init();
+    mfib_signal_module_init();
+
     if ((error = vlib_call_init_function (vm, fib_module_init)))
         return (error);
     if ((error = vlib_call_init_function (vm, rn_module_init)))
         return (error);
 
-    mfib_entry_module_init();
-    mfib_signal_module_init();
-
     return (error);
 }