From 9f07085ab37d9bc27d2f2ccc4d651d7295f9b33c Mon Sep 17 00:00:00 2001 From: Steven Luong Date: Wed, 12 May 2021 14:38:22 -0700 Subject: lacp: Prohibiting bonding with remote having different key than 1st member After forming the bonding with 1st remote member, Subsequent member must have the same key in order to join the same bonding group. Type: fix Signed-off-by: Steven Luong Change-Id: I9ff6d6c083a5b6a26beedbd7181d5a120cb5710b --- src/plugins/lacp/selection.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) (limited to 'src/plugins/lacp/selection.c') diff --git a/src/plugins/lacp/selection.c b/src/plugins/lacp/selection.c index f3fb6b9faa4..0c9f036308d 100644 --- a/src/plugins/lacp/selection.c +++ b/src/plugins/lacp/selection.c @@ -19,15 +19,35 @@ #include #include -static void -lacp_set_port_selected (vlib_main_t * vm, member_if_t * mif) +static int +lacp_set_port_selected (vlib_main_t *vm, bond_if_t *bif, member_if_t *mif) { + uword p; + member_if_t *mif2; + /* Handle loopback port */ if (!memcmp (mif->partner.system, mif->actor.system, 6) && (mif->partner.key == mif->actor.key)) { mif->loopback_port = 1; mif->actor.state &= ~LACP_STATE_AGGREGATION; + mif->selected = LACP_PORT_UNSELECTED; + lacp_machine_dispatch (&lacp_mux_machine, vm, mif, + LACP_MUX_EVENT_UNSELECTED, &mif->mux_state); + return LACP_ERROR_LOOPBACK_PORT; + } + if (vec_len (bif->active_members)) + { + p = *vec_elt_at_index (bif->active_members, 0); + mif2 = bond_get_member_by_sw_if_index (p); + if ((mif2->partner.key != mif->partner.key) || + memcmp (mif2->partner.system, mif->partner.system, 6)) + { + mif->selected = LACP_PORT_UNSELECTED; + lacp_machine_dispatch (&lacp_mux_machine, vm, mif, + LACP_MUX_EVENT_UNSELECTED, &mif->mux_state); + return LACP_ERROR_BAD_KEY; + } } mif->selected = LACP_PORT_SELECTED; @@ -37,23 +57,23 @@ lacp_set_port_selected (vlib_main_t * vm, member_if_t * mif) break; case LACP_MUX_STATE_WAITING: if (!mif->ready) - return; + return LACP_ERROR_NONE; break; case LACP_MUX_STATE_ATTACHED: if (!(mif->partner.state & LACP_STATE_SYNCHRONIZATION)) - return; + return LACP_ERROR_NONE; break; case LACP_MUX_STATE_COLLECTING_DISTRIBUTING: break; default: break; } - lacp_machine_dispatch (&lacp_mux_machine, vm, mif, LACP_MUX_EVENT_SELECTED, - &mif->mux_state); + return lacp_machine_dispatch (&lacp_mux_machine, vm, mif, + LACP_MUX_EVENT_SELECTED, &mif->mux_state); } -void -lacp_selection_logic (vlib_main_t * vm, member_if_t * mif) +int +lacp_selection_logic (vlib_main_t *vm, member_if_t *mif) { member_if_t *mif2; bond_if_t *bif; @@ -80,7 +100,7 @@ lacp_selection_logic (vlib_main_t * vm, member_if_t * mif) } } out: - lacp_set_port_selected (vm, mif); + return lacp_set_port_selected (vm, bif, mif); } /* -- cgit 1.2.3-korg