Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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}
79export VXPORT
80
81: ${ALL_TESTS:="
82 ping_ipv4
83 "}
84
85NUM_NETIFS=6
86source lib.sh
87
88h1_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
96h1_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
104h2_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
112h2_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
120rp1_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
128rp1_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
136switch_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
168switch_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
192vrp2_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
200vrp2_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
208ns_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}
249export -f ns_init_common
250
251ns1_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
260ns1_destroy()
261{
262 ip netns exec ns1 ip link set dev v2 netns 1
263 ip netns del ns1
264}
265
266ns2_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
275ns2_destroy()
276{
277 ip netns exec ns2 ip link set dev v4 netns 1
278 ip netns del ns2
279}
280
281setup_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
310cleanup()
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
328ping_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
335test_all()
336{
337 echo "Running tests with UDP port $VXPORT"
338 tests_run
339}
340
341trap cleanup EXIT
342
343setup_prepare
344setup_wait
345test_all
346
347exit $EXIT_STATUS