From 62f75e98a3c5ea03d17ef0fde9173ffb6c1ed45a Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Fri, 17 Oct 2025 20:02:01 -0400 Subject: [PATCH] session: improve cli app formatting - converted some print functions to format functions - better alignment in verbose mode - allow app unformat based on name not only index Type: improvement Change-Id: I5760ffe141485aa52c6a470f97f78f9b43b4187b Signed-off-by: Florin Coras --- src/vnet/session/application.c | 129 ++++++++++++++++++-------------- src/vnet/session/application.h | 1 + src/vnet/session/application_eventing.c | 2 +- src/vnet/session/application_worker.c | 34 ++++++--- src/vnet/session/segment_manager.c | 10 +-- 5 files changed, 104 insertions(+), 72 deletions(-) diff --git a/src/vnet/session/application.c b/src/vnet/session/application.c index 55b116f7386..24045c5cd9a 100644 --- a/src/vnet/session/application.c +++ b/src/vnet/session/application.c @@ -873,7 +873,7 @@ application_alloc_and_init (app_init_args_t *a) /* 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); @@ -1753,10 +1753,11 @@ application_get_segment_manager_properties (u32 app_index) 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; @@ -1764,9 +1765,9 @@ application_format_listeners (application_t * app, int verbose) 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) { @@ -1774,10 +1775,12 @@ application_format_listeners (application_t * app, int verbose) 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 @@ -1812,14 +1815,12 @@ u8 * 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) { @@ -1849,38 +1850,37 @@ format_application (u8 * s, va_list * args) 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); } } @@ -1902,31 +1902,39 @@ application_format_all_clients (vlib_main_t * vm, int 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++) @@ -1935,18 +1943,32 @@ appliction_format_all_app_mq (vlib_main_t * vm) 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; @@ -1957,40 +1979,39 @@ show_app_command_fn (vlib_main_t * vm, unformat_input_t * input, { 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; } @@ -2000,12 +2021,8 @@ show_app_command_fn (vlib_main_t * vm, unformat_input_t * input, 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; } @@ -2043,7 +2060,7 @@ VLIB_INIT_FUNCTION (application_init); 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, }; diff --git a/src/vnet/session/application.h b/src/vnet/session/application.h index 13ba6b61a10..0b22d210f52 100644 --- a/src/vnet/session/application.h +++ b/src/vnet/session/application.h @@ -414,6 +414,7 @@ void app_worker_del_detached_sm (app_worker_t * app_wrk, u32 sm_index); u8 *format_app_worker (u8 * s, va_list * args); u8 *format_app_worker_listener (u8 *s, va_list *args); u8 *format_crypto_context (u8 * s, va_list * args); +uword unformat_app_index (unformat_input_t *input, va_list *args); void app_worker_format_connects (app_worker_t * app_wrk, int verbose); session_error_t vnet_app_worker_add_del (vnet_app_worker_add_del_args_t *a); diff --git a/src/vnet/session/application_eventing.c b/src/vnet/session/application_eventing.c index 810678e371b..6c0cb07b36f 100644 --- a/src/vnet/session/application_eventing.c +++ b/src/vnet/session/application_eventing.c @@ -553,7 +553,7 @@ app_evt_collector_enable_command_fn (vlib_main_t *vm, unformat_input_t *input, alm->segment_size = tmp64; else if (unformat (line_input, "uri %s", &collector_uri)) vec_add1 (collector_uri, 0); - else if (unformat (line_input, "app %d", &app_index)) + else if (unformat (line_input, "app %U", unformat_app_index, &app_index)) ; else if (unformat (line_input, "listener %u", &ls_index)) ; diff --git a/src/vnet/session/application_worker.c b/src/vnet/session/application_worker.c index 68b7e159e51..6d5876724ae 100644 --- a/src/vnet/session/application_worker.c +++ b/src/vnet/session/application_worker.c @@ -929,9 +929,8 @@ format_app_worker_listener (u8 * s, va_list * args) 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"); @@ -947,12 +946,12 @@ format_app_worker_listener (u8 * s, va_list * args) { 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); @@ -964,14 +963,29 @@ u8 * 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; } diff --git a/src/vnet/session/segment_manager.c b/src/vnet/session/segment_manager.c index fd32043780d..d7706fa2add 100644 --- a/src/vnet/session/segment_manager.c +++ b/src/vnet/session/segment_manager.c @@ -1139,12 +1139,12 @@ format_segment_manager (u8 *s, va_list *args) max_fifo_size = sm->max_fifo_size; s = format (s, - "%U[%u] %v app-wrk: %u segs: %u max-fifo-sz: %U " + "[%u] %v app-wrk: %u segs: %u max-fifo-sz: %U " "wmarks: %u %u %s flags: %U", - format_white_space, indent, segment_manager_index (sm), - app ? app->name : 0, sm->app_wrk_index, pool_elts (sm->segments), - format_memory_size, max_fifo_size, sm->high_watermark, - sm->low_watermark, custom_logic ? "custom-tuning" : "no-tuning", + segment_manager_index (sm), app ? app->name : 0, + sm->app_wrk_index, pool_elts (sm->segments), format_memory_size, + max_fifo_size, sm->high_watermark, sm->low_watermark, + custom_logic ? "custom-tuning" : "no-tuning", format_segment_manager_flags, (int) sm->flags); if (!verbose || !pool_elts (sm->segments)) -- 2.16.6