diff mbox

[ovs-dev] ofp-parse: Fix match parsing with [x..y]=z format.

Message ID 1492133466-38862-1-git-send-email-jarno@ovn.org
State Accepted
Headers show

Commit Message

Jarno Rajahalme April 14, 2017, 1:31 a.m. UTC
Commit 21b2fa617126 ("ofp-parse: Allow match field names in actions
and brackets in matches.") added support for matching a consecutive
set of bits with the [x..y]=z format, but the copying of the parsed
value ('z') to the match was done from a wrong offset, so that the
actual value matched would be incorrect.

Fix this and add a test case preventing regression in future.

Fixes: 21b2fa617126 ("ofp-parse: Allow match field names in actions and brackets in matches.")
Signed-off-by: Jarno Rajahalme <jarno@ovn.org>
---
 lib/ofp-parse.c    | 6 +++---
 tests/ovs-ofctl.at | 2 ++
 2 files changed, 5 insertions(+), 3 deletions(-)

Comments

Ben Pfaff April 15, 2017, 3:58 a.m. UTC | #1
On Thu, Apr 13, 2017 at 06:31:06PM -0700, Jarno Rajahalme wrote:
> Commit 21b2fa617126 ("ofp-parse: Allow match field names in actions
> and brackets in matches.") added support for matching a consecutive
> set of bits with the [x..y]=z format, but the copying of the parsed
> value ('z') to the match was done from a wrong offset, so that the
> actual value matched would be incorrect.
> 
> Fix this and add a test case preventing regression in future.
> 
> Fixes: 21b2fa617126 ("ofp-parse: Allow match field names in actions and brackets in matches.")
> Signed-off-by: Jarno Rajahalme <jarno@ovn.org>

Oops, thanks for the fix!

Should the test try a multibit match too, for completeness?

Acked-by: Ben Pfaff <blp@ovn.org>
Jarno Rajahalme April 17, 2017, 6:44 p.m. UTC | #2
> On Apr 14, 2017, at 8:58 PM, Ben Pfaff <blp@ovn.org> wrote:
> 
> On Thu, Apr 13, 2017 at 06:31:06PM -0700, Jarno Rajahalme wrote:
>> Commit 21b2fa617126 ("ofp-parse: Allow match field names in actions
>> and brackets in matches.") added support for matching a consecutive
>> set of bits with the [x..y]=z format, but the copying of the parsed
>> value ('z') to the match was done from a wrong offset, so that the
>> actual value matched would be incorrect.
>> 
>> Fix this and add a test case preventing regression in future.
>> 
>> Fixes: 21b2fa617126 ("ofp-parse: Allow match field names in actions and brackets in matches.")
>> Signed-off-by: Jarno Rajahalme <jarno@ovn.org>
> 
> Oops, thanks for the fix!
> 
> Should the test try a multibit match too, for completeness?
> 

Pushed to master and branch-2.7 with an additional multibit match. Thanks for the review!

  Jarno

> Acked-by: Ben Pfaff <blp@ovn.org>
diff mbox

Patch

diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c
index 7826bc5..c8cac5b 100644
--- a/lib/ofp-parse.c
+++ b/lib/ofp-parse.c
@@ -290,11 +290,11 @@  parse_subfield(const char *name, const char *str_value, struct match *match,
 
         const struct mf_field *field = sf.field;
         union mf_value value, mask;
-        unsigned int size = DIV_ROUND_UP(sf.n_bits, 8);
+        unsigned int size = field->n_bytes;
 
         mf_get(field, match, &value, &mask);
-        bitwise_copy(&val, size, 0, &value, field->n_bytes, sf.ofs, sf.n_bits);
-        bitwise_one (               &mask,  field->n_bytes, sf.ofs, sf.n_bits);
+        bitwise_copy(&val, size, 0, &value, size, sf.ofs, sf.n_bits);
+        bitwise_one (               &mask,  size, sf.ofs, sf.n_bits);
         *usable_protocols &= mf_set(field, &value, &mask, match, &error);
     }
     return error;
diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at
index 737f609..18ab788 100644
--- a/tests/ovs-ofctl.at
+++ b/tests/ovs-ofctl.at
@@ -285,6 +285,7 @@  AT_CLEANUP
 AT_SETUP([ovs-ofctl parse-flows (OpenFlow 1.2)])
 AT_DATA([flows.txt], [[
 # comment
+tcp,tp_src[5]=1,actions=flood
 tcp,tp_src=123,actions=flood
 in_port=LOCAL dl_vlan=9 dl_src=00:0A:E4:25:6B:B0 actions=mod_vlan_vid:7,mod_vlan_pcp:2
 udp dl_vlan_pcp=7 idle_timeout=5 actions=strip_vlan output:0
@@ -309,6 +310,7 @@  AT_CHECK([ovs-ofctl --protocols OpenFlow12 parse-flows flows.txt
 AT_CHECK([[sed 's/ (xid=0x[0-9a-fA-F]*)//' stdout]], [0],
 [[usable protocols: NXM,OXM
 chosen protocol: OXM-OpenFlow12
+OFPT_FLOW_MOD (OF1.2): ADD tcp,tp_src=0x20/0x20 actions=FLOOD
 OFPT_FLOW_MOD (OF1.2): ADD tcp,tp_src=123 actions=FLOOD
 OFPT_FLOW_MOD (OF1.2): ADD in_port=LOCAL,dl_vlan=9,dl_src=00:0a:e4:25:6b:b0 actions=set_field:4103->vlan_vid,set_field:2->vlan_pcp
 OFPT_FLOW_MOD (OF1.2): ADD udp,dl_vlan_pcp=7 idle:5 actions=pop_vlan,output:0