aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_offload.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2013-11-21 21:31:29 -0500
committerDavid S. Miller <davem@davemloft.net>2013-11-23 17:46:19 -0500
commitcc5c00bbb44c5d68b883aa5cb9d01514a2525d94 (patch)
treee09c2d77f476ef4584308510c30601d518d91f68 /net/ipv4/tcp_offload.c
parentd6c416148545bd99d3cc05e672460168245cc156 (diff)
gro: Only verify TCP checksums for candidates
In some cases we may receive IP packets that are longer than their stated lengths. Such packets are never merged in GRO. However, we may end up computing their checksums incorrectly and end up allowing packets with a bogus checksum enter our stack with the checksum status set as verified. Since such packets are rare and not performance-critical, this patch simply skips the checksum verification for them. Reported-by: Alexander Duyck <alexander.h.duyck@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Acked-by: Alexander Duyck <alexander.h.duyck@intel.com> Thanks, Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_offload.c')
-rw-r--r--net/ipv4/tcp_offload.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c
index a2b68a108eae..55aeec930140 100644
--- a/net/ipv4/tcp_offload.c
+++ b/net/ipv4/tcp_offload.c
@@ -276,6 +276,10 @@ static struct sk_buff **tcp4_gro_receive(struct sk_buff **head, struct sk_buff *
276 __wsum wsum; 276 __wsum wsum;
277 __sum16 sum; 277 __sum16 sum;
278 278
279 /* Don't bother verifying checksum if we're going to flush anyway. */
280 if (NAPI_GRO_CB(skb)->flush)
281 goto skip_csum;
282
279 switch (skb->ip_summed) { 283 switch (skb->ip_summed) {
280 case CHECKSUM_COMPLETE: 284 case CHECKSUM_COMPLETE:
281 if (!tcp_v4_check(skb_gro_len(skb), iph->saddr, iph->daddr, 285 if (!tcp_v4_check(skb_gro_len(skb), iph->saddr, iph->daddr,
@@ -301,6 +305,7 @@ flush:
301 break; 305 break;
302 } 306 }
303 307
308skip_csum:
304 return tcp_gro_receive(head, skb); 309 return tcp_gro_receive(head, skb);
305} 310}
306 311