diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2007-10-14 03:39:55 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-15 15:26:28 -0400 |
commit | 2ca7b0ac022aa0158599178fe1056b1ba9ec8b97 (patch) | |
tree | 6eece25447f0ec3b5d5f5533e49e10fde4d59f35 /net/ipv4/netfilter.c | |
parent | af1e1cf073e3d038b7aac417a20585ecdcab7de6 (diff) |
[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>
Diffstat (limited to 'net/ipv4/netfilter.c')
-rw-r--r-- | net/ipv4/netfilter.c | 31 |
1 files changed, 9 insertions, 22 deletions
diff --git a/net/ipv4/netfilter.c b/net/ipv4/netfilter.c index b44192924f9..d1e3012d891 100644 --- a/net/ipv4/netfilter.c +++ b/net/ipv4/netfilter.c | |||
@@ -3,6 +3,7 @@ | |||
3 | #include <linux/netfilter.h> | 3 | #include <linux/netfilter.h> |
4 | #include <linux/netfilter_ipv4.h> | 4 | #include <linux/netfilter_ipv4.h> |
5 | #include <linux/ip.h> | 5 | #include <linux/ip.h> |
6 | #include <linux/skbuff.h> | ||
6 | #include <net/route.h> | 7 | #include <net/route.h> |
7 | #include <net/xfrm.h> | 8 | #include <net/xfrm.h> |
8 | #include <net/ip.h> | 9 | #include <net/ip.h> |
@@ -66,17 +67,10 @@ int ip_route_me_harder(struct sk_buff **pskb, unsigned addr_type) | |||
66 | 67 | ||
67 | /* Change in oif may mean change in hh_len. */ | 68 | /* Change in oif may mean change in hh_len. */ |
68 | hh_len = (*pskb)->dst->dev->hard_header_len; | 69 | hh_len = (*pskb)->dst->dev->hard_header_len; |
69 | if (skb_headroom(*pskb) < hh_len) { | 70 | if (skb_headroom(*pskb) < hh_len && |
70 | struct sk_buff *nskb; | 71 | pskb_expand_head(*pskb, hh_len - skb_headroom(*pskb), 0, |
71 | 72 | GFP_ATOMIC)) | |
72 | nskb = skb_realloc_headroom(*pskb, hh_len); | 73 | return -1; |
73 | if (!nskb) | ||
74 | return -1; | ||
75 | if ((*pskb)->sk) | ||
76 | skb_set_owner_w(nskb, (*pskb)->sk); | ||
77 | kfree_skb(*pskb); | ||
78 | *pskb = nskb; | ||
79 | } | ||
80 | 74 | ||
81 | return 0; | 75 | return 0; |
82 | } | 76 | } |
@@ -107,17 +101,10 @@ int ip_xfrm_me_harder(struct sk_buff **pskb) | |||
107 | 101 | ||
108 | /* Change in oif may mean change in hh_len. */ | 102 | /* Change in oif may mean change in hh_len. */ |
109 | hh_len = (*pskb)->dst->dev->hard_header_len; | 103 | hh_len = (*pskb)->dst->dev->hard_header_len; |
110 | if (skb_headroom(*pskb) < hh_len) { | 104 | if (skb_headroom(*pskb) < hh_len && |
111 | struct sk_buff *nskb; | 105 | pskb_expand_head(*pskb, hh_len - skb_headroom(*pskb), 0, |
112 | 106 | GFP_ATOMIC)) | |
113 | nskb = skb_realloc_headroom(*pskb, hh_len); | 107 | return -1; |
114 | if (!nskb) | ||
115 | return -1; | ||
116 | if ((*pskb)->sk) | ||
117 | skb_set_owner_w(nskb, (*pskb)->sk); | ||
118 | kfree_skb(*pskb); | ||
119 | *pskb = nskb; | ||
120 | } | ||
121 | return 0; | 108 | return 0; |
122 | } | 109 | } |
123 | EXPORT_SYMBOL(ip_xfrm_me_harder); | 110 | EXPORT_SYMBOL(ip_xfrm_me_harder); |