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:
{
* 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
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:
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");
/*
* 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
*/
"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");
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");
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());
"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());
/*
* 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,
/*
* 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,
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),
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),
"%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,
* 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,