diff options
-rw-r--r-- | net/core/dev.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index ec5be1c7f2f..220f52a1001 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -217,7 +217,7 @@ static inline struct hlist_head *dev_index_hash(struct net *net, int ifindex) | |||
217 | 217 | ||
218 | static inline void *skb_gro_mac_header(struct sk_buff *skb) | 218 | static inline void *skb_gro_mac_header(struct sk_buff *skb) |
219 | { | 219 | { |
220 | return skb_headlen(skb) ? skb_mac_header(skb) : | 220 | return skb_mac_header(skb) < skb->data ? skb_mac_header(skb) : |
221 | page_address(skb_shinfo(skb)->frags[0].page) + | 221 | page_address(skb_shinfo(skb)->frags[0].page) + |
222 | skb_shinfo(skb)->frags[0].page_offset; | 222 | skb_shinfo(skb)->frags[0].page_offset; |
223 | } | 223 | } |
@@ -2469,11 +2469,19 @@ int dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | |||
2469 | napi->gro_list = skb; | 2469 | napi->gro_list = skb; |
2470 | ret = GRO_HELD; | 2470 | ret = GRO_HELD; |
2471 | 2471 | ||
2472 | pull: | ||
2473 | if (unlikely(!pskb_may_pull(skb, skb_gro_offset(skb)))) { | ||
2474 | if (napi->gro_list == skb) | ||
2475 | napi->gro_list = skb->next; | ||
2476 | ret = GRO_DROP; | ||
2477 | } | ||
2478 | |||
2472 | ok: | 2479 | ok: |
2473 | return ret; | 2480 | return ret; |
2474 | 2481 | ||
2475 | normal: | 2482 | normal: |
2476 | return GRO_NORMAL; | 2483 | ret = GRO_NORMAL; |
2484 | goto pull; | ||
2477 | } | 2485 | } |
2478 | EXPORT_SYMBOL(dev_gro_receive); | 2486 | EXPORT_SYMBOL(dev_gro_receive); |
2479 | 2487 | ||
@@ -2589,14 +2597,10 @@ EXPORT_SYMBOL(napi_fraginfo_skb); | |||
2589 | int napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb, int ret) | 2597 | int napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb, int ret) |
2590 | { | 2598 | { |
2591 | int err = NET_RX_SUCCESS; | 2599 | int err = NET_RX_SUCCESS; |
2592 | int may; | ||
2593 | 2600 | ||
2594 | switch (ret) { | 2601 | switch (ret) { |
2595 | case GRO_NORMAL: | 2602 | case GRO_NORMAL: |
2596 | case GRO_HELD: | 2603 | case GRO_HELD: |
2597 | may = pskb_may_pull(skb, skb_gro_offset(skb)); | ||
2598 | BUG_ON(!may); | ||
2599 | |||
2600 | skb->protocol = eth_type_trans(skb, napi->dev); | 2604 | skb->protocol = eth_type_trans(skb, napi->dev); |
2601 | 2605 | ||
2602 | if (ret == GRO_NORMAL) | 2606 | if (ret == GRO_NORMAL) |