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