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.

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]>
---
 ofproto/ofproto-dpif-xlate-cache.c | 15 +++++++++
 tests/system-traffic.at            | 51 ++++++++++++++++++++++++------
 utilities/checkpatch_dict.txt      |  1 +
 3 files changed, 57 insertions(+), 10 deletions(-)

diff --git a/ofproto/ofproto-dpif-xlate-cache.c 
b/ofproto/ofproto-dpif-xlate-cache.c
index c6d935cf0..a225a1b70 100644
--- a/ofproto/ofproto-dpif-xlate-cache.c
+++ b/ofproto/ofproto-dpif-xlate-cache.c
@@ -305,6 +305,7 @@ xlate_cache_steal_entries(struct xlate_cache *dst, struct 
xlate_cache *src)
 void
 xlate_xcache_format(struct ds *s, const struct xlate_cache *xcache)
 {
+    struct ofproto_dpif *last_ofproto = NULL;
     struct ofpbuf entries = xcache->entries;
     struct xc_entry *entry;
     struct ofgroup *ofg;
@@ -312,16 +313,30 @@ xlate_xcache_format(struct ds *s, const struct 
xlate_cache *xcache)
     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:
+            ds_put_cstr(s, "  ");
             ofg = &entry->group.group->up;
             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) {
+                ds_put_format(s, "%s\n", entry->table.ofproto->up.name);
+                last_ofproto = entry->table.ofproto;
+            }
+            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..ea0dc5ec3 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,48 @@ 
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)
+  
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