vlib_cli_output (vm, " %U %s", format_vnet_sw_interface_name, vnm,
vnet_get_sw_interface (vnm, i->sw_if_index),
- i->is_inside ? "in" : "out");
+ (nat_interface_is_inside (i)
+ && nat_interface_is_outside (i)) ? "in out" :
+ nat_interface_is_inside (i) ? "in" : "out");
return 0;
}
vlib_cli_command_t * cmd)
{
nat64_main_t *nm = &nat64_main;
+ vnet_main_t *vnm = vnet_get_main ();
clib_error_t *error = 0;
unformat_input_t _line_input, *line_input = &_line_input;
u8 is_add = 1;
- u32 vrf_id = 0;
+ u32 vrf_id = 0, sw_if_index = ~0;
ip6_address_t prefix;
u32 plen = 0;
int rv;
;
else if (unformat (line_input, "del"))
is_add = 0;
+ else
+ if (unformat
+ (line_input, "interface %U", unformat_vnet_sw_interface, vnm,
+ &sw_if_index))
+ ;
else
{
error = clib_error_return (0, "unknown input: '%U'",
break;
}
+ /*
+ * Add RX interface route, whenNAT isn't running on the real input
+ * interface
+ */
+ if (sw_if_index != ~0)
+ {
+ u32 fib_index;
+ fib_prefix_t fibpfx = {
+ .fp_len = plen,
+ .fp_proto = FIB_PROTOCOL_IP6,
+ .fp_addr = {.ip6 = prefix}
+ };
+
+ if (is_add)
+ {
+ fib_index = fib_table_find_or_create_and_lock (FIB_PROTOCOL_IP6,
+ vrf_id,
+ FIB_SOURCE_PLUGIN_HI);
+ fib_table_entry_update_one_path (fib_index, &fibpfx,
+ FIB_SOURCE_PLUGIN_HI,
+ FIB_ENTRY_FLAG_NONE, DPO_PROTO_IP6,
+ NULL, sw_if_index, ~0, 0, NULL,
+ FIB_ROUTE_PATH_INTF_RX);
+ }
+ else
+ {
+ fib_index = fib_table_find (FIB_PROTOCOL_IP6, vrf_id);
+ fib_table_entry_path_remove (fib_index, &fibpfx,
+ FIB_SOURCE_PLUGIN_HI, DPO_PROTO_IP6,
+ NULL, sw_if_index, ~0, 1,
+ FIB_ROUTE_PATH_INTF_RX);
+ fib_table_unlock (fib_index, FIB_PROTOCOL_IP6,
+ FIB_SOURCE_PLUGIN_HI);
+ }
+ }
+
done:
unformat_free (line_input);
VLIB_CLI_COMMAND (nat64_add_del_prefix_command, static) = {
.path = "nat64 add prefix",
.short_help = "nat64 add prefix <ip6-prefix>/<plen> [tenant-vrf <vrf-id>] "
- "[del]",
+ "[del] [interface <interface]",
.function = nat64_add_del_prefix_command_fn,
};