From 45fd000c75267098c4dfd9edda1fe36402adb1ee Mon Sep 17 00:00:00 2001 From: Thomas Horsten Date: Thu, 3 Sep 2009 13:53:29 +0100 Subject: [PATCH] Add patch to make bridge carrier track the status of a priority 0 port --- master/bridge-carrier-follows-prio0.patch | 71 +++++++++++++++++++++++ master/series | 1 + 2 files changed, 72 insertions(+) create mode 100644 master/bridge-carrier-follows-prio0.patch diff --git a/master/bridge-carrier-follows-prio0.patch b/master/bridge-carrier-follows-prio0.patch new file mode 100644 index 0000000..4ea99e1 --- /dev/null +++ b/master/bridge-carrier-follows-prio0.patch @@ -0,0 +1,71 @@ +diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c +index d87fe35..a0f8c69 100644 +--- a/net/bridge/br_if.c ++++ b/net/bridge/br_if.c +@@ -70,13 +70,14 @@ void br_port_carrier_check(struct net_bridge_port *p) + { + struct net_device *dev = p->dev; + struct net_bridge *br = p->br; ++ int carrier_ok = netif_carrier_ok(dev); + +- if (netif_carrier_ok(dev)) ++ if (carrier_ok) + p->path_cost = port_cost(dev); + + if (netif_running(br->dev)) { + spin_lock_bh(&br->lock); +- if (netif_carrier_ok(dev)) { ++ if (carrier_ok) { + if (p->state == BR_STATE_DISABLED) + br_stp_enable_port(p); + } else { +@@ -85,6 +86,18 @@ void br_port_carrier_check(struct net_bridge_port *p) + } + spin_unlock_bh(&br->lock); + } ++ if (p->priority == 0) { ++ if (netif_carrier_ok(br->dev) != carrier_ok) { ++ printk("prio 0 port %s carrier %s, update bridge %s state\n", ++ p->dev->name, carrier_ok?"on":"off", ++ br->dev->name); ++ if (carrier_ok) { ++ netif_carrier_on(br->dev); ++ } else { ++ netif_carrier_off(br->dev); ++ } ++ } ++ } + } + + static void release_nbp(struct kobject *kobj) +diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c +index 9a52ac5..2416561 100644 +--- a/net/bridge/br_stp_if.c ++++ b/net/bridge/br_stp_if.c +@@ -258,6 +258,7 @@ void br_stp_set_bridge_priority(struct net_bridge *br, u16 newprio) + void br_stp_set_port_priority(struct net_bridge_port *p, u8 newprio) + { + port_id new_port_id = br_make_port_id(newprio, p->port_no); ++ int carrier; + + if (br_is_designated_port(p)) + p->designated_port = new_port_id; +@@ -269,6 +270,18 @@ void br_stp_set_port_priority(struct net_bridge_port *p, u8 newprio) + br_become_designated_port(p); + br_port_state_selection(p->br); + } ++ if (newprio == 0) { ++ carrier = netif_carrier_ok(p->dev); ++ if (carrier != netif_carrier_ok(p->br->dev)) { ++ printk("prio 0 port %s carrier %s, update bridge %s state\n", ++ p->dev->name, carrier?"on":"off", ++ p->br->dev->name); ++ if (carrier) ++ netif_carrier_on(p->br->dev); ++ else ++ netif_carrier_off(p->br->dev); ++ } ++ } + } + + /* called under bridge lock */ diff --git a/master/series b/master/series index 1613091..c9b7b42 100644 --- a/master/series +++ b/master/series @@ -312,3 +312,4 @@ on-the-fly-cx-change bridge-carrier blktap2-pause-unpause blktap2-smp-map-unmap +bridge-carrier-follows-prio0.patch -- 2.39.5