summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Luong <sluong@cisco.com>2021-07-26 13:38:05 -0700
committerDamjan Marion <dmarion@me.com>2021-09-08 14:35:54 +0000
commitf49734d3b9afb27e3f527e1477fee4952d546f9a (patch)
tree2d67c929ffe367c881134b3e87e558c08b88bb0d
parent0c373fc928316ef9928f4171b7c602c259c60d77 (diff)
interface: add custom interface name support
add CLI "set interface name <current-int-name> <new-int-name> and the corresponding binary API to allow custom interface name setting for any interface. Type: feature Signed-off-by: Steven Luong <sluong@cisco.com> Change-Id: I2b39da59879fd4526bcb5aa5854b6bd21e72ea73
-rw-r--r--src/vnet/interface.api18
-rw-r--r--src/vnet/interface_api.c34
-rw-r--r--src/vnet/interface_cli.c49
3 files changed, 100 insertions, 1 deletions
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 <interface-name> <new-interface-name>",
+ .function = set_interface_name,
+ .is_mp_safe = 1,
+};
/*
* fd.io coding-style-patch-verification: ON
*