aboutsummaryrefslogtreecommitdiffstats
path: root/net/netfilter/nf_dup_netdev.c
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2016-11-28 11:40:06 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2016-12-06 21:48:22 +0100
commit3bf3276119455bd0fc7a7e31be2823118e613842 (patch)
tree5be317b6b8a00df0b63beb8b0df5345af519922e /net/netfilter/nf_dup_netdev.c
parentdf122f58b834b24c27d7e2ac02a4910d3e56f6ae (diff)
downloadlinux-3bf3276119455bd0fc7a7e31be2823118e613842.tar.gz
netfilter: add and use nf_fwd_netdev_egress
... so we can use current skb instead of working with a clone. Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'net/netfilter/nf_dup_netdev.c')
-rw-r--r--net/netfilter/nf_dup_netdev.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/net/netfilter/nf_dup_netdev.c b/net/netfilter/nf_dup_netdev.c
index 44ae986c383f13..c9d7f95768ab35 100644
--- a/net/netfilter/nf_dup_netdev.c
+++ b/net/netfilter/nf_dup_netdev.c
@@ -14,6 +14,29 @@
#include <linux/netfilter/nf_tables.h>
#include <net/netfilter/nf_tables.h>
+static void nf_do_netdev_egress(struct sk_buff *skb, struct net_device *dev)
+{
+ if (skb_mac_header_was_set(skb))
+ skb_push(skb, skb->mac_len);
+
+ skb->dev = dev;
+ dev_queue_xmit(skb);
+}
+
+void nf_fwd_netdev_egress(const struct nft_pktinfo *pkt, int oif)
+{
+ struct net_device *dev;
+
+ dev = dev_get_by_index_rcu(nft_net(pkt), oif);
+ if (!dev) {
+ kfree_skb(pkt->skb);
+ return;
+ }
+
+ nf_do_netdev_egress(pkt->skb, dev);
+}
+EXPORT_SYMBOL_GPL(nf_fwd_netdev_egress);
+
void nf_dup_netdev_egress(const struct nft_pktinfo *pkt, int oif)
{
struct net_device *dev;
@@ -24,14 +47,8 @@ void nf_dup_netdev_egress(const struct nft_pktinfo *pkt, int oif)
return;
skb = skb_clone(pkt->skb, GFP_ATOMIC);
- if (skb == NULL)
- return;
-
- if (skb_mac_header_was_set(skb))
- skb_push(skb, skb->mac_len);
-
- skb->dev = dev;
- dev_queue_xmit(skb);
+ if (skb)
+ nf_do_netdev_egress(skb, dev);
}
EXPORT_SYMBOL_GPL(nf_dup_netdev_egress);