Trivial: Cleanup missing va_ends.
[vpp.git] / src / vnet / mfib / mfib_test.c
index 8c75e34..fda0258 100644 (file)
@@ -217,23 +217,6 @@ mfib_test_validate_rep_v (const replicate_t *rep,
     return (res);
 }
 
-static fib_forward_chain_type_t
-fib_forw_chain_type_from_fib_proto (fib_protocol_t proto)
-{
-    switch (proto)
-    {
-    case FIB_PROTOCOL_IP4:
-        return (FIB_FORW_CHAIN_TYPE_UNICAST_IP4);
-    case FIB_PROTOCOL_IP6:
-        return (FIB_FORW_CHAIN_TYPE_UNICAST_IP6);
-    default:
-        break;
-    }
-    ASSERT(0);
-    return (0);
-}
-
-
 static int
 mfib_test_entry (fib_node_index_t fei,
                  mfib_entry_flags_t eflags,
@@ -246,7 +229,6 @@ mfib_test_entry (fib_node_index_t fei,
     va_list ap;
     int res;
 
-    va_start(ap, n_buckets);
 
     res = 0;
     mfe = mfib_entry_get(fei);
@@ -280,12 +262,13 @@ mfib_test_entry (fib_node_index_t fei,
                       format_mfib_prefix, &pfx,
                       format_dpo_type, tmp.dpoi_type);
 
+        va_start(ap, n_buckets);
         res = mfib_test_validate_rep_v(rep, n_buckets, &ap);
+        va_end(ap);
 
         dpo_reset(&tmp);
     }
 
-    va_end(ap);
 
     return (res);
 }
@@ -347,16 +330,19 @@ mfib_test_i (fib_protocol_t PROTO,
              const mfib_prefix_t *pfx_star_g_1,
              const mfib_prefix_t *pfx_star_g_2,
              const mfib_prefix_t *pfx_star_g_3,
-             const mfib_prefix_t *pfx_star_g_slash_m)
+             const mfib_prefix_t *pfx_star_g_slash_m,
+             const fib_prefix_t *pfx_itf,
+             const ip46_address_t *addr_nbr1,
+             const ip46_address_t *addr_nbr2)
 {
     fib_node_index_t mfei, mfei_dflt, mfei_no_f, mfei_s_g, mfei_g_1, mfei_g_2, mfei_g_3, mfei_g_m;
     u32 fib_index, n_entries, n_itfs, n_reps, n_pls;
-    fib_node_index_t ai_1, ai_2, ai_3;
+    fib_node_index_t ai_1, ai_2, ai_3, ai_nbr1, ai_nbr2;
     test_main_t *tm;
     int res;
 
     mfib_prefix_t all_1s;
-    memset(&all_1s, 0xfd, sizeof(all_1s));
+    clib_memset(&all_1s, 0xfd, sizeof(all_1s));
 
     res = 0;
     n_entries = pool_elts(mfib_entry_pool);
@@ -374,12 +360,33 @@ mfib_test_i (fib_protocol_t PROTO,
     ai_3 = adj_mcast_add_or_lock(PROTO,
                                  LINKT,
                                  tm->hw[3]->sw_if_index);
+    ai_nbr1 = adj_nbr_add_or_lock(PROTO,
+                                  LINKT,
+                                  addr_nbr1,
+                                  tm->hw[0]->sw_if_index);
+    ai_nbr2 = adj_nbr_add_or_lock(PROTO,
+                                  LINKT,
+                                  addr_nbr2,
+                                  tm->hw[0]->sw_if_index);
 
     MFIB_TEST(3 == adj_mcast_db_size(), "3 MCAST adjs");
 
     /* Find or create FIB table 11 */
     fib_index = mfib_table_find_or_create_and_lock(PROTO, 11, MFIB_SOURCE_API);
 
+    fib_table_entry_update_one_path(0,
+                                    pfx_itf,
+                                   FIB_SOURCE_INTERFACE,
+                                   (FIB_ENTRY_FLAG_CONNECTED |
+                                    FIB_ENTRY_FLAG_ATTACHED),
+                                   DPO_PROTO_IP4,
+                                   NULL,
+                                   tm->hw[0]->sw_if_index,
+                                   ~0, // invalid fib index
+                                   1, // weight
+                                   NULL,
+                                   FIB_ROUTE_PATH_FLAG_NONE);
+
     mfib_prefix_t pfx_dft = {
         .fp_len = 0,
         .fp_proto = PROTO,
@@ -1042,6 +1049,69 @@ mfib_test_i (fib_protocol_t PROTO,
               "%U Gone",
               format_mfib_prefix, pfx_star_g_slash_m);
 
+    /*
+     * Entries with paths via unicast next-hops
+     */
+    fib_route_path_t path_via_nbr1 = {
+        .frp_proto = fib_proto_to_dpo(PROTO),
+        .frp_addr = *addr_nbr1,
+        .frp_sw_if_index = tm->hw[0]->sw_if_index,
+        .frp_fib_index = ~0,
+        .frp_weight = 0,
+        .frp_flags = 0,
+    };
+    fib_route_path_t path_via_nbr2 = {
+        .frp_proto = fib_proto_to_dpo(PROTO),
+        .frp_addr = *addr_nbr2,
+        .frp_sw_if_index = tm->hw[0]->sw_if_index,
+        .frp_fib_index = ~0,
+        .frp_weight = 0,
+        .frp_flags = 0,
+    };
+
+    mfei_g_1 = mfib_table_entry_path_update(fib_index,
+                                            pfx_star_g_1,
+                                            MFIB_SOURCE_API,
+                                            &path_via_nbr1,
+                                            (MFIB_ITF_FLAG_FORWARD));
+    mfei_g_1 = mfib_table_entry_path_update(fib_index,
+                                            pfx_star_g_1,
+                                            MFIB_SOURCE_API,
+                                            &path_via_nbr2,
+                                            (MFIB_ITF_FLAG_FORWARD));
+    MFIB_TEST(!mfib_test_entry(mfei_g_1,
+                               MFIB_ENTRY_FLAG_NONE,
+                               2,
+                               DPO_ADJACENCY_INCOMPLETE, ai_nbr1,
+                               DPO_ADJACENCY_INCOMPLETE, ai_nbr2),
+              "%U replicate OK",
+              format_mfib_prefix, pfx_star_g_1);
+    MFIB_TEST_NS(!mfib_test_entry_itf(mfei_g_1, tm->hw[0]->sw_if_index,
+                                      MFIB_ITF_FLAG_FORWARD));
+
+    mfib_table_entry_path_remove(fib_index,
+                                 pfx_star_g_1,
+                                 MFIB_SOURCE_API,
+                                 &path_via_nbr1);
+
+    MFIB_TEST(!mfib_test_entry(mfei_g_1,
+                               MFIB_ENTRY_FLAG_NONE,
+                               1,
+                               DPO_ADJACENCY_INCOMPLETE, ai_nbr2),
+              "%U replicate OK",
+              format_mfib_prefix, pfx_star_g_1);
+    MFIB_TEST_NS(!mfib_test_entry_itf(mfei_g_1, tm->hw[0]->sw_if_index,
+                                      MFIB_ITF_FLAG_FORWARD));
+
+    mfib_table_entry_path_remove(fib_index,
+                                 pfx_star_g_1,
+                                 MFIB_SOURCE_API,
+                                 &path_via_nbr2);
+    mfei = mfib_table_lookup_exact_match(fib_index, pfx_star_g_1);
+    MFIB_TEST(FIB_NODE_INDEX_INVALID == mfei,
+              "%U Gone",
+              format_mfib_prefix, pfx_star_g_1);
+
     /*
      * Add a prefix as a special/exclusive route
      */
@@ -1216,6 +1286,8 @@ mfib_test_i (fib_protocol_t PROTO,
     adj_unlock(ai_1);
     adj_unlock(ai_2);
     adj_unlock(ai_3);
+    adj_unlock(ai_nbr1);
+    adj_unlock(ai_nbr2);
 
     /*
      * MPLS disable the interface
@@ -1225,6 +1297,11 @@ mfib_test_i (fib_protocol_t PROTO,
                                      0, 0);
     mpls_table_delete(MPLS_FIB_DEFAULT_TABLE_ID, FIB_SOURCE_API);
 
+    /*
+     * remove the connected
+     */
+    fib_table_entry_delete(0, pfx_itf, FIB_SOURCE_INTERFACE);
+
     /*
      * test we've leaked no resources
      */
@@ -1303,7 +1380,19 @@ mfib_test_v4 (void)
             .ip4.as_u32 = 0,
         },
     };
-
+    const fib_prefix_t pfx_itf = {
+        .fp_len = 24,
+        .fp_proto = FIB_PROTOCOL_IP4,
+        .fp_addr = {
+            .ip4.as_u32 = clib_host_to_net_u32(0x0a0a0a0a),
+        },
+    };
+    const ip46_address_t nbr1 = {
+        .ip4.as_u32 = clib_host_to_net_u32(0x0a0a0a0b),
+    };
+    const ip46_address_t nbr2 = {
+        .ip4.as_u32 = clib_host_to_net_u32(0x0a0a0a0c),
+    };
     return (mfib_test_i(FIB_PROTOCOL_IP4,
                         VNET_LINK_IP4,
                         &pfx_224_s_8,
@@ -1311,7 +1400,10 @@ mfib_test_v4 (void)
                         &pfx_239_1_1_1,
                         &pfx_239_1_1_2,
                         &pfx_239_1_1_3,
-                        &pfx_239));
+                        &pfx_239,
+                        &pfx_itf,
+                        &nbr1,
+                        &nbr2));
 }
 
 static int
@@ -1371,6 +1463,22 @@ mfib_test_v6 (void)
             .ip6.as_u64[1] = clib_host_to_net_u64(0x0000000000000000),
         },
     };
+    const fib_prefix_t pfx_itf = {
+        .fp_len = 64,
+        .fp_proto = FIB_PROTOCOL_IP6,
+        .fp_addr = {
+            .ip6.as_u64[0] = clib_host_to_net_u64(0x2001000000000000),
+            .ip6.as_u64[1] = clib_host_to_net_u64(0x0000000000000001),
+        },
+    };
+    const ip46_address_t nbr1 = {
+            .ip6.as_u64[0] = clib_host_to_net_u64(0x2001000000000000),
+            .ip6.as_u64[1] = clib_host_to_net_u64(0x0000000000000002),
+    };
+    const ip46_address_t nbr2 = {
+            .ip6.as_u64[0] = clib_host_to_net_u64(0x2001000000000000),
+            .ip6.as_u64[1] = clib_host_to_net_u64(0x0000000000000003),
+    };
 
     return (mfib_test_i(FIB_PROTOCOL_IP6,
                         VNET_LINK_IP6,
@@ -1379,7 +1487,10 @@ mfib_test_v6 (void)
                         &pfx_ff_1,
                         &pfx_ff_2,
                         &pfx_ff_3,
-                        &pfx_ff));
+                        &pfx_ff,
+                        &pfx_itf,
+                        &nbr1,
+                        &nbr2));
 }
 
 static clib_error_t *
@@ -1391,6 +1502,12 @@ mfib_test (vlib_main_t * vm,
 
     res += mfib_test_mk_intf(4);
     res += mfib_test_v4();
+
+    if (res)
+    {
+        return clib_error_return(0, "MFIB Unit Test Failed");
+    }
+
     res += mfib_test_v6();
 
     if (res)