mirror of
https://github.com/openvswitch/ovs
synced 2025-10-25 15:07:05 +00:00
lacp: Allow configurable aggregation keys.
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.
This commit is contained in:
14
lib/lacp.c
14
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);
|
||||
|
||||
@@ -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_,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user