From: Steven Luong Date: Mon, 26 Jul 2021 20:38:05 +0000 (-0700) Subject: interface: add custom interface name support X-Git-Tag: v22.02-rc0~60 X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commitdiff_plain;h=f49734d3b9afb27e3f527e1477fee4952d546f9a interface: add custom interface name support add CLI "set interface name and the corresponding binary API to allow custom interface name setting for any interface. Type: feature Signed-off-by: Steven Luong Change-Id: I2b39da59879fd4526bcb5aa5854b6bd21e72ea73 --- diff --git a/src/vnet/interface.api b/src/vnet/interface.api index 38dc4320b8d..d89dea4e353 100644 --- a/src/vnet/interface.api +++ b/src/vnet/interface.api @@ -14,7 +14,7 @@ * limitations under the License. */ -option version = "3.2.2"; +option version = "3.2.3"; import "vnet/interface_types.api"; import "vnet/ethernet/ethernet_types.api"; @@ -458,6 +458,22 @@ autoreply define sw_interface_set_rx_placement bool is_main; }; +/** \brief Set custom interface name + Set custom interface name for the interface. + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param sw_if_index - the interface whose name will be set + @param name - the custom interface name to be set +k +*/ +autoreply define sw_interface_set_interface_name +{ + u32 client_index; + u32 context; + vl_api_interface_index_t sw_if_index; + string name[64]; +}; + /** \brief dump the rx queue placement of interface(s) @param sw_if_index - optional interface index for which queue placement to be requested. sw_if_index = ~0 will dump placement information for all diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c index 9b606dd6265..f9e03b9f1ea 100644 --- a/src/vnet/interface_api.c +++ b/src/vnet/interface_api.c @@ -1016,6 +1016,39 @@ static void vl_api_sw_interface_get_mac_address_t_handler vl_api_send_msg (reg, (u8 *) rmp); } +static void +vl_api_sw_interface_set_interface_name_t_handler ( + vl_api_sw_interface_set_interface_name_t *mp) +{ + vl_api_sw_interface_set_interface_name_reply_t *rmp; + vnet_main_t *vnm = vnet_get_main (); + u32 sw_if_index = ntohl (mp->sw_if_index); + vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index); + clib_error_t *error; + int rv = 0; + + if (mp->name[0] == 0) + { + rv = VNET_API_ERROR_INVALID_VALUE; + goto out; + } + if (si == 0) + { + rv = VNET_API_ERROR_INVALID_SW_IF_INDEX; + goto out; + } + + error = vnet_rename_interface (vnm, si->hw_if_index, (char *) mp->name); + if (error) + { + clib_error_free (error); + rv = VNET_API_ERROR_INVALID_SW_IF_INDEX; + } + +out: + REPLY_MACRO (VL_API_SW_INTERFACE_SET_INTERFACE_NAME_REPLY); +} + static void vl_api_sw_interface_set_rx_mode_t_handler (vl_api_sw_interface_set_rx_mode_t * mp) { @@ -1430,6 +1463,7 @@ interface_api_hookup (vlib_main_t * vm) am->is_mp_safe[VL_API_SW_INTERFACE_DUMP] = 1; am->is_mp_safe[VL_API_SW_INTERFACE_DETAILS] = 1; am->is_mp_safe[VL_API_SW_INTERFACE_TAG_ADD_DEL] = 1; + am->is_mp_safe[VL_API_SW_INTERFACE_SET_INTERFACE_NAME] = 1; /* Do not replay VL_API_SW_INTERFACE_DUMP messages */ am->api_trace_cfg[VL_API_SW_INTERFACE_DUMP].replay_enable = 0; diff --git a/src/vnet/interface_cli.c b/src/vnet/interface_cli.c index 2bddf29b70f..8475225b525 100644 --- a/src/vnet/interface_cli.c +++ b/src/vnet/interface_cli.c @@ -2402,6 +2402,55 @@ VLIB_CLI_COMMAND (pcap_tx_trace_command, static) = { }; /* *INDENT-ON* */ +static clib_error_t * +set_interface_name (vlib_main_t *vm, unformat_input_t *input, + vlib_cli_command_t *cmd) +{ + clib_error_t *error = 0; + unformat_input_t _line_input, *line_input = &_line_input; + vnet_main_t *vnm = vnet_get_main (); + u32 hw_if_index = ~0; + char *name = 0; + + if (!unformat_user (input, unformat_line_input, line_input)) + return 0; + + while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (line_input, "%U %s", unformat_vnet_hw_interface, vnm, + &hw_if_index, &name)) + ; + else + { + error = clib_error_return (0, "parse error: '%U'", + format_unformat_error, line_input); + unformat_free (line_input); + vec_free (name); + return error; + } + } + + unformat_free (line_input); + + if (hw_if_index == (u32) ~0 || name == 0) + { + vec_free (name); + error = clib_error_return (0, "please specify valid interface name"); + return error; + } + + error = vnet_rename_interface (vnm, hw_if_index, name); + vec_free (name); + + return (error); +} + +VLIB_CLI_COMMAND (cmd_set_if_name, static) = { + .path = "set interface name", + .short_help = "set interface name ", + .function = set_interface_name, + .is_mp_safe = 1, +}; /* * fd.io coding-style-patch-verification: ON *