ip: fix fib and mfib locks
[vpp.git] / src / plugins / unittest / fib_test.c
index f220eb0..26e2d24 100644 (file)
@@ -43,6 +43,8 @@
 
 #include <vlib/unix/plugin.h>
 
+// clang-format off
+
 /*
  * Add debugs for passing tests
  */
@@ -93,7 +95,7 @@ static u8 * format_test_interface_name (u8 * s, va_list * args)
   return format (s, "test-eth%d", dev_instance);
 }
 
-static uword dummy_interface_tx (vlib_main_t * vm,
+static uword placeholder_interface_tx (vlib_main_t * vm,
                                  vlib_node_runtime_t * node,
                                  vlib_frame_t * frame)
 {
@@ -115,7 +117,7 @@ test_interface_admin_up_down (vnet_main_t * vnm,
 VNET_DEVICE_CLASS (test_interface_device_class,static) = {
     .name = "Test interface",
     .format_device_name = format_test_interface_name,
-    .tx_function = dummy_interface_tx,
+    .tx_function = placeholder_interface_tx,
     .admin_up_down_function = test_interface_admin_up_down,
 };
 
@@ -156,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;
 
@@ -446,6 +444,46 @@ fib_test_validate_lb_v (const load_balance_t *lb,
                            exp->label_stack_o_adj.adj);
            }
            break;
+       case FT_LB_LABEL_CHAIN_O_ADJ:
+           {
+               const mpls_label_dpo_t *mld = NULL;
+                mpls_label_dpo_flags_t mf;
+                mpls_label_t hdr;
+               u32 ii;
+
+                mf = ((exp->label_chain_o_adj.mode ==
+                       FIB_MPLS_LSP_MODE_UNIFORM) ?
+                      MPLS_LABEL_DPO_FLAG_UNIFORM_MODE :
+                      MPLS_LABEL_DPO_FLAG_NONE);
+
+                for (ii = 0; ii < exp->label_chain_o_adj.label_chain_size; ii++)
+                {
+                    FIB_TEST_LB((mpls_label_dpo_get_type(mf) == dpo->dpoi_type),
+                                "bucket %d stacks on %U",
+                                bucket,
+                                format_dpo_type, dpo->dpoi_type);
+                    mld = mpls_label_dpo_get(dpo->dpoi_index);
+
+                   hdr = clib_net_to_host_u32(mld->mld_hdr[0].label_exp_s_ttl);
+                   FIB_TEST_LB((vnet_mpls_uc_get_label(hdr) ==
+                                exp->label_chain_o_adj.label_chain[ii]),
+                               "bucket %d stacks on label %d",
+                               bucket,
+                               exp->label_chain_o_adj.label_chain[ii]);
+                    dpo = &mld->mld_dpo;
+               }
+
+               FIB_TEST_LB((DPO_ADJACENCY_INCOMPLETE == mld->mld_dpo.dpoi_type),
+                           "bucket %d label stacks on %U",
+                           bucket,
+                           format_dpo_type, mld->mld_dpo.dpoi_type);
+
+               FIB_TEST_LB((exp->label_chain_o_adj.adj == mld->mld_dpo.dpoi_index),
+                           "bucket %d label stacks on adj %d",
+                           bucket,
+                           exp->label_chain_o_adj.adj);
+           }
+           break;
        case FT_LB_LABEL_O_ADJ:
            {
                const mpls_label_dpo_t *mld;
@@ -455,14 +493,15 @@ fib_test_validate_lb_v (const load_balance_t *lb,
                           "bucket %d stacks on %U",
                           bucket,
                           format_dpo_type, dpo->dpoi_type);
-           
+
                mld = mpls_label_dpo_get(dpo->dpoi_index);
                 hdr = clib_net_to_host_u32(mld->mld_hdr[0].label_exp_s_ttl);
 
                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) ==
@@ -845,11 +884,11 @@ fib_test_v4 (void)
      * at this stage there are 5 entries in the test FIB (plus 5 in the default),
      * all of which are special sourced and so none of which share path-lists.
      * There are also 2 entries, and 2 non-shared path-lists, in the v6 default
-     * table, and 4 path-lists in the v6 MFIB table
+     * table, and 4 path-lists in the v6 MFIB table and 2 in v4.
      */
 #define ENBR (5+5+2)
 
-    u32 PNBR = 5+5+2+4;
+    u32 PNBR = 5+5+2+4+2;
 
     /*
      * if the IGMP plugin is loaded this adds two more entries to the v4 MFIB
@@ -898,9 +937,6 @@ fib_test_v4 (void)
     adj = adj_get(ai);
     FIB_TEST((IP_LOOKUP_NEXT_GLEAN == adj->lookup_next_index),
              "attached interface adj is glean");
-    FIB_TEST((0 == ip46_address_cmp(&local_pfx.fp_addr,
-                                    &adj->sub_type.glean.receive_addr)),
-             "attached interface adj is receive ok");
 
     local_pfx.fp_len = 32;
     fib_table_entry_update_one_path(fib_index, &local_pfx,
@@ -937,6 +973,9 @@ fib_test_v4 (void)
                                              FIB_PROTOCOL_IP4,
                                              FIB_SOURCE_INTERFACE)),
              "2 Interface Source'd prefixes");
+    FIB_TEST((0 == ip46_address_cmp(&local_pfx.fp_addr,
+                                    &adj->sub_type.glean.rx_pfx.fp_addr)),
+             "attached interface adj is receive ok");
 
     /*
      * +2 interface routes +2 non-shared path-lists
@@ -4441,11 +4480,11 @@ fib_test_v6 (void)
 
     /*
      * At this stage there is one v4 FIB with 5 routes and two v6 FIBs
-     * each with 2 entries and a v6 mfib with 4 path-lists.
+     * each with 2 entries and a v6 mfib with 4 path-lists and v4 mfib with 2.
      * All entries are special so no path-list sharing.
      */
 #define ENPS (5+4)
-    u32 PNPS = (5+4+4);
+    u32 PNPS = (5+4+4+2);
     /*
      * if the IGMP plugin is loaded this adds two more entries to the v4 MFIB
      */
@@ -4495,9 +4534,6 @@ fib_test_v6 (void)
     adj = adj_get(ai);
     FIB_TEST((IP_LOOKUP_NEXT_GLEAN == adj->lookup_next_index),
              "attached interface adj is glean");
-    FIB_TEST((0 == ip46_address_cmp(&local_pfx.fp_addr,
-                                    &adj->sub_type.glean.receive_addr)),
-             "attached interface adj is receive ok");
     dpo = fib_entry_contribute_ip_forwarding(fei);
     FIB_TEST((dpo->dpoi_index == ip6_fib_table_fwding_lookup(
                   1,
@@ -4535,6 +4571,9 @@ fib_test_v6 (void)
                   1,
                   &local_pfx.fp_addr.ip6)),
              "local-route; fwd and non-fwd tables match");
+    FIB_TEST((0 == ip46_address_cmp(&local_pfx.fp_addr,
+                                    &adj->sub_type.glean.rx_pfx.fp_addr)),
+             "attached interface adj is receive ok");
 
     /*
      * +2 entries. +2 unshared path-lists
@@ -5257,6 +5296,8 @@ fib_test_v6 (void)
 
     FIB_TEST((0 == adj_nbr_db_size()), "ADJ DB size is %d",
              adj_nbr_db_size());
+    FIB_TEST((0 == adj_glean_db_size()), "ADJ DB size is %d",
+             adj_glean_db_size());
 
     return (res);
 }
@@ -5269,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;
@@ -5296,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);
@@ -5370,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
@@ -5825,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,
@@ -5839,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
      */
@@ -6311,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,
@@ -6357,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,
@@ -6688,7 +6771,7 @@ fib_test_label (void)
                                           l1600,
                                           FIB_ROUTE_PATH_FLAG_NONE);
 
-    FIB_TEST(!fib_test_validate_entry(fei, 
+    FIB_TEST(!fib_test_validate_entry(fei,
                                       FIB_FORW_CHAIN_TYPE_UNICAST_IP4,
                                       1,
                                       &l1600_eos_o_1_1_1_1),
@@ -7337,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
      */
@@ -8414,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),
@@ -8985,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),
@@ -9005,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),
@@ -9310,13 +9470,16 @@ fib_test_inherit (void)
              "%U via 10.10.10.2",
              format_fib_prefix, &pfx_10_10_10_0_s_24);
 
+    fib_source_t hi_src = fib_source_allocate("test", 0x50,
+                                              FIB_SOURCE_BH_SIMPLE);
+
     /*
      * add the source that replaces inherited state.
      * inheriting source is not the best, so it doesn't push state.
      */
     fib_table_entry_update_one_path(0,
                                     &pfx_10_10_10_0_s_24,
-                                    FIB_SOURCE_PLUGIN_HI,
+                                    hi_src,
                                     FIB_ENTRY_FLAG_NONE,
                                     DPO_PROTO_IP4,
                                     &nh_10_10_10_1,
@@ -9354,7 +9517,7 @@ fib_test_inherit (void)
      * withdraw the higher priority source and expect the inherited to return
      * throughout the sub-tree
      */
-    fib_table_entry_delete(0, &pfx_10_10_10_0_s_24, FIB_SOURCE_PLUGIN_HI);
+    fib_table_entry_delete(0, &pfx_10_10_10_0_s_24, hi_src);
 
     fei = fib_table_lookup_exact_match(0, &pfx_10_10_10_21_s_32);
     FIB_TEST(!fib_test_validate_entry(fei,
@@ -9662,6 +9825,82 @@ fib_test_inherit (void)
                                       &adj_o_10_10_10_3),
              "%U via 10.10.10.1",
              format_fib_prefix, &pfx_11_11_11_11_s_32);
+    dpo_reset(&interposer);
+    fib_table_entry_delete(0, &pfx_11_11_11_11_s_32, FIB_SOURCE_API);
+
+    /*
+     * add an interposer to a source with path-extensions
+     */
+    fib_mpls_label_t *l3300 = NULL, fml_3300 = {
+        .fml_value = 3300,
+    };
+    vec_add1(l3300, fml_3300);
+    fib_table_entry_update_one_path(0,
+                                    &pfx_11_11_11_11_s_32,
+                                    FIB_SOURCE_API,
+                                    FIB_ENTRY_FLAG_NONE,
+                                    DPO_PROTO_IP4,
+                                    &nh_10_10_10_3,
+                                    tm->hw[0]->sw_if_index,
+                                    ~0,
+                                    1,
+                                    l3300,
+                                    FIB_ROUTE_PATH_FLAG_NONE);
+
+    mpls_label_dpo_create(l99,
+                          MPLS_EOS,
+                          DPO_PROTO_IP4,
+                          MPLS_LABEL_DPO_FLAG_NONE,
+                          punt_dpo_get(DPO_PROTO_MPLS),
+                          &interposer);
+
+    adj_index_t ai_mpls_10_10_10_3 = adj_nbr_add_or_lock(FIB_PROTOCOL_IP4,
+                                                         VNET_LINK_MPLS,
+                                                         &nh_10_10_10_3,
+                                                         tm->hw[0]->sw_if_index);
+    fib_test_lb_bucket_t l3300_o_10_10_10_3 = {
+        .type = FT_LB_LABEL_O_ADJ,
+        .label_o_adj = {
+            .adj = ai_mpls_10_10_10_3,
+            .label = 3300,
+            .eos = MPLS_EOS,
+        },
+    };
+    fib_test_lb_bucket_t lchain_o_10_10_10_3 = {
+        .type = FT_LB_LABEL_CHAIN_O_ADJ,
+        .label_chain_o_adj = {
+            .adj = ai_mpls_10_10_10_3,
+            .label_chain_size = 2,
+            .label_chain = {
+                99, 3300
+            },
+            .eos = MPLS_EOS,
+        },
+    };
+
+    fei = fib_table_entry_special_dpo_add(0,
+                                          &pfx_11_11_11_11_s_32,
+                                          FIB_SOURCE_SPECIAL,
+                                          FIB_ENTRY_FLAG_INTERPOSE,
+                                          &interposer);
+
+    FIB_TEST(!fib_test_validate_entry(fei,
+                                      FIB_FORW_CHAIN_TYPE_UNICAST_IP4,
+                                      1,
+                                      &lchain_o_10_10_10_3),
+             "%U via interposer & mpls on adj",
+             format_fib_prefix, &pfx_11_11_11_11_s_32);
+
+    fib_table_entry_special_remove(0,
+                                   &pfx_11_11_11_11_s_32,
+                                   FIB_SOURCE_SPECIAL);
+    FIB_TEST(!fib_test_validate_entry(fei,
+                                      FIB_FORW_CHAIN_TYPE_UNICAST_IP4,
+                                      1,
+                                      &l3300_o_10_10_10_3),
+             "%U via 10.10.10.1",
+             format_fib_prefix, &pfx_11_11_11_11_s_32);
+    adj_unlock(ai_mpls_10_10_10_3);
 
     /*
      * remove and re-add the second best API source while the interpose
@@ -9675,11 +9914,11 @@ fib_test_inherit (void)
     FIB_TEST(!fib_test_validate_entry(fei,
                                       FIB_FORW_CHAIN_TYPE_UNICAST_IP4,
                                       1,
-                                      &l99_o_10_10_10_3),
+                                      &lchain_o_10_10_10_3),
              "%U via interposer adj",
              format_fib_prefix,&pfx_11_11_11_11_s_32);
 
-    FIB_TEST(2 == pool_elts(mpls_label_dpo_pool),
+    FIB_TEST(3 == pool_elts(mpls_label_dpo_pool),
              "MPLS label pool: %d",
              pool_elts(mpls_label_dpo_pool));
 
@@ -9751,6 +9990,18 @@ fib_test_inherit (void)
      * multiple interpose sources on the same entry. Only the high
      * priority source gets to add the interpose.
      */
+    fib_table_entry_update_one_path(0,
+                                    &pfx_11_11_11_11_s_32,
+                                    FIB_SOURCE_API,
+                                    FIB_ENTRY_FLAG_NONE,
+                                    DPO_PROTO_IP4,
+                                    &nh_10_10_10_3,
+                                    tm->hw[0]->sw_if_index,
+                                    ~0,
+                                    1,
+                                    NULL,
+                                    FIB_ROUTE_PATH_FLAG_NONE);
+
     dpo_id_t interposer2 = DPO_INVALID;
     fib_mpls_label_t *l100 = NULL, fml_100 = {
         .fml_value = 100,
@@ -9769,10 +10020,23 @@ fib_test_inherit (void)
                                           FIB_SOURCE_CLASSIFY,
                                           FIB_ENTRY_FLAG_INTERPOSE,
                                           &interposer2);
+
+    fib_test_lb_bucket_t lc100_o_10_10_10_3 = {
+        .type = FT_LB_LABEL_CHAIN_O_ADJ,
+        .label_chain_o_adj = {
+            .adj = ai_10_10_10_3,
+            .label_chain_size = 2,
+            .label_chain = {
+                99, 100
+            },
+            .eos = MPLS_EOS,
+        },
+    };
+
     FIB_TEST(!fib_test_validate_entry(fei,
                                       FIB_FORW_CHAIN_TYPE_UNICAST_IP4,
                                       1,
-                                      &l99_o_10_10_10_3),
+                                      &lc100_o_10_10_10_3),
              "%U via interposer label 99",
              format_fib_prefix,&pfx_11_11_11_11_s_32);
 
@@ -9795,6 +10059,7 @@ fib_test_inherit (void)
              format_fib_prefix,&pfx_11_11_11_11_s_32);
 
     fib_table_entry_delete(0, &pfx_11_11_11_0_s_24, FIB_SOURCE_API);
+    fib_table_entry_delete(0, &pfx_11_11_11_11_s_32, FIB_SOURCE_API);
     FIB_TEST(!fib_test_validate_entry(fei,
                                       FIB_FORW_CHAIN_TYPE_UNICAST_IP4,
                                       1,
@@ -10621,3 +10886,5 @@ fib_test_init (vlib_main_t *vm)
 }
 
 VLIB_INIT_FUNCTION (fib_test_init);
+
+// clang-format on