|
@@ -2573,6 +2573,10 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features)
|
|
__copy_skb_header(nskb, skb);
|
|
__copy_skb_header(nskb, skb);
|
|
nskb->mac_len = skb->mac_len;
|
|
nskb->mac_len = skb->mac_len;
|
|
|
|
|
|
|
|
+ /* nskb and skb might have different headroom */
|
|
|
|
+ if (nskb->ip_summed == CHECKSUM_PARTIAL)
|
|
|
|
+ nskb->csum_start += skb_headroom(nskb) - headroom;
|
|
|
|
+
|
|
skb_reset_mac_header(nskb);
|
|
skb_reset_mac_header(nskb);
|
|
skb_set_network_header(nskb, skb->mac_len);
|
|
skb_set_network_header(nskb, skb->mac_len);
|
|
nskb->transport_header = (nskb->network_header +
|
|
nskb->transport_header = (nskb->network_header +
|
|
@@ -2702,8 +2706,8 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
|
|
} else if (skb_gro_len(p) != pinfo->gso_size)
|
|
} else if (skb_gro_len(p) != pinfo->gso_size)
|
|
return -E2BIG;
|
|
return -E2BIG;
|
|
|
|
|
|
- headroom = skb_headroom(p);
|
|
|
|
- nskb = netdev_alloc_skb(p->dev, headroom + skb_gro_offset(p));
|
|
|
|
|
|
+ headroom = NET_SKB_PAD + NET_IP_ALIGN;
|
|
|
|
+ nskb = alloc_skb(headroom + skb_gro_offset(p), GFP_ATOMIC);
|
|
if (unlikely(!nskb))
|
|
if (unlikely(!nskb))
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|