void
ip_lookup_init (ip_lookup_main_t * lm, u32 is_ip6)
{
- /* Preallocate three "special" adjacencies */
- lm->adjacency_heap = adj_pool;
-
if (!lm->fib_result_n_bytes)
lm->fib_result_n_bytes = sizeof (uword);
0, 0},
};
-u32
-fib_table_id_find_fib_index (fib_protocol_t proto, u32 table_id)
-{
- ip4_main_t *im4 = &ip4_main;
- ip6_main_t *im6 = &ip6_main;
- uword *p;
-
- switch (proto)
- {
- case FIB_PROTOCOL_IP4:
- p = hash_get (im4->fib_index_by_table_id, table_id);
- break;
- case FIB_PROTOCOL_IP6:
- p = hash_get (im6->fib_index_by_table_id, table_id);
- break;
- default:
- p = NULL;
- break;
- }
- if (NULL != p)
- {
- return (p[0]);
- }
- return (~0);
-}
-
clib_error_t *
vnet_ip_route_cmd (vlib_main_t * vm,
unformat_input_t * main_input, vlib_cli_command_t * cmd)
fib_prefix_t *prefixs = NULL, pfx;
mpls_label_t out_label, via_label;
clib_error_t *error = NULL;
+ u32 weight, preference;
u32 table_id, is_del;
vnet_main_t *vnm;
u32 fib_index;
pfx.fp_proto = FIB_PROTOCOL_IP6;
vec_add1 (prefixs, pfx);
}
- else if (unformat (line_input, "via %U %U weight %u",
- unformat_ip4_address,
- &rpath.frp_addr.ip4,
- unformat_vnet_sw_interface, vnm,
- &rpath.frp_sw_if_index, &rpath.frp_weight))
- {
- rpath.frp_proto = FIB_PROTOCOL_IP4;
- vec_add1 (rpaths, rpath);
- }
-
- else if (unformat (line_input, "via %U %U weight %u",
- unformat_ip6_address,
- &rpath.frp_addr.ip6,
- unformat_vnet_sw_interface, vnm,
- &rpath.frp_sw_if_index, &rpath.frp_weight))
- {
- rpath.frp_proto = FIB_PROTOCOL_IP6;
- vec_add1 (rpaths, rpath);
- }
-
else if (unformat (line_input, "via %U %U",
unformat_ip4_address,
&rpath.frp_addr.ip4,
rpath.frp_proto = FIB_PROTOCOL_IP6;
vec_add1 (rpaths, rpath);
}
+ else if (unformat (line_input, "weight %u", &weight))
+ {
+ ASSERT (vec_len (rpaths));
+ rpaths[vec_len (rpaths) - 1].frp_weight = weight;
+ }
+ else if (unformat (line_input, "preference %u", &preference))
+ {
+ ASSERT (vec_len (rpaths));
+ rpaths[vec_len (rpaths) - 1].frp_preference = preference;
+ }
else if (unformat (line_input, "via %U next-hop-table %d",
unformat_ip4_address,
&rpath.frp_addr.ip4, &rpath.frp_fib_index))
}
else
{
- fib_index = fib_table_id_find_fib_index (prefixs[0].fp_proto, table_id);
+ fib_index = fib_table_find (prefixs[0].fp_proto, table_id);
if (~0 == fib_index)
{
/*
* the CLI parsing stored table Ids, swap to FIB indicies
*/
- fi = fib_table_id_find_fib_index (prefixs[i].fp_proto,
- rpaths[i].frp_fib_index);
+ fi = fib_table_find (prefixs[i].fp_proto,
+ rpaths[i].frp_fib_index);
if (~0 == fi)
{
unformat_ip4_address,
&pfx.fp_grp_addr.ip4, &pfx.fp_len))
{
+ memset (&pfx.fp_src_addr.ip4, 0, sizeof (pfx.fp_src_addr.ip4));
pfx.fp_proto = FIB_PROTOCOL_IP4;
}
else if (unformat (line_input, "%U/%d",
unformat_ip6_address,
&pfx.fp_grp_addr.ip6, &pfx.fp_len))
{
+ memset (&pfx.fp_src_addr.ip6, 0, sizeof (pfx.fp_src_addr.ip6));
pfx.fp_proto = FIB_PROTOCOL_IP6;
}
else if (unformat (line_input, "%U",
&rpath.frp_sw_if_index))
{
rpath.frp_weight = 1;
- rpath.frp_proto = FIB_PROTOCOL_IP4;
+ }
+ else if (unformat (line_input, "via local"))
+ {
+ rpath.frp_sw_if_index = ~0;
+ rpath.frp_weight = 1;
+ rpath.frp_flags |= FIB_ROUTE_PATH_LOCAL;
}
else if (unformat (line_input, "%U", unformat_mfib_itf_flags, &iflags))
;