In case the PMD was activated over VERB API, limit IPv6 flow item next protocol mask value to 0 or 0xFF. The limitation is required for RSS flow action TCP and UDP types.
Cc: sta...@dpdk.org Fixes: 491757372f98 ("net/mlx5: enforce limitation on IPv6 next protocol") Signed-off-by: Gregory Etelson <getel...@nvidia.com> Acked-by: Matan Azrad <ma...@nvidia.com> --- drivers/net/mlx5/mlx5_flow.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index 312649b732..97f05d7d30 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -2562,8 +2562,6 @@ mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item, RTE_FLOW_ERROR_TYPE_ITEM, item, "IPv6 cannot follow L2/VLAN layer " "which ether type is not IPv6"); - if (mask && mask->hdr.proto == UINT8_MAX && spec) - next_proto = spec->hdr.proto; if (item_flags & MLX5_FLOW_LAYER_TUNNEL) { if (next_proto == IPPROTO_IPIP || next_proto == IPPROTO_IPV6) return rte_flow_error_set(error, EINVAL, @@ -2572,16 +2570,6 @@ mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item, "multiple tunnel " "not supported"); } - if (next_proto == IPPROTO_HOPOPTS || - next_proto == IPPROTO_ROUTING || - next_proto == IPPROTO_FRAGMENT || - next_proto == IPPROTO_ESP || - next_proto == IPPROTO_AH || - next_proto == IPPROTO_DSTOPTS) - return rte_flow_error_set(error, EINVAL, - RTE_FLOW_ERROR_TYPE_ITEM, item, - "IPv6 proto (next header) should " - "not be set as extension header"); if (item_flags & MLX5_FLOW_LAYER_IPIP) return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, item, @@ -2609,6 +2597,21 @@ mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item, MLX5_ITEM_RANGE_NOT_ACCEPTED, error); if (ret < 0) return ret; + if (mask->hdr.proto != 0 && mask->hdr.proto != 0xff) + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM_MASK, mask, + "partial mask is not supported for protocol"); + next_proto = spec->hdr.proto & mask->hdr.proto; + if (next_proto == IPPROTO_HOPOPTS || + next_proto == IPPROTO_ROUTING || + next_proto == IPPROTO_FRAGMENT || + next_proto == IPPROTO_ESP || + next_proto == IPPROTO_AH || + next_proto == IPPROTO_DSTOPTS) + return rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_ITEM, item, + "IPv6 proto (next header) should " + "not be set as extension header"); return 0; } -- 2.35.1