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# This test is for checking the nexthop offload API. It makes use of netdevsim
5# which registers a listener to the nexthop notification chain.
6
7lib_dir=$(dirname $0)/../../../net/forwarding
8
9ALL_TESTS="
10 nexthop_single_add_test
11 nexthop_single_add_err_test
12 nexthop_group_add_test
13 nexthop_group_add_err_test
14 nexthop_res_group_add_test
15 nexthop_res_group_add_err_test
16 nexthop_group_replace_test
17 nexthop_group_replace_err_test
18 nexthop_res_group_replace_test
19 nexthop_res_group_replace_err_test
20 nexthop_res_group_idle_timer_test
21 nexthop_res_group_idle_timer_del_test
22 nexthop_res_group_increase_idle_timer_test
23 nexthop_res_group_decrease_idle_timer_test
24 nexthop_res_group_unbalanced_timer_test
25 nexthop_res_group_unbalanced_timer_del_test
26 nexthop_res_group_no_unbalanced_timer_test
27 nexthop_res_group_short_unbalanced_timer_test
28 nexthop_res_group_increase_unbalanced_timer_test
29 nexthop_res_group_decrease_unbalanced_timer_test
30 nexthop_res_group_force_migrate_busy_test
31 nexthop_single_replace_test
32 nexthop_single_replace_err_test
33 nexthop_single_in_group_replace_test
34 nexthop_single_in_group_replace_err_test
35 nexthop_single_in_res_group_replace_test
36 nexthop_single_in_res_group_replace_err_test
37 nexthop_single_in_group_delete_test
38 nexthop_single_in_group_delete_err_test
39 nexthop_single_in_res_group_delete_test
40 nexthop_single_in_res_group_delete_err_test
41 nexthop_replay_test
42 nexthop_replay_err_test
43"
44NETDEVSIM_PATH=/sys/bus/netdevsim/
45DEV_ADDR=1337
46DEV=netdevsim${DEV_ADDR}
47SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/
48DEBUGFS_NET_DIR=/sys/kernel/debug/netdevsim/$DEV/
49NUM_NETIFS=0
50source $lib_dir/lib.sh
51
52DEVLINK_DEV=
53source $lib_dir/devlink_lib.sh
54DEVLINK_DEV=netdevsim/${DEV}
55
56nexthop_check()
57{
58 local nharg="$1"; shift
59 local expected="$1"; shift
60
61 out=$($IP nexthop show ${nharg} | sed -e 's/ *$//')
62 if [[ "$out" != "$expected" ]]; then
63 return 1
64 fi
65
66 return 0
67}
68
69nexthop_bucket_nhid_count_check()
70{
71 local group_id=$1; shift
72 local expected
73 local count
74 local nhid
75 local ret
76
77 while (($# > 0)); do
78 nhid=$1; shift
79 expected=$1; shift
80
81 count=$($IP nexthop bucket show id $group_id nhid $nhid |
82 grep "trap" | wc -l)
83 if ((expected != count)); then
84 return 1
85 fi
86 done
87
88 return 0
89}
90
91nexthop_resource_check()
92{
93 local expected_occ=$1; shift
94
95 occ=$($DEVLINK -jp resource show $DEVLINK_DEV \
96 | jq '.[][][] | select(.name=="nexthops") | .["occ"]')
97
98 if [ $expected_occ -ne $occ ]; then
99 return 1
100 fi
101
102 return 0
103}
104
105nexthop_resource_set()
106{
107 local size=$1; shift
108
109 $DEVLINK resource set $DEVLINK_DEV path nexthops size $size
110 $DEVLINK dev reload $DEVLINK_DEV
111}
112
113nexthop_single_add_test()
114{
115 RET=0
116
117 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
118 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap"
119 check_err $? "Unexpected nexthop entry"
120
121 nexthop_resource_check 1
122 check_err $? "Wrong nexthop occupancy"
123
124 $IP nexthop del id 1
125 nexthop_resource_check 0
126 check_err $? "Wrong nexthop occupancy after delete"
127
128 log_test "Single nexthop add and delete"
129}
130
131nexthop_single_add_err_test()
132{
133 RET=0
134
135 nexthop_resource_set 1
136
137 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
138
139 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 &> /dev/null
140 check_fail $? "Nexthop addition succeeded when should fail"
141
142 nexthop_resource_check 1
143 check_err $? "Wrong nexthop occupancy"
144
145 log_test "Single nexthop add failure"
146
147 $IP nexthop flush &> /dev/null
148 nexthop_resource_set 9999
149}
150
151nexthop_group_add_test()
152{
153 RET=0
154
155 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
156 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
157
158 $IP nexthop add id 10 group 1/2
159 nexthop_check "id 10" "id 10 group 1/2 trap"
160 check_err $? "Unexpected nexthop group entry"
161
162 nexthop_resource_check 4
163 check_err $? "Wrong nexthop occupancy"
164
165 $IP nexthop del id 10
166 nexthop_resource_check 2
167 check_err $? "Wrong nexthop occupancy after delete"
168
169 $IP nexthop add id 10 group 1,20/2,39
170 nexthop_check "id 10" "id 10 group 1,20/2,39 trap"
171 check_err $? "Unexpected weighted nexthop group entry"
172
173 nexthop_resource_check 61
174 check_err $? "Wrong weighted nexthop occupancy"
175
176 $IP nexthop del id 10
177 nexthop_resource_check 2
178 check_err $? "Wrong nexthop occupancy after delete"
179
180 log_test "Nexthop group add and delete"
181
182 $IP nexthop flush &> /dev/null
183}
184
185nexthop_group_add_err_test()
186{
187 RET=0
188
189 nexthop_resource_set 2
190
191 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
192 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
193
194 $IP nexthop add id 10 group 1/2 &> /dev/null
195 check_fail $? "Nexthop group addition succeeded when should fail"
196
197 nexthop_resource_check 2
198 check_err $? "Wrong nexthop occupancy"
199
200 log_test "Nexthop group add failure"
201
202 $IP nexthop flush &> /dev/null
203 nexthop_resource_set 9999
204}
205
206nexthop_res_group_add_test()
207{
208 RET=0
209
210 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
211 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
212
213 $IP nexthop add id 10 group 1/2 type resilient buckets 4
214 nexthop_check "id 10" "id 10 group 1/2 type resilient buckets 4 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap"
215 check_err $? "Unexpected nexthop group entry"
216
217 nexthop_bucket_nhid_count_check 10 1 2
218 check_err $? "Wrong nexthop buckets count"
219 nexthop_bucket_nhid_count_check 10 2 2
220 check_err $? "Wrong nexthop buckets count"
221
222 nexthop_resource_check 6
223 check_err $? "Wrong nexthop occupancy"
224
225 $IP nexthop del id 10
226 nexthop_resource_check 2
227 check_err $? "Wrong nexthop occupancy after delete"
228
229 $IP nexthop add id 10 group 1,3/2,2 type resilient buckets 5
230 nexthop_check "id 10" "id 10 group 1,3/2,2 type resilient buckets 5 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap"
231 check_err $? "Unexpected weighted nexthop group entry"
232
233 nexthop_bucket_nhid_count_check 10 1 3
234 check_err $? "Wrong nexthop buckets count"
235 nexthop_bucket_nhid_count_check 10 2 2
236 check_err $? "Wrong nexthop buckets count"
237
238 nexthop_resource_check 7
239 check_err $? "Wrong weighted nexthop occupancy"
240
241 $IP nexthop del id 10
242 nexthop_resource_check 2
243 check_err $? "Wrong nexthop occupancy after delete"
244
245 log_test "Resilient nexthop group add and delete"
246
247 $IP nexthop flush &> /dev/null
248}
249
250nexthop_res_group_add_err_test()
251{
252 RET=0
253
254 nexthop_resource_set 2
255
256 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
257 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
258
259 $IP nexthop add id 10 group 1/2 type resilient buckets 4 &> /dev/null
260 check_fail $? "Nexthop group addition succeeded when should fail"
261
262 nexthop_resource_check 2
263 check_err $? "Wrong nexthop occupancy"
264
265 log_test "Resilient nexthop group add failure"
266
267 $IP nexthop flush &> /dev/null
268 nexthop_resource_set 9999
269}
270
271nexthop_group_replace_test()
272{
273 RET=0
274
275 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
276 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
277 $IP nexthop add id 3 via 192.0.2.4 dev dummy1
278 $IP nexthop add id 10 group 1/2
279
280 $IP nexthop replace id 10 group 1/2/3
281 nexthop_check "id 10" "id 10 group 1/2/3 trap"
282 check_err $? "Unexpected nexthop group entry"
283
284 nexthop_resource_check 6
285 check_err $? "Wrong nexthop occupancy"
286
287 log_test "Nexthop group replace"
288
289 $IP nexthop flush &> /dev/null
290}
291
292nexthop_group_replace_err_test()
293{
294 RET=0
295
296 nexthop_resource_set 5
297
298 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
299 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
300 $IP nexthop add id 3 via 192.0.2.4 dev dummy1
301 $IP nexthop add id 10 group 1/2
302
303 $IP nexthop replace id 10 group 1/2/3 &> /dev/null
304 check_fail $? "Nexthop group replacement succeeded when should fail"
305
306 nexthop_check "id 10" "id 10 group 1/2 trap"
307 check_err $? "Unexpected nexthop group entry after failure"
308
309 nexthop_resource_check 5
310 check_err $? "Wrong nexthop occupancy after failure"
311
312 log_test "Nexthop group replace failure"
313
314 $IP nexthop flush &> /dev/null
315 nexthop_resource_set 9999
316}
317
318nexthop_res_group_replace_test()
319{
320 RET=0
321
322 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
323 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
324 $IP nexthop add id 3 via 192.0.2.4 dev dummy1
325 $IP nexthop add id 10 group 1/2 type resilient buckets 6
326
327 $IP nexthop replace id 10 group 1/2/3 type resilient
328 nexthop_check "id 10" "id 10 group 1/2/3 type resilient buckets 6 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap"
329 check_err $? "Unexpected nexthop group entry"
330
331 nexthop_bucket_nhid_count_check 10 1 2
332 check_err $? "Wrong nexthop buckets count"
333 nexthop_bucket_nhid_count_check 10 2 2
334 check_err $? "Wrong nexthop buckets count"
335 nexthop_bucket_nhid_count_check 10 3 2
336 check_err $? "Wrong nexthop buckets count"
337
338 nexthop_resource_check 9
339 check_err $? "Wrong nexthop occupancy"
340
341 log_test "Resilient nexthop group replace"
342
343 $IP nexthop flush &> /dev/null
344}
345
346nexthop_res_group_replace_err_test()
347{
348 RET=0
349
350 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
351 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
352 $IP nexthop add id 3 via 192.0.2.4 dev dummy1
353 $IP nexthop add id 10 group 1/2 type resilient buckets 6
354
355 ip netns exec testns1 \
356 echo 1 > $DEBUGFS_NET_DIR/fib/fail_res_nexthop_group_replace
357 $IP nexthop replace id 10 group 1/2/3 type resilient &> /dev/null
358 check_fail $? "Nexthop group replacement succeeded when should fail"
359
360 nexthop_check "id 10" "id 10 group 1/2 type resilient buckets 6 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap"
361 check_err $? "Unexpected nexthop group entry after failure"
362
363 nexthop_bucket_nhid_count_check 10 1 3
364 check_err $? "Wrong nexthop buckets count"
365 nexthop_bucket_nhid_count_check 10 2 3
366 check_err $? "Wrong nexthop buckets count"
367
368 nexthop_resource_check 9
369 check_err $? "Wrong nexthop occupancy after failure"
370
371 log_test "Resilient nexthop group replace failure"
372
373 $IP nexthop flush &> /dev/null
374 ip netns exec testns1 \
375 echo 0 > $DEBUGFS_NET_DIR/fib/fail_res_nexthop_group_replace
376}
377
378nexthop_res_mark_buckets_busy()
379{
380 local group_id=$1; shift
381 local nhid=$1; shift
382 local count=$1; shift
383 local index
384
385 for index in $($IP -j nexthop bucket show id $group_id nhid $nhid |
386 jq '.[].bucket.index' | head -n ${count:--0})
387 do
388 echo $group_id $index \
389 > $DEBUGFS_NET_DIR/fib/nexthop_bucket_activity
390 done
391}
392
393nexthop_res_num_nhid_buckets()
394{
395 local group_id=$1; shift
396 local nhid=$1; shift
397
398 $IP -j nexthop bucket show id $group_id nhid $nhid | jq length
399}
400
401nexthop_res_group_idle_timer_test()
402{
403 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
404 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
405
406 RET=0
407
408 $IP nexthop add id 10 group 1/2 type resilient buckets 8 idle_timer 4
409 nexthop_res_mark_buckets_busy 10 1
410 $IP nexthop replace id 10 group 1/2,3 type resilient
411
412 nexthop_bucket_nhid_count_check 10 1 4 2 4
413 check_err $? "Group expected to be unbalanced"
414
415 sleep 6
416
417 nexthop_bucket_nhid_count_check 10 1 2 2 6
418 check_err $? "Group expected to be balanced"
419
420 log_test "Bucket migration after idle timer"
421
422 $IP nexthop flush &> /dev/null
423}
424
425nexthop_res_group_idle_timer_del_test()
426{
427 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
428 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
429 $IP nexthop add id 3 via 192.0.2.3 dev dummy1
430
431 RET=0
432
433 $IP nexthop add id 10 group 1,50/2,50/3,1 \
434 type resilient buckets 8 idle_timer 6
435 nexthop_res_mark_buckets_busy 10 1
436 $IP nexthop replace id 10 group 1,50/2,150/3,1 type resilient
437
438 nexthop_bucket_nhid_count_check 10 1 4 2 4 3 0
439 check_err $? "Group expected to be unbalanced"
440
441 sleep 4
442
443 # Deletion prompts group replacement. Check that the bucket timers
444 # are kept.
445 $IP nexthop delete id 3
446
447 nexthop_bucket_nhid_count_check 10 1 4 2 4
448 check_err $? "Group expected to still be unbalanced"
449
450 sleep 4
451
452 nexthop_bucket_nhid_count_check 10 1 2 2 6
453 check_err $? "Group expected to be balanced"
454
455 log_test "Bucket migration after idle timer (with delete)"
456
457 $IP nexthop flush &> /dev/null
458}
459
460__nexthop_res_group_increase_timer_test()
461{
462 local timer=$1; shift
463
464 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
465 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
466
467 RET=0
468
469 $IP nexthop add id 10 group 1/2 type resilient buckets 8 $timer 4
470 nexthop_res_mark_buckets_busy 10 1
471 $IP nexthop replace id 10 group 1/2,3 type resilient
472
473 nexthop_bucket_nhid_count_check 10 2 6
474 check_fail $? "Group expected to be unbalanced"
475
476 sleep 2
477 $IP nexthop replace id 10 group 1/2,3 type resilient $timer 8
478 sleep 4
479
480 # 6 seconds, past the original timer.
481 nexthop_bucket_nhid_count_check 10 2 6
482 check_fail $? "Group still expected to be unbalanced"
483
484 sleep 4
485
486 # 10 seconds, past the new timer.
487 nexthop_bucket_nhid_count_check 10 2 6
488 check_err $? "Group expected to be balanced"
489
490 log_test "Bucket migration after $timer increase"
491
492 $IP nexthop flush &> /dev/null
493}
494
495__nexthop_res_group_decrease_timer_test()
496{
497 local timer=$1; shift
498
499 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
500 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
501
502 RET=0
503
504 $IP nexthop add id 10 group 1/2 type resilient buckets 8 $timer 8
505 nexthop_res_mark_buckets_busy 10 1
506 $IP nexthop replace id 10 group 1/2,3 type resilient
507
508 nexthop_bucket_nhid_count_check 10 2 6
509 check_fail $? "Group expected to be unbalanced"
510
511 sleep 2
512 $IP nexthop replace id 10 group 1/2,3 type resilient $timer 4
513 sleep 4
514
515 # 6 seconds, past the new timer, before the old timer.
516 nexthop_bucket_nhid_count_check 10 2 6
517 check_err $? "Group expected to be balanced"
518
519 log_test "Bucket migration after $timer decrease"
520
521 $IP nexthop flush &> /dev/null
522}
523
524__nexthop_res_group_increase_timer_del_test()
525{
526 local timer=$1; shift
527
528 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
529 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
530 $IP nexthop add id 3 via 192.0.2.3 dev dummy1
531
532 RET=0
533
534 $IP nexthop add id 10 group 1,100/2,100/3,1 \
535 type resilient buckets 8 $timer 4
536 nexthop_res_mark_buckets_busy 10 1
537 $IP nexthop replace id 10 group 1,100/2,300/3,1 type resilient
538
539 nexthop_bucket_nhid_count_check 10 2 6
540 check_fail $? "Group expected to be unbalanced"
541
542 sleep 2
543 $IP nexthop replace id 10 group 1/2,3 type resilient $timer 8
544 sleep 4
545
546 # 6 seconds, past the original timer.
547 nexthop_bucket_nhid_count_check 10 2 6
548 check_fail $? "Group still expected to be unbalanced"
549
550 sleep 4
551
552 # 10 seconds, past the new timer.
553 nexthop_bucket_nhid_count_check 10 2 6
554 check_err $? "Group expected to be balanced"
555
556 log_test "Bucket migration after $timer increase"
557
558 $IP nexthop flush &> /dev/null
559}
560
561nexthop_res_group_increase_idle_timer_test()
562{
563 __nexthop_res_group_increase_timer_test idle_timer
564}
565
566nexthop_res_group_decrease_idle_timer_test()
567{
568 __nexthop_res_group_decrease_timer_test idle_timer
569}
570
571nexthop_res_group_unbalanced_timer_test()
572{
573 local i
574
575 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
576 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
577
578 RET=0
579
580 $IP nexthop add id 10 group 1/2 type resilient \
581 buckets 8 idle_timer 6 unbalanced_timer 10
582 nexthop_res_mark_buckets_busy 10 1
583 $IP nexthop replace id 10 group 1/2,3 type resilient
584
585 for i in 1 2; do
586 sleep 4
587 nexthop_bucket_nhid_count_check 10 1 4 2 4
588 check_err $? "$i: Group expected to be unbalanced"
589 nexthop_res_mark_buckets_busy 10 1
590 done
591
592 # 3 x sleep 4 > unbalanced timer 10
593 sleep 4
594 nexthop_bucket_nhid_count_check 10 1 2 2 6
595 check_err $? "Group expected to be balanced"
596
597 log_test "Bucket migration after unbalanced timer"
598
599 $IP nexthop flush &> /dev/null
600}
601
602nexthop_res_group_unbalanced_timer_del_test()
603{
604 local i
605
606 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
607 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
608 $IP nexthop add id 3 via 192.0.2.3 dev dummy1
609
610 RET=0
611
612 $IP nexthop add id 10 group 1,50/2,50/3,1 type resilient \
613 buckets 8 idle_timer 6 unbalanced_timer 10
614 nexthop_res_mark_buckets_busy 10 1
615 $IP nexthop replace id 10 group 1,50/2,150/3,1 type resilient
616
617 # Check that NH delete does not reset unbalanced time.
618 sleep 4
619 $IP nexthop delete id 3
620 nexthop_bucket_nhid_count_check 10 1 4 2 4
621 check_err $? "1: Group expected to be unbalanced"
622 nexthop_res_mark_buckets_busy 10 1
623
624 sleep 4
625 nexthop_bucket_nhid_count_check 10 1 4 2 4
626 check_err $? "2: Group expected to be unbalanced"
627 nexthop_res_mark_buckets_busy 10 1
628
629 # 3 x sleep 4 > unbalanced timer 10
630 sleep 4
631 nexthop_bucket_nhid_count_check 10 1 2 2 6
632 check_err $? "Group expected to be balanced"
633
634 log_test "Bucket migration after unbalanced timer (with delete)"
635
636 $IP nexthop flush &> /dev/null
637}
638
639nexthop_res_group_no_unbalanced_timer_test()
640{
641 local i
642
643 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
644 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
645
646 RET=0
647
648 $IP nexthop add id 10 group 1/2 type resilient buckets 8
649 nexthop_res_mark_buckets_busy 10 1
650 $IP nexthop replace id 10 group 1/2,3 type resilient
651
652 for i in $(seq 3); do
653 sleep 60
654 nexthop_bucket_nhid_count_check 10 2 6
655 check_fail $? "$i: Group expected to be unbalanced"
656 nexthop_res_mark_buckets_busy 10 1
657 done
658
659 log_test "Buckets never force-migrated without unbalanced timer"
660
661 $IP nexthop flush &> /dev/null
662}
663
664nexthop_res_group_short_unbalanced_timer_test()
665{
666 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
667 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
668
669 RET=0
670
671 $IP nexthop add id 10 group 1/2 type resilient \
672 buckets 8 idle_timer 120 unbalanced_timer 4
673 nexthop_res_mark_buckets_busy 10 1
674 $IP nexthop replace id 10 group 1/2,3 type resilient
675
676 nexthop_bucket_nhid_count_check 10 2 6
677 check_fail $? "Group expected to be unbalanced"
678
679 sleep 5
680
681 nexthop_bucket_nhid_count_check 10 2 6
682 check_err $? "Group expected to be balanced"
683
684 log_test "Bucket migration after unbalanced < idle timer"
685
686 $IP nexthop flush &> /dev/null
687}
688
689nexthop_res_group_increase_unbalanced_timer_test()
690{
691 __nexthop_res_group_increase_timer_test unbalanced_timer
692}
693
694nexthop_res_group_decrease_unbalanced_timer_test()
695{
696 __nexthop_res_group_decrease_timer_test unbalanced_timer
697}
698
699nexthop_res_group_force_migrate_busy_test()
700{
701 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
702 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
703
704 RET=0
705
706 $IP nexthop add id 10 group 1/2 type resilient \
707 buckets 8 idle_timer 120
708 nexthop_res_mark_buckets_busy 10 1
709 $IP nexthop replace id 10 group 1/2,3 type resilient
710
711 nexthop_bucket_nhid_count_check 10 2 6
712 check_fail $? "Group expected to be unbalanced"
713
714 $IP nexthop replace id 10 group 2 type resilient
715 nexthop_bucket_nhid_count_check 10 2 8
716 check_err $? "All buckets expected to have migrated"
717
718 log_test "Busy buckets force-migrated when NH removed"
719
720 $IP nexthop flush &> /dev/null
721}
722
723nexthop_single_replace_test()
724{
725 RET=0
726
727 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
728
729 $IP nexthop replace id 1 via 192.0.2.3 dev dummy1
730 nexthop_check "id 1" "id 1 via 192.0.2.3 dev dummy1 scope link trap"
731 check_err $? "Unexpected nexthop entry"
732
733 nexthop_resource_check 1
734 check_err $? "Wrong nexthop occupancy"
735
736 log_test "Single nexthop replace"
737
738 $IP nexthop flush &> /dev/null
739}
740
741nexthop_single_replace_err_test()
742{
743 RET=0
744
745 # This is supposed to cause the replace to fail because the new nexthop
746 # is programmed before deleting the replaced one.
747 nexthop_resource_set 1
748
749 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
750
751 $IP nexthop replace id 1 via 192.0.2.3 dev dummy1 &> /dev/null
752 check_fail $? "Nexthop replace succeeded when should fail"
753
754 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap"
755 check_err $? "Unexpected nexthop entry after failure"
756
757 nexthop_resource_check 1
758 check_err $? "Wrong nexthop occupancy after failure"
759
760 log_test "Single nexthop replace failure"
761
762 $IP nexthop flush &> /dev/null
763 nexthop_resource_set 9999
764}
765
766nexthop_single_in_group_replace_test()
767{
768 RET=0
769
770 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
771 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
772 $IP nexthop add id 10 group 1/2
773
774 $IP nexthop replace id 1 via 192.0.2.4 dev dummy1
775 check_err $? "Failed to replace nexthop when should not"
776
777 nexthop_check "id 10" "id 10 group 1/2 trap"
778 check_err $? "Unexpected nexthop group entry"
779
780 nexthop_resource_check 4
781 check_err $? "Wrong nexthop occupancy"
782
783 log_test "Single nexthop replace while in group"
784
785 $IP nexthop flush &> /dev/null
786}
787
788nexthop_single_in_group_replace_err_test()
789{
790 RET=0
791
792 nexthop_resource_set 5
793
794 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
795 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
796 $IP nexthop add id 10 group 1/2
797
798 $IP nexthop replace id 1 via 192.0.2.4 dev dummy1 &> /dev/null
799 check_fail $? "Nexthop replacement succeeded when should fail"
800
801 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap"
802 check_err $? "Unexpected nexthop entry after failure"
803
804 nexthop_check "id 10" "id 10 group 1/2 trap"
805 check_err $? "Unexpected nexthop group entry after failure"
806
807 nexthop_resource_check 4
808 check_err $? "Wrong nexthop occupancy"
809
810 log_test "Single nexthop replace while in group failure"
811
812 $IP nexthop flush &> /dev/null
813 nexthop_resource_set 9999
814}
815
816nexthop_single_in_res_group_replace_test()
817{
818 RET=0
819
820 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
821 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
822 $IP nexthop add id 10 group 1/2 type resilient buckets 4
823
824 $IP nexthop replace id 1 via 192.0.2.4 dev dummy1
825 check_err $? "Failed to replace nexthop when should not"
826
827 nexthop_check "id 10" "id 10 group 1/2 type resilient buckets 4 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap"
828 check_err $? "Unexpected nexthop group entry"
829
830 nexthop_bucket_nhid_count_check 10 1 2 2 2
831 check_err $? "Wrong nexthop buckets count"
832
833 nexthop_resource_check 6
834 check_err $? "Wrong nexthop occupancy"
835
836 log_test "Single nexthop replace while in resilient group"
837
838 $IP nexthop flush &> /dev/null
839}
840
841nexthop_single_in_res_group_replace_err_test()
842{
843 RET=0
844
845 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
846 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
847 $IP nexthop add id 10 group 1/2 type resilient buckets 4
848
849 ip netns exec testns1 \
850 echo 1 > $DEBUGFS_NET_DIR/fib/fail_nexthop_bucket_replace
851 $IP nexthop replace id 1 via 192.0.2.4 dev dummy1 &> /dev/null
852 check_fail $? "Nexthop replacement succeeded when should fail"
853
854 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap"
855 check_err $? "Unexpected nexthop entry after failure"
856
857 nexthop_check "id 10" "id 10 group 1/2 type resilient buckets 4 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap"
858 check_err $? "Unexpected nexthop group entry after failure"
859
860 nexthop_bucket_nhid_count_check 10 1 2 2 2
861 check_err $? "Wrong nexthop buckets count"
862
863 nexthop_resource_check 6
864 check_err $? "Wrong nexthop occupancy"
865
866 log_test "Single nexthop replace while in resilient group failure"
867
868 $IP nexthop flush &> /dev/null
869 ip netns exec testns1 \
870 echo 0 > $DEBUGFS_NET_DIR/fib/fail_nexthop_bucket_replace
871}
872
873nexthop_single_in_group_delete_test()
874{
875 RET=0
876
877 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
878 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
879 $IP nexthop add id 10 group 1/2
880
881 $IP nexthop del id 1
882 nexthop_check "id 10" "id 10 group 2 trap"
883 check_err $? "Unexpected nexthop group entry"
884
885 nexthop_resource_check 2
886 check_err $? "Wrong nexthop occupancy"
887
888 log_test "Single nexthop delete while in group"
889
890 $IP nexthop flush &> /dev/null
891}
892
893nexthop_single_in_group_delete_err_test()
894{
895 RET=0
896
897 # First, nexthop 1 will be deleted, which will reduce the occupancy to
898 # 5. Afterwards, a replace notification will be sent for nexthop group
899 # 10 with only two nexthops. Since the new group is allocated before
900 # the old is deleted, the replacement will fail as it will result in an
901 # occupancy of 7.
902 nexthop_resource_set 6
903
904 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
905 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
906 $IP nexthop add id 3 via 192.0.2.4 dev dummy1
907 $IP nexthop add id 10 group 1/2/3
908
909 $IP nexthop del id 1
910
911 nexthop_resource_check 5
912 check_err $? "Wrong nexthop occupancy"
913
914 log_test "Single nexthop delete while in group failure"
915
916 $IP nexthop flush &> /dev/null
917 nexthop_resource_set 9999
918}
919
920nexthop_single_in_res_group_delete_test()
921{
922 RET=0
923
924 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
925 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
926 $IP nexthop add id 10 group 1/2 type resilient buckets 4
927
928 $IP nexthop del id 1
929 nexthop_check "id 10" "id 10 group 2 type resilient buckets 4 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap"
930 check_err $? "Unexpected nexthop group entry"
931
932 nexthop_bucket_nhid_count_check 10 2 4
933 check_err $? "Wrong nexthop buckets count"
934
935 nexthop_resource_check 5
936 check_err $? "Wrong nexthop occupancy"
937
938 log_test "Single nexthop delete while in resilient group"
939
940 $IP nexthop flush &> /dev/null
941}
942
943nexthop_single_in_res_group_delete_err_test()
944{
945 RET=0
946
947 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
948 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
949 $IP nexthop add id 3 via 192.0.2.4 dev dummy1
950 $IP nexthop add id 10 group 1/2/3 type resilient buckets 6
951
952 ip netns exec testns1 \
953 echo 1 > $DEBUGFS_NET_DIR/fib/fail_nexthop_bucket_replace
954 $IP nexthop del id 1
955
956 # We failed to replace the two nexthop buckets that were originally
957 # assigned to nhid 1.
958 nexthop_bucket_nhid_count_check 10 2 2 3 2
959 check_err $? "Wrong nexthop buckets count"
960
961 nexthop_resource_check 8
962 check_err $? "Wrong nexthop occupancy"
963
964 log_test "Single nexthop delete while in resilient group failure"
965
966 $IP nexthop flush &> /dev/null
967 ip netns exec testns1 \
968 echo 0 > $DEBUGFS_NET_DIR/fib/fail_nexthop_bucket_replace
969}
970
971nexthop_replay_test()
972{
973 RET=0
974
975 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
976 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
977 $IP nexthop add id 10 group 1/2
978
979 $DEVLINK dev reload $DEVLINK_DEV
980 check_err $? "Failed to reload when should not"
981
982 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap"
983 check_err $? "Unexpected nexthop entry after reload"
984
985 nexthop_check "id 2" "id 2 via 192.0.2.3 dev dummy1 scope link trap"
986 check_err $? "Unexpected nexthop entry after reload"
987
988 nexthop_check "id 10" "id 10 group 1/2 trap"
989 check_err $? "Unexpected nexthop group entry after reload"
990
991 nexthop_resource_check 4
992 check_err $? "Wrong nexthop occupancy"
993
994 log_test "Nexthop replay"
995
996 $IP nexthop flush &> /dev/null
997}
998
999nexthop_replay_err_test()
1000{
1001 RET=0
1002
1003 $IP nexthop add id 1 via 192.0.2.2 dev dummy1
1004 $IP nexthop add id 2 via 192.0.2.3 dev dummy1
1005 $IP nexthop add id 10 group 1/2
1006
1007 # Reduce size of nexthop resource so that reload will fail.
1008 $DEVLINK resource set $DEVLINK_DEV path nexthops size 3
1009 $DEVLINK dev reload $DEVLINK_DEV &> /dev/null
1010 check_fail $? "Reload succeeded when should fail"
1011
1012 $DEVLINK resource set $DEVLINK_DEV path nexthops size 9999
1013 $DEVLINK dev reload $DEVLINK_DEV
1014 check_err $? "Failed to reload when should not"
1015
1016 log_test "Nexthop replay failure"
1017
1018 $IP nexthop flush &> /dev/null
1019}
1020
1021setup_prepare()
1022{
1023 local netdev
1024
1025 modprobe netdevsim &> /dev/null
1026
1027 echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device
1028 while [ ! -d $SYSFS_NET_DIR ] ; do :; done
1029
1030 set -e
1031
1032 ip netns add testns1
1033 devlink dev reload $DEVLINK_DEV netns testns1
1034
1035 IP="ip -netns testns1"
1036 DEVLINK="devlink -N testns1"
1037
1038 $IP link add name dummy1 up type dummy
1039 $IP address add 192.0.2.1/24 dev dummy1
1040
1041 set +e
1042}
1043
1044cleanup()
1045{
1046 pre_cleanup
1047 ip netns del testns1
1048 echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device
1049 modprobe -r netdevsim &> /dev/null
1050}
1051
1052trap cleanup EXIT
1053
1054setup_prepare
1055
1056tests_run
1057
1058exit $EXIT_STATUS