summaryrefslogtreecommitdiffstats
path: root/br-nf-bds/linux/net/bridge/br_input.c
diff options
context:
space:
mode:
authorBart De Schuymer <bdschuym@pandora.be>2002-08-24 08:42:37 +0000
committerBart De Schuymer <bdschuym@pandora.be>2002-08-24 08:42:37 +0000
commit5fbc5c35b3aee288f523ad06505c0035fc36f023 (patch)
tree67c0a0184213ad755678d2848dd6a8398580efb3 /br-nf-bds/linux/net/bridge/br_input.c
parent8b4e9ab8c2ed0ea829128ff67a9febf69d5defba (diff)
update to 2.4.20-pre4
Diffstat (limited to 'br-nf-bds/linux/net/bridge/br_input.c')
-rw-r--r--br-nf-bds/linux/net/bridge/br_input.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/br-nf-bds/linux/net/bridge/br_input.c b/br-nf-bds/linux/net/bridge/br_input.c
index b9487dc..d42a65d 100644
--- a/br-nf-bds/linux/net/bridge/br_input.c
+++ b/br-nf-bds/linux/net/bridge/br_input.c
@@ -5,7 +5,7 @@
* Authors:
* Lennert Buytenhek <buytenh@gnu.org>
*
- * $Id: br_input.c,v 1.1 2002/06/01 19:23:53 bdschuym Exp $
+ * $Id: br_input.c,v 1.2 2002/08/24 08:44:40 bdschuym Exp $
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -19,6 +19,10 @@
#include <linux/if_bridge.h>
#include <linux/netfilter_bridge.h>
#include "br_private.h"
+#if defined(CONFIG_BRIDGE_EBT_BROUTE) || \
+ defined(CONFIG_BRIDGE_EBT_BROUTE_MODULE)
+#include <linux/netfilter.h>
+#endif
unsigned char bridge_ula[6] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x00 };
@@ -112,7 +116,7 @@ err_nolock:
return 0;
}
-void br_handle_frame(struct sk_buff *skb)
+int br_handle_frame(struct sk_buff *skb)
{
struct net_bridge *br;
unsigned char *dest;
@@ -146,23 +150,32 @@ void br_handle_frame(struct sk_buff *skb)
goto handle_special_frame;
if (p->state == BR_STATE_FORWARDING) {
+#if defined(CONFIG_BRIDGE_EBT_BROUTE) || \
+ defined(CONFIG_BRIDGE_EBT_BROUTE_MODULE)
+ if (broute_decision && broute_decision(NF_BR_BROUTING, &skb,
+ skb->dev, NULL, NULL) == NF_DROP)
+ return -1;
+#endif
NF_HOOK(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
br_handle_frame_finish);
read_unlock(&br->lock);
- return;
+ return 0;
}
err:
read_unlock(&br->lock);
err_nolock:
kfree_skb(skb);
- return;
+ return 0;
handle_special_frame:
if (!dest[5]) {
br_stp_handle_bpdu(skb);
- return;
+ read_unlock(&br->lock);
+ return 0;
}
+ read_unlock(&br->lock);
kfree_skb(skb);
+ return 0;
}