From 37d39672de5d3e0d0f928d61eec8f66cd73c7fe8 Mon Sep 17 00:00:00 2001 From: Ole Troan Date: Fri, 3 Nov 2017 14:02:26 +0100 Subject: [PATCH] NAT64: Input feature arc on virtual interface via interface RX DPO. Change-Id: If2048c7d72048679bc5d0412f3fae109926f759e Signed-off-by: Ole Troan --- src/plugins/nat/nat64_cli.c | 46 +++++++++++++++++++++++++++++++++++++++-- src/vnet/dpo/interface_rx_dpo.c | 2 +- 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; @@ -704,6 +705,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'", @@ -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 / [tenant-vrf ] " - "[del]", + "[del] [interface 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))); -- 2.16.6