This is the 2.4 version which incorporates the observations from Kishore
about 2.6. The existing 2.4 code set the age properly, but did not increment
correctly for HZ=1000 and could send a stale (expired) configuration.

Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]>

diff -Nru a/net/bridge/br_stp.c b/net/bridge/br_stp.c
--- a/net/bridge/br_stp.c       2004-06-29 15:30:32 -07:00
+++ b/net/bridge/br_stp.c       2004-06-29 15:30:32 -07:00
@@ -20,7 +20,10 @@
 #include "br_private.h"
 #include "br_private_stp.h"
 
-
+/* since time values in bpdu are in jiffies and then scaled (1/256)
+ * before sending, make sure that is at least one.
+ */
+#define MESSAGE_AGE_INCR       ((HZ < 256) ? 1 : (HZ/256))
 
 /* called under ioctl_lock or bridge lock */
 int br_is_root_bridge(struct net_bridge *br)
@@ -160,24 +163,26 @@
        bpdu.root_path_cost = br->root_path_cost;
        bpdu.bridge_id = br->bridge_id;
        bpdu.port_id = p->port_id;
-       bpdu.message_age = 0;
-       if (!br_is_root_bridge(br)) {
+       if (br_is_root_bridge(br)) 
+               bpdu.message_age = 0;
+       else {
                struct net_bridge_port *root;
-               unsigned long age;
 
                root = br_get_port(br, br->root_port);
-               age = br_timer_get_residue(&root->message_age_timer) + 1;
-               bpdu.message_age = age;
+               bpdu.message_age =  br_timer_get_residue(&root->message_age_timer)
+                       + MESSAGE_AGE_INCR;
        }
        bpdu.max_age = br->max_age;
        bpdu.hello_time = br->hello_time;
        bpdu.forward_delay = br->forward_delay;
 
-       br_send_config_bpdu(p, &bpdu);
+       if (bpdu.message_age < br->max_age) {
+               br_send_config_bpdu(p, &bpdu);
 
-       p->topology_change_ack = 0;
-       p->config_pending = 0;
-       br_timer_set(&p->hold_timer, jiffies);
+               p->topology_change_ack = 0;
+               p->config_pending = 0;
+               br_timer_set(&p->hold_timer, jiffies);
+       }
 }
 
 /* called under bridge lock */
_______________________________________________
Bridge mailing list
[EMAIL PROTECTED]
http://lists.osdl.org/mailman/listinfo/bridge

Reply via email to