aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2009-01-17 14:48:13 -0500
committerDavid S. Miller <davem@davemloft.net>2009-01-20 17:44:03 -0500
commit37fe4732b978eb02e5433387a40f2b61706cebe3 (patch)
tree476bd415def668118e0fa34a25ef2032e3ed14e7
parent9a8e47ffd95608f0768e1a8a0225c822aa53aa9b (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>
-rw-r--r--net/core/skbuff.c9
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
2649done: 2650done:
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;