blob: 77843604cf9af8cf5458d97eb56d5346e6d380b3 [file] [log] [blame]
From stable-bounces@linux.kernel.org Tue Jun 28 16:07:25 2005
Date: Tue, 28 Jun 2005 16:06:39 -0700 (PDT)
Message-Id: <20050628.160639.130608735.davem@davemloft.net>
To: stable@kernel.org
From: "David S. Miller" <davem@davemloft.net>
Subject: [NETFILTER]: Fix connection tracking bug in 2.6.12
In 2.6.12 we started dropping the conntrack reference when a packet
leaves the IP layer. This broke connection tracking on a bridge,
because bridge-netfilter defers calling some NF_IP_* hooks to the bridge
layer for locally generated packets going out a bridge, where the
conntrack reference is no longer available. This patch keeps the
reference in this case as a temporary solution, long term we will
remove the defered hook calling. No attempt is made to drop the
reference in the bridge-code when it is no longer needed, tc actions
could already have sent the packet anywhere.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Chris Wright <chrisw@osdl.org>
---
Index: linux-2.6.12.y/net/bridge/br_netfilter.c
===================================================================
--- linux-2.6.12.y.orig/net/bridge/br_netfilter.c
+++ linux-2.6.12.y/net/bridge/br_netfilter.c
@@ -882,7 +882,7 @@ static unsigned int ip_sabotage_out(unsi
* doesn't use the bridge parent of the indev by using
* the BRNF_DONT_TAKE_PARENT mask. */
if (hook == NF_IP_FORWARD && nf_bridge->physindev == NULL) {
- nf_bridge->mask &= BRNF_DONT_TAKE_PARENT;
+ nf_bridge->mask |= BRNF_DONT_TAKE_PARENT;
nf_bridge->physindev = (struct net_device *)in;
}
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
Index: linux-2.6.12.y/net/ipv4/ip_output.c
===================================================================
--- linux-2.6.12.y.orig/net/ipv4/ip_output.c
+++ linux-2.6.12.y/net/ipv4/ip_output.c
@@ -196,7 +196,13 @@ static inline int ip_finish_output2(stru
nf_debug_ip_finish_output2(skb);
#endif /*CONFIG_NETFILTER_DEBUG*/
- nf_reset(skb);
+#ifdef CONFIG_BRIDGE_NETFILTER
+ /* bridge-netfilter defers calling some IP hooks to the bridge layer
+ * and still needs the conntrack reference.
+ */
+ if (skb->nf_bridge == NULL)
+#endif
+ nf_reset(skb);
if (hh) {
int hh_alen;