projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ovs.db.data: Fix bugs in Atom.is_default() and Datum.is_default().
[openvswitch]
/
lib
/
lacp.c
diff --git
a/lib/lacp.c
b/lib/lacp.c
index a7f66a24ab0c2e8e1f282c49c6f77a341238f61f..eaf01c3c909c62bae294d14c976636f7f3022239 100644
(file)
--- a/
lib/lacp.c
+++ b/
lib/lacp.c
@@
-50,9
+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. */
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 negotiated; /* True if LACP negotiations were successful. */
bool update; /* True if lacp_update() needs to be called. */
+ bool heartbeat; /* LACP heartbeat mode. */
};
struct slave {
};
struct slave {
@@
-62,6
+62,7
@@
struct slave {
struct lacp *lacp; /* LACP object containing this slave. */
uint16_t port_id; /* Port ID. */
uint16_t port_priority; /* Port Priority. */
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. */
char *name; /* Name of this slave. */
enum slave_status status; /* Slave status. */
@@
-181,10
+182,10
@@
lacp_configure(struct lacp *lacp, const struct lacp_settings *s)
if (!eth_addr_equals(lacp->sys_id, s->id)
|| lacp->sys_priority != s->priority
if (!eth_addr_equals(lacp->sys_id, s->id)
|| lacp->sys_priority != s->priority
- || lacp->
strict != s->stric
t) {
+ || lacp->
heartbeat != s->heartbea
t) {
memcpy(lacp->sys_id, s->id, ETH_ADDR_LEN);
lacp->sys_priority = s->priority;
memcpy(lacp->sys_id, s->id, ETH_ADDR_LEN);
lacp->sys_priority = s->priority;
- lacp->
strict = s->stric
t;
+ lacp->
heartbeat = s->heartbea
t;
lacp->update = true;
}
lacp->update = true;
}
@@
-272,9
+273,12
@@
lacp_slave_register(struct lacp *lacp, void *slave_,
slave->name = xstrdup(s->name);
}
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->port_id = s->id;
slave->port_priority = s->priority;
+ slave->key = s->key;
lacp->update = true;
lacp->update = true;
@@
-343,7
+347,7
@@
lacp_slave_get_port_id(const struct lacp *lacp, const void *slave_)
bool
lacp_slave_is_current(const struct lacp *lacp, const void *slave_)
{
bool
lacp_slave_is_current(const struct lacp *lacp, const void *slave_)
{
- return slave_lookup(lacp, slave_)->status
== LACP_CURRENT
;
+ return slave_lookup(lacp, slave_)->status
!= LACP_DEFAULTED
;
}
/* This function should be called periodically to update 'lacp'. */
}
/* This function should be called periodically to update 'lacp'. */
@@
-425,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);
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;
lacp->update = false;
lead = NULL;
@@
-465,10
+476,6
@@
lacp_update_attached(struct lacp *lacp)
slave->attached = false;
}
}
slave->attached = false;
}
}
- } else if (lacp->strict) {
- HMAP_FOR_EACH (slave, node, &lacp->slaves) {
- slave->attached = false;
- }
}
}
}
}
@@
-525,13
+532,15
@@
slave_set_expired(struct slave *slave)
static void
slave_get_actor(struct slave *slave, struct lacp_info *actor)
{
static void
slave_get_actor(struct slave *slave, struct lacp_info *actor)
{
+ struct lacp *lacp = slave->lacp;
+ uint16_t key;
uint8_t state = 0;
uint8_t state = 0;
- if (
slave->
lacp->active) {
+ if (lacp->active) {
state |= LACP_STATE_ACT;
}
state |= LACP_STATE_ACT;
}
- if (
slave->
lacp->lacp_time != LACP_TIME_SLOW) {
+ if (lacp->lacp_time != LACP_TIME_SLOW) {
state |= LACP_STATE_TIME;
}
state |= LACP_STATE_TIME;
}
@@
-547,20
+556,25
@@
slave_get_actor(struct slave *slave, struct lacp_info *actor)
state |= LACP_STATE_EXP;
}
state |= LACP_STATE_EXP;
}
- if (
hmap_count(&slave->
lacp->slaves) > 1) {
+ if (
lacp->heartbeat || hmap_count(&
lacp->slaves) > 1) {
state |= LACP_STATE_AGG;
}
state |= LACP_STATE_AGG;
}
- if (slave->attached || !
slave->
lacp->negotiated) {
+ if (slave->attached || !lacp->negotiated) {
state |= LACP_STATE_COL | LACP_STATE_DIST;
}
state |= LACP_STATE_COL | LACP_STATE_DIST;
}
+ key = lacp->key_slave->key;
+ if (!key) {
+ key = lacp->key_slave->port_id;
+ }
+
actor->state = state;
actor->state = state;
- actor->key = htons(
slave->lacp->key_slave->port_id
);
+ actor->key = htons(
key
);
actor->port_priority = htons(slave->port_priority);
actor->port_id = htons(slave->port_id);
actor->port_priority = htons(slave->port_priority);
actor->port_id = htons(slave->port_id);
- actor->sys_priority = htons(
slave->
lacp->sys_priority);
- memcpy(&actor->sys_id,
slave->
lacp->sys_id, ETH_ADDR_LEN);
+ actor->sys_priority = htons(lacp->sys_priority);
+ memcpy(&actor->sys_id, lacp->sys_id, ETH_ADDR_LEN);
}
/* Given 'slave', populates 'priority' with data representing its LACP link
}
/* Given 'slave', populates 'priority' with data representing its LACP link
@@
-702,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");
ds_put_format(&ds, "lacp: %s\n", lacp->name);
ds_put_format(&ds, "\tstatus: %s", lacp->active ? "active" : "passive");
- if (lacp->
stric
t) {
- ds_put_cstr(&ds, "
stric
t");
+ if (lacp->
heartbea
t) {
+ ds_put_cstr(&ds, "
heartbea
t");
}
if (lacp->negotiated) {
ds_put_cstr(&ds, " negotiated");
}
if (lacp->negotiated) {
ds_put_cstr(&ds, " negotiated");