lacp: New other_config setting "lacp-force-aggregatable".
authorEthan Jackson <ethan@nicira.com>
Tue, 26 Apr 2011 22:05:19 +0000 (15:05 -0700)
committerEthan Jackson <ethan@nicira.com>
Wed, 27 Apr 2011 00:51:09 +0000 (17:51 -0700)
In some extremely advanced situations, one may want to force
non-bondable slaves to advertise themselves as bondable.  This
patch adds that capability.

Also includes some minor code cleanup.

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

index a7f66a24ab0c2e8e1f282c49c6f77a341238f61f..21d329eb019a3f985aa594098518b72c1e30d263 100644 (file)
@@ -53,6 +53,7 @@ struct lacp {
     bool strict;             /* True if in strict mode. */
     bool negotiated;         /* True if LACP negotiations were successful. */
     bool update;             /* True if lacp_update() needs to be called. */
+    bool force_agg;          /* Forces LACP_STATE_AGG bit on all slaves. */
 };
 
 struct slave {
@@ -190,6 +191,7 @@ lacp_configure(struct lacp *lacp, const struct lacp_settings *s)
 
     lacp->active = s->active;
     lacp->lacp_time = s->lacp_time;
+    lacp->force_agg = s->force_agg;
     lacp->custom_time = MAX(TIME_UPDATE_INTERVAL, s->custom_time);
 }
 
@@ -525,13 +527,14 @@ slave_set_expired(struct slave *slave)
 static void
 slave_get_actor(struct slave *slave, struct lacp_info *actor)
 {
+    struct lacp *lacp = slave->lacp;
     uint8_t state = 0;
 
-    if (slave->lacp->active) {
+    if (lacp->active) {
         state |= LACP_STATE_ACT;
     }
 
-    if (slave->lacp->lacp_time != LACP_TIME_SLOW) {
+    if (lacp->lacp_time != LACP_TIME_SLOW) {
         state |= LACP_STATE_TIME;
     }
 
@@ -547,20 +550,20 @@ slave_get_actor(struct slave *slave, struct lacp_info *actor)
         state |= LACP_STATE_EXP;
     }
 
-    if (hmap_count(&slave->lacp->slaves) > 1) {
+    if (lacp->force_agg || hmap_count(&lacp->slaves) > 1) {
         state |= LACP_STATE_AGG;
     }
 
-    if (slave->attached || !slave->lacp->negotiated) {
+    if (slave->attached || !lacp->negotiated) {
         state |= LACP_STATE_COL | LACP_STATE_DIST;
     }
 
     actor->state = state;
-    actor->key = htons(slave->lacp->key_slave->port_id);
+    actor->key = htons(lacp->key_slave->port_id);
     actor->port_priority = htons(slave->port_priority);
     actor->port_id = htons(slave->port_id);
-    actor->sys_priority = htons(slave->lacp->sys_priority);
-    memcpy(&actor->sys_id, slave->lacp->sys_id, ETH_ADDR_LEN);
+    actor->sys_priority = htons(lacp->sys_priority);
+    memcpy(&actor->sys_id, lacp->sys_id, ETH_ADDR_LEN);
 }
 
 /* Given 'slave', populates 'priority' with data representing its LACP link
index 396569205e9df3d85437482dc5fa29fa8a0ad312..871056c4dfd552b57729ec4a2e43810da4079753 100644 (file)
@@ -89,6 +89,7 @@ struct lacp_settings {
     enum lacp_time lacp_time;
     long long int custom_time;
     bool strict;
+    bool force_agg;
 };
 
 void lacp_init(void);
index dee19a9bbf699a063dc6000ded8c45204cb9349d..270ab800d36bcb589e4476b0195cf9dfc618e9ed 100644 (file)
@@ -3193,6 +3193,10 @@ port_reconfigure_lacp(struct port *port)
                                              "false"),
                        "true");
 
+    s.force_agg = !strcmp(get_port_other_config(port->cfg,
+                                                "lacp-force-aggregatable",
+                                                "false"), "true");
+
     lacp_time = get_port_other_config(port->cfg, "lacp-time", "slow");
     custom_time = atoi(lacp_time);
     if (!strcmp(lacp_time, "fast")) {
index 0ec1fd3c95fe55ae9cddd4427de7774b1259fe5e..e75483559e7ced22af75ec9e3e494cafc6c566dd 100644 (file)
             require successful LACP negotiations to enable any slaves.
             Defaults to <code>false</code> which safely allows LACP to be used
             with switches that do not support the protocol.</dd>
+          <dt><code>lacp-force-aggregatable</code></dt>
+          <dd> When <code>true</code>, forces all slaves managed by this
+            <ref table="Port"/> to advertise themselves as aggregatable even if
+            they normally wouldn't.  Defaults to <code>false</code>.</dd>
         </dl>
       </column>
     </group>