diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2009-01-17 14:48:13 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-01-20 17:44:03 -0500 |
commit | 37fe4732b978eb02e5433387a40f2b61706cebe3 (patch) | |
tree | 476bd415def668118e0fa34a25ef2032e3ed14e7 /net | |
parent | 9a8e47ffd95608f0768e1a8a0225c822aa53aa9b (diff) |
gro: Fix merging of paged packets
The previous fix to paged packets broke the merging because it
reset the skb->len before we added it to the merged packet. This
wasn't detected because it simply resulted in the truncation of
the packet while the missing bit is subsequently retransmitted.
The fix is to store skb->len before we clobber it.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/skbuff.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 56272ac6dfd8..2e5f2ca3bdcd 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -2585,8 +2585,9 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb) | |||
2585 | struct sk_buff *nskb; | 2585 | struct sk_buff *nskb; |
2586 | unsigned int headroom; | 2586 | unsigned int headroom; |
2587 | unsigned int hlen = p->data - skb_mac_header(p); | 2587 | unsigned int hlen = p->data - skb_mac_header(p); |
2588 | unsigned int len = skb->len; | ||
2588 | 2589 | ||
2589 | if (hlen + p->len + skb->len >= 65536) | 2590 | if (hlen + p->len + len >= 65536) |
2590 | return -E2BIG; | 2591 | return -E2BIG; |
2591 | 2592 | ||
2592 | if (skb_shinfo(p)->frag_list) | 2593 | if (skb_shinfo(p)->frag_list) |
@@ -2648,9 +2649,9 @@ merge: | |||
2648 | 2649 | ||
2649 | done: | 2650 | done: |
2650 | NAPI_GRO_CB(p)->count++; | 2651 | NAPI_GRO_CB(p)->count++; |
2651 | p->data_len += skb->len; | 2652 | p->data_len += len; |
2652 | p->truesize += skb->len; | 2653 | p->truesize += len; |
2653 | p->len += skb->len; | 2654 | p->len += len; |
2654 | 2655 | ||
2655 | NAPI_GRO_CB(skb)->same_flow = 1; | 2656 | NAPI_GRO_CB(skb)->same_flow = 1; |
2656 | return 0; | 2657 | return 0; |