Users will the ability to manually set aggregation keys on a
per-slave basis in order to use some of the more advanced LACP
features. Most notably, LACP controlled active-backup bonding
requires fine grained aggregation key configuration.
---
lib/lacp.c | 14 ++++++++++++--
lib/lacp.h | 1 +
vswitchd/bridge.c | 9 ++++++++-
vswitchd/vswitch.xml | 5 +++++
4 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/lib/lacp.c b/lib/lacp.c
index 21d329e..87f70bf 100644
--- a/lib/lacp.c
+++ b/lib/lacp.c
@@ -63,6 +63,7 @@ struct slave {
struct lacp *lacp; /* LACP object containing this slave. */
uint16_t port_id; /* Port ID. */
uint16_t port_priority; /* Port Priority. */
+ uint16_t key; /* Aggregation Key. 0 if default. */
char *name; /* Name of this slave. */
enum slave_status status; /* Slave status. */
@@ -274,9 +275,12 @@ lacp_slave_register(struct lacp *lacp, void *slave_,
slave->name = xstrdup(s->name);
}
- if (slave->port_id != s->id || slave->port_priority != s->priority) {
+ if (slave->port_id != s->id
+ || slave->port_priority != s->priority
+ || slave->key != s->key) {
slave->port_id = s->id;
slave->port_priority = s->priority;
+ slave->key = s->key;
lacp->update = true;
@@ -528,6 +532,7 @@ static void
slave_get_actor(struct slave *slave, struct lacp_info *actor)
{
struct lacp *lacp = slave->lacp;
+ uint16_t key;
uint8_t state = 0;
if (lacp->active) {
@@ -558,8 +563,13 @@ slave_get_actor(struct slave *slave, struct lacp_info
*actor)
state |= LACP_STATE_COL | LACP_STATE_DIST;
}
+ key = lacp->key_slave->key;
+ if (!key) {
+ key = lacp->key_slave->port_id;
+ }
+
actor->state = state;
- actor->key = htons(lacp->key_slave->port_id);
+ actor->key = htons(key);
actor->port_priority = htons(slave->port_priority);
actor->port_id = htons(slave->port_id);
actor->sys_priority = htons(lacp->sys_priority);
diff --git a/lib/lacp.h b/lib/lacp.h
index 871056c..fb91b4f 100644
--- a/lib/lacp.h
+++ b/lib/lacp.h
@@ -107,6 +107,7 @@ struct lacp_slave_settings {
char *name;
uint16_t id;
uint16_t priority;
+ uint16_t key;
};
void lacp_slave_register(struct lacp *, void *slave_,
diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index 270ab80..b2dc55f 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -3136,11 +3136,13 @@ static void
iface_reconfigure_lacp(struct iface *iface)
{
struct lacp_slave_settings s;
- int priority, portid;
+ int priority, portid, key;
portid = atoi(get_interface_other_config(iface->cfg, "lacp-port-id", "0"));
priority = atoi(get_interface_other_config(iface->cfg,
"lacp-port-priority", "0"));
+ key = atoi(get_interface_other_config(iface->cfg, "lacp-aggregation-key",
+ "0"));
if (portid <= 0 || portid > UINT16_MAX) {
portid = iface->dp_ifidx;
@@ -3150,9 +3152,14 @@ iface_reconfigure_lacp(struct iface *iface)
priority = UINT16_MAX;
}
+ if (key < 0 || key > UINT16_MAX) {
+ key = 0;
+ }
+
s.name = iface->name;
s.id = portid;
s.priority = priority;
+ s.key = key;
lacp_slave_register(iface->port->lacp, iface, &s);
}
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index e754835..48315fa 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -1301,6 +1301,11 @@
LACP negotiations <ref table="Interface"/>s with numerically lower
priorities are preferred for aggregation. Must be a number between
1 and 65535.</dd>
+ <dt><code>lacp-aggregation-key</code></dt>
+ <dd> The LACP aggregation key of this <ref table="Interface"/>.
+ <ref table="Interface"/>s with different aggregation keys may not
+ be active within a given <ref table="Port"/> at the same time. Must
+ be a number between 1 and 65535.</dd>
</dl>
</column>
--
1.7.4.2
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev