lacp: Enable "fast" lacp timing mode.
authorEthan Jackson <ethan@nicira.com>
Wed, 9 Mar 2011 00:34:20 +0000 (16:34 -0800)
committerEthan Jackson <ethan@nicira.com>
Fri, 18 Mar 2011 18:33:02 +0000 (11:33 -0700)
lib/lacp.c
lib/lacp.h
vswitchd/bridge.c
vswitchd/vswitch.xml

index de860e0d96c9f795e413d2cbb2a1f920153d5e8d..25416230d4a555e7689a78e4b473e59ac0866b8c 100644 (file)
@@ -47,6 +47,7 @@ struct lacp {
     struct hmap slaves;      /* Slaves this LACP object controls. */
     struct slave *key_slave; /* Slave whose ID will be the aggregation key. */
 
+    bool fast;                /* Fast or Slow LACP time. */
     bool negotiated;         /* True if LACP negotiations were successful. */
     bool update;             /* True if lacp_update() needs to be called. */
 };
@@ -127,7 +128,7 @@ lacp_destroy(struct lacp *lacp)
 void
 lacp_configure(struct lacp *lacp, const char *name,
                uint8_t sys_id[ETH_ADDR_LEN], uint16_t sys_priority,
-               bool active)
+               bool active, bool fast)
 {
     if (!lacp->name || strcmp(name, lacp->name)) {
         free(lacp->name);
@@ -137,6 +138,7 @@ lacp_configure(struct lacp *lacp, const char *name,
     memcpy(lacp->sys_id, sys_id, ETH_ADDR_LEN);
     lacp->sys_priority = sys_priority;
     lacp->active = active;
+    lacp->fast = fast;
 }
 
 /* Processes 'pdu', a parsed LACP packet received on 'slave_'.  This function
@@ -149,7 +151,9 @@ lacp_process_pdu(struct lacp *lacp, const void *slave_,
     struct slave *slave = slave_lookup(lacp, slave_);
 
     slave->status = LACP_CURRENT;
-    slave->rx = time_msec() + LACP_SLOW_TIME_RX;
+    slave->rx = time_msec() + (lacp->fast
+                               ? LACP_FAST_TIME_RX
+                               : LACP_SLOW_TIME_RX);
 
     slave->ntt_actor = pdu->partner;
 
@@ -431,6 +435,10 @@ slave_get_actor(struct slave *slave, struct lacp_info *actor)
         state |= LACP_STATE_ACT;
     }
 
+    if (slave->lacp->fast) {
+        state |= LACP_STATE_TIME;
+    }
+
     if (slave->attached) {
         state |= LACP_STATE_SYNC;
     }
index 6c7ff3f506d4235d9dfd0cb174362904e2274c08..60abaddeb8aa8653e41b2d01f1c4823dacb16202 100644 (file)
@@ -32,7 +32,7 @@ void lacp_init(void);
 struct lacp *lacp_create(void);
 void lacp_destroy(struct lacp *);
 void lacp_configure(struct lacp *, const char *name, uint8_t sys_id[8],
-                    uint16_t sys_priority, bool active);
+                    uint16_t sys_priority, bool active, bool fast);
 void lacp_process_pdu(struct lacp *, const void *slave,
                       const struct lacp_pdu *);
 bool lacp_negotiated(const struct lacp *);
index c8b50d7136bb7750a997290f4de926860effe28f..6b8df983e1803bc5f21561d9656cdf3a9513ea79 100644 (file)
@@ -185,6 +185,7 @@ struct port {
     /* LACP information. */
     struct lacp *lacp;          /* LACP object. NULL if LACP is disabled. */
     bool lacp_active;           /* True if LACP is active */
+    bool lacp_fast;             /* True if LACP is in fast mode. */
     uint16_t lacp_priority;     /* LACP system priority. */
 
     /* SLB specific bonding info. */
@@ -4132,6 +4133,9 @@ port_reconfigure(struct port *port, const struct ovsrec_port *cfg)
     }
     shash_destroy(&new_ifaces);
 
+    port->lacp_fast = !strcmp(get_port_other_config(cfg, "lacp-time", "slow"),
+                             "fast");
+
     lacp_priority =
         atoi(get_port_other_config(cfg, "lacp-system-priority", "0"));
 
@@ -4290,7 +4294,7 @@ port_update_lacp(struct port *port)
 
         lacp_configure(port->lacp, port->name,
                        port->bridge->ea, port->lacp_priority,
-                       port->lacp_active);
+                       port->lacp_active, port->lacp_fast);
 
         for (i = 0; i < port->n_ifaces; i++) {
             struct iface *iface = port->ifaces[i];
index ad1bffa3d9daa212952288a33553892a69d1cd37..cea198a9724641b10c4560540283c930874e35f4 100644 (file)
             LACP negotiations, link status decisions are made by the system
             with the numerically lower priority.  Must be a number between 1
             and 65535.</dd>
+          <dt><code>lacp-time</code></dt>
+          <dd> The LACP timing which should be used on this
+            <ref table="Port"/>.  Possible values are <code>fast</code> and
+            <code>slow</code>.  By default <code>slow</code> is used.  When
+            configured to be <code>fast</code> more frequent LACP heartbeats
+            will be requested causing connectivity problems to be detected more
+            quickly.</dd>
         </dl>
       </column>
     </group>