selftests: forwarding: Add Q-in-VNI test
[linux-2.6-microblaze.git] / tools / testing / selftests / net / forwarding / q_in_vni.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3
4 # +-----------------------+                          +------------------------+
5 # | H1 (vrf)              |                          | H2 (vrf)               |
6 # |  + $h1.10             |                          |  + $h2.10              |
7 # |  | 192.0.2.1/28       |                          |  | 192.0.2.2/28        |
8 # |  |                    |                          |  |                     |
9 # |  | + $h1.20           |                          |  | + $h2.20            |
10 # |  \ | 198.51.100.1/24  |                          |  \ | 198.51.100.2/24   |
11 # |   \|                  |                          |   \|                   |
12 # |    + $h1              |                          |    + $h2               |
13 # +----|------------------+                          +----|-------------------+
14 #      |                                                  |
15 # +----|--------------------------------------------------|-------------------+
16 # | SW |                                                  |                   |
17 # | +--|--------------------------------------------------|-----------------+ |
18 # | |  + $swp1                   BR1 (802.1ad)            + $swp2           | |
19 # | |    vid 100 pvid untagged                              vid 100 pvid    | |
20 # | |                                                           untagged    | |
21 # | |  + vx100 (vxlan)                                                      | |
22 # | |    local 192.0.2.17                                                   | |
23 # | |    remote 192.0.2.34 192.0.2.50                                       | |
24 # | |    id 1000 dstport $VXPORT                                            | |
25 # | |    vid 100 pvid untagged                                              | |
26 # | +-----------------------------------------------------------------------+ |
27 # |                                                                           |
28 # |  192.0.2.32/28 via 192.0.2.18                                             |
29 # |  192.0.2.48/28 via 192.0.2.18                                             |
30 # |                                                                           |
31 # |    + $rp1                                                                 |
32 # |    | 192.0.2.17/28                                                        |
33 # +----|----------------------------------------------------------------------+
34 #      |
35 # +----|--------------------------------------------------------+
36 # |    |                                             VRP2 (vrf) |
37 # |    + $rp2                                                   |
38 # |      192.0.2.18/28                                          |
39 # |                                                             |   (maybe) HW
40 # =============================================================================
41 # |                                                             |  (likely) SW
42 # |    + v1 (veth)                             + v3 (veth)      |
43 # |    | 192.0.2.33/28                         | 192.0.2.49/28  |
44 # +----|---------------------------------------|----------------+
45 #      |                                       |
46 # +----|------------------------------+   +----|------------------------------+
47 # |    + v2 (veth)        NS1 (netns) |   |    + v4 (veth)        NS2 (netns) |
48 # |      192.0.2.34/28                |   |      192.0.2.50/28                |
49 # |                                   |   |                                   |
50 # |   192.0.2.16/28 via 192.0.2.33    |   |   192.0.2.16/28 via 192.0.2.49    |
51 # |   192.0.2.50/32 via 192.0.2.33    |   |   192.0.2.34/32 via 192.0.2.49    |
52 # |                                   |   |                                   |
53 # | +-------------------------------+ |   | +-------------------------------+ |
54 # | |                 BR2 (802.1ad) | |   | |                 BR2 (802.1ad) | |
55 # | |  + vx100 (vxlan)              | |   | |  + vx100 (vxlan)              | |
56 # | |    local 192.0.2.34           | |   | |    local 192.0.2.50           | |
57 # | |    remote 192.0.2.17          | |   | |    remote 192.0.2.17          | |
58 # | |    remote 192.0.2.50          | |   | |    remote 192.0.2.34          | |
59 # | |    id 1000 dstport $VXPORT    | |   | |    id 1000 dstport $VXPORT    | |
60 # | |    vid 100 pvid untagged      | |   | |    vid 100 pvid untagged      | |
61 # | |                               | |   | |                               | |
62 # | |  + w1 (veth)                  | |   | |  + w1 (veth)                  | |
63 # | |  | vid 100 pvid untagged      | |   | |  | vid 100 pvid untagged      | |
64 # | +--|----------------------------+ |   | +--|----------------------------+ |
65 # |    |                              |   |    |                              |
66 # | +--|----------------------------+ |   | +--|----------------------------+ |
67 # | |  |                  VW2 (vrf) | |   | |  |                  VW2 (vrf) | |
68 # | |  + w2 (veth)                  | |   | |  + w2 (veth)                  | |
69 # | |  |\                           | |   | |  |\                           | |
70 # | |  | + w2.10                    | |   | |  | + w2.10                    | |
71 # | |  |   192.0.2.3/28             | |   | |  |   192.0.2.4/28             | |
72 # | |  |                            | |   | |  |                            | |
73 # | |  + w2.20                      | |   | |  + w2.20                      | |
74 # | |    198.51.100.3/24            | |   | |    198.51.100.4/24            | |
75 # | +-------------------------------+ |   | +-------------------------------+ |
76 # +-----------------------------------+   +-----------------------------------+
77
78 : ${VXPORT:=4789}
79 export VXPORT
80
81 : ${ALL_TESTS:="
82         ping_ipv4
83     "}
84
85 NUM_NETIFS=6
86 source lib.sh
87
88 h1_create()
89 {
90         simple_if_init $h1
91         tc qdisc add dev $h1 clsact
92         vlan_create $h1 10 v$h1 192.0.2.1/28
93         vlan_create $h1 20 v$h1 198.51.100.1/24
94 }
95
96 h1_destroy()
97 {
98         vlan_destroy $h1 20
99         vlan_destroy $h1 10
100         tc qdisc del dev $h1 clsact
101         simple_if_fini $h1
102 }
103
104 h2_create()
105 {
106         simple_if_init $h2
107         tc qdisc add dev $h2 clsact
108         vlan_create $h2 10 v$h2 192.0.2.2/28
109         vlan_create $h2 20 v$h2 198.51.100.2/24
110 }
111
112 h2_destroy()
113 {
114         vlan_destroy $h2 20
115         vlan_destroy $h2 10
116         tc qdisc del dev $h2 clsact
117         simple_if_fini $h2
118 }
119
120 rp1_set_addr()
121 {
122         ip address add dev $rp1 192.0.2.17/28
123
124         ip route add 192.0.2.32/28 nexthop via 192.0.2.18
125         ip route add 192.0.2.48/28 nexthop via 192.0.2.18
126 }
127
128 rp1_unset_addr()
129 {
130         ip route del 192.0.2.48/28 nexthop via 192.0.2.18
131         ip route del 192.0.2.32/28 nexthop via 192.0.2.18
132
133         ip address del dev $rp1 192.0.2.17/28
134 }
135
136 switch_create()
137 {
138         ip link add name br1 type bridge vlan_filtering 1 vlan_protocol 802.1ad \
139                 vlan_default_pvid 0 mcast_snooping 0
140         # Make sure the bridge uses the MAC address of the local port and not
141         # that of the VxLAN's device.
142         ip link set dev br1 address $(mac_get $swp1)
143         ip link set dev br1 up
144
145         ip link set dev $rp1 up
146         rp1_set_addr
147
148         ip link add name vx100 type vxlan id 1000               \
149                 local 192.0.2.17 dstport "$VXPORT"      \
150                 nolearning noudpcsum tos inherit ttl 100
151         ip link set dev vx100 up
152
153         ip link set dev vx100 master br1
154         bridge vlan add vid 100 dev vx100 pvid untagged
155
156         ip link set dev $swp1 master br1
157         ip link set dev $swp1 up
158         bridge vlan add vid 100 dev $swp1 pvid untagged
159
160         ip link set dev $swp2 master br1
161         ip link set dev $swp2 up
162         bridge vlan add vid 100 dev $swp2 pvid untagged
163
164         bridge fdb append dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self
165         bridge fdb append dev vx100 00:00:00:00:00:00 dst 192.0.2.50 self
166 }
167
168 switch_destroy()
169 {
170         bridge fdb del dev vx100 00:00:00:00:00:00 dst 192.0.2.50 self
171         bridge fdb del dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self
172
173         bridge vlan del vid 100 dev $swp2
174         ip link set dev $swp2 down
175         ip link set dev $swp2 nomaster
176
177         bridge vlan del vid 100 dev $swp1
178         ip link set dev $swp1 down
179         ip link set dev $swp1 nomaster
180
181         ip link set dev vx100 nomaster
182         ip link set dev vx100 down
183         ip link del dev vx100
184
185         rp1_unset_addr
186         ip link set dev $rp1 down
187
188         ip link set dev br1 down
189         ip link del dev br1
190 }
191
192 vrp2_create()
193 {
194         simple_if_init $rp2 192.0.2.18/28
195         __simple_if_init v1 v$rp2 192.0.2.33/28
196         __simple_if_init v3 v$rp2 192.0.2.49/28
197         tc qdisc add dev v1 clsact
198 }
199
200 vrp2_destroy()
201 {
202         tc qdisc del dev v1 clsact
203         __simple_if_fini v3 192.0.2.49/28
204         __simple_if_fini v1 192.0.2.33/28
205         simple_if_fini $rp2 192.0.2.18/28
206 }
207
208 ns_init_common()
209 {
210         local in_if=$1; shift
211         local in_addr=$1; shift
212         local other_in_addr=$1; shift
213         local nh_addr=$1; shift
214         local host_addr1=$1; shift
215         local host_addr2=$1; shift
216
217         ip link set dev $in_if up
218         ip address add dev $in_if $in_addr/28
219         tc qdisc add dev $in_if clsact
220
221         ip link add name br2 type bridge vlan_filtering 1 vlan_protocol 802.1ad \
222                 vlan_default_pvid 0
223         ip link set dev br2 up
224
225         ip link add name w1 type veth peer name w2
226
227         ip link set dev w1 master br2
228         ip link set dev w1 up
229         bridge vlan add vid 100 dev w1 pvid untagged
230
231         ip link add name vx100 type vxlan id 1000 local $in_addr \
232                 dstport "$VXPORT"
233         ip link set dev vx100 up
234         bridge fdb append dev vx100 00:00:00:00:00:00 dst 192.0.2.17 self
235         bridge fdb append dev vx100 00:00:00:00:00:00 dst $other_in_addr self
236
237         ip link set dev vx100 master br2
238         tc qdisc add dev vx100 clsact
239
240         bridge vlan add vid 100 dev vx100 pvid untagged
241
242         simple_if_init w2
243         vlan_create w2 10 vw2 $host_addr1/28
244         vlan_create w2 20 vw2 $host_addr2/24
245
246         ip route add 192.0.2.16/28 nexthop via $nh_addr
247         ip route add $other_in_addr/32 nexthop via $nh_addr
248 }
249 export -f ns_init_common
250
251 ns1_create()
252 {
253         ip netns add ns1
254         ip link set dev v2 netns ns1
255         in_ns ns1 \
256               ns_init_common v2 192.0.2.34 192.0.2.50 192.0.2.33 \
257                              192.0.2.3 198.51.100.3
258 }
259
260 ns1_destroy()
261 {
262         ip netns exec ns1 ip link set dev v2 netns 1
263         ip netns del ns1
264 }
265
266 ns2_create()
267 {
268         ip netns add ns2
269         ip link set dev v4 netns ns2
270         in_ns ns2 \
271               ns_init_common v4 192.0.2.50 192.0.2.34 192.0.2.49 \
272                              192.0.2.4 198.51.100.4
273 }
274
275 ns2_destroy()
276 {
277         ip netns exec ns2 ip link set dev v4 netns 1
278         ip netns del ns2
279 }
280
281 setup_prepare()
282 {
283         h1=${NETIFS[p1]}
284         swp1=${NETIFS[p2]}
285
286         swp2=${NETIFS[p3]}
287         h2=${NETIFS[p4]}
288
289         rp1=${NETIFS[p5]}
290         rp2=${NETIFS[p6]}
291
292         vrf_prepare
293         forwarding_enable
294
295         h1_create
296         h2_create
297         switch_create
298
299         ip link add name v1 type veth peer name v2
300         ip link add name v3 type veth peer name v4
301         vrp2_create
302         ns1_create
303         ns2_create
304
305         r1_mac=$(in_ns ns1 mac_get w2)
306         r2_mac=$(in_ns ns2 mac_get w2)
307         h2_mac=$(mac_get $h2)
308 }
309
310 cleanup()
311 {
312         pre_cleanup
313
314         ns2_destroy
315         ns1_destroy
316         vrp2_destroy
317         ip link del dev v3
318         ip link del dev v1
319
320         switch_destroy
321         h2_destroy
322         h1_destroy
323
324         forwarding_restore
325         vrf_cleanup
326 }
327
328 ping_ipv4()
329 {
330         ping_test $h1 192.0.2.2 ": local->local"
331         ping_test $h1 192.0.2.3 ": local->remote 1"
332         ping_test $h1 192.0.2.4 ": local->remote 2"
333 }
334
335 test_all()
336 {
337         echo "Running tests with UDP port $VXPORT"
338         tests_run
339 }
340
341 trap cleanup EXIT
342
343 setup_prepare
344 setup_wait
345 test_all
346
347 exit $EXIT_STATUS