tcp: CLI command to print tcp_cfg

Type: improvement

Change-Id: Ie8f6ddc96fd3f5d44827ace834f8f6baa330d37d
Signed-off-by: Aritra Basu <aritrbas@cisco.com>
diff --git a/src/vnet/tcp/tcp_cli.c b/src/vnet/tcp/tcp_cli.c
index 16b8858..bb7f3ef 100644
--- a/src/vnet/tcp/tcp_cli.c
+++ b/src/vnet/tcp/tcp_cli.c
@@ -840,6 +840,74 @@
   .function = show_tcp_punt_fn,
 };
 
+static u8 *
+format_tcp_cfg (u8 *s, va_list *args)
+{
+  tcp_configuration_t tm_cfg = va_arg (*args, tcp_configuration_t);
+
+  s = format (s, "max rx fifo size: %U\n", format_memory_size,
+	      tm_cfg.max_rx_fifo);
+  s = format (s, "min rx fifo size: %U\n", format_memory_size,
+	      tm_cfg.min_rx_fifo);
+  s = format (s, "default mtu: %u\n", tm_cfg.default_mtu);
+  s = format (s, "initial cwnd multiplier: %u\n",
+	      tm_cfg.initial_cwnd_multiplier);
+  s =
+    format (s, "tx pacing: %s\n", tm_cfg.min_rx_fifo ? "enabled" : "disabled");
+  s = format (s, "tso: %s\n", tm_cfg.allow_tso ? "allowed" : "disallowed");
+  s = format (s, "checksum offload: %s\n",
+	      tm_cfg.csum_offload ? "enabled" : "disabled");
+  s = format (s, "congestion control algorithm: %s\n",
+	      tcp_cc_algo_get (tm_cfg.cc_algo)->name);
+  s = format (s, "min rwnd update ack: %u\n", tm_cfg.rwnd_min_update_ack);
+  s = format (s, "max gso packet size: %U\n", format_memory_size,
+	      tm_cfg.max_gso_size);
+  s = format (s, "close_wait time: %u sec\n",
+	      (u32) (tm_cfg.closewait_time * TCP_TIMER_TICK));
+  s = format (s, "time_wait time: %u sec\n",
+	      (u32) (tm_cfg.timewait_time * TCP_TIMER_TICK));
+  s = format (s, "fin_wait1 time: %u sec\n",
+	      (u32) (tm_cfg.finwait1_time * TCP_TIMER_TICK));
+  s = format (s, "fin_wait2 time: %u sec\n",
+	      (u32) (tm_cfg.finwait2_time * TCP_TIMER_TICK));
+  s = format (s, "last_ack time: %u sec\n",
+	      (u32) (tm_cfg.lastack_time * TCP_TIMER_TICK));
+  s = format (s, "fin_ack time: %u sec\n",
+	      (u32) (tm_cfg.closing_time * TCP_TIMER_TICK));
+  s = format (s, "syn_rcvd time: %u sec\n",
+	      (u32) (tm_cfg.syn_rcvd_time * TCP_TICK));
+  s = format (s, "tcp allocation error cleanup time: %0.2f sec\n",
+	      (f32) (tm_cfg.alloc_err_timeout * TCP_TIMER_TICK));
+  s = format (s, "connection cleanup time: %.2f sec\n", tm_cfg.cleanup_time);
+  s = format (s, "tcp preallocated connections: %u",
+	      tm_cfg.preallocated_connections);
+
+  return s;
+}
+
+static clib_error_t *
+show_tcp_cfg_fn (vlib_main_t *vm, unformat_input_t *input,
+		 vlib_cli_command_t *cmd)
+{
+  tcp_main_t *tm = vnet_get_tcp_main ();
+
+  if (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    return clib_error_return (0, "unknown input `%U'", format_unformat_error,
+			      input);
+  vlib_cli_output (vm, "-----------");
+  vlib_cli_output (vm, "tcp config");
+  vlib_cli_output (vm, "-----------");
+  vlib_cli_output (vm, "%U\n", format_tcp_cfg, tm->cfg);
+
+  return 0;
+}
+
+VLIB_CLI_COMMAND (show_tcp_cfg_command, static) = {
+  .path = "show tcp config",
+  .short_help = "show tcp config",
+  .function = show_tcp_cfg_fn,
+};
+
 static clib_error_t *
 show_tcp_stats_fn (vlib_main_t * vm, unformat_input_t * input,
 		   vlib_cli_command_t * cmd)