lacp: New "strict" lacp mode.
authorEthan Jackson <ethan@nicira.com>
Mon, 18 Apr 2011 22:13:34 +0000 (15:13 -0700)
committerEthan Jackson <ethan@nicira.com>
Tue, 19 Apr 2011 17:33:19 +0000 (10:33 -0700)
When LACP negotiations are unsuccessful, OVS falls back to standard
balance-slb bonding.  In some cases, users may want to require
successful LACP negotiations for any slaves to be enabled at all.
This patch implements a new "strict" mode which disables all slaves
when LACP negotiations are unsuccessful.

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

index a842fbe428ce9b212918d70255695b6b0a888a5e..3c7b1caab5a13dc1d417c4f7259527b42b919397 100644 (file)
@@ -49,6 +49,7 @@ struct lacp {
     struct slave *key_slave; /* Slave whose ID will be the aggregation key. */
 
     bool fast;                /* Fast or Slow LACP time. */
+    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. */
 };
@@ -133,9 +134,11 @@ lacp_configure(struct lacp *lacp, const struct lacp_settings *s)
     }
 
     if (!eth_addr_equals(lacp->sys_id, s->id)
-        || lacp->sys_priority != s->priority) {
+        || lacp->sys_priority != s->priority
+        || lacp->strict != s->strict) {
         memcpy(lacp->sys_id, s->id, ETH_ADDR_LEN);
         lacp->sys_priority = s->priority;
+        lacp->strict = s->strict;
         lacp->update = true;
     }
 
@@ -348,7 +351,7 @@ lacp_wait(struct lacp *lacp)
 \f
 /* Static Helpers. */
 
-/* Updates the attached status of all slaves controlled b 'lacp' and sets its
+/* Updates the attached status of all slaves controlled by 'lacp' and sets its
  * negotiated parameter to true if any slaves are attachable. */
 static void
 lacp_update_attached(struct lacp *lacp)
@@ -397,6 +400,10 @@ lacp_update_attached(struct lacp *lacp)
                 slave->attached = false;
             }
         }
+    } else if (lacp->strict) {
+        HMAP_FOR_EACH (slave, node, &lacp->slaves) {
+            slave->attached = false;
+        }
     }
 }
 
@@ -620,9 +627,16 @@ lacp_unixctl_show(struct unixctl_conn *conn,
     }
 
     ds_put_format(&ds, "lacp: %s\n", lacp->name);
-    ds_put_format(&ds, "\tstatus: %s %s\n",
-                  lacp->active ? "active" : "passive",
-                  lacp->negotiated ? "negotiated" : "");
+
+    ds_put_format(&ds, "\tstatus: %s", lacp->active ? "active" : "passive");
+    if (lacp->strict) {
+        ds_put_cstr(&ds, " strict");
+    }
+    if (lacp->negotiated) {
+        ds_put_cstr(&ds, " negotiated");
+    }
+    ds_put_cstr(&ds, "\n");
+
     ds_put_format(&ds, "\tsys_id: " ETH_ADDR_FMT "\n", ETH_ADDR_ARGS(lacp->sys_id));
     ds_put_format(&ds, "\tsys_priority: %u\n", lacp->sys_priority);
     ds_put_cstr(&ds, "\taggregation key: ");
index 2992bcfd78cc72fb0179ebaf10761e6e1888575b..ad8211efc5dd848f27db58d003c403ac85f54171 100644 (file)
@@ -27,6 +27,7 @@ struct lacp_settings {
     uint16_t priority;
     bool active;
     bool fast;
+    bool strict;
 };
 
 void lacp_init(void);
index 8b82de80f7ed8a7172ef88cdb0227eb88a5d1826..78c0a09a0a0aa3a04ebf7142f5f4cb2e909f3a76 100644 (file)
@@ -3135,6 +3135,9 @@ port_reconfigure_lacp(struct port *port)
 
     s.fast = !strcmp(get_port_other_config(port->cfg, "lacp-time", "slow"),
                      "fast");
+    s.strict = !strcmp(get_port_other_config(port->cfg, "lacp-strict",
+                                             "false"),
+                       "true");
 
     if (!port->lacp) {
         port->lacp = lacp_create();
index 566e6cf69ce0c7560f28cda337c7b5add2e0a429..6031b5a0efcafe7c7938afd15abf0f24bb0804b0 100644 (file)
 
       <column name="lacp">
         <p>Configures LACP on this port.  LACP allows directly connected
-          switches to negotiate which links may be bonded.  LACP may be enabled
-          on non-bonded ports for the benefit of any switches they may be
+          switchs to negotiate which links may be bonded.  LACP may be enabled
+          on non-bonded ports for the benefit of any switchs they may be
           connected to.  <code>active</code> ports are allowed to initiate LACP
           negotiations.  <code>passive</code> ports are allowed to participate
           in LACP negotiations initiated by a remote switch, but not allowed to
             configured to be <code>fast</code> more frequent LACP heartbeats
             will be requested causing connectivity problems to be detected more
             quickly.</dd>
+          <dt><code>lacp-strict</code></dt>
+          <dd> When <code>true</code>, configures this <ref table="Port"/> to
+            require successful LACP negotiations to enable any slaves.
+            Defaults to <code>false</code> which safely allows LACP to be used
+            with switchs that do not support the protocol.</dd>
         </dl>
       </column>
     </group>