1*541c6ce3SPetr Machata#!/bin/bash
2*541c6ce3SPetr Machata# SPDX-License-Identifier: GPL-2.0
3*541c6ce3SPetr Machata
4*541c6ce3SPetr Machata# Test for "tc action mirred egress mirror" when the underlay route points at a
5*541c6ce3SPetr Machata# team device.
6*541c6ce3SPetr Machata#
7*541c6ce3SPetr Machata# +----------------------+                             +----------------------+
8*541c6ce3SPetr Machata# | H1                   |                             |                   H2 |
9*541c6ce3SPetr Machata# |    + $h1.333         |                             |        $h1.555 +     |
10*541c6ce3SPetr Machata# |    | 192.0.2.1/28    |                             |  192.0.2.18/28 |     |
11*541c6ce3SPetr Machata# +----|-----------------+                             +----------------|-----+
12*541c6ce3SPetr Machata#      |                                $h1                             |
13*541c6ce3SPetr Machata#      +---------------------------------+------------------------------+
14*541c6ce3SPetr Machata#                                        |
15*541c6ce3SPetr Machata# +--------------------------------------|------------------------------------+
16*541c6ce3SPetr Machata# | SW                                   o---> mirror                         |
17*541c6ce3SPetr Machata# |                                      |                                    |
18*541c6ce3SPetr Machata# |   +----------------------------------+------------------------------+     |
19*541c6ce3SPetr Machata# |   |                                $swp1                            |     |
20*541c6ce3SPetr Machata# |   + $swp1.333                                             $swp1.555 +     |
21*541c6ce3SPetr Machata# |     192.0.2.2/28                                      192.0.2.17/28       |
22*541c6ce3SPetr Machata# |                                                                           |
23*541c6ce3SPetr Machata# |                                                                           |
24*541c6ce3SPetr Machata# |   + gt4 (gretap)      ,-> + lag1 (team)                                   |
25*541c6ce3SPetr Machata# |     loc=192.0.2.129   |   | 192.0.2.129/28                                |
26*541c6ce3SPetr Machata# |     rem=192.0.2.130 --'   |                                               |
27*541c6ce3SPetr Machata# |     ttl=100               |                                               |
28*541c6ce3SPetr Machata# |     tos=inherit           |                                               |
29*541c6ce3SPetr Machata# |      _____________________|______________________                         |
30*541c6ce3SPetr Machata# |     /                                            \                        |
31*541c6ce3SPetr Machata# |    /                                              \                       |
32*541c6ce3SPetr Machata# |   + $swp3                                          + $swp4                |
33*541c6ce3SPetr Machata# +---|------------------------------------------------|----------------------+
34*541c6ce3SPetr Machata#     |                                                |
35*541c6ce3SPetr Machata# +---|------------------------------------------------|----------------------+
36*541c6ce3SPetr Machata# |   + $h3                                            + $h4               H3 |
37*541c6ce3SPetr Machata# |    \                                              /                       |
38*541c6ce3SPetr Machata# |     \____________________________________________/                        |
39*541c6ce3SPetr Machata# |                           |                                               |
40*541c6ce3SPetr Machata# |                           + lag2 (team)                                   |
41*541c6ce3SPetr Machata# |                             192.0.2.130/28                                |
42*541c6ce3SPetr Machata# |                                                                           |
43*541c6ce3SPetr Machata# +---------------------------------------------------------------------------+
44*541c6ce3SPetr Machata
45*541c6ce3SPetr MachataALL_TESTS="
46*541c6ce3SPetr Machata	test_mirror_gretap_first
47*541c6ce3SPetr Machata	test_mirror_gretap_second
48*541c6ce3SPetr Machata"
49*541c6ce3SPetr Machata
50*541c6ce3SPetr MachataNUM_NETIFS=6
51*541c6ce3SPetr Machatasource lib.sh
52*541c6ce3SPetr Machatasource mirror_lib.sh
53*541c6ce3SPetr Machatasource mirror_gre_lib.sh
54*541c6ce3SPetr Machata
55*541c6ce3SPetr Machatarequire_command $ARPING
56*541c6ce3SPetr Machata
57*541c6ce3SPetr Machatavlan_host_create()
58*541c6ce3SPetr Machata{
59*541c6ce3SPetr Machata	local if_name=$1; shift
60*541c6ce3SPetr Machata	local vid=$1; shift
61*541c6ce3SPetr Machata	local vrf_name=$1; shift
62*541c6ce3SPetr Machata	local ips=("${@}")
63*541c6ce3SPetr Machata
64*541c6ce3SPetr Machata	vrf_create $vrf_name
65*541c6ce3SPetr Machata	ip link set dev $vrf_name up
66*541c6ce3SPetr Machata	vlan_create $if_name $vid $vrf_name "${ips[@]}"
67*541c6ce3SPetr Machata}
68*541c6ce3SPetr Machata
69*541c6ce3SPetr Machatavlan_host_destroy()
70*541c6ce3SPetr Machata{
71*541c6ce3SPetr Machata	local if_name=$1; shift
72*541c6ce3SPetr Machata	local vid=$1; shift
73*541c6ce3SPetr Machata	local vrf_name=$1; shift
74*541c6ce3SPetr Machata
75*541c6ce3SPetr Machata	vlan_destroy $if_name $vid
76*541c6ce3SPetr Machata	ip link set dev $vrf_name down
77*541c6ce3SPetr Machata	vrf_destroy $vrf_name
78*541c6ce3SPetr Machata}
79*541c6ce3SPetr Machata
80*541c6ce3SPetr Machatah1_create()
81*541c6ce3SPetr Machata{
82*541c6ce3SPetr Machata	vlan_host_create $h1 333 vrf-h1 192.0.2.1/28
83*541c6ce3SPetr Machata	ip -4 route add 192.0.2.16/28 vrf vrf-h1 nexthop via 192.0.2.2
84*541c6ce3SPetr Machata}
85*541c6ce3SPetr Machata
86*541c6ce3SPetr Machatah1_destroy()
87*541c6ce3SPetr Machata{
88*541c6ce3SPetr Machata	ip -4 route del 192.0.2.16/28 vrf vrf-h1
89*541c6ce3SPetr Machata	vlan_host_destroy $h1 333 vrf-h1
90*541c6ce3SPetr Machata}
91*541c6ce3SPetr Machata
92*541c6ce3SPetr Machatah2_create()
93*541c6ce3SPetr Machata{
94*541c6ce3SPetr Machata	vlan_host_create $h1 555 vrf-h2 192.0.2.18/28
95*541c6ce3SPetr Machata	ip -4 route add 192.0.2.0/28 vrf vrf-h2 nexthop via 192.0.2.17
96*541c6ce3SPetr Machata}
97*541c6ce3SPetr Machata
98*541c6ce3SPetr Machatah2_destroy()
99*541c6ce3SPetr Machata{
100*541c6ce3SPetr Machata	ip -4 route del 192.0.2.0/28 vrf vrf-h2
101*541c6ce3SPetr Machata	vlan_host_destroy $h1 555 vrf-h2
102*541c6ce3SPetr Machata}
103*541c6ce3SPetr Machata
104*541c6ce3SPetr Machatah3_create_team()
105*541c6ce3SPetr Machata{
106*541c6ce3SPetr Machata	team_create lag2 lacp $h3 $h4
107*541c6ce3SPetr Machata	__simple_if_init lag2 vrf-h3 192.0.2.130/32
108*541c6ce3SPetr Machata	ip -4 route add vrf vrf-h3 192.0.2.129/32 dev lag2
109*541c6ce3SPetr Machata}
110*541c6ce3SPetr Machata
111*541c6ce3SPetr Machatah3_destroy_team()
112*541c6ce3SPetr Machata{
113*541c6ce3SPetr Machata	ip -4 route del vrf vrf-h3 192.0.2.129/32 dev lag2
114*541c6ce3SPetr Machata	__simple_if_fini lag2 192.0.2.130/32
115*541c6ce3SPetr Machata	team_destroy lag2
116*541c6ce3SPetr Machata
117*541c6ce3SPetr Machata	ip link set dev $h3 down
118*541c6ce3SPetr Machata	ip link set dev $h4 down
119*541c6ce3SPetr Machata}
120*541c6ce3SPetr Machata
121*541c6ce3SPetr Machatah3_create()
122*541c6ce3SPetr Machata{
123*541c6ce3SPetr Machata	vrf_create vrf-h3
124*541c6ce3SPetr Machata	ip link set dev vrf-h3 up
125*541c6ce3SPetr Machata	tc qdisc add dev $h3 clsact
126*541c6ce3SPetr Machata	tc qdisc add dev $h4 clsact
127*541c6ce3SPetr Machata	h3_create_team
128*541c6ce3SPetr Machata}
129*541c6ce3SPetr Machata
130*541c6ce3SPetr Machatah3_destroy()
131*541c6ce3SPetr Machata{
132*541c6ce3SPetr Machata	h3_destroy_team
133*541c6ce3SPetr Machata	tc qdisc del dev $h4 clsact
134*541c6ce3SPetr Machata	tc qdisc del dev $h3 clsact
135*541c6ce3SPetr Machata	ip link set dev vrf-h3 down
136*541c6ce3SPetr Machata	vrf_destroy vrf-h3
137*541c6ce3SPetr Machata}
138*541c6ce3SPetr Machata
139*541c6ce3SPetr Machataswitch_create()
140*541c6ce3SPetr Machata{
141*541c6ce3SPetr Machata	ip link set dev $swp1 up
142*541c6ce3SPetr Machata	tc qdisc add dev $swp1 clsact
143*541c6ce3SPetr Machata	vlan_create $swp1 333 "" 192.0.2.2/28
144*541c6ce3SPetr Machata	vlan_create $swp1 555 "" 192.0.2.17/28
145*541c6ce3SPetr Machata
146*541c6ce3SPetr Machata	tunnel_create gt4 gretap 192.0.2.129 192.0.2.130 \
147*541c6ce3SPetr Machata		      ttl 100 tos inherit
148*541c6ce3SPetr Machata
149*541c6ce3SPetr Machata	ip link set dev $swp3 up
150*541c6ce3SPetr Machata	ip link set dev $swp4 up
151*541c6ce3SPetr Machata	team_create lag1 lacp $swp3 $swp4
152*541c6ce3SPetr Machata	__addr_add_del lag1 add 192.0.2.129/32
153*541c6ce3SPetr Machata	ip -4 route add 192.0.2.130/32 dev lag1
154*541c6ce3SPetr Machata}
155*541c6ce3SPetr Machata
156*541c6ce3SPetr Machataswitch_destroy()
157*541c6ce3SPetr Machata{
158*541c6ce3SPetr Machata	ip -4 route del 192.0.2.130/32 dev lag1
159*541c6ce3SPetr Machata	__addr_add_del lag1 del 192.0.2.129/32
160*541c6ce3SPetr Machata	team_destroy lag1
161*541c6ce3SPetr Machata
162*541c6ce3SPetr Machata	ip link set dev $swp4 down
163*541c6ce3SPetr Machata	ip link set dev $swp3 down
164*541c6ce3SPetr Machata
165*541c6ce3SPetr Machata	tunnel_destroy gt4
166*541c6ce3SPetr Machata
167*541c6ce3SPetr Machata	vlan_destroy $swp1 555
168*541c6ce3SPetr Machata	vlan_destroy $swp1 333
169*541c6ce3SPetr Machata	tc qdisc del dev $swp1 clsact
170*541c6ce3SPetr Machata	ip link set dev $swp1 down
171*541c6ce3SPetr Machata}
172*541c6ce3SPetr Machata
173*541c6ce3SPetr Machatasetup_prepare()
174*541c6ce3SPetr Machata{
175*541c6ce3SPetr Machata	h1=${NETIFS[p1]}
176*541c6ce3SPetr Machata	swp1=${NETIFS[p2]}
177*541c6ce3SPetr Machata
178*541c6ce3SPetr Machata	swp3=${NETIFS[p3]}
179*541c6ce3SPetr Machata	h3=${NETIFS[p4]}
180*541c6ce3SPetr Machata
181*541c6ce3SPetr Machata	swp4=${NETIFS[p5]}
182*541c6ce3SPetr Machata	h4=${NETIFS[p6]}
183*541c6ce3SPetr Machata
184*541c6ce3SPetr Machata	vrf_prepare
185*541c6ce3SPetr Machata
186*541c6ce3SPetr Machata	ip link set dev $h1 up
187*541c6ce3SPetr Machata	h1_create
188*541c6ce3SPetr Machata	h2_create
189*541c6ce3SPetr Machata	h3_create
190*541c6ce3SPetr Machata	switch_create
191*541c6ce3SPetr Machata
192*541c6ce3SPetr Machata	trap_install $h3 ingress
193*541c6ce3SPetr Machata	trap_install $h4 ingress
194*541c6ce3SPetr Machata}
195*541c6ce3SPetr Machata
196*541c6ce3SPetr Machatacleanup()
197*541c6ce3SPetr Machata{
198*541c6ce3SPetr Machata	pre_cleanup
199*541c6ce3SPetr Machata
200*541c6ce3SPetr Machata	trap_uninstall $h4 ingress
201*541c6ce3SPetr Machata	trap_uninstall $h3 ingress
202*541c6ce3SPetr Machata
203*541c6ce3SPetr Machata	switch_destroy
204*541c6ce3SPetr Machata	h3_destroy
205*541c6ce3SPetr Machata	h2_destroy
206*541c6ce3SPetr Machata	h1_destroy
207*541c6ce3SPetr Machata	ip link set dev $h1 down
208*541c6ce3SPetr Machata
209*541c6ce3SPetr Machata	vrf_cleanup
210*541c6ce3SPetr Machata}
211*541c6ce3SPetr Machata
212*541c6ce3SPetr Machatatest_lag_slave()
213*541c6ce3SPetr Machata{
214*541c6ce3SPetr Machata	local up_dev=$1; shift
215*541c6ce3SPetr Machata	local down_dev=$1; shift
216*541c6ce3SPetr Machata	local what=$1; shift
217*541c6ce3SPetr Machata
218*541c6ce3SPetr Machata	RET=0
219*541c6ce3SPetr Machata
220*541c6ce3SPetr Machata	mirror_install $swp1 ingress gt4 \
221*541c6ce3SPetr Machata		       "proto 802.1q flower vlan_id 333 $tcflags"
222*541c6ce3SPetr Machata
223*541c6ce3SPetr Machata	# Move $down_dev away from the team. That will prompt change in
224*541c6ce3SPetr Machata	# txability of the connected device, without changing its upness. The
225*541c6ce3SPetr Machata	# driver should notice the txability change and move the traffic to the
226*541c6ce3SPetr Machata	# other slave.
227*541c6ce3SPetr Machata	ip link set dev $down_dev nomaster
228*541c6ce3SPetr Machata	sleep 2
229*541c6ce3SPetr Machata	mirror_test vrf-h1 192.0.2.1 192.0.2.18 $up_dev 1 10
230*541c6ce3SPetr Machata
231*541c6ce3SPetr Machata	# Test lack of connectivity when neither slave is txable.
232*541c6ce3SPetr Machata	ip link set dev $up_dev nomaster
233*541c6ce3SPetr Machata	sleep 2
234*541c6ce3SPetr Machata	mirror_test vrf-h1 192.0.2.1 192.0.2.18 $h3 1 0
235*541c6ce3SPetr Machata	mirror_test vrf-h1 192.0.2.1 192.0.2.18 $h4 1 0
236*541c6ce3SPetr Machata	mirror_uninstall $swp1 ingress
237*541c6ce3SPetr Machata
238*541c6ce3SPetr Machata	# Recreate H3's team device, because mlxsw, which this test is
239*541c6ce3SPetr Machata	# predominantly mean to test, requires a bottom-up construction and
240*541c6ce3SPetr Machata	# doesn't allow enslavement to a device that already has an upper.
241*541c6ce3SPetr Machata	h3_destroy_team
242*541c6ce3SPetr Machata	h3_create_team
243*541c6ce3SPetr Machata	# Wait for ${h,swp}{3,4}.
244*541c6ce3SPetr Machata	setup_wait
245*541c6ce3SPetr Machata
246*541c6ce3SPetr Machata	log_test "$what ($tcflags)"
247*541c6ce3SPetr Machata}
248*541c6ce3SPetr Machata
249*541c6ce3SPetr Machatatest_mirror_gretap_first()
250*541c6ce3SPetr Machata{
251*541c6ce3SPetr Machata	test_lag_slave $h3 $h4 "mirror to gretap: LAG first slave"
252*541c6ce3SPetr Machata}
253*541c6ce3SPetr Machata
254*541c6ce3SPetr Machatatest_mirror_gretap_second()
255*541c6ce3SPetr Machata{
256*541c6ce3SPetr Machata	test_lag_slave $h4 $h3 "mirror to gretap: LAG second slave"
257*541c6ce3SPetr Machata}
258*541c6ce3SPetr Machata
259*541c6ce3SPetr Machatatest_all()
260*541c6ce3SPetr Machata{
261*541c6ce3SPetr Machata	slow_path_trap_install $swp1 ingress
262*541c6ce3SPetr Machata	slow_path_trap_install $swp1 egress
263*541c6ce3SPetr Machata
264*541c6ce3SPetr Machata	tests_run
265*541c6ce3SPetr Machata
266*541c6ce3SPetr Machata	slow_path_trap_uninstall $swp1 egress
267*541c6ce3SPetr Machata	slow_path_trap_uninstall $swp1 ingress
268*541c6ce3SPetr Machata}
269*541c6ce3SPetr Machata
270*541c6ce3SPetr Machatatrap cleanup EXIT
271*541c6ce3SPetr Machata
272*541c6ce3SPetr Machatasetup_prepare
273*541c6ce3SPetr Machatasetup_wait
274*541c6ce3SPetr Machata
275*541c6ce3SPetr Machatatcflags="skip_hw"
276*541c6ce3SPetr Machatatest_all
277*541c6ce3SPetr Machata
278*541c6ce3SPetr Machataif ! tc_offload_check; then
279*541c6ce3SPetr Machata	echo "WARN: Could not test offloaded functionality"
280*541c6ce3SPetr Machataelse
281*541c6ce3SPetr Machata	tcflags="skip_sw"
282*541c6ce3SPetr Machata	test_all
283*541c6ce3SPetr Machatafi
284*541c6ce3SPetr Machata
285*541c6ce3SPetr Machataexit $EXIT_STATUS
286