lacp: New "lacp-heartbeat" mode.
authorEthan Jackson <ethan@nicira.com>
Thu, 5 May 2011 23:52:56 +0000 (16:52 -0700)
committerEthan Jackson <ethan@nicira.com>
Fri, 6 May 2011 20:48:41 +0000 (13:48 -0700)
This commit creates a new heartbeat mode for LACP.  This mode
treats LACP as a protocol simply for monitoring link status.  It
strips out most of the sanity checks built into the protocol.
Addition of this mode makes "lacp-force-aggregatable" and
"lacp-strict" options obsolete so they are removed.

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

index 87f70bf77d5de9c898c29e0e3f21fe206fad2a91..3fe5eff320a1fbb56c8fa2dbea3dcf5dedb9182b 100644 (file)
@@ -50,10 +50,9 @@ struct lacp {
 
     enum lacp_time lacp_time;  /* Fast, Slow or Custom LACP time. */
     long long int custom_time; /* LACP_TIME_CUSTOM transmission rate. */
-    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. */
+    bool heartbeat;          /* LACP heartbeat mode. */
 };
 
 struct slave {
@@ -183,16 +182,15 @@ 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->strict != s->strict) {
+        || lacp->heartbeat != s->heartbeat) {
         memcpy(lacp->sys_id, s->id, ETH_ADDR_LEN);
         lacp->sys_priority = s->priority;
-        lacp->strict = s->strict;
+        lacp->heartbeat = s->heartbeat;
         lacp->update = true;
     }
 
     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);
 }
 
@@ -431,6 +429,13 @@ lacp_update_attached(struct lacp *lacp)
     struct lacp_info lead_pri;
     static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 10);
 
+    if (lacp->heartbeat) {
+        HMAP_FOR_EACH (slave, node, &lacp->slaves) {
+            slave->attached = slave->status != LACP_DEFAULTED;
+        }
+        return;
+    }
+
     lacp->update = false;
 
     lead = NULL;
@@ -471,10 +476,6 @@ lacp_update_attached(struct lacp *lacp)
                 slave->attached = false;
             }
         }
-    } else if (lacp->strict) {
-        HMAP_FOR_EACH (slave, node, &lacp->slaves) {
-            slave->attached = false;
-        }
     }
 }
 
@@ -555,7 +556,7 @@ slave_get_actor(struct slave *slave, struct lacp_info *actor)
         state |= LACP_STATE_EXP;
     }
 
-    if (lacp->force_agg || hmap_count(&lacp->slaves) > 1) {
+    if (lacp->heartbeat || hmap_count(&lacp->slaves) > 1) {
         state |= LACP_STATE_AGG;
     }
 
@@ -715,8 +716,8 @@ lacp_unixctl_show(struct unixctl_conn *conn,
     ds_put_format(&ds, "lacp: %s\n", lacp->name);
 
     ds_put_format(&ds, "\tstatus: %s", lacp->active ? "active" : "passive");
-    if (lacp->strict) {
-        ds_put_cstr(&ds, " strict");
+    if (lacp->heartbeat) {
+        ds_put_cstr(&ds, " heartbeat");
     }
     if (lacp->negotiated) {
         ds_put_cstr(&ds, " negotiated");
index fb91b4f14701ef6bdd5bb6c7e18e7f92f72884d4..0fb797e89b790173012048465b06c800bb2454dc 100644 (file)
@@ -88,8 +88,7 @@ struct lacp_settings {
     bool active;
     enum lacp_time lacp_time;
     long long int custom_time;
-    bool strict;
-    bool force_agg;
+    bool heartbeat;
 };
 
 void lacp_init(void);
index 09fc37d02133582a62f283bba9901b01ce8b327b..d883596de83c0e129c088974516cd4554d6495d8 100644 (file)
@@ -3196,12 +3196,8 @@ port_reconfigure_lacp(struct port *port)
                   ? priority
                   : UINT16_MAX - !list_is_short(&port->ifaces));
 
-    s.strict = !strcmp(get_port_other_config(port->cfg, "lacp-strict",
-                                             "false"),
-                       "true");
-
-    s.force_agg = !strcmp(get_port_other_config(port->cfg,
-                                                "lacp-force-aggregatable",
+    s.heartbeat = !strcmp(get_port_other_config(port->cfg,
+                                                "lacp-heartbeat",
                                                 "false"), "true");
 
     lacp_time = get_port_other_config(port->cfg, "lacp-time", "slow");
index 56c77ac6067e75bf9daad29778dfc3afbe117d58..96be69f7354dd48d7a739301d13686f544c1e4bd 100644 (file)
@@ -1,6 +1,6 @@
 {"name": "Open_vSwitch",
- "version": "3.4.1",
- "cksum": "7815264 15276",
+ "version": "3.4.2",
+ "cksum": "976911089 15276",
  "tables": {
    "Open_vSwitch": {
      "columns": {
index 0f455000bba955f23f6bfe7757839eb7fae0d181..a16c486cc7f2ac1de4d062ffa999bff814337c20 100644 (file)
               something other than <code>fast</code> or <code>slow</code> is
               not supported by the LACP specification.</p>
           </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 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>
+          <dt><code>lacp-heartbeat</code></dt>
+          <dd> Treats LACP like a simple heartbeat protocol for link state
+            monitoring.  Most features of the LACP protocol are disabled when
+            this mode is in use.</dd>
         </dl>
       </column>
     </group>