|
@@ -368,14 +368,25 @@ static void br_make_blocking(struct net_bridge_port *p)
|
|
|
/* called under bridge lock */
|
|
|
static void br_make_forwarding(struct net_bridge_port *p)
|
|
|
{
|
|
|
- if (p->state == BR_STATE_BLOCKING) {
|
|
|
- if (p->br->stp_enabled == BR_KERNEL_STP)
|
|
|
- p->state = BR_STATE_LISTENING;
|
|
|
- else
|
|
|
- p->state = BR_STATE_LEARNING;
|
|
|
+ struct net_bridge *br = p->br;
|
|
|
|
|
|
- br_log_state(p);
|
|
|
- mod_timer(&p->forward_delay_timer, jiffies + p->br->forward_delay); }
|
|
|
+ if (p->state != BR_STATE_BLOCKING)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (br->forward_delay == 0) {
|
|
|
+ p->state = BR_STATE_FORWARDING;
|
|
|
+ br_topology_change_detection(br);
|
|
|
+ del_timer(&p->forward_delay_timer);
|
|
|
+ }
|
|
|
+ else if (p->br->stp_enabled == BR_KERNEL_STP)
|
|
|
+ p->state = BR_STATE_LISTENING;
|
|
|
+ else
|
|
|
+ p->state = BR_STATE_LEARNING;
|
|
|
+
|
|
|
+ br_log_state(p);
|
|
|
+
|
|
|
+ if (br->forward_delay != 0)
|
|
|
+ mod_timer(&p->forward_delay_timer, jiffies + br->forward_delay);
|
|
|
}
|
|
|
|
|
|
/* called under bridge lock */
|