[TCP]: rare bad TCP checksum with 2.6.19
authorJarek Poplawski <[email protected]>
Wed, 24 Jan 2007 06:07:12 +0000 (22:07 -0800)
committerDavid S. Miller <[email protected]>
Wed, 24 Jan 2007 06:07:12 +0000 (22:07 -0800)
The patch "Replace CHECKSUM_HW by CHECKSUM_PARTIAL/CHECKSUM_COMPLETE"
changed to unconditional copying of ip_summed field from collapsed
skb. This patch reverts this change.

The majority of substantial work including heavy testing
and diagnosing by: Michael Tokarev <[email protected]>
Possible reasons pointed by: Herbert Xu and Patrick McHardy.

Signed-off-by: Jarek Poplawski <[email protected]>
Acked-by: Herbert Xu <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
net/ipv4/tcp_output.c

index 32c1a972fa3141d84480f69cf2a9a181cedec502..23e32c806916bd06eb30c6f55e6cbc3bc0d51554 100644 (file)
@@ -1650,7 +1650,8 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *skb, int m
 
                memcpy(skb_put(skb, next_skb_size), next_skb->data, next_skb_size);
 
-               skb->ip_summed = next_skb->ip_summed;
+               if (next_skb->ip_summed == CHECKSUM_PARTIAL)
+                       skb->ip_summed = CHECKSUM_PARTIAL;
 
                if (skb->ip_summed != CHECKSUM_PARTIAL)
                        skb->csum = csum_block_add(skb->csum, next_skb->csum, skb_size);