scsi: qedi: Add packet filter in light L2 Rx path.
authorManish Rangankar <manish.rangankar@cavium.com>
Wed, 21 Nov 2018 09:25:20 +0000 (01:25 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 29 Nov 2018 01:51:47 +0000 (20:51 -0500)
Add packet filter to avoid unnecessary packet processing in iscsiuio.

Signed-off-by: Manish Rangankar <manish.rangankar@cavium.com>
Reviewed-by: Lee Duncan <lduncan@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qedi/qedi_main.c

index 713db9cfae7f7a42ded96f557657e2919be948d7..2621deeed0cdb98d103b47e194836dd25cf9e30c 100644 (file)
@@ -659,6 +659,7 @@ static int qedi_ll2_rx(void *cookie, struct sk_buff *skb, u32 arg1, u32 arg2)
        struct qedi_uio_dev *udev;
        struct qedi_uio_ctrl *uctrl;
        struct skb_work_list *work;
+       struct ethhdr *eh;
        u32 prod;
 
        if (!qedi) {
@@ -673,6 +674,29 @@ static int qedi_ll2_rx(void *cookie, struct sk_buff *skb, u32 arg1, u32 arg2)
                return 0;
        }
 
+       eh = (struct ethhdr *)skb->data;
+       /* Undo VLAN encapsulation */
+       if (eh->h_proto == htons(ETH_P_8021Q)) {
+               memmove((u8 *)eh + VLAN_HLEN, eh, ETH_ALEN * 2);
+               eh = (struct ethhdr *)skb_pull(skb, VLAN_HLEN);
+               skb_reset_mac_header(skb);
+       }
+
+       /* Filter out non FIP/FCoE frames here to free them faster */
+       if (eh->h_proto != htons(ETH_P_ARP) &&
+           eh->h_proto != htons(ETH_P_IP) &&
+           eh->h_proto != htons(ETH_P_IPV6)) {
+               QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
+                         "Dropping frame ethertype [0x%x] len [0x%x].\n",
+                         eh->h_proto, skb->len);
+               kfree_skb(skb);
+               return 0;
+       }
+
+       QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
+                 "Allowed frame ethertype [0x%x] len [0x%x].\n",
+                 eh->h_proto, skb->len);
+
        udev = qedi->udev;
        uctrl = udev->uctrl;