X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Funittest%2Ffib_test.c;h=76b675bca832adeb72e504e0f8bd51e4e014592a;hb=6fc9cb2ed5f993901ce134bf8f1ff1c5d64a163c;hp=2d75f28a8ca8b50e91c19b5c5e6428bf1f702c53;hpb=3bab8f9c5396a7bf1115b93a9e0691a76a9ed14c;p=vpp.git diff --git a/src/plugins/unittest/fib_test.c b/src/plugins/unittest/fib_test.c index 2d75f28a8ca..76b675bca83 100644 --- a/src/plugins/unittest/fib_test.c +++ b/src/plugins/unittest/fib_test.c @@ -43,6 +43,8 @@ #include +// 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, }; @@ -446,6 +448,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 +497,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 +888,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 +941,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 +977,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 +4484,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 +4538,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 +4575,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 +5300,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); } @@ -5825,10 +5870,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 +5888,11 @@ fib_test_pref (void) }, }; + 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 */ @@ -6688,7 +6742,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 +7391,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 */ @@ -9005,12 +9126,25 @@ 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; + + 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), @@ -9665,6 +9799,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 @@ -9678,11 +9888,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)); @@ -9754,6 +9964,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, @@ -9772,10 +9994,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); @@ -9798,6 +10033,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, @@ -10624,3 +10860,5 @@ fib_test_init (vlib_main_t *vm) } VLIB_INIT_FUNCTION (fib_test_init); + +// clang-format on