i40e: check for possible incorrect ipv6 checksum
authorShannon Nelson <shannon.nelson@intel.com>
Sat, 21 Dec 2013 05:44:46 +0000 (05:44 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 11 Jan 2014 00:30:34 +0000 (16:30 -0800)
If the IPV6EXADD bit is set in the Rx descriptor status, there
was an optional extension header with an alternate IP address
detected.  The HW checksum offload doesn't handle the alternate
IP address correctly so likely comes up with the wrong answer.
Thus, if the bit is set we ignore the checksum offload value.

Change-ID: I70ff8d38cdcddccf44107691cae13d0c07c284c8
Signed-off-by: Shannon Nelson <shannon.nelson@intel.com>
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: Kavindya Deegala <kavindya.s.deegala@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_txrx.c
drivers/net/ethernet/intel/i40e/i40e_type.h

index 43d88dd66ed4d6d5b55f86c03e16ac3070cd2e09..946d8b1d9a4d056e66322b4fcd108ab4112d2599 100644 (file)
@@ -892,6 +892,10 @@ static inline void i40e_rx_checksum(struct i40e_vsi *vsi,
              rx_status & (1 << I40E_RX_DESC_STATUS_L3L4P_SHIFT)))
                return;
 
+       /* likely incorrect csum if alternate IP extention headers found */
+       if (rx_status & (1 << I40E_RX_DESC_STATUS_IPV6EXADD_SHIFT))
+               return;
+
        /* IP or L4 or outmost IP checksum error */
        if (rx_error & ((1 << I40E_RX_DESC_ERROR_IPE_SHIFT) |
                        (1 << I40E_RX_DESC_ERROR_L4E_SHIFT) |
index 072c8508706b05d20376cc717c90a0293c24209e..80cf24020f1704f51f084bad807675dfdda21499 100644 (file)
@@ -499,7 +499,9 @@ enum i40e_rx_desc_status_bits {
        I40E_RX_DESC_STATUS_FLM_SHIFT           = 11,
        I40E_RX_DESC_STATUS_FLTSTAT_SHIFT       = 12, /* 2 BITS */
        I40E_RX_DESC_STATUS_LPBK_SHIFT          = 14,
-       I40E_RX_DESC_STATUS_UDP_0_SHIFT         = 16
+       I40E_RX_DESC_STATUS_IPV6EXADD_SHIFT     = 15,
+       I40E_RX_DESC_STATUS_RESERVED_SHIFT      = 16, /* 2 BITS */
+       I40E_RX_DESC_STATUS_UDP_0_SHIFT         = 18
 };
 
 #define I40E_RXD_QW1_STATUS_TSYNINDX_SHIFT   I40E_RX_DESC_STATUS_TSYNINDX_SHIFT