diff options
author | Matthew Smith <mgsmith@netgate.com> | 2020-05-18 10:54:17 -0500 |
---|---|---|
committer | Neale Ranns <nranns@cisco.com> | 2020-05-27 12:58:33 +0000 |
commit | 9121c415a91904be50071ec55143d9c89b2f1b91 (patch) | |
tree | 182693cb59362835f737d81fadb5e872ed84e16b /src/vnet | |
parent | 5556813fb63d28240a17ccf18f947e60c4cbb263 (diff) |
bonding: adjust link state based on active slaves
Type: improvement
Bond link state is being maintained inconsistently. It is initially set to
up. If the bond interface admin state is set to down, the link state is
set to down. If the bond interface admin state is set to up, the link
state is only set to up if there are active slave interfaces at that point.
If slaves become active at some later time, it does not get updated. Its
next chance to be updated is the next time the bond interface is set to
admin up.
To address this, do not set the link state to up after creating a bond.
Adjust the link state as slave interfaces are attached or detached
based on whether the bond is getting its first active slave or losing
its last one.
Unit test added to verify correct maintenance of link state.
Change-Id: I31f17321f7f0e727e1ab1e01713423af6566dad9
Signed-off-by: Matthew Smith <mgsmith@netgate.com>
Diffstat (limited to 'src/vnet')
-rw-r--r-- | src/vnet/bonding/cli.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/src/vnet/bonding/cli.c b/src/vnet/bonding/cli.c index 92a9ff067f6..c40d4f391f6 100644 --- a/src/vnet/bonding/cli.c +++ b/src/vnet/bonding/cli.c @@ -26,6 +26,7 @@ void bond_disable_collecting_distributing (vlib_main_t * vm, slave_if_t * sif) { bond_main_t *bm = &bond_main; + vnet_main_t *vnm = vnet_get_main (); bond_if_t *bif; int i; uword p; @@ -54,6 +55,15 @@ bond_disable_collecting_distributing (vlib_main_t * vm, slave_if_t * sif) ASSERT (bif->n_numa_slaves >= 0); } } + /* If that was the last active slave, set bond link state down */ + if (!vec_len (bif->active_slaves)) + { + vnet_hw_interface_flags_t flags; + + flags = vnet_hw_interface_get_flags (vnm, bif->hw_if_index); + flags &= ~VNET_HW_INTERFACE_FLAG_LINK_UP; + vnet_hw_interface_set_flags (vnm, bif->hw_if_index, flags); + } break; } } @@ -158,6 +168,16 @@ bond_enable_collecting_distributing (vlib_main_t * vm, slave_if_t * sif) else vec_add1 (bif->active_slaves, sif->sw_if_index); + /* If this was the first active slave, set bond link state up */ + if (vec_len (bif->active_slaves) == 1) + { + vnet_hw_interface_flags_t flags; + + flags = vnet_hw_interface_get_flags (vnm, bif->hw_if_index); + flags |= VNET_HW_INTERFACE_FLAG_LINK_UP; + vnet_hw_interface_set_flags (vnm, bif->hw_if_index, flags); + } + sif->is_local_numa = (vm->numa_node == hw->numa_node) ? 1 : 0; if (bif->mode == BOND_MODE_ACTIVE_BACKUP) { @@ -469,9 +489,6 @@ bond_create_if (vlib_main_t * vm, bond_create_if_args_t * args) if (vlib_get_thread_main ()->n_vlib_mains > 1) clib_spinlock_init (&bif->lockp); - vnet_hw_interface_set_flags (vnm, bif->hw_if_index, - VNET_HW_INTERFACE_FLAG_LINK_UP); - hash_set (bm->bond_by_sw_if_index, bif->sw_if_index, bif->dev_instance); // for return |