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# Test routing after VXLAN decapsulation and verify that the order of
5# configuration does not impact switch behavior. Verify that RIF is added
6# correctly for existing mapping and that new mapping uses the correct RIF.
7
8# +---------------------------+
9# | H1 |
10# | + $h1 |
11# | | 192.0.2.1/28 |
12# +----|----------------------+
13# |
14# +----|----------------------------------------------------------------------+
15# | SW | |
16# | +--|--------------------------------------------------------------------+ |
17# | | + $swp1 br1 | |
18# | | vid 10 pvid untagged | |
19# | | | |
20# | | | |
21# | | + vx4001 | |
22# | | local 192.0.2.17 | |
23# | | remote 192.0.2.18 | |
24# | | id 104001 | |
25# | | dstport $VXPORT | |
26# | | vid 4001 pvid untagged | |
27# | | | |
28# | +----------------------------------+------------------------------------+ |
29# | | |
30# | +----------------------------------|------------------------------------+ |
31# | | | | |
32# | | +-------------------------------+---------------------------------+ | |
33# | | | | | |
34# | | + vlan10 vlan4001 + | |
35# | | 192.0.2.2/28 | |
36# | | | |
37# | | vrf-green | |
38# | +-----------------------------------------------------------------------+ |
39# | |
40# | + $rp1 +lo |
41# | | 198.51.100.1/24 192.0.2.17/32 |
42# +----|----------------------------------------------------------------------+
43# |
44# +----|--------------------------------------------------------+
45# | | v$rp2 |
46# | + $rp2 |
47# | 198.51.100.2/24 |
48# | |
49# +-------------------------------------------------------------+
50
51lib_dir=$(dirname $0)/../../../net/forwarding
52
53ALL_TESTS="
54 vni_fid_map_rif
55 rif_vni_fid_map
56"
57
58NUM_NETIFS=4
59source $lib_dir/lib.sh
60source $lib_dir/tc_common.sh
61source $lib_dir/devlink_lib.sh
62
63: ${VXPORT:=4789}
64export VXPORT
65
66h1_create()
67{
68 simple_if_init $h1 192.0.2.1/28
69}
70
71h1_destroy()
72{
73 simple_if_fini $h1 192.0.2.1/28
74}
75
76switch_create()
77{
78 ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \
79 mcast_snooping 0
80 # Make sure the bridge uses the MAC address of the local port and not
81 # that of the VxLAN's device.
82 ip link set dev br1 address $(mac_get $swp1)
83 ip link set dev br1 up
84
85 ip link set dev $rp1 up
86 ip address add dev $rp1 198.51.100.1/24
87
88 ip link set dev $swp1 master br1
89 ip link set dev $swp1 up
90 bridge vlan add vid 10 dev $swp1 pvid untagged
91
92 tc qdisc add dev $swp1 clsact
93
94 ip link add name vx4001 type vxlan id 104001 \
95 local 192.0.2.17 dstport $VXPORT \
96 nolearning noudpcsum tos inherit ttl 100
97 ip link set dev vx4001 up
98
99 ip link set dev vx4001 master br1
100
101 ip address add 192.0.2.17/32 dev lo
102
103 # Create SVIs.
104 vrf_create "vrf-green"
105 ip link set dev vrf-green up
106
107 ip link add link br1 name vlan10 up master vrf-green type vlan id 10
108
109 # Replace neighbor to avoid 1 packet which is forwarded in software due
110 # to "unresolved neigh".
111 ip neigh replace dev vlan10 192.0.2.1 lladdr $(mac_get $h1)
112
113 ip address add 192.0.2.2/28 dev vlan10
114
115 bridge vlan add vid 10 dev br1 self
116 bridge vlan add vid 4001 dev br1 self
117
118 sysctl_set net.ipv4.conf.all.rp_filter 0
119}
120
121switch_destroy()
122{
123 sysctl_restore net.ipv4.conf.all.rp_filter
124
125 bridge vlan del vid 4001 dev br1 self
126 bridge vlan del vid 10 dev br1 self
127
128 ip link del dev vlan10
129
130 vrf_destroy "vrf-green"
131
132 ip address del 192.0.2.17/32 dev lo
133
134 tc qdisc del dev $swp1 clsact
135
136 bridge vlan del vid 10 dev $swp1
137 ip link set dev $swp1 down
138 ip link set dev $swp1 nomaster
139
140 ip link set dev vx4001 nomaster
141
142 ip link set dev vx4001 down
143 ip link del dev vx4001
144
145 ip address del dev $rp1 198.51.100.1/24
146 ip link set dev $rp1 down
147
148 ip link set dev br1 down
149 ip link del dev br1
150}
151
152vrp2_create()
153{
154 simple_if_init $rp2 198.51.100.2/24
155
156 ip route add 192.0.2.17/32 vrf v$rp2 nexthop via 198.51.100.1
157}
158
159vrp2_destroy()
160{
161 ip route del 192.0.2.17/32 vrf v$rp2 nexthop via 198.51.100.1
162
163 simple_if_fini $rp2 198.51.100.2/24
164}
165
166setup_prepare()
167{
168 h1=${NETIFS[p1]}
169 swp1=${NETIFS[p2]}
170
171 rp1=${NETIFS[p3]}
172 rp2=${NETIFS[p4]}
173
174 vrf_prepare
175 forwarding_enable
176
177 h1_create
178 switch_create
179
180 vrp2_create
181}
182
183cleanup()
184{
185 pre_cleanup
186
187 vrp2_destroy
188
189 switch_destroy
190 h1_destroy
191
192 forwarding_restore
193 vrf_cleanup
194}
195
196payload_get()
197{
198 local dest_mac=$(mac_get vlan4001)
199 local src_mac=$(mac_get $rp1)
200
201 p=$(:
202 )"08:"$( : VXLAN flags
203 )"00:00:00:"$( : VXLAN reserved
204 )"01:96:41:"$( : VXLAN VNI : 104001
205 )"00:"$( : VXLAN reserved
206 )"$dest_mac:"$( : ETH daddr
207 )"$src_mac:"$( : ETH saddr
208 )"08:00:"$( : ETH type
209 )"45:"$( : IP version + IHL
210 )"00:"$( : IP TOS
211 )"00:54:"$( : IP total length
212 )"3f:49:"$( : IP identification
213 )"00:00:"$( : IP flags + frag off
214 )"3f:"$( : IP TTL
215 )"01:"$( : IP proto
216 )"50:21:"$( : IP header csum
217 )"c6:33:64:0a:"$( : IP saddr: 198.51.100.10
218 )"c0:00:02:01:"$( : IP daddr: 192.0.2.1
219 )
220 echo $p
221}
222
223vlan_rif_add()
224{
225 rifs_occ_t0=$(devlink_resource_occ_get rifs)
226
227 ip link add link br1 name vlan4001 up master vrf-green \
228 type vlan id 4001
229
230 rifs_occ_t1=$(devlink_resource_occ_get rifs)
231 expected_rifs=$((rifs_occ_t0 + 1))
232
233 [[ $expected_rifs -eq $rifs_occ_t1 ]]
234 check_err $? "Expected $expected_rifs RIFs, $rifs_occ_t1 are used"
235}
236
237vlan_rif_del()
238{
239 ip link del dev vlan4001
240}
241
242vni_fid_map_rif()
243{
244 local rp1_mac=$(mac_get $rp1)
245
246 RET=0
247
248 # First add VNI->FID mapping to the FID of VLAN 4001
249 bridge vlan add vid 4001 dev vx4001 pvid untagged
250
251 # Add a RIF to the FID with VNI->FID mapping
252 vlan_rif_add
253
254 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
255 flower skip_sw dst_ip 192.0.2.1 action pass
256
257 payload=$(payload_get)
258 ip vrf exec v$rp2 $MZ $rp2 -c 10 -d 1msec -b $rp1_mac \
259 -B 192.0.2.17 -A 192.0.2.18 \
260 -t udp sp=12345,dp=$VXPORT,p=$payload -q
261
262 tc_check_at_least_x_packets "dev $swp1 egress" 101 10
263 check_err $? "Packets were not routed in hardware"
264
265 log_test "Add RIF for existing VNI->FID mapping"
266
267 tc filter del dev $swp1 egress
268
269 bridge vlan del vid 4001 dev vx4001 pvid untagged
270 vlan_rif_del
271}
272
273rif_vni_fid_map()
274{
275 local rp1_mac=$(mac_get $rp1)
276
277 RET=0
278
279 # First add a RIF to the FID of VLAN 4001
280 vlan_rif_add
281
282 # Add VNI->FID mapping to FID with a RIF
283 bridge vlan add vid 4001 dev vx4001 pvid untagged
284
285 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
286 flower skip_sw dst_ip 192.0.2.1 action pass
287
288 payload=$(payload_get)
289 ip vrf exec v$rp2 $MZ $rp2 -c 10 -d 1msec -b $rp1_mac \
290 -B 192.0.2.17 -A 192.0.2.18 \
291 -t udp sp=12345,dp=$VXPORT,p=$payload -q
292
293 tc_check_at_least_x_packets "dev $swp1 egress" 101 10
294 check_err $? "Packets were not routed in hardware"
295
296 log_test "Add VNI->FID mapping for FID with a RIF"
297
298 tc filter del dev $swp1 egress
299
300 bridge vlan del vid 4001 dev vx4001 pvid untagged
301 vlan_rif_del
302}
303
304trap cleanup EXIT
305
306setup_prepare
307setup_wait
308
309tests_run
310
311exit $EXIT_STATUS