diff options
author | Florin Coras <fcoras@cisco.com> | 2020-09-02 19:10:28 -0700 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2020-09-14 14:33:11 +0000 |
commit | 61ae056bdb6cdf7cb718cf9f459d41e903abcb47 (patch) | |
tree | 72b43bcb5a6e184b005d3b6aa60a2d954f902f16 /src/vnet/session/application_namespace.c | |
parent | 4a2c794c431c72364e241fa14327f03e35b886b7 (diff) |
session: add unix socket api for app attachment
This is an af_unix socket alternative to the binary api. To enable it,
add use-app-socket-api under session stanza in startup.conf. When the
socket api is enabled, attachments through the binary api are disabled.
The socket api only works with memfd fifo segments, i.e., shm segments
are not supported.
Type: feature
Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I55ffcee201d004846daeeec85c700c7e7a578d43
Diffstat (limited to 'src/vnet/session/application_namespace.c')
-rw-r--r-- | src/vnet/session/application_namespace.c | 76 |
1 files changed, 74 insertions, 2 deletions
diff --git a/src/vnet/session/application_namespace.c b/src/vnet/session/application_namespace.c index 294192ceea1..1c43c79ce47 100644 --- a/src/vnet/session/application_namespace.c +++ b/src/vnet/session/application_namespace.c @@ -14,9 +14,12 @@ */ #include <vnet/session/application_namespace.h> +#include <vnet/session/application.h> #include <vnet/session/session_table.h> #include <vnet/session/session.h> #include <vnet/fib/fib_table.h> +#include <vppinfra/file.h> +#include <vlib/unix/unix.h> /** * Hash table of application namespaces by app ns ids @@ -28,6 +31,8 @@ uword *app_namespace_lookup_table; */ static app_namespace_t *app_namespace_pool; +static u8 app_sapi_enabled; + app_namespace_t * app_namespace_get (u32 index) { @@ -105,6 +110,10 @@ vnet_app_namespace_add_del (vnet_app_namespace_add_del_args_t * a) app_ns->ip6_fib_index = fib_table_find (FIB_PROTOCOL_IP6, a->ip6_fib_id); session_lookup_set_tables_appns (app_ns); + + /* Add socket for namespace */ + if (app_sapi_enabled) + appns_sapi_add_ns_socket (app_ns); } else { @@ -152,6 +161,18 @@ app_namespace_get_local_table (app_namespace_t * app_ns) } void +appns_sapi_enable (void) +{ + app_sapi_enabled = 1; +} + +u8 +appns_sapi_enabled (void) +{ + return app_sapi_enabled; +} + +void app_namespaces_init (void) { u8 *ns_id = format (0, "default"); @@ -253,14 +274,52 @@ format_app_namespace (u8 * s, va_list * args) return s; } +static void +app_namespace_show_api (vlib_main_t * vm, app_namespace_t * app_ns) +{ + app_ns_api_handle_t *handle; + app_worker_t *app_wrk; + clib_socket_t *cs; + clib_file_t *cf; + + if (!app_sapi_enabled) + { + vlib_cli_output (vm, "app socket api not enabled!"); + return; + } + + vlib_cli_output (vm, "socket: %v\n", app_ns->sock_name); + + if (!pool_elts (app_ns->app_sockets)) + return; + + vlib_cli_output (vm, "%12s%12s%5s", "app index", "wrk index", "fd"); + + + /* *INDENT-OFF* */ + pool_foreach (cs, app_ns->app_sockets, ({ + handle = (app_ns_api_handle_t *) &cs->private_data; + cf = clib_file_get (&file_main, handle->aah_file_index); + if (handle->aah_app_wrk_index == APP_INVALID_INDEX) + { + vlib_cli_output (vm, "%12d%12d%5u", -1, -1, cf->file_descriptor); + continue; + } + app_wrk = app_worker_get (handle->aah_app_wrk_index); + vlib_cli_output (vm, "%12d%12d%5u", app_wrk->app_index, + app_wrk->wrk_map_index, cf->file_descriptor); + })); + /* *INDENT-ON* */ +} + static clib_error_t * show_app_ns_fn (vlib_main_t * vm, unformat_input_t * main_input, vlib_cli_command_t * cmd) { unformat_input_t _line_input, *line_input = &_line_input; + u8 *ns_id, do_table = 0, had_input = 1, do_api = 0; app_namespace_t *app_ns; session_table_t *st; - u8 *ns_id, do_table = 0, had_input = 1; session_cli_return_if_not_enabled (); @@ -274,6 +333,8 @@ show_app_ns_fn (vlib_main_t * vm, unformat_input_t * main_input, { if (unformat (line_input, "table %_%v%_", &ns_id)) do_table = 1; + else if (unformat (line_input, "api-clients")) + do_api = 1; else { vlib_cli_output (vm, "unknown input [%U]", format_unformat_error, @@ -282,6 +343,17 @@ show_app_ns_fn (vlib_main_t * vm, unformat_input_t * main_input, } } + if (do_api) + { + if (!do_table) + { + vlib_cli_output (vm, "must specify a table for api"); + goto done; + } + app_ns = app_namespace_get_from_id (ns_id); + app_namespace_show_api (vm, app_ns); + goto done; + } if (do_table) { app_ns = app_namespace_get_from_id (ns_id); @@ -321,7 +393,7 @@ done: VLIB_CLI_COMMAND (show_app_ns_command, static) = { .path = "show app ns", - .short_help = "show app ns", + .short_help = "show app ns [table <id> [api-clients]]", .function = show_app_ns_fn, }; /* *INDENT-ON* */ |