aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Duyck <aduyck@mirantis.com>2016-03-18 19:06:47 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2016-04-05 23:34:51 -0400
commit24d41e5e2c9afe99b0584832206ba8779dfb783e (patch)
treecf18a35e0ceb40114c2cde254ec47d230056fd5c
parent066439ce791b5d8533556a89836c0849589c2b41 (diff)
i40e/i40evf: Fix TSO checksum pseudo-header adjustment
With IPv4 and IPv6 now using the same format for checksums based on the length of the frame we need to update the i40e and i40evf drivers so that they correctly account for lengths greater than or equal to 64K. With this patch the driver should now correctly update checksums for frames up to 16776960 in length which should be more than large enough for all possible TSO frames in the near future. Signed-off-by: Alexander Duyck <aduyck@mirantis.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_txrx.c11
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40e_txrx.c11
2 files changed, 8 insertions, 14 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index 5bef5b0f00d9..5d5fa5359a1d 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
@@ -2304,10 +2304,8 @@ static int i40e_tso(struct i40e_ring *tx_ring, struct sk_buff *skb,
2304 l4_offset = l4.hdr - skb->data; 2304 l4_offset = l4.hdr - skb->data;
2305 2305
2306 /* remove payload length from outer checksum */ 2306 /* remove payload length from outer checksum */
2307 paylen = (__force u16)l4.udp->check; 2307 paylen = skb->len - l4_offset;
2308 paylen += ntohs((__force __be16)1) * 2308 csum_replace_by_diff(&l4.udp->check, htonl(paylen));
2309 (u16)~(skb->len - l4_offset);
2310 l4.udp->check = ~csum_fold((__force __wsum)paylen);
2311 } 2309 }
2312 2310
2313 /* reset pointers to inner headers */ 2311 /* reset pointers to inner headers */
@@ -2327,9 +2325,8 @@ static int i40e_tso(struct i40e_ring *tx_ring, struct sk_buff *skb,
2327 l4_offset = l4.hdr - skb->data; 2325 l4_offset = l4.hdr - skb->data;
2328 2326
2329 /* remove payload length from inner checksum */ 2327 /* remove payload length from inner checksum */
2330 paylen = (__force u16)l4.tcp->check; 2328 paylen = skb->len - l4_offset;
2331 paylen += ntohs((__force __be16)1) * (u16)~(skb->len - l4_offset); 2329 csum_replace_by_diff(&l4.tcp->check, htonl(paylen));
2332 l4.tcp->check = ~csum_fold((__force __wsum)paylen);
2333 2330
2334 /* compute length of segmentation header */ 2331 /* compute length of segmentation header */
2335 *hdr_len = (l4.tcp->doff * 4) + l4_offset; 2332 *hdr_len = (l4.tcp->doff * 4) + l4_offset;
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
index 570348d93e5d..04aabc52ba0d 100644
--- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c
@@ -1571,10 +1571,8 @@ static int i40e_tso(struct i40e_ring *tx_ring, struct sk_buff *skb,
1571 l4_offset = l4.hdr - skb->data; 1571 l4_offset = l4.hdr - skb->data;
1572 1572
1573 /* remove payload length from outer checksum */ 1573 /* remove payload length from outer checksum */
1574 paylen = (__force u16)l4.udp->check; 1574 paylen = skb->len - l4_offset;
1575 paylen += ntohs((__force __be16)1) * 1575 csum_replace_by_diff(&l4.udp->check, htonl(paylen));
1576 (u16)~(skb->len - l4_offset);
1577 l4.udp->check = ~csum_fold((__force __wsum)paylen);
1578 } 1576 }
1579 1577
1580 /* reset pointers to inner headers */ 1578 /* reset pointers to inner headers */
@@ -1594,9 +1592,8 @@ static int i40e_tso(struct i40e_ring *tx_ring, struct sk_buff *skb,
1594 l4_offset = l4.hdr - skb->data; 1592 l4_offset = l4.hdr - skb->data;
1595 1593
1596 /* remove payload length from inner checksum */ 1594 /* remove payload length from inner checksum */
1597 paylen = (__force u16)l4.tcp->check; 1595 paylen = skb->len - l4_offset;
1598 paylen += ntohs((__force __be16)1) * (u16)~(skb->len - l4_offset); 1596 csum_replace_by_diff(&l4.tcp->check, htonl(paylen));
1599 l4.tcp->check = ~csum_fold((__force __wsum)paylen);
1600 1597
1601 /* compute length of segmentation header */ 1598 /* compute length of segmentation header */
1602 *hdr_len = (l4.tcp->doff * 4) + l4_offset; 1599 *hdr_len = (l4.tcp->doff * 4) + l4_offset;