]> xenbits.xen.org Git - xenclient/linux-2.6.27-pq.git/commitdiff
Add patch to make bridge carrier track the status of a priority 0 port
authorThomas Horsten <thomas.horsten@citrix.com>
Thu, 3 Sep 2009 12:53:29 +0000 (13:53 +0100)
committerThomas Horsten <thomas.horsten@citrix.com>
Thu, 3 Sep 2009 12:53:29 +0000 (13:53 +0100)
master/bridge-carrier-follows-prio0.patch [new file with mode: 0644]
master/series

diff --git a/master/bridge-carrier-follows-prio0.patch b/master/bridge-carrier-follows-prio0.patch
new file mode 100644 (file)
index 0000000..4ea99e1
--- /dev/null
@@ -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 */
index 1613091fc52a31bb28f4e42db8a4730f3cda1b3c..c9b7b42f06db56305e06334bbd3c049fb759e250 100644 (file)
@@ -312,3 +312,4 @@ on-the-fly-cx-change
 bridge-carrier
 blktap2-pause-unpause
 blktap2-smp-map-unmap
+bridge-carrier-follows-prio0.patch