projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ofproto: Enqueue improperly resets priority.
[openvswitch]
/
lib
/
lacp.c
diff --git
a/lib/lacp.c
b/lib/lacp.c
index 21d329eb019a3f985aa594098518b72c1e30d263..3fe5eff320a1fbb56c8fa2dbea3dcf5dedb9182b 100644
(file)
--- a/
lib/lacp.c
+++ b/
lib/lacp.c
@@
-50,10
+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
force_agg; /* Forces LACP_STATE_AGG bit on all slaves
. */
+ bool
heartbeat; /* LACP heartbeat mode
. */
};
struct slave {
};
struct slave {
@@
-63,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. */
@@
-182,16
+182,15
@@
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->active = s->active;
lacp->lacp_time = s->lacp_time;
lacp->update = true;
}
lacp->active = s->active;
lacp->lacp_time = s->lacp_time;
- lacp->force_agg = s->force_agg;
lacp->custom_time = MAX(TIME_UPDATE_INTERVAL, s->custom_time);
}
lacp->custom_time = MAX(TIME_UPDATE_INTERVAL, s->custom_time);
}
@@
-274,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;
@@
-427,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;
@@
-467,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;
- }
}
}
}
}
@@
-528,6
+533,7
@@
static void
slave_get_actor(struct slave *slave, struct lacp_info *actor)
{
struct lacp *lacp = slave->lacp;
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) {
uint8_t state = 0;
if (lacp->active) {
@@
-550,7
+556,7
@@
slave_get_actor(struct slave *slave, struct lacp_info *actor)
state |= LACP_STATE_EXP;
}
state |= LACP_STATE_EXP;
}
- if (lacp->
force_agg
|| hmap_count(&lacp->slaves) > 1) {
+ if (lacp->
heartbeat
|| hmap_count(&lacp->slaves) > 1) {
state |= LACP_STATE_AGG;
}
state |= LACP_STATE_AGG;
}
@@
-558,8
+564,13
@@
slave_get_actor(struct slave *slave, struct lacp_info *actor)
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(
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);
actor->port_priority = htons(slave->port_priority);
actor->port_id = htons(slave->port_id);
actor->sys_priority = htons(lacp->sys_priority);
@@
-705,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");