diff --git a/src/include/ci/internal/ip.h b/src/include/ci/internal/ip.h index 8e3d6a59..743e46b6 100644 --- a/src/include/ci/internal/ip.h +++ b/src/include/ci/internal/ip.h @@ -1575,6 +1575,14 @@ extern void citp_waitable_print_to_logger(ci_netif*, citp_waitable*, extern void ci_tcp_listenq_print_to_logger(ci_netif* ni, ci_tcp_socket_listen* tls, oo_dump_log_fn_t logger, void *log_arg); +extern int ci_tcp_listenq_bucket_iter(ci_netif* ni, ci_tcp_listen_bucket* bucket, + void (fn_tsr)(ci_netif* ni, + ci_tcp_state_synrecv* tsr, + void* arg), + void (fn_bucket)(ci_netif* ni, + ci_tcp_listen_bucket* bucket, + void* arg), + void* arg); /********************************************************************* diff --git a/src/lib/transport/ip/tcp_synrecv.c b/src/lib/transport/ip/tcp_synrecv.c index d0faacd0..54f323b5 100644 --- a/src/lib/transport/ip/tcp_synrecv.c +++ b/src/lib/transport/ip/tcp_synrecv.c @@ -65,7 +65,7 @@ ci_inline int ci_tcp_listenq_hash2idx(ci_uint32 hash, int level) * (sub-)bucket, including the top one. fn_bucket() is called after all * the syn-recv states have been handled via fn_tsr() callback. */ -static int +int ci_tcp_listenq_bucket_iter(ci_netif* ni, ci_tcp_listen_bucket* bucket, void (fn_tsr)(ci_netif* ni, ci_tcp_state_synrecv* tsr, diff --git a/src/tools/onload_remote_monitor/ftl_decls.h b/src/tools/onload_remote_monitor/ftl_decls.h index 51024317..abba6268 100644 --- a/src/tools/onload_remote_monitor/ftl_decls.h +++ b/src/tools/onload_remote_monitor/ftl_decls.h @@ -53,6 +53,7 @@ FTL_DECLARE(STRUCT_IP_SOCK_STATS) FTL_DECLARE(STRUCT_TCP_COMMON) FTL_DECLARE(STRUCT_TCP) FTL_DECLARE(STRUCT_TCP_SOCKET_LISTEN_STATS) +FTL_DECLARE(STRUCT_STATE_SYNRECV) FTL_DECLARE(STRUCT_TCP_LISTEN) FTL_DECLARE(STRUCT_WAITABLE_OBJ) FTL_DECLARE(STRUCT_FILTER_TABLE_ENTRY_FAST) diff --git a/src/tools/onload_remote_monitor/ftl_defs.h b/src/tools/onload_remote_monitor/ftl_defs.h index 60728e1a..d3aeab91 100644 --- a/src/tools/onload_remote_monitor/ftl_defs.h +++ b/src/tools/onload_remote_monitor/ftl_defs.h @@ -1159,6 +1159,14 @@ typedef struct oo_tcp_socket_stats oo_tcp_socket_stats; n_rx_pkts, (ORM_OUTPUT_STACK | ORM_OUTPUT_SOCKETS)) \ FTL_TSTRUCT_END(ctx) +#define STRUCT_STATE_SYNRECV(ctx) \ + FTL_TSTRUCT_BEGIN(ctx, ci_tcp_state_synrecv, ) \ + FTL_TFIELD_IPXADDR(ctx, l_addr, (ORM_OUTPUT_STACK | ORM_OUTPUT_SOCKETS)) \ + FTL_TFIELD_IPXADDR(ctx, r_addr, (ORM_OUTPUT_STACK | ORM_OUTPUT_SOCKETS)) \ + FTL_TFIELD_PORT(ctx, l_port, (ORM_OUTPUT_STACK | ORM_OUTPUT_SOCKETS)) \ + FTL_TFIELD_PORT(ctx, r_port, (ORM_OUTPUT_STACK | ORM_OUTPUT_SOCKETS)) \ + FTL_TSTRUCT_END(ctx) + #define STRUCT_TCP_LISTEN(ctx) \ FTL_TSTRUCT_BEGIN(ctx, ci_tcp_socket_listen, ) \ FTL_TFIELD_STRUCT(ctx, ci_sock_cmn, s, (ORM_OUTPUT_STACK | ORM_OUTPUT_SOCKETS)) \ diff --git a/src/tools/onload_remote_monitor/orm_json_lib.c b/src/tools/onload_remote_monitor/orm_json_lib.c index e7ba768e..baddd511 100644 --- a/src/tools/onload_remote_monitor/orm_json_lib.c +++ b/src/tools/onload_remote_monitor/orm_json_lib.c @@ -807,6 +807,14 @@ static void orm_dump_struct_ci_netif_config_opts(char* label, ci_netif_config_op #include "ftl_decls.h" +static void orm_dump_synrecv(ci_netif* ni, ci_tcp_state_synrecv* tsr, void* arg) +{ + dump_buf_literal("{"); + orm_dump_struct_ci_tcp_state_synrecv("tcp_listen_synrecv", tsr, *(int *)arg); + dump_buf_cleanup(); + dump_buf_literal_comma("}"); +} + static void orm_waitable_dump(ci_netif* ni, const char* sock_type, int output_flags, const sockbuf_filter_t* sft) { @@ -824,6 +832,11 @@ static void orm_waitable_dump(ci_netif* ni, const char* sock_type, sockbuf_filter_matches(sft, wo) ) { dump_buf_cat("\"%d\":{", W_FMT(w)); orm_dump_struct_ci_tcp_socket_listen("tcp_listen_sockets", &wo->tcp_listen, output_flags); + dump_buf_literal("\"tcp_listenq_bucket\":["); + ci_tcp_listenq_bucket_iter(ni, ci_ni_aux_p2bucket(ni, wo->tcp_listen.bucket), + orm_dump_synrecv, NULL, &output_flags); + dump_buf_cleanup(); + dump_buf_literal_comma("]"); dump_buf_cleanup(); dump_buf_literal_comma("}"); }