2 # SPDX-License-Identifier: GPL-2.0
4 # +-------------------------+
8 # | 2001:db8:1::2/64 | |
9 # +-------------------|-----+
11 # +-------------------|----------------------+
15 # | 2001:db8:1::1/64 |
18 # | | 169.254.2.12/24 | 169.254.3.13/24 |
19 # | | fe80:2::12/64 | fe80:3::13/64 |
20 # +--|--------------------|------------------+
22 # +--|--------------------|------------------+
24 # | 169.254.2.22/24 169.254.3.23/24 |
25 # | fe80:2::22/64 fe80:3::23/64 |
28 # | 198.51.100.1/24 | |
29 # | 2001:db8:2::1/64 | R2 |
30 # +-------------------|----------------------+
32 # +-------------------|-----+
36 # | 2001:db8:2::2/64 H2 |
37 # +-------------------------+
49 source router_mpath_nh_lib.sh
54 ip link
set dev
$h1 master vrf-h1
56 ip link
set dev vrf-h1 up
57 ip link
set dev
$h1 up
59 ip address add
192.0.2.2/24 dev
$h1
60 ip address add
2001:db8
:1::2/64 dev
$h1
62 ip route add
198.51.100.0/24 vrf vrf-h1 nexthop via
192.0.2.1
63 ip route add
2001:db8
:2::/64 vrf vrf-h1 nexthop via
2001:db8
:1::1
68 ip route del
2001:db8
:2::/64 vrf vrf-h1
69 ip route del
198.51.100.0/24 vrf vrf-h1
71 ip address del
2001:db8
:1::2/64 dev
$h1
72 ip address del
192.0.2.2/24 dev
$h1
74 ip link
set dev
$h1 down
81 ip link
set dev
$h2 master vrf-h2
83 ip link
set dev vrf-h2 up
84 ip link
set dev
$h2 up
86 ip address add
198.51.100.2/24 dev
$h2
87 ip address add
2001:db8
:2::2/64 dev
$h2
89 ip route add
192.0.2.0/24 vrf vrf-h2 nexthop via
198.51.100.1
90 ip route add
2001:db8
:1::/64 vrf vrf-h2 nexthop via
2001:db8
:2::1
95 ip route del
2001:db8
:1::/64 vrf vrf-h2
96 ip route del
192.0.2.0/24 vrf vrf-h2
98 ip address del
2001:db8
:2::2/64 dev
$h2
99 ip address del
198.51.100.2/24 dev
$h2
101 ip link
set dev
$h2 down
108 ip link
set dev
$rp11 master vrf-r1
109 ip link
set dev
$rp12 master vrf-r1
110 ip link
set dev
$rp13 master vrf-r1
112 ip link
set dev vrf-r1 up
113 ip link
set dev
$rp11 up
114 ip link
set dev
$rp12 up
115 ip link
set dev
$rp13 up
117 ip address add
192.0.2.1/24 dev
$rp11
118 ip address add
2001:db8
:1::1/64 dev
$rp11
120 ip address add
169.254.2.12/24 dev
$rp12
121 ip address add fe80
:2::12/64 dev
$rp12
123 ip address add
169.254.3.13/24 dev
$rp13
124 ip address add fe80
:3::13/64 dev
$rp13
129 ip route del
2001:db8
:2::/64 vrf vrf-r1
130 ip route del
198.51.100.0/24 vrf vrf-r1
132 ip address del fe80
:3::13/64 dev
$rp13
133 ip address del
169.254.3.13/24 dev
$rp13
135 ip address del fe80
:2::12/64 dev
$rp12
136 ip address del
169.254.2.12/24 dev
$rp12
138 ip address del
2001:db8
:1::1/64 dev
$rp11
139 ip address del
192.0.2.1/24 dev
$rp11
141 ip nexthop del id
103
142 ip nexthop del id
101
143 ip nexthop del id
102
144 ip nexthop del id
106
145 ip nexthop del id
104
146 ip nexthop del id
105
148 ip link
set dev
$rp13 down
149 ip link
set dev
$rp12 down
150 ip link
set dev
$rp11 down
158 ip link
set dev
$rp21 master vrf-r2
159 ip link
set dev
$rp22 master vrf-r2
160 ip link
set dev
$rp23 master vrf-r2
162 ip link
set dev vrf-r2 up
163 ip link
set dev
$rp21 up
164 ip link
set dev
$rp22 up
165 ip link
set dev
$rp23 up
167 ip address add
198.51.100.1/24 dev
$rp21
168 ip address add
2001:db8
:2::1/64 dev
$rp21
170 ip address add
169.254.2.22/24 dev
$rp22
171 ip address add fe80
:2::22/64 dev
$rp22
173 ip address add
169.254.3.23/24 dev
$rp23
174 ip address add fe80
:3::23/64 dev
$rp23
179 ip route del
2001:db8
:1::/64 vrf vrf-r2
180 ip route del
192.0.2.0/24 vrf vrf-r2
182 ip address del fe80
:3::23/64 dev
$rp23
183 ip address del
169.254.3.23/24 dev
$rp23
185 ip address del fe80
:2::22/64 dev
$rp22
186 ip address del
169.254.2.22/24 dev
$rp22
188 ip address del
2001:db8
:2::1/64 dev
$rp21
189 ip address del
198.51.100.1/24 dev
$rp21
191 ip nexthop del id
201
192 ip nexthop del id
202
193 ip nexthop del id
204
194 ip nexthop del id
205
196 ip link
set dev
$rp23 down
197 ip link
set dev
$rp22 down
198 ip link
set dev
$rp21 down
205 ip nexthop add id
101 via
169.254.2.22 dev
$rp12
206 ip nexthop add id
102 via
169.254.3.23 dev
$rp13
207 ip nexthop add id
103 group
101/102 type resilient buckets
512 \
209 ip route add
198.51.100.0/24 vrf vrf-r1 nhid
103
211 ip nexthop add id
104 via fe80
:2::22 dev
$rp12
212 ip nexthop add id
105 via fe80
:3::23 dev
$rp13
213 ip nexthop add id
106 group
104/105 type resilient buckets
512 \
215 ip route add
2001:db8
:2::/64 vrf vrf-r1 nhid
106
217 ip nexthop add id
201 via
169.254.2.12 dev
$rp22
218 ip nexthop add id
202 via
169.254.3.13 dev
$rp23
219 ip nexthop add id
203 group
201/202 type resilient buckets
512 \
221 ip route add
192.0.2.0/24 vrf vrf-r2 nhid
203
223 ip nexthop add id
204 via fe80
:2::12 dev
$rp22
224 ip nexthop add id
205 via fe80
:3::13 dev
$rp23
225 ip nexthop add id
206 group
204/205 type resilient buckets
512 \
227 ip route add
2001:db8
:1::/64 vrf vrf-r2 nhid
206
233 local weight_rp12
=$1; shift
234 local weight_rp13
=$1; shift
235 local ports
=${1-sp=1024,dp=0-32768}; shift
237 local t0_rp12 t0_rp13 t1_rp12 t1_rp13
238 local packets_rp12 packets_rp13
240 # Transmit multiple flows from h1 to h2 and make sure they are
241 # distributed between both multipath links (rp12 and rp13)
242 # according to the provided weights.
243 sysctl_set net.ipv4.fib_multipath_hash_policy
1
245 t0_rp12
=$
(link_stats_tx_packets_get
$rp12)
246 t0_rp13
=$
(link_stats_tx_packets_get
$rp13)
248 ip vrf
exec vrf-h1
$MZ $h1 -q -p 64 -A 192.0.2.2 -B 198.51.100.2 \
249 -d $MZ_DELAY -t udp
"$ports"
252 t1_rp12
=$
(link_stats_tx_packets_get
$rp12)
253 t1_rp13
=$
(link_stats_tx_packets_get
$rp13)
255 let "packets_rp12 = $t1_rp12 - $t0_rp12"
256 let "packets_rp13 = $t1_rp13 - $t0_rp13"
257 multipath_eval
"$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
260 sysctl_restore net.ipv4.fib_multipath_hash_policy
266 local weight_rp12
=$1; shift
267 local weight_rp13
=$1; shift
268 local ports
=${1-sp=1024,dp=0-32768}; shift
270 local t0_rp12 t0_rp13 t1_rp12 t1_rp13
271 local packets_rp12 packets_rp13
273 # Transmit multiple flows from h1 to h2 and make sure they are
274 # distributed between both multipath links (rp12 and rp13)
275 # according to the provided weights.
276 sysctl_set net.ipv6.fib_multipath_hash_policy
1
278 t0_rp12
=$
(link_stats_tx_packets_get
$rp12)
279 t0_rp13
=$
(link_stats_tx_packets_get
$rp13)
281 $MZ $h1 -6 -q -p 64 -A 2001:db8
:1::2 -B 2001:db8
:2::2 \
282 -d $MZ_DELAY -t udp
"$ports"
285 t1_rp12
=$
(link_stats_tx_packets_get
$rp12)
286 t1_rp13
=$
(link_stats_tx_packets_get
$rp13)
288 let "packets_rp12 = $t1_rp12 - $t0_rp12"
289 let "packets_rp13 = $t1_rp13 - $t0_rp13"
290 multipath_eval
"$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13
292 sysctl_restore net.ipv6.fib_multipath_hash_policy
297 # Without an idle timer, weight replacement should happen immediately.
298 log_info
"Running multipath tests without an idle timer"
299 ip nexthop replace id
103 group
101/102 type resilient idle_timer
0
300 ip nexthop replace id
106 group
104/105 type resilient idle_timer
0
302 log_info
"Running IPv4 multipath tests"
303 ip nexthop replace id
103 group
101,1/102,1 type resilient
304 multipath4_test
"ECMP" 1 1
305 ip nexthop replace id
103 group
101,2/102,1 type resilient
306 multipath4_test
"Weighted MP 2:1" 2 1
307 ip nexthop replace id
103 group
101,11/102,45 type resilient
308 multipath4_test
"Weighted MP 11:45" 11 45
310 ip nexthop replace id
103 group
101,1/102,1 type resilient
312 log_info
"Running IPv6 L4 hash multipath tests"
313 ip nexthop replace id
106 group
104,1/105,1 type resilient
314 multipath6_l4_test
"ECMP" 1 1
315 ip nexthop replace id
106 group
104,2/105,1 type resilient
316 multipath6_l4_test
"Weighted MP 2:1" 2 1
317 ip nexthop replace id
106 group
104,11/105,45 type resilient
318 multipath6_l4_test
"Weighted MP 11:45" 11 45
320 ip nexthop replace id
106 group
104,1/105,1 type resilient
322 # With an idle timer, weight replacement should not happen, so the
323 # expected ratio should always be the initial one (1:1).
324 log_info
"Running multipath tests with an idle timer of 120 seconds"
325 ip nexthop replace id
103 group
101/102 type resilient idle_timer
120
326 ip nexthop replace id
106 group
104/105 type resilient idle_timer
120
328 log_info
"Running IPv4 multipath tests"
329 ip nexthop replace id
103 group
101,1/102,1 type resilient
330 multipath4_test
"ECMP" 1 1
331 ip nexthop replace id
103 group
101,2/102,1 type resilient
332 multipath4_test
"Weighted MP 2:1" 1 1
333 ip nexthop replace id
103 group
101,11/102,45 type resilient
334 multipath4_test
"Weighted MP 11:45" 1 1
336 ip nexthop replace id
103 group
101,1/102,1 type resilient
338 log_info
"Running IPv6 L4 hash multipath tests"
339 ip nexthop replace id
106 group
104,1/105,1 type resilient
340 multipath6_l4_test
"ECMP" 1 1
341 ip nexthop replace id
106 group
104,2/105,1 type resilient
342 multipath6_l4_test
"Weighted MP 2:1" 1 1
343 ip nexthop replace id
106 group
104,11/105,45 type resilient
344 multipath6_l4_test
"Weighted MP 11:45" 1 1
346 ip nexthop replace id
106 group
104,1/105,1 type resilient
348 # With a short idle timer and enough idle time, weight replacement
350 log_info
"Running multipath tests with an idle timer of 5 seconds"
351 ip nexthop replace id
103 group
101/102 type resilient idle_timer
5
352 ip nexthop replace id
106 group
104/105 type resilient idle_timer
5
354 log_info
"Running IPv4 multipath tests"
356 ip nexthop replace id
103 group
101,1/102,1 type resilient
357 multipath4_test
"ECMP" 1 1
359 ip nexthop replace id
103 group
101,2/102,1 type resilient
360 multipath4_test
"Weighted MP 2:1" 2 1
362 ip nexthop replace id
103 group
101,11/102,45 type resilient
363 multipath4_test
"Weighted MP 11:45" 11 45
365 ip nexthop replace id
103 group
101,1/102,1 type resilient
367 log_info
"Running IPv6 L4 hash multipath tests"
369 ip nexthop replace id
106 group
104,1/105,1 type resilient
370 multipath6_l4_test
"ECMP" 1 1
372 ip nexthop replace id
106 group
104,2/105,1 type resilient
373 multipath6_l4_test
"Weighted MP 2:1" 2 1
375 ip nexthop replace id
106 group
104,11/105,45 type resilient
376 multipath6_l4_test
"Weighted MP 11:45" 11 45
378 ip nexthop replace id
106 group
104,1/105,1 type resilient
383 check_nhgw16
104 ||
return
385 log_info
"Running 16-bit IPv4 multipath tests"
386 ip nexthop replace id
103 group
101/102 type resilient idle_timer
0
388 ip nexthop replace id
103 group
101,65535/102,65535 type resilient
389 multipath4_test
"65535:65535" 65535 65535
391 ip nexthop replace id
103 group
101,128/102,512 type resilient
392 multipath4_test
"128:512" 128 512
394 ip nexthop replace id
103 group
101,255/102,65535 type resilient
396 multipath4_test
"255:65535" 255 65535 sp
=1024-1026,dp
=0-65535
398 ip nexthop replace id
103 group
101,1/102,1 type resilient
400 log_info
"Running 16-bit IPv6 L4 hash multipath tests"
401 ip nexthop replace id
106 group
104/105 type resilient idle_timer
0
403 ip nexthop replace id
106 group
104,65535/105,65535 type resilient
404 multipath6_l4_test
"65535:65535" 65535 65535
406 ip nexthop replace id
106 group
104,128/105,512 type resilient
407 multipath6_l4_test
"128:512" 128 512
409 ip nexthop replace id
106 group
104,255/105,65535 type resilient
411 multipath6_l4_test
"255:65535" 255 65535 sp
=1024-1026,dp
=0-65535
413 ip nexthop replace id
106 group
104,1/105,1 type resilient
418 __nh_stats_test_v4 resilient
423 __nh_stats_test_v6 resilient
468 ping_test
$h1 198.51.100.2
473 ping6_test
$h1 2001:db8
:2::2
476 ip nexthop
ls >/dev
/null
2>&1
477 if [ $?
-ne 0 ]; then
478 echo "Nexthop objects not supported; skipping tests"