diff options
author | Jon Loeliger <jdl@netgate.com> | 2018-01-16 16:37:16 -0600 |
---|---|---|
committer | Damjan Marion <damarion@cisco.com> | 2018-01-29 13:09:57 +0100 |
commit | 30349b075cf939549980f2a32e030b32f6d07e9a (patch) | |
tree | ebf4a6e10c49cd9657cefeadafbaa44f07c5c021 /src/plugins/memif/cli.c | |
parent | b4d43d7901b49bdda4345adb86b4d15a5d72f7ff (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.c | 207 |
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* */ |