X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Flacp.c;fp=lib%2Flacp.c;h=fce65b31d470da7b126e20a45ff076f4925ba0e5;hb=9dd165e0508143d36c73f258d8bcfdbbb356830a;hp=5421e2ae36d696b8414b3c183d9af088f944c226;hpb=3767b63136bdd2b070e0638b8fd8f3b24cf9277e;p=sliver-openvswitch.git diff --git a/lib/lacp.c b/lib/lacp.c index 5421e2ae3..fce65b31d 100644 --- a/lib/lacp.c +++ b/lib/lacp.c @@ -102,6 +102,7 @@ struct lacp { bool fast; /* True if using fast probe interval. */ bool negotiated; /* True if LACP negotiations were successful. */ bool update; /* True if lacp_update() needs to be called. */ + bool fallback_ab; /* True if fallback to active-backup on LACP failure. */ atomic_int ref_cnt; }; @@ -283,6 +284,12 @@ lacp_configure(struct lacp *lacp, const struct lacp_settings *s) lacp->active = s->active; lacp->fast = s->fast; + + if (lacp->fallback_ab != s->fallback_ab_cfg) { + lacp->fallback_ab = s->fallback_ab_cfg; + lacp->update = true; + } + ovs_mutex_unlock(&mutex); } @@ -450,7 +457,9 @@ slave_may_enable__(struct slave *slave) OVS_REQUIRES(mutex) { /* The slave may be enabled if it's attached to an aggregator and its * partner is synchronized.*/ - return slave->attached && (slave->partner.state & LACP_STATE_SYNC); + return slave->attached && (slave->partner.state & LACP_STATE_SYNC + || (slave->lacp && slave->lacp->fallback_ab + && slave->status == LACP_DEFAULTED)); } /* This function should be called before enabling 'slave_' to send or receive @@ -587,6 +596,9 @@ lacp_update_attached(struct lacp *lacp) OVS_REQUIRES(mutex) } if (slave->status == LACP_DEFAULTED) { + if (lacp->fallback_ab) { + slave->attached = true; + } continue; } @@ -603,7 +615,8 @@ lacp_update_attached(struct lacp *lacp) OVS_REQUIRES(mutex) if (lead) { HMAP_FOR_EACH (slave, node, &lacp->slaves) { - if (lead->partner.key != slave->partner.key + if ((lacp->fallback_ab && slave->status == LACP_DEFAULTED) + || lead->partner.key != slave->partner.key || !eth_addr_equals(lead->partner.sys_id, slave->partner.sys_id)) { slave->attached = false;