diff options
-rw-r--r-- | src/plugins/nat/nat64_cli.c | 46 | ||||
-rw-r--r-- | src/vnet/dpo/interface_rx_dpo.c | 2 | ||||
-rw-r--r-- | src/vnet/dpo/interface_tx_dpo.c | 2 |
3 files changed, 46 insertions, 4 deletions
diff --git a/src/plugins/nat/nat64_cli.c b/src/plugins/nat/nat64_cli.c index 4128eda5a38..7fea6bbb983 100644 --- a/src/plugins/nat/nat64_cli.c +++ b/src/plugins/nat/nat64_cli.c @@ -680,10 +680,11 @@ nat64_add_del_prefix_command_fn (vlib_main_t * vm, unformat_input_t * input, 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; @@ -705,6 +706,11 @@ nat64_add_del_prefix_command_fn (vlib_main_t * vm, unformat_input_t * input, 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'", format_unformat_error, line_input); @@ -732,6 +738,42 @@ nat64_add_del_prefix_command_fn (vlib_main_t * vm, unformat_input_t * input, 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); @@ -954,7 +996,7 @@ VLIB_CLI_COMMAND (show_nat64_st_command, static) = { 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, }; diff --git a/src/vnet/dpo/interface_rx_dpo.c b/src/vnet/dpo/interface_rx_dpo.c index caaee65a897..b4680f18f2a 100644 --- a/src/vnet/dpo/interface_rx_dpo.c +++ b/src/vnet/dpo/interface_rx_dpo.c @@ -154,7 +154,7 @@ format_interface_rx_dpo (u8* s, va_list *ap) vnet_main_t * vnm = vnet_get_main(); interface_rx_dpo_t *ido = interface_rx_dpo_get(index); - return (format(s, "%U-dpo: %U", + return (format(s, "%U-rx-dpo: %U", format_vnet_sw_interface_name, vnm, vnet_get_sw_interface(vnm, ido->ido_sw_if_index), diff --git a/src/vnet/dpo/interface_tx_dpo.c b/src/vnet/dpo/interface_tx_dpo.c index f7c8bfda85b..870579884a0 100644 --- a/src/vnet/dpo/interface_tx_dpo.c +++ b/src/vnet/dpo/interface_tx_dpo.c @@ -50,7 +50,7 @@ format_interface_tx_dpo (u8* s, va_list *ap) CLIB_UNUSED(u32 indent) = va_arg(*ap, u32); vnet_main_t * vnm = vnet_get_main(); - return (format(s, "%U-dpo:", + return (format(s, "%U-tx-dpo:", format_vnet_sw_interface_name, vnm, vnet_get_sw_interface(vnm, index))); |