From d9b4d9fb1ff1319c5e24800780a24e15a24cbb2f Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Tue, 6 Feb 2024 16:31:50 -0800 Subject: udp: add cli to dump transport ports show udp transport ports Dumps list of ports registered by udp transport, as opposed to udp local, and their refcount. Type: improvement Signed-off-by: Florin Coras Change-Id: If3cbe51a7176cb89fa38b524defffbbd76af8f58 --- src/vnet/udp/udp_cli.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/src/vnet/udp/udp_cli.c b/src/vnet/udp/udp_cli.c index 1e723923c2f..58bcbecc45a 100644 --- a/src/vnet/udp/udp_cli.c +++ b/src/vnet/udp/udp_cli.c @@ -302,6 +302,98 @@ VLIB_CLI_COMMAND (show_udp_ports_cmd, static) = { .is_mp_safe = 1, }; +static void +table_format_udp_transport_port_ (vlib_main_t *vm, table_t *t, int *c, + int port, int is_ip4) +{ + udp_main_t *um = &udp_main; + u32 refcnt; + u16 port_ne; + + port_ne = clib_host_to_net_u16 (port); + refcnt = um->transport_ports_refcnt[is_ip4][port_ne]; + if (!refcnt) + return; + + if (!udp_is_valid_dst_port (port, is_ip4)) + { + clib_warning ("Port %u is not registered refcnt %u!", port, refcnt); + return; + } + + table_format_cell (t, *c, 0, "%d", port); + table_format_cell (t, *c, 1, is_ip4 ? "ip4" : "ip6"); + table_format_cell (t, *c, 2, "%d", refcnt); + + (*c)++; +} + +static void +table_format_udp_transport_port (vlib_main_t *vm, table_t *t, int *c, int port, + int ipv) +{ + if (ipv == -1 || ipv == 0) + table_format_udp_transport_port_ (vm, t, c, port, 1 /* is_ip4 */); + if (ipv == -1 || ipv == 1) + table_format_udp_transport_port_ (vm, t, c, port, 0 /* is_ip4 */); +} + +static clib_error_t * +show_udp_transport_ports (vlib_main_t *vm, unformat_input_t *input, + vlib_cli_command_t *cmd) +{ + table_t table = {}, *t = &table; + int ipv = -1, port = -1, c = 0; + clib_error_t *err = 0; + + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + { + if (unformat (input, "ip4")) + ipv = 0; + else if (unformat (input, "ip6")) + ipv = 1; + else if (unformat (input, "%d", &port)) + ; + else + { + err = clib_error_return (0, "unknown input `%U'", + format_unformat_error, input); + goto out; + } + } + + table_add_header_col (t, 3, "port", "proto", "ref-cnt"); + + if (port > 65535) + { + err = clib_error_return (0, "wrong port %d", port); + goto out; + } + + if (port < 0) + { + for (port = 0; port < 65536; port++) + table_format_udp_transport_port (vm, t, &c, port, ipv); + } + else + { + table_format_udp_transport_port (vm, t, &c, port, ipv); + } + + vlib_cli_output (vm, "%U\n", format_table, t); + +out: + table_free (t); + return err; +} + +VLIB_CLI_COMMAND (show_udp_transport_ports_cmd, static) = { + .path = "show udp transport ports", + .function = show_udp_transport_ports, + .short_help = "show udp transport ports [ip4|ip6] []", + .is_mp_safe = 1, +}; + /* * fd.io coding-style-patch-verification: ON * -- cgit 1.2.3-korg