1 From: Gerald Schaefer <geraldsc@de.ibm.com>
2 Subject: qeth: improve no_checksumming handling for layer3
3 References: bnc#499845,LTC#53306
5 Symptom: Messages "hw csum failure" when tcpdump is running
6 Problem: If sysfs-attribute checksumming is set to
7 "no-checksumming" for a layer3 qeth device, incoming
8 data is stored in skbs with incorrect setting of
10 Solution: Set skb->ip_summed to CHECKSUM_UNNECESSARY if
11 RX-checksumming is not required.
13 Acked-by: John Jolly <jjolly@suse.de>
15 drivers/s390/net/qeth_l3_main.c | 20 +++++++++++++-------
16 1 file changed, 13 insertions(+), 7 deletions(-)
18 Index: linux-sles11/drivers/s390/net/qeth_l3_main.c
19 ===================================================================
20 --- linux-sles11.orig/drivers/s390/net/qeth_l3_main.c
21 +++ linux-sles11/drivers/s390/net/qeth_l3_main.c
22 @@ -1939,16 +1939,22 @@ static inline __u16 qeth_l3_rebuild_skb(
23 hdr->hdr.l3.vlan_id : *((u16 *)&hdr->hdr.l3.dest_addr[12]);
26 - skb->ip_summed = card->options.checksum_type;
27 - if (card->options.checksum_type == HW_CHECKSUMMING) {
28 + switch (card->options.checksum_type) {
29 + case SW_CHECKSUMMING:
30 + skb->ip_summed = CHECKSUM_NONE;
32 + case NO_CHECKSUMMING:
33 + skb->ip_summed = CHECKSUM_UNNECESSARY;
35 + case HW_CHECKSUMMING:
36 if ((hdr->hdr.l3.ext_flags &
37 - (QETH_HDR_EXT_CSUM_HDR_REQ |
38 - QETH_HDR_EXT_CSUM_TRANSP_REQ)) ==
39 - (QETH_HDR_EXT_CSUM_HDR_REQ |
40 - QETH_HDR_EXT_CSUM_TRANSP_REQ))
41 + (QETH_HDR_EXT_CSUM_HDR_REQ |
42 + QETH_HDR_EXT_CSUM_TRANSP_REQ)) ==
43 + (QETH_HDR_EXT_CSUM_HDR_REQ |
44 + QETH_HDR_EXT_CSUM_TRANSP_REQ))
45 skb->ip_summed = CHECKSUM_UNNECESSARY;
47 - skb->ip_summed = SW_CHECKSUMMING;
48 + skb->ip_summed = CHECKSUM_NONE;