diff options
author | Ethan Jackson <ethan@nicira.com> | 2011-04-12 17:53:24 -0700 |
---|---|---|
committer | Ethan Jackson <ethan@nicira.com> | 2011-04-12 17:53:24 -0700 |
commit | 59d7b2b65665d5d0db9a348789f7eba4b3f16d54 (patch) | |
tree | 72d256595e07829508f71cb480dca47c34a6dd5c /lib/bond.c | |
parent | a64e37a1d3990b9c2524d166119cb5564dc5d96c (diff) |
bond: Reconfigure flows when bond mode changes.
Changes in the bonding mode can cause drastic changes in flow
assignments to slaves. This commit causes all flows in a bridge
to be revalidated when bond_reconfigure() changes its bonding mode.
This approach is a bit aggressive, but bond reconfiguration
shouldn't happen often.
Diffstat (limited to 'lib/bond.c')
-rw-r--r-- | lib/bond.c | 18 |
1 files changed, 15 insertions, 3 deletions
@@ -256,10 +256,16 @@ bond_destroy(struct bond *bond) * bond_slave_register(). This is optional if none of the slaves' * configuration has changed, except that it is mandatory if 's' enables LACP * and 'bond' previously didn't have LACP enabled. In any case it can't - * hurt. */ -void + * hurt. + * + * Returns true if the configuration has changed in such a way that requires + * flow revalidation. + * */ +bool bond_reconfigure(struct bond *bond, const struct bond_settings *s) { + bool revalidate = false; + if (!bond->name || strcmp(bond->name, s->name)) { if (bond->name) { hmap_remove(&all_bonds, &bond->hmap_node); @@ -269,13 +275,17 @@ bond_reconfigure(struct bond *bond, const struct bond_settings *s) hmap_insert(&all_bonds, &bond->hmap_node, hash_string(bond->name, 0)); } - bond->balance = s->balance; bond->detect = s->detect; bond->miimon_interval = s->miimon_interval; bond->updelay = s->up_delay; bond->downdelay = s->down_delay; bond->rebalance_interval = s->rebalance_interval; + if (bond->balance != s->balance) { + bond->balance = s->balance; + revalidate = true; + } + if (bond->balance != BM_AB) { if (!bond->hash) { bond->hash = xcalloc(BOND_MASK + 1, sizeof *bond->hash); @@ -324,6 +334,8 @@ bond_reconfigure(struct bond *bond, const struct bond_settings *s) } else { bond->next_fake_iface_update = LLONG_MAX; } + + return revalidate; } /* Registers 'slave_' as a slave of 'bond'. The 'slave_' pointer is an |