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")

Reply via email to