bridge-netfilter: simplify IP DNAT
Subsystems (3)
PATCH 1/3 bridge-netfilter: simplify IP DNAT
bridge-netfilter: simplify IP DNAT
Remove br_netfilter.c::br_nf_local_out(). The function br_nf_local_out() was needed because the PF_BRIDGE::LOCAL_OUT hook could be called when IP DNAT happens on to-be-bridged traffic. The new scheme eliminates this mess.
Signed-off-by Bart De Schuymer <[email protected]>
include/linux/netfilter_bridge.h renamed from include/linux/netfilter_bridge.h.ori +14 -3
@@ -41,9 +41,8 @@ enum nf_br_hook_priorities {#define BRNF_PKT_TYPE 0x01#define BRNF_BRIDGED_DNAT 0x02 -#define BRNF_DONT_TAKE_PARENT 0x04 -#define BRNF_BRIDGED 0x08 -#define BRNF_NF_BRIDGE_PREROUTING 0x10 +#define BRNF_BRIDGED 0x04 +#define BRNF_NF_BRIDGE_PREROUTING 0x08/* Only used in br_forward.c */
@@ -68,6 +67,18 @@ static inline unsigned int nf_bridge_enc } } +extern int br_handle_frame_finish (struct sk_buff *skb); +/* Only used in br_device.c */ +static inline int br_nf_pre_routing_finish_bridge_slow (struct sk_buff *skb) +{ +struct nf_bridge_info *nf_bridge = skb->nf_bridge; + +skb_pull (skb,ETH_HLEN ); + nf_bridge->mask ^=BRNF_BRIDGED_DNAT ; + skb->dev = nf_bridge->physindev; +return br_handle_frame_finish (skb); +} +/* This is called by the IP fragmenting code and it ensures there is * enough room for the encapsulating header (if there is one). */ static inline unsigned int nf_bridge_pad (const struct sk_buff *skb)
net/bridge/br_device.c renamed from net/bridge/br_device.c.ori +8 -1
@@ -15,7 +15,7 @@#include <linux/netdevice.h> #include <linux/etherdevice.h> #include <linux/ethtool.h> - +#include <linux/netfilter_bridge.h> #include <asm/uaccess.h> #include "br_private.h"
@@ -28,6 +28,13 @@ netdev_tx_t br_dev_xmit(struct sk_buff *struct net_bridge_mdb_entry *mdst;struct br_cpu_netstats *brstats =this_cpu_ptr (br->stats); +#ifdef CONFIG_BRIDGE_NETFILTER +if (skb->nf_bridge && (skb->nf_bridge->mask &BRNF_BRIDGED_DNAT )) { +br_nf_pre_routing_finish_bridge_slow (skb); +return NETDEV_TX_OK ; + } +#endif + brstats->tx_packets++; brstats->tx_bytes += skb->len;
net/bridge/br_netfilter.c renamed from net/bridge/br_netfilter.c.ori +18 -96
174 lines not on this page · raw message
Signature · 2 lines
Bart De Schuymer www.artinalgorithms.be
Quoted 6 lines · Bart De Schuymer
bridge-netfilter: simplify IP DNAT
Remove
br_netfilter.c::br_nf_local_out(). The functionbr_nf_local_out()was needed because thePF_BRIDGE::LOCAL_OUThook could be called when IP DNAT happens on to-be-bridged traffic. The new scheme eliminates this mess.
Nice cleanup. Applied, thanks Bart.