1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4# +----------------------------+                   +--------------------------+
5# | H1 (vrf)                   |                   |                 H2 (vrf) |
6# |                            |                   |                          |
7# |        + LAG1 (team)       |                   |     + LAG4 (team)        |
8# |        | 192.0.2.1/28      |                   |     | 192.0.2.130/28     |
9# |        | 2001:db8:1::1/64  |                   |     | 2001:db8:2::2/64   |
10# |      __^___                |                   |   __^_____               |
11# |     /      \               |                   |  /        \              |
12# |    + $h1    + $h4          |                   | + $h2      + $h3         |
13# |    |        |              |                   | |          |             |
14# +----|--------|--------------+                   +-|----------|-------------+
15#      |        |                                    |          |
16# +----|--------|------------------------------------|----------|-------------+
17# | SW |        |                                    |          |             |
18# |    + $swp1  + $swp4                              + $swp2    + $swp3       |
19# |     \__ ___/                                      \__ _____/              |
20# |        v                                             v                    |
21# | +------|-------------------------------+             |                    |
22# | |      + LAG2       BR1 (802.1q)       |             + LAG3 (team)        |
23# | |        (team)       192.0.2.2/28     |               192.0.2.129/28     |
24# | |                     2001:db8:1::2/64 |               2001:db8:2::1/64   |
25# | |                                      |                                  |
26# | +--------------------------------------+                                  |
27# +---------------------------------------------------------------------------+
28
29: ${ALL_TESTS:="
30	ping_ipv4
31	ping_ipv6
32
33	$(: exercise remastering of LAG2 slaves )
34	config_deslave_swp4
35	config_wait
36	ping_ipv4
37	ping_ipv6
38	config_enslave_swp4
39	config_deslave_swp1
40	config_wait
41	ping_ipv4
42	ping_ipv6
43	config_deslave_swp4
44	config_enslave_swp1
45	config_enslave_swp4
46	config_wait
47	ping_ipv4
48	ping_ipv6
49
50	$(: exercise remastering of LAG2 itself )
51	config_remaster_lag2
52	config_wait
53	ping_ipv4
54	ping_ipv6
55
56	$(: exercise remastering of LAG3 slaves )
57	config_deslave_swp2
58	config_wait
59	ping_ipv4
60	ping_ipv6
61	config_enslave_swp2
62	config_deslave_swp3
63	config_wait
64	ping_ipv4
65	ping_ipv6
66	config_deslave_swp2
67	config_enslave_swp3
68	config_enslave_swp2
69	config_wait
70	ping_ipv4
71	ping_ipv6
72
73	$(: move LAG3 to a bridge and then out )
74	config_remaster_lag3
75	config_wait
76	ping_ipv4
77	ping_ipv6
78    "}
79REQUIRE_TEAMD="yes"
80NUM_NETIFS=8
81: ${lib_dir:=.}
82source $lib_dir/lib.sh
83$EXTRA_SOURCE
84
85h1_create()
86{
87	team_create lag1 lacp
88	ip link set dev lag1 address $(mac_get $h1)
89	ip link set dev $h1 master lag1
90	ip link set dev $h4 master lag1
91	simple_if_init lag1 192.0.2.1/28 2001:db8:1::1/64
92	ip link set dev $h1 up
93	ip link set dev $h4 up
94	ip -4 route add 192.0.2.128/28 vrf vlag1 nexthop via 192.0.2.2
95	ip -6 route add 2001:db8:2::/64 vrf vlag1 nexthop via 2001:db8:1::2
96}
97
98h1_destroy()
99{
100	ip -6 route del 2001:db8:2::/64 vrf vlag1
101	ip -4 route del 192.0.2.128/28 vrf vlag1
102	ip link set dev $h4 down
103	ip link set dev $h1 down
104	simple_if_fini lag1 192.0.2.1/28 2001:db8:1::1/64
105	ip link set dev $h4 nomaster
106	ip link set dev $h1 nomaster
107	team_destroy lag1
108}
109
110h2_create()
111{
112	team_create lag4 lacp
113	ip link set dev lag4 address $(mac_get $h2)
114	ip link set dev $h2 master lag4
115	ip link set dev $h3 master lag4
116	simple_if_init lag4 192.0.2.130/28 2001:db8:2::2/64
117	ip link set dev $h2 up
118	ip link set dev $h3 up
119	ip -4 route add 192.0.2.0/28 vrf vlag4 nexthop via 192.0.2.129
120	ip -6 route add 2001:db8:1::/64 vrf vlag4 nexthop via 2001:db8:2::1
121}
122
123h2_destroy()
124{
125	ip -6 route del 2001:db8:1::/64 vrf vlag4
126	ip -4 route del 192.0.2.0/28 vrf vlag4
127	ip link set dev $h3 down
128	ip link set dev $h2 down
129	simple_if_fini lag4 192.0.2.130/28 2001:db8:2::2/64
130	ip link set dev $h3 nomaster
131	ip link set dev $h2 nomaster
132	team_destroy lag4
133}
134
135router_create()
136{
137	team_create lag2 lacp
138	ip link set dev lag2 address $(mac_get $swp1)
139	ip link set dev $swp1 master lag2
140	ip link set dev $swp4 master lag2
141
142	ip link add name br1 address $(mac_get lag2) \
143		type bridge vlan_filtering 1
144	ip link set dev lag2 master br1
145
146	ip link set dev $swp1 up
147	ip link set dev $swp4 up
148	ip link set dev br1 up
149
150	__addr_add_del br1 add 192.0.2.2/28 2001:db8:1::2/64
151
152	team_create lag3 lacp
153	ip link set dev lag3 address $(mac_get $swp2)
154	ip link set dev $swp2 master lag3
155	ip link set dev $swp3 master lag3
156	ip link set dev $swp2 up
157	ip link set dev $swp3 up
158	__addr_add_del lag3 add 192.0.2.129/28 2001:db8:2::1/64
159}
160
161router_destroy()
162{
163	__addr_add_del lag3 del 192.0.2.129/28 2001:db8:2::1/64
164	ip link set dev $swp3 down
165	ip link set dev $swp2 down
166	ip link set dev $swp3 nomaster
167	ip link set dev $swp2 nomaster
168	team_destroy lag3
169
170	__addr_add_del br1 del 192.0.2.2/28 2001:db8:1::2/64
171
172	ip link set dev $swp4 down
173	ip link set dev $swp1 down
174	ip link set dev br1 down
175
176	ip link set dev lag2 nomaster
177	ip link del dev br1
178
179	ip link set dev $swp4 nomaster
180	ip link set dev $swp1 nomaster
181	team_destroy lag2
182}
183
184config_remaster_lag2()
185{
186	log_info "Remaster bridge slave"
187
188	ip link set dev lag2 nomaster
189	sleep 2
190	ip link set dev lag2 master br1
191}
192
193config_remaster_lag3()
194{
195	log_info "Move lag3 to the bridge, then out again"
196
197	ip link set dev lag3 master br1
198	sleep 2
199	ip link set dev lag3 nomaster
200}
201
202config_deslave()
203{
204	local netdev=$1; shift
205
206	log_info "Deslave $netdev"
207	ip link set dev $netdev down
208	ip link set dev $netdev nomaster
209	ip link set dev $netdev up
210}
211
212config_deslave_swp1()
213{
214	config_deslave $swp1
215}
216
217config_deslave_swp2()
218{
219	config_deslave $swp2
220}
221
222config_deslave_swp3()
223{
224	config_deslave $swp3
225}
226
227config_deslave_swp4()
228{
229	config_deslave $swp4
230}
231
232config_enslave()
233{
234	local netdev=$1; shift
235	local master=$1; shift
236
237	log_info "Enslave $netdev to $master"
238	ip link set dev $netdev down
239	ip link set dev $netdev master $master
240	ip link set dev $netdev up
241}
242
243config_enslave_swp1()
244{
245	config_enslave $swp1 lag2
246}
247
248config_enslave_swp2()
249{
250	config_enslave $swp2 lag3
251}
252
253config_enslave_swp3()
254{
255	config_enslave $swp3 lag3
256}
257
258config_enslave_swp4()
259{
260	config_enslave $swp4 lag2
261}
262
263config_wait()
264{
265	setup_wait_dev lag2
266	setup_wait_dev lag3
267}
268
269setup_prepare()
270{
271	h1=${NETIFS[p1]}
272	swp1=${NETIFS[p2]}
273
274	swp2=${NETIFS[p3]}
275	h2=${NETIFS[p4]}
276
277	swp3=${NETIFS[p5]}
278	h3=${NETIFS[p6]}
279
280	h4=${NETIFS[p7]}
281	swp4=${NETIFS[p8]}
282
283	vrf_prepare
284
285	h1_create
286	h2_create
287
288	router_create
289
290	forwarding_enable
291}
292
293cleanup()
294{
295	pre_cleanup
296
297	forwarding_restore
298
299	router_destroy
300
301	h2_destroy
302	h1_destroy
303
304	vrf_cleanup
305}
306
307ping_ipv4()
308{
309	ping_test lag1 192.0.2.130
310}
311
312ping_ipv6()
313{
314	ping6_test lag1 2001:db8:2::2
315}
316
317trap cleanup EXIT
318
319setup_prepare
320setup_wait
321
322tests_run
323
324exit $EXIT_STATUS
325