From: Greg Kroah-Hartman Date: Mon, 1 Aug 2011 21:26:09 +0000 (-0700) Subject: 3.0 patches X-Git-Tag: v2.6.39.4~17 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3bd8b0054a0c800b2c36341d9311f509340bea69;p=thirdparty%2Fkernel%2Fstable-queue.git 3.0 patches --- 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 00000000000..ce0d8eacb85 --- /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 +Date: Fri, 22 Jul 2011 07:47:06 +0000 +Subject: bridge: send proper message_age in config BPDU + +From: stephen hemminger + +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 +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + 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 8e54453a0d3..a8bbabb76fd 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