ixgbe: fix wrong offset to fc_frame_header in ixgbe_fcoe_ddp
authorYi Zou <yi.zou@intel.com>
Tue, 18 May 2010 16:00:05 +0000 (16:00 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 19 May 2010 02:44:18 +0000 (19:44 -0700)
Make sure we point to the right offset of the fc_frame_header when
VLAN header exists and HW has VLAN stripping disabled.

Signed-off-by: Yi Zou <yi.zou@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ixgbe/ixgbe_fcoe.c

index 6493049..a82d2fc 100644 (file)
@@ -32,6 +32,7 @@
 #endif /* CONFIG_IXGBE_DCB */
 #include <linux/if_ether.h>
 #include <linux/gfp.h>
+#include <linux/if_vlan.h>
 #include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_device.h>
 #include <scsi/fc/fc_fs.h>
@@ -312,10 +313,12 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
        if (fcerr == IXGBE_FCERR_BADCRC)
                skb->ip_summed = CHECKSUM_NONE;
 
-       skb_reset_network_header(skb);
-       skb_set_transport_header(skb, skb_network_offset(skb) +
-                                sizeof(struct fcoe_hdr));
-       fh = (struct fc_frame_header *)skb_transport_header(skb);
+       if (eth_hdr(skb)->h_proto == htons(ETH_P_8021Q))
+               fh = (struct fc_frame_header *)(skb->data +
+                       sizeof(struct vlan_hdr) + sizeof(struct fcoe_hdr));
+       else
+               fh = (struct fc_frame_header *)(skb->data +
+                       sizeof(struct fcoe_hdr));
        fctl = ntoh24(fh->fh_f_ctl);
        if (fctl & FC_FC_EX_CTX)
                xid =  be16_to_cpu(fh->fh_ox_id);