u32 hi; /* head index */
pool_get (lm->if_address_pool, a);
- memset (a, ~0, sizeof (a[0]));
+ clib_memset (a, ~0, sizeof (a[0]));
ai = a - lm->if_address_pool;
hi = pi = lm->if_address_pool_index_by_sw_if_index[sw_if_index];
is_del = 0;
table_id = 0;
count = 1;
- memset (&pfx, 0, sizeof (pfx));
+ clib_memset (&pfx, 0, sizeof (pfx));
/* Get a line of input. */
if (!unformat_user (main_input, unformat_line_input, line_input))
while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
{
- memset (&rpath, 0, sizeof (rpath));
+ clib_memset (&rpath, 0, sizeof (rpath));
if (unformat (line_input, "table %d", &table_id))
;
{
for (j = 0; j < vec_len (rpaths); j++)
{
- u32 fi;
- /*
- * the CLI parsing stored table Ids, swap to FIB indicies
- */
- fi = fib_table_find (prefixs[i].fp_proto,
- rpaths[i].frp_fib_index);
-
- if (~0 == fi)
- {
- error =
- clib_error_return (0, "Via table %d does not exist",
- rpaths[i].frp_fib_index);
- goto done;
- }
- rpaths[i].frp_fib_index = fi;
-
fib_prefix_t rpfx = {
.fp_len = prefixs[i].fp_len,
.fp_proto = prefixs[i].fp_proto,
/*?
* Place the indicated interface into the supplied IPv4 FIB table (also known
- * as a VRF). If the FIB table does not exist, this command creates it. To
+ * as a VRF). The FIB table must be created using "ip table add" already. To
* display the current IPv4 FIB table, use the command '<em>show ip fib</em>'.
* FIB table will only be displayed if a route has been added to the table, or
* an IP Address is assigned to an interface in the table (which adds a route
/*?
* Place the indicated interface into the supplied IPv6 FIB table (also known
- * as a VRF). If the FIB table does not exist, this command creates it. To
+ * as a VRF). The FIB table must be created using "ip6 table add" already. To
* display the current IPv6 FIB table, use the command '<em>show ip6 fib</em>'.
* FIB table will only be displayed if a route has been added to the table, or
* an IP Address is assigned to an interface in the table (which adds a route
vnm = vnet_get_main ();
is_del = 0;
table_id = 0;
- memset (&pfx, 0, sizeof (pfx));
- memset (&rpath, 0, sizeof (rpath));
+ clib_memset (&pfx, 0, sizeof (pfx));
+ clib_memset (&rpath, 0, sizeof (rpath));
rpath.frp_sw_if_index = ~0;
/* Get a line of input. */
unformat_ip4_address,
&pfx.fp_grp_addr.ip4, &pfx.fp_len))
{
- memset (&pfx.fp_src_addr.ip4, 0, sizeof (pfx.fp_src_addr.ip4));
+ clib_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));
+ clib_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",
unformat_ip4_address, &pfx.fp_grp_addr.ip4))
{
- memset (&pfx.fp_src_addr.ip4, 0, sizeof (pfx.fp_src_addr.ip4));
+ clib_memset (&pfx.fp_src_addr.ip4, 0, sizeof (pfx.fp_src_addr.ip4));
pfx.fp_proto = FIB_PROTOCOL_IP4;
pfx.fp_len = 32;
}
else if (unformat (line_input, "%U",
unformat_ip6_address, &pfx.fp_grp_addr.ip6))
{
- memset (&pfx.fp_src_addr.ip6, 0, sizeof (pfx.fp_src_addr.ip6));
+ clib_memset (&pfx.fp_src_addr.ip6, 0, sizeof (pfx.fp_src_addr.ip6));
pfx.fp_proto = FIB_PROTOCOL_IP6;
pfx.fp_len = 128;
}
unformat_vnet_sw_interface, vnm,
&rpath.frp_sw_if_index))
{
- memset (&rpath.frp_addr, 0, sizeof (rpath.frp_addr));
+ clib_memset (&rpath.frp_addr, 0, sizeof (rpath.frp_addr));
rpath.frp_weight = 1;
}
else if (unformat (line_input, "via local"))
{
- memset (&rpath.frp_addr, 0, sizeof (rpath.frp_addr));
+ clib_memset (&rpath.frp_addr, 0, sizeof (rpath.frp_addr));
rpath.frp_sw_if_index = ~0;
rpath.frp_weight = 1;
rpath.frp_flags |= FIB_ROUTE_PATH_LOCAL;
+ /*
+ * set the path proto appropriately for the prefix
+ */
+ rpath.frp_proto = fib_proto_to_dpo (pfx.fp_proto);
}
else if (unformat (line_input, "%U", unformat_mfib_itf_flags, &iflags))
;
for (i = 0; i < retry_count; i++)
{
/* The interface may be down, etc. */
- e = ip6_probe_neighbor (vm, a, sw_if_index);
+ e = ip6_probe_neighbor (vm, a, sw_if_index, 0);
if (e)
return e;
for (i = 0; i < retry_count; i++)
{
/* The interface may be down, etc. */
- e = ip4_probe_neighbor (vm, a, sw_if_index);
+ e = ip4_probe_neighbor (vm, a, sw_if_index, 0);
if (e)
return e;
return (l3p->l3p_sw_if_index == sw_if_index);
}
+typedef struct ip_container_proxy_walk_ctx_t_
+{
+ ip_container_proxy_cb_t cb;
+ void *ctx;
+} ip_container_proxy_walk_ctx_t;
+
+static fib_table_walk_rc_t
+ip_container_proxy_fib_table_walk (fib_node_index_t fei, void *arg)
+{
+ ip_container_proxy_walk_ctx_t *ctx = arg;
+ const fib_prefix_t *pfx;
+ const dpo_id_t *dpo;
+ load_balance_t *lb;
+ l3_proxy_dpo_t *l3p;
+
+ pfx = fib_entry_get_prefix (fei);
+ if (fib_entry_is_sourced (fei, FIB_SOURCE_PROXY))
+ {
+ dpo = fib_entry_contribute_ip_forwarding (fei);
+ lb = load_balance_get (dpo->dpoi_index);
+ dpo = load_balance_get_bucket_i (lb, 0);
+ l3p = l3_proxy_dpo_get (dpo->dpoi_index);
+ ctx->cb (pfx, l3p->l3p_sw_if_index, ctx->ctx);
+ }
+
+ return FIB_TABLE_WALK_CONTINUE;
+}
+
+void
+ip_container_proxy_walk (ip_container_proxy_cb_t cb, void *ctx)
+{
+ fib_table_t *fib_table;
+ ip_container_proxy_walk_ctx_t wctx = {
+ .cb = cb,
+ .ctx = ctx,
+ };
+
+ /* *INDENT-OFF* */
+ pool_foreach (fib_table, ip4_main.fibs,
+ ({
+ fib_table_walk(fib_table->ft_index,
+ FIB_PROTOCOL_IP4,
+ ip_container_proxy_fib_table_walk,
+ &wctx);
+ }));
+ pool_foreach (fib_table, ip6_main.fibs,
+ ({
+ fib_table_walk(fib_table->ft_index,
+ FIB_PROTOCOL_IP6,
+ ip_container_proxy_fib_table_walk,
+ &wctx);
+ }));
+ /* *INDENT-ON* */
+}
+
clib_error_t *
ip_container_cmd (vlib_main_t * vm,
unformat_input_t * main_input, vlib_cli_command_t * cmd)
vnm = vnet_get_main ();
is_del = 0;
sw_if_index = ~0;
- memset (&pfx, 0, sizeof (pfx));
+ clib_memset (&pfx, 0, sizeof (pfx));
/* Get a line of input. */
if (!unformat_user (main_input, unformat_line_input, line_input))