fib: Table Replace
[vpp.git] / src / vnet / fib / ip4_fib.c
index a3cb682..02348af 100644 (file)
@@ -18,7 +18,7 @@
 #include <vnet/fib/ip4_fib.h>
 
 /*
- * A table of pefixes to be added to tables and the sources for them
+ * A table of prefixes to be added to tables and the sources for them
  */
 typedef struct ip4_fib_table_special_prefix_t_ {
     fib_prefix_t ift_prefix;
@@ -109,7 +109,7 @@ ip4_create_fib_with_table_id (u32 table_id,
     void *old_heap;
 
     pool_get(ip4_main.fibs, fib_table);
-    memset(fib_table, 0, sizeof(*fib_table));
+    clib_memset(fib_table, 0, sizeof(*fib_table));
 
     old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap);
     pool_get_aligned(ip4_main.v4_fibs, v4_fib, CLIB_CACHE_LINE_BYTES);
@@ -360,7 +360,7 @@ ip4_fib_table_entry_remove (ip4_fib_t *fib,
     if (NULL == result)
     {
        /*
-        * removing a non-existant entry. i'll allow it.
+        * removing a non-existent entry. i'll allow it.
         */
     }
     else 
@@ -391,9 +391,7 @@ ip4_fib_table_fwding_dpo_remove (ip4_fib_t *fib,
                                 const dpo_id_t *dpo,
                                  u32 cover_index)
 {
-    fib_prefix_t cover_prefix = {
-        .fp_len = 0,
-    };
+    const fib_prefix_t *cover_prefix;
     const dpo_id_t *cover_dpo;
 
     /*
@@ -401,12 +399,12 @@ ip4_fib_table_fwding_dpo_remove (ip4_fib_t *fib,
      * covering prefix, so it can fill the plys with the correct replacement
      * for the entry being removed
      */
-    fib_entry_get_prefix(cover_index, &cover_prefix);
+    cover_prefix = fib_entry_get_prefix(cover_index);
     cover_dpo = fib_entry_contribute_ip_forwarding(cover_index);
 
     ip4_fib_mtrie_route_del(&fib->mtrie,
                             addr, len, dpo->dpoi_index,
-                            cover_prefix.fp_len,
+                            cover_prefix->fp_len,
                             cover_dpo->dpoi_index);
 }
 
@@ -437,7 +435,7 @@ ip4_fib_table_sub_tree_walk (ip4_fib_t *fib,
     int i;
 
     /*
-     * There is no efficent way to walk this array of hash tables.
+     * There is no efficient way to walk this array of hash tables.
      * so we walk each table with a mask length greater than and equal to
      * the required root and check it is covered by the root.
      */
@@ -567,10 +565,18 @@ ip4_fib_table_show_one (ip4_fib_t *fib,
 u8 *
 format_ip4_fib_table_memory (u8 * s, va_list * args)
 {
-    s = format(s, "%=30s %=6d %=8ld\n",
+#if USE_DLMALLOC == 0
+    s = format(s, "%=30s %=6d %=12ld\n",
                "IPv4 unicast",
                pool_elts(ip4_main.fibs),
                mheap_bytes(ip4_main.mtrie_mheap));
+#else
+    s = format(s, "%=30s %=6d %=12ld\n",
+               "IPv4 unicast",
+               pool_elts(ip4_main.fibs),
+               mspace_footprint(ip4_main.mtrie_mheap));
+#endif
+    
 
     return (s);
 }
@@ -637,11 +643,13 @@ ip4_show_fib (vlib_main_t * vm,
 
         if (memory)
         {
-            uword mtrie_size, hash_size;
+            uword mtrie_size, hash_size, *old_heap;
+
 
             mtrie_size = ip4_fib_mtrie_memory_usage(&fib->mtrie);
             hash_size = 0;
 
+            old_heap = clib_mem_set_heap (ip4_main.mtrie_mheap);
            for (i = 0; i < ARRAY_LEN (fib->fib_entry_by_dst_address); i++)
            {
                uword * hash = fib->fib_entry_by_dst_address[i];
@@ -650,6 +658,8 @@ ip4_show_fib (vlib_main_t * vm,
                     hash_size += hash_bytes(hash);
                 }
             }
+            clib_mem_set_heap (old_heap);
+
             if (verbose)
                 vlib_cli_output (vm, "%U mtrie:%d hash:%d",
                                  format_fib_table_name, fib->index,
@@ -661,12 +671,14 @@ ip4_show_fib (vlib_main_t * vm,
             continue;
         }
 
-       s = format(s, "%U, fib_index:%d, flow hash:[%U] locks:[",
+       s = format(s, "%U, fib_index:%d, flow hash:[%U] epoch:%d flags:%U locks:[",
                    format_fib_table_name, fib->index,
                    FIB_PROTOCOL_IP4,
                    fib->index,
                    format_ip_flow_hash_config,
-                   fib_table->ft_flow_hash_config);
+                   fib_table->ft_flow_hash_config,
+                   fib_table->ft_epoch,
+                   format_fib_table_flags, fib_table->ft_flags);
        FOR_EACH_FIB_SOURCE(source)
         {
             if (0 != fib_table->ft_locks[source])
@@ -711,11 +723,14 @@ ip4_show_fib (vlib_main_t * vm,
     }));
 
     if (memory)
+    {
         vlib_cli_output (vm, "totals: mtrie:%ld hash:%ld all:%ld",
                          total_mtrie_memory,
                          total_hash_memory,
                          total_mtrie_memory + total_hash_memory);
-
+        vlib_cli_output (vm, "\nMtrie Mheap Usage: %U\n",
+                         format_mheap, ip4_main.mtrie_mheap, 1);
+    }
     return 0;
 }