From e65f082adbf62a17dc1759c8af532811672095c3 Mon Sep 17 00:00:00 2001 From: Adrien Mazarguil Date: Thu, 19 Apr 2018 12:07:31 +0200 Subject: [PATCH] net/bnxt: fix matching of flow API item masks 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: stable@dpdk.org Signed-off-by: Adrien Mazarguil Acked-by: Ferruh Yigit --- 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 9351460c25..fdd94bf02e 100644 --- a/drivers/net/bnxt/bnxt_filter.c +++ b/drivers/net/bnxt/bnxt_filter.c @@ -5,6 +5,7 @@ #include +#include #include #include #include @@ -354,7 +355,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, @@ -380,7 +382,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 ? @@ -392,13 +394,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.20.1