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