diff options
author | Pavel Kotucek <pavel.kotucek@pantheon.tech> | 2018-11-28 07:42:11 +0100 |
---|---|---|
committer | Ole Trøan <otroan@employees.org> | 2018-12-07 12:24:52 +0000 |
commit | e88865d7bc9cd45b044f8aeadf1916c38e0eb165 (patch) | |
tree | a6dfb198549ff9f2335724e3ea7b0f942ad08540 /src/vnet/udp | |
parent | e6b58cf86affdf434a15f8833e959cded6c15784 (diff) |
VPP-1506: dump local punts and registered punt sockets
Change-Id: If7835e9b80ec9402404bfc8d271eb11a10ef992b
Signed-off-by: Pavel Kotucek <pavel.kotucek@pantheon.tech>
Diffstat (limited to 'src/vnet/udp')
-rw-r--r-- | src/vnet/udp/udp.c | 60 | ||||
-rw-r--r-- | src/vnet/udp/udp.h | 1 | ||||
-rw-r--r-- | src/vnet/udp/udp_local.c | 16 |
3 files changed, 77 insertions, 0 deletions
diff --git a/src/vnet/udp/udp.c b/src/vnet/udp/udp.c index ccac921b8b3..8c2daaf66e6 100644 --- a/src/vnet/udp/udp.c +++ b/src/vnet/udp/udp.c @@ -441,6 +441,66 @@ udp_init (vlib_main_t * vm) VLIB_INIT_FUNCTION (udp_init); +static clib_error_t * +show_udp_punt_fn (vlib_main_t * vm, unformat_input_t * input, + vlib_cli_command_t * cmd_arg) +{ + udp_main_t *um = vnet_get_udp_main (); + + clib_error_t *error = NULL; + + if (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) + return clib_error_return (0, "unknown input `%U'", format_unformat_error, + input); + + udp_dst_port_info_t *port_info; + if (um->punt_unknown4) + { + vlib_cli_output (vm, "IPv4 UDP punt: enabled"); + } + else + { + u8 *s = NULL; + vec_foreach (port_info, um->dst_port_infos[UDP_IP4]) + { + if (udp_is_valid_dst_port (port_info->dst_port, 1)) + { + s = format (s, (!s) ? "%d" : ", %d", port_info->dst_port); + } + } + s = format (s, "%c", 0); + vlib_cli_output (vm, "IPV4 UDP ports punt : %s", s); + } + + if (um->punt_unknown6) + { + vlib_cli_output (vm, "IPv6 UDP punt: enabled"); + } + else + { + u8 *s = NULL; + vec_foreach (port_info, um->dst_port_infos[UDP_IP6]) + { + if (udp_is_valid_dst_port (port_info->dst_port, 01)) + { + s = format (s, (!s) ? "%d" : ", %d", port_info->dst_port); + } + } + s = format (s, "%c", 0); + vlib_cli_output (vm, "IPV6 UDP ports punt : %s", s); + } + + return (error); +} +/* *INDENT-OFF* */ +VLIB_CLI_COMMAND (show_tcp_punt_command, static) = +{ + .path = "show udp punt", + .short_help = "show udp punt [ipv4|ipv6]", + .function = show_udp_punt_fn, +}; +/* *INDENT-ON* */ + /* * fd.io coding-style-patch-verification: ON * diff --git a/src/vnet/udp/udp.h b/src/vnet/udp/udp.h index 8b94a0088f6..19db4f81777 100644 --- a/src/vnet/udp/udp.h +++ b/src/vnet/udp/udp.h @@ -252,6 +252,7 @@ void udp_register_dst_port (vlib_main_t * vm, u32 node_index, u8 is_ip4); void udp_unregister_dst_port (vlib_main_t * vm, udp_dst_port_t dst_port, u8 is_ip4); +bool udp_is_valid_dst_port (udp_dst_port_t dst_port, u8 is_ip4); void udp_punt_unknown (vlib_main_t * vm, u8 is_ip4, u8 is_add); diff --git a/src/vnet/udp/udp_local.c b/src/vnet/udp/udp_local.c index bb7305d8d03..a16ba22cf27 100644 --- a/src/vnet/udp/udp_local.c +++ b/src/vnet/udp/udp_local.c @@ -549,6 +549,22 @@ udp_unregister_dst_port (vlib_main_t * vm, udp_dst_port_t dst_port, u8 is_ip4) n[0] = SPARSE_VEC_INVALID_INDEX; } +bool +udp_is_valid_dst_port (udp_dst_port_t dst_port, u8 is_ip4) +{ + udp_main_t *um = &udp_main; + u16 *n; + + if (is_ip4) + n = sparse_vec_validate (um->next_by_dst_port4, + clib_host_to_net_u16 (dst_port)); + else + n = sparse_vec_validate (um->next_by_dst_port6, + clib_host_to_net_u16 (dst_port)); + + return (n[0] != SPARSE_VEC_INVALID_INDEX); +} + void udp_punt_unknown (vlib_main_t * vm, u8 is_ip4, u8 is_add) { |