session: improve cli app formatting 08/43908/2
authorFlorin Coras <[email protected]>
Sat, 18 Oct 2025 00:02:01 +0000 (20:02 -0400)
committerFlorin Coras <[email protected]>
Sat, 18 Oct 2025 20:39:05 +0000 (20:39 +0000)
- 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 <[email protected]>
src/vnet/session/application.c
src/vnet/session/application.h
src/vnet/session/application_eventing.c
src/vnet/session/application_worker.c
src/vnet/session/segment_manager.c

index 55b116f..24045c5 100644 (file)
@@ -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,
 };
index 13ba6b6..0b22d21 100644 (file)
@@ -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);
 
index 810678e..6c0cb07 100644 (file)
@@ -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))
        ;
index 68b7e15..6d58767 100644 (file)
@@ -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;
 }
 
index fd32043..d7706fa 100644 (file)
@@ -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))