Commit 1d2601d8 authored by Stephen Hemminger's avatar Stephen Hemminger Committed by David S. Miller

[BRIDGE]: Fix message age in bridge STP config packets.

This is a revised version of Kishore's patch to set message age appropriately
in STP configuration packets.
Signed-off-by: default avatarKishore A K <KishoreAK@myw.ltindia.com>
Signed-off-by: default avatarStephen Hemminger <shemminger@osdl.org>
Signed-off-by: default avatarDavid S. Miller <davem@redhat.com>
parent dcc64c24
...@@ -18,6 +18,11 @@ ...@@ -18,6 +18,11 @@
#include "br_private.h" #include "br_private.h"
#include "br_private_stp.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))
static const char *br_port_state_names[] = { static const char *br_port_state_names[] = {
[BR_STATE_DISABLED] = "disabled", [BR_STATE_DISABLED] = "disabled",
[BR_STATE_LISTENING] = "listening", [BR_STATE_LISTENING] = "listening",
...@@ -157,24 +162,25 @@ void br_transmit_config(struct net_bridge_port *p) ...@@ -157,24 +162,25 @@ void br_transmit_config(struct net_bridge_port *p)
bpdu.root_path_cost = br->root_path_cost; bpdu.root_path_cost = br->root_path_cost;
bpdu.bridge_id = br->bridge_id; bpdu.bridge_id = br->bridge_id;
bpdu.port_id = p->port_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 struct net_bridge_port *root
= br_get_port(br, br->root_port); = br_get_port(br, br->root_port);
bpdu.max_age = root->message_age_timer.expires - jiffies; bpdu.message_age = br->max_age
- (root->message_age_timer.expires - jiffies)
if (bpdu.max_age <= 0) bpdu.max_age = 1; + MESSAGE_AGE_INCR;
} }
bpdu.max_age = br->max_age; bpdu.max_age = br->max_age;
bpdu.hello_time = br->hello_time; bpdu.hello_time = br->hello_time;
bpdu.forward_delay = br->forward_delay; 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->topology_change_ack = 0;
p->config_pending = 0; p->config_pending = 0;
mod_timer(&p->hold_timer, jiffies + BR_HOLD_TIME);
mod_timer(&p->hold_timer, jiffies + BR_HOLD_TIME); }
} }
/* called under bridge lock */ /* called under bridge lock */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment