ip: fix fib and mfib locks
[vpp.git] / src / plugins / unittest / fib_test.c
index b9b77ba..26e2d24 100644 (file)
@@ -158,10 +158,6 @@ fib_test_mk_intf (u32 ninterfaces)
                                             VNET_HW_INTERFACE_FLAG_LINK_UP);
         tm->hw[i] = vnet_get_hw_interface(vnet_get_main(),
                                           tm->hw_if_indicies[i]);
-        vec_validate (ip4_main.fib_index_by_sw_if_index,
-                      tm->hw[i]->sw_if_index);
-        vec_validate (ip6_main.fib_index_by_sw_if_index,
-                      tm->hw[i]->sw_if_index);
         ip4_main.fib_index_by_sw_if_index[tm->hw[i]->sw_if_index] = 0;
         ip6_main.fib_index_by_sw_if_index[tm->hw[i]->sw_if_index] = 0;
 
@@ -503,8 +499,9 @@ fib_test_validate_lb_v (const load_balance_t *lb,
 
                FIB_TEST_LB((vnet_mpls_uc_get_label(hdr) ==
                             exp->label_o_adj.label),
-                           "bucket %d stacks on label %d",
+                           "bucket %d stacks on label %d not %d",
                            bucket,
+                            vnet_mpls_uc_get_label(hdr),
                            exp->label_o_adj.label);
 
                FIB_TEST_LB((vnet_mpls_uc_get_s(hdr) ==
@@ -5313,7 +5310,7 @@ fib_test_ae (void)
 {
     const dpo_id_t *dpo, *dpo_drop;
     const u32 fib_index = 0;
-    fib_node_index_t fei;
+    fib_node_index_t dfrt, fei;
     test_main_t *tm;
     ip4_main_t *im;
     int res;
@@ -5340,7 +5337,6 @@ fib_test_ae (void)
         },
     };
 
-    vec_validate(im->fib_index_by_sw_if_index, tm->hw[0]->sw_if_index);
     im->fib_index_by_sw_if_index[tm->hw[0]->sw_if_index] = fib_index;
 
     dpo_drop = drop_dpo_get(DPO_PROTO_IP4);
@@ -5414,6 +5410,44 @@ fib_test_ae (void)
     import_fib_index1 = fib_table_find_or_create_and_lock(FIB_PROTOCOL_IP4,
                                                           11,
                                                           FIB_SOURCE_CLI);
+    /*
+     * Add default route in the import FIB
+     */
+    fib_prefix_t pfx_0_0_0_0_s_0 = {
+        .fp_len = 0,
+        .fp_proto = FIB_PROTOCOL_IP4,
+        .fp_addr = {
+            .ip4 = {
+                {0}
+            },
+        },
+    };
+
+    dfrt = fib_table_lookup(import_fib_index1, &pfx_0_0_0_0_s_0);
+    FIB_TEST((FIB_NODE_INDEX_INVALID != dfrt), "default route present");
+
+    fib_table_entry_path_add(import_fib_index1,
+                             &pfx_0_0_0_0_s_0,
+                             FIB_SOURCE_API,
+                             FIB_ENTRY_FLAG_NONE,
+                             DPO_PROTO_IP4,
+                             NULL,
+                             tm->hw[0]->sw_if_index,
+                             ~0, // invalid fib index
+                             1,
+                             NULL,
+                             FIB_ROUTE_PATH_FLAG_NONE);
+    fei = fib_table_lookup(fib_index, &pfx_0_0_0_0_s_0);
+    FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "default route present");
+    FIB_TEST((fei != dfrt), "default route added");
+
+    /*
+     * delete default route and check for the presence in the import table
+     */
+    fib_table_entry_delete(import_fib_index1, &pfx_0_0_0_0_s_0, FIB_SOURCE_API);
+    fei = fib_table_lookup(import_fib_index1, &pfx_0_0_0_0_s_0);
+    FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "default route present");
+    FIB_TEST((fei == dfrt), "default route removed");
 
     /*
      * Add an attached route in the import FIB
@@ -5869,10 +5903,14 @@ fib_test_ae (void)
 static int
 fib_test_pref (void)
 {
-    test_main_t *tm = &test_main;
-    int res;
+    test_main_t *tm;
+    ip4_main_t *im;
+    int res, i;
 
+    tm = &test_main;
+    im = &ip4_main;
     res = 0;
+
     const fib_prefix_t pfx_1_1_1_1_s_32 = {
         .fp_len = 32,
         .fp_proto = FIB_PROTOCOL_IP4,
@@ -5883,6 +5921,9 @@ fib_test_pref (void)
         },
     };
 
+    for (i = 0; i <= 2; i++)
+        im->fib_index_by_sw_if_index[tm->hw[i]->sw_if_index] = 0;
+
     /*
      * 2 high, 2 medium and 2 low preference non-recursive paths
      */
@@ -6355,7 +6396,6 @@ fib_test_label (void)
     FIB_TEST((0 == adj_nbr_db_size()), "ADJ DB size is %d",
              adj_nbr_db_size());
 
-    vec_validate(im->fib_index_by_sw_if_index, tm->hw[0]->sw_if_index);
     im->fib_index_by_sw_if_index[tm->hw[0]->sw_if_index] = fib_index;
 
     fib_table_entry_update_one_path(fib_index, &local0_pfx,
@@ -6401,7 +6441,6 @@ fib_test_label (void)
         },
     };
 
-    vec_validate(im->fib_index_by_sw_if_index, tm->hw[1]->sw_if_index);
     im->fib_index_by_sw_if_index[tm->hw[1]->sw_if_index] = fib_index;
 
     fib_table_entry_update_one_path(fib_index, &local1_pfx,
@@ -7381,6 +7420,73 @@ fib_test_label (void)
              "adj 10.10.11.1");
     fib_table_entry_delete_index(fei, FIB_SOURCE_API);
 
+    /*
+     * A prefix with outgoing labels. We'll RR source a /32 it covers
+     * and test that the RR source picks up the out-going labels
+     */
+    fib_prefix_t pfx_100_s_8 = {
+        .fp_len = 8,
+        .fp_proto = FIB_PROTOCOL_IP4,
+        .fp_addr = {
+            .ip4.as_u32 = clib_host_to_net_u32(0x64000000),
+        },
+    };
+    fib_test_lb_bucket_t l_100_eos_o_10_10_10_1 = {
+        .type = FT_LB_LABEL_O_ADJ,
+        .label_o_adj = {
+            .adj = ai_mpls_10_10_11_1,
+            .label = 1602,
+            .eos = MPLS_EOS,
+        },
+    };
+    fib_mpls_label_t *l1602 = NULL, fml1602 = {
+        .fml_value = 1602,
+    };
+    vec_add1(l1602, fml1602);
+    fei = fib_table_entry_update_one_path(fib_index,
+                                          &pfx_100_s_8,
+                                          FIB_SOURCE_API,
+                                          FIB_ENTRY_FLAG_NONE,
+                                          DPO_PROTO_IP4,
+                                          &nh_10_10_11_1,
+                                          tm->hw[1]->sw_if_index,
+                                          ~0, // invalid fib index
+                                          1,
+                                          l1602,
+                                          FIB_ROUTE_PATH_FLAG_NONE);
+
+    FIB_TEST(!fib_test_validate_entry(fei,
+                                      FIB_FORW_CHAIN_TYPE_UNICAST_IP4,
+                                      1,
+                                      &l_100_eos_o_10_10_10_1),
+             "100.0.0.0/8 LB 1 buckets via: lbl 101 "
+             "adj 10.10.11.1");
+
+    fib_prefix_t pfx_100_1_1_1_s_32 = {
+        .fp_len = 32,
+        .fp_proto = FIB_PROTOCOL_IP4,
+        .fp_addr = {
+            .ip4.as_u32 = clib_host_to_net_u32(0x64010101),
+        },
+    };
+
+    fei = fib_table_entry_special_add(fib_index,
+                                      &pfx_100_1_1_1_s_32,
+                                      FIB_SOURCE_RR,
+                                      FIB_ENTRY_FLAG_NONE);
+
+    FIB_TEST(!fib_test_validate_entry(fei,
+                                      FIB_FORW_CHAIN_TYPE_UNICAST_IP4,
+                                      1,
+                                      &l_100_eos_o_10_10_10_1),
+             "100.1.1.1/32 LB 1 buckets via: "
+             "adj 10.10.11.1");
+
+    fib_table_entry_delete(fib_index,
+                           &pfx_100_s_8,
+                           FIB_SOURCE_API);
+    fib_table_entry_delete_index(fei, FIB_SOURCE_RR);
+
     /*
      * cleanup
      */
@@ -8458,7 +8564,7 @@ lfib_test (void)
     mpls_table_create(MPLS_FIB_DEFAULT_TABLE_ID, FIB_SOURCE_API, NULL);
     mpls_sw_interface_enable_disable(&mpls_main,
                                      tm->hw[0]->sw_if_index,
-                                     1, 1);
+                                     1);
 
     ip46_address_t nh_10_10_10_1 = {
         .ip4.as_u32 = clib_host_to_net_u32(0x0a0a0a01),
@@ -9029,7 +9135,7 @@ lfib_test (void)
      */
     mpls_sw_interface_enable_disable(&mpls_main,
                                      tm->hw[0]->sw_if_index,
-                                     0, 1);
+                                     0);
     mpls_table_delete(MPLS_FIB_DEFAULT_TABLE_ID, FIB_SOURCE_API);
 
     FIB_TEST(0 == pool_elts(mpls_disp_dpo_pool),
@@ -9049,12 +9155,22 @@ static int
 fib_test_inherit (void)
 {
     fib_node_index_t fei;
+    int n_feis, res, i;
     test_main_t *tm;
-    int n_feis, res;
+    ip4_main_t *im4;
+    ip6_main_t *im6;
 
+    tm = &test_main;
+    im4 = &ip4_main;
+    im6 = &ip6_main;
     res = 0;
+
+    for (i = 0; i <= 2; i++)
+    {
+        im4->fib_index_by_sw_if_index[tm->hw[i]->sw_if_index] = 0;
+        im6->fib_index_by_sw_if_index[tm->hw[i]->sw_if_index] = 0;
+    }
     n_feis = fib_entry_pool_size();
-    tm = &test_main;
 
     const ip46_address_t nh_10_10_10_1 = {
         .ip4.as_u32 = clib_host_to_net_u32(0x0a0a0a01),