]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
netfilter: bridge: move DNAT helper to br_netfilter
authorPablo Neira Ayuso <pablo@netfilter.org>
Mon, 9 Mar 2015 11:30:12 +0000 (12:30 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Mon, 9 Mar 2015 16:56:07 +0000 (17:56 +0100)
Only one caller, there is no need to keep this in a header.
Move it to br_netfilter.c where this belongs to.

Based on patch from Florian Westphal.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/linux/netfilter_bridge.h
net/bridge/br_device.c
net/bridge/br_netfilter.c
net/bridge/br_private.h

index dd580a9a1add77f69fc94258eba91e2609b23692..bb39113ea5965f07cae1862d0e9c64980307a3e8 100644 (file)
@@ -44,18 +44,6 @@ static inline unsigned int nf_bridge_mtu_reduction(const struct sk_buff *skb)
 }
 
 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_copy_to_linear_data_offset(skb, -(ETH_HLEN-ETH_ALEN),
-                                      skb->nf_bridge->data, ETH_HLEN-ETH_ALEN);
-       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). */
index ffd379db5938b17694be31e85d104289c7fb09bc..294cbcc49263194beaaac55d7aece6b32763d1ff 100644 (file)
@@ -36,13 +36,10 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
        u16 vid = 0;
 
        rcu_read_lock();
-#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
-       if (skb->nf_bridge && (skb->nf_bridge->mask & BRNF_BRIDGED_DNAT)) {
-               br_nf_pre_routing_finish_bridge_slow(skb);
+       if (br_nf_prerouting_finish_bridge(skb)) {
                rcu_read_unlock();
                return NETDEV_TX_OK;
        }
-#endif
 
        u64_stats_update_begin(&brstats->syncp);
        brstats->tx_packets++;
index ef1fe281ca1100e03964ea5493251934cd8d9d45..a8361c7cdf8127396179cbcc7552bca57393d28d 100644 (file)
@@ -892,6 +892,38 @@ static unsigned int ip_sabotage_in(const struct nf_hook_ops *ops,
        return NF_ACCEPT;
 }
 
+/* This is called when br_netfilter has called into iptables/netfilter,
+ * and DNAT has taken place on a bridge-forwarded packet.
+ *
+ * neigh->output has created a new MAC header, with local br0 MAC
+ * as saddr.
+ *
+ * This restores the original MAC saddr of the bridged packet
+ * before invoking bridge forward logic to transmit the packet.
+ */
+static void 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_copy_to_linear_data_offset(skb, -(ETH_HLEN-ETH_ALEN),
+                                      skb->nf_bridge->data, ETH_HLEN-ETH_ALEN);
+       skb->dev = nf_bridge->physindev;
+       br_handle_frame_finish(skb);
+}
+
+int br_nf_prerouting_finish_bridge(struct sk_buff *skb)
+{
+       if (skb->nf_bridge && (skb->nf_bridge->mask & BRNF_BRIDGED_DNAT)) {
+               br_nf_pre_routing_finish_bridge_slow(skb);
+               return 1;
+       }
+       return 0;
+}
+EXPORT_SYMBOL_GPL(br_nf_prerouting_finish_bridge);
+
 void br_netfilter_enable(void)
 {
 }
index de0919975a25318093cfa640231239f58c113f61..d63fc17fe4f4402494b002683c28016d51a01cb1 100644 (file)
@@ -764,10 +764,15 @@ static inline int br_vlan_enabled(struct net_bridge *br)
 
 /* br_netfilter.c */
 #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
+int br_nf_prerouting_finish_bridge(struct sk_buff *skb);
 int br_nf_core_init(void);
 void br_nf_core_fini(void);
 void br_netfilter_rtable_init(struct net_bridge *);
 #else
+static inline int br_nf_prerouting_finish_bridge(struct sk_buff *skb)
+{
+        return 0;
+}
 static inline int br_nf_core_init(void) { return 0; }
 static inline void br_nf_core_fini(void) {}
 #define br_netfilter_rtable_init(x)