Merge branch 'for-linus2' of git://git.kernel.dk/linux-2.6-block
[safe/jmp/linux-2.6] / net / bridge / br_stp.c
index 921bbe5..57186d8 100644 (file)
@@ -21,7 +21,7 @@
  */
 #define MESSAGE_AGE_INCR       ((HZ < 256) ? 1 : (HZ/256))
 
-static const char *br_port_state_names[] = {
+static const char *const br_port_state_names[] = {
        [BR_STATE_DISABLED] = "disabled",
        [BR_STATE_LISTENING] = "listening",
        [BR_STATE_LEARNING] = "learning",
@@ -31,10 +31,9 @@ static const char *br_port_state_names[] = {
 
 void br_log_state(const struct net_bridge_port *p)
 {
-       pr_info("%s: port %d(%s) entering %s state\n",
-               p->br->dev->name, p->port_no, p->dev->name,
+       br_info(p->br, "port %u(%s) entering %s state\n",
+               (unsigned) p->port_no, p->dev->name,
                br_port_state_names[p->state]);
-
 }
 
 /* called under bridge lock */
@@ -297,7 +296,10 @@ void br_topology_change_detection(struct net_bridge *br)
 {
        int isroot = br_is_root_bridge(br);
 
-       pr_info("%s: topology change detected, %s\n", br->dev->name,
+       if (br->stp_enabled != BR_KERNEL_STP)
+               return;
+
+       br_info(br, "topology change detected, %s\n",
                isroot ? "propagating" : "sending tcn bpdu");
 
        if (isroot) {
@@ -368,14 +370,27 @@ 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_multicast_enable_port(p);
+
+       br_log_state(p);
+
+       if (br->forward_delay != 0)
+               mod_timer(&p->forward_delay_timer, jiffies + br->forward_delay);
 }
 
 /* called under bridge lock */
@@ -453,8 +468,8 @@ void br_received_config_bpdu(struct net_bridge_port *p, struct br_config_bpdu *b
 void br_received_tcn_bpdu(struct net_bridge_port *p)
 {
        if (br_is_designated_port(p)) {
-               pr_info("%s: received tcn bpdu on port %i(%s)\n",
-                      p->br->dev->name, p->port_no, p->dev->name);
+               br_info(p->br, "port %u(%s) received tcn bpdu\n",
+                       (unsigned) p->port_no, p->dev->name);
 
                br_topology_change_detection(p->br);
                br_topology_change_acknowledge(p);