bridge: LACP port ID and system ID in database.
authorEthan Jackson <ethan@nicira.com>
Sat, 16 Apr 2011 00:03:37 +0000 (17:03 -0700)
committerEthan Jackson <ethan@nicira.com>
Tue, 19 Apr 2011 18:19:46 +0000 (11:19 -0700)
Extremely advanced users may want fine grained control over the
LACP port and system IDs of a bond.  This would be extremely
unusual for the average user, so this patch puts the configuration
parameters in other_config of the relevant tables.

vswitchd/bridge.c
vswitchd/vswitch.xml

index 78c0a09a0a0aa3a04ebf7142f5f4cb2e909f3a76..a87e2cc646bde3060458ff3590ffd1827d50df49 100644 (file)
@@ -3099,14 +3099,23 @@ static void
 iface_reconfigure_lacp(struct iface *iface)
 {
     struct lacp_slave_settings s;
-    int priority;
+    int priority, portid;
+
+    portid = atoi(get_interface_other_config(iface->cfg, "lacp-port-id", "0"));
+    priority = atoi(get_interface_other_config(iface->cfg,
+                                               "lacp-port-priority", "0"));
+
+    if (portid <= 0 || portid > UINT16_MAX) {
+        portid = iface->dp_ifidx;
+    }
+
+    if (priority <= 0 || priority > UINT16_MAX) {
+        priority = UINT16_MAX;
+    }
 
     s.name = iface->name;
-    s.id = iface->dp_ifidx;
-    priority = atoi(get_interface_other_config(
-                        iface->cfg, "lacp-port-priority", "0"));
-    s.priority = (priority >= 0 && priority <= UINT16_MAX
-                  ? priority : UINT16_MAX);
+    s.id = portid;
+    s.priority = priority;
     lacp_slave_register(iface->port->lacp, iface, &s);
 }
 
@@ -3115,6 +3124,8 @@ port_reconfigure_lacp(struct port *port)
 {
     static struct lacp_settings s;
     struct iface *iface;
+    uint8_t sysid[ETH_ADDR_LEN];
+    const char *sysid_str;
     int priority;
 
     if (!enable_lacp(port, &s.active)) {
@@ -3123,8 +3134,14 @@ port_reconfigure_lacp(struct port *port)
         return;
     }
 
+    sysid_str = get_port_other_config(port->cfg, "lacp-system-id", NULL);
+    if (sysid_str && eth_addr_from_string(sysid_str, sysid)) {
+        memcpy(s.id, sysid, ETH_ADDR_LEN);
+    } else {
+        memcpy(s.id, port->bridge->ea, ETH_ADDR_LEN);
+    }
+
     s.name = port->name;
-    memcpy(s.id, port->bridge->ea, ETH_ADDR_LEN);
 
     /* Prefer bondable links if unspecified. */
     priority = atoi(get_port_other_config(port->cfg, "lacp-system-priority",
index 6031b5a0efcafe7c7938afd15abf0f24bb0804b0..6070a1cd5ae569e6e4af5bdaa888aa3bc864fccc 100644 (file)
           <dd> The number of milliseconds between successive attempts to
             poll each interface's MII.  Only relevant on ports which use
             <code>miimon</code> to detect failures. </dd>
+          <dt><code>lacp-system-id</code></dt>
+          <dd> The LACP system ID of this <ref table="Port"/>.  The system ID
+            of a LACP bond is used to identify itself to its partners.  Must
+            be a nonzero MAC address.</dd>
           <dt><code>lacp-system-priority</code></dt>
           <dd> The LACP system priority of this <ref table="Port"/>.  In
             LACP negotiations, link status decisions are made by the system
       <column name="other_config">
         Key-value pairs for rarely used interface features.
         <dl>
+          <dt><code>lacp-port-id</code></dt>
+          <dd> The LACP port ID of this <ref table="Interface"/>.  Port IDs are
+            used in LACP negotiations to identify individual ports
+            participating in a bond.  Must be a number between 1 and
+            65535.</dd>
           <dt><code>lacp-port-priority</code></dt>
           <dd> The LACP port priority of this <ref table="Interface"/>.  In
             LACP negotiations <ref table="Interface"/>s with numerically lower