summaryrefslogtreecommitdiffstats
path: root/net/bridge/netfilter/ebt_redirect.c
diff options
context:
space:
mode:
authorHerbert Xu2007-10-14 09:39:55 +0200
committerDavid S. Miller2007-10-15 21:26:28 +0200
commit2ca7b0ac022aa0158599178fe1056b1ba9ec8b97 (patch)
tree6eece25447f0ec3b5d5f5533e49e10fde4d59f35 /net/bridge/netfilter/ebt_redirect.c
parent[IPVS]: Replace local version of skb_make_writable (diff)
downloadkernel-qcow2-linux-2ca7b0ac022aa0158599178fe1056b1ba9ec8b97.tar.gz
kernel-qcow2-linux-2ca7b0ac022aa0158599178fe1056b1ba9ec8b97.tar.xz
kernel-qcow2-linux-2ca7b0ac022aa0158599178fe1056b1ba9ec8b97.zip
[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/bridge/netfilter/ebt_redirect.c')
-rw-r--r--net/bridge/netfilter/ebt_redirect.c13
1 files changed, 3 insertions, 10 deletions
diff --git a/net/bridge/netfilter/ebt_redirect.c b/net/bridge/netfilter/ebt_redirect.c
index 9f378eab72d0..81371cd01bd0 100644
--- a/net/bridge/netfilter/ebt_redirect.c
+++ b/net/bridge/netfilter/ebt_redirect.c
@@ -8,6 +8,7 @@
*
*/
+#include <linux/netfilter.h>
#include <linux/netfilter_bridge/ebtables.h>
#include <linux/netfilter_bridge/ebt_redirect.h>
#include <linux/module.h>
@@ -20,17 +21,9 @@ static int ebt_target_redirect(struct sk_buff **pskb, unsigned int hooknr,
{
struct ebt_redirect_info *info = (struct ebt_redirect_info *)data;
- if (skb_shared(*pskb) || skb_cloned(*pskb)) {
- struct sk_buff *nskb;
+ if (skb_make_writable(*pskb, 0))
+ return NF_DROP;
- nskb = skb_copy(*pskb, GFP_ATOMIC);
- if (!nskb)
- return NF_DROP;
- if ((*pskb)->sk)
- skb_set_owner_w(nskb, (*pskb)->sk);
- kfree_skb(*pskb);
- *pskb = nskb;
- }
if (hooknr != NF_BR_BROUTING)
memcpy(eth_hdr(*pskb)->h_dest,
in->br_port->br->dev->dev_addr, ETH_ALEN);