diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2011-08-01 14:26:09 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-08-01 14:26:09 -0700 |
commit | 3bd8b0054a0c800b2c36341d9311f509340bea69 (patch) | |
tree | d6fae540c456b15c58f3fe6f349fc464c8eba336 | |
parent | 85d4c989728d0498552d000cb4cac2d1e848e58b (diff) | |
download | stable-queue-3bd8b0054a0c800b2c36341d9311f509340bea69.tar.gz |
3.0 patches
-rw-r--r-- | queue-3.0/bridge-send-proper-message_age-in-config-bpdu.patch | 82 | ||||
-rw-r--r-- | queue-3.0/series | 1 |
2 files changed, 83 insertions, 0 deletions
diff --git a/queue-3.0/bridge-send-proper-message_age-in-config-bpdu.patch b/queue-3.0/bridge-send-proper-message_age-in-config-bpdu.patch new file mode 100644 index 0000000000..ce0d8eacb8 --- /dev/null +++ b/queue-3.0/bridge-send-proper-message_age-in-config-bpdu.patch @@ -0,0 +1,82 @@ +From 0c03150e7ea8f7fcd03cfef29385e0010b22ee92 Mon Sep 17 00:00:00 2001 +From: stephen hemminger <shemminger@vyatta.com> +Date: Fri, 22 Jul 2011 07:47:06 +0000 +Subject: bridge: send proper message_age in config BPDU + +From: stephen hemminger <shemminger@vyatta.com> + +commit 0c03150e7ea8f7fcd03cfef29385e0010b22ee92 upstream. + +A bridge topology with three systems: + + +------+ +------+ + | A(2) |--| B(1) | + +------+ +------+ + \ / + +------+ + | C(3) | + +------+ + +What is supposed to happen: + * bridge with the lowest ID is elected root (for example: B) + * C detects that A->C is higher cost path and puts in blocking state + +What happens. Bridge with lowest id (B) is elected correctly as +root and things start out fine initially. But then config BPDU +doesn't get transmitted from A -> C. Because of that +the link from A-C is transistioned to the forwarding state. + +The root cause of this is that the configuration messages +is generated with bogus message age, and dropped before +sending. + +In the standardmessage_age is supposed to be: + the time since the generation of the Configuration BPDU by + the Root that instigated the generation of this Configuration BPDU. + +Reimplement this by recording the timestamp (age + jiffies) when +recording config information. The old code incorrectly used the time +elapsed on the ageing timer which was incorrect. + +See also: + https://bugzilla.vyatta.com/show_bug.cgi?id=7164 + +Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + net/bridge/br_private.h | 1 + + net/bridge/br_stp.c | 4 ++-- + 2 files changed, 3 insertions(+), 2 deletions(-) + +--- a/net/bridge/br_private.h ++++ b/net/bridge/br_private.h +@@ -124,6 +124,7 @@ struct net_bridge_port + bridge_id designated_bridge; + u32 path_cost; + u32 designated_cost; ++ unsigned long designated_age; + + struct timer_list forward_delay_timer; + struct timer_list hold_timer; +--- a/net/bridge/br_stp.c ++++ b/net/bridge/br_stp.c +@@ -164,8 +164,7 @@ void br_transmit_config(struct net_bridg + else { + struct net_bridge_port *root + = br_get_port(br, br->root_port); +- bpdu.message_age = br->max_age +- - (root->message_age_timer.expires - jiffies) ++ bpdu.message_age = (jiffies - root->designated_age) + + MESSAGE_AGE_INCR; + } + bpdu.max_age = br->max_age; +@@ -189,6 +188,7 @@ static inline void br_record_config_info + p->designated_cost = bpdu->root_path_cost; + p->designated_bridge = bpdu->bridge_id; + p->designated_port = bpdu->port_id; ++ p->designated_age = jiffies + bpdu->message_age; + + mod_timer(&p->message_age_timer, jiffies + + (p->br->max_age - bpdu->message_age)); diff --git a/queue-3.0/series b/queue-3.0/series index 8e54453a0d..a8bbabb76f 100644 --- a/queue-3.0/series +++ b/queue-3.0/series @@ -1,3 +1,4 @@ usb-serial-add-ids-for-winchiphead-usb-rs232-adapter.patch mmc-added-quirks-for-ricoh-1180-e823-lower-base-clock.patch mmc-sdhci-esdhc-imx-sdhci_card_present-does-not-get.patch +bridge-send-proper-message_age-in-config-bpdu.patch |