[Bridge] [PATCH 2.4] Bridge STP message age
Stephen Hemminger
shemminger at osdl.org
Tue Jun 29 15:37:40 PDT 2004
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 <shemminger at osdl.org>
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 */
More information about the Bridge
mailing list