Deprecate MPLSoGRE tunnels (VPP-502)
[vpp.git] / vnet / vnet / fib / fib_test.c
index 3dc9c1d..bdd6e95 100644 (file)
@@ -217,9 +217,24 @@ fib_test_urpf_is_equal (fib_node_index_t fei,
 
     dpo_reset(&dpo);
 
+    va_end(ap);
+
     return (1);
 }
 
+static u8*
+fib_test_build_rewrite (u8 *eth_addr)
+{
+    u8* rewrite = NULL;
+
+    vec_validate(rewrite, 13);
+
+    memcpy(rewrite, eth_addr, 6);
+    memcpy(rewrite+6, eth_addr, 6);
+
+    return (rewrite);
+}
+
 static void
 fib_test_v4 (void)
 {
@@ -521,6 +536,7 @@ fib_test_v4 (void)
     u8 eth_addr[] = {
        0xde, 0xde, 0xde, 0xba, 0xba, 0xba,
     };
+
     ip46_address_t nh_12_12_12_12 = {
        .ip4.as_u32 = clib_host_to_net_u32(0x0c0c0c0c),
     };
@@ -559,7 +575,8 @@ fib_test_v4 (void)
                                    &adj->sub_type.nbr.next_hop)),
              "adj nbr next-hop ok");
 
-    adj_nbr_update_rewrite(ai_01, eth_addr);
+    adj_nbr_update_rewrite(ai_01, ADJ_NBR_REWRITE_FLAG_COMPLETE,
+                          fib_test_build_rewrite(eth_addr));
     FIB_TEST((IP_LOOKUP_NEXT_REWRITE == adj->lookup_next_index),
             "adj is complete");
     FIB_TEST((0 == ip46_address_cmp(&pfx_10_10_10_1_s_32.fp_addr,
@@ -587,7 +604,8 @@ fib_test_v4 (void)
     FIB_TEST((0 == ip46_address_cmp(&nh_12_12_12_12,
                                    &adj->sub_type.nbr.next_hop)),
              "adj nbr next-hop ok");
-    adj_nbr_update_rewrite(ai_12_12_12_12, eth_addr);
+    adj_nbr_update_rewrite(ai_12_12_12_12, ADJ_NBR_REWRITE_FLAG_COMPLETE,
+                          fib_test_build_rewrite(eth_addr));
     FIB_TEST((IP_LOOKUP_NEXT_REWRITE == adj->lookup_next_index),
             "adj is complete");
 
@@ -634,7 +652,8 @@ fib_test_v4 (void)
                                    &adj->sub_type.nbr.next_hop)),
              "adj nbr next-hop ok");
 
-    adj_nbr_update_rewrite(ai_02, eth_addr);
+    adj_nbr_update_rewrite(ai_02, ADJ_NBR_REWRITE_FLAG_COMPLETE,
+                          fib_test_build_rewrite(eth_addr));
     FIB_TEST((IP_LOOKUP_NEXT_REWRITE == adj->lookup_next_index),
             "adj is complete");
     FIB_TEST((0 == ip46_address_cmp(&pfx_10_10_10_2_s_32.fp_addr,
@@ -3111,7 +3130,8 @@ fib_test_v6 (void)
                                    &adj->sub_type.nbr.next_hop)),
              "adj nbr next-hop ok");
 
-    adj_nbr_update_rewrite(ai_01, eth_addr);
+    adj_nbr_update_rewrite(ai_01, ADJ_NBR_REWRITE_FLAG_COMPLETE,
+                          fib_test_build_rewrite(eth_addr));
     FIB_TEST((IP_LOOKUP_NEXT_REWRITE == adj->lookup_next_index),
             "adj is complete");
     FIB_TEST((0 == ip46_address_cmp(&pfx_2001_1_2_s_128.fp_addr,
@@ -3148,7 +3168,8 @@ fib_test_v6 (void)
                                    &adj->sub_type.nbr.next_hop)),
              "adj nbr next-hop ok");
 
-    adj_nbr_update_rewrite(ai_02, eth_addr);
+    adj_nbr_update_rewrite(ai_02, ADJ_NBR_REWRITE_FLAG_COMPLETE,
+                          fib_test_build_rewrite(eth_addr));
     FIB_TEST((IP_LOOKUP_NEXT_REWRITE == adj->lookup_next_index),
             "adj is complete");
     FIB_TEST((0 == ip46_address_cmp(&pfx_2001_1_3_s_128.fp_addr,
@@ -4802,11 +4823,16 @@ fib_test_validate_entry (fib_node_index_t fei,
 {
     const load_balance_t *lb;
     dpo_id_t dpo = DPO_NULL;
+    fib_prefix_t pfx;
+    index_t fw_lbi;
+    u32 fib_index;
     va_list ap;
     int res;
 
     va_start(ap, n_buckets);
 
+    fib_entry_get_prefix(fei, &pfx);
+    fib_index = fib_entry_get_fib_index(fei);
     fib_entry_contribute_forwarding(fei, fct, &dpo);
 
     FIB_TEST_LB((DPO_LOAD_BALANCE == dpo.dpoi_type),
@@ -4816,6 +4842,39 @@ fib_test_validate_entry (fib_node_index_t fei,
 
     res = fib_test_validate_lb_v(lb, n_buckets, ap);
 
+    /*
+     * ensure that the LB contributed by the entry is the
+     * same as the LB in the forwarding tables
+     */
+    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);
+
     dpo_reset(&dpo);
 
     va_end(ap);
@@ -5499,11 +5558,58 @@ fib_test_label (void)
             "label 99 over 10.10.10.1");
 
     /*
-     * remove the local label
+     * change the local label
+     */
+    fib_table_entry_local_label_add(fib_index,
+                                   &pfx_1_1_1_1_s_32,
+                                   25005);
+
+    fib_prefix_t pfx_25005_eos = {
+       .fp_proto = FIB_PROTOCOL_MPLS,
+       .fp_label = 25005,
+       .fp_eos = MPLS_EOS,
+    };
+    fib_prefix_t pfx_25005_neos = {
+       .fp_proto = FIB_PROTOCOL_MPLS,
+       .fp_label = 25005,
+       .fp_eos = MPLS_NON_EOS,
+    };
+
+    FIB_TEST((FIB_NODE_INDEX_INVALID ==
+             fib_table_lookup(fib_index, &pfx_24001_eos)),
+            "24001/eos removed after label change");
+    FIB_TEST((FIB_NODE_INDEX_INVALID ==
+             fib_table_lookup(fib_index, &pfx_24001_neos)),
+            "24001/eos removed after label change");
+
+    fei = fib_table_lookup(MPLS_FIB_DEFAULT_TABLE_ID,
+                          &pfx_25005_eos);
+    FIB_TEST(fib_test_validate_entry(fei,
+                                    FIB_FORW_CHAIN_TYPE_MPLS_EOS,
+                                    2,
+                                    &l99_eos_o_10_10_10_1,
+                                    &adj_o_10_10_11_2),
+            "25005/eos LB 2 buckets via: "
+            "label 99 over 10.10.10.1, "
+            "adj over 10.10.11.2");
+
+    fei = fib_table_lookup(MPLS_FIB_DEFAULT_TABLE_ID,
+                          &pfx_25005_neos);
+    FIB_TEST(fib_test_validate_entry(fei,
+                                    FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS,
+                                    1,
+                                    &l99_neos_o_10_10_10_1),
+            "25005/neos LB 1 buckets via: "
+            "label 99 over 10.10.10.1");
+
+    /*
+     * remove the local label.
+     * the check that the MPLS entries are gone is done by the fact the
+     * MPLS table is no longer present.
      */
     fib_table_entry_local_label_remove(fib_index,
                                       &pfx_1_1_1_1_s_32,
-                                      24001);
+                                      25005);
 
     fei = fib_table_lookup(fib_index, &pfx_1_1_1_1_s_32);
     FIB_TEST(fib_test_validate_entry(fei,