u32 *svs_itf_db[FIB_PROTOCOL_IP_MAX];
+static fib_source_t svs_fib_src;
+
int
svs_table_add (fib_protocol_t fproto, u32 table_id)
{
- fib_table_find_or_create_and_lock (fproto, table_id, FIB_SOURCE_PLUGIN_LOW);
+ fib_table_find_or_create_and_lock (fproto, table_id, svs_fib_src);
return (0);
}
if (~0 == fib_index)
return VNET_API_ERROR_NO_SUCH_FIB;
- fib_table_unlock (fib_index, fproto, FIB_SOURCE_PLUGIN_LOW);
+ fib_table_unlock (fib_index, fproto, svs_fib_src);
return (0);
}
LOOKUP_TABLE_FROM_CONFIG, &dpo);
fib_table_entry_special_dpo_add (fib_index, pfx,
- FIB_SOURCE_PLUGIN_LOW,
+ svs_fib_src,
FIB_ENTRY_FLAG_EXCLUSIVE, &dpo);
dpo_unlock (&dpo);
if (~0 == fib_index)
return VNET_API_ERROR_NO_SUCH_FIB;
- fib_table_entry_special_remove (fib_index, pfx, FIB_SOURCE_PLUGIN_LOW);
+ fib_table_entry_special_remove (fib_index, pfx, svs_fib_src);
return (0);
}
int
svs_disable (fib_protocol_t fproto, u32 table_id, u32 sw_if_index)
{
+ fib_prefix_t pfx = {
+ .fp_proto = fproto,
+ };
u32 fib_index;
fib_index = fib_table_find (fproto, table_id);
"svs-ip4" :
"svs-ip6"), sw_if_index, 0, NULL, 0);
+ fib_table_entry_special_remove (fib_index, &pfx, svs_fib_src);
+
return (0);
}
ip6_header_t *ip0;
ip0 = vlib_buffer_get_current (b0);
- lbi0 = ip6_fib_table_fwding_lookup (&ip6_main,
- svs_itf_db[fproto]
+ lbi0 = ip6_fib_table_fwding_lookup (svs_itf_db[fproto]
[sw_if_index0],
&ip0->src_address);
}
return s;
}
-/* *INDENT-OFF* */
VLIB_REGISTER_NODE (svs_ip4_node) =
{
.function = svs_input_ip4,
.arc_name = "ip6-unicast",
.node_name = "svs-ip6",
};
-/* *INDENT-ON* */
static clib_error_t *
svs_table_cli (vlib_main_t * vm,
return (NULL);
}
-/* *INDENT-OFF* */
VLIB_CLI_COMMAND (svs_table_cmd_cli, static) = {
.path = "svs table",
.short_help = "Source VRF select table [add|delete] [ip4|ip6] table-id X",
.function = svs_table_cli,
};
-/* *INDENT-ON* */
static clib_error_t *
svs_enable_cli (vlib_main_t * vm,
return (NULL);
}
-/* *INDENT-OFF* */
VLIB_CLI_COMMAND (svs_enable_cli_cmd, static) = {
.path = "svs enable",
.short_help = "Source VRF select [enable|disable] [ip4|ip6] <table-id> X <interface>",
.function = svs_enable_cli,
};
-/* *INDENT-ON* */
static clib_error_t *
svs_route_cli (vlib_main_t * vm,
return (NULL);
}
-/* *INDENT-OFF* */
VLIB_CLI_COMMAND (svs_route_cmd_cli, static) = {
.path = "svs route",
.short_help = "Source VRF select route [add|delete] <table-id> <prefix> <src-table-id>",
.function = svs_route_cli,
};
-/* *INDENT-ON* */
static clib_error_t *
svs_show_cli (vlib_main_t * vm,
return (NULL);
}
-/* *INDENT-OFF* */
VLIB_CLI_COMMAND (svs_show_cli_cmd, static) = {
.path = "show svs",
.short_help = "Source VRF select show",
.function = svs_show_cli,
};
-/* *INDENT-ON* */
static clib_error_t *
svs_init (vlib_main_t * vm)
};
vec_add1 (ip4_main.table_bind_callbacks, cbt4);
+ svs_fib_src = fib_source_allocate ("svs",
+ FIB_SOURCE_PRIORITY_LOW,
+ FIB_SOURCE_BH_SIMPLE);
+
return (NULL);
}