|
@@ -736,7 +736,9 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
|
|
|
*/
|
|
|
struct sk_buff *n = alloc_skb(newheadroom + skb->len + newtailroom,
|
|
|
gfp_mask);
|
|
|
+ int oldheadroom = skb_headroom(skb);
|
|
|
int head_copy_len, head_copy_off;
|
|
|
+ int off = 0;
|
|
|
|
|
|
if (!n)
|
|
|
return NULL;
|
|
@@ -746,7 +748,7 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
|
|
|
/* Set the tail pointer and length */
|
|
|
skb_put(n, skb->len);
|
|
|
|
|
|
- head_copy_len = skb_headroom(skb);
|
|
|
+ head_copy_len = oldheadroom;
|
|
|
head_copy_off = 0;
|
|
|
if (newheadroom <= head_copy_len)
|
|
|
head_copy_len = newheadroom;
|
|
@@ -760,6 +762,13 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
|
|
|
|
|
|
copy_skb_header(n, skb);
|
|
|
|
|
|
+#ifdef NET_SKBUFF_DATA_USES_OFFSET
|
|
|
+ off = newheadroom - oldheadroom;
|
|
|
+#endif
|
|
|
+ n->transport_header += off;
|
|
|
+ n->network_header += off;
|
|
|
+ n->mac_header += off;
|
|
|
+
|
|
|
return n;
|
|
|
}
|
|
|
|