[NETFILTER]: Avoid skb_copy/pskb_copy/skb_realloc_headroom
This patch replaces unnecessary uses of skb_copy, pskb_copy and skb_realloc_headroom by functions such as skb_make_writable and pskb_expand_head. This allows us to remove the double pointers later. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
af1e1cf073
commit
2ca7b0ac02
@@ -332,6 +332,7 @@ static int
|
||||
ipq_mangle_ipv6(ipq_verdict_msg_t *v, struct ipq_queue_entry *e)
|
||||
{
|
||||
int diff;
|
||||
int err;
|
||||
struct ipv6hdr *user_iph = (struct ipv6hdr *)v->payload;
|
||||
|
||||
if (v->data_len < sizeof(*user_iph))
|
||||
@@ -344,21 +345,14 @@ ipq_mangle_ipv6(ipq_verdict_msg_t *v, struct ipq_queue_entry *e)
|
||||
if (v->data_len > 0xFFFF)
|
||||
return -EINVAL;
|
||||
if (diff > skb_tailroom(e->skb)) {
|
||||
struct sk_buff *newskb;
|
||||
|
||||
newskb = skb_copy_expand(e->skb,
|
||||
skb_headroom(e->skb),
|
||||
diff,
|
||||
GFP_ATOMIC);
|
||||
if (newskb == NULL) {
|
||||
err = pskb_expand_head(e->skb, 0,
|
||||
diff - skb_tailroom(e->skb),
|
||||
GFP_ATOMIC);
|
||||
if (err) {
|
||||
printk(KERN_WARNING "ip6_queue: OOM "
|
||||
"in mangle, dropping packet\n");
|
||||
return -ENOMEM;
|
||||
return err;
|
||||
}
|
||||
if (e->skb->sk)
|
||||
skb_set_owner_w(newskb, e->skb->sk);
|
||||
kfree_skb(e->skb);
|
||||
e->skb = newskb;
|
||||
}
|
||||
skb_put(e->skb, diff);
|
||||
}
|
||||
|
Reference in New Issue
Block a user