[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