xref: /linux/tools/testing/selftests/drivers/net/bonding/bond_topo_2d1c.sh (revision cbf658dd09419f1ef9de11b9604e950bdd5c170b)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# Topology for Bond mode 1,5,6 testing
5#
6#  +-------------------------+
7#  |          bond0          |  Server
8#  |            +            |  192.0.2.1/24
9#  |      eth0  |  eth1      |  2001:db8::1/24
10#  |        +---+---+        |
11#  |        |       |        |
12#  +-------------------------+
13#           |       |
14#  +-------------------------+
15#  |        |       |        |
16#  |    +---+-------+---+    |  Gateway
17#  |    |      br0      |    |  192.0.2.254/24
18#  |    +-------+-------+    |  2001:db8::254/24
19#  |            |            |
20#  +-------------------------+
21#               |
22#  +-------------------------+
23#  |            |            |  Client
24#  |            +            |  192.0.2.10/24
25#  |          eth0           |  2001:db8::10/24
26#  +-------------------------+
27
28REQUIRE_MZ=no
29NUM_NETIFS=0
30lib_dir=$(dirname "$0")
31source "$lib_dir"/../../../net/forwarding/lib.sh
32
33s_ns="s-$(mktemp -u XXXXXX)"
34c_ns="c-$(mktemp -u XXXXXX)"
35g_ns="g-$(mktemp -u XXXXXX)"
36s_ip4="192.0.2.1"
37c_ip4="192.0.2.10"
38g_ip4="192.0.2.254"
39s_ip6="2001:db8::1"
40c_ip6="2001:db8::10"
41g_ip6="2001:db8::254"
42mac[0]="00:0a:0b:0c:0d:01"
43mac[1]="00:0a:0b:0c:0d:02"
44
45gateway_create()
46{
47	ip netns add ${g_ns}
48	ip -n ${g_ns} link add br0 type bridge
49	ip -n ${g_ns} link set br0 up
50	ip -n ${g_ns} addr add ${g_ip4}/24 dev br0
51	ip -n ${g_ns} addr add ${g_ip6}/24 dev br0
52}
53
54gateway_destroy()
55{
56	ip -n ${g_ns} link del br0
57	ip netns del ${g_ns}
58}
59
60server_create()
61{
62	ip netns add ${s_ns}
63	ip -n ${s_ns} link add bond0 type bond mode active-backup miimon 100
64
65	for i in $(seq 0 1); do
66		ip -n ${s_ns} link add eth${i} type veth peer name s${i} netns ${g_ns}
67		ip -n "${s_ns}" link set "eth${i}" addr "${mac[$i]}"
68
69		ip -n ${g_ns} link set s${i} up
70		ip -n ${g_ns} link set s${i} master br0
71		ip -n ${s_ns} link set eth${i} master bond0
72
73		tc -n ${g_ns} qdisc add dev s${i} clsact
74	done
75
76	ip -n ${s_ns} link set bond0 up
77	ip -n ${s_ns} addr add ${s_ip4}/24 dev bond0
78	ip -n ${s_ns} addr add ${s_ip6}/24 dev bond0
79}
80
81# Reset bond with new mode and options
82bond_reset()
83{
84	# Count the eth link number in real-time as this function
85	# maybe called from other topologies.
86	local link_num=$(ip -n ${s_ns} -br link show | grep -c "^eth")
87	local param="$1"
88	link_num=$((link_num -1))
89
90	ip -n ${s_ns} link set bond0 down
91	ip -n ${s_ns} link del bond0
92
93	ip -n ${s_ns} link add bond0 type bond $param
94	for i in $(seq 0 ${link_num}); do
95		ip -n ${s_ns} link set eth$i master bond0
96	done
97
98	ip -n ${s_ns} link set bond0 up
99	ip -n ${s_ns} addr add ${s_ip4}/24 dev bond0
100	ip -n ${s_ns} addr add ${s_ip6}/24 dev bond0
101	# Wait for IPv6 address ready as it needs DAD
102	slowwait 2 ip netns exec ${s_ns} ping6 ${c_ip6} -c 1 -W 0.1 &> /dev/null
103}
104
105server_destroy()
106{
107	# Count the eth link number in real-time as this function
108	# maybe called from other topologies.
109	local link_num=$(ip -n ${s_ns} -br link show | grep -c "^eth")
110	link_num=$((link_num -1))
111	for i in $(seq 0 ${link_num}); do
112		ip -n ${s_ns} link del eth${i}
113	done
114	ip netns del ${s_ns}
115}
116
117client_create()
118{
119	ip netns add ${c_ns}
120	ip -n ${c_ns} link add eth0 type veth peer name c0 netns ${g_ns}
121
122	ip -n ${g_ns} link set c0 up
123	ip -n ${g_ns} link set c0 master br0
124
125	ip -n ${c_ns} link set eth0 up
126	ip -n ${c_ns} addr add ${c_ip4}/24 dev eth0
127	ip -n ${c_ns} addr add ${c_ip6}/24 dev eth0
128}
129
130client_destroy()
131{
132	ip -n ${c_ns} link del eth0
133	ip netns del ${c_ns}
134}
135
136setup_prepare()
137{
138	gateway_create
139	server_create
140	client_create
141}
142
143cleanup()
144{
145	pre_cleanup
146
147	client_destroy
148	server_destroy
149	gateway_destroy
150}
151
152bond_check_connection()
153{
154	local msg=${1:-"check connection"}
155
156	slowwait 2 ip netns exec ${s_ns} ping ${c_ip4} -c 1 -W 0.1 &> /dev/null
157	ip netns exec ${s_ns} ping ${c_ip4} -c5 -i 0.1 &>/dev/null
158	check_err $? "${msg}: ping failed"
159	ip netns exec ${s_ns} ping6 ${c_ip6} -c5 -i 0.1 &>/dev/null
160	check_err $? "${msg}: ping6 failed"
161}
162