DES-CBC/3DES-CBC support for VPP IPSec Core
[vpp.git] / src / vnet / fib / fib_entry.c
index 29f5b35..a9ca0f2 100644 (file)
@@ -58,12 +58,18 @@ fib_entry_get_index (const fib_entry_t * fib_entry)
     return (fib_entry - fib_entry_pool);
 }
 
-static fib_protocol_t
+fib_protocol_t
 fib_entry_get_proto (const fib_entry_t * fib_entry)
 {
     return (fib_entry->fe_prefix.fp_proto);
 }
 
+dpo_proto_t
+fib_entry_get_dpo_proto (const fib_entry_t * fib_entry)
+{
+    return (fib_proto_to_dpo(fib_entry->fe_prefix.fp_proto));
+}
+
 fib_forward_chain_type_t
 fib_entry_get_default_chain_type (const fib_entry_t *fib_entry)
 {
@@ -83,12 +89,21 @@ fib_entry_get_default_chain_type (const fib_entry_t *fib_entry)
     return (FIB_FORW_CHAIN_TYPE_UNICAST_IP4);
 }
 
+u8 *
+format_fib_source (u8 * s, va_list * args)
+{
+    fib_source_t source = va_arg (*args, int);
+
+    s = format (s, "src:%s", fib_source_names[source]);
+
+    return (s);
+}
+
 u8 *
 format_fib_entry (u8 * s, va_list * args)
 {
     fib_forward_chain_type_t fct;
     fib_entry_attribute_t attr;
-    fib_path_ext_t *path_ext;
     fib_entry_t *fib_entry;
     fib_entry_src_t *src;
     fib_node_index_t fei;
@@ -109,8 +124,7 @@ format_fib_entry (u8 * s, va_list * args)
 
        FOR_EACH_SRC_ADDED(fib_entry, src, source,
         ({
-           s = format (s, "\n  src:%s ",
-                       fib_source_names[source]);
+           s = format (s, "\n  %U", format_fib_source, source);
            s = fib_entry_src_format(fib_entry, source, s);
            s = format (s, " refs:%d ", src->fes_ref_count);
            if (FIB_ENTRY_FLAG_NONE != src->fes_entry_flags) {
@@ -126,14 +140,7 @@ format_fib_entry (u8 * s, va_list * args)
            {
                s = fib_path_list_format(src->fes_pl, s);
            }
-           if (NULL != src->fes_path_exts)
-           {
-               s = format(s, "    Extensions:");
-               vec_foreach(path_ext, src->fes_path_exts)
-               {
-                   s = format(s, "\n     %U", format_fib_path_ext, path_ext);
-               }
-           }
+            s = format(s, "%U", format_fib_path_ext_list, &src->fes_path_exts);
        }));
     
        s = format (s, "\n forwarding: ");
@@ -184,9 +191,7 @@ format_fib_entry (u8 * s, va_list * args)
 static fib_entry_t*
 fib_entry_from_fib_node (fib_node_t *node)
 {
-#if CLIB_DEBUG > 0
     ASSERT(FIB_NODE_TYPE_ENTRY == node->fn_type);
-#endif
     return ((fib_entry_t*)node);
 }
 
@@ -208,29 +213,33 @@ fib_entry_last_lock_gone (fib_node_t *node)
     FIB_ENTRY_DBG(fib_entry, "last-lock");
 
     fib_node_deinit(&fib_entry->fe_node);
-    // FIXME -RR Backwalk
 
     ASSERT(0 == vec_len(fib_entry->fe_delegates));
     vec_free(fib_entry->fe_delegates);
-    vec_free(fib_entry->fe_srcs);
+    if (fib_entry_has_multiple_srcs(fib_entry))
+    {
+        vec_free(fib_entry->fe_u_src.fe_srcs);
+    }
     pool_put(fib_entry_pool, fib_entry);
 }
 
-static fib_entry_src_t*
+static const fib_entry_src_t*
 fib_entry_get_best_src_i (const fib_entry_t *fib_entry)
 {
-    fib_entry_src_t *bsrc;
+    const fib_entry_src_t *bsrc;
 
     /*
      * the enum of sources is deliberately arranged in priority order
      */
-    if (0 == vec_len(fib_entry->fe_srcs))
+    if (fib_entry_has_multiple_srcs(fib_entry))
     {
-       bsrc = NULL;
+        ASSERT(vec_len(fib_entry->fe_u_src.fe_srcs));
+
+        bsrc = vec_elt_at_index(fib_entry->fe_u_src.fe_srcs, 0);
     }
     else
     {
-       bsrc = vec_elt_at_index(fib_entry->fe_srcs, 0);
+        bsrc = &fib_entry->fe_u_src.fe_src;
     }
 
     return (bsrc);
@@ -243,7 +252,7 @@ fib_entry_src_get_source (const fib_entry_src_t *esrc)
     {
        return (esrc->fes_src);
     }
-    return (FIB_SOURCE_MAX);
+    return (FIB_SOURCE_INVALID);
 }
 
 static fib_entry_flag_t
@@ -256,6 +265,18 @@ fib_entry_src_get_flags (const fib_entry_src_t *esrc)
     return (FIB_ENTRY_FLAG_NONE);
 }
 
+fib_entry_flag_t
+fib_entry_get_flags_i (const fib_entry_t *fib_entry)
+{
+    const fib_entry_src_t *esrc;
+
+    esrc = fib_entry_get_best_src_i(fib_entry);
+
+    ASSERT(esrc);
+
+    return (esrc->fes_entry_flags);
+}
+
 fib_entry_flag_t
 fib_entry_get_flags (fib_node_index_t fib_entry_index)
 {
@@ -325,11 +346,18 @@ fib_entry_show_memory (void)
 
     pool_foreach(entry, fib_entry_pool,
     ({
-       n_srcs += vec_len(entry->fe_srcs);
-       vec_foreach(esrc, entry->fe_srcs)
-       {
-           n_exts += vec_len(esrc->fes_path_exts);
-       }
+        if (fib_entry_has_multiple_srcs(entry))
+        {
+            n_srcs += vec_len(entry->fe_u_src.fe_srcs);
+            vec_foreach(esrc, entry->fe_u_src.fe_srcs)
+            {
+                n_exts += fib_path_ext_list_length(&esrc->fes_path_exts);
+            }
+        }
+        else
+        {
+            n_exts += fib_path_ext_list_length(&entry->fe_u_src.fe_src.fes_path_exts);
+        }
     }));
 
     fib_show_memory_usage("Entry Source",
@@ -387,6 +415,7 @@ fib_entry_chain_type_mcast_to_ucast (fib_forward_chain_type_t fct)
     case FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS:
     case FIB_FORW_CHAIN_TYPE_ETHERNET:
     case FIB_FORW_CHAIN_TYPE_NSH:
+    case FIB_FORW_CHAIN_TYPE_BIER:
         break;
     }
 
@@ -470,11 +499,15 @@ fib_entry_get_adj (fib_node_index_t fib_entry_index)
     const dpo_id_t *dpo;
 
     dpo = fib_entry_contribute_ip_forwarding(fib_entry_index);
-    dpo = load_balance_get_bucket(dpo->dpoi_index, 0);
 
-    if (dpo_is_adj(dpo))
+    if (dpo_id_is_valid(dpo))
     {
-       return (dpo->dpoi_index);
+        dpo = load_balance_get_bucket(dpo->dpoi_index, 0);
+
+        if (dpo_is_adj(dpo))
+        {
+            return (dpo->dpoi_index);
+        }
     }
     return (ADJ_INDEX_INVALID);
 }
@@ -785,10 +818,10 @@ fib_entry_special_add (fib_node_index_t fib_entry_index,
                       fib_entry_flag_t flags,
                       const dpo_id_t *dpo)
 {
+    const fib_entry_src_t *bsrc;
     fib_source_t best_source;
     fib_entry_flag_t bflags;
     fib_entry_t *fib_entry;
-    fib_entry_src_t *bsrc;
 
     fib_entry = fib_entry_get(fib_entry_index);
 
@@ -806,10 +839,10 @@ fib_entry_special_update (fib_node_index_t fib_entry_index,
                          fib_entry_flag_t flags,
                          const dpo_id_t *dpo)
 {
+    const fib_entry_src_t *bsrc;
     fib_source_t best_source;
     fib_entry_flag_t bflags;
     fib_entry_t *fib_entry;
-    fib_entry_src_t *bsrc;
 
     fib_entry = fib_entry_get(fib_entry_index);
 
@@ -828,10 +861,10 @@ fib_entry_path_add (fib_node_index_t fib_entry_index,
                    fib_entry_flag_t flags,
                    const fib_route_path_t *rpath)
 {
+    const fib_entry_src_t *bsrc;
     fib_source_t best_source;
     fib_entry_flag_t bflags;
     fib_entry_t *fib_entry;
-    fib_entry_src_t *bsrc;
 
     ASSERT(1 == vec_len(rpath));
 
@@ -890,11 +923,11 @@ fib_entry_path_remove (fib_node_index_t fib_entry_index,
                       fib_source_t source,
                       const fib_route_path_t *rpath)
 {
+    const fib_entry_src_t *bsrc;
     fib_entry_src_flag_t sflag;
     fib_source_t best_source;
     fib_entry_flag_t bflags;
     fib_entry_t *fib_entry;
-    fib_entry_src_t *bsrc;
 
     ASSERT(1 == vec_len(rpath));
 
@@ -941,7 +974,7 @@ fib_entry_path_remove (fib_node_index_t fib_entry_index,
            bsrc = fib_entry_get_best_src_i(fib_entry);
            best_source = fib_entry_src_get_source(bsrc);
 
-           if (FIB_SOURCE_MAX == best_source) {
+           if (FIB_SOURCE_INVALID == best_source) {
                /*
                 * no more sources left. this entry is toast.
                 */
@@ -986,11 +1019,11 @@ fib_entry_src_flag_t
 fib_entry_special_remove (fib_node_index_t fib_entry_index,
                          fib_source_t source)
 {
+    const fib_entry_src_t *bsrc;
     fib_entry_src_flag_t sflag;
     fib_source_t best_source;
     fib_entry_flag_t bflags;
     fib_entry_t *fib_entry;
-    fib_entry_src_t *bsrc;
 
     fib_entry = fib_entry_get(fib_entry_index);
     ASSERT(NULL != fib_entry);
@@ -1031,7 +1064,7 @@ fib_entry_special_remove (fib_node_index_t fib_entry_index,
            bsrc = fib_entry_get_best_src_i(fib_entry);
            best_source = fib_entry_src_get_source(bsrc);
 
-           if (FIB_SOURCE_MAX == best_source) {
+           if (FIB_SOURCE_INVALID == best_source) {
                /*
                 * no more sources left. this entry is toast.
                 */
@@ -1088,10 +1121,10 @@ fib_entry_update (fib_node_index_t fib_entry_index,
                  fib_entry_flag_t flags,
                  const fib_route_path_t *paths)
 {
+    const fib_entry_src_t *bsrc;
     fib_source_t best_source;
     fib_entry_flag_t bflags;
     fib_entry_t *fib_entry;
-    fib_entry_src_t *bsrc;
 
     fib_entry = fib_entry_get(fib_entry_index);
     ASSERT(NULL != fib_entry);
@@ -1351,8 +1384,8 @@ fib_entry_get_resolving_interface (fib_node_index_t entry_index)
 fib_source_t
 fib_entry_get_best_source (fib_node_index_t entry_index)
 {
+    const fib_entry_src_t *bsrc;
     fib_entry_t *fib_entry;
-    fib_entry_src_t *bsrc;
 
     fib_entry = fib_entry_get(entry_index);
 
@@ -1377,7 +1410,7 @@ fib_entry_is_resolved (fib_node_index_t fib_entry_index)
     if (NULL == fed)
     {
         /*
-         * no BFD tracking - resolved
+         * no BFD tracking - consider it resolved.
          */
         return (!0);
     }