Add a new GDB macro called ovs_dump_conntrack_conns, which can
be used to dump all conn structure in a conntrack. For example

(gdb) ovs_dump_conntrack_conns
usage: ovs_dump_conntrack_conns <struct conntrack *> {short}

(gdb) ovs_dump_conntrack_conns 0x5606339c25e0
(struct conn *) 0x7f32c000a8c0: expiration = 26162886419, mark = 0, dl_type = 
8, zone = 3, nw_proto = 6 '\006'
(struct conn *) 0x7f32c00489d0: expiration = 26162900867, mark = 0, dl_type = 
8, zone = 3, nw_proto = 1 '\001'
(struct conn *) 0x7f32c0153bb0: expiration = 26249266420, mark = 0, dl_type = 
8, zone = 3, nw_proto = 6 '\006'

(gdb) ovs_dump_conntrack_conns 0x5606339c25e0 short
(struct conn *) 0x7f32c000a8c0
(struct conn *) 0x7f32c00489d0
(struct conn *) 0x7f32c0153bb0

Signed-off-by: LIU Yulong <i...@liuyulong.me>
---
v1: initial version
v2: address comments from reviewers
    print details of struct conn
    add short param
v3: address pep8 check warnnings
---
 utilities/gdb/ovs_gdb.py | 58 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)

diff --git a/utilities/gdb/ovs_gdb.py b/utilities/gdb/ovs_gdb.py
index 982395dd1..ea9ee5f88 100644
--- a/utilities/gdb/ovs_gdb.py
+++ b/utilities/gdb/ovs_gdb.py
@@ -37,6 +37,7 @@
 #    - ovs_dump_udpif_keys {<udpif_name>|<udpif_address>} {short}
 #    - ovs_show_fdb {[<bridge_name>] {dbg} {hash}}
 #    - ovs_show_upcall {dbg}
+#    - ovs_dump_conntrack_conns <struct conntrack *> {short}
 #
 #  Example:
 #    $ gdb $(which ovs-vswitchd) $(pidof ovs-vswitchd)
@@ -1550,6 +1551,62 @@ class CmdDumpPackets(gdb.Command):
         return packet
 
 
+#
+# Implements the GDB "ovs_dump_conntrack_conns" command
+#
+class CmdDumpDpConntrackConn(gdb.Command):
+    """Dump all connections in a conntrack set
+    Usage:
+      ovs_dump_conntrack_conns <struct conntrack *> {short}
+
+      <struct conntrack *> : Pointer to conntrack
+      short                : Only dump conn structure addresses,
+                             no content details
+
+    Example dumping all <struct conn> connections:
+
+    (gdb) ovs_dump_conntrack_conns 0x5606339c25e0
+    (struct conn *) 0x7f32c000a8c0: expiration = ... nw_proto = 1
+    (struct conn *) 0x7f32c00489d0: expiration = ... nw_proto = 6
+    (struct conn *) 0x7f32c0153bb0: expiration = ... nw_proto = 17
+
+    (gdb) ovs_dump_conntrack_conns 0x5606339c25e0 short
+    (struct conn *) 0x7f32c000a8c0
+    (struct conn *) 0x7f32c00489d0
+    (struct conn *) 0x7f32c0153bb0
+    """
+    def __init__(self):
+        super(CmdDumpDpConntrackConn, self).__init__(
+            "ovs_dump_conntrack_conns",
+            gdb.COMMAND_DATA)
+
+    @staticmethod
+    def display_single_conn(conn, indent=0, short=False):
+        indent = " " * indent
+        if short:
+            print("{}(struct conn *) {}".format(indent, conn))
+        else:
+            print("{}(struct conn *) {}: expiration = {}, mark = {}, "
+                  "dl_type = {}, zone = {}, nw_proto = {}".format(
+                      indent, conn, conn['expiration'],
+                      conn['mark'], conn['key']['dl_type'],
+                      conn['key']['zone'],
+                      conn['key']['nw_proto']))
+
+    def invoke(self, arg, from_tty):
+        arg_list = gdb.string_to_argv(arg)
+        if len(arg_list) == 0:
+            print("usage: ovs_dump_conntrack_conns <struct conntrack *> "
+                  "{short}")
+            return
+
+        ct = gdb.parse_and_eval(arg_list[0]).cast(
+            gdb.lookup_type('struct conntrack').pointer())
+
+        for node in ForEachCMAP(ct["conns"], "struct conn", "cm_node"):
+            self.display_single_conn(node, short="short" in arg_list[1:])
+
+
 #
 # Initialize all GDB commands
 #
@@ -1571,3 +1628,4 @@ CmdDumpSmap()
 CmdDumpUdpifKeys()
 CmdShowFDB()
 CmdShowUpcall()
+CmdDumpDpConntrackConn()
-- 
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to