Flow director masks IPv6 addresses per byte, but the parser only accepts
masks that cover either the whole address or none of it.

Accept masks where each byte is either fully masked or unmasked.

Fixes: ea0f9067b2cf ("net/ixgbe: reimplement FDIR parser")

Signed-off-by: Anatoly Burakov <[email protected]>
---
 drivers/net/intel/ixgbe/ixgbe_flow_fdir.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/drivers/net/intel/ixgbe/ixgbe_flow_fdir.c 
b/drivers/net/intel/ixgbe/ixgbe_flow_fdir.c
index 13df5eea810..9c9dc8846fa 100644
--- a/drivers/net/intel/ixgbe/ixgbe_flow_fdir.c
+++ b/drivers/net/intel/ixgbe/ixgbe_flow_fdir.c
@@ -207,6 +207,7 @@ ixgbe_validate_fdir_normal_ipv6(const void *ctx,
        const struct ixgbe_fdir_ctx *fdir_ctx = ctx;
        const struct rte_flow_item_ipv6 *ipv6_mask = ci_flow_item_mask(item);
        const struct ixgbe_fdir_rule *rule = &fdir_ctx->rule;
+       uint8_t i;
 
        if (rule->mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN) {
                return rte_flow_error_set(error, EINVAL,
@@ -229,15 +230,13 @@ ixgbe_validate_fdir_normal_ipv6(const void *ctx,
                                "Only src/dst addresses supported");
        }
 
-       if (!CI_FIELD_IS_ZERO_OR_MASKED(&ipv6_mask->hdr.src_addr)) {
-               return rte_flow_error_set(error, EINVAL,
-                               RTE_FLOW_ERROR_TYPE_ITEM, item,
-                               "Partial src address masks not supported");
-       }
-       if (!CI_FIELD_IS_ZERO_OR_MASKED(&ipv6_mask->hdr.dst_addr)) {
-               return rte_flow_error_set(error, EINVAL,
-                               RTE_FLOW_ERROR_TYPE_ITEM, item,
-                               "Partial dst address masks not supported");
+       for (i = 0; i < sizeof(ipv6_mask->hdr.src_addr); i++) {
+               if (!CI_FIELD_IS_ZERO_OR_MASKED(&ipv6_mask->hdr.src_addr.a[i]) 
||
+                   !CI_FIELD_IS_ZERO_OR_MASKED(&ipv6_mask->hdr.dst_addr.a[i])) 
{
+                       return rte_flow_error_set(error, EINVAL,
+                                       RTE_FLOW_ERROR_TYPE_ITEM, item,
+                                       "Partial address byte masks not 
supported");
+               }
        }
 
        return 0;
-- 
2.52.0

Reply via email to