| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| # |
| # Testing if bond lacp per port priority works |
| # |
| # Switch (s_ns) Backup Switch (b_ns) |
| # +-------------------------+ +-------------------------+ |
| # | bond0 | | bond0 | |
| # | + | | + | |
| # | eth0 | eth1 | | eth0 | eth1 | |
| # | +---+---+ | | +---+---+ | |
| # | | | | | | | | |
| # +-------------------------+ +-------------------------+ |
| # | | | | |
| # +-----------------------------------------------------+ |
| # | | | | | | |
| # | +-------+---------+---------+-------+ | |
| # | eth0 eth1 | eth2 eth3 | |
| # | + | |
| # | bond0 | |
| # +-----------------------------------------------------+ |
| # Client (c_ns) |
| |
| lib_dir=$(dirname "$0") |
| # shellcheck disable=SC1091 |
| source "$lib_dir"/../../../net/lib.sh |
| |
| setup_links() |
| { |
| # shellcheck disable=SC2154 |
| ip -n "${c_ns}" link add eth0 type veth peer name eth0 netns "${s_ns}" |
| ip -n "${c_ns}" link add eth1 type veth peer name eth1 netns "${s_ns}" |
| # shellcheck disable=SC2154 |
| ip -n "${c_ns}" link add eth2 type veth peer name eth0 netns "${b_ns}" |
| ip -n "${c_ns}" link add eth3 type veth peer name eth1 netns "${b_ns}" |
| |
| ip -n "${c_ns}" link add bond0 type bond mode 802.3ad miimon 100 \ |
| lacp_rate fast ad_select actor_port_prio |
| ip -n "${s_ns}" link add bond0 type bond mode 802.3ad miimon 100 \ |
| lacp_rate fast |
| ip -n "${b_ns}" link add bond0 type bond mode 802.3ad miimon 100 \ |
| lacp_rate fast |
| |
| ip -n "${c_ns}" link set eth0 master bond0 |
| ip -n "${c_ns}" link set eth1 master bond0 |
| ip -n "${c_ns}" link set eth2 master bond0 |
| ip -n "${c_ns}" link set eth3 master bond0 |
| ip -n "${s_ns}" link set eth0 master bond0 |
| ip -n "${s_ns}" link set eth1 master bond0 |
| ip -n "${b_ns}" link set eth0 master bond0 |
| ip -n "${b_ns}" link set eth1 master bond0 |
| |
| ip -n "${c_ns}" link set bond0 up |
| ip -n "${s_ns}" link set bond0 up |
| ip -n "${b_ns}" link set bond0 up |
| } |
| |
| test_port_prio_setting() |
| { |
| RET=0 |
| ip -n "${c_ns}" link set eth0 type bond_slave actor_port_prio 1000 |
| prio=$(cmd_jq "ip -n ${c_ns} -d -j link show eth0" \ |
| ".[].linkinfo.info_slave_data.actor_port_prio") |
| [ "$prio" -ne 1000 ] && RET=1 |
| ip -n "${c_ns}" link set eth2 type bond_slave actor_port_prio 10 |
| prio=$(cmd_jq "ip -n ${c_ns} -d -j link show eth2" \ |
| ".[].linkinfo.info_slave_data.actor_port_prio") |
| [ "$prio" -ne 10 ] && RET=1 |
| } |
| |
| test_agg_reselect() |
| { |
| local bond_agg_id slave_agg_id |
| local expect_slave="$1" |
| RET=0 |
| |
| # Trigger link state change to reselect the aggregator |
| ip -n "${c_ns}" link set eth1 down |
| sleep 0.5 |
| ip -n "${c_ns}" link set eth1 up |
| sleep 0.5 |
| |
| bond_agg_id=$(cmd_jq "ip -n ${c_ns} -d -j link show bond0" \ |
| ".[].linkinfo.info_data.ad_info.aggregator") |
| slave_agg_id=$(cmd_jq "ip -n ${c_ns} -d -j link show $expect_slave" \ |
| ".[].linkinfo.info_slave_data.ad_aggregator_id") |
| # shellcheck disable=SC2034 |
| [ "${bond_agg_id}" -ne "${slave_agg_id}" ] && \ |
| RET=1 |
| } |
| |
| trap cleanup_all_ns EXIT |
| setup_ns c_ns s_ns b_ns |
| setup_links |
| |
| test_port_prio_setting |
| log_test "bond 802.3ad" "actor_port_prio setting" |
| |
| test_agg_reselect eth0 |
| log_test "bond 802.3ad" "actor_port_prio select" |
| |
| # Change the actor port prio and re-test |
| ip -n "${c_ns}" link set eth0 type bond_slave actor_port_prio 10 |
| ip -n "${c_ns}" link set eth2 type bond_slave actor_port_prio 1000 |
| test_agg_reselect eth2 |
| log_test "bond 802.3ad" "actor_port_prio switch" |
| |
| exit "${EXIT_STATUS}" |