Some values are interpreted without endian conversion and/or without taking the proper mask into account.
Fixes: 5ef3b79fdfe6 ("net/bnxt: support flow filter ops") Cc: sta...@dpdk.org Cc: Ajit Khaparde <ajit.khapa...@broadcom.com> Signed-off-by: Adrien Mazarguil <adrien.mazarg...@6wind.com> --- drivers/net/bnxt/bnxt_filter.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/net/bnxt/bnxt_filter.c b/drivers/net/bnxt/bnxt_filter.c index 96b382ba8..0f9c1c9ae 100644 --- a/drivers/net/bnxt/bnxt_filter.c +++ b/drivers/net/bnxt/bnxt_filter.c @@ -5,6 +5,7 @@ #include <sys/queue.h> +#include <rte_byteorder.h> #include <rte_log.h> #include <rte_malloc.h> #include <rte_flow.h> @@ -346,7 +347,8 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp, } /* Mask is not allowed. Only exact matches are */ - if ((eth_mask->type & UINT16_MAX) != UINT16_MAX) { + if (eth_mask->type && + eth_mask->type != RTE_BE16(0xffff)) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, item, @@ -372,7 +374,7 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp, * RTE_LOG(ERR, PMD, "Handle this condition\n"); * } */ - if (eth_spec->type) { + if (eth_mask->type) { filter->ethertype = rte_be_to_cpu_16(eth_spec->type); en |= use_ntuple ? @@ -384,13 +386,15 @@ bnxt_validate_and_parse_flow_type(struct bnxt *bp, case RTE_FLOW_ITEM_TYPE_VLAN: vlan_spec = item->spec; vlan_mask = item->mask; - if (vlan_mask->tci & 0xFFFF && !vlan_mask->tpid) { + if (vlan_mask->tci && + vlan_mask->tci == RTE_BE16(0x0fff) && + !vlan_mask->tpid) { /* Only the VLAN ID can be matched. */ filter->l2_ovlan = rte_be_to_cpu_16(vlan_spec->tci & - 0xFFF); + RTE_BE16(0x0fff)); en |= EM_FLOW_ALLOC_INPUT_EN_OVLAN_VID; - } else { + } else if (vlan_mask->tci || vlan_mask->tpid) { rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ITEM, item, -- 2.11.0