diff options
author | Stephen Hemminger <shemminger@vyatta.com> | 2009-05-15 06:10:13 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-05-17 21:12:54 -0700 |
commit | a598f6aebea2481531b0757ed90cfb0d8cf1d8f5 (patch) | |
tree | 8e1b255bf66b68c01e784a0e4b3e3179945bd3d2 /net | |
parent | a8f492c6ac6072d6c5bce4b2f13dc44612991051 (diff) | |
download | linux-stable-a598f6aebea2481531b0757ed90cfb0d8cf1d8f5.tar.gz linux-stable-a598f6aebea2481531b0757ed90cfb0d8cf1d8f5.tar.bz2 linux-stable-a598f6aebea2481531b0757ed90cfb0d8cf1d8f5.zip |
bridge: relay bridge multicast pkgs if !STP
Currently the bridge catches all STP packets; even if STP is turned
off. This prevents other systems (which do have STP turned on)
from being able to detect loops in the network.
With this patch, if STP is off, then any packet sent to the STP
multicast group address is forwarded to all ports.
Based on earlier patch by Joakim Tjernlund with changes
to go through forwarding (not local chain), and optimization
that only last octet needs to be checked.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/bridge/br_input.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c index 30b88777c3df..5ee1a3682bf2 100644 --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c @@ -134,6 +134,10 @@ struct sk_buff *br_handle_frame(struct net_bridge_port *p, struct sk_buff *skb) if (skb->protocol == htons(ETH_P_PAUSE)) goto drop; + /* If STP is turned off, then forward */ + if (p->br->stp_enabled == BR_NO_STP && dest[5] == 0) + goto forward; + if (NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, skb->dev, NULL, br_handle_local_finish)) return NULL; /* frame consumed by filter */ @@ -141,6 +145,7 @@ struct sk_buff *br_handle_frame(struct net_bridge_port *p, struct sk_buff *skb) return skb; /* continue processing */ } +forward: switch (p->state) { case BR_STATE_FORWARDING: rhook = rcu_dereference(br_should_route_hook); |