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
4ALL_TESTS="
5 ping_ipv4
6 ping_ipv6
7 multipath_test
8 ping_ipv4_blackhole
9 ping_ipv6_blackhole
10"
11NUM_NETIFS=8
12source lib.sh
13
14h1_create()
15{
16 vrf_create "vrf-h1"
17 ip link set dev $h1 master vrf-h1
18
19 ip link set dev vrf-h1 up
20 ip link set dev $h1 up
21
22 ip address add 192.0.2.2/24 dev $h1
23 ip address add 2001:db8:1::2/64 dev $h1
24
25 ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.1
26 ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::1
27}
28
29h1_destroy()
30{
31 ip route del 2001:db8:2::/64 vrf vrf-h1
32 ip route del 198.51.100.0/24 vrf vrf-h1
33
34 ip address del 2001:db8:1::2/64 dev $h1
35 ip address del 192.0.2.2/24 dev $h1
36
37 ip link set dev $h1 down
38 vrf_destroy "vrf-h1"
39}
40
41h2_create()
42{
43 vrf_create "vrf-h2"
44 ip link set dev $h2 master vrf-h2
45
46 ip link set dev vrf-h2 up
47 ip link set dev $h2 up
48
49 ip address add 198.51.100.2/24 dev $h2
50 ip address add 2001:db8:2::2/64 dev $h2
51
52 ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.1
53 ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::1
54}
55
56h2_destroy()
57{
58 ip route del 2001:db8:1::/64 vrf vrf-h2
59 ip route del 192.0.2.0/24 vrf vrf-h2
60
61 ip address del 2001:db8:2::2/64 dev $h2
62 ip address del 198.51.100.2/24 dev $h2
63
64 ip link set dev $h2 down
65 vrf_destroy "vrf-h2"
66}
67
68router1_create()
69{
70 vrf_create "vrf-r1"
71 ip link set dev $rp11 master vrf-r1
72 ip link set dev $rp12 master vrf-r1
73 ip link set dev $rp13 master vrf-r1
74
75 ip link set dev vrf-r1 up
76 ip link set dev $rp11 up
77 ip link set dev $rp12 up
78 ip link set dev $rp13 up
79
80 ip address add 192.0.2.1/24 dev $rp11
81 ip address add 2001:db8:1::1/64 dev $rp11
82
83 ip address add 169.254.2.12/24 dev $rp12
84 ip address add fe80:2::12/64 dev $rp12
85
86 ip address add 169.254.3.13/24 dev $rp13
87 ip address add fe80:3::13/64 dev $rp13
88}
89
90router1_destroy()
91{
92 ip route del 2001:db8:2::/64 vrf vrf-r1
93 ip route del 198.51.100.0/24 vrf vrf-r1
94
95 ip address del fe80:3::13/64 dev $rp13
96 ip address del 169.254.3.13/24 dev $rp13
97
98 ip address del fe80:2::12/64 dev $rp12
99 ip address del 169.254.2.12/24 dev $rp12
100
101 ip address del 2001:db8:1::1/64 dev $rp11
102 ip address del 192.0.2.1/24 dev $rp11
103
104 ip nexthop del id 103
105 ip nexthop del id 101
106 ip nexthop del id 102
107 ip nexthop del id 106
108 ip nexthop del id 104
109 ip nexthop del id 105
110
111 ip link set dev $rp13 down
112 ip link set dev $rp12 down
113 ip link set dev $rp11 down
114
115 vrf_destroy "vrf-r1"
116}
117
118router2_create()
119{
120 vrf_create "vrf-r2"
121 ip link set dev $rp21 master vrf-r2
122 ip link set dev $rp22 master vrf-r2
123 ip link set dev $rp23 master vrf-r2
124
125 ip link set dev vrf-r2 up
126 ip link set dev $rp21 up
127 ip link set dev $rp22 up
128 ip link set dev $rp23 up
129
130 ip address add 198.51.100.1/24 dev $rp21
131 ip address add 2001:db8:2::1/64 dev $rp21
132
133 ip address add 169.254.2.22/24 dev $rp22
134 ip address add fe80:2::22/64 dev $rp22
135
136 ip address add 169.254.3.23/24 dev $rp23
137 ip address add fe80:3::23/64 dev $rp23
138}
139
140router2_destroy()
141{
142 ip route del 2001:db8:1::/64 vrf vrf-r2
143 ip route del 192.0.2.0/24 vrf vrf-r2
144
145 ip address del fe80:3::23/64 dev $rp23
146 ip address del 169.254.3.23/24 dev $rp23
147
148 ip address del fe80:2::22/64 dev $rp22
149 ip address del 169.254.2.22/24 dev $rp22
150
151 ip address del 2001:db8:2::1/64 dev $rp21
152 ip address del 198.51.100.1/24 dev $rp21
153
154 ip nexthop del id 201
155 ip nexthop del id 202
156 ip nexthop del id 204
157 ip nexthop del id 205
158
159 ip link set dev $rp23 down
160 ip link set dev $rp22 down
161 ip link set dev $rp21 down
162
163 vrf_destroy "vrf-r2"
164}
165
166routing_nh_obj()
167{
168 ip nexthop add id 101 via 169.254.2.22 dev $rp12
169 ip nexthop add id 102 via 169.254.3.23 dev $rp13
170 ip nexthop add id 103 group 101/102
171 ip route add 198.51.100.0/24 vrf vrf-r1 nhid 103
172
173 ip nexthop add id 104 via fe80:2::22 dev $rp12
174 ip nexthop add id 105 via fe80:3::23 dev $rp13
175 ip nexthop add id 106 group 104/105
176 ip route add 2001:db8:2::/64 vrf vrf-r1 nhid 106
177
178 ip nexthop add id 201 via 169.254.2.12 dev $rp22
179 ip nexthop add id 202 via 169.254.3.13 dev $rp23
180 ip nexthop add id 203 group 201/202
181 ip route add 192.0.2.0/24 vrf vrf-r2 nhid 203
182
183 ip nexthop add id 204 via fe80:2::12 dev $rp22
184 ip nexthop add id 205 via fe80:3::13 dev $rp23
185 ip nexthop add id 206 group 204/205
186 ip route add 2001:db8:1::/64 vrf vrf-r2 nhid 206
187}
188
189multipath4_test()
190{
191 local desc="$1"
192 local weight_rp12=$2
193 local weight_rp13=$3
194 local t0_rp12 t0_rp13 t1_rp12 t1_rp13
195 local packets_rp12 packets_rp13
196
197 # Transmit multiple flows from h1 to h2 and make sure they are
198 # distributed between both multipath links (rp12 and rp13)
199 # according to the configured weights.
200 sysctl_set net.ipv4.fib_multipath_hash_policy 1
201 ip nexthop replace id 103 group 101,$weight_rp12/102,$weight_rp13
202
203 t0_rp12=$(link_stats_tx_packets_get $rp12)
204 t0_rp13=$(link_stats_tx_packets_get $rp13)
205
206 ip vrf exec vrf-h1 $MZ $h1 -q -p 64 -A 192.0.2.2 -B 198.51.100.2 \
207 -d 1msec -t udp "sp=1024,dp=0-32768"
208
209 t1_rp12=$(link_stats_tx_packets_get $rp12)
210 t1_rp13=$(link_stats_tx_packets_get $rp13)
211
212 let "packets_rp12 = $t1_rp12 - $t0_rp12"
213 let "packets_rp13 = $t1_rp13 - $t0_rp13"
214 multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
215
216 # Restore settings.
217 ip nexthop replace id 103 group 101/102
218 sysctl_restore net.ipv4.fib_multipath_hash_policy
219}
220
221multipath6_l4_test()
222{
223 local desc="$1"
224 local weight_rp12=$2
225 local weight_rp13=$3
226 local t0_rp12 t0_rp13 t1_rp12 t1_rp13
227 local packets_rp12 packets_rp13
228
229 # Transmit multiple flows from h1 to h2 and make sure they are
230 # distributed between both multipath links (rp12 and rp13)
231 # according to the configured weights.
232 sysctl_set net.ipv6.fib_multipath_hash_policy 1
233
234 ip nexthop replace id 106 group 104,$weight_rp12/105,$weight_rp13
235
236 t0_rp12=$(link_stats_tx_packets_get $rp12)
237 t0_rp13=$(link_stats_tx_packets_get $rp13)
238
239 $MZ $h1 -6 -q -p 64 -A 2001:db8:1::2 -B 2001:db8:2::2 \
240 -d 1msec -t udp "sp=1024,dp=0-32768"
241
242 t1_rp12=$(link_stats_tx_packets_get $rp12)
243 t1_rp13=$(link_stats_tx_packets_get $rp13)
244
245 let "packets_rp12 = $t1_rp12 - $t0_rp12"
246 let "packets_rp13 = $t1_rp13 - $t0_rp13"
247 multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
248
249 ip nexthop replace id 106 group 104/105
250
251 sysctl_restore net.ipv6.fib_multipath_hash_policy
252}
253
254multipath6_test()
255{
256 local desc="$1"
257 local weight_rp12=$2
258 local weight_rp13=$3
259 local t0_rp12 t0_rp13 t1_rp12 t1_rp13
260 local packets_rp12 packets_rp13
261
262 ip nexthop replace id 106 group 104,$weight_rp12/105,$weight_rp13
263
264 t0_rp12=$(link_stats_tx_packets_get $rp12)
265 t0_rp13=$(link_stats_tx_packets_get $rp13)
266
267 # Generate 16384 echo requests, each with a random flow label.
268 for _ in $(seq 1 16384); do
269 ip vrf exec vrf-h1 $PING6 2001:db8:2::2 -F 0 -c 1 -q >/dev/null 2>&1
270 done
271
272 t1_rp12=$(link_stats_tx_packets_get $rp12)
273 t1_rp13=$(link_stats_tx_packets_get $rp13)
274
275 let "packets_rp12 = $t1_rp12 - $t0_rp12"
276 let "packets_rp13 = $t1_rp13 - $t0_rp13"
277 multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
278
279 ip nexthop replace id 106 group 104/105
280}
281
282multipath_test()
283{
284 log_info "Running IPv4 multipath tests"
285 multipath4_test "ECMP" 1 1
286 multipath4_test "Weighted MP 2:1" 2 1
287 multipath4_test "Weighted MP 11:45" 11 45
288
289 log_info "Running IPv4 multipath tests with IPv6 link-local nexthops"
290 ip nexthop replace id 101 via fe80:2::22 dev $rp12
291 ip nexthop replace id 102 via fe80:3::23 dev $rp13
292
293 multipath4_test "ECMP" 1 1
294 multipath4_test "Weighted MP 2:1" 2 1
295 multipath4_test "Weighted MP 11:45" 11 45
296
297 ip nexthop replace id 102 via 169.254.3.23 dev $rp13
298 ip nexthop replace id 101 via 169.254.2.22 dev $rp12
299
300 log_info "Running IPv6 multipath tests"
301 multipath6_test "ECMP" 1 1
302 multipath6_test "Weighted MP 2:1" 2 1
303 multipath6_test "Weighted MP 11:45" 11 45
304
305 log_info "Running IPv6 L4 hash multipath tests"
306 multipath6_l4_test "ECMP" 1 1
307 multipath6_l4_test "Weighted MP 2:1" 2 1
308 multipath6_l4_test "Weighted MP 11:45" 11 45
309}
310
311ping_ipv4_blackhole()
312{
313 RET=0
314
315 ip nexthop add id 1001 blackhole
316 ip nexthop add id 1002 group 1001
317
318 ip route replace 198.51.100.0/24 vrf vrf-r1 nhid 1001
319 ping_do $h1 198.51.100.2
320 check_fail $? "ping did not fail when using a blackhole nexthop"
321
322 ip route replace 198.51.100.0/24 vrf vrf-r1 nhid 1002
323 ping_do $h1 198.51.100.2
324 check_fail $? "ping did not fail when using a blackhole nexthop group"
325
326 ip route replace 198.51.100.0/24 vrf vrf-r1 nhid 103
327 ping_do $h1 198.51.100.2
328 check_err $? "ping failed with a valid nexthop"
329
330 log_test "IPv4 blackhole ping"
331
332 ip nexthop del id 1002
333 ip nexthop del id 1001
334}
335
336ping_ipv6_blackhole()
337{
338 RET=0
339
340 ip -6 nexthop add id 1001 blackhole
341 ip nexthop add id 1002 group 1001
342
343 ip route replace 2001:db8:2::/64 vrf vrf-r1 nhid 1001
344 ping6_do $h1 2001:db8:2::2
345 check_fail $? "ping did not fail when using a blackhole nexthop"
346
347 ip route replace 2001:db8:2::/64 vrf vrf-r1 nhid 1002
348 ping6_do $h1 2001:db8:2::2
349 check_fail $? "ping did not fail when using a blackhole nexthop group"
350
351 ip route replace 2001:db8:2::/64 vrf vrf-r1 nhid 106
352 ping6_do $h1 2001:db8:2::2
353 check_err $? "ping failed with a valid nexthop"
354
355 log_test "IPv6 blackhole ping"
356
357 ip nexthop del id 1002
358 ip -6 nexthop del id 1001
359}
360
361setup_prepare()
362{
363 h1=${NETIFS[p1]}
364 rp11=${NETIFS[p2]}
365
366 rp12=${NETIFS[p3]}
367 rp22=${NETIFS[p4]}
368
369 rp13=${NETIFS[p5]}
370 rp23=${NETIFS[p6]}
371
372 rp21=${NETIFS[p7]}
373 h2=${NETIFS[p8]}
374
375 vrf_prepare
376
377 h1_create
378 h2_create
379
380 router1_create
381 router2_create
382
383 forwarding_enable
384}
385
386cleanup()
387{
388 pre_cleanup
389
390 forwarding_restore
391
392 router2_destroy
393 router1_destroy
394
395 h2_destroy
396 h1_destroy
397
398 vrf_cleanup
399}
400
401ping_ipv4()
402{
403 ping_test $h1 198.51.100.2
404}
405
406ping_ipv6()
407{
408 ping6_test $h1 2001:db8:2::2
409}
410
411ip nexthop ls >/dev/null 2>&1
412if [ $? -ne 0 ]; then
413 echo "Nexthop objects not supported; skipping tests"
414 exit 0
415fi
416
417trap cleanup EXIT
418
419setup_prepare
420setup_wait
421routing_nh_obj
422
423tests_run
424
425exit $EXIT_STATUS