lacp: Allow configurable aggregation keys.
authorEthan Jackson <ethan@nicira.com>
Tue, 26 Apr 2011 22:39:58 +0000 (15:39 -0700)
committerEthan Jackson <ethan@nicira.com>
Wed, 27 Apr 2011 00:54:33 +0000 (17:54 -0700)
Users will the ability to manually set aggregation keys on a
per-slave basis in order to use some of the more advanced LACP
features.  Most notably, LACP controlled active-backup bonding
requires fine grained aggregation key configuration.

lib/lacp.c
lib/lacp.h
vswitchd/bridge.c
vswitchd/vswitch.xml

index 21d329eb019a3f985aa594098518b72c1e30d263..87f70bf77d5de9c898c29e0e3f21fe206fad2a91 100644 (file)
@@ -63,6 +63,7 @@ struct slave {
     struct lacp *lacp;            /* LACP object containing this slave. */
     uint16_t port_id;             /* Port ID. */
     uint16_t port_priority;       /* Port Priority. */
+    uint16_t key;                 /* Aggregation Key. 0 if default. */
     char *name;                   /* Name of this slave. */
 
     enum slave_status status;     /* Slave status. */
@@ -274,9 +275,12 @@ lacp_slave_register(struct lacp *lacp, void *slave_,
         slave->name = xstrdup(s->name);
     }
 
-    if (slave->port_id != s->id || slave->port_priority != s->priority) {
+    if (slave->port_id != s->id
+        || slave->port_priority != s->priority
+        || slave->key != s->key) {
         slave->port_id = s->id;
         slave->port_priority = s->priority;
+        slave->key = s->key;
 
         lacp->update = true;
 
@@ -528,6 +532,7 @@ static void
 slave_get_actor(struct slave *slave, struct lacp_info *actor)
 {
     struct lacp *lacp = slave->lacp;
+    uint16_t key;
     uint8_t state = 0;
 
     if (lacp->active) {
@@ -558,8 +563,13 @@ slave_get_actor(struct slave *slave, struct lacp_info *actor)
         state |= LACP_STATE_COL | LACP_STATE_DIST;
     }
 
+    key = lacp->key_slave->key;
+    if (!key) {
+        key = lacp->key_slave->port_id;
+    }
+
     actor->state = state;
-    actor->key = htons(lacp->key_slave->port_id);
+    actor->key = htons(key);
     actor->port_priority = htons(slave->port_priority);
     actor->port_id = htons(slave->port_id);
     actor->sys_priority = htons(lacp->sys_priority);
index 871056c4dfd552b57729ec4a2e43810da4079753..fb91b4f14701ef6bdd5bb6c7e18e7f92f72884d4 100644 (file)
@@ -107,6 +107,7 @@ struct lacp_slave_settings {
     char *name;
     uint16_t id;
     uint16_t priority;
+    uint16_t key;
 };
 
 void lacp_slave_register(struct lacp *, void *slave_,
index 270ab800d36bcb589e4476b0195cf9dfc618e9ed..b2dc55fb8fbdb5717c4d1ce991644dd8920cb979 100644 (file)
@@ -3136,11 +3136,13 @@ static void
 iface_reconfigure_lacp(struct iface *iface)
 {
     struct lacp_slave_settings s;
-    int priority, portid;
+    int priority, portid, key;
 
     portid = atoi(get_interface_other_config(iface->cfg, "lacp-port-id", "0"));
     priority = atoi(get_interface_other_config(iface->cfg,
                                                "lacp-port-priority", "0"));
+    key = atoi(get_interface_other_config(iface->cfg, "lacp-aggregation-key",
+                                          "0"));
 
     if (portid <= 0 || portid > UINT16_MAX) {
         portid = iface->dp_ifidx;
@@ -3150,9 +3152,14 @@ iface_reconfigure_lacp(struct iface *iface)
         priority = UINT16_MAX;
     }
 
+    if (key < 0 || key > UINT16_MAX) {
+        key = 0;
+    }
+
     s.name = iface->name;
     s.id = portid;
     s.priority = priority;
+    s.key = key;
     lacp_slave_register(iface->port->lacp, iface, &s);
 }
 
index e75483559e7ced22af75ec9e3e494cafc6c566dd..48315fa9c1a68e2231106b33b2ca2bebbd068a8a 100644 (file)
             LACP negotiations <ref table="Interface"/>s with numerically lower
             priorities are preferred for aggregation.  Must be a number between
             1 and 65535.</dd>
+          <dt><code>lacp-aggregation-key</code></dt>
+          <dd> The LACP aggregation key of this <ref table="Interface"/>.
+            <ref table="Interface"/>s with different aggregation keys may not
+            be active within a given <ref table="Port"/> at the same time. Must
+            be a number between 1 and 65535.</dd>
         </dl>
       </column>