summaryrefslogtreecommitdiffstats
path: root/src/plugins/memif/cli.c
diff options
context:
space:
mode:
authorJon Loeliger <jdl@netgate.com>2018-01-16 16:37:16 -0600
committerDamjan Marion <damarion@cisco.com>2018-01-29 13:09:57 +0100
commit30349b075cf939549980f2a32e030b32f6d07e9a (patch)
treeebf4a6e10c49cd9657cefeadafbaa44f07c5c021 /src/plugins/memif/cli.c
parentb4d43d7901b49bdda4345adb86b4d15a5d72f7ff (diff)
memif: Add new API calls to manage memif socket names.
New API calls and corresponding CLI commands allow the user to manage the socket filenames for memif connections using: vppctl# create memif id <u32> filename <socket-filename> vppctl# delete memif id <u32> and then referencing it later in a memif interface: vppctl# create memif <u32> socket-id <id> mode <mode> <master|slave> ... Corresponding VAT cli entries have also been added. The default memif socket file at id 0 are still always present. The existing memif create/delete CLI commands have been slightly altered into the new syntax: vppctl# create interface memif ... vppctl# delete interface memif ... Change-Id: If2bdc7eac3d81e1d9011a5869747e52fc5e11639 Signed-off-by: Jon Loeliger <jdl@netgate.com> Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/plugins/memif/cli.c')
-rw-r--r--src/plugins/memif/cli.c207
1 files changed, 197 insertions, 10 deletions
diff --git a/src/plugins/memif/cli.c b/src/plugins/memif/cli.c
index 29d13310776..3f0e28179e2 100644
--- a/src/plugins/memif/cli.c
+++ b/src/plugins/memif/cli.c
@@ -26,6 +26,147 @@
#include <memif/memif.h>
#include <memif/private.h>
+
+static clib_error_t *
+memif_socket_filename_create_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ unformat_input_t _line_input, *line_input = &_line_input;
+ int r;
+ u32 socket_id;
+ u8 *socket_filename;
+
+ /* Get a line of input. */
+ if (!unformat_user (input, unformat_line_input, line_input))
+ return 0;
+
+ socket_id = ~0;
+ socket_filename = 0;
+
+ while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (line_input, "id %u", &socket_id))
+ ;
+ else if (unformat (line_input, "filename %s", &socket_filename))
+ ;
+ else
+ {
+ vec_free (socket_filename);
+ return clib_error_return (0, "unknown input `%U'",
+ format_unformat_error, input);
+ }
+ }
+
+ unformat_free (line_input);
+
+ if (socket_id == 0 || socket_id == ~0)
+ {
+ vec_free (socket_filename);
+ return clib_error_return (0, "Invalid socket id");
+ }
+
+ if (!socket_filename || *socket_filename == 0)
+ {
+ vec_free (socket_filename);
+ return clib_error_return (0, "Invalid socket filename");
+ }
+
+ r = memif_socket_filename_add_del (1, socket_id, socket_filename);
+
+ vec_free (socket_filename);
+
+ if (r < 0)
+ {
+ switch (r)
+ {
+ case VNET_API_ERROR_INVALID_ARGUMENT:
+ return clib_error_return (0, "Invalid argument");
+ case VNET_API_ERROR_SYSCALL_ERROR_1:
+ return clib_error_return (0, "Syscall error 1");
+ case VNET_API_ERROR_ENTRY_ALREADY_EXISTS:
+ return clib_error_return (0, "Already exists");
+ case VNET_API_ERROR_UNEXPECTED_INTF_STATE:
+ return clib_error_return (0, "Interface still in use");
+ default:
+ return clib_error_return (0, "Unknown error");
+ }
+ }
+
+ return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (memif_socket_filename_create_command, static) = {
+ .path = "create memif socket",
+ .short_help = "create memif socket [id <id>] [filename <path>]",
+ .function = memif_socket_filename_create_command_fn,
+};
+/* *INDENT-ON* */
+
+static clib_error_t *
+memif_socket_filename_delete_command_fn (vlib_main_t * vm,
+ unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ unformat_input_t _line_input, *line_input = &_line_input;
+ int r;
+ u32 socket_id;
+
+ /* Get a line of input. */
+ if (!unformat_user (input, unformat_line_input, line_input))
+ return 0;
+
+ socket_id = ~0;
+
+ while (unformat_check_input (line_input) != UNFORMAT_END_OF_INPUT)
+ {
+ if (unformat (line_input, "id %u", &socket_id))
+ ;
+ else
+ {
+ return clib_error_return (0, "unknown input `%U'",
+ format_unformat_error, input);
+ }
+ }
+
+ unformat_free (line_input);
+
+ if (socket_id == 0 || socket_id == ~0)
+ {
+ return clib_error_return (0, "Invalid socket id");
+ }
+
+ r = memif_socket_filename_add_del (0, socket_id, 0);
+
+ if (r < 0)
+ {
+ switch (r)
+ {
+ case VNET_API_ERROR_INVALID_ARGUMENT:
+ return clib_error_return (0, "Invalid argument");
+ case VNET_API_ERROR_SYSCALL_ERROR_1:
+ return clib_error_return (0, "Syscall error 1");
+ case VNET_API_ERROR_ENTRY_ALREADY_EXISTS:
+ return clib_error_return (0, "Already exists");
+ case VNET_API_ERROR_UNEXPECTED_INTF_STATE:
+ return clib_error_return (0, "Interface still in use");
+ default:
+ return clib_error_return (0, "Unknown error");
+ }
+ }
+
+ return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (memif_socket_filename_delete_command, static) = {
+ .path = "delete memif socket",
+ .short_help = "delete memif socket [id <id>]",
+ .function = memif_socket_filename_delete_command_fn,
+};
+/* *INDENT-ON* */
+
static clib_error_t *
memif_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
vlib_cli_command_t * cmd)
@@ -46,7 +187,7 @@ memif_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
{
if (unformat (line_input, "id %u", &args.id))
;
- else if (unformat (line_input, "socket %s", &args.socket_filename))
+ else if (unformat (line_input, "socket-id %u", &args.socket_id))
;
else if (unformat (line_input, "secret %s", &args.secret))
;
@@ -91,13 +232,15 @@ memif_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
r = memif_create_if (vm, &args);
- vec_free (args.socket_filename);
vec_free (args.secret);
if (r <= VNET_API_ERROR_SYSCALL_ERROR_1
&& r >= VNET_API_ERROR_SYSCALL_ERROR_10)
return clib_error_return (0, "%s (errno %d)", strerror (errno), errno);
+ if (r == VNET_API_ERROR_INVALID_ARGUMENT)
+ return clib_error_return (0, "Invalid argument");
+
if (r == VNET_API_ERROR_INVALID_INTERFACE)
return clib_error_return (0, "Invalid interface name");
@@ -109,9 +252,10 @@ memif_create_command_fn (vlib_main_t * vm, unformat_input_t * input,
/* *INDENT-OFF* */
VLIB_CLI_COMMAND (memif_create_command, static) = {
- .path = "create memif",
- .short_help = "create memif [id <id>] [socket <path>] "
- "[ring-size <size>] [buffer-size <size>] [hw-addr <mac-address>] "
+ .path = "create interface memif",
+ .short_help = "create interface memif [id <id>] [socket-id <socket-id>] "
+ "[ring-size <size>] [buffer-size <size>] "
+ "[hw-addr <mac-address>] "
"<master|slave> [rx-queues <number>] [tx-queues <number>] "
"[mode ip] [secret <string>]",
.function = memif_create_command_fn,
@@ -119,6 +263,22 @@ VLIB_CLI_COMMAND (memif_create_command, static) = {
/* *INDENT-ON* */
static clib_error_t *
+create_memif_command_fn (vlib_main_t * vm, unformat_input_t * input,
+ vlib_cli_command_t * cmd)
+{
+ vlib_cli_output (vm, "command deprecated. Please use "
+ "'create interface memif' instead.\n");
+ return 0;
+}
+
+/* *INDENT-OFF* */
+VLIB_CLI_COMMAND (create_memif_command, static) = {
+ .path = "create memif",
+ .function = create_memif_command_fn,
+};
+/* *INDENT-ON* */
+
+static clib_error_t *
memif_delete_command_fn (vlib_main_t * vm, unformat_input_t * input,
vlib_cli_command_t * cmd)
{
@@ -162,8 +322,8 @@ memif_delete_command_fn (vlib_main_t * vm, unformat_input_t * input,
/* *INDENT-OFF* */
VLIB_CLI_COMMAND (memif_delete_command, static) = {
- .path = "delete memif",
- .short_help = "delete memif {<interface> | sw_if_index <sw_idx>}",
+ .path = "delete interface memif",
+ .short_help = "delete interface memif {<interface> | sw_if_index <sw_idx>}",
.function = memif_delete_command_fn,
};
/* *INDENT-ON* */
@@ -267,6 +427,9 @@ memif_show_command_fn (vlib_main_t * vm, unformat_input_t * input,
int show_descr = 0;
clib_error_t *error = 0;
u32 hw_if_index, *hw_if_indices = 0;
+ u32 sock_id;
+ u32 msf_idx;
+ u8 *s = 0;
while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
{
@@ -283,6 +446,30 @@ memif_show_command_fn (vlib_main_t * vm, unformat_input_t * input,
}
}
+ vlib_cli_output (vm, "sockets\n");
+ vlib_cli_output (vm, " %-3s %-11s %s\n", "id", "listener", "filename");
+
+ /* *INDENT-OFF* */
+ hash_foreach (sock_id, msf_idx, mm->socket_file_index_by_sock_id,
+ ({
+ memif_socket_file_t *msf;
+ u8 *filename;
+
+ msf = pool_elt_at_index(mm->socket_files, msf_idx);
+ filename = msf->filename;
+ if (msf->is_listener)
+ s = format (s, "yes (%u)", msf->ref_cnt);
+ else
+ s = format (s, "no");
+
+ vlib_cli_output(vm, " %-3u %-11v %s\n", sock_id, s, filename);
+ vec_reset_length (s);
+ }));
+ /* *INDENT-ON* */
+ vec_free (s);
+
+ vlib_cli_output (vm, "\n");
+
if (vec_len (hw_if_indices) == 0)
{
/* *INDENT-OFF* */
@@ -306,8 +493,8 @@ memif_show_command_fn (vlib_main_t * vm, unformat_input_t * input,
if (mif->remote_if_name)
vlib_cli_output (vm, " remote-interface \"%s\"",
mif->remote_if_name);
- vlib_cli_output (vm, " id %d mode %U file %s", mif->id,
- format_memif_if_mode, mif, msf->filename);
+ vlib_cli_output (vm, " socket-id %u id %u mode %U", msf->socket_id,
+ mif->id, format_memif_if_mode, mif);
vlib_cli_output (vm, " flags%U", format_memif_if_flags, mif->flags);
vlib_cli_output (vm, " listener-fd %d conn-fd %d",
msf->sock ? msf->sock->fd : 0,
@@ -347,7 +534,7 @@ done:
/* *INDENT-OFF* */
VLIB_CLI_COMMAND (memif_show_command, static) = {
.path = "show memif",
- .short_help = "show memif {<interface>] [descriptors]",
+ .short_help = "show memif [<interface>] [descriptors]",
.function = memif_show_command_fn,
};
/* *INDENT-ON* */