GNU Linux-libre 4.19.207-gnu1
[releases.git] / tools / testing / selftests / net / forwarding / mirror_gre_vlan_bridge_1q.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3
4 # This test uses standard topology for testing gretap. See
5 # mirror_gre_topo_lib.sh for more details.
6 #
7 # Test for "tc action mirred egress mirror" when the underlay route points at a
8 # vlan device on top of a bridge device with vlan filtering (802.1q).
9
10 ALL_TESTS="
11         test_gretap
12         test_ip6gretap
13         test_gretap_forbidden_cpu
14         test_ip6gretap_forbidden_cpu
15         test_gretap_forbidden_egress
16         test_ip6gretap_forbidden_egress
17         test_gretap_untagged_egress
18         test_ip6gretap_untagged_egress
19         test_gretap_fdb_roaming
20         test_ip6gretap_fdb_roaming
21         test_gretap_stp
22         test_ip6gretap_stp
23 "
24
25 NUM_NETIFS=6
26 source lib.sh
27 source mirror_lib.sh
28 source mirror_gre_lib.sh
29 source mirror_gre_topo_lib.sh
30
31 require_command $ARPING
32
33 setup_prepare()
34 {
35         h1=${NETIFS[p1]}
36         swp1=${NETIFS[p2]}
37
38         swp2=${NETIFS[p3]}
39         h2=${NETIFS[p4]}
40
41         swp3=${NETIFS[p5]}
42         h3=${NETIFS[p6]}
43
44         # gt4's remote address is at $h3.555, not $h3. Thus the packets arriving
45         # directly to $h3 for test_gretap_untagged_egress() are rejected by
46         # rp_filter and the test spuriously fails.
47         sysctl_set net.ipv4.conf.all.rp_filter 0
48         sysctl_set net.ipv4.conf.$h3.rp_filter 0
49
50         vrf_prepare
51         mirror_gre_topo_create
52
53         vlan_create br1 555 "" 192.0.2.129/32 2001:db8:2::1/128
54         bridge vlan add dev br1 vid 555 self
55         ip route rep 192.0.2.130/32 dev br1.555
56         ip -6 route rep 2001:db8:2::2/128 dev br1.555
57
58         vlan_create $h3 555 v$h3 192.0.2.130/28 2001:db8:2::2/64
59
60         ip link set dev $swp3 master br1
61         bridge vlan add dev $swp3 vid 555
62         bridge vlan add dev $swp2 vid 555
63 }
64
65 cleanup()
66 {
67         pre_cleanup
68
69         ip link set dev $swp2 nomaster
70         ip link set dev $swp3 nomaster
71         vlan_destroy $h3 555
72         vlan_destroy br1 555
73
74         mirror_gre_topo_destroy
75         vrf_cleanup
76
77         sysctl_restore net.ipv4.conf.$h3.rp_filter
78         sysctl_restore net.ipv4.conf.all.rp_filter
79 }
80
81 test_vlan_match()
82 {
83         local tundev=$1; shift
84         local vlan_match=$1; shift
85         local what=$1; shift
86
87         full_test_span_gre_dir_vlan $tundev ingress "$vlan_match" 8 0 "$what"
88         full_test_span_gre_dir_vlan $tundev egress "$vlan_match" 0 8 "$what"
89 }
90
91 test_gretap()
92 {
93         test_vlan_match gt4 'skip_hw vlan_id 555 vlan_ethtype ip' \
94                         "mirror to gretap"
95 }
96
97 test_ip6gretap()
98 {
99         test_vlan_match gt6 'skip_hw vlan_id 555 vlan_ethtype ip' \
100                         "mirror to ip6gretap"
101 }
102
103 test_span_gre_forbidden_cpu()
104 {
105         local tundev=$1; shift
106         local what=$1; shift
107
108         RET=0
109
110         # Run the pass-test first, to prime neighbor table.
111         mirror_install $swp1 ingress $tundev "matchall $tcflags"
112         quick_test_span_gre_dir $tundev ingress
113
114         # Now forbid the VLAN at the bridge and see it fail.
115         bridge vlan del dev br1 vid 555 self
116         sleep 1
117         fail_test_span_gre_dir $tundev ingress
118
119         bridge vlan add dev br1 vid 555 self
120         sleep 1
121         quick_test_span_gre_dir $tundev ingress
122
123         mirror_uninstall $swp1 ingress
124
125         log_test "$what: vlan forbidden at a bridge ($tcflags)"
126 }
127
128 test_gretap_forbidden_cpu()
129 {
130         test_span_gre_forbidden_cpu gt4 "mirror to gretap"
131 }
132
133 test_ip6gretap_forbidden_cpu()
134 {
135         test_span_gre_forbidden_cpu gt6 "mirror to ip6gretap"
136 }
137
138 test_span_gre_forbidden_egress()
139 {
140         local tundev=$1; shift
141         local what=$1; shift
142
143         RET=0
144
145         mirror_install $swp1 ingress $tundev "matchall $tcflags"
146         quick_test_span_gre_dir $tundev ingress
147
148         bridge vlan del dev $swp3 vid 555
149         sleep 1
150         fail_test_span_gre_dir $tundev ingress
151
152         bridge vlan add dev $swp3 vid 555
153         # Re-prime FDB
154         $ARPING -I br1.555 192.0.2.130 -fqc 1
155         sleep 1
156         quick_test_span_gre_dir $tundev ingress
157
158         mirror_uninstall $swp1 ingress
159
160         log_test "$what: vlan forbidden at a bridge egress ($tcflags)"
161 }
162
163 test_gretap_forbidden_egress()
164 {
165         test_span_gre_forbidden_egress gt4 "mirror to gretap"
166 }
167
168 test_ip6gretap_forbidden_egress()
169 {
170         test_span_gre_forbidden_egress gt6 "mirror to ip6gretap"
171 }
172
173 test_span_gre_untagged_egress()
174 {
175         local tundev=$1; shift
176         local what=$1; shift
177
178         RET=0
179
180         mirror_install $swp1 ingress $tundev "matchall $tcflags"
181
182         quick_test_span_gre_dir $tundev ingress
183         quick_test_span_vlan_dir $h3 555 ingress
184
185         bridge vlan add dev $swp3 vid 555 pvid untagged
186         sleep 1
187         quick_test_span_gre_dir $tundev ingress
188         fail_test_span_vlan_dir $h3 555 ingress
189
190         bridge vlan add dev $swp3 vid 555
191         sleep 1
192         quick_test_span_gre_dir $tundev ingress
193         quick_test_span_vlan_dir $h3 555 ingress
194
195         mirror_uninstall $swp1 ingress
196
197         log_test "$what: vlan untagged at a bridge egress ($tcflags)"
198 }
199
200 test_gretap_untagged_egress()
201 {
202         test_span_gre_untagged_egress gt4 "mirror to gretap"
203 }
204
205 test_ip6gretap_untagged_egress()
206 {
207         test_span_gre_untagged_egress gt6 "mirror to ip6gretap"
208 }
209
210 test_span_gre_fdb_roaming()
211 {
212         local tundev=$1; shift
213         local what=$1; shift
214         local h3mac=$(mac_get $h3)
215
216         RET=0
217
218         mirror_install $swp1 ingress $tundev "matchall $tcflags"
219         quick_test_span_gre_dir $tundev ingress
220
221         bridge fdb del dev $swp3 $h3mac vlan 555 master
222         bridge fdb add dev $swp2 $h3mac vlan 555 master
223         sleep 1
224         fail_test_span_gre_dir $tundev ingress
225
226         bridge fdb del dev $swp2 $h3mac vlan 555 master
227         # Re-prime FDB
228         $ARPING -I br1.555 192.0.2.130 -fqc 1
229         sleep 1
230         quick_test_span_gre_dir $tundev ingress
231
232         mirror_uninstall $swp1 ingress
233
234         log_test "$what: MAC roaming ($tcflags)"
235 }
236
237 test_gretap_fdb_roaming()
238 {
239         test_span_gre_fdb_roaming gt4 "mirror to gretap"
240 }
241
242 test_ip6gretap_fdb_roaming()
243 {
244         test_span_gre_fdb_roaming gt6 "mirror to ip6gretap"
245 }
246
247 test_gretap_stp()
248 {
249         full_test_span_gre_stp gt4 $swp3 "mirror to gretap"
250 }
251
252 test_ip6gretap_stp()
253 {
254         full_test_span_gre_stp gt6 $swp3 "mirror to ip6gretap"
255 }
256
257 test_all()
258 {
259         slow_path_trap_install $swp1 ingress
260         slow_path_trap_install $swp1 egress
261
262         tests_run
263
264         slow_path_trap_uninstall $swp1 egress
265         slow_path_trap_uninstall $swp1 ingress
266 }
267
268 trap cleanup EXIT
269
270 setup_prepare
271 setup_wait
272
273 tcflags="skip_hw"
274 test_all
275
276 if ! tc_offload_check; then
277         echo "WARN: Could not test offloaded functionality"
278 else
279         tcflags="skip_sw"
280         test_all
281 fi
282
283 exit $EXIT_STATUS