This commit fixes a bug in the parse_flag() function which causes failure of parsing tunnel flags like:
tunnel(tun_id=0x0,src=1.2.3.4,dst=1.2.3.5,tos=0,ttl=64,flags(-df+csum+key)) Reported-by: Jacob Cherkas <[email protected]> Signed-off-by: Alex Wang <[email protected]> --- PATCH->V2: - Add test in tests/odp.at. --- lib/odp-util.c | 12 +++++++----- tests/odp.at | 4 ++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/odp-util.c b/lib/odp-util.c index b82edb7..962b84b 100644 --- a/lib/odp-util.c +++ b/lib/odp-util.c @@ -231,21 +231,22 @@ parse_flags(const char *s, const char *(*bit_to_string)(uint32_t), uint32_t flags = 0, mask = 0; /* Parse masked flags. */ - while (s[n] != ')') { + while (s[0] != ')') { bool set; uint32_t bit; int name_len; - if (s[n] == '+') { + if (s[0] == '+') { set = true; - } else if (s[n] == '-') { + } else if (s[0] == '-') { set = false; } else { return -EINVAL; } + s++; n++; - name_len = strcspn(s + n, "+-)"); + name_len = strcspn(s, "+-)"); for (bit = 1; bit; bit <<= 1) { const char *fname = bit_to_string(bit); @@ -259,7 +260,7 @@ parse_flags(const char *s, const char *(*bit_to_string)(uint32_t), if (len != name_len) { continue; } - if (!strncmp(s + n, fname, len)) { + if (!strncmp(s, fname, len)) { if (mask & bit) { /* bit already set. */ return -EINVAL; @@ -279,6 +280,7 @@ parse_flags(const char *s, const char *(*bit_to_string)(uint32_t), return -EINVAL; /* Unknown flag name */ } s += name_len; + n += name_len; } *res_flags = flags; diff --git a/tests/odp.at b/tests/odp.at index c356487..16a58e7 100644 --- a/tests/odp.at +++ b/tests/odp.at @@ -120,6 +120,10 @@ skb_mark(0x1234/0xfff0),in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14: sed 's/^/tunnel(tun_id=0x7f10354\/0xff,src=10.10.10.10\/255.255.255.0,dst=20.20.20.20\/255.255.255.0,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(csum,key)),/' odp-base.txt echo + echo '# Valid forms with tunnel header (wildcard flag).' + sed 's/^/tunnel(tun_id=0x7f10354\/0xff,src=10.10.10.10\/255.255.255.0,dst=20.20.20.20\/255.255.255.0,tos=0,ttl=64,tp_src=0,tp_dst=0,gbp_id=0,gbp_flags=0,flags(-df+csum+key)),/' odp-base.txt + + echo echo '# Valid forms with VLAN header.' sed 's/\(eth([[^)]]*)\),*/\1,eth_type(0x8100),vlan(vid=99,pcp=7),encap(/ s/$/)/' odp-base.txt -- 1.7.9.5 _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
