#include <vlib/unix/plugin.h>
+// clang-format off
+
/*
* Add debugs for passing tests
*/
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;
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,
},
};
+ vec_validate(im->fib_index_by_sw_if_index, tm->hw[2]->sw_if_index);
+
+ 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
*/
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;
+
+ vec_validate(im4->fib_index_by_sw_if_index, tm->hw[2]->sw_if_index);
+ vec_validate(im6->fib_index_by_sw_if_index, tm->hw[2]->sw_if_index);
+
+ 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),
&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
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));
* 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,
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);
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,
}
VLIB_INIT_FUNCTION (fib_test_init);
+
+// clang-format on