1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4# +--------------------------------------------+
5# | H1 (vrf)                                   |
6# |                                            |
7# |    + LAG1.100          + LAG1.200          |
8# |    | 192.0.2.1/28      | 192.0.2.17/28     |
9# |    | 2001:db8:1::1/64  | 2001:db8:3:1/64   |
10# |    \___________ _______/                   |
11# |                v                           |
12# |                + LAG1 (team)               |
13# |                |                           |
14# |            ____^____                       |
15# |           /         \                      |
16# |          + $h1       + $h4                 |
17# |          |           |                     |
18# +----------|-----------|---------------------+
19#            |           |
20# +----------|-----------|---------------------+
21# | SW       |           |                     |
22# |          + $swp1     + $swp4               |
23# |           \____ ____/                      |
24# |                v                           |
25# |    LAG2 (team) +                           |
26# |                |                           |
27# |         _______^______________             |
28# |        /                      \            |
29# | +------|------------+ +-------|----------+ |
30# | |      + LAG2.100   | |       + LAG2.200 | |
31# | |                   | |                  | |
32# | |  BR1 (802.1d)     | | BR2 (802.1d)     | |
33# | |  192.0.2.2/28     | | 192.0.2.18/28    | |
34# | |  2001:db8:1::2/64 | | 2001:db8:3:2/64  | |
35# | |                   | |                  | |
36# | +-------------------+ +------------------+ |
37# |                                            |
38# |  + LAG3.100             + LAG3.200         |
39# |  | 192.0.2.129/28       | 192.0.2.145/28   |
40# |  | 2001:db8:2::1/64     | 2001:db8:4::1/64 |
41# |  |                      |                  |
42# |  \_________ ___________/                   |
43# |            v                               |
44# |            + LAG3 (team)                   |
45# |        ____|____                           |
46# |       /         \                          |
47# |       + $swp2   + $swp3                    |
48# |       |         |                          |
49# +-------|---------|--------------------------+
50#         |         |
51# +-------|---------|--------------------------+
52# |       |         |                          |
53# |       + $h2     + $h3                      |
54# |       \____ ___/                           |
55# |            |                               |
56# |            + LAG4 (team)                   |
57# |            |                               |
58# |  __________^__________                     |
59# | /                     \                    |
60# | |                     |                    |
61# | + LAG4.100            + LAG4.200           |
62# |   192.0.2.130/28        192.0.2.146/28     |
63# |   2001:db8:2::2/64      2001:db8:4::2/64   |
64# |                                            |
65# | H2 (vrf)                                   |
66# +--------------------------------------------+
67
68ALL_TESTS="
69	ping_ipv4
70	ping_ipv6
71
72	$(: exercise remastering of LAG2 slaves )
73	config_deslave_swp4
74	config_wait
75	ping_ipv4
76	ping_ipv6
77	config_enslave_swp4
78	config_deslave_swp1
79	config_wait
80	ping_ipv4
81	ping_ipv6
82	config_deslave_swp4
83	config_enslave_swp1
84	config_enslave_swp4
85	config_wait
86	ping_ipv4
87	ping_ipv6
88
89	$(: exercise remastering of LAG2 itself )
90	config_remaster_lag2
91	config_wait
92	ping_ipv4
93	ping_ipv6
94
95	$(: exercise remastering of LAG3 slaves )
96	config_deslave_swp2
97	config_wait
98	ping_ipv4
99	ping_ipv6
100	config_enslave_swp2
101	config_deslave_swp3
102	config_wait
103	ping_ipv4
104	ping_ipv6
105	config_deslave_swp2
106	config_enslave_swp3
107	config_enslave_swp2
108	config_wait
109	ping_ipv4
110	ping_ipv6
111"
112REQUIRE_TEAMD="yes"
113NUM_NETIFS=8
114source lib.sh
115
116h1_create()
117{
118	team_create lag1 lacp
119	ip link set dev lag1 addrgenmode none
120	ip link set dev lag1 address $(mac_get $h1)
121	ip link set dev $h1 master lag1
122	ip link set dev $h4 master lag1
123	simple_if_init lag1
124	ip link set dev $h1 up
125	ip link set dev $h4 up
126
127	vlan_create lag1 100 vlag1 192.0.2.1/28 2001:db8:1::1/64
128	vlan_create lag1 200 vlag1 192.0.2.17/28 2001:db8:3::1/64
129
130	ip -4 route add 192.0.2.128/28 vrf vlag1 nexthop via 192.0.2.2
131	ip -6 route add 2001:db8:2::/64 vrf vlag1 nexthop via 2001:db8:1::2
132
133	ip -4 route add 192.0.2.144/28 vrf vlag1 nexthop via 192.0.2.18
134	ip -6 route add 2001:db8:4::/64 vrf vlag1 nexthop via 2001:db8:3::2
135}
136
137h1_destroy()
138{
139	ip -6 route del 2001:db8:4::/64 vrf vlag1
140	ip -4 route del 192.0.2.144/28 vrf vlag1
141
142	ip -6 route del 2001:db8:2::/64 vrf vlag1
143	ip -4 route del 192.0.2.128/28 vrf vlag1
144
145	vlan_destroy lag1 200
146	vlan_destroy lag1 100
147
148	ip link set dev $h4 down
149	ip link set dev $h1 down
150	simple_if_fini lag1
151	ip link set dev $h4 nomaster
152	ip link set dev $h1 nomaster
153	team_destroy lag1
154}
155
156h2_create()
157{
158	team_create lag4 lacp
159	ip link set dev lag4 addrgenmode none
160	ip link set dev lag4 address $(mac_get $h2)
161	ip link set dev $h2 master lag4
162	ip link set dev $h3 master lag4
163	simple_if_init lag4
164	ip link set dev $h2 up
165	ip link set dev $h3 up
166
167	vlan_create lag4 100 vlag4 192.0.2.130/28 2001:db8:2::2/64
168	vlan_create lag4 200 vlag4 192.0.2.146/28 2001:db8:4::2/64
169
170	ip -4 route add 192.0.2.0/28 vrf vlag4 nexthop via 192.0.2.129
171	ip -6 route add 2001:db8:1::/64 vrf vlag4 nexthop via 2001:db8:2::1
172
173	ip -4 route add 192.0.2.16/28 vrf vlag4 nexthop via 192.0.2.145
174	ip -6 route add 2001:db8:3::/64 vrf vlag4 nexthop via 2001:db8:4::1
175}
176
177h2_destroy()
178{
179	ip -6 route del 2001:db8:3::/64 vrf vlag4
180	ip -4 route del 192.0.2.16/28 vrf vlag4
181
182	ip -6 route del 2001:db8:1::/64 vrf vlag4
183	ip -4 route del 192.0.2.0/28 vrf vlag4
184
185	vlan_destroy lag4 200
186	vlan_destroy lag4 100
187
188	ip link set dev $h3 down
189	ip link set dev $h2 down
190	simple_if_fini lag4
191	ip link set dev $h3 nomaster
192	ip link set dev $h2 nomaster
193	team_destroy lag4
194}
195
196router_create()
197{
198	team_create lag2 lacp
199	ip link set dev lag2 addrgenmode none
200	ip link set dev lag2 address $(mac_get $swp1)
201	ip link set dev $swp1 master lag2
202	ip link set dev $swp4 master lag2
203
204	vlan_create lag2 100
205	vlan_create lag2 200
206
207	ip link add name br1 type bridge vlan_filtering 0
208	ip link set dev br1 address $(mac_get lag2.100)
209	ip link set dev lag2.100 master br1
210
211	ip link add name br2 type bridge vlan_filtering 0
212	ip link set dev br2 address $(mac_get lag2.200)
213	ip link set dev lag2.200 master br2
214
215	ip link set dev $swp1 up
216	ip link set dev $swp4 up
217	ip link set dev br1 up
218	ip link set dev br2 up
219
220	__addr_add_del br1 add 192.0.2.2/28 2001:db8:1::2/64
221	__addr_add_del br2 add 192.0.2.18/28 2001:db8:3::2/64
222
223	team_create lag3 lacp
224	ip link set dev lag3 addrgenmode none
225	ip link set dev lag3 address $(mac_get $swp2)
226	ip link set dev $swp2 master lag3
227	ip link set dev $swp3 master lag3
228	ip link set dev $swp2 up
229	ip link set dev $swp3 up
230
231	vlan_create lag3 100
232	vlan_create lag3 200
233
234	__addr_add_del lag3.100 add 192.0.2.129/28 2001:db8:2::1/64
235	__addr_add_del lag3.200 add 192.0.2.145/28 2001:db8:4::1/64
236}
237
238router_destroy()
239{
240	__addr_add_del lag3.200 del 192.0.2.145/28 2001:db8:4::1/64
241	__addr_add_del lag3.100 del 192.0.2.129/28 2001:db8:2::1/64
242
243	vlan_destroy lag3 200
244	vlan_destroy lag3 100
245
246	ip link set dev $swp3 down
247	ip link set dev $swp2 down
248	ip link set dev $swp3 nomaster
249	ip link set dev $swp2 nomaster
250	team_destroy lag3
251
252	__addr_add_del br2 del 192.0.2.18/28 2001:db8:3::2/64
253	__addr_add_del br1 del 192.0.2.2/28 2001:db8:1::2/64
254
255	ip link set dev br2 down
256	ip link set dev br1 down
257	ip link set dev $swp4 down
258	ip link set dev $swp1 down
259
260	ip link set dev lag2.200 nomaster
261	ip link del dev br2
262
263	ip link set dev lag2.100 nomaster
264	ip link del dev br1
265
266	vlan_destroy lag2 200
267	vlan_destroy lag2 100
268
269	ip link set dev $swp4 nomaster
270	ip link set dev $swp1 nomaster
271	team_destroy lag2
272}
273
274config_remaster_lag2()
275{
276	log_info "Remaster bridge slaves"
277
278	ip link set dev lag2.200 nomaster
279	ip link set dev lag2.100 nomaster
280	sleep 2
281	ip link set dev lag2.100 master br1
282	ip link set dev lag2.200 master br2
283}
284
285config_deslave()
286{
287	local netdev=$1; shift
288
289	log_info "Deslave $netdev"
290	ip link set dev $netdev down
291	ip link set dev $netdev nomaster
292	ip link set dev $netdev up
293}
294
295config_deslave_swp1()
296{
297	config_deslave $swp1
298}
299
300config_deslave_swp2()
301{
302	config_deslave $swp2
303}
304
305config_deslave_swp3()
306{
307	config_deslave $swp3
308}
309
310config_deslave_swp4()
311{
312	config_deslave $swp4
313}
314
315config_enslave()
316{
317	local netdev=$1; shift
318	local master=$1; shift
319
320	log_info "Enslave $netdev to $master"
321	ip link set dev $netdev down
322	ip link set dev $netdev master $master
323	ip link set dev $netdev up
324}
325
326config_enslave_swp1()
327{
328	config_enslave $swp1 lag2
329}
330
331config_enslave_swp2()
332{
333	config_enslave $swp2 lag3
334}
335
336config_enslave_swp3()
337{
338	config_enslave $swp3 lag3
339}
340
341config_enslave_swp4()
342{
343	config_enslave $swp4 lag2
344}
345
346config_wait()
347{
348	setup_wait_dev lag2
349	setup_wait_dev lag3
350}
351
352setup_prepare()
353{
354	h1=${NETIFS[p1]}
355	swp1=${NETIFS[p2]}
356
357	swp2=${NETIFS[p3]}
358	h2=${NETIFS[p4]}
359
360	swp3=${NETIFS[p5]}
361	h3=${NETIFS[p6]}
362
363	h4=${NETIFS[p7]}
364	swp4=${NETIFS[p8]}
365
366	vrf_prepare
367
368	h1_create
369	h2_create
370
371	router_create
372
373	forwarding_enable
374}
375
376cleanup()
377{
378	pre_cleanup
379
380	forwarding_restore
381
382	router_destroy
383
384	h2_destroy
385	h1_destroy
386
387	vrf_cleanup
388}
389
390ping_ipv4()
391{
392	ping_test lag1.100 192.0.2.130 ": via 100"
393	ping_test lag1.200 192.0.2.146 ": via 200"
394}
395
396ping_ipv6()
397{
398	ping6_test lag1.100 2001:db8:2::2 ": via 100"
399	ping6_test lag1.200 2001:db8:4::2 ": via 200"
400}
401
402trap cleanup EXIT
403
404setup_prepare
405setup_wait
406
407tests_run
408
409exit $EXIT_STATUS
410