Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / tools / testing / selftests / net / forwarding / mirror_gre_bridge_1q_lag.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3
4 # Test for "tc action mirred egress mirror" when the underlay route points at a
5 # bridge device with vlan filtering (802.1q), and the egress device is a team
6 # device.
7 #
8 # +----------------------+                             +----------------------+
9 # | H1                   |                             |                   H2 |
10 # |     + $h1.333        |                             |        $h1.555 +     |
11 # |     | 192.0.2.1/28   |                             |  192.0.2.18/28 |     |
12 # +-----|----------------+                             +----------------|-----+
13 #       |                               $h1                             |
14 #       +--------------------------------+------------------------------+
15 #                                        |
16 # +--------------------------------------|------------------------------------+
17 # | SW                                   o---> mirror                         |
18 # |                                      |                                    |
19 # |     +--------------------------------+------------------------------+     |
20 # |     |                              $swp1                            |     |
21 # |     + $swp1.333                                           $swp1.555 +     |
22 # |       192.0.2.2/28                                    192.0.2.17/28       |
23 # |                                                                           |
24 # | +-----------------------------------------------------------------------+ |
25 # | |                        BR1 (802.1q)                                   | |
26 # | |     + lag (team)       192.0.2.129/28                                 | |
27 # | |    / \                 2001:db8:2::1/64                               | |
28 # | +---/---\---------------------------------------------------------------+ |
29 # |    /     \                                                            ^   |
30 # |   |       \                                        + gt4 (gretap)     |   |
31 # |   |        \                                         loc=192.0.2.129  |   |
32 # |   |         \                                        rem=192.0.2.130 -+   |
33 # |   |          \                                       ttl=100              |
34 # |   |           \                                      tos=inherit          |
35 # |   |            \                                                          |
36 # |   |             \_________________________________                        |
37 # |   |                                               \                       |
38 # |   + $swp3                                          + $swp4                |
39 # +---|------------------------------------------------|----------------------+
40 #     |                                                |
41 # +---|----------------------+                     +---|----------------------+
42 # |   + $h3               H3 |                     |   + $h4               H4 |
43 # |     192.0.2.130/28       |                     |     192.0.2.130/28       |
44 # |     2001:db8:2::2/64     |                     |     2001:db8:2::2/64     |
45 # +--------------------------+                     +--------------------------+
46
47 ALL_TESTS="
48         test_mirror_gretap_first
49         test_mirror_gretap_second
50 "
51
52 NUM_NETIFS=6
53 source lib.sh
54 source mirror_lib.sh
55 source mirror_gre_lib.sh
56
57 require_command $ARPING
58
59 vlan_host_create()
60 {
61         local if_name=$1; shift
62         local vid=$1; shift
63         local vrf_name=$1; shift
64         local ips=("${@}")
65
66         vrf_create $vrf_name
67         ip link set dev $vrf_name up
68         vlan_create $if_name $vid $vrf_name "${ips[@]}"
69 }
70
71 vlan_host_destroy()
72 {
73         local if_name=$1; shift
74         local vid=$1; shift
75         local vrf_name=$1; shift
76
77         vlan_destroy $if_name $vid
78         ip link set dev $vrf_name down
79         vrf_destroy $vrf_name
80 }
81
82 h1_create()
83 {
84         vlan_host_create $h1 333 vrf-h1 192.0.2.1/28
85         ip -4 route add 192.0.2.16/28 vrf vrf-h1 nexthop via 192.0.2.2
86 }
87
88 h1_destroy()
89 {
90         ip -4 route del 192.0.2.16/28 vrf vrf-h1
91         vlan_host_destroy $h1 333 vrf-h1
92 }
93
94 h2_create()
95 {
96         vlan_host_create $h1 555 vrf-h2 192.0.2.18/28
97         ip -4 route add 192.0.2.0/28 vrf vrf-h2 nexthop via 192.0.2.17
98 }
99
100 h2_destroy()
101 {
102         ip -4 route del 192.0.2.0/28 vrf vrf-h2
103         vlan_host_destroy $h1 555 vrf-h2
104 }
105
106 h3_create()
107 {
108         simple_if_init $h3 192.0.2.130/28
109         tc qdisc add dev $h3 clsact
110 }
111
112 h3_destroy()
113 {
114         tc qdisc del dev $h3 clsact
115         simple_if_fini $h3 192.0.2.130/28
116 }
117
118 h4_create()
119 {
120         simple_if_init $h4 192.0.2.130/28
121         tc qdisc add dev $h4 clsact
122 }
123
124 h4_destroy()
125 {
126         tc qdisc del dev $h4 clsact
127         simple_if_fini $h4 192.0.2.130/28
128 }
129
130 switch_create()
131 {
132         ip link set dev $swp1 up
133         tc qdisc add dev $swp1 clsact
134         vlan_create $swp1 333 "" 192.0.2.2/28
135         vlan_create $swp1 555 "" 192.0.2.17/28
136
137         tunnel_create gt4 gretap 192.0.2.129 192.0.2.130 \
138                       ttl 100 tos inherit
139
140         ip link set dev $swp3 up
141         ip link set dev $swp4 up
142
143         ip link add name br1 type bridge vlan_filtering 1
144         ip link set dev br1 up
145         __addr_add_del br1 add 192.0.2.129/32
146         ip -4 route add 192.0.2.130/32 dev br1
147
148         team_create lag loadbalance $swp3 $swp4
149         ip link set dev lag master br1
150 }
151
152 switch_destroy()
153 {
154         ip link set dev lag nomaster
155         team_destroy lag
156
157         ip -4 route del 192.0.2.130/32 dev br1
158         __addr_add_del br1 del 192.0.2.129/32
159         ip link set dev br1 down
160         ip link del dev br1
161
162         ip link set dev $swp4 down
163         ip link set dev $swp3 down
164
165         tunnel_destroy gt4
166
167         vlan_destroy $swp1 555
168         vlan_destroy $swp1 333
169         tc qdisc del dev $swp1 clsact
170         ip link set dev $swp1 down
171 }
172
173 setup_prepare()
174 {
175         h1=${NETIFS[p1]}
176         swp1=${NETIFS[p2]}
177
178         swp3=${NETIFS[p3]}
179         h3=${NETIFS[p4]}
180
181         swp4=${NETIFS[p5]}
182         h4=${NETIFS[p6]}
183
184         vrf_prepare
185
186         ip link set dev $h1 up
187         h1_create
188         h2_create
189         h3_create
190         h4_create
191         switch_create
192
193         forwarding_enable
194
195         trap_install $h3 ingress
196         trap_install $h4 ingress
197 }
198
199 cleanup()
200 {
201         pre_cleanup
202
203         trap_uninstall $h4 ingress
204         trap_uninstall $h3 ingress
205
206         forwarding_restore
207
208         switch_destroy
209         h4_destroy
210         h3_destroy
211         h2_destroy
212         h1_destroy
213         ip link set dev $h1 down
214
215         vrf_cleanup
216 }
217
218 test_lag_slave()
219 {
220         local host_dev=$1; shift
221         local up_dev=$1; shift
222         local down_dev=$1; shift
223         local what=$1; shift
224
225         RET=0
226
227         tc filter add dev $swp1 ingress pref 999 \
228                 proto 802.1q flower vlan_ethtype arp $tcflags \
229                 action pass
230         mirror_install $swp1 ingress gt4 \
231                 "proto 802.1q flower vlan_id 333 $tcflags"
232
233         # Test connectivity through $up_dev when $down_dev is set down.
234         ip link set dev $down_dev down
235         ip neigh flush dev br1
236         setup_wait_dev $up_dev
237         setup_wait_dev $host_dev
238         $ARPING -I br1 192.0.2.130 -qfc 1
239         sleep 2
240         mirror_test vrf-h1 192.0.2.1 192.0.2.18 $host_dev 1 10
241
242         # Test lack of connectivity when both slaves are down.
243         ip link set dev $up_dev down
244         sleep 2
245         mirror_test vrf-h1 192.0.2.1 192.0.2.18 $h3 1 0
246         mirror_test vrf-h1 192.0.2.1 192.0.2.18 $h4 1 0
247
248         ip link set dev $up_dev up
249         ip link set dev $down_dev up
250         mirror_uninstall $swp1 ingress
251         tc filter del dev $swp1 ingress pref 999
252
253         log_test "$what ($tcflags)"
254 }
255
256 test_mirror_gretap_first()
257 {
258         test_lag_slave $h3 $swp3 $swp4 "mirror to gretap: LAG first slave"
259 }
260
261 test_mirror_gretap_second()
262 {
263         test_lag_slave $h4 $swp4 $swp3 "mirror to gretap: LAG second slave"
264 }
265
266 test_all()
267 {
268         slow_path_trap_install $swp1 ingress
269         slow_path_trap_install $swp1 egress
270
271         tests_run
272
273         slow_path_trap_uninstall $swp1 egress
274         slow_path_trap_uninstall $swp1 ingress
275 }
276
277 trap cleanup EXIT
278
279 setup_prepare
280 setup_wait
281
282 tcflags="skip_hw"
283 test_all
284
285 if ! tc_offload_check; then
286         echo "WARN: Could not test offloaded functionality"
287 else
288         tcflags="skip_sw"
289         test_all
290 fi
291
292 exit $EXIT_STATUS