Current output of ofproto/detrace doesn't provide information on what
bridge the rules and groups belong to.  This may be confusing in
setups with multiple bridges, especially when packets are resubmitted
multiple times through different patch ports.

Translation cache does have the bridge information though as every
time we lookup the rule we add the XC_TABLE entry that has the bridge
information.  We also know when the rule lookup was executed but
didn't result in a match.  We can report that as well, so it's easier
to follow the resubmits.  Group entries also have a link to ofproto
with the bridge name.

Note: On a miss, the packet hits the internal drop rule in table 254.
By reporting the fact that there was no match it's easier to
understand why that internal rule is getting hit.

There is no extra overhead for providing the bridge information as the
data is already there, we just need to print it out.  Retis, that is
collecting the detrace output, should also be able to take advantage
of this enhancement.

Signed-off-by: Ilya Maximets <[email protected]>
---

Version 2:
  * Fixed missing bridge name for groups. [Adrian]

 ofproto/ofproto-dpif-xlate-cache.c | 19 +++++++++++
 tests/system-traffic.at            | 52 ++++++++++++++++++++++++------
 utilities/checkpatch_dict.txt      |  1 +
 3 files changed, 62 insertions(+), 10 deletions(-)

diff --git a/ofproto/ofproto-dpif-xlate-cache.c 
b/ofproto/ofproto-dpif-xlate-cache.c
index c6d935cf0..62df8ecba 100644
--- a/ofproto/ofproto-dpif-xlate-cache.c
+++ b/ofproto/ofproto-dpif-xlate-cache.c
@@ -306,22 +306,41 @@ void
 xlate_xcache_format(struct ds *s, const struct xlate_cache *xcache)
 {
     struct ofpbuf entries = xcache->entries;
+    struct ofproto *last_ofproto = NULL;
     struct xc_entry *entry;
     struct ofgroup *ofg;
 
     XC_ENTRY_FOR_EACH (entry, &entries) {
         switch (entry->type) {
         case XC_RULE:
+            ds_put_cstr(s, "  ");
             ofproto_rule_stats_ds(s, &entry->rule->up, true);
             break;
+
         case XC_GROUP:
             ofg = &entry->group.group->up;
+            if (last_ofproto != ofg->ofproto) {
+                ds_put_format(s, "%s\n", ofg->ofproto->name);
+                last_ofproto = ofg->ofproto;
+            }
+            ds_put_cstr(s, "  ");
             ofputil_group_format(s, ofg->group_id, ofg->type,
                                  entry->group.bucket, &ofg->buckets,
                                  &ofg->props, OFP15_VERSION,
                                  false, NULL, NULL);
             break;
+
         case XC_TABLE:
+            if (last_ofproto != &entry->table.ofproto->up) {
+                ds_put_format(s, "%s\n", entry->table.ofproto->up.name);
+                last_ofproto = &entry->table.ofproto->up;
+            }
+            if (!entry->table.match) {
+                ds_put_format(s, "  table_id=%"PRIu8", no match\n",
+                              entry->table.id);
+            }
+            break;
+
         case XC_BOND:
         case XC_NETDEV:
         case XC_NETFLOW:
diff --git a/tests/system-traffic.at b/tests/system-traffic.at
index 8f4fdf8b1..cac0a8121 100644
--- a/tests/system-traffic.at
+++ b/tests/system-traffic.at
@@ -2733,7 +2733,12 @@ OVS_TRAFFIC_VSWITCHD_STOP
 AT_CLEANUP
 
 AT_SETUP([datapath - Dump OF rules corresponding to UFID])
-OVS_TRAFFIC_VSWITCHD_START()
+OVS_TRAFFIC_VSWITCHD_START(
+   [_ADD_BR([br1]) -- \
+    add-port br0 patch1 -- set interface patch1 type=patch \
+        options:peer=patch0 ofport_request=3 -- \
+    add-port br1 patch0 -- set interface patch0 type=patch \
+        options:peer=patch1 ofport_request=4 --])
 
 ADD_NAMESPACES(at_ns0, at_ns1)
 
@@ -2749,14 +2754,24 @@ 
group_id=1,type=select,selection_method=dp_hash,bucket=bucket_id:0,weight:100,ac
 ])
 AT_DATA([flows.txt], [dnl
 table=0,arp,actions=NORMAL
+table=0,priority=100,cookie=0x1234abcd,in_port=patch1,ip,nw_dst=10.0.0.2,actions=resubmit(,4)
 
table=0,priority=100,cookie=0x12345678,in_port=ovs-p1,ip,nw_dst=10.0.0.2,actions=resubmit(,1)
 
table=0,priority=100,cookie=0xabcedf,in_port=ovs-p2,ip,nw_dst=10.0.0.1,actions=ct(table=3)
 table=1,priority=200,ip,actions=group:1
-table=2,ip,actions=ovs-p2
+table=2,ip,actions=ovs-p2,patch1
 table=3,ip,actions=ovs-p1
+table=4,ip,actions=drop
+])
+AT_DATA([flows1.txt], [dnl
+table=0,arp,actions=drop
+table=0,actions=clone(resubmit(,1)),resubmit(,2)
+table=1,ip,actions=set_field:10.0.0.3->nw_dst,in_port
+table=2,ip,actions=in_port
 ])
+
 AT_CHECK([ovs-ofctl add-groups br0 groups.txt])
 AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
+AT_CHECK([ovs-ofctl add-flows br1 flows1.txt])
 
 NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.1 -W 2 10.0.0.2 | FORMAT_PING], 
[0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
@@ -2782,8 +2797,8 @@ AT_CHECK([ovs-appctl dpctl/dump-flows --names | grep 
"ipv4" | strip_used | strip
           strip_duration | strip_dp_hash | strip_recirc | sed 
's/:never/:0.0s/' | \
           strip_ptype | strip_eth | sort], [0], [dnl
 
recirc_id(<recirc>),in_port(ovs-p1),eth_type(0x0800),ipv4(dst=10.0.0.2,frag=no),
 packets:0, bytes:0, used:0.0s, actions:hash(l4(0)),recirc(<recirc>)
+recirc_id(<recirc>),in_port(ovs-p1),eth_type(0x0800),ipv4(dst=10.0.0.2,proto=1,frag=no),
 packets:0, bytes:0, used:0.0s, actions:ovs-p2
 recirc_id(<recirc>),in_port(ovs-p1),eth_type(0x0800),ipv4(frag=no), packets:0, 
bytes:0, used:0.0s, actions:ct(commit),recirc(<recirc>)
-recirc_id(<recirc>),in_port(ovs-p1),eth_type(0x0800),ipv4(frag=no), packets:0, 
bytes:0, used:0.0s, actions:ovs-p2
 
recirc_id(<recirc>),in_port(ovs-p2),eth_type(0x0800),ipv4(dst=10.0.0.1,frag=no),
 packets:0, bytes:0, used:0.0s, actions:ct,recirc(<recirc>)
 recirc_id(<recirc>),in_port(ovs-p2),eth_type(0x0800),ipv4(frag=no), packets:0, 
bytes:0, used:0.0s, actions:ovs-p1
 ])
@@ -2791,32 +2806,49 @@ 
recirc_id(<recirc>),in_port(ovs-p2),eth_type(0x0800),ipv4(frag=no), packets:0, b
 ufid=$(ovs-appctl dpctl/dump-flows -m 
filter='recirc_id(0),in_port(ovs-p1),ipv4' | parse_ufid)
 AT_CHECK([ovs-appctl ofproto/detrace $ufid $pmd_id | ofctl_strip | \
           sed -E 's/n_bytes=2(66|80),/n_bytes=294,/'], [0], [dnl
-cookie=0x12345678, n_packets=3, n_bytes=294, 
priority=100,ip,in_port=1,nw_dst=10.0.0.2,actions=resubmit(,1)
-table_id=1, n_packets=3, n_bytes=294, priority=200,ip,actions=group:1
+br0
+  cookie=0x12345678, n_packets=3, n_bytes=294, 
priority=100,ip,in_port=1,nw_dst=10.0.0.2,actions=resubmit(,1)
+  table_id=1, n_packets=3, n_bytes=294, priority=200,ip,actions=group:1
 ])
 
 ufid=$(ovs-appctl dpctl/dump-flows -m filter='in_port(ovs-p1),ipv4' | grep 
"ct(commit)" | parse_ufid)
 AT_CHECK([ovs-appctl ofproto/detrace $ufid $pmd_id | ofctl_strip | \
           sed -E 's/n_bytes=2(66|80),/n_bytes=294,/'], [0], [dnl
-group_id=1,type=select,selection_method=dp_hash,bucket=bucket_id:0,weight:100,actions=ct(commit,table=2)
+br0
+  
group_id=1,type=select,selection_method=dp_hash,bucket=bucket_id:0,weight:100,actions=ct(commit,table=2)
 ])
 
 ufid=$(ovs-appctl dpctl/dump-flows -m filter='in_port(ovs-p1),ipv4' | grep 
"actions:ovs-p2" | parse_ufid)
 AT_CHECK([ovs-appctl ofproto/detrace $ufid $pmd_id | ofctl_strip | \
-          sed -E 's/n_bytes=2(66|80),/n_bytes=294,/'], [0], [dnl
-table_id=2, n_packets=3, n_bytes=294, ip,actions=output:2
+          sed -E 's/n_bytes=2(66|80),/n_bytes=294,/' | \
+          sed 's/table_id=254, n_packets=[[0-9]]*, 
n_bytes=[[0-9]]*,/table_id=254,/'], [0], [dnl
+br0
+  table_id=2, n_packets=3, n_bytes=294, ip,actions=output:2,output:3
+br1
+  n_packets=3, n_bytes=294, ,actions=clone(resubmit(,1)),resubmit(,2)
+  table_id=1, n_packets=3, n_bytes=294, ip,actions=mod_nw_dst:10.0.0.3,IN_PORT
+br0
+  table_id=0, no match
+  table_id=254, priority=0,reg0=0x2,actions=drop
+br1
+  table_id=2, n_packets=3, n_bytes=294, ip,actions=IN_PORT
+br0
+  cookie=0x1234abcd, n_packets=3, n_bytes=294, 
priority=100,ip,in_port=3,nw_dst=10.0.0.2,actions=resubmit(,4)
+  table_id=4, ip,actions=drop
 ])
 
 ufid=$(ovs-appctl dpctl/dump-flows -m 
filter='recirc_id(0),in_port(ovs-p2),ipv4' | grep "ct," | parse_ufid)
 AT_CHECK([ovs-appctl ofproto/detrace $ufid $pmd_id | ofctl_strip | \
           sed -E 's/n_bytes=2(66|80),/n_bytes=294,/'], [0], [dnl
-cookie=0xabcedf, n_packets=3, n_bytes=294, 
priority=100,ip,in_port=2,nw_dst=10.0.0.1,actions=ct(table=3)
+br0
+  cookie=0xabcedf, n_packets=3, n_bytes=294, 
priority=100,ip,in_port=2,nw_dst=10.0.0.1,actions=ct(table=3)
 ])
 
 ufid=$(ovs-appctl dpctl/dump-flows -m filter='in_port(ovs-p2),ipv4' | grep 
"actions:ovs-p1" | parse_ufid)
 AT_CHECK([ovs-appctl ofproto/detrace $ufid $pmd_id | ofctl_strip | \
           sed -E 's/n_bytes=2(66|80),/n_bytes=294,/'], [0], [dnl
-table_id=3, n_packets=3, n_bytes=294, ip,actions=output:1
+br0
+  table_id=3, n_packets=3, n_bytes=294, ip,actions=output:1
 ])
 
 AT_CHECK([ovs-appctl revalidator/resume])
diff --git a/utilities/checkpatch_dict.txt b/utilities/checkpatch_dict.txt
index d40194a95..c1f43e5af 100644
--- a/utilities/checkpatch_dict.txt
+++ b/utilities/checkpatch_dict.txt
@@ -49,6 +49,7 @@ defragment
 deref
 dereference
 dest
+detrace
 dhcp
 dhcpv4
 dhcpv6
-- 
2.53.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to