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: c23626f27b09 ("ethdev: add MPLS header modification")
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 2b2ae62618..d8ed1ed6f6 100644
--- a/drivers/net/mlx5/mlx5_flow.c
+++ b/drivers/net/mlx5/mlx5_flow.c
@@ -2384,7 +2384,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 bcf43f5457..5b269b9c82 100644
--- a/drivers/net/mlx5/mlx5_flow_hw.c
+++ b/drivers/net/mlx5/mlx5_flow_hw.c
@@ -5036,7 +5036,8 @@ flow_hw_validate_action_modify_field(struct rte_eth_dev 
*dev,
        ret = flow_validate_modify_field_level(&action_conf->dst, 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,
@@ -5061,7 +5062,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

Reply via email to