[ovs-dev] [PATCH] lib/tc: fix parse act pedit for tos rewrite

wenxu at ucloud.cn wenxu at ucloud.cn
Tue Nov 24 03:01:09 UTC 2020


From: wenxu <wenxu at ucloud.cn>

Check overlap between current pedit key, which is always 4 bytes
(range [off, off + 3]), and a map entry in flower_pedit_map
sf = ROUND_DOWN(mf, 4) (range [sf|mf, (mf + sz - 1)|ef]).

So for the tos the rewite the off + 3(3) is greater than mf,
and should less than ef(4) but not mf+sz(2).

Signed-off-by: wenxu <wenxu at ucloud.cn>
---
 lib/tc.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/lib/tc.c b/lib/tc.c
index 8761304..c2de78b 100644
--- a/lib/tc.c
+++ b/lib/tc.c
@@ -1003,6 +1003,7 @@ nl_parse_act_pedit(struct nlattr *options, struct tc_flower *flower)
             int flower_off = m->flower_offset;
             int sz = m->size;
             int mf = m->offset;
+            int ef = ROUND_UP(mf, 4);
 
             if (m->htype != type) {
                continue;
@@ -1010,9 +1011,10 @@ nl_parse_act_pedit(struct nlattr *options, struct tc_flower *flower)
 
             /* check overlap between current pedit key, which is always
              * 4 bytes (range [off, off + 3]), and a map entry in
-             * flower_pedit_map (range [mf, mf + sz - 1]) */
+             * flower_pedit_map sf = ROUND_DOWN(mf, 4)
+             * (range [sf|mf, (mf + sz - 1)|ef]) */
             if ((keys->off >= mf && keys->off < mf + sz)
-                || (keys->off + 3 >= mf && keys->off + 3 < mf + sz)) {
+                || (keys->off + 3 >= mf && keys->off + 3 < ef)) {
                 int diff = flower_off + (keys->off - mf);
                 ovs_be32 *dst = (void *) (rewrite_key + diff);
                 ovs_be32 *dst_m = (void *) (rewrite_mask + diff);
-- 
1.8.3.1



More information about the dev mailing list