/* Add app to lookup by api_client_index table */
if (!application_is_builtin (app))
application_api_table_add (app->app_index, a->api_client_index);
- else
+ if (a->name)
application_name_table_add (app);
app_crypto_ctx_init (&app->crypto_ctx);
return &app->sm_properties;
}
-static void
-application_format_listeners (application_t * app, int verbose)
+static u8 *
+format_app_listeners (u8 *s, va_list *args)
{
- vlib_main_t *vm = vlib_get_main ();
+ application_t *app = va_arg (*args, application_t *);
+ int verbose = va_arg (*args, int);
app_worker_map_t *wrk_map;
app_worker_t *app_wrk;
u32 sm_index;
if (!app)
{
- vlib_cli_output (vm, "%U", format_app_worker_listener, NULL /* header */,
- 0, 0, verbose);
- return;
+ s = format (s, "%U\n", format_app_worker_listener, NULL /* header */, 0,
+ 0, verbose);
+ return s;
}
pool_foreach (wrk_map, app->worker_maps) {
if (hash_elts (app_wrk->listeners_table) == 0)
continue;
hash_foreach (handle, sm_index, app_wrk->listeners_table, ({
- vlib_cli_output (vm, "%U", format_app_worker_listener, app_wrk,
- handle, sm_index, verbose);
- }));
+ s = format (s, "%U\n", format_app_worker_listener, app_wrk,
+ handle, sm_index, verbose);
+ }));
}
+
+ return s;
}
static void
format_application (u8 * s, va_list * args)
{
application_t *app = va_arg (*args, application_t *);
- CLIB_UNUSED (int verbose) = va_arg (*args, int);
+ int verbose = va_arg (*args, int);
segment_manager_props_t *props;
const u8 *app_ns_name, *app_name;
app_worker_map_t *wrk_map;
app_worker_t *app_wrk;
- segment_manager_t *sm;
- u64 handle;
- u32 sm_index;
+ u32 indent = 2;
if (app == 0)
{
pool_foreach (wrk_map, app->worker_maps) {
app_wrk = app_worker_get (wrk_map->wrk_index);
- s = format (s, "%U", format_app_worker, app_wrk);
if (verbose > 1)
- {
- sm = segment_manager_get (app_wrk->connects_seg_manager);
- s = format (s, "segment manager\n %U", format_segment_manager, sm,
- 1 /* verbose */);
- hash_foreach (handle, sm_index, app_wrk->listeners_table, ({
- sm = segment_manager_get (sm_index);
- s = format (s, " %U\n", format_segment_manager, sm,
- 1 /* verbose */);
- }));
- }
- }
+ s = format (s, "\n");
+ s = format (s, "%U%U", format_white_space, indent, format_app_worker,
+ app_wrk, verbose);
+ }
return s;
}
void
-application_format_all_listeners (vlib_main_t * vm, int verbose)
+application_format_listeners (vlib_main_t *vm, application_t *req_app,
+ int verbose)
{
application_t *app;
+ if (req_app)
+ {
+ vlib_cli_output (vm, "%U", format_app_listeners, 0, verbose);
+ vlib_cli_output (vm, "%U", format_app_listeners, req_app, verbose);
+ return;
+ }
+
if (!pool_elts (app_main.app_pool))
{
vlib_cli_output (vm, "No active server bindings");
return;
}
- application_format_listeners (0, verbose);
-
+ vlib_cli_output (vm, "%U", format_app_listeners, 0, verbose);
pool_foreach (app, app_main.app_pool) {
- application_format_listeners (app, verbose);
+ vlib_cli_output (vm, "%U", format_app_listeners, app, verbose);
}
}
}
}
-static inline void
-appliction_format_app_mq (vlib_main_t * vm, application_t * app)
+static u8 *
+format_app_mq (u8 *s, va_list *args)
{
+ application_t *app = va_arg (*args, application_t *);
app_worker_map_t *map;
app_worker_t *wrk;
int i;
pool_foreach (map, app->worker_maps) {
wrk = app_worker_get (map->wrk_index);
- vlib_cli_output (vm, "[A%d][%d]%U", app->app_index,
- map->wrk_index, format_svm_msg_q,
- wrk->event_queue);
+ s = format (s, "[A%d][%d]%U", app->app_index, map->wrk_index,
+ format_svm_msg_q, wrk->event_queue);
}
for (i = 0; i < vec_len (app->rx_mqs); i++)
- vlib_cli_output (vm, "[A%d][R%d]%U", app->app_index, i, format_svm_msg_q,
- app->rx_mqs[i].mq);
+ s = format (s, "[A%d][R%d]%U", app->app_index, i, format_svm_msg_q,
+ app->rx_mqs[i].mq);
+
+ return s;
}
static clib_error_t *
-appliction_format_all_app_mq (vlib_main_t * vm)
+application_format_mqs (vlib_main_t *vm, application_t *req_app)
{
application_t *app;
int i, n_threads;
+ if (req_app)
+ {
+ vlib_cli_output (vm, "%U", format_app_mq, req_app);
+ return 0;
+ }
+
n_threads = vlib_get_n_threads ();
for (i = 0; i < n_threads; i++)
session_main_get_vpp_event_queue (i));
}
- pool_foreach (app, app_main.app_pool) {
- appliction_format_app_mq (vm, app);
- }
+ pool_foreach (app, app_main.app_pool)
+ {
+ vlib_cli_output (vm, "%U", format_app_mq, app);
+ }
return 0;
}
+uword
+unformat_app_index (unformat_input_t *input, va_list *args)
+{
+ u32 *app_index = va_arg (*args, u32 *);
+ app_main_t *am = &app_main;
+
+ if (unformat (input, "%d", app_index))
+ return 1;
+
+ return unformat_user (input, unformat_hash_vec_string, am->app_by_name,
+ app_index);
+}
+
static clib_error_t *
show_app_command_fn (vlib_main_t * vm, unformat_input_t * input,
vlib_cli_command_t * cmd)
{
int do_server = 0, do_client = 0, do_mq = 0, do_transports = 0;
- application_t *app;
+ application_t *app = 0;
u32 app_index = ~0;
int verbose = 0;
u8 is_ta;
{
if (unformat (input, "server"))
do_server = 1;
+ else if (unformat (input, "listeners"))
+ do_server = 1;
else if (unformat (input, "client"))
do_client = 1;
else if (unformat (input, "transports"))
do_transports = 1;
else if (unformat (input, "mq"))
do_mq = 1;
- else if (unformat (input, "%u", &app_index))
- ;
else if (unformat (input, "verbose"))
verbose = 1;
+ else if (unformat (input, "%U", unformat_app_index, &app_index))
+ ;
else
return clib_error_return (0, "unknown input `%U'",
format_unformat_error, input);
}
- if (do_mq && app_index != ~0)
+ if (app_index != ~0)
{
app = application_get_if_valid (app_index);
if (!app)
return clib_error_return (0, "No app with index %u", app_index);
-
- appliction_format_app_mq (vm, app);
- return 0;
}
if (do_mq)
{
- appliction_format_all_app_mq (vm);
+ application_format_mqs (vm, app);
return 0;
}
if (do_server)
{
- application_format_all_listeners (vm, verbose);
+ application_format_listeners (vm, app, verbose);
return 0;
}
return 0;
}
- if (app_index != ~0)
+ if (app)
{
- app = application_get_if_valid (app_index);
- if (!app)
- return clib_error_return (0, "No app with index %u", app_index);
-
vlib_cli_output (vm, "%U", format_application, app, ++verbose);
return 0;
}
VLIB_CLI_COMMAND (show_app_command, static) = {
.path = "show app",
- .short_help = "show app [index] [server|client] [mq] [verbose] "
+ .short_help = "show app [index] [listeners|client] [mq] [verbose] "
"[transports]",
.function = show_app_command_fn,
};
if (!app_wrk)
{
if (verbose)
- s = format (s, "%-" SESSION_CLI_ID_LEN "s%-25s%-10s%-15s%-15s%-10s",
- "Connection", "App", "Wrk", "API Client", "ListenerID",
- "SegManager");
+ s = format (s, "%-" SESSION_CLI_ID_LEN "s%-25s%-10s%-10s",
+ "Connection", "App", "Wrk", "SegMngr");
else
s = format (s, "%-" SESSION_CLI_ID_LEN "s%-25s%-10s", "Connection",
"App", "Wrk");
{
u8 *buf;
buf = format (0, "%u(%u)", app_wrk->wrk_map_index, app_wrk->wrk_index);
- s = format (s, "%-" SESSION_CLI_ID_LEN "v%-25v%-10v%-15u%-15u%-10u", str,
- app_name, buf, app_wrk->api_client_index, handle, sm_index);
+ s = format (s, "%-" SESSION_CLI_ID_LEN "v%-25v%-10v%-10u", str, app_name,
+ buf, sm_index);
vec_free (buf);
}
else
- s = format (s, "%-" SESSION_CLI_ID_LEN "v%-25v%=10u", str, app_name,
+ s = format (s, "%-" SESSION_CLI_ID_LEN "v%-25v%-10u", str, app_name,
app_wrk->wrk_map_index);
vec_free (str);
format_app_worker (u8 * s, va_list * args)
{
app_worker_t *app_wrk = va_arg (*args, app_worker_t *);
- u32 indent = 1;
+ u32 verbose = va_arg (*args, u32);
+ u32 sm_index, indent = format_get_indent (s);
+ segment_manager_t *sm;
+ u64 handle;
s = format (s,
- "%U wrk-index %u app-index %u map-index %u "
+ "wrk-index %u app-index %u map-index %u "
"api-client-index %d mq-cong %u\n",
- format_white_space, indent, app_wrk->wrk_index,
- app_wrk->app_index, app_wrk->wrk_map_index,
+ app_wrk->wrk_index, app_wrk->app_index, app_wrk->wrk_map_index,
app_wrk->api_client_index, app_wrk->mq_congested);
+
+ if (verbose > 1)
+ {
+ sm = segment_manager_get (app_wrk->connects_seg_manager);
+ s = format (s, "%Usegment managers:\n%U%U", format_white_space, indent,
+ format_white_space, indent, format_segment_manager, sm,
+ 1 /* verbose */);
+ hash_foreach (handle, sm_index, app_wrk->listeners_table, ({
+ sm = segment_manager_get (sm_index);
+ s = format (s, "%U%U\n", format_white_space, indent,
+ format_segment_manager, sm, 1 /* verbose */);
+ }));
+ }
return s;
}