X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Funittest%2Ffib_test.c;h=b9b77ba479f5eae2e04d7580ca41463aa19f9aa1;hb=38fae310843b7431136f40bfa8cf7c6bec59450f;hp=d631350aa89665a977412d4e7a833ce7e8cfad21;hpb=f324dec0a371431f9326f67e920630579741da3c;p=vpp.git diff --git a/src/plugins/unittest/fib_test.c b/src/plugins/unittest/fib_test.c index d631350aa89..b9b77ba479f 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,7 +497,7 @@ 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); @@ -714,7 +756,7 @@ fib_test_validate_entry (fib_node_index_t fei, fw_lbi = ip4_fib_forwarding_lookup(fib_index, &pfx->fp_addr.ip4); break; case FIB_PROTOCOL_IP6: - fw_lbi = ip6_fib_table_fwding_lookup(&ip6_main, fib_index, &pfx->fp_addr.ip6); + fw_lbi = ip6_fib_table_fwding_lookup(fib_index, &pfx->fp_addr.ip6); break; case FIB_PROTOCOL_MPLS: { @@ -845,11 +887,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 +940,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 +976,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 @@ -4433,7 +4475,6 @@ fib_test_v6 (void) dpo = fib_entry_contribute_ip_forwarding(dfrt); FIB_TEST((dpo->dpoi_index == ip6_fib_table_fwding_lookup( - &ip6_main, 1, &pfx_0_0.fp_addr.ip6)), "default-route; fwd and non-fwd tables match"); @@ -4442,11 +4483,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 */ @@ -4496,12 +4537,8 @@ 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( - &ip6_main, 1, &local_pfx.fp_addr.ip6)), "attached-route; fwd and non-fwd tables match"); @@ -4534,10 +4571,12 @@ fib_test_v6 (void) dpo = fib_entry_contribute_ip_forwarding(fei); FIB_TEST((dpo->dpoi_index == ip6_fib_table_fwding_lookup( - &ip6_main, 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 @@ -5260,6 +5299,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); } @@ -6691,7 +6732,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), @@ -9313,13 +9354,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, @@ -9357,7 +9401,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, @@ -9665,6 +9709,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 +9798,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 +9874,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 +9904,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 +9943,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 +10770,5 @@ fib_test_init (vlib_main_t *vm) } VLIB_INIT_FUNCTION (fib_test_init); + +// clang-format on