diff options
Diffstat (limited to 'src/plugins/lacp/selection.c')
-rw-r--r-- | src/plugins/lacp/selection.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/plugins/lacp/selection.c b/src/plugins/lacp/selection.c new file mode 100644 index 00000000000..898b6a95023 --- /dev/null +++ b/src/plugins/lacp/selection.c @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdint.h> +#include <vlib/vlib.h> +#include <vlib/unix/unix.h> +#include <vnet/bonding/node.h> +#include <lacp/node.h> + +static void +lacp_set_port_selected (vlib_main_t * vm, slave_if_t * sif) +{ + /* Handle loopback port */ + if (!memcmp (sif->partner.system, sif->actor.system, 6) && + (sif->partner.key == sif->actor.key)) + { + sif->loopback_port = 1; + sif->actor.state &= ~LACP_STATE_AGGREGATION; + } + sif->selected = LACP_PORT_SELECTED; + + switch (sif->mux_state) + { + case LACP_MUX_STATE_DETACHED: + break; + case LACP_MUX_STATE_WAITING: + if (!sif->ready) + return; + break; + case LACP_MUX_STATE_ATTACHED: + if (!(sif->partner.state & LACP_STATE_SYNCHRONIZATION)) + return; + break; + case LACP_MUX_STATE_COLLECTING_DISTRIBUTING: + break; + default: + break; + } + lacp_machine_dispatch (&lacp_mux_machine, vm, sif, LACP_MUX_EVENT_SELECTED, + &sif->mux_state); +} + +void +lacp_selection_logic (vlib_main_t * vm, slave_if_t * sif) +{ + slave_if_t *sif2; + bond_if_t *bif; + u32 *sw_if_index; + + bif = bond_get_master_by_dev_instance (sif->bif_dev_instance); + vec_foreach (sw_if_index, bif->slaves) + { + sif2 = bond_get_slave_by_sw_if_index (*sw_if_index); + if (sif2 && (sif2->actor.state & LACP_STATE_SYNCHRONIZATION) && + (sif2->ready_n == 0)) + goto out; + } + + vec_foreach (sw_if_index, bif->slaves) + { + sif2 = bond_get_slave_by_sw_if_index (*sw_if_index); + if (sif2) + { + sif2->ready = 1; + if (sif2->selected == LACP_PORT_SELECTED) + lacp_machine_dispatch (&lacp_mux_machine, vm, sif2, + LACP_MUX_EVENT_READY, &sif2->mux_state); + } + } +out: + lacp_set_port_selected (vm, sif); +} + +/* + * fd.io coding-style-patch-verification: ON + * + * Local Variables: + * eval: (c-set-style "gnu") + * End: + */ |