|
@@ -48,7 +48,8 @@ void br_stp_enable_bridge(struct net_bridge *br)
|
|
struct net_bridge_port *p;
|
|
struct net_bridge_port *p;
|
|
|
|
|
|
spin_lock_bh(&br->lock);
|
|
spin_lock_bh(&br->lock);
|
|
- mod_timer(&br->hello_timer, jiffies + br->hello_time);
|
|
|
|
|
|
+ if (br->stp_enabled == BR_KERNEL_STP)
|
|
|
|
+ mod_timer(&br->hello_timer, jiffies + br->hello_time);
|
|
mod_timer(&br->gc_timer, jiffies + HZ/10);
|
|
mod_timer(&br->gc_timer, jiffies + HZ/10);
|
|
|
|
|
|
br_config_bpdu_generation(br);
|
|
br_config_bpdu_generation(br);
|
|
@@ -127,6 +128,7 @@ static void br_stp_start(struct net_bridge *br)
|
|
int r;
|
|
int r;
|
|
char *argv[] = { BR_STP_PROG, br->dev->name, "start", NULL };
|
|
char *argv[] = { BR_STP_PROG, br->dev->name, "start", NULL };
|
|
char *envp[] = { NULL };
|
|
char *envp[] = { NULL };
|
|
|
|
+ struct net_bridge_port *p;
|
|
|
|
|
|
r = call_usermodehelper(BR_STP_PROG, argv, envp, UMH_WAIT_PROC);
|
|
r = call_usermodehelper(BR_STP_PROG, argv, envp, UMH_WAIT_PROC);
|
|
|
|
|
|
@@ -140,6 +142,10 @@ static void br_stp_start(struct net_bridge *br)
|
|
if (r == 0) {
|
|
if (r == 0) {
|
|
br->stp_enabled = BR_USER_STP;
|
|
br->stp_enabled = BR_USER_STP;
|
|
br_debug(br, "userspace STP started\n");
|
|
br_debug(br, "userspace STP started\n");
|
|
|
|
+ /* Stop hello and hold timers */
|
|
|
|
+ del_timer(&br->hello_timer);
|
|
|
|
+ list_for_each_entry(p, &br->port_list, list)
|
|
|
|
+ del_timer(&p->hold_timer);
|
|
} else {
|
|
} else {
|
|
br->stp_enabled = BR_KERNEL_STP;
|
|
br->stp_enabled = BR_KERNEL_STP;
|
|
br_debug(br, "using kernel STP\n");
|
|
br_debug(br, "using kernel STP\n");
|
|
@@ -156,12 +162,17 @@ static void br_stp_stop(struct net_bridge *br)
|
|
int r;
|
|
int r;
|
|
char *argv[] = { BR_STP_PROG, br->dev->name, "stop", NULL };
|
|
char *argv[] = { BR_STP_PROG, br->dev->name, "stop", NULL };
|
|
char *envp[] = { NULL };
|
|
char *envp[] = { NULL };
|
|
|
|
+ struct net_bridge_port *p;
|
|
|
|
|
|
if (br->stp_enabled == BR_USER_STP) {
|
|
if (br->stp_enabled == BR_USER_STP) {
|
|
r = call_usermodehelper(BR_STP_PROG, argv, envp, UMH_WAIT_PROC);
|
|
r = call_usermodehelper(BR_STP_PROG, argv, envp, UMH_WAIT_PROC);
|
|
br_info(br, "userspace STP stopped, return code %d\n", r);
|
|
br_info(br, "userspace STP stopped, return code %d\n", r);
|
|
|
|
|
|
/* To start timers on any ports left in blocking */
|
|
/* To start timers on any ports left in blocking */
|
|
|
|
+ mod_timer(&br->hello_timer, jiffies + br->hello_time);
|
|
|
|
+ list_for_each_entry(p, &br->port_list, list)
|
|
|
|
+ mod_timer(&p->hold_timer,
|
|
|
|
+ round_jiffies(jiffies + BR_HOLD_TIME));
|
|
spin_lock_bh(&br->lock);
|
|
spin_lock_bh(&br->lock);
|
|
br_port_state_selection(br);
|
|
br_port_state_selection(br);
|
|
spin_unlock_bh(&br->lock);
|
|
spin_unlock_bh(&br->lock);
|