Skip to content

Commit

Permalink
ethdev: fix GENEVE option item conversion
Browse files Browse the repository at this point in the history
The "rte_flow_conv()" function, enables, among other things, to copy
item list.

For GENEVE option item, the function copies it without considering deep
copy. It copies the "data" pointer without copying the pointed values.

This patch adds deep copy for after regular copy.

Fixes: 2b4c72b ("ethdev: introduce GENEVE header TLV option item")
Cc: stable@dpdk.org

Signed-off-by: Michael Baum <michaelba@nvidia.com>
Acked-by: Ferruh Yigit <ferruh.yigit@amd.com>
  • Loading branch information
michaelbaum1 authored and ferruhy committed Jul 19, 2024
1 parent 39fe341 commit 747c4cd
Showing 1 changed file with 25 additions and 4 deletions.
29 changes: 25 additions & 4 deletions lib/ethdev/rte_flow.c
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,7 @@ rte_flow_conv_item_spec(void *buf, const size_t size,
switch (item->type) {
union {
const struct rte_flow_item_raw *raw;
const struct rte_flow_item_geneve_opt *geneve_opt;
} spec;
union {
const struct rte_flow_item_raw *raw;
Expand All @@ -632,10 +633,13 @@ rte_flow_conv_item_spec(void *buf, const size_t size,
} mask;
union {
const struct rte_flow_item_raw *raw;
const struct rte_flow_item_geneve_opt *geneve_opt;
} src;
union {
struct rte_flow_item_raw *raw;
struct rte_flow_item_geneve_opt *geneve_opt;
} dst;
void *deep_src;
size_t tmp;

case RTE_FLOW_ITEM_TYPE_RAW:
Expand Down Expand Up @@ -664,13 +668,30 @@ rte_flow_conv_item_spec(void *buf, const size_t size,
tmp = last.raw->length & mask.raw->length;
if (tmp) {
off = RTE_ALIGN_CEIL(off, sizeof(*dst.raw->pattern));
if (size >= off + tmp)
dst.raw->pattern = rte_memcpy
((void *)((uintptr_t)dst.raw + off),
src.raw->pattern, tmp);
if (size >= off + tmp) {
deep_src = (void *)((uintptr_t)dst.raw + off);
dst.raw->pattern = rte_memcpy(deep_src,
src.raw->pattern,
tmp);
}
off += tmp;
}
break;
case RTE_FLOW_ITEM_TYPE_GENEVE_OPT:
off = rte_flow_conv_copy(buf, data, size,
rte_flow_desc_item, item->type);
spec.geneve_opt = item->spec;
src.geneve_opt = data;
dst.geneve_opt = buf;
tmp = spec.geneve_opt->option_len << 2;
if (size > 0 && src.geneve_opt->data) {
deep_src = (void *)((uintptr_t)(dst.geneve_opt + 1));
dst.geneve_opt->data = rte_memcpy(deep_src,
src.geneve_opt->data,
tmp);
}
off += tmp;
break;
default:
off = rte_flow_conv_copy(buf, data, size,
rte_flow_desc_item, item->type);
Expand Down

0 comments on commit 747c4cd

Please sign in to comment.