fib: ip6 and mpls fib_table memory leaks on fib_table->ft_locks
[vpp.git] / src / vnet / fib / mpls_fib.c
index 1593120..34369fc 100644 (file)
@@ -22,7 +22,7 @@
  * packets. Whether the two actions are the same more often than they are
  * different, or vice versa, is a function of the deployment in which the router
  * is used and thus not predictable.
- * The desgin choice to make with an MPLS_FIB table is:
+ * The design choice to make with an MPLS_FIB table is:
  *  1 - 20 bit key: label only.
  *      When the EOS and non-EOS actions differ the result is a 'EOS-choice' object.
  *  2 - 21 bit key: label and EOS-bit.
@@ -33,7 +33,7 @@
  *    - lower memory overhead, since there are few DB entries.
  *   Disadvantages:
  *    - slower DP performance in the case the chains differ, as more objects are
- *      encounterd in the switch path
+ *      encountered in the switch path
  *
  * 21 bit key:
  *   Advantages:
@@ -92,13 +92,13 @@ mpls_fib_create_with_table_id (u32 table_id,
     mpls_fib_t *mf;
     int i;
 
-    pool_get_aligned(mpls_main.fibs, fib_table, CLIB_CACHE_LINE_BYTES);
+    pool_get(mpls_main.fibs, fib_table);
     pool_get_aligned(mpls_main.mpls_fibs, mf, CLIB_CACHE_LINE_BYTES);
 
     ASSERT((fib_table - mpls_main.fibs) ==
            (mf - mpls_main.mpls_fibs));
 
-    memset(fib_table, 0, sizeof(*fib_table));
+    clib_memset(fib_table, 0, sizeof(*fib_table));
 
     fib_table->ft_proto = FIB_PROTOCOL_MPLS;
     fib_table->ft_index = (fib_table - mpls_main.fibs);
@@ -275,6 +275,8 @@ mpls_fib_table_destroy (u32 fib_index)
     }
     hash_free(mf->mf_entries);
 
+    vec_free (fib_table->ft_locks);
+    vec_free(fib_table->ft_src_route_counts);
     pool_put(mpls_main.mpls_fibs, mf);
     pool_put(mpls_main.fibs, fib_table);
 }
@@ -366,7 +368,7 @@ format_mpls_fib_table_memory (u8 * s, va_list * args)
 
     n_tables = pool_elts(mpls_main.fibs);
     mem = n_tables * sizeof(mpls_fib_t);
-    s = format(s, "%=30s %=6ld %=8ld\n", "MPLS", n_tables, mem);
+    s = format(s, "%=30s %=6ld %=12ld\n", "MPLS", n_tables, mem);
 
     return (s);
 }
@@ -440,13 +442,26 @@ mpls_fib_show (vlib_main_t * vm,
            break;
     }
 
-    pool_foreach (fib_table, mpls_main.fibs,
-    ({
+    pool_foreach (fib_table, mpls_main.fibs)
+     {
+        fib_source_t source;
+        u8 *s = NULL;
+
        if (table_id >= 0 && table_id != fib_table->ft_table_id)
            continue;
 
-       vlib_cli_output (vm, "%v, fib_index %d",
-                        fib_table->ft_desc, mpls_main.fibs - fib_table);
+       s = format (s, "%v, fib_index:%d locks:[",
+                    fib_table->ft_desc, mpls_main.fibs - fib_table);
+        vec_foreach_index(source, fib_table->ft_locks)
+        {
+            if (0 != fib_table->ft_locks[source])
+            {
+                s = format(s, "%U:%d, ",
+                           format_fib_source, source,
+                           fib_table->ft_locks[source]);
+            }
+        }
+        vlib_cli_output (vm, "%v]", s);
 
        if (MPLS_LABEL_INVALID == label)
        {
@@ -456,7 +471,7 @@ mpls_fib_show (vlib_main_t * vm,
        {
            mpls_fib_table_show_one(mpls_fib_get(fib_table->ft_index), label, vm);
        }
-    }));
+    }
 
     return 0;
 }