From 30349b075cf939549980f2a32e030b32f6d07e9a Mon Sep 17 00:00:00 2001 From: Jon Loeliger Date: Tue, 16 Jan 2018 16:37:16 -0600 Subject: 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 filename vppctl# delete memif id and then referencing it later in a memif interface: vppctl# create memif socket-id mode ... 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 Signed-off-by: Damjan Marion --- src/plugins/memif/cli.c | 207 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 197 insertions(+), 10 deletions(-) (limited to 'src/plugins/memif/cli.c') 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 #include + +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 ] [filename ]", + .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 ]", + .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,15 +252,32 @@ 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 ] [socket ] " - "[ring-size ] [buffer-size ] [hw-addr ] " + .path = "create interface memif", + .short_help = "create interface memif [id ] [socket-id ] " + "[ring-size ] [buffer-size ] " + "[hw-addr ] " " [rx-queues ] [tx-queues ] " "[mode ip] [secret ]", .function = memif_create_command_fn, }; /* *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 { | sw_if_index }", + .path = "delete interface memif", + .short_help = "delete interface memif { | sw_if_index }", .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 {] [descriptors]", + .short_help = "show memif [] [descriptors]", .function = memif_show_command_fn, }; /* *INDENT-ON* */ -- cgit 1.2.3-korg