Add a new GDB macro called ovs_dump_cmap, which can be used to dump any
cmap structure. Some examples:
(gdb) ovs_dump_cmap &subtable->rules
(struct cmap *) 0x3e02758
(gdb) ovs_dump_cmap &subtable->rules "struct dpcls_rule" cmap_node
(struct dpcls_rule *) 0x3e02758
(gdb) ovs_dump_cmap &subtable->rules "struct dpcls_rule" cmap_node dump
(struct dpcls_rule *) 0x3e02758 =
{cmap_node = {next = {p = 0x0}}, mask = 0x3dfe100, flow = {hash = ...
---
utilities/gdb/ovs_gdb.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 66 insertions(+)
diff --git a/utilities/gdb/ovs_gdb.py b/utilities/gdb/ovs_gdb.py
index 763ece2a7..7f63dd0d5 100644
--- a/utilities/gdb/ovs_gdb.py
+++ b/utilities/gdb/ovs_gdb.py
@@ -849,6 +849,71 @@ class CmdDumpOvsList(gdb.Command):
member).dereference()))
+#
+# Implements the GDB "ovs_dump_cmap" command
+#
+class CmdDumpCmap(gdb.Command):
+ """Dump all nodes of a given cmap
+ Usage:
+ ovs_dump_cmap <struct cmap *> {[<structure>] [<member>] {dump}]}
+
+ For example dump all the rules in a dpcls_subtable:
+
+ (gdb) ovs_dump_cmap &subtable->rules
+ (struct cmap *) 0x3e02758
+
+ This is not very useful, so please use this with the container_of mode:
+
+ (gdb) ovs_dump_cmap &subtable->rules "struct dpcls_rule" cmap_node
+ (struct dpcls_rule *) 0x3e02758
+
+ Now you can manually use the print command to show the content, or use the
+ dump option to dump the structure for all nodes:
+
+ (gdb) ovs_dump_cmap &subtable->rules "struct dpcls_rule" cmap_node dump
+ (struct dpcls_rule *) 0x3e02758 =
+ {cmap_node = {next = {p = 0x0}}, mask = 0x3dfe100, flow = {hash = ...
+ """
+ def __init__(self):
+ super(CmdDumpCmap, self).__init__("ovs_dump_cmap",
+ gdb.COMMAND_DATA)
+
+ def invoke(self, arg, from_tty):
+ arg_list = gdb.string_to_argv(arg)
+ typeobj = None
+ member = None
+ dump = False
+
+ if len(arg_list) != 1 and len(arg_list) != 3 and len(arg_list) != 4:
+ print("usage: ovs_dump_cmap <struct cmap *> "
+ "{[<structure>] [<member>] {dump}]}")
+ return
+
+ cmap = gdb.parse_and_eval(arg_list[0]).cast(
+ gdb.lookup_type('struct cmap').pointer())
+
+ if len(arg_list) >= 3:
+ typeobj = arg_list[1]
+ member = arg_list[2]
+ if len(arg_list) == 4 and arg_list[3] == "dump":
+ dump = True
+
+ for node in ForEachCMAP(cmap.dereference()):
+ if typeobj is None or member is None:
+ print("(struct cmap *) {}".format(node))
+ else:
+ print("({} *) {} {}".format(
+ typeobj,
+ container_of(node,
+ gdb.lookup_type(typeobj).pointer(), member),
+ "=" if dump else ""))
+ if dump:
+ print(" {}\n".format(container_of(
+ node,
+ gdb.lookup_type(typeobj).pointer(),
+ member).dereference()))
+
+
#
# Implements the GDB "ovs_dump_simap" command
#
@@ -1449,6 +1514,7 @@ CmdDumpNetdevProvider()
CmdDumpOfpacts()
CmdDumpOvsList()
CmdDumpPackets()
+CmdDumpCmap()
CmdDumpSimap()
CmdDumpSmap()
CmdDumpUdpifKeys()
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev