tcp: Stop non-TSO packets morphing into TSO
authorHerbert Xu <herbert@gondor.apana.org.au>
Sun, 28 Jun 2009 18:03:30 +0000 (18:03 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 30 Jun 2009 02:41:39 +0000 (19:41 -0700)
If a socket starts out on a non-TSO route, and then switches to
a TSO route, then the tail on the tx queue can morph into a TSO
packet, causing mischief because the rest of the stack does not
expect a partially linear TSO packet.

This patch fixes this by ensuring that skb->ip_summed is set to
CHECKSUM_PARTIAL before declaring a packet as TSO.

Reported-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp_output.c

index 416fc4c2e7ebdc7367959407ef99c386d6428c20..5bdf08d312d9b9b13a824673da237001679c0bff 100644 (file)
@@ -725,7 +725,8 @@ static void tcp_queue_skb(struct sock *sk, struct sk_buff *skb)
 static void tcp_set_skb_tso_segs(struct sock *sk, struct sk_buff *skb,
                                 unsigned int mss_now)
 {
-       if (skb->len <= mss_now || !sk_can_gso(sk)) {
+       if (skb->len <= mss_now || !sk_can_gso(sk) ||
+           skb->ip_summed == CHECKSUM_NONE) {
                /* Avoid the costly divide in the normal
                 * non-TSO case.
                 */