Skip to content

Commit

Permalink
[BRIDGE]: fix crash in STP
Browse files Browse the repository at this point in the history
Bridge would crash because of uninitailized timer if STP is used and
device was inserted into a bridge before bridge was up. This got
introduced when the delayed port checking was added.  Fix is to not
enable STP on port unless bridge is up.

Bugzilla: http://bugzilla.kernel.org/show_bug.cgi?id=6140
Dup:      http://bugzilla.kernel.org/show_bug.cgi?id=6156

Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Stephen Hemminger authored and David S. Miller committed Mar 5, 2006
1 parent 501f74f commit 6e86b89
Showing 1 changed file with 15 additions and 14 deletions.
29 changes: 15 additions & 14 deletions net/bridge/br_if.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,26 +81,27 @@ static void port_carrier_check(void *arg)
{
struct net_device *dev = arg;
struct net_bridge_port *p;
struct net_bridge *br;

rtnl_lock();
p = dev->br_port;
if (!p)
goto done;

if (netif_carrier_ok(p->dev)) {
u32 cost = port_cost(p->dev);

spin_lock_bh(&p->br->lock);
if (p->state == BR_STATE_DISABLED) {
p->path_cost = cost;
br_stp_enable_port(p);
br = p->br;

if (netif_carrier_ok(dev))
p->path_cost = port_cost(dev);

if (br->dev->flags & IFF_UP) {
spin_lock_bh(&br->lock);
if (netif_carrier_ok(dev)) {
if (p->state == BR_STATE_DISABLED)
br_stp_enable_port(p);
} else {
if (p->state != BR_STATE_DISABLED)
br_stp_disable_port(p);
}
spin_unlock_bh(&p->br->lock);
} else {
spin_lock_bh(&p->br->lock);
if (p->state != BR_STATE_DISABLED)
br_stp_disable_port(p);
spin_unlock_bh(&p->br->lock);
spin_unlock_bh(&br->lock);
}
done:
rtnl_unlock();
Expand Down

0 comments on commit 6e86b89

Please sign in to comment.