Skip to contentSkip to conversation

Bridge STP message age

PATCH In review Stephen Hemminger 2 participants 2 messages Jun 29, 2004 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): s0dc91e5.046@EMAIL

#1 lore raw

PATCH 1/1 Bridge STP message age

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.

net/bridge/br_stp.c +15 -10
diff -Nru a/net/bridge/br_stp.c b/net/bridge/br_stp.c
@@ -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 */
#2 lore raw
Quoted 3 lines · On Tue, 29 Jun 2004 15:37:40 -0700 Stephen Hemminger <[email protected]>…

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.

Both 2.4.x and 2.6.x variants applied, thanks Stephen.