Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com>
---
 lib/rstp.c |   54 ++++++++++++++++++++++--------------------------------
 1 file changed, 22 insertions(+), 32 deletions(-)

diff --git a/lib/rstp.c b/lib/rstp.c
index 17830d9..6254bb8 100644
--- a/lib/rstp.c
+++ b/lib/rstp.c
@@ -225,19 +225,32 @@ rstp_create(const char *name, rstp_identifier 
bridge_address,
  */
 static void
 set_bridge_priority__(struct rstp *rstp)
+    OVS_REQUIRES(mutex)
 {
     rstp->bridge_priority.root_bridge_id = rstp->bridge_identifier;
     rstp->bridge_priority.designated_bridge_id = rstp->bridge_identifier;
     VLOG_DBG("%s: new bridge identifier: "RSTP_ID_FMT"", rstp->name,
              RSTP_ID_ARGS(rstp->bridge_identifier));
+
+    /* [17.13] When the bridge address changes, recalculates all priority
+     * vectors.
+     */
+    if (rstp->ports_count > 0) {
+        struct rstp_port *p;
+
+        LIST_FOR_EACH (p, node, &rstp->ports) {
+            p->selected = false;
+            p->reselect = true;
+        }
+    }
+    rstp->changes = true;
+    updt_roles_tree(rstp);
 }
 
 /* Sets the bridge address. */
 void
 rstp_set_bridge_address(struct rstp *rstp, rstp_identifier bridge_address)
 {
-    struct rstp_port *p;
-
     VLOG_DBG("%s: set bridge address to: "RSTP_ID_FMT"", rstp->name,
              RSTP_ID_ARGS(bridge_address));
 
@@ -245,18 +258,6 @@ rstp_set_bridge_address(struct rstp *rstp, rstp_identifier 
bridge_address)
     rstp->address = bridge_address;
     rstp->bridge_identifier = bridge_address;
     set_bridge_priority__(rstp);
-
-    /* [17.13] When the bridge address changes, recalculates all priority
-     * vectors.
-     */
-    if (rstp->ports_count > 0) {
-        LIST_FOR_EACH (p, node, &rstp->ports) {
-            p->selected = false;
-            p->reselect = true;
-        }
-    }
-    rstp->changes = true;
-    updt_roles_tree(rstp);
     ovs_mutex_unlock(&mutex);
 }
 
@@ -286,28 +287,17 @@ rstp_get_bridge_id(const struct rstp *rstp)
 void
 rstp_set_bridge_priority(struct rstp *rstp, int new_priority)
 {
-    struct rstp_port *p;
+    new_priority = ROUND_DOWN(new_priority, RSTP_PRIORITY_STEP);
+
+    if (new_priority >= RSTP_MIN_PRIORITY
+        && new_priority <= RSTP_MAX_PRIORITY) {
+        VLOG_DBG("%s: set bridge priority to %d", rstp->name, new_priority);
 
-    if (new_priority >= RSTP_MIN_PRIORITY &&
-            new_priority <= RSTP_MAX_PRIORITY) {
-        VLOG_DBG("%s: set bridge priority to %d", rstp->name,
-                 (new_priority / 4096) * 4096);
         ovs_mutex_lock(&mutex);
-        rstp->priority = (new_priority / 4096) * 4096;
+        rstp->priority = new_priority;
         rstp->bridge_identifier &= 0x0000ffffffffffffULL;
-        rstp->bridge_identifier |=
-                              (uint64_t) ((new_priority / 4096) * 4096) << 48;
+        rstp->bridge_identifier |= (uint64_t)new_priority << 48;
         set_bridge_priority__(rstp);
-
-        /* [17.13] */
-        if (rstp->ports_count > 0){
-            LIST_FOR_EACH (p, node, &rstp->ports) {
-                p->selected = false;
-                p->reselect = true;
-            }
-        }
-        rstp->changes = true;
-        updt_roles_tree(rstp);
         ovs_mutex_unlock(&mutex);
     }
 }
-- 
1.7.10.4

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to