xref: /linux/tools/testing/selftests/drivers/net/bonding/bond_lacp_prio.sh (revision ec2e0fb07d789976c601bec19ecced7a501c3705)
1*c2377f17SHangbin Liu#!/bin/bash
2*c2377f17SHangbin Liu# SPDX-License-Identifier: GPL-2.0
3*c2377f17SHangbin Liu#
4*c2377f17SHangbin Liu# Testing if bond lacp per port priority works
5*c2377f17SHangbin Liu#
6*c2377f17SHangbin Liu#          Switch (s_ns)          Backup Switch (b_ns)
7*c2377f17SHangbin Liu#  +-------------------------+ +-------------------------+
8*c2377f17SHangbin Liu#  |          bond0          | |          bond0          |
9*c2377f17SHangbin Liu#  |            +            | |            +            |
10*c2377f17SHangbin Liu#  |      eth0  |  eth1      | |      eth0  |  eth1      |
11*c2377f17SHangbin Liu#  |        +---+---+        | |        +---+---+        |
12*c2377f17SHangbin Liu#  |        |       |        | |        |       |        |
13*c2377f17SHangbin Liu#  +-------------------------+ +-------------------------+
14*c2377f17SHangbin Liu#           |       |                   |       |
15*c2377f17SHangbin Liu#  +-----------------------------------------------------+
16*c2377f17SHangbin Liu#  |        |       |                   |       |        |
17*c2377f17SHangbin Liu#  |        +-------+---------+---------+-------+        |
18*c2377f17SHangbin Liu#  |      eth0     eth1       |       eth2     eth3      |
19*c2377f17SHangbin Liu#  |                          +                          |
20*c2377f17SHangbin Liu#  |                        bond0                        |
21*c2377f17SHangbin Liu#  +-----------------------------------------------------+
22*c2377f17SHangbin Liu#                        Client (c_ns)
23*c2377f17SHangbin Liu
24*c2377f17SHangbin Liulib_dir=$(dirname "$0")
25*c2377f17SHangbin Liu# shellcheck disable=SC1091
26*c2377f17SHangbin Liusource "$lib_dir"/../../../net/lib.sh
27*c2377f17SHangbin Liu
28*c2377f17SHangbin Liusetup_links()
29*c2377f17SHangbin Liu{
30*c2377f17SHangbin Liu	# shellcheck disable=SC2154
31*c2377f17SHangbin Liu	ip -n "${c_ns}" link add eth0 type veth peer name eth0 netns "${s_ns}"
32*c2377f17SHangbin Liu	ip -n "${c_ns}" link add eth1 type veth peer name eth1 netns "${s_ns}"
33*c2377f17SHangbin Liu	# shellcheck disable=SC2154
34*c2377f17SHangbin Liu	ip -n "${c_ns}" link add eth2 type veth peer name eth0 netns "${b_ns}"
35*c2377f17SHangbin Liu	ip -n "${c_ns}" link add eth3 type veth peer name eth1 netns "${b_ns}"
36*c2377f17SHangbin Liu
37*c2377f17SHangbin Liu	ip -n "${c_ns}" link add bond0 type bond mode 802.3ad miimon 100 \
38*c2377f17SHangbin Liu		lacp_rate fast ad_select actor_port_prio
39*c2377f17SHangbin Liu	ip -n "${s_ns}" link add bond0 type bond mode 802.3ad miimon 100 \
40*c2377f17SHangbin Liu		lacp_rate fast
41*c2377f17SHangbin Liu	ip -n "${b_ns}" link add bond0 type bond mode 802.3ad miimon 100 \
42*c2377f17SHangbin Liu		lacp_rate fast
43*c2377f17SHangbin Liu
44*c2377f17SHangbin Liu	ip -n "${c_ns}" link set eth0 master bond0
45*c2377f17SHangbin Liu	ip -n "${c_ns}" link set eth1 master bond0
46*c2377f17SHangbin Liu	ip -n "${c_ns}" link set eth2 master bond0
47*c2377f17SHangbin Liu	ip -n "${c_ns}" link set eth3 master bond0
48*c2377f17SHangbin Liu	ip -n "${s_ns}" link set eth0 master bond0
49*c2377f17SHangbin Liu	ip -n "${s_ns}" link set eth1 master bond0
50*c2377f17SHangbin Liu	ip -n "${b_ns}" link set eth0 master bond0
51*c2377f17SHangbin Liu	ip -n "${b_ns}" link set eth1 master bond0
52*c2377f17SHangbin Liu
53*c2377f17SHangbin Liu	ip -n "${c_ns}" link set bond0 up
54*c2377f17SHangbin Liu	ip -n "${s_ns}" link set bond0 up
55*c2377f17SHangbin Liu	ip -n "${b_ns}" link set bond0 up
56*c2377f17SHangbin Liu}
57*c2377f17SHangbin Liu
58*c2377f17SHangbin Liutest_port_prio_setting()
59*c2377f17SHangbin Liu{
60*c2377f17SHangbin Liu	RET=0
61*c2377f17SHangbin Liu	ip -n "${c_ns}" link set eth0 type bond_slave actor_port_prio 1000
62*c2377f17SHangbin Liu	prio=$(cmd_jq "ip -n ${c_ns} -d -j link show eth0" \
63*c2377f17SHangbin Liu		".[].linkinfo.info_slave_data.actor_port_prio")
64*c2377f17SHangbin Liu	[ "$prio" -ne 1000 ] && RET=1
65*c2377f17SHangbin Liu	ip -n "${c_ns}" link set eth2 type bond_slave actor_port_prio 10
66*c2377f17SHangbin Liu	prio=$(cmd_jq "ip -n ${c_ns} -d -j link show eth2" \
67*c2377f17SHangbin Liu		".[].linkinfo.info_slave_data.actor_port_prio")
68*c2377f17SHangbin Liu	[ "$prio" -ne 10 ] && RET=1
69*c2377f17SHangbin Liu}
70*c2377f17SHangbin Liu
71*c2377f17SHangbin Liutest_agg_reselect()
72*c2377f17SHangbin Liu{
73*c2377f17SHangbin Liu	local bond_agg_id slave_agg_id
74*c2377f17SHangbin Liu	local expect_slave="$1"
75*c2377f17SHangbin Liu	RET=0
76*c2377f17SHangbin Liu
77*c2377f17SHangbin Liu	# Trigger link state change to reselect the aggregator
78*c2377f17SHangbin Liu	ip -n "${c_ns}" link set eth1 down
79*c2377f17SHangbin Liu	sleep 0.5
80*c2377f17SHangbin Liu	ip -n "${c_ns}" link set eth1 up
81*c2377f17SHangbin Liu	sleep 0.5
82*c2377f17SHangbin Liu
83*c2377f17SHangbin Liu	bond_agg_id=$(cmd_jq "ip -n ${c_ns} -d -j link show bond0" \
84*c2377f17SHangbin Liu		".[].linkinfo.info_data.ad_info.aggregator")
85*c2377f17SHangbin Liu	slave_agg_id=$(cmd_jq "ip -n ${c_ns} -d -j link show $expect_slave" \
86*c2377f17SHangbin Liu		".[].linkinfo.info_slave_data.ad_aggregator_id")
87*c2377f17SHangbin Liu	# shellcheck disable=SC2034
88*c2377f17SHangbin Liu	[ "${bond_agg_id}" -ne "${slave_agg_id}" ] && \
89*c2377f17SHangbin Liu		RET=1
90*c2377f17SHangbin Liu}
91*c2377f17SHangbin Liu
92*c2377f17SHangbin Liutrap cleanup_all_ns EXIT
93*c2377f17SHangbin Liusetup_ns c_ns s_ns b_ns
94*c2377f17SHangbin Liusetup_links
95*c2377f17SHangbin Liu
96*c2377f17SHangbin Liutest_port_prio_setting
97*c2377f17SHangbin Liulog_test "bond 802.3ad" "actor_port_prio setting"
98*c2377f17SHangbin Liu
99*c2377f17SHangbin Liutest_agg_reselect eth0
100*c2377f17SHangbin Liulog_test "bond 802.3ad" "actor_port_prio select"
101*c2377f17SHangbin Liu
102*c2377f17SHangbin Liu# Change the actor port prio and re-test
103*c2377f17SHangbin Liuip -n "${c_ns}" link set eth0 type bond_slave actor_port_prio 10
104*c2377f17SHangbin Liuip -n "${c_ns}" link set eth2 type bond_slave actor_port_prio 1000
105*c2377f17SHangbin Liutest_agg_reselect eth2
106*c2377f17SHangbin Liulog_test "bond 802.3ad" "actor_port_prio switch"
107*c2377f17SHangbin Liu
108*c2377f17SHangbin Liuexit "${EXIT_STATUS}"
109