xref: /linux/tools/testing/selftests/drivers/net/bonding/lag_lib.sh (revision e728258debd553c95d2e70f9cd97c9fde27c7130)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4NAMESPACES=""
5
6# Test that a link aggregation device (bonding, team) removes the hardware
7# addresses that it adds on its underlying devices.
8test_LAG_cleanup()
9{
10	local driver=$1
11	local mode=$2
12	local ucaddr="02:00:00:12:34:56"
13	local addr6="fe80::78:9abc/64"
14	local mcaddr="33:33:ff:78:9a:bc"
15	local name
16
17	ip link add dummy1 type dummy
18	ip link add dummy2 type dummy
19	if [ "$driver" = "bonding" ]; then
20		name="bond1"
21		ip link add "$name" up type bond mode "$mode"
22		ip link set dev dummy1 master "$name"
23		ip link set dev dummy2 master "$name"
24	elif [ "$driver" = "team" ]; then
25		name="team0"
26		ip link add "$name" type team
27		ip link set dev dummy1 master "$name"
28		ip link set dev dummy2 master "$name"
29		ip link set dev "$name" up
30	else
31		check_err 1
32		log_test test_LAG_cleanup ": unknown driver \"$driver\""
33		return
34	fi
35
36	# Used to test dev->uc handling
37	ip link add mv0 link "$name" up address "$ucaddr" type macvlan
38	# Used to test dev->mc handling
39	ip address add "$addr6" dev "$name"
40
41	# Check that addresses were added as expected
42	(grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy1 ||
43		grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy2) >/dev/null
44	check_err $? "macvlan unicast address not found on a slave"
45
46	# mcaddr is added asynchronously by addrconf_dad_work(), use busywait
47	(busywait 10000 grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy1 ||
48		grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy2) >/dev/null
49	check_err $? "IPv6 solicited-node multicast mac address not found on a slave"
50
51	ip link set dev "$name" down
52	ip link del "$name"
53
54	not grep_bridge_fdb "$ucaddr" bridge fdb show >/dev/null
55	check_err $? "macvlan unicast address still present on a slave"
56
57	not grep_bridge_fdb "$mcaddr" bridge fdb show >/dev/null
58	check_err $? "IPv6 solicited-node multicast mac address still present on a slave"
59
60	cleanup
61
62	log_test "$driver cleanup mode $mode"
63}
64
65# Build a generic 2 node net namespace with 2 connections
66# between the namespaces
67#
68#  +-----------+       +-----------+
69#  | node1     |       | node2     |
70#  |           |       |           |
71#  |           |       |           |
72#  |      eth0 +-------+ eth0      |
73#  |           |       |           |
74#  |      eth1 +-------+ eth1      |
75#  |           |       |           |
76#  +-----------+       +-----------+
77lag_setup2x2()
78{
79	local state=${1:-down}
80	local namespaces="lag_node1 lag_node2"
81
82	# create namespaces
83	for n in ${namespaces}; do
84		ip netns add ${n}
85	done
86
87	# wire up namespaces
88	ip link add name lag1 type veth peer name lag1-end
89	ip link set dev lag1 netns lag_node1 $state name eth0
90	ip link set dev lag1-end netns lag_node2 $state name eth0
91
92	ip link add name lag1 type veth peer name lag1-end
93	ip link set dev lag1 netns lag_node1 $state name eth1
94	ip link set dev lag1-end netns lag_node2 $state name eth1
95
96	NAMESPACES="${namespaces}"
97}
98
99# cleanup all lag related namespaces
100lag_cleanup()
101{
102	for n in ${NAMESPACES}; do
103		ip netns delete ${n} >/dev/null 2>&1 || true
104	done
105}
106
107SWITCH="lag_node1"
108CLIENT="lag_node2"
109CLIENTIP="172.20.2.1"
110SWITCHIP="172.20.2.2"
111
112lag_setup_network()
113{
114	lag_setup2x2 "down"
115
116	# create switch
117	ip netns exec ${SWITCH} ip link add br0 up type bridge
118	ip netns exec ${SWITCH} ip link set eth0 master br0 up
119	ip netns exec ${SWITCH} ip link set eth1 master br0 up
120	ip netns exec ${SWITCH} ip addr add ${SWITCHIP}/24 dev br0
121}
122
123lag_reset_network()
124{
125	ip netns exec ${CLIENT} ip link del bond0
126	ip netns exec ${SWITCH} ip link set eth0 up
127	ip netns exec ${SWITCH} ip link set eth1 up
128}
129
130create_bond()
131{
132	# create client
133	ip netns exec ${CLIENT} ip link set eth0 down
134	ip netns exec ${CLIENT} ip link set eth1 down
135
136	ip netns exec ${CLIENT} ip link add bond0 type bond $@
137	ip netns exec ${CLIENT} ip link set eth0 master bond0
138	ip netns exec ${CLIENT} ip link set eth1 master bond0
139	ip netns exec ${CLIENT} ip link set bond0 up
140	ip netns exec ${CLIENT} ip addr add ${CLIENTIP}/24 dev bond0
141}
142
143test_bond_recovery()
144{
145	RET=0
146
147	create_bond $@
148
149	# verify connectivity
150	slowwait 2 ip netns exec ${CLIENT} ping ${SWITCHIP} -c 2 -W 0.1 &> /dev/null
151	check_err $? "No connectivity"
152
153	# force the links of the bond down
154	ip netns exec ${SWITCH} ip link set eth0 down
155	sleep 2
156	ip netns exec ${SWITCH} ip link set eth0 up
157	ip netns exec ${SWITCH} ip link set eth1 down
158
159	# re-verify connectivity
160	slowwait 2 ip netns exec ${CLIENT} ping ${SWITCHIP} -c 2 -W 0.1 &> /dev/null
161
162	local rc=$?
163	check_err $rc "Bond failed to recover"
164	log_test "$1 ($2) bond recovery"
165	lag_reset_network
166}
167