From 8d77c5672d57405a303fbf6c5ccff847bdef0abd Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Thu, 5 Feb 2009 21:26:52 -0800 Subject: [PATCH] --- yaml --- r: 134301 b: refs/heads/master c: 56035022d86fff45299288cb372a42f752ba23fa h: refs/heads/master i: 134299: 3401c050674ee5be80f4d19a46814d820bc8f7a5 v: v3 --- [refs] | 2 +- trunk/net/core/dev.c | 3 ++- trunk/net/core/skbuff.c | 11 +++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index bf4f6ba4c733..ced66994b565 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fe2918b098cdbf55b69ba8762bd3de0ae64f33ff +refs/heads/master: 56035022d86fff45299288cb372a42f752ba23fa diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c index 3337cf98f231..247f1614a796 100644 --- a/trunk/net/core/dev.c +++ b/trunk/net/core/dev.c @@ -2391,7 +2391,8 @@ void *skb_gro_header(struct sk_buff *skb, unsigned int hlen) return pskb_may_pull(skb, hlen) ? skb->data + offset : NULL; return page_address(skb_shinfo(skb)->frags[0].page) + - skb_shinfo(skb)->frags[0].page_offset + offset; + skb_shinfo(skb)->frags[0].page_offset + + offset - skb_headlen(skb); } EXPORT_SYMBOL(skb_gro_header); diff --git a/trunk/net/core/skbuff.c b/trunk/net/core/skbuff.c index e55d1ef5690d..67f2a2f85827 100644 --- a/trunk/net/core/skbuff.c +++ b/trunk/net/core/skbuff.c @@ -2678,6 +2678,17 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb) p = nskb; merge: + if (skb_gro_offset(skb) > skb_headlen(skb)) { + skb_shinfo(skb)->frags[0].page_offset += + skb_gro_offset(skb) - skb_headlen(skb); + skb_shinfo(skb)->frags[0].size -= + skb_gro_offset(skb) - skb_headlen(skb); + skb_gro_reset_offset(skb); + skb_gro_pull(skb, skb_headlen(skb)); + } + + __skb_pull(skb, skb_gro_offset(skb)); + p->prev->next = skb; p->prev = skb; skb_header_release(skb);