For non-template API on top of HWS,
geneve options parser is created by the pmd and not by the user,
therefore during validation , the parser is not yet created.

The fix is to ignore the validation of geneve options in
case the rule is a non-template rule.
The parser will be created later during rule create.

Fixes: 80c676259a04 ("net/mlx5: validate HWS template items")
Cc: sta...@dpdk.org

Signed-off-by: Maayan Kashani <mkash...@nvidia.com>
Acked-by: Bing Zhao <bi...@nvidia.com>
---
 drivers/net/mlx5/mlx5_flow_hw.c | 35 ++++++++++++++++++++++++---------
 1 file changed, 26 insertions(+), 9 deletions(-)

diff --git a/drivers/net/mlx5/mlx5_flow_hw.c b/drivers/net/mlx5/mlx5_flow_hw.c
index 20d38ce4141..09157e30090 100644
--- a/drivers/net/mlx5/mlx5_flow_hw.c
+++ b/drivers/net/mlx5/mlx5_flow_hw.c
@@ -8475,10 +8475,11 @@ struct mlx5_hw_pattern_validation_ctx {
 };
 
 static int
-flow_hw_pattern_validate(struct rte_eth_dev *dev,
+__flow_hw_pattern_validate(struct rte_eth_dev *dev,
                         const struct rte_flow_pattern_template_attr *attr,
                         const struct rte_flow_item items[],
                         uint64_t *item_flags,
+                        bool nt_flow,
                         struct rte_flow_error *error)
 {
        struct mlx5_priv *priv = dev->data->dev_private;
@@ -8646,10 +8647,16 @@ flow_hw_pattern_validate(struct rte_eth_dev *dev,
                case RTE_FLOW_ITEM_TYPE_GENEVE_OPT:
                {
                        last_item = MLX5_FLOW_LAYER_GENEVE_OPT;
-                       ret = mlx5_flow_geneve_tlv_option_validate(priv, item,
-                                                                  error);
-                       if (ret < 0)
-                               return ret;
+                       /*
+                        * For non template the parser is internally created 
before
+                        * the flow creation.
+                        */
+                       if (!nt_flow) {
+                               ret = 
mlx5_flow_geneve_tlv_option_validate(priv, item,
+                                                                          
error);
+                               if (ret < 0)
+                                       return ret;
+                       }
                        break;
                }
                case RTE_FLOW_ITEM_TYPE_COMPARE:
@@ -8913,6 +8920,16 @@ flow_hw_pattern_validate(struct rte_eth_dev *dev,
        return 1 + RTE_PTR_DIFF(item, items) / sizeof(item[0]);
 }
 
+static int
+flow_hw_pattern_validate(struct rte_eth_dev *dev,
+                        const struct rte_flow_pattern_template_attr *attr,
+                        const struct rte_flow_item items[],
+                        uint64_t *item_flags,
+                        struct rte_flow_error *error)
+{
+       return __flow_hw_pattern_validate(dev, attr, items, item_flags, false, 
error);
+}
+
 /*
  * Verify that the tested flow patterns fits STE size limit in HWS group.
  *
@@ -14252,8 +14269,8 @@ static uintptr_t flow_hw_list_create(struct rte_eth_dev 
*dev,
        };
 
        /* Validate application items only */
-       ret = flow_hw_pattern_validate(dev, &pattern_template_attr, items,
-                                               &item_flags, error);
+       ret = __flow_hw_pattern_validate(dev, &pattern_template_attr, items,
+                                               &item_flags, true, error);
        if (ret < 0)
                return 0;
 
@@ -15388,8 +15405,8 @@ flow_hw_validate(struct rte_eth_dev *dev, const struct 
rte_flow_attr *attr,
 
        if (external) {
                /* Validate application items only */
-               ret = flow_hw_pattern_validate(dev, &pattern_template_attr, 
items,
-                                                   &item_flags, error);
+               ret = __flow_hw_pattern_validate(dev, &pattern_template_attr, 
items,
+                                                   &item_flags, true, error);
                if (ret < 0)
                        return -rte_errno;
        }
-- 
2.21.0

Reply via email to