fib: fib api updates
[vpp.git] / src / vnet / fib / mpls_fib.c
index 4b2b76e..6f59eb3 100644 (file)
  */
 static index_t mpls_fib_drop_dpo_index = INDEX_INVALID;
 
-/**
- * FIXME
- */
-#define MPLS_FLOW_HASH_DEFAULT 0
-
 static inline u32
 mpls_fib_entry_mk_key (mpls_label_t label,
                       mpls_eos_bit_t eos)
@@ -88,7 +83,8 @@ mpls_fib_index_from_table_id (u32 table_id)
 }
 
 static u32
-mpls_fib_create_with_table_id (u32 table_id)
+mpls_fib_create_with_table_id (u32 table_id,
+                               fib_source_t src)
 {
     dpo_id_t dpo = DPO_INVALID;
     fib_table_t *fib_table;
@@ -96,25 +92,23 @@ 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);
 
     hash_set (mpls_main.fib_index_by_table_id, table_id, fib_table->ft_index);
 
-    fib_table->ft_table_id =
-       table_id;
-    fib_table->ft_flow_hash_config = 
-       MPLS_FLOW_HASH_DEFAULT;
+    fib_table->ft_table_id = table_id;
+    fib_table->ft_flow_hash_config = MPLS_FLOW_HASH_DEFAULT;
     
-    fib_table_lock(fib_table->ft_index, FIB_PROTOCOL_MPLS);
+    fib_table_lock(fib_table->ft_index, FIB_PROTOCOL_MPLS, src);
 
     if (INDEX_INVALID == mpls_fib_drop_dpo_index)
     {
@@ -165,6 +159,7 @@ mpls_fib_create_with_table_id (u32 table_id)
 
     lookup_dpo_add_or_lock_w_fib_index(0, // unused
                                        DPO_PROTO_IP4,
+                                       LOOKUP_UNICAST,
                                        LOOKUP_INPUT_DST_ADDR,
                                        LOOKUP_TABLE_FROM_INPUT_INTERFACE,
                                        &dpo);
@@ -179,6 +174,7 @@ mpls_fib_create_with_table_id (u32 table_id)
 
     lookup_dpo_add_or_lock_w_fib_index(0, //unsued
                                        DPO_PROTO_MPLS,
+                                       LOOKUP_UNICAST,
                                        LOOKUP_INPUT_DST_ADDR,
                                        LOOKUP_TABLE_FROM_INPUT_INTERFACE,
                                        &dpo);
@@ -197,6 +193,7 @@ mpls_fib_create_with_table_id (u32 table_id)
 
     lookup_dpo_add_or_lock_w_fib_index(0, //unused
                                        DPO_PROTO_IP6,
+                                       LOOKUP_UNICAST,
                                        LOOKUP_INPUT_DST_ADDR,
                                        LOOKUP_TABLE_FROM_INPUT_INTERFACE,
                                        &dpo);
@@ -210,6 +207,7 @@ mpls_fib_create_with_table_id (u32 table_id)
     prefix.fp_eos = MPLS_NON_EOS;
     lookup_dpo_add_or_lock_w_fib_index(0, // unsued
                                        DPO_PROTO_MPLS,
+                                       LOOKUP_UNICAST,
                                        LOOKUP_INPUT_DST_ADDR,
                                        LOOKUP_TABLE_FROM_INPUT_INTERFACE,
                                        &dpo);
@@ -223,22 +221,23 @@ mpls_fib_create_with_table_id (u32 table_id)
 }
 
 u32
-mpls_fib_table_find_or_create_and_lock (u32 table_id)
+mpls_fib_table_find_or_create_and_lock (u32 table_id,
+                                        fib_source_t src)
 {
     u32 index;
 
     index = mpls_fib_index_from_table_id(table_id);
     if (~0 == index)
-       return mpls_fib_create_with_table_id(table_id);
+       return mpls_fib_create_with_table_id(table_id, src);
 
-    fib_table_lock(index, FIB_PROTOCOL_MPLS);
+    fib_table_lock(index, FIB_PROTOCOL_MPLS, src);
 
     return (index);
 }
 u32
-mpls_fib_table_create_and_lock (void)
+mpls_fib_table_create_and_lock (fib_source_t src)
 {
-    return (mpls_fib_create_with_table_id(~0));
+    return (mpls_fib_create_with_table_id(~0, src));
 }
 
 void
@@ -320,8 +319,15 @@ mpls_fib_forwarding_table_update (mpls_fib_t *mf,
 {
     mpls_label_t key;
 
-    ASSERT(DPO_LOAD_BALANCE == dpo->dpoi_type);
-
+    ASSERT((DPO_LOAD_BALANCE == dpo->dpoi_type) ||
+           (DPO_REPLICATE == dpo->dpoi_type));
+    if (CLIB_DEBUG > 0)
+    {
+        if (DPO_REPLICATE == dpo->dpoi_type)
+            ASSERT(dpo->dpoi_index & MPLS_IS_REPLICATE);
+        if (DPO_LOAD_BALANCE == dpo->dpoi_type)
+            ASSERT(!(dpo->dpoi_index & MPLS_IS_REPLICATE));
+    }
     key = mpls_fib_entry_mk_key(label, eos);
 
     mf->mf_lbs[key] = dpo->dpoi_index;
@@ -339,13 +345,6 @@ mpls_fib_forwarding_table_reset (mpls_fib_t *mf,
     mf->mf_lbs[key] = mpls_fib_drop_dpo_index;
 }
 
-flow_hash_config_t
-mpls_fib_table_get_flow_hash_config (u32 fib_index)
-{
-    // FIXME.
-    return (0);
-}
-
 void
 mpls_fib_table_walk (mpls_fib_t *mpls_fib,
                      fib_table_walk_fn_t fn,
@@ -360,6 +359,18 @@ mpls_fib_table_walk (mpls_fib_t *mpls_fib,
     }));
 }
 
+u8 *
+format_mpls_fib_table_memory (u8 * s, va_list * args)
+{
+    u64 n_tables, mem;
+
+    n_tables = pool_elts(mpls_main.fibs);
+    mem = n_tables * sizeof(mpls_fib_t);
+    s = format(s, "%=30s %=6ld %=12ld\n", "MPLS", n_tables, mem);
+
+    return (s);
+}
+
 static void
 mpls_fib_table_show_all (const mpls_fib_t *mpls_fib,
                         vlib_main_t * vm)
@@ -431,11 +442,24 @@ mpls_fib_show (vlib_main_t * vm,
 
     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);
+       FOR_EACH_FIB_SOURCE(source)
+        {
+            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)
        {