summaryrefslogtreecommitdiffstats
path: root/drivers/staging/octeon
diff options
context:
space:
mode:
authorHamish Martin <hamish.martin@alliedtelesis.co.nz>2015-12-22 10:23:58 +1300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-02-07 19:35:16 -0800
commit5a89a875c96a9d038715c42f5f712002ce5124d0 (patch)
tree4c2a0941ba3d2e0b0bec7724feb352ed460da8bd /drivers/staging/octeon
parent660a24bf60821ce9f5799b0772a0a82c922c72c1 (diff)
downloadop-kernel-dev-5a89a875c96a9d038715c42f5f712002ce5124d0.zip
op-kernel-dev-5a89a875c96a9d038715c42f5f712002ce5124d0.tar.gz
staging: octeon-ethernet: fix TCP/UDP checksum calc
If the network portion of a frame is preceded by more than 14 bytes of data, the checksum calculated in the HW is done over the wrong data and is put in the wrong place. In our use case an Octeon ethernet controller is connected to a Broadcom switch chip. Extra data is included in the frame prior to egressing the Octeon ethernet (i.e. 4 bytes of an 802.1Q tag, 4 bytes of a proprietary BCM tag later stripped by the switch chip). This extra data causes the checksum calculation to be incorrect. The fix in this patch is to make use of the network header offset of the skb. This enables the checksum to be calculated correctly. This has been tested in both the configuration with the switch chip in the egress path (as described above) and in a simple connection direct to the wire. Reviewed-by: Richard Laing <richard.laing@alliedtelesis.co.nz> Reviewed-by: Tim Beale <tim.beale@alliedtelesis.co.nz> Reviewed-by: Chris Packham <chris.packham@alliedtelesis.co.nz> Signed-off-by: Hamish Martin <hamish.martin@alliedtelesis.co.nz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/octeon')
-rw-r--r--drivers/staging/octeon/ethernet-tx.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/staging/octeon/ethernet-tx.c b/drivers/staging/octeon/ethernet-tx.c
index c053c4a..5611a02 100644
--- a/drivers/staging/octeon/ethernet-tx.c
+++ b/drivers/staging/octeon/ethernet-tx.c
@@ -403,7 +403,7 @@ dont_put_skbuff_in_hw:
((ip_hdr(skb)->protocol == IPPROTO_TCP) ||
(ip_hdr(skb)->protocol == IPPROTO_UDP))) {
/* Use hardware checksum calc */
- pko_command.s.ipoffp1 = sizeof(struct ethhdr) + 1;
+ pko_command.s.ipoffp1 = skb_network_offset(skb) + 1;
}
if (USE_ASYNC_IOBDMA) {
OpenPOWER on IntegriCloud