X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Flacp.c;h=87f70bf77d5de9c898c29e0e3f21fe206fad2a91;hb=002c42961c2d2cbc8e3ce9458f9bd1ef3e93cfb1;hp=a7f66a24ab0c2e8e1f282c49c6f77a341238f61f;hpb=cdcf42c664eeb6b260693fc182c1782669f7d39e;p=openvswitch diff --git a/lib/lacp.c b/lib/lacp.c index a7f66a24..87f70bf7 100644 --- a/lib/lacp.c +++ b/lib/lacp.c @@ -53,6 +53,7 @@ struct lacp { 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 force_agg; /* Forces LACP_STATE_AGG bit on all slaves. */ }; struct slave { @@ -62,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. */ @@ -190,6 +192,7 @@ lacp_configure(struct lacp *lacp, const struct lacp_settings *s) 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); } @@ -272,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; @@ -525,13 +531,15 @@ slave_set_expired(struct slave *slave) 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 (slave->lacp->active) { + if (lacp->active) { state |= LACP_STATE_ACT; } - if (slave->lacp->lacp_time != LACP_TIME_SLOW) { + if (lacp->lacp_time != LACP_TIME_SLOW) { state |= LACP_STATE_TIME; } @@ -547,20 +555,25 @@ slave_get_actor(struct slave *slave, struct lacp_info *actor) state |= LACP_STATE_EXP; } - if (hmap_count(&slave->lacp->slaves) > 1) { + if (lacp->force_agg || hmap_count(&lacp->slaves) > 1) { state |= LACP_STATE_AGG; } - if (slave->attached || !slave->lacp->negotiated) { + if (slave->attached || !lacp->negotiated) { 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(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->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