In the rte_flow_field_data structure, the flex item handle is part of union with other members like level/tag_index.
If the user wants to modify the flex item as source or destination, there should not be any checking against zero. Signed-off-by: Rongwei Liu <rongw...@nvidia.com> Fixes: 7ea38955b ("ethdev: update MPLS header modification API") Cc: michae...@nvidia.com Cc: sta...@dpdk.org Acked-by: Dariusz Sosnowski <dsosnow...@nvidia.com> --- drivers/net/mlx5/mlx5_flow.c | 2 +- drivers/net/mlx5/mlx5_flow_hw.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index 3c306a5f70..9caecc3db6 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -2369,7 +2369,7 @@ int flow_validate_modify_field_level(const struct rte_flow_field_data *data, struct rte_flow_error *error) { - if (data->level == 0) + if (data->level == 0 || data->field == RTE_FLOW_FIELD_FLEX_ITEM) return 0; if (data->field != RTE_FLOW_FIELD_TAG && data->field != (enum rte_flow_field_id)MLX5_RTE_FLOW_FIELD_META_REG) { diff --git a/drivers/net/mlx5/mlx5_flow_hw.c b/drivers/net/mlx5/mlx5_flow_hw.c index efbf88f56d..6dde19c1b9 100644 --- a/drivers/net/mlx5/mlx5_flow_hw.c +++ b/drivers/net/mlx5/mlx5_flow_hw.c @@ -6104,7 +6104,8 @@ flow_hw_validate_action_modify_field(struct rte_eth_dev *dev, ret = flow_hw_validate_modify_field_level(&action_conf->dst, false, error); if (ret) return ret; - if (!flow_hw_modify_field_is_geneve_opt(action_conf->dst.field)) { + if (action_conf->dst.field != RTE_FLOW_FIELD_FLEX_ITEM && + !flow_hw_modify_field_is_geneve_opt(action_conf->dst.field)) { if (action_conf->dst.tag_index && !flow_modify_field_support_tag_array(action_conf->dst.field)) return rte_flow_error_set(error, EINVAL, @@ -6129,7 +6130,8 @@ flow_hw_validate_action_modify_field(struct rte_eth_dev *dev, "destination field mask and template are not equal"); if (action_conf->src.field != RTE_FLOW_FIELD_POINTER && action_conf->src.field != RTE_FLOW_FIELD_VALUE) { - if (!flow_hw_modify_field_is_geneve_opt(action_conf->src.field)) { + if (action_conf->src.field != RTE_FLOW_FIELD_FLEX_ITEM && + !flow_hw_modify_field_is_geneve_opt(action_conf->src.field)) { if (action_conf->src.tag_index && !flow_modify_field_support_tag_array(action_conf->src.field)) return rte_flow_error_set(error, EINVAL, -- 2.27.0