fib: Source Address Selection
[vpp.git] / src / plugins / unittest / fib_test.c
index fada2f8..1a2ba4a 100644 (file)
@@ -93,7 +93,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 +115,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,
 };
 
@@ -455,7 +455,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 +714,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 +845,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 +898,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 +934,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 +4433,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 +4441,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 +4495,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 +4529,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
@@ -4585,7 +4582,7 @@ fib_test_v6 (void)
     adj_unlock(locked_ai);
 
     /*
-     * no more entires. +1 shared path-list
+     * no more entries. +1 shared path-list
      */
     FIB_TEST((1 == fib_path_list_db_size()),   "path list DB population:%d",
              fib_path_list_db_size());
@@ -4613,7 +4610,7 @@ fib_test_v6 (void)
              "Default route is DROP");
 
     /*
-     * no more entires. -1 shared path-list
+     * no more entries. -1 shared path-list
      */
     FIB_TEST((0 == fib_path_list_db_size()),   "path list DB population:%d",
              fib_path_list_db_size());
@@ -5260,6 +5257,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);
 }
@@ -5534,7 +5533,7 @@ fib_test_ae (void)
 
     /*
      * remove the attached route from the 2nd FIB. expect the imported
-     * entires to be removed
+     * entries to be removed
      */
     local_pfx.fp_len = 24;
     fib_table_entry_delete(import_fib_index2,
@@ -5561,7 +5560,7 @@ fib_test_ae (void)
 
     /*
      * modify the route in FIB1 so it is no longer attached. expect the imported
-     * entires to be removed
+     * entries to be removed
      */
     local_pfx.fp_len = 24;
     fib_table_entry_update_one_path(import_fib_index1,
@@ -6691,7 +6690,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),
@@ -7828,7 +7827,7 @@ fib_test_walk (void)
     FOR_EACH_TEST_CHILD(tc)
     {
         /*
-         * we don't really care how many times the children are visisted, as long as
+         * we don't really care how many times the children are visited, as long as
          * it is more than once.
          */
         FIB_TEST(1 <= vec_len(tc->ctxs),
@@ -7850,7 +7849,7 @@ fib_test_walk (void)
     FOR_EACH_TEST_CHILD(tc)
     {
         /*
-         * we don't really care how many times the children are visisted, as long as
+         * we don't really care how many times the children are visited, as long as
          * it is more than once.
          */
         FIB_TEST(1 <= vec_len(tc->ctxs),
@@ -9313,13 +9312,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 +9359,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,