This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit d0884828ed5087da1a0b39cbb07a4dd267605c6f Author: Zhe Weng <weng...@xiaomi.com> AuthorDate: Fri Aug 23 11:33:05 2024 +0800 tools/gdb: Add TCP in netstats (gdb) netstats IOB: size ntotal nfree nwait nthrottle 1518 72 70 0 38 <...> TCP Conn: st flg ref tmr uack nrt txbuf rxbuf+ofo local_address remote_address 0 4 61 1 3 0 0 0/16384 28/16384+0 10.0.1.2:11315 10.0.1.1:5001 Signed-off-by: Zhe Weng <weng...@xiaomi.com> --- tools/gdb/net.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/tools/gdb/net.py b/tools/gdb/net.py index 3b8287b472..a80a311b70 100644 --- a/tools/gdb/net.py +++ b/tools/gdb/net.py @@ -92,6 +92,16 @@ def wrbuffer_inqueue_size(queue=None, protocol="tcp"): return total +def tcp_ofoseg_bufsize(conn): + """Calculate the pending size of out-of-order buffer of a tcp connection""" + + total = 0 + if utils.get_symbol_value("CONFIG_NET_TCP_OUT_OF_ORDER"): + for i in range(conn["nofosegs"]): + total += conn["ofosegs"][i]["data"]["io_pktlen"] + return total + + class NetStats(gdb.Command): """Network statistics""" @@ -153,6 +163,44 @@ class NetStats(gdb.Command): except gdb.error as e: gdb.write("Failed to get Net Stats: %s\n" % e) + def tcp_stats(self): + try: + gdb.write( + "TCP Conn: %3s %3s %3s %3s %4s %3s" + % ("st", "flg", "ref", "tmr", "uack", "nrt") + ) + gdb.write( + " %11s %11s+%-5s %21s %21s\n" + % ("txbuf", "rxbuf", "ofo", "local_address", "remote_address") + ) + for idx, conn in enumerate(socket_for_each_entry("tcp")): + state = conn["tcpstateflags"] + flags = conn["sconn"]["s_flags"] + ref = conn["crefs"] + timer = conn["timer"] + unacked = conn["tx_unacked"] + nrtx = conn["nrtx"] + + txbuf = utils.get_field(conn, "snd_bufs", -1) + rxbuf = utils.get_field(conn, "rcv_bufs", -1) + txsz = wrbuffer_inqueue_size( + utils.get_field(conn, "unacked_q"), "tcp" + ) + wrbuffer_inqueue_size(utils.get_field(conn, "write_q"), "tcp") + rxsz = conn["readahead"]["io_pktlen"] if conn["readahead"] else 0 + ofosz = tcp_ofoseg_bufsize(conn) + laddr, lport, raddr, rport = get_ip_port(conn) + + gdb.write( + "%-4d %3x %3x %3d %3d %4d %3d" + % (idx, state, flags, ref, timer, unacked, nrtx) + ) + gdb.write( + " %5d/%-5d %5d/%-5d+%-5d %15s:%-5d %15s:%-5d\n" + % (txsz, txbuf, rxsz, rxbuf, ofosz, laddr, lport, raddr, rport) + ) + except gdb.error as e: + gdb.write("Failed to get TCP stats: %s\n" % e) + def udp_stats(self): try: gdb.write( @@ -181,6 +229,9 @@ class NetStats(gdb.Command): if utils.get_symbol_value("CONFIG_NET_STATISTICS"): self.pkt_stats() gdb.write("\n") + if utils.get_symbol_value("CONFIG_NET_TCP"): + self.tcp_stats() + gdb.write("\n") if utils.get_symbol_value("CONFIG_NET_UDP"): self.udp_stats() gdb.write("\n")