diff options
Diffstat (limited to 'vnet/vnet/fib/fib_test.c')
-rw-r--r-- | vnet/vnet/fib/fib_test.c | 1033 |
1 files changed, 457 insertions, 576 deletions
diff --git a/vnet/vnet/fib/fib_test.c b/vnet/vnet/fib/fib_test.c index eb5253d06da..a28026c13c1 100644 --- a/vnet/vnet/fib/fib_test.c +++ b/vnet/vnet/fib/fib_test.c @@ -28,6 +28,7 @@ #include <vnet/mpls/mpls.h> #include <vnet/fib/fib_path_list.h> +#include <vnet/fib/fib_entry_src.h> #include <vnet/fib/fib_walk.h> #include <vnet/fib/fib_node_list.h> #include <vnet/fib/fib_urpf_list.h> @@ -256,6 +257,7 @@ fib_test_build_rewrite (u8 *eth_addr) typedef enum fib_test_lb_bucket_type_t_ { FT_LB_LABEL_O_ADJ, + FT_LB_LABEL_STACK_O_ADJ, FT_LB_LABEL_O_LB, FT_LB_O_LB, FT_LB_SPECIAL, @@ -277,6 +279,14 @@ typedef struct fib_test_lb_bucket_t_ { struct { mpls_eos_bit_t eos; + mpls_label_t label_stack[8]; + u8 label_stack_size; + u8 ttl; + adj_index_t adj; + } label_stack_o_adj; + struct + { + mpls_eos_bit_t eos; mpls_label_t label; u8 ttl; index_t lb; @@ -322,6 +332,63 @@ fib_test_validate_lb_v (const load_balance_t *lb, switch (exp->type) { + case FT_LB_LABEL_STACK_O_ADJ: + { + const mpls_label_dpo_t *mld; + mpls_label_t hdr; + u32 ii; + + FIB_TEST_LB((DPO_MPLS_LABEL == dpo->dpoi_type), + "bucket %d stacks on %U", + bucket, + format_dpo_type, dpo->dpoi_type); + + mld = mpls_label_dpo_get(dpo->dpoi_index); + + FIB_TEST_LB(exp->label_stack_o_adj.label_stack_size == mld->mld_n_labels, + "label stack size", + mld->mld_n_labels); + + for (ii = 0; ii < mld->mld_n_labels; ii++) + { + hdr = clib_net_to_host_u32(mld->mld_hdr[ii].label_exp_s_ttl); + FIB_TEST_LB((vnet_mpls_uc_get_label(hdr) == + exp->label_stack_o_adj.label_stack[ii]), + "bucket %d stacks on label %d", + bucket, + exp->label_stack_o_adj.label_stack[ii]); + + if (ii == mld->mld_n_labels-1) + { + FIB_TEST_LB((vnet_mpls_uc_get_s(hdr) == + exp->label_o_adj.eos), + "bucket %d stacks on label %d %U!=%U", + bucket, + exp->label_stack_o_adj.label_stack[ii], + format_mpls_eos_bit, exp->label_o_adj.eos, + format_mpls_eos_bit, vnet_mpls_uc_get_s(hdr)); + } + else + { + FIB_TEST_LB((vnet_mpls_uc_get_s(hdr) == MPLS_NON_EOS), + "bucket %d stacks on label %d %U", + bucket, + exp->label_stack_o_adj.label_stack[ii], + format_mpls_eos_bit, vnet_mpls_uc_get_s(hdr)); + } + } + + 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_stack_o_adj.adj == mld->mld_dpo.dpoi_index), + "bucket %d label stacks on adj %d", + bucket, + exp->label_stack_o_adj.adj); + } + break; case FT_LB_LABEL_O_ADJ: { const mpls_label_dpo_t *mld; @@ -332,7 +399,7 @@ fib_test_validate_lb_v (const load_balance_t *lb, format_dpo_type, dpo->dpoi_type); mld = mpls_label_dpo_get(dpo->dpoi_index); - hdr = clib_net_to_host_u32(mld->mld_hdr.label_exp_s_ttl); + 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), @@ -367,10 +434,12 @@ 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.label_exp_s_ttl); + hdr = clib_net_to_host_u32(mld->mld_hdr[0].label_exp_s_ttl); + FIB_TEST_LB(1 == mld->mld_n_labels, "label stack size", + mld->mld_n_labels); FIB_TEST_LB((vnet_mpls_uc_get_label(hdr) == exp->label_o_lb.label), "bucket %d stacks on label %d", @@ -437,8 +506,8 @@ fib_test_validate_entry (fib_node_index_t fei, u16 n_buckets, ...) { - const load_balance_t *lb; dpo_id_t dpo = DPO_INVALID; + const load_balance_t *lb; fib_prefix_t pfx; index_t fw_lbi; u32 fib_index; @@ -462,34 +531,37 @@ fib_test_validate_entry (fib_node_index_t fei, * ensure that the LB contributed by the entry is the * same as the LB in the forwarding tables */ - switch (pfx.fp_proto) + if (fct == fib_entry_get_default_chain_type(fib_entry_get(fei))) { - case FIB_PROTOCOL_IP4: - 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); - break; - case FIB_PROTOCOL_MPLS: - { - mpls_unicast_header_t hdr = { - .label_exp_s_ttl = 0, - }; - - vnet_mpls_uc_set_label(&hdr.label_exp_s_ttl, pfx.fp_label); - vnet_mpls_uc_set_s(&hdr.label_exp_s_ttl, pfx.fp_eos); - hdr.label_exp_s_ttl = clib_host_to_net_u32(hdr.label_exp_s_ttl); - - fw_lbi = mpls_fib_table_forwarding_lookup(fib_index, &hdr); - break; - } - default: - fw_lbi = 0; + switch (pfx.fp_proto) + { + case FIB_PROTOCOL_IP4: + 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); + break; + case FIB_PROTOCOL_MPLS: + { + mpls_unicast_header_t hdr = { + .label_exp_s_ttl = 0, + }; + + vnet_mpls_uc_set_label(&hdr.label_exp_s_ttl, pfx.fp_label); + vnet_mpls_uc_set_s(&hdr.label_exp_s_ttl, pfx.fp_eos); + hdr.label_exp_s_ttl = clib_host_to_net_u32(hdr.label_exp_s_ttl); + + fw_lbi = mpls_fib_table_forwarding_lookup(fib_index, &hdr); + break; + } + default: + fw_lbi = 0; + } + FIB_TEST_LB((fw_lbi == dpo.dpoi_index), + "Contributed LB = FW LB: %U\n %U", + format_load_balance, fw_lbi, 0, + format_load_balance, dpo.dpoi_index, 0); } - FIB_TEST_LB((fw_lbi == dpo.dpoi_index), - "Contributed LB = FW LB: %U\n %U", - format_load_balance, fw_lbi, 0, - format_load_balance, dpo.dpoi_index, 0); dpo_reset(&dpo); @@ -623,7 +695,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, // weight - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &local_pfx); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "attached interface route present"); @@ -650,7 +722,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, // weight - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &local_pfx); FIB_TEST(((FIB_ENTRY_FLAG_LOCAL | FIB_ENTRY_FLAG_CONNECTED) == @@ -700,7 +772,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx); FIB_TEST((FIB_ENTRY_FLAG_NONE == fib_entry_get_flags(fei)), @@ -818,7 +890,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); dpo = fib_entry_contribute_ip_forwarding(fei); @@ -884,7 +956,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST((FIB_ENTRY_FLAG_ATTACHED == fib_entry_get_flags(fei)), "Flags set on adj-fib"); @@ -933,7 +1005,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_10_10_10_2_s_32); @@ -970,7 +1042,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_1_1_1_1_s_32); ai = fib_entry_get_adj(fei); @@ -1003,7 +1075,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_1_1_2_0_s_24); ai = fib_entry_get_adj(fei); @@ -1030,7 +1102,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_1_1_2_0_s_24); dpo = fib_entry_contribute_ip_forwarding(fei); @@ -1116,7 +1188,7 @@ fib_test_v4 (void) ~0, // no index provided. fib_index, // nexthop in same fib as route 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST_REC_FORW(&bgp_100_pfx, &pfx_1_1_1_1_s_32, 0); @@ -1152,7 +1224,7 @@ fib_test_v4 (void) ~0, // no index provided. fib_index, // nexthop in same fib as route 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST_REC_FORW(&bgp_101_pfx, &pfx_1_1_1_1_s_32, 0); @@ -1274,7 +1346,7 @@ fib_test_v4 (void) ~0, // no index provided. fib_index, // nexthop in same fib as route 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST_REC_FORW(&bgp_200_pfx, &pfx_1_1_1_2_s_32, 0); @@ -1320,7 +1392,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_entry_path_add(fib_index, &pfx_1_2_3_4_s_32, @@ -1331,7 +1403,7 @@ fib_test_v4 (void) tm->hw[1]->sw_if_index, ~0, 3, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "1.2.3.4/32 presnet"); @@ -1372,7 +1444,7 @@ fib_test_v4 (void) tm->hw[1]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_entry_path_add(fib_index, &pfx_1_2_3_5_s_32, @@ -1383,7 +1455,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, 4, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "1.2.3.5/32 presnet"); @@ -1455,7 +1527,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 0, // zero weigth - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_6_6_6_6_s_32); @@ -1474,7 +1546,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 100, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_6_6_6_6_s_32); @@ -1556,7 +1628,7 @@ fib_test_v4 (void) tm->hw[1]->sw_if_index, ~0, // invalid fib index 100, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_6_6_6_6_s_32); @@ -1812,7 +1884,7 @@ fib_test_v4 (void) ~0, fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_entry_path_add(fib_index, &bgp_44_s_32, @@ -1823,7 +1895,7 @@ fib_test_v4 (void) ~0, fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST_REC_FORW(&bgp_44_s_32, &pfx_1_2_3_4_s_32, 0); @@ -1893,7 +1965,7 @@ fib_test_v4 (void) ~0, // no index provided. fib_index, // nexthop in same fib as route 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST_REC_FORW(&bgp_201_pfx, &pfx_1_1_1_200_s_32, 0); @@ -1936,7 +2008,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_1_1_1_0_s_24); dpo1 = fib_entry_contribute_ip_forwarding(fei); @@ -1994,7 +2066,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_1_1_1_0_s_28); dpo2 = fib_entry_contribute_ip_forwarding(fei); @@ -2097,7 +2169,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); dpo1 = fib_entry_contribute_ip_forwarding(fei); ai = fib_entry_get_adj(fei); @@ -2198,7 +2270,7 @@ fib_test_v4 (void) ~0, // no index provided. fib_index, // same as route 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fib_table_entry_path_add(fib_index, &bgp_102, @@ -2209,7 +2281,7 @@ fib_test_v4 (void) ~0, // no index provided. fib_index, // same as route's FIB 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &bgp_102); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "100.100.100.102/32 presnet"); @@ -2298,7 +2370,7 @@ fib_test_v4 (void) ~0, // no index provided. fib_index, // Same as route's FIB 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); /* @@ -2345,7 +2417,7 @@ fib_test_v4 (void) ~0, // no index provided. fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); /* @@ -2459,7 +2531,7 @@ fib_test_v4 (void) ~0, // no index provided. fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fib_table_entry_path_add(fib_index, &pfx_5_5_5_6_s_32, @@ -2470,7 +2542,7 @@ fib_test_v4 (void) ~0, // no index provided. fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fib_table_entry_path_add(fib_index, &pfx_5_5_5_7_s_32, @@ -2481,7 +2553,7 @@ fib_test_v4 (void) ~0, // no index provided. fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); /* * +3 entries, +3 shared path-list @@ -2520,7 +2592,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); @@ -2579,7 +2651,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_5_5_5_5_s_32); @@ -2621,7 +2693,7 @@ fib_test_v4 (void) ~0, // no index provided. fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_5_5_5_7_s_32); @@ -2696,7 +2768,7 @@ fib_test_v4 (void) ~0, // no index provided. fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_5_5_5_6_s_32); FIB_TEST(load_balance_is_drop(fib_entry_contribute_ip_forwarding(fei)), @@ -2744,7 +2816,7 @@ fib_test_v4 (void) ~0, // recursive fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); dpo = fib_entry_contribute_ip_forwarding(fei); FIB_TEST(load_balance_is_drop(dpo), @@ -2774,7 +2846,7 @@ fib_test_v4 (void) ~0, fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_RESOLVE_VIA_HOST); fei = fib_table_lookup_exact_match(fib_index, &pfx_1_1_1_1_s_32); @@ -2804,7 +2876,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &pfx_1_1_1_0_s_28); ai = fib_entry_get_adj(fei); @@ -2839,7 +2911,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST(!dpo_cmp(dpo2, load_balance_get_bucket(dpo1->dpoi_index, 0)), "adj for 200.200.200.200/32 is recursive via adj for 1.1.1.1"); @@ -2863,7 +2935,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fib_table_entry_path_add(fib_index, @@ -2875,7 +2947,7 @@ fib_test_v4 (void) ~0, fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_RESOLVE_VIA_HOST); fei = fib_table_lookup_exact_match(fib_index, &bgp_200_pfx); @@ -2960,7 +3032,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST(!dpo_cmp(dpo2, load_balance_get_bucket_i(lb, 0)), @@ -2987,7 +3059,7 @@ fib_test_v4 (void) ~0, fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_RESOLVE_VIA_HOST); fei = fib_table_lookup_exact_match(fib_index, &bgp_200_pfx); @@ -3055,7 +3127,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fib_table_entry_path_remove(fib_index, @@ -3133,7 +3205,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fib_table_entry_path_add(fib_index, &pfx_4_4_4_4_s_32, @@ -3144,7 +3216,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fib_table_entry_path_add(fib_index, &pfx_4_4_4_4_s_32, @@ -3155,7 +3227,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST(FIB_NODE_INDEX_INVALID != fib_table_lookup_exact_match(fib_index, &pfx_4_4_4_4_s_32), @@ -3240,7 +3312,7 @@ fib_test_v4 (void) ~0, fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &pfx_4_4_4_4_s_32); @@ -3300,7 +3372,7 @@ fib_test_v4 (void) ~0, fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_entry_path_add(fib_index, &pfx_34_1_1_1_s_32, @@ -3311,7 +3383,7 @@ fib_test_v4 (void) ~0, fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST_REC_FORW(&pfx_34_1_1_1_s_32, &pfx_34_34_1_1_s_32, 0); fib_table_entry_delete_index(fei, FIB_SOURCE_API); @@ -3389,7 +3461,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &pfx_4_1_1_1_s_32); @@ -3443,7 +3515,7 @@ fib_test_v4 (void) tm->hw[0]->sw_if_index, fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(0, &pfx_2001_s_64); @@ -3684,7 +3756,7 @@ fib_test_v6 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &local_pfx); @@ -3715,7 +3787,7 @@ fib_test_v6 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &local_pfx); @@ -3760,7 +3832,7 @@ fib_test_v6 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_0_0); @@ -3881,7 +3953,7 @@ fib_test_v6 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_2001_1_2_s_128); @@ -3920,7 +3992,7 @@ fib_test_v6 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_2001_1_3_s_128); @@ -3974,7 +4046,7 @@ fib_test_v6 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_2001_a_s_64); ai = fib_entry_get_adj(fei); @@ -3988,7 +4060,7 @@ fib_test_v6 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_2001_b_s_64); ai = fib_entry_get_adj(fei); @@ -4023,7 +4095,7 @@ fib_test_v6 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST(fei == fib_table_lookup_exact_match(0, &pfx_1_1_1_1_s_32), "1.1.1.1/32 o v6 route present"); @@ -4061,7 +4133,7 @@ fib_test_v6 (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &pfx_2001_c_s_64); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "attached route present"); @@ -4163,7 +4235,7 @@ fib_test_v6 (void) tm->hw[1]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &connected_pfx); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "attached interface route present"); @@ -4182,7 +4254,7 @@ fib_test_v6 (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &connected_pfx); @@ -4462,429 +4534,6 @@ fib_test_v6 (void) } /* - * Test the recursive route route handling for GRE tunnels - */ -static void -fib_test_gre (void) -{ - /* fib_node_index_t fei; */ - /* u32 fib_index = 0; */ - /* test_main_t *tm; */ - /* u32 ii; */ - - /* tm = &test_main; */ - - /* for (ii = 0; ii < 4; ii++) */ - /* { */ - /* ip4_main.fib_index_by_sw_if_index[tm->hw[ii]->sw_if_index] = 0; */ - /* } */ - - /* /\* */ - /* * add interface routes. We'll assume this works. It's more rigorously */ - /* * tested elsewhere. */ - /* *\/ */ - /* fib_prefix_t local_pfx = { */ - /* .fp_len = 24, */ - /* .fp_proto = FIB_PROTOCOL_IP4, */ - /* .fp_addr = { */ - /* .ip4 = { */ - /* /\* 10.10.10.10 *\/ */ - /* .as_u32 = clib_host_to_net_u32(0x0a0a0a0a), */ - /* }, */ - /* }, */ - /* }; */ - - /* fib_table_entry_update_one_path(fib_index, &local_pfx, */ - /* FIB_SOURCE_INTERFACE, */ - /* (FIB_ENTRY_FLAG_CONNECTED | */ - /* FIB_ENTRY_FLAG_ATTACHED), */ - /* NULL, */ - /* tm->hw[0]->sw_if_index, */ - /* ~0, */ - /* 1, */ - /* FIB_ROUTE_PATH_FLAG_NONE); */ - /* fei = fib_table_lookup_exact_match(fib_index, &local_pfx); */ - /* FIB_TEST((FIB_NODE_INDEX_INVALID != fei), */ - /* "attached interface route present"); */ - - /* local_pfx.fp_len = 32; */ - /* fib_table_entry_update_one_path(fib_index, &local_pfx, */ - /* FIB_SOURCE_INTERFACE, */ - /* (FIB_ENTRY_FLAG_CONNECTED | */ - /* FIB_ENTRY_FLAG_LOCAL), */ - /* NULL, */ - /* tm->hw[0]->sw_if_index, */ - /* ~0, // invalid fib index */ - /* 1, */ - /* FIB_ROUTE_PATH_FLAG_NONE); */ - /* fei = fib_table_lookup_exact_match(fib_index, &local_pfx); */ - - /* FIB_TEST((FIB_NODE_INDEX_INVALID != fei), */ - /* "local interface route present"); */ - - /* fib_prefix_t local2_pfx = { */ - /* .fp_len = 24, */ - /* .fp_proto = FIB_PROTOCOL_IP4, */ - /* .fp_addr = { */ - /* .ip4 = { */ - /* /\* 10.10.11.11 *\/ */ - /* .as_u32 = clib_host_to_net_u32(0x0a0a0b0b), */ - /* }, */ - /* }, */ - /* }; */ - - /* fib_table_entry_update_one_path(fib_index, &local2_pfx, */ - /* FIB_SOURCE_INTERFACE, */ - /* (FIB_ENTRY_FLAG_CONNECTED | */ - /* FIB_ENTRY_FLAG_ATTACHED), */ - /* NULL, */ - /* tm->hw[1]->sw_if_index, */ - /* ~0, */ - /* 1, */ - /* FIB_ROUTE_PATH_FLAG_NONE); */ - /* fei = fib_table_lookup_exact_match(fib_index, &local2_pfx); */ - /* FIB_TEST((FIB_NODE_INDEX_INVALID != fei), */ - /* "attached interface route present"); */ - - /* local2_pfx.fp_len = 32; */ - /* fib_table_entry_update_one_path(fib_index, &local2_pfx, */ - /* FIB_SOURCE_INTERFACE, */ - /* (FIB_ENTRY_FLAG_CONNECTED | */ - /* FIB_ENTRY_FLAG_LOCAL), */ - /* NULL, */ - /* tm->hw[0]->sw_if_index, */ - /* ~0, // invalid fib index */ - /* 1, */ - /* FIB_ROUTE_PATH_FLAG_NONE); */ - /* fei = fib_table_lookup_exact_match(fib_index, &local2_pfx); */ - - /* FIB_TEST((FIB_NODE_INDEX_INVALID != fei), */ - /* "local interface route present"); */ - - /* /\* */ - /* * Add the route that will be used to resolve the tunnel's destination */ - /* *\/ */ - /* fib_prefix_t route_pfx = { */ - /* .fp_len = 24, */ - /* .fp_proto = FIB_PROTOCOL_IP4, */ - /* .fp_addr = { */ - /* .ip4 = { */ - /* /\* 1.1.1.0/24 *\/ */ - /* .as_u32 = clib_host_to_net_u32(0x01010100), */ - /* }, */ - /* }, */ - /* }; */ - /* /\* 10.10.10.2 *\/ */ - /* ip46_address_t nh_10_10_10_2 = { */ - /* .ip4.as_u32 = clib_host_to_net_u32(0x0a0a0a02), */ - /* }; */ - - /* fib_table_entry_path_add(fib_index, &route_pfx, */ - /* FIB_SOURCE_API, */ - /* FIB_ENTRY_FLAG_NONE, */ - /* &nh_10_10_10_2, */ - /* tm->hw[0]->sw_if_index, */ - /* ~0, */ - /* 1, */ - /* FIB_ROUTE_PATH_FLAG_NONE); */ - /* FIB_TEST((FIB_NODE_INDEX_INVALID != */ - /* fib_table_lookup_exact_match(fib_index, &local_pfx)), */ - /* "route present"); */ - - /* /\* */ - /* * Add a tunnel */ - /* *\/ */ - /* /\* 1.1.1.1 *\/ */ - /* fib_prefix_t tun_dst_pfx = { */ - /* .fp_len = 32, */ - /* .fp_proto = FIB_PROTOCOL_IP4, */ - /* .fp_addr = { */ - /* .ip4.as_u32 = clib_host_to_net_u32(0x01010101), */ - /* }, */ - /* }; */ - /* /\* 10.10.10.10 *\/ */ - /* ip4_address_t tun_src = { */ - /* .as_u32 = clib_host_to_net_u32(0x0a0a0a0a), */ - /* }; */ - /* /\* 172.16.0.1 *\/ */ - /* ip4_address_t tun_itf = { */ - /* .as_u32 = clib_host_to_net_u32(0xac100001), */ - /* }; */ - /* fib_prefix_t tun_itf_pfx = { */ - /* .fp_len = 30, */ - /* .fp_proto = FIB_PROTOCOL_IP4, */ - /* .fp_addr = { */ - /* .ip4 = tun_itf, */ - /* }, */ - /* }; */ - /* u32 *encap_labels = NULL; */ - /* u32 label = 0xbaba; */ - /* u32 encap_index; */ - /* u32 tunnel_sw_if_index; */ - - /* int rv; */ - - /* /\* */ - /* * First we need the MPLS Encap present */ - /* * */ - /* * Pretty sure this is broken. the wiki say the 1st aparamter address */ - /* * should be the tunnel's interface address, which makes some sense. But */ - /* * the code for tunnel creation checks for the tunnel's destination */ - /* * address. curious... */ - /* *\/ */ - /* vec_add1(encap_labels, label); */ - /* rv = vnet_mpls_add_del_encap(&tun_dst_pfx.fp_addr.ip4, */ - /* 0, // inner VRF */ - /* encap_labels, */ - /* ~0, // policy_tunnel_index, */ - /* 0, // no_dst_hash, */ - /* &encap_index, */ - /* 1); // ADD */ - /* FIB_TEST((0 == rv), "MPLS encap created"); */ - - /* /\* */ - /* * now create the tunnel */ - /* *\/ */ - /* rv = vnet_mpls_gre_add_del_tunnel(&tun_src, */ - /* &tun_dst_pfx.fp_addr.ip4, */ - /* &tun_itf_pfx.fp_addr.ip4, */ - /* tun_itf_pfx.fp_len, */ - /* 0, // inner VRF */ - /* 0, // outer VRF */ - /* &tunnel_sw_if_index, */ - /* 0, // l2 only */ - /* 1); // ADD */ - /* FIB_TEST((0 == rv), "Tunnel created"); */ - - /* /\* */ - /* * add it again. just for giggles. */ - /* *\/ */ - /* rv = vnet_mpls_gre_add_del_tunnel(&tun_src, */ - /* &tun_dst_pfx.fp_addr.ip4, */ - /* &tun_itf_pfx.fp_addr.ip4, */ - /* tun_itf_pfx.fp_len, */ - /* 0, // inner VRF */ - /* 0, // outer VRF */ - /* &tunnel_sw_if_index, */ - /* 0, // l2 only */ - /* 1); // ADD */ - /* FIB_TEST((0 != rv), "Duplicate Tunnel not created"); */ - - /* /\* */ - /* * Find the route added for the tunnel subnet and check that */ - /* * it has a midchin adj that is stacked on the adj used to reach the */ - /* * tunnel destination */ - /* *\/ */ - /* ip_adjacency_t *midchain_adj, *route_adj, *adjfib_adj; */ - /* adj_index_t midchain_ai, route_ai, adjfib_ai1, adjfib_ai2; */ - /* ip_lookup_main_t *lm; */ - - /* lm = &ip4_main.lookup_main; */ - - /* fei = fib_table_lookup_exact_match(fib_index, &tun_itf_pfx); */ - /* FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "tun itf route present"); */ - /* midchain_ai = fib_entry_contribute_forwarding(fei); */ - /* midchain_adj = adj_get(midchain_ai); */ - - /* FIB_TEST((IP_LOOKUP_NEXT_MIDCHAIN == midchain_adj->lookup_next_index), */ - /* "Tunnel interface links to midchain"); */ - - /* fei = fib_table_lookup_exact_match(fib_index, &route_pfx); */ - /* route_ai = fib_entry_contribute_forwarding(fei); */ - /* FIB_TEST((midchain_adj->sub_type.midchain.adj_index == route_ai), */ - /* "tunnel midchain it stacked on route adj"); */ - - /* /\* */ - /* * update the route to the tunnel's destination to load-balance via */ - /* * interface 1. */ - /* *\/ */ - /* /\* 10.10.11.2 *\/ */ - /* ip46_address_t nh_10_10_11_2 = { */ - /* .ip4.as_u32 = clib_host_to_net_u32(0x0a0a0b02), */ - /* }; */ - - /* fib_table_entry_path_add(fib_index, &route_pfx, */ - /* FIB_SOURCE_API, */ - /* FIB_ENTRY_FLAG_NONE, */ - /* &nh_10_10_11_2, */ - /* tm->hw[1]->sw_if_index, */ - /* ~0, */ - /* 1, */ - /* FIB_ROUTE_PATH_FLAG_NONE); */ - - /* /\* */ - /* * the tunnels midchain should have re-stacked. This tests that the */ - /* * route re-resolution backwalk works to a tunnel interface. */ - /* *\/ */ - /* fei = fib_table_lookup_exact_match(fib_index, &route_pfx); */ - /* FIB_TEST((route_ai != fib_entry_contribute_forwarding(fei)), "route changed"); */ - /* route_ai = fib_entry_contribute_forwarding(fei); */ - - /* midchain_adj = adj_get(midchain_ai); */ - - /* FIB_TEST((midchain_adj->sub_type.midchain.adj_index == route_ai), */ - /* "tunnel midchain has re-stacked on route adj"); */ - - /* route_adj = adj_get(route_ai); */ - - /* FIB_TEST((2 == route_adj->n_adj), "Route adj is multipath"); */ - - /* /\* */ - /* * At this stage both nieghbour adjs are incomplete, so the same should */ - /* * be true of the multipath adj */ - /* *\/ */ - /* FIB_TEST((IP_LOOKUP_NEXT_ARP == route_adj->lookup_next_index), */ - /* "Adj0 is ARP: %d", route_adj->lookup_next_index); */ - /* FIB_TEST((IP_LOOKUP_NEXT_ARP == (route_adj+1)->lookup_next_index), */ - /* "Adj1 is ARP"); */ - - /* /\* */ - /* * do the equivalent of creating an ARP entry for 10.10.10.2. */ - /* * This will complete the adj, and this */ - /* * change should be refelct in the multipath too. */ - /* *\/ */ - /* u8* rewrite = NULL, byte = 0xd; */ - /* vec_add(rewrite, &byte, 6); */ - - /* adjfib_ai1 = adj_nbr_add_or_lock(FIB_PROTOCOL_IP4, */ - /* VNET_LINK_IP4, */ - /* &nh_10_10_10_2, */ - /* tm->hw[0]->sw_if_index); */ - /* adj_nbr_update_rewrite(FIB_PROTOCOL_IP4, */ - /* adjfib_ai1, */ - /* rewrite); */ - /* adjfib_adj = adj_get(adjfib_ai1); */ - /* FIB_TEST((IP_LOOKUP_NEXT_REWRITE == adjfib_adj->lookup_next_index), */ - /* "Adj-fib10 adj is rewrite"); */ - - /* adjfib_ai2 = adj_nbr_add_or_lock(FIB_PROTOCOL_IP4, */ - /* VNET_LINK_IP4, */ - /* &nh_10_10_11_2, */ - /* tm->hw[1]->sw_if_index); */ - /* adj_nbr_update_rewrite(FIB_PROTOCOL_IP4, */ - /* adjfib_ai2, */ - /* rewrite); */ - - /* adjfib_adj = adj_get(adjfib_ai2); */ - - /* FIB_TEST((IP_LOOKUP_NEXT_REWRITE == adjfib_adj->lookup_next_index), */ - /* "Adj-fib11 adj is rewrite"); */ - - /* fei = fib_table_lookup_exact_match(fib_index, &route_pfx); */ - /* FIB_TEST((route_ai != fib_entry_contribute_forwarding(fei)), "route changed"); */ - /* route_ai = fib_entry_contribute_forwarding(fei); */ - /* route_adj = adj_get(route_ai); */ - /* FIB_TEST((IP_LOOKUP_NEXT_REWRITE == route_adj->lookup_next_index), */ - /* "Adj0 is rewrite"); */ - /* FIB_TEST((IP_LOOKUP_NEXT_REWRITE == (route_adj+1)->lookup_next_index), */ - /* "Adj1 is rewrite"); */ - - /* /\* */ - /* * CLEANUP */ - /* *\/ */ - /* adj_index_t drop_ai = adj_get_special(FIB_PROTOCOL_IP4, */ - /* ADJ_SPECIAL_TYPE_DROP); */ - - /* /\* */ - /* * remove the route that the tunnel resovles via. expect */ - /* * it to now resolve via the default route, which is drop */ - /* *\/ */ - /* fib_table_entry_path_remove(fib_index, &route_pfx, */ - /* FIB_SOURCE_API, */ - /* &nh_10_10_10_2, */ - /* tm->hw[0]->sw_if_index, */ - /* ~0, */ - /* 1, */ - /* FIB_ROUTE_PATH_FLAG_NONE); */ - /* fib_table_entry_path_remove(fib_index, &route_pfx, */ - /* FIB_SOURCE_API, */ - /* &nh_10_10_11_2, */ - /* tm->hw[1]->sw_if_index, */ - /* ~0, */ - /* 1, */ - /* FIB_ROUTE_PATH_FLAG_NONE); */ - /* FIB_TEST((FIB_NODE_INDEX_INVALID != */ - /* fib_table_lookup_exact_match(fib_index, &local_pfx)), */ - /* "route present"); */ - /* midchain_adj = adj_get(midchain_ai); */ - /* FIB_TEST((midchain_adj->sub_type.midchain.adj_index == drop_ai), */ - /* "tunnel midchain has re-stacked on drop"); */ - - /* /\* */ - /* * remove the tunnel and its MPLS encaps */ - /* *\/ */ - /* rv = vnet_mpls_gre_add_del_tunnel(&tun_src, */ - /* &tun_dst_pfx.fp_addr.ip4, */ - /* &tun_itf_pfx.fp_addr.ip4, */ - /* tun_itf_pfx.fp_len, */ - /* 0, // inner VRF */ - /* 0, // outer VRF */ - /* &tunnel_sw_if_index, */ - /* 0, // l2 only */ - /* 0); // DEL */ - /* FIB_TEST((0 == rv), "Tunnel removed"); */ - /* rv = vnet_mpls_gre_add_del_tunnel(&tun_src, */ - /* &tun_dst_pfx.fp_addr.ip4, */ - /* &tun_itf_pfx.fp_addr.ip4, */ - /* tun_itf_pfx.fp_len, */ - /* 0, // inner VRF */ - /* 0, // outer VRF */ - /* &tunnel_sw_if_index, */ - /* 0, // l2 only */ - /* 0); // DEL */ - /* FIB_TEST((0 != rv), "No existant Tunnel not removed"); */ - - /* rv = vnet_mpls_add_del_encap(&tun_dst_pfx.fp_addr.ip4, */ - /* 0, // inner VRF */ - /* encap_labels, */ - /* ~0, // policy_tunnel_index, */ - /* 0, // no_dst_hash, */ - /* NULL, */ - /* 0); // ADD */ - /* FIB_TEST((0 == rv), "MPLS encap deleted"); */ - - /* vec_free(encap_labels); */ - - /* /\* */ - /* * no more FIB entries expected */ - /* *\/ */ - /* fei = fib_table_lookup_exact_match(fib_index, &tun_itf_pfx); */ - /* FIB_TEST((FIB_NODE_INDEX_INVALID == fei), "tun itf route removed"); */ - /* fei = fib_table_lookup_exact_match(fib_index, &tun_dst_pfx); */ - /* FIB_TEST((FIB_NODE_INDEX_INVALID == fei), "tun dst route removed"); */ - - /* /\* */ - /* * CLEANUP the connecteds */ - /* *\/ */ - /* local2_pfx.fp_len = 24; */ - /* fib_table_entry_delete(fib_index, &local2_pfx, */ - /* FIB_SOURCE_INTERFACE); */ - /* fei = fib_table_lookup_exact_match(fib_index, &local2_pfx); */ - /* FIB_TEST((FIB_NODE_INDEX_INVALID == fei), */ - /* "attached interface route remove"); */ - - /* local2_pfx.fp_len = 32; */ - /* fib_table_entry_special_remove(fib_index, &local2_pfx, */ - /* FIB_SOURCE_INTERFACE); */ - /* fei = fib_table_lookup_exact_match(fib_index, &local2_pfx); */ - /* FIB_TEST((FIB_NODE_INDEX_INVALID == fei), */ - /* "local interface route removed"); */ - /* local_pfx.fp_len = 24; */ - /* fib_table_entry_delete(fib_index, &local_pfx, */ - /* FIB_SOURCE_INTERFACE); */ - /* fei = fib_table_lookup_exact_match(fib_index, &local_pfx); */ - /* FIB_TEST((FIB_NODE_INDEX_INVALID == fei), */ - /* "attached interface route remove"); */ - - /* local_pfx.fp_len = 32; */ - /* fib_table_entry_special_remove(fib_index, &local_pfx, */ - /* FIB_SOURCE_INTERFACE); */ - /* fei = fib_table_lookup_exact_match(fib_index, &local_pfx); */ - /* FIB_TEST((FIB_NODE_INDEX_INVALID == fei), */ - /* "local interface route removed"); */ -} - -/* * Test Attached Exports */ static void @@ -4931,7 +4580,7 @@ fib_test_ae (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &local_pfx); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), @@ -4947,7 +4596,7 @@ fib_test_ae (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &local_pfx); @@ -4976,7 +4625,7 @@ fib_test_ae (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_10_10_10_1_s_32); @@ -5003,7 +4652,7 @@ fib_test_ae (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(import_fib_index1, &local_pfx); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "attached export created"); @@ -5045,7 +4694,7 @@ fib_test_ae (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &pfx_10_10_10_2_s_32); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "ADJ-fib2 present"); @@ -5076,7 +4725,7 @@ fib_test_ae (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(import_fib_index1, &local_pfx); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "attached export created"); @@ -5113,7 +4762,7 @@ fib_test_ae (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &pfx_10_10_10_3_s_32); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "ADJ-fib3 present"); @@ -5185,7 +4834,7 @@ fib_test_ae (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(import_fib_index1, &pfx_10_10_10_1_s_32); FIB_TEST((FIB_NODE_INDEX_INVALID == fei), "ADJ-fib1 removed from FIB1"); @@ -5208,7 +4857,7 @@ fib_test_ae (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(import_fib_index1, &pfx_10_10_10_1_s_32); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), "ADJ-fib1 imported in FIB1"); @@ -5240,7 +4889,7 @@ fib_test_ae (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); dpo = fib_entry_contribute_ip_forwarding(fei); @@ -5296,7 +4945,7 @@ fib_test_ae (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); dpo = fib_entry_contribute_ip_forwarding(fei); @@ -5332,7 +4981,7 @@ fib_test_ae (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &pfx_10_10_10_1_s_32); @@ -5371,7 +5020,7 @@ fib_test_ae (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &pfx_10_10_10_1_s_32); @@ -5430,6 +5079,7 @@ fib_test_ae (void) adj_nbr_db_size()); } + /* * Test the recursive route route handling for GRE tunnels */ @@ -5440,7 +5090,7 @@ fib_test_label (void) const u32 fib_index = 0; test_main_t *tm; ip4_main_t *im; - int lb_count; + int lb_count, ii; lb_count = pool_elts(load_balance_pool); tm = &test_main; @@ -5476,7 +5126,7 @@ fib_test_label (void) tm->hw[0]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &local0_pfx); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), @@ -5492,7 +5142,7 @@ fib_test_label (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &local0_pfx); @@ -5522,7 +5172,7 @@ fib_test_label (void) tm->hw[1]->sw_if_index, ~0, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &local1_pfx); FIB_TEST((FIB_NODE_INDEX_INVALID != fei), @@ -5538,7 +5188,7 @@ fib_test_label (void) tm->hw[1]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup_exact_match(fib_index, &local1_pfx); @@ -5608,6 +5258,9 @@ fib_test_label (void) .eos = MPLS_NON_EOS, }, }; + mpls_label_t *l99 = NULL; + vec_add1(l99, 99); + fib_table_entry_update_one_path(fib_index, &pfx_1_1_1_1_s_32, FIB_SOURCE_API, @@ -5617,7 +5270,7 @@ fib_test_label (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - 99, + l99, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_1_1_1_1_s_32); @@ -5644,6 +5297,8 @@ fib_test_label (void) .adj = ai_mpls_10_10_11_1, }, }; + mpls_label_t *l_imp_null = NULL; + vec_add1(l_imp_null, MPLS_IETF_IMPLICIT_NULL_LABEL); fei = fib_table_entry_path_add(fib_index, &pfx_1_1_1_1_s_32, @@ -5654,7 +5309,7 @@ fib_test_label (void) tm->hw[1]->sw_if_index, ~0, // invalid fib index 1, - MPLS_IETF_IMPLICIT_NULL_LABEL, + l_imp_null, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST(fib_test_validate_entry(fei, @@ -5732,7 +5387,7 @@ fib_test_label (void) tm->hw[1]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST(fib_test_validate_entry(fei, @@ -5800,6 +5455,8 @@ fib_test_label (void) .eos = MPLS_EOS, }, }; + mpls_label_t *l1600 = NULL; + vec_add1(l1600, 1600); fib_table_entry_update_one_path(fib_index, &pfx_2_2_2_2_s_32, @@ -5810,7 +5467,7 @@ fib_test_label (void) ~0, fib_index, 1, - 1600, + l1600, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_2_2_2_2_s_32); @@ -6063,6 +5720,9 @@ fib_test_label (void) /* * add back the path with the valid label */ + l99 = NULL; + vec_add1(l99, 99); + fib_table_entry_path_add(fib_index, &pfx_1_1_1_1_s_32, FIB_SOURCE_API, @@ -6072,7 +5732,7 @@ fib_test_label (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - 99, + l99, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_1_1_1_1_s_32); @@ -6191,6 +5851,8 @@ fib_test_label (void) .eos = MPLS_EOS, }, }; + mpls_label_t *l101 = NULL; + vec_add1(l101, 101); fei = fib_table_entry_update_one_path(fib_index, &pfx_1_1_1_2_s_32, @@ -6201,7 +5863,7 @@ fib_test_label (void) tm->hw[0]->sw_if_index, ~0, // invalid fib index 1, - 101, + l101, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST(fib_test_validate_entry(fei, @@ -6229,6 +5891,9 @@ fib_test_label (void) .eos = MPLS_EOS, }, }; + mpls_label_t *l1601 = NULL; + vec_add1(l1601, 1601); + l1600_eos_o_1_1_1_1.label_o_lb.lb = non_eos_1_1_1_1.dpoi_index; fei = fib_table_entry_path_add(fib_index, @@ -6240,7 +5905,7 @@ fib_test_label (void) ~0, fib_index, 1, - 1601, + l1601, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST(fib_test_validate_entry(fei, @@ -6256,6 +5921,9 @@ fib_test_label (void) * update the via-entry so it no longer has an imp-null path. * the LB for the recursive can use an imp-null */ + l_imp_null = NULL; + vec_add1(l_imp_null, MPLS_IETF_IMPLICIT_NULL_LABEL); + fei = fib_table_entry_update_one_path(fib_index, &pfx_1_1_1_2_s_32, FIB_SOURCE_API, @@ -6265,7 +5933,7 @@ fib_test_label (void) tm->hw[1]->sw_if_index, ~0, // invalid fib index 1, - MPLS_IETF_IMPLICIT_NULL_LABEL, + l_imp_null, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST(fib_test_validate_entry(fei, @@ -6298,7 +5966,7 @@ fib_test_label (void) tm->hw[1]->sw_if_index, ~0, // invalid fib index 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST(fib_test_validate_entry(fei, @@ -6340,7 +6008,7 @@ fib_test_label (void) ~0, fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fib_entry_contribute_forwarding(fib_table_lookup(fib_index, @@ -6384,7 +6052,7 @@ fib_test_label (void) ~0, fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); fei = fib_table_lookup(fib_index, &pfx_2_2_2_4_s_32); @@ -6398,6 +6066,54 @@ fib_test_label (void) dpo_reset(&ip_1_1_1_1); /* + * Create an entry with a deep label stack + */ + fib_prefix_t pfx_2_2_5_5_s_32 = { + .fp_len = 32, + .fp_proto = FIB_PROTOCOL_IP4, + .fp_addr = { + .ip4.as_u32 = clib_host_to_net_u32(0x02020505), + }, + }; + fib_test_lb_bucket_t ls_eos_o_10_10_10_1 = { + .type = FT_LB_LABEL_STACK_O_ADJ, + .label_stack_o_adj = { + .adj = ai_mpls_10_10_11_1, + .label_stack_size = 8, + .label_stack = { + 200, 201, 202, 203, 204, 205, 206, 207 + }, + .eos = MPLS_EOS, + }, + }; + mpls_label_t *label_stack = NULL; + vec_validate(label_stack, 7); + for (ii = 0; ii < 8; ii++) + { + label_stack[ii] = ii + 200; + } + + fei = fib_table_entry_update_one_path(fib_index, + &pfx_2_2_5_5_s_32, + FIB_SOURCE_API, + FIB_ENTRY_FLAG_NONE, + FIB_PROTOCOL_IP4, + &nh_10_10_11_1, + tm->hw[1]->sw_if_index, + ~0, // invalid fib index + 1, + label_stack, + FIB_ROUTE_PATH_FLAG_NONE); + + FIB_TEST(fib_test_validate_entry(fei, + FIB_FORW_CHAIN_TYPE_UNICAST_IP4, + 1, + &ls_eos_o_10_10_10_1), + "2.2.5.5/32 LB 1 buckets via: " + "adj 10.10.11.1"); + fib_table_entry_delete_index(fei, FIB_SOURCE_API); + + /* * cleanup */ fib_table_entry_delete(fib_index, @@ -6950,6 +6666,7 @@ lfib_test_deagg (void) lookup_dpo_t *lkd; test_main_t *tm; int lb_count; + adj_index_t ai_mpls_10_10_10_1; tm = &test_main; lb_count = pool_elts(load_balance_pool); @@ -6964,6 +6681,14 @@ lfib_test_deagg (void) tm->hw[0]->sw_if_index, 1); + ip46_address_t nh_10_10_10_1 = { + .ip4.as_u32 = clib_host_to_net_u32(0x0a0a0a01), + }; + ai_mpls_10_10_10_1 = adj_nbr_add_or_lock(FIB_PROTOCOL_IP4, + VNET_LINK_MPLS, + &nh_10_10_10_1, + tm->hw[0]->sw_if_index); + /* * Test the specials stack properly. */ @@ -7023,7 +6748,7 @@ lfib_test_deagg (void) ~0, fib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST((lfe == fib_table_lookup(lfib_index, &pfx)), @@ -7074,7 +6799,7 @@ lfib_test_deagg (void) ~0, lfib_index, 1, - MPLS_LABEL_INVALID, + NULL, FIB_ROUTE_PATH_FLAG_NONE); FIB_TEST((lfe == fib_table_lookup(lfib_index, &pfx)), @@ -7113,30 +6838,192 @@ lfib_test_deagg (void) format_mpls_unicast_label, deag_label, format_mpls_eos_bit, MPLS_EOS); + dpo_reset(&dpo); - mpls_sw_interface_enable_disable(&mpls_main, - tm->hw[0]->sw_if_index, - 0); + /* + * An MPLS x-connect + */ + fib_prefix_t pfx_1200 = { + .fp_len = 21, + .fp_proto = FIB_PROTOCOL_MPLS, + .fp_label = 1200, + .fp_eos = MPLS_NON_EOS, + }; + fib_test_lb_bucket_t neos_o_10_10_10_1 = { + .type = FT_LB_LABEL_STACK_O_ADJ, + .label_stack_o_adj = { + .adj = ai_mpls_10_10_10_1, + .label_stack_size = 4, + .label_stack = { + 200, 300, 400, 500, + }, + .eos = MPLS_NON_EOS, + }, + }; + dpo_id_t neos_1200 = DPO_INVALID; + dpo_id_t ip_1200 = DPO_INVALID; + mpls_label_t *l200 = NULL; + vec_add1(l200, 200); + vec_add1(l200, 300); + vec_add1(l200, 400); + vec_add1(l200, 500); + + lfe = fib_table_entry_update_one_path(fib_index, + &pfx_1200, + FIB_SOURCE_API, + FIB_ENTRY_FLAG_NONE, + FIB_PROTOCOL_IP4, + &nh_10_10_10_1, + tm->hw[0]->sw_if_index, + ~0, // invalid fib index + 1, + l200, + FIB_ROUTE_PATH_FLAG_NONE); + + FIB_TEST(fib_test_validate_entry(lfe, + FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS, + 1, + &neos_o_10_10_10_1), + "1200/0 LB 1 buckets via: " + "adj 10.10.11.1"); - dpo_reset(&dpo); /* - * +1 for the drop LB in the MPLS tables. + * A recursive route via the MPLS x-connect */ - FIB_TEST(lb_count+1 == pool_elts(load_balance_pool), - "Load-balance resources freed %d of %d", - lb_count+1, pool_elts(load_balance_pool)); -} + fib_prefix_t pfx_2_2_2_3_s_32 = { + .fp_len = 32, + .fp_proto = FIB_PROTOCOL_IP4, + .fp_addr = { + .ip4.as_u32 = clib_host_to_net_u32(0x02020203), + }, + }; + fib_route_path_t *rpaths = NULL, rpath = { + .frp_proto = FIB_PROTOCOL_MPLS, + .frp_local_label = 1200, + .frp_sw_if_index = ~0, // recurive + .frp_fib_index = 0, // Default MPLS fib + .frp_weight = 1, + .frp_flags = FIB_ROUTE_PATH_FLAG_NONE, + .frp_label_stack = NULL, + }; + vec_add1(rpaths, rpath); -static clib_error_t * -lfib_test (vlib_main_t * vm, - unformat_input_t * input, - vlib_cli_command_t * cmd_arg) -{ - fib_test_mk_intf(4); + fib_table_entry_path_add2(fib_index, + &pfx_2_2_2_3_s_32, + FIB_SOURCE_API, + FIB_ENTRY_FLAG_NONE, + rpaths); - lfib_test_deagg(); + /* + * A labelled recursive route via the MPLS x-connect + */ + fib_prefix_t pfx_2_2_2_4_s_32 = { + .fp_len = 32, + .fp_proto = FIB_PROTOCOL_IP4, + .fp_addr = { + .ip4.as_u32 = clib_host_to_net_u32(0x02020204), + }, + }; + mpls_label_t *l999 = NULL; + vec_add1(l999, 999); + rpaths[0].frp_label_stack = l999, + + fib_table_entry_path_add2(fib_index, + &pfx_2_2_2_4_s_32, + FIB_SOURCE_API, + FIB_ENTRY_FLAG_NONE, + rpaths); + + fib_entry_contribute_forwarding(fib_table_lookup(fib_index, &pfx_1200), + FIB_FORW_CHAIN_TYPE_UNICAST_IP4, + &ip_1200); + fib_entry_contribute_forwarding(fib_table_lookup(fib_index, &pfx_1200), + FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS, + &neos_1200); + + fib_test_lb_bucket_t ip_o_1200 = { + .type = FT_LB_O_LB, + .lb = { + .lb = ip_1200.dpoi_index, + }, + }; + fib_test_lb_bucket_t mpls_o_1200 = { + .type = FT_LB_LABEL_O_LB, + .label_o_lb = { + .lb = neos_1200.dpoi_index, + .label = 999, + .eos = MPLS_EOS, + }, + }; - return (NULL); + lfe = fib_table_lookup(fib_index, &pfx_2_2_2_3_s_32); + FIB_TEST(fib_test_validate_entry(lfe, + FIB_FORW_CHAIN_TYPE_UNICAST_IP4, + 1, + &ip_o_1200), + "2.2.2.2.3/32 LB 1 buckets via: label 1200 EOS"); + lfe = fib_table_lookup(fib_index, &pfx_2_2_2_4_s_32); + FIB_TEST(fib_test_validate_entry(lfe, + FIB_FORW_CHAIN_TYPE_UNICAST_IP4, + 1, + &mpls_o_1200), + "2.2.2.2.4/32 LB 1 buckets via: label 1200 non-EOS"); + + fib_table_entry_delete(fib_index, &pfx_1200, FIB_SOURCE_API); + fib_table_entry_delete(fib_index, &pfx_2_2_2_3_s_32, FIB_SOURCE_API); + fib_table_entry_delete(fib_index, &pfx_2_2_2_4_s_32, FIB_SOURCE_API); + + dpo_reset(&neos_1200); + dpo_reset(&ip_1200); + + /* + * A recursive via a label that does not exist + */ + fib_test_lb_bucket_t bucket_drop = { + .type = FT_LB_SPECIAL, + .special = { + .adj = DPO_PROTO_MPLS, + }, + }; + + rpaths[0].frp_label_stack = NULL; + lfe = fib_table_entry_path_add2(fib_index, + &pfx_2_2_2_4_s_32, + FIB_SOURCE_API, + FIB_ENTRY_FLAG_NONE, + rpaths); + + fib_entry_contribute_forwarding(fib_table_lookup(fib_index, &pfx_1200), + FIB_FORW_CHAIN_TYPE_UNICAST_IP4, + &ip_1200); + ip_o_1200.lb.lb = ip_1200.dpoi_index; + + FIB_TEST(fib_test_validate_entry(lfe, + FIB_FORW_CHAIN_TYPE_UNICAST_IP4, + 1, + &ip_o_1200), + "2.2.2.2.4/32 LB 1 buckets via: label 1200 EOS"); + lfe = fib_table_lookup(fib_index, &pfx_1200); + FIB_TEST(fib_test_validate_entry(lfe, + FIB_FORW_CHAIN_TYPE_UNICAST_IP4, + 1, + &bucket_drop), + "2.2.2.4/32 LB 1 buckets via: ip4-DROP"); + + fib_table_entry_delete(fib_index, &pfx_2_2_2_4_s_32, FIB_SOURCE_API); + + dpo_reset(&ip_1200); + + /* + * cleanup + */ + mpls_sw_interface_enable_disable(&mpls_main, + tm->hw[0]->sw_if_index, + 0); + + FIB_TEST(lb_count == pool_elts(load_balance_pool), + "Load-balance resources freed %d of %d", + lb_count, pool_elts(load_balance_pool)); } static clib_error_t * @@ -7151,10 +7038,6 @@ fib_test (vlib_main_t * vm, fib_test_v4(); fib_test_v6(); } - else if (unformat (input, "gre")) - { - fib_test_gre(); - } else if (unformat (input, "label")) { fib_test_label(); @@ -7163,6 +7046,10 @@ fib_test (vlib_main_t * vm, { fib_test_ae(); } + else if (unformat (input, "lfib")) + { + lfib_test_deagg(); + } else if (unformat (input, "walk")) { fib_test_walk(); @@ -7177,9 +7064,9 @@ fib_test (vlib_main_t * vm, */ fib_test_v4(); fib_test_v6(); - fib_test_gre(); fib_test_ae(); fib_test_label(); + lfib_test_deagg(); } return (NULL); @@ -7191,12 +7078,6 @@ VLIB_CLI_COMMAND (test_fib_command, static) = { .function = fib_test, }; -VLIB_CLI_COMMAND (test_lfib_command, static) = { - .path = "test lfib", - .short_help = "mpls label fib unit tests - DO NOT RUN ON A LIVE SYSTEM", - .function = lfib_test, -}; - clib_error_t * fib_test_init (vlib_main_t *vm) { |