fib: Decouple source from priority and behaviour
[vpp.git] / src / plugins / unittest / fib_test.c
index e26cc67..2d75f28 100644 (file)
@@ -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:
                 {
@@ -4194,6 +4194,81 @@ fib_test_v4 (void)
                                 FIB_ROUTE_PATH_DVR);
     dpo_reset(&dvr_dpo);
 
+    /*
+     * add the default route via a next-hop that will form a loop
+     */
+    fib_prefix_t pfx_conn = {
+        .fp_len = 24,
+        .fp_proto = FIB_PROTOCOL_IP4,
+        .fp_addr = {
+            /* 30.30.30.30 */
+            .ip4.as_u32 = clib_host_to_net_u32(0x1e1e1e1e),
+        },
+    };
+
+    dfrt = fib_table_entry_path_add(fib_index,
+                                    &pfx_0_0_0_0_s_0,
+                                    FIB_SOURCE_API,
+                                    FIB_ENTRY_FLAG_NONE,
+                                    DPO_PROTO_IP4,
+                                    &pfx_conn.fp_addr,
+                                    ~0,
+                                    fib_index,
+                                    1,
+                                    NULL,
+                                    FIB_ROUTE_PATH_FLAG_NONE);
+    /*
+     * the default route is a drop, since it's looped
+     */
+    FIB_TEST(load_balance_is_drop(fib_entry_contribute_ip_forwarding(dfrt)),
+             "Default route is DROP");
+
+    /*
+     * add a connected cover for the next-hop, this breaks the recursion loop
+     * for the default route
+     */
+    fib_table_entry_path_add(fib_index,
+                             &pfx_conn,
+                             FIB_SOURCE_API,
+                             (FIB_ENTRY_FLAG_CONNECTED |
+                              FIB_ENTRY_FLAG_ATTACHED),
+                             DPO_PROTO_IP4,
+                             NULL,
+                             tm->hw[0]->sw_if_index,
+                             ~0,
+                             1,
+                             NULL,
+                             FIB_ROUTE_PATH_FLAG_NONE);
+    pfx_conn.fp_len = 32;
+    fei = fib_table_lookup_exact_match(fib_index, &pfx_conn);
+
+    u32 ai_30 = adj_nbr_add_or_lock(FIB_PROTOCOL_IP4,
+                                    VNET_LINK_IP4,
+                                    &pfx_conn.fp_addr,
+                                    tm->hw[0]->sw_if_index);
+
+    fib_test_lb_bucket_t ip_o_30_30_30_30 = {
+        .type = FT_LB_ADJ,
+        .adj = {
+            .adj = ai_30,
+        },
+    };
+    FIB_TEST(!fib_test_validate_entry(fei,
+                                      FIB_FORW_CHAIN_TYPE_UNICAST_IP4,
+                                      1,
+                                      &ip_o_30_30_30_30),
+             "30.30.30.30 via adj");
+    FIB_TEST_REC_FORW(&pfx_0_0_0_0_s_0, &pfx_conn, 0);
+
+    pfx_conn.fp_len = 24;
+    fib_table_entry_delete(fib_index,
+                           &pfx_conn,
+                           FIB_SOURCE_API);
+    fib_table_entry_delete(fib_index,
+                           &pfx_0_0_0_0_s_0,
+                           FIB_SOURCE_API);
+    adj_unlock(ai_30);
+
     /*
      * CLEANUP
      *    remove adj-fibs:
@@ -4358,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");
@@ -4426,7 +4500,6 @@ fib_test_v6 (void)
              "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");
@@ -4459,7 +4532,6 @@ 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");
@@ -4510,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());
@@ -4538,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());
@@ -5459,7 +5531,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,
@@ -5486,7 +5558,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,
@@ -7753,7 +7825,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),
@@ -7775,7 +7847,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),
@@ -9238,13 +9310,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,
@@ -9282,7 +9357,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,