ovs-ofctl needs to mask the allowed protocols with the usable protocols
after calling parse_ofp_str() so that only usable protocols will be
negotiated.

This problem became apparent to me after 8621547cc94ad910
("lib/ofp-actions: Enforce action consistency.") as it allows
parse_ofp_str() to reduce the maximum usable protocol. As the highest
mutually supported protocol is negotiated this can easily lead to
negotiation of a protocol that is not allowed.

Also add a for this case.  And another test that that the allowed protocols
is honoured even when usable protocols doesn't restrict it - which works
even without the code-change in this patch.

Cc: Jarno Rajahalme <jrajaha...@nicira.com>
Signed-off-by: Simon Horman <ho...@verge.net.au>
---
 tests/ovs-ofctl.at    | 23 +++++++++++++++++++++++
 utilities/ovs-ofctl.c |  6 +++++-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at
index a99a161..5e7fa3c 100644
--- a/tests/ovs-ofctl.at
+++ b/tests/ovs-ofctl.at
@@ -2524,3 +2524,26 @@ AT_CHECK([tail -1 stdout], [0],
 
 OVS_VSWITCHD_STOP
 AT_CLEANUP
+
+AT_SETUP([ovs-ofctl - honour allowed protocols])
+OVS_VSWITCHD_START
+AT_CHECK([ovs-ofctl -vwarn -O OpenFlow10,OpenFlow12 add-flow br0 
actions=drop], [0], [], [])
+AT_CHECK([grep "version bitmap" ovs-vswitchd.log], [0], [dnl
+ version bitmap: 0x01, 0x02, 0x03, 0x04
+ version bitmap: 0x01, 0x03
+])
+OVS_VSWITCHD_STOP
+AT_CLEANUP
+
+dnl The actions are inconsistent as strip_vlan should be accompanied
+dnl by a VLAN match. This causes the allowed protocols to be
+dnl downgraded to only OpenFlow10.
+AT_SETUP([ovs-ofctl - downgrade to allowed protocol])
+OVS_VSWITCHD_START
+AT_CHECK([ovs-ofctl -vwarn -O OpenFlow10,OpenFlow12 add-flow br0 
actions=strip_vlan], [0], [], [])
+AT_CHECK([grep "version bitmap" ovs-vswitchd.log], [0], [dnl
+ version bitmap: 0x01, 0x02, 0x03, 0x04
+ version bitmap: 0x01
+])
+OVS_VSWITCHD_STOP
+AT_CLEANUP
diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
index a0dc5c8..574be55 100644
--- a/utilities/ovs-ofctl.c
+++ b/utilities/ovs-ofctl.c
@@ -1084,9 +1084,13 @@ open_vconn_for_flow_mod(const char *remote, struct vconn 
**vconnp,
                   "allowed flow formats (%s)", usable_s, allowed_s);
     }
 
+    /* Restrict allowed protocols to usable protocols */
+    mask_allowed_ofp_versions(ofputil_protocols_to_version_bitmap(
+                                  usable_protocols));
+
     /* If the initial flow format is allowed and usable, keep it. */
     cur_protocol = open_vconn(remote, vconnp);
-    if (usable_protocols & allowed_protocols & cur_protocol) {
+    if (allowed_protocols & cur_protocol) {
         return cur_protocol;
     }
 
-- 
1.8.4

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to