1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4#   +---------------------+                             +---------------------+
5#   | H1                  |                             |                  H2 |
6#   |     + $h1           |                             |           $h2 +     |
7#   |     | 192.0.2.1/28  |                             |  192.0.2.2/28 |     |
8#   +-----|---------------+                             +---------------|-----+
9#         |                                                             |
10#   +-----|-------------------------------------------------------------|-----+
11#   | SW  o--> mirror                                                   |     |
12#   | +---|-------------------------------------------------------------|---+ |
13#   | |   + $swp1                    BR                           $swp2 +   | |
14#   | +---------------------------------------------------------------------+ |
15#   |                                                                         |
16#   | +---------------------------------------------------------------------+ |
17#   | | OL                      + gt6 (ip6gretap)      + gt4 (gretap)       | |
18#   | |                         : loc=2001:db8:2::1    : loc=192.0.2.129    | |
19#   | |                         : rem=2001:db8:2::2    : rem=192.0.2.130    | |
20#   | |                         : ttl=100              : ttl=100            | |
21#   | |                         : tos=inherit          : tos=inherit        | |
22#   | +-------------------------:--|-------------------:--|-----------------+ |
23#   |                           :  |                   :  |                   |
24#   | +-------------------------:--|-------------------:--|-----------------+ |
25#   | | UL                      :  |,---------------------'                 | |
26#   | |   + $swp3               :  ||                  :                    | |
27#   | |   | 192.0.2.129/28      :  vv                  :                    | |
28#   | |   | 2001:db8:2::1/64    :  + ul (dummy)        :                    | |
29#   | +---|---------------------:----------------------:--------------------+ |
30#   +-----|---------------------:----------------------:----------------------+
31#         |                     :                      :
32#   +-----|---------------------:----------------------:----------------------+
33#   | H3  + $h3                 + h3-gt6 (ip6gretap)   + h3-gt4 (gretap)      |
34#   |       192.0.2.130/28        loc=2001:db8:2::2      loc=192.0.2.130      |
35#   |       2001:db8:2::2/64      rem=2001:db8:2::1      rem=192.0.2.129      |
36#   |                             ttl=100                ttl=100              |
37#   |                             tos=inherit            tos=inherit          |
38#   |                                                                         |
39#   +-------------------------------------------------------------------------+
40#
41# This tests mirroring to gretap and ip6gretap configured in an overlay /
42# underlay manner, i.e. with a bound dummy device that marks underlay VRF where
43# the encapsulated packed should be routed.
44
45ALL_TESTS="
46	test_gretap
47	test_ip6gretap
48"
49
50NUM_NETIFS=6
51source lib.sh
52source mirror_lib.sh
53source mirror_gre_lib.sh
54
55h1_create()
56{
57	simple_if_init $h1 192.0.2.1/28
58}
59
60h1_destroy()
61{
62	simple_if_fini $h1 192.0.2.1/28
63}
64
65h2_create()
66{
67	simple_if_init $h2 192.0.2.2/28
68}
69
70h2_destroy()
71{
72	simple_if_fini $h2 192.0.2.2/28
73}
74
75h3_create()
76{
77	simple_if_init $h3 192.0.2.130/28 2001:db8:2::2/64
78
79	tunnel_create h3-gt4 gretap 192.0.2.130 192.0.2.129
80	ip link set h3-gt4 vrf v$h3
81	matchall_sink_create h3-gt4
82
83	tunnel_create h3-gt6 ip6gretap 2001:db8:2::2 2001:db8:2::1
84	ip link set h3-gt6 vrf v$h3
85	matchall_sink_create h3-gt6
86}
87
88h3_destroy()
89{
90	tunnel_destroy h3-gt6
91	tunnel_destroy h3-gt4
92
93	simple_if_fini $h3 192.0.2.130/28 2001:db8:2::2/64
94}
95
96switch_create()
97{
98	# Bridge between H1 and H2.
99
100	ip link add name br1 type bridge vlan_filtering 1
101	ip link set dev br1 addrgenmode none
102	ip link set dev br1 up
103
104	ip link set dev $swp1 master br1
105	ip link set dev $swp1 up
106
107	ip link set dev $swp2 master br1
108	ip link set dev $swp2 up
109
110	tc qdisc add dev $swp1 clsact
111
112	# Underlay.
113
114	simple_if_init $swp3 192.0.2.129/28 2001:db8:2::1/64
115
116	ip link add name ul type dummy
117	ip link set dev ul master v$swp3
118	ip link set dev ul up
119
120	# Overlay.
121
122	vrf_create vrf-ol
123	ip link set dev vrf-ol up
124
125	tunnel_create gt4 gretap 192.0.2.129 192.0.2.130 \
126		      ttl 100 tos inherit dev ul
127	ip link set dev gt4 master vrf-ol
128	ip link set dev gt4 up
129
130	tunnel_create gt6 ip6gretap 2001:db8:2::1 2001:db8:2::2 \
131		      ttl 100 tos inherit dev ul allow-localremote
132	ip link set dev gt6 master vrf-ol
133	ip link set dev gt6 up
134}
135
136switch_destroy()
137{
138	vrf_destroy vrf-ol
139
140	tunnel_destroy gt6
141	tunnel_destroy gt4
142
143	simple_if_fini $swp3 192.0.2.129/28 2001:db8:2::1/64
144
145	ip link del dev ul
146
147	tc qdisc del dev $swp1 clsact
148
149	ip link set dev $swp1 down
150	ip link set dev $swp2 down
151	ip link del dev br1
152}
153
154setup_prepare()
155{
156	h1=${NETIFS[p1]}
157	swp1=${NETIFS[p2]}
158
159	swp2=${NETIFS[p3]}
160	h2=${NETIFS[p4]}
161
162	swp3=${NETIFS[p5]}
163	h3=${NETIFS[p6]}
164
165	vrf_prepare
166
167	h1_create
168	h2_create
169	h3_create
170
171	switch_create
172}
173
174cleanup()
175{
176	pre_cleanup
177
178	switch_destroy
179
180	h3_destroy
181	h2_destroy
182	h1_destroy
183
184	vrf_cleanup
185}
186
187test_gretap()
188{
189	full_test_span_gre_dir gt4 ingress 8 0 "mirror to gretap w/ UL"
190	full_test_span_gre_dir gt4 egress  0 8 "mirror to gretap w/ UL"
191}
192
193test_ip6gretap()
194{
195	full_test_span_gre_dir gt6 ingress 8 0 "mirror to ip6gretap w/ UL"
196	full_test_span_gre_dir gt6 egress  0 8 "mirror to ip6gretap w/ UL"
197}
198
199test_all()
200{
201	RET=0
202
203	slow_path_trap_install $swp1 ingress
204	slow_path_trap_install $swp1 egress
205
206	tests_run
207
208	slow_path_trap_uninstall $swp1 egress
209	slow_path_trap_uninstall $swp1 ingress
210}
211
212trap cleanup EXIT
213
214setup_prepare
215setup_wait
216
217tcflags="skip_hw"
218test_all
219
220if ! tc_offload_check; then
221	echo "WARN: Could not test offloaded functionality"
222else
223	tcflags="skip_sw"
224	test_all
225fi
226
227exit $EXIT_STATUS
228