RDMA/bnxt_re: Check if the vlan is valid before reporting
authorSelvin Xavier <selvin.xavier@broadcom.com>
Wed, 15 Sep 2021 12:32:42 +0000 (05:32 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 26 Nov 2021 09:47:14 +0000 (10:47 +0100)
[ Upstream commit 6bda39149d4b8920fdb8744090653aca3daa792d ]

When VF is configured with default vlan, HW strips the vlan from the
packet and driver receives it in Rx completion. VLAN needs to be reported
for UD work completion only if the vlan is configured on the host. Add a
check for valid vlan in the UD receive path.

Link: https://lore.kernel.org/r/1631709163-2287-12-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/hw/bnxt_re/ib_verbs.c

index a96f9142fe08e6baa0da647e4f9255f3ef6e177c..dd006b177b54444014c1dd498430d2b937b4ae70 100644 (file)
@@ -3081,8 +3081,11 @@ static void bnxt_re_process_res_ud_wc(struct bnxt_re_qp *qp,
                                      struct ib_wc *wc,
                                      struct bnxt_qplib_cqe *cqe)
 {
+       struct bnxt_re_dev *rdev;
+       u16 vlan_id = 0;
        u8 nw_type;
 
+       rdev = qp->rdev;
        wc->opcode = IB_WC_RECV;
        wc->status = __rc_to_ib_wc_status(cqe->status);
 
@@ -3094,9 +3097,12 @@ static void bnxt_re_process_res_ud_wc(struct bnxt_re_qp *qp,
                memcpy(wc->smac, cqe->smac, ETH_ALEN);
                wc->wc_flags |= IB_WC_WITH_SMAC;
                if (cqe->flags & CQ_RES_UD_FLAGS_META_FORMAT_VLAN) {
-                       wc->vlan_id = (cqe->cfa_meta & 0xFFF);
-                       if (wc->vlan_id < 0x1000)
-                               wc->wc_flags |= IB_WC_WITH_VLAN;
+                       vlan_id = (cqe->cfa_meta & 0xFFF);
+               }
+               /* Mark only if vlan_id is non zero */
+               if (vlan_id && bnxt_re_check_if_vlan_valid(rdev, vlan_id)) {
+                       wc->vlan_id = vlan_id;
+                       wc->wc_flags |= IB_WC_WITH_VLAN;
                }
                nw_type = (cqe->flags & CQ_RES_UD_FLAGS_ROCE_IP_VER_MASK) >>
                           CQ_RES_UD_FLAGS_ROCE_IP_VER_SFT;