Skip to content

Commit 3bf3276

Browse files
Florian Westphalummakynes
authored andcommitted
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 <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent df122f5 commit 3bf3276

File tree

3 files changed

+28
-10
lines changed

3 files changed

+28
-10
lines changed

include/net/netfilter/nf_dup_netdev.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
#define _NF_DUP_NETDEV_H_
33

44
void nf_dup_netdev_egress(const struct nft_pktinfo *pkt, int oif);
5+
void nf_fwd_netdev_egress(const struct nft_pktinfo *pkt, int oif);
56

67
#endif

net/netfilter/nf_dup_netdev.c

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,29 @@
1414
#include <linux/netfilter/nf_tables.h>
1515
#include <net/netfilter/nf_tables.h>
1616

17+
static void nf_do_netdev_egress(struct sk_buff *skb, struct net_device *dev)
18+
{
19+
if (skb_mac_header_was_set(skb))
20+
skb_push(skb, skb->mac_len);
21+
22+
skb->dev = dev;
23+
dev_queue_xmit(skb);
24+
}
25+
26+
void nf_fwd_netdev_egress(const struct nft_pktinfo *pkt, int oif)
27+
{
28+
struct net_device *dev;
29+
30+
dev = dev_get_by_index_rcu(nft_net(pkt), oif);
31+
if (!dev) {
32+
kfree_skb(pkt->skb);
33+
return;
34+
}
35+
36+
nf_do_netdev_egress(pkt->skb, dev);
37+
}
38+
EXPORT_SYMBOL_GPL(nf_fwd_netdev_egress);
39+
1740
void nf_dup_netdev_egress(const struct nft_pktinfo *pkt, int oif)
1841
{
1942
struct net_device *dev;
@@ -24,14 +47,8 @@ void nf_dup_netdev_egress(const struct nft_pktinfo *pkt, int oif)
2447
return;
2548

2649
skb = skb_clone(pkt->skb, GFP_ATOMIC);
27-
if (skb == NULL)
28-
return;
29-
30-
if (skb_mac_header_was_set(skb))
31-
skb_push(skb, skb->mac_len);
32-
33-
skb->dev = dev;
34-
dev_queue_xmit(skb);
50+
if (skb)
51+
nf_do_netdev_egress(skb, dev);
3552
}
3653
EXPORT_SYMBOL_GPL(nf_dup_netdev_egress);
3754

net/netfilter/nft_fwd_netdev.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ static void nft_fwd_netdev_eval(const struct nft_expr *expr,
2626
struct nft_fwd_netdev *priv = nft_expr_priv(expr);
2727
int oif = regs->data[priv->sreg_dev];
2828

29-
nf_dup_netdev_egress(pkt, oif);
30-
regs->verdict.code = NF_DROP;
29+
nf_fwd_netdev_egress(pkt, oif);
30+
regs->verdict.code = NF_STOLEN;
3131
}
3232

3333
static const struct nla_policy nft_fwd_netdev_policy[NFTA_FWD_MAX + 1] = {

0 commit comments

Comments
 (0)