162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# This test is for checking the nexthop offload API. It makes use of netdevsim
562306a36Sopenharmony_ci# which registers a listener to the nexthop notification chain.
662306a36Sopenharmony_ci
762306a36Sopenharmony_cilib_dir=$(dirname $0)/../../../net/forwarding
862306a36Sopenharmony_ci
962306a36Sopenharmony_ciALL_TESTS="
1062306a36Sopenharmony_ci	nexthop_single_add_test
1162306a36Sopenharmony_ci	nexthop_single_add_err_test
1262306a36Sopenharmony_ci	nexthop_group_add_test
1362306a36Sopenharmony_ci	nexthop_group_add_err_test
1462306a36Sopenharmony_ci	nexthop_res_group_add_test
1562306a36Sopenharmony_ci	nexthop_res_group_add_err_test
1662306a36Sopenharmony_ci	nexthop_group_replace_test
1762306a36Sopenharmony_ci	nexthop_group_replace_err_test
1862306a36Sopenharmony_ci	nexthop_res_group_replace_test
1962306a36Sopenharmony_ci	nexthop_res_group_replace_err_test
2062306a36Sopenharmony_ci	nexthop_res_group_idle_timer_test
2162306a36Sopenharmony_ci	nexthop_res_group_idle_timer_del_test
2262306a36Sopenharmony_ci	nexthop_res_group_increase_idle_timer_test
2362306a36Sopenharmony_ci	nexthop_res_group_decrease_idle_timer_test
2462306a36Sopenharmony_ci	nexthop_res_group_unbalanced_timer_test
2562306a36Sopenharmony_ci	nexthop_res_group_unbalanced_timer_del_test
2662306a36Sopenharmony_ci	nexthop_res_group_no_unbalanced_timer_test
2762306a36Sopenharmony_ci	nexthop_res_group_short_unbalanced_timer_test
2862306a36Sopenharmony_ci	nexthop_res_group_increase_unbalanced_timer_test
2962306a36Sopenharmony_ci	nexthop_res_group_decrease_unbalanced_timer_test
3062306a36Sopenharmony_ci	nexthop_res_group_force_migrate_busy_test
3162306a36Sopenharmony_ci	nexthop_single_replace_test
3262306a36Sopenharmony_ci	nexthop_single_replace_err_test
3362306a36Sopenharmony_ci	nexthop_single_in_group_replace_test
3462306a36Sopenharmony_ci	nexthop_single_in_group_replace_err_test
3562306a36Sopenharmony_ci	nexthop_single_in_res_group_replace_test
3662306a36Sopenharmony_ci	nexthop_single_in_res_group_replace_err_test
3762306a36Sopenharmony_ci	nexthop_single_in_group_delete_test
3862306a36Sopenharmony_ci	nexthop_single_in_group_delete_err_test
3962306a36Sopenharmony_ci	nexthop_single_in_res_group_delete_test
4062306a36Sopenharmony_ci	nexthop_single_in_res_group_delete_err_test
4162306a36Sopenharmony_ci	nexthop_replay_test
4262306a36Sopenharmony_ci	nexthop_replay_err_test
4362306a36Sopenharmony_ci"
4462306a36Sopenharmony_ciNETDEVSIM_PATH=/sys/bus/netdevsim/
4562306a36Sopenharmony_ciDEV_ADDR=1337
4662306a36Sopenharmony_ciDEV=netdevsim${DEV_ADDR}
4762306a36Sopenharmony_ciSYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/
4862306a36Sopenharmony_ciDEBUGFS_NET_DIR=/sys/kernel/debug/netdevsim/$DEV/
4962306a36Sopenharmony_ciNUM_NETIFS=0
5062306a36Sopenharmony_cisource $lib_dir/lib.sh
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciDEVLINK_DEV=
5362306a36Sopenharmony_cisource $lib_dir/devlink_lib.sh
5462306a36Sopenharmony_ciDEVLINK_DEV=netdevsim/${DEV}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cinexthop_check()
5762306a36Sopenharmony_ci{
5862306a36Sopenharmony_ci	local nharg="$1"; shift
5962306a36Sopenharmony_ci	local expected="$1"; shift
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	out=$($IP nexthop show ${nharg} | sed -e 's/ *$//')
6262306a36Sopenharmony_ci	if [[ "$out" != "$expected" ]]; then
6362306a36Sopenharmony_ci		return 1
6462306a36Sopenharmony_ci	fi
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	return 0
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cinexthop_bucket_nhid_count_check()
7062306a36Sopenharmony_ci{
7162306a36Sopenharmony_ci	local group_id=$1; shift
7262306a36Sopenharmony_ci	local expected
7362306a36Sopenharmony_ci	local count
7462306a36Sopenharmony_ci	local nhid
7562306a36Sopenharmony_ci	local ret
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	while (($# > 0)); do
7862306a36Sopenharmony_ci		nhid=$1; shift
7962306a36Sopenharmony_ci		expected=$1; shift
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci		count=$($IP nexthop bucket show id $group_id nhid $nhid |
8262306a36Sopenharmony_ci			grep "trap" | wc -l)
8362306a36Sopenharmony_ci		if ((expected != count)); then
8462306a36Sopenharmony_ci			return 1
8562306a36Sopenharmony_ci		fi
8662306a36Sopenharmony_ci	done
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	return 0
8962306a36Sopenharmony_ci}
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_cinexthop_resource_check()
9262306a36Sopenharmony_ci{
9362306a36Sopenharmony_ci	local expected_occ=$1; shift
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	occ=$($DEVLINK -jp resource show $DEVLINK_DEV \
9662306a36Sopenharmony_ci		| jq '.[][][] | select(.name=="nexthops") | .["occ"]')
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	if [ $expected_occ -ne $occ ]; then
9962306a36Sopenharmony_ci		return 1
10062306a36Sopenharmony_ci	fi
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	return 0
10362306a36Sopenharmony_ci}
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cinexthop_resource_set()
10662306a36Sopenharmony_ci{
10762306a36Sopenharmony_ci	local size=$1; shift
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	$DEVLINK resource set $DEVLINK_DEV path nexthops size $size
11062306a36Sopenharmony_ci	$DEVLINK dev reload $DEVLINK_DEV
11162306a36Sopenharmony_ci}
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_cinexthop_single_add_test()
11462306a36Sopenharmony_ci{
11562306a36Sopenharmony_ci	RET=0
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
11862306a36Sopenharmony_ci	nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap"
11962306a36Sopenharmony_ci	check_err $? "Unexpected nexthop entry"
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci	nexthop_resource_check 1
12262306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	$IP nexthop del id 1
12562306a36Sopenharmony_ci	nexthop_resource_check 0
12662306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy after delete"
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	log_test "Single nexthop add and delete"
12962306a36Sopenharmony_ci}
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_cinexthop_single_add_err_test()
13262306a36Sopenharmony_ci{
13362306a36Sopenharmony_ci	RET=0
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	nexthop_resource_set 1
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1 &> /dev/null
14062306a36Sopenharmony_ci	check_fail $? "Nexthop addition succeeded when should fail"
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci	nexthop_resource_check 1
14362306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci	log_test "Single nexthop add failure"
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
14862306a36Sopenharmony_ci	nexthop_resource_set 9999
14962306a36Sopenharmony_ci}
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_cinexthop_group_add_test()
15262306a36Sopenharmony_ci{
15362306a36Sopenharmony_ci	RET=0
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
15662306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2
15962306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 1/2 trap"
16062306a36Sopenharmony_ci	check_err $? "Unexpected nexthop group entry"
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	nexthop_resource_check 4
16362306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci	$IP nexthop del id 10
16662306a36Sopenharmony_ci	nexthop_resource_check 2
16762306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy after delete"
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	$IP nexthop add id 10 group 1,20/2,39
17062306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 1,20/2,39 trap"
17162306a36Sopenharmony_ci	check_err $? "Unexpected weighted nexthop group entry"
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	nexthop_resource_check 61
17462306a36Sopenharmony_ci	check_err $? "Wrong weighted nexthop occupancy"
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci	$IP nexthop del id 10
17762306a36Sopenharmony_ci	nexthop_resource_check 2
17862306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy after delete"
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci	log_test "Nexthop group add and delete"
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
18362306a36Sopenharmony_ci}
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_cinexthop_group_add_err_test()
18662306a36Sopenharmony_ci{
18762306a36Sopenharmony_ci	RET=0
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	nexthop_resource_set 2
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
19262306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 &> /dev/null
19562306a36Sopenharmony_ci	check_fail $? "Nexthop group addition succeeded when should fail"
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	nexthop_resource_check 2
19862306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	log_test "Nexthop group add failure"
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
20362306a36Sopenharmony_ci	nexthop_resource_set 9999
20462306a36Sopenharmony_ci}
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_cinexthop_res_group_add_test()
20762306a36Sopenharmony_ci{
20862306a36Sopenharmony_ci	RET=0
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
21162306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient buckets 4
21462306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 1/2 type resilient buckets 4 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap"
21562306a36Sopenharmony_ci	check_err $? "Unexpected nexthop group entry"
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 1 2
21862306a36Sopenharmony_ci	check_err $? "Wrong nexthop buckets count"
21962306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 2
22062306a36Sopenharmony_ci	check_err $? "Wrong nexthop buckets count"
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci	nexthop_resource_check 6
22362306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci	$IP nexthop del id 10
22662306a36Sopenharmony_ci	nexthop_resource_check 2
22762306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy after delete"
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci	$IP nexthop add id 10 group 1,3/2,2 type resilient buckets 5
23062306a36Sopenharmony_ci	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"
23162306a36Sopenharmony_ci	check_err $? "Unexpected weighted nexthop group entry"
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 1 3
23462306a36Sopenharmony_ci	check_err $? "Wrong nexthop buckets count"
23562306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 2
23662306a36Sopenharmony_ci	check_err $? "Wrong nexthop buckets count"
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci	nexthop_resource_check 7
23962306a36Sopenharmony_ci	check_err $? "Wrong weighted nexthop occupancy"
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci	$IP nexthop del id 10
24262306a36Sopenharmony_ci	nexthop_resource_check 2
24362306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy after delete"
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	log_test "Resilient nexthop group add and delete"
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
24862306a36Sopenharmony_ci}
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_cinexthop_res_group_add_err_test()
25162306a36Sopenharmony_ci{
25262306a36Sopenharmony_ci	RET=0
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci	nexthop_resource_set 2
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
25762306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient buckets 4 &> /dev/null
26062306a36Sopenharmony_ci	check_fail $? "Nexthop group addition succeeded when should fail"
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci	nexthop_resource_check 2
26362306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci	log_test "Resilient nexthop group add failure"
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
26862306a36Sopenharmony_ci	nexthop_resource_set 9999
26962306a36Sopenharmony_ci}
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_cinexthop_group_replace_test()
27262306a36Sopenharmony_ci{
27362306a36Sopenharmony_ci	RET=0
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
27662306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
27762306a36Sopenharmony_ci	$IP nexthop add id 3 via 192.0.2.4 dev dummy1
27862306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2/3
28162306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 1/2/3 trap"
28262306a36Sopenharmony_ci	check_err $? "Unexpected nexthop group entry"
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci	nexthop_resource_check 6
28562306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci	log_test "Nexthop group replace"
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
29062306a36Sopenharmony_ci}
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_cinexthop_group_replace_err_test()
29362306a36Sopenharmony_ci{
29462306a36Sopenharmony_ci	RET=0
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci	nexthop_resource_set 5
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
29962306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
30062306a36Sopenharmony_ci	$IP nexthop add id 3 via 192.0.2.4 dev dummy1
30162306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2/3 &> /dev/null
30462306a36Sopenharmony_ci	check_fail $? "Nexthop group replacement succeeded when should fail"
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 1/2 trap"
30762306a36Sopenharmony_ci	check_err $? "Unexpected nexthop group entry after failure"
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci	nexthop_resource_check 5
31062306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy after failure"
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	log_test "Nexthop group replace failure"
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
31562306a36Sopenharmony_ci	nexthop_resource_set 9999
31662306a36Sopenharmony_ci}
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_cinexthop_res_group_replace_test()
31962306a36Sopenharmony_ci{
32062306a36Sopenharmony_ci	RET=0
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
32362306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
32462306a36Sopenharmony_ci	$IP nexthop add id 3 via 192.0.2.4 dev dummy1
32562306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient buckets 6
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2/3 type resilient
32862306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 1/2/3 type resilient buckets 6 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap"
32962306a36Sopenharmony_ci	check_err $? "Unexpected nexthop group entry"
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 1 2
33262306a36Sopenharmony_ci	check_err $? "Wrong nexthop buckets count"
33362306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 2
33462306a36Sopenharmony_ci	check_err $? "Wrong nexthop buckets count"
33562306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 3 2
33662306a36Sopenharmony_ci	check_err $? "Wrong nexthop buckets count"
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	nexthop_resource_check 9
33962306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	log_test "Resilient nexthop group replace"
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
34462306a36Sopenharmony_ci}
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_cinexthop_res_group_replace_err_test()
34762306a36Sopenharmony_ci{
34862306a36Sopenharmony_ci	RET=0
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
35162306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
35262306a36Sopenharmony_ci	$IP nexthop add id 3 via 192.0.2.4 dev dummy1
35362306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient buckets 6
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_ci	ip netns exec testns1 \
35662306a36Sopenharmony_ci		echo 1 > $DEBUGFS_NET_DIR/fib/fail_res_nexthop_group_replace
35762306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2/3 type resilient &> /dev/null
35862306a36Sopenharmony_ci	check_fail $? "Nexthop group replacement succeeded when should fail"
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 1/2 type resilient buckets 6 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap"
36162306a36Sopenharmony_ci	check_err $? "Unexpected nexthop group entry after failure"
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 1 3
36462306a36Sopenharmony_ci	check_err $? "Wrong nexthop buckets count"
36562306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 3
36662306a36Sopenharmony_ci	check_err $? "Wrong nexthop buckets count"
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci	nexthop_resource_check 9
36962306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy after failure"
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci	log_test "Resilient nexthop group replace failure"
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
37462306a36Sopenharmony_ci	ip netns exec testns1 \
37562306a36Sopenharmony_ci		echo 0 > $DEBUGFS_NET_DIR/fib/fail_res_nexthop_group_replace
37662306a36Sopenharmony_ci}
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_cinexthop_res_mark_buckets_busy()
37962306a36Sopenharmony_ci{
38062306a36Sopenharmony_ci	local group_id=$1; shift
38162306a36Sopenharmony_ci	local nhid=$1; shift
38262306a36Sopenharmony_ci	local count=$1; shift
38362306a36Sopenharmony_ci	local index
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci	for index in $($IP -j nexthop bucket show id $group_id nhid $nhid |
38662306a36Sopenharmony_ci		       jq '.[].bucket.index' | head -n ${count:--0})
38762306a36Sopenharmony_ci	do
38862306a36Sopenharmony_ci		echo $group_id $index \
38962306a36Sopenharmony_ci			> $DEBUGFS_NET_DIR/fib/nexthop_bucket_activity
39062306a36Sopenharmony_ci	done
39162306a36Sopenharmony_ci}
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_cinexthop_res_num_nhid_buckets()
39462306a36Sopenharmony_ci{
39562306a36Sopenharmony_ci	local group_id=$1; shift
39662306a36Sopenharmony_ci	local nhid=$1; shift
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci	$IP -j nexthop bucket show id $group_id nhid $nhid | jq length
39962306a36Sopenharmony_ci}
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_cinexthop_res_group_idle_timer_test()
40262306a36Sopenharmony_ci{
40362306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
40462306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_ci	RET=0
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient buckets 8 idle_timer 4
40962306a36Sopenharmony_ci	nexthop_res_mark_buckets_busy 10 1
41062306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2,3 type resilient
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10  1 4  2 4
41362306a36Sopenharmony_ci	check_err $? "Group expected to be unbalanced"
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ci	sleep 6
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10  1 2  2 6
41862306a36Sopenharmony_ci	check_err $? "Group expected to be balanced"
41962306a36Sopenharmony_ci
42062306a36Sopenharmony_ci	log_test "Bucket migration after idle timer"
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
42362306a36Sopenharmony_ci}
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_cinexthop_res_group_idle_timer_del_test()
42662306a36Sopenharmony_ci{
42762306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
42862306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
42962306a36Sopenharmony_ci	$IP nexthop add id 3 via 192.0.2.3 dev dummy1
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_ci	RET=0
43262306a36Sopenharmony_ci
43362306a36Sopenharmony_ci	$IP nexthop add id 10 group 1,50/2,50/3,1 \
43462306a36Sopenharmony_ci	    type resilient buckets 8 idle_timer 6
43562306a36Sopenharmony_ci	nexthop_res_mark_buckets_busy 10 1
43662306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1,50/2,150/3,1 type resilient
43762306a36Sopenharmony_ci
43862306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10  1 4  2 4  3 0
43962306a36Sopenharmony_ci	check_err $? "Group expected to be unbalanced"
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_ci	sleep 4
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci	# Deletion prompts group replacement. Check that the bucket timers
44462306a36Sopenharmony_ci	# are kept.
44562306a36Sopenharmony_ci	$IP nexthop delete id 3
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10  1 4  2 4
44862306a36Sopenharmony_ci	check_err $? "Group expected to still be unbalanced"
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci	sleep 4
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10  1 2  2 6
45362306a36Sopenharmony_ci	check_err $? "Group expected to be balanced"
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_ci	log_test "Bucket migration after idle timer (with delete)"
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
45862306a36Sopenharmony_ci}
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_ci__nexthop_res_group_increase_timer_test()
46162306a36Sopenharmony_ci{
46262306a36Sopenharmony_ci	local timer=$1; shift
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
46562306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci	RET=0
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient buckets 8 $timer 4
47062306a36Sopenharmony_ci	nexthop_res_mark_buckets_busy 10 1
47162306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2,3 type resilient
47262306a36Sopenharmony_ci
47362306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 6
47462306a36Sopenharmony_ci	check_fail $? "Group expected to be unbalanced"
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_ci	sleep 2
47762306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2,3 type resilient $timer 8
47862306a36Sopenharmony_ci	sleep 4
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_ci	# 6 seconds, past the original timer.
48162306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 6
48262306a36Sopenharmony_ci	check_fail $? "Group still expected to be unbalanced"
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ci	sleep 4
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci	# 10 seconds, past the new timer.
48762306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 6
48862306a36Sopenharmony_ci	check_err $? "Group expected to be balanced"
48962306a36Sopenharmony_ci
49062306a36Sopenharmony_ci	log_test "Bucket migration after $timer increase"
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
49362306a36Sopenharmony_ci}
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_ci__nexthop_res_group_decrease_timer_test()
49662306a36Sopenharmony_ci{
49762306a36Sopenharmony_ci	local timer=$1; shift
49862306a36Sopenharmony_ci
49962306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
50062306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci	RET=0
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient buckets 8 $timer 8
50562306a36Sopenharmony_ci	nexthop_res_mark_buckets_busy 10 1
50662306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2,3 type resilient
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 6
50962306a36Sopenharmony_ci	check_fail $? "Group expected to be unbalanced"
51062306a36Sopenharmony_ci
51162306a36Sopenharmony_ci	sleep 2
51262306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2,3 type resilient $timer 4
51362306a36Sopenharmony_ci	sleep 4
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_ci	# 6 seconds, past the new timer, before the old timer.
51662306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 6
51762306a36Sopenharmony_ci	check_err $? "Group expected to be balanced"
51862306a36Sopenharmony_ci
51962306a36Sopenharmony_ci	log_test "Bucket migration after $timer decrease"
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
52262306a36Sopenharmony_ci}
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci__nexthop_res_group_increase_timer_del_test()
52562306a36Sopenharmony_ci{
52662306a36Sopenharmony_ci	local timer=$1; shift
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
52962306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
53062306a36Sopenharmony_ci	$IP nexthop add id 3 via 192.0.2.3 dev dummy1
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_ci	RET=0
53362306a36Sopenharmony_ci
53462306a36Sopenharmony_ci	$IP nexthop add id 10 group 1,100/2,100/3,1 \
53562306a36Sopenharmony_ci	    type resilient buckets 8 $timer 4
53662306a36Sopenharmony_ci	nexthop_res_mark_buckets_busy 10 1
53762306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1,100/2,300/3,1 type resilient
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 6
54062306a36Sopenharmony_ci	check_fail $? "Group expected to be unbalanced"
54162306a36Sopenharmony_ci
54262306a36Sopenharmony_ci	sleep 2
54362306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2,3 type resilient $timer 8
54462306a36Sopenharmony_ci	sleep 4
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ci	# 6 seconds, past the original timer.
54762306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 6
54862306a36Sopenharmony_ci	check_fail $? "Group still expected to be unbalanced"
54962306a36Sopenharmony_ci
55062306a36Sopenharmony_ci	sleep 4
55162306a36Sopenharmony_ci
55262306a36Sopenharmony_ci	# 10 seconds, past the new timer.
55362306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 6
55462306a36Sopenharmony_ci	check_err $? "Group expected to be balanced"
55562306a36Sopenharmony_ci
55662306a36Sopenharmony_ci	log_test "Bucket migration after $timer increase"
55762306a36Sopenharmony_ci
55862306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
55962306a36Sopenharmony_ci}
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_cinexthop_res_group_increase_idle_timer_test()
56262306a36Sopenharmony_ci{
56362306a36Sopenharmony_ci	__nexthop_res_group_increase_timer_test idle_timer
56462306a36Sopenharmony_ci}
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_cinexthop_res_group_decrease_idle_timer_test()
56762306a36Sopenharmony_ci{
56862306a36Sopenharmony_ci	__nexthop_res_group_decrease_timer_test idle_timer
56962306a36Sopenharmony_ci}
57062306a36Sopenharmony_ci
57162306a36Sopenharmony_cinexthop_res_group_unbalanced_timer_test()
57262306a36Sopenharmony_ci{
57362306a36Sopenharmony_ci	local i
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
57662306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
57762306a36Sopenharmony_ci
57862306a36Sopenharmony_ci	RET=0
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient \
58162306a36Sopenharmony_ci	    buckets 8 idle_timer 6 unbalanced_timer 10
58262306a36Sopenharmony_ci	nexthop_res_mark_buckets_busy 10 1
58362306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2,3 type resilient
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci	for i in 1 2; do
58662306a36Sopenharmony_ci		sleep 4
58762306a36Sopenharmony_ci		nexthop_bucket_nhid_count_check 10  1 4  2 4
58862306a36Sopenharmony_ci		check_err $? "$i: Group expected to be unbalanced"
58962306a36Sopenharmony_ci		nexthop_res_mark_buckets_busy 10 1
59062306a36Sopenharmony_ci	done
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_ci	# 3 x sleep 4 > unbalanced timer 10
59362306a36Sopenharmony_ci	sleep 4
59462306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10  1 2  2 6
59562306a36Sopenharmony_ci	check_err $? "Group expected to be balanced"
59662306a36Sopenharmony_ci
59762306a36Sopenharmony_ci	log_test "Bucket migration after unbalanced timer"
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
60062306a36Sopenharmony_ci}
60162306a36Sopenharmony_ci
60262306a36Sopenharmony_cinexthop_res_group_unbalanced_timer_del_test()
60362306a36Sopenharmony_ci{
60462306a36Sopenharmony_ci	local i
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
60762306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
60862306a36Sopenharmony_ci	$IP nexthop add id 3 via 192.0.2.3 dev dummy1
60962306a36Sopenharmony_ci
61062306a36Sopenharmony_ci	RET=0
61162306a36Sopenharmony_ci
61262306a36Sopenharmony_ci	$IP nexthop add id 10 group 1,50/2,50/3,1 type resilient \
61362306a36Sopenharmony_ci	    buckets 8 idle_timer 6 unbalanced_timer 10
61462306a36Sopenharmony_ci	nexthop_res_mark_buckets_busy 10 1
61562306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1,50/2,150/3,1 type resilient
61662306a36Sopenharmony_ci
61762306a36Sopenharmony_ci	# Check that NH delete does not reset unbalanced time.
61862306a36Sopenharmony_ci	sleep 4
61962306a36Sopenharmony_ci	$IP nexthop delete id 3
62062306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10  1 4  2 4
62162306a36Sopenharmony_ci	check_err $? "1: Group expected to be unbalanced"
62262306a36Sopenharmony_ci	nexthop_res_mark_buckets_busy 10 1
62362306a36Sopenharmony_ci
62462306a36Sopenharmony_ci	sleep 4
62562306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10  1 4  2 4
62662306a36Sopenharmony_ci	check_err $? "2: Group expected to be unbalanced"
62762306a36Sopenharmony_ci	nexthop_res_mark_buckets_busy 10 1
62862306a36Sopenharmony_ci
62962306a36Sopenharmony_ci	# 3 x sleep 4 > unbalanced timer 10
63062306a36Sopenharmony_ci	sleep 4
63162306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10  1 2  2 6
63262306a36Sopenharmony_ci	check_err $? "Group expected to be balanced"
63362306a36Sopenharmony_ci
63462306a36Sopenharmony_ci	log_test "Bucket migration after unbalanced timer (with delete)"
63562306a36Sopenharmony_ci
63662306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
63762306a36Sopenharmony_ci}
63862306a36Sopenharmony_ci
63962306a36Sopenharmony_cinexthop_res_group_no_unbalanced_timer_test()
64062306a36Sopenharmony_ci{
64162306a36Sopenharmony_ci	local i
64262306a36Sopenharmony_ci
64362306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
64462306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
64562306a36Sopenharmony_ci
64662306a36Sopenharmony_ci	RET=0
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient buckets 8
64962306a36Sopenharmony_ci	nexthop_res_mark_buckets_busy 10 1
65062306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2,3 type resilient
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_ci	for i in $(seq 3); do
65362306a36Sopenharmony_ci		sleep 60
65462306a36Sopenharmony_ci		nexthop_bucket_nhid_count_check 10 2 6
65562306a36Sopenharmony_ci		check_fail $? "$i: Group expected to be unbalanced"
65662306a36Sopenharmony_ci		nexthop_res_mark_buckets_busy 10 1
65762306a36Sopenharmony_ci	done
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_ci	log_test "Buckets never force-migrated without unbalanced timer"
66062306a36Sopenharmony_ci
66162306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
66262306a36Sopenharmony_ci}
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_cinexthop_res_group_short_unbalanced_timer_test()
66562306a36Sopenharmony_ci{
66662306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
66762306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_ci	RET=0
67062306a36Sopenharmony_ci
67162306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient \
67262306a36Sopenharmony_ci	    buckets 8 idle_timer 120 unbalanced_timer 4
67362306a36Sopenharmony_ci	nexthop_res_mark_buckets_busy 10 1
67462306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2,3 type resilient
67562306a36Sopenharmony_ci
67662306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 6
67762306a36Sopenharmony_ci	check_fail $? "Group expected to be unbalanced"
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_ci	sleep 5
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 6
68262306a36Sopenharmony_ci	check_err $? "Group expected to be balanced"
68362306a36Sopenharmony_ci
68462306a36Sopenharmony_ci	log_test "Bucket migration after unbalanced < idle timer"
68562306a36Sopenharmony_ci
68662306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
68762306a36Sopenharmony_ci}
68862306a36Sopenharmony_ci
68962306a36Sopenharmony_cinexthop_res_group_increase_unbalanced_timer_test()
69062306a36Sopenharmony_ci{
69162306a36Sopenharmony_ci	__nexthop_res_group_increase_timer_test unbalanced_timer
69262306a36Sopenharmony_ci}
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_cinexthop_res_group_decrease_unbalanced_timer_test()
69562306a36Sopenharmony_ci{
69662306a36Sopenharmony_ci	__nexthop_res_group_decrease_timer_test unbalanced_timer
69762306a36Sopenharmony_ci}
69862306a36Sopenharmony_ci
69962306a36Sopenharmony_cinexthop_res_group_force_migrate_busy_test()
70062306a36Sopenharmony_ci{
70162306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
70262306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_ci	RET=0
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient \
70762306a36Sopenharmony_ci	    buckets 8 idle_timer 120
70862306a36Sopenharmony_ci	nexthop_res_mark_buckets_busy 10 1
70962306a36Sopenharmony_ci	$IP nexthop replace id 10 group 1/2,3 type resilient
71062306a36Sopenharmony_ci
71162306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 6
71262306a36Sopenharmony_ci	check_fail $? "Group expected to be unbalanced"
71362306a36Sopenharmony_ci
71462306a36Sopenharmony_ci	$IP nexthop replace id 10 group 2 type resilient
71562306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 8
71662306a36Sopenharmony_ci	check_err $? "All buckets expected to have migrated"
71762306a36Sopenharmony_ci
71862306a36Sopenharmony_ci	log_test "Busy buckets force-migrated when NH removed"
71962306a36Sopenharmony_ci
72062306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
72162306a36Sopenharmony_ci}
72262306a36Sopenharmony_ci
72362306a36Sopenharmony_cinexthop_single_replace_test()
72462306a36Sopenharmony_ci{
72562306a36Sopenharmony_ci	RET=0
72662306a36Sopenharmony_ci
72762306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
72862306a36Sopenharmony_ci
72962306a36Sopenharmony_ci	$IP nexthop replace id 1 via 192.0.2.3 dev dummy1
73062306a36Sopenharmony_ci	nexthop_check "id 1" "id 1 via 192.0.2.3 dev dummy1 scope link trap"
73162306a36Sopenharmony_ci	check_err $? "Unexpected nexthop entry"
73262306a36Sopenharmony_ci
73362306a36Sopenharmony_ci	nexthop_resource_check 1
73462306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
73562306a36Sopenharmony_ci
73662306a36Sopenharmony_ci	log_test "Single nexthop replace"
73762306a36Sopenharmony_ci
73862306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
73962306a36Sopenharmony_ci}
74062306a36Sopenharmony_ci
74162306a36Sopenharmony_cinexthop_single_replace_err_test()
74262306a36Sopenharmony_ci{
74362306a36Sopenharmony_ci	RET=0
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_ci	# This is supposed to cause the replace to fail because the new nexthop
74662306a36Sopenharmony_ci	# is programmed before deleting the replaced one.
74762306a36Sopenharmony_ci	nexthop_resource_set 1
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
75062306a36Sopenharmony_ci
75162306a36Sopenharmony_ci	$IP nexthop replace id 1 via 192.0.2.3 dev dummy1 &> /dev/null
75262306a36Sopenharmony_ci	check_fail $? "Nexthop replace succeeded when should fail"
75362306a36Sopenharmony_ci
75462306a36Sopenharmony_ci	nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap"
75562306a36Sopenharmony_ci	check_err $? "Unexpected nexthop entry after failure"
75662306a36Sopenharmony_ci
75762306a36Sopenharmony_ci	nexthop_resource_check 1
75862306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy after failure"
75962306a36Sopenharmony_ci
76062306a36Sopenharmony_ci	log_test "Single nexthop replace failure"
76162306a36Sopenharmony_ci
76262306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
76362306a36Sopenharmony_ci	nexthop_resource_set 9999
76462306a36Sopenharmony_ci}
76562306a36Sopenharmony_ci
76662306a36Sopenharmony_cinexthop_single_in_group_replace_test()
76762306a36Sopenharmony_ci{
76862306a36Sopenharmony_ci	RET=0
76962306a36Sopenharmony_ci
77062306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
77162306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
77262306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2
77362306a36Sopenharmony_ci
77462306a36Sopenharmony_ci	$IP nexthop replace id 1 via 192.0.2.4 dev dummy1
77562306a36Sopenharmony_ci	check_err $? "Failed to replace nexthop when should not"
77662306a36Sopenharmony_ci
77762306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 1/2 trap"
77862306a36Sopenharmony_ci	check_err $? "Unexpected nexthop group entry"
77962306a36Sopenharmony_ci
78062306a36Sopenharmony_ci	nexthop_resource_check 4
78162306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
78262306a36Sopenharmony_ci
78362306a36Sopenharmony_ci	log_test "Single nexthop replace while in group"
78462306a36Sopenharmony_ci
78562306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
78662306a36Sopenharmony_ci}
78762306a36Sopenharmony_ci
78862306a36Sopenharmony_cinexthop_single_in_group_replace_err_test()
78962306a36Sopenharmony_ci{
79062306a36Sopenharmony_ci	RET=0
79162306a36Sopenharmony_ci
79262306a36Sopenharmony_ci	nexthop_resource_set 5
79362306a36Sopenharmony_ci
79462306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
79562306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
79662306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2
79762306a36Sopenharmony_ci
79862306a36Sopenharmony_ci	$IP nexthop replace id 1 via 192.0.2.4 dev dummy1 &> /dev/null
79962306a36Sopenharmony_ci	check_fail $? "Nexthop replacement succeeded when should fail"
80062306a36Sopenharmony_ci
80162306a36Sopenharmony_ci	nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap"
80262306a36Sopenharmony_ci	check_err $? "Unexpected nexthop entry after failure"
80362306a36Sopenharmony_ci
80462306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 1/2 trap"
80562306a36Sopenharmony_ci	check_err $? "Unexpected nexthop group entry after failure"
80662306a36Sopenharmony_ci
80762306a36Sopenharmony_ci	nexthop_resource_check 4
80862306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
80962306a36Sopenharmony_ci
81062306a36Sopenharmony_ci	log_test "Single nexthop replace while in group failure"
81162306a36Sopenharmony_ci
81262306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
81362306a36Sopenharmony_ci	nexthop_resource_set 9999
81462306a36Sopenharmony_ci}
81562306a36Sopenharmony_ci
81662306a36Sopenharmony_cinexthop_single_in_res_group_replace_test()
81762306a36Sopenharmony_ci{
81862306a36Sopenharmony_ci	RET=0
81962306a36Sopenharmony_ci
82062306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
82162306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
82262306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient buckets 4
82362306a36Sopenharmony_ci
82462306a36Sopenharmony_ci	$IP nexthop replace id 1 via 192.0.2.4 dev dummy1
82562306a36Sopenharmony_ci	check_err $? "Failed to replace nexthop when should not"
82662306a36Sopenharmony_ci
82762306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 1/2 type resilient buckets 4 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap"
82862306a36Sopenharmony_ci	check_err $? "Unexpected nexthop group entry"
82962306a36Sopenharmony_ci
83062306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10  1 2  2 2
83162306a36Sopenharmony_ci	check_err $? "Wrong nexthop buckets count"
83262306a36Sopenharmony_ci
83362306a36Sopenharmony_ci	nexthop_resource_check 6
83462306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
83562306a36Sopenharmony_ci
83662306a36Sopenharmony_ci	log_test "Single nexthop replace while in resilient group"
83762306a36Sopenharmony_ci
83862306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
83962306a36Sopenharmony_ci}
84062306a36Sopenharmony_ci
84162306a36Sopenharmony_cinexthop_single_in_res_group_replace_err_test()
84262306a36Sopenharmony_ci{
84362306a36Sopenharmony_ci	RET=0
84462306a36Sopenharmony_ci
84562306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
84662306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
84762306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient buckets 4
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_ci	ip netns exec testns1 \
85062306a36Sopenharmony_ci		echo 1 > $DEBUGFS_NET_DIR/fib/fail_nexthop_bucket_replace
85162306a36Sopenharmony_ci	$IP nexthop replace id 1 via 192.0.2.4 dev dummy1 &> /dev/null
85262306a36Sopenharmony_ci	check_fail $? "Nexthop replacement succeeded when should fail"
85362306a36Sopenharmony_ci
85462306a36Sopenharmony_ci	nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap"
85562306a36Sopenharmony_ci	check_err $? "Unexpected nexthop entry after failure"
85662306a36Sopenharmony_ci
85762306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 1/2 type resilient buckets 4 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap"
85862306a36Sopenharmony_ci	check_err $? "Unexpected nexthop group entry after failure"
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10  1 2  2 2
86162306a36Sopenharmony_ci	check_err $? "Wrong nexthop buckets count"
86262306a36Sopenharmony_ci
86362306a36Sopenharmony_ci	nexthop_resource_check 6
86462306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
86562306a36Sopenharmony_ci
86662306a36Sopenharmony_ci	log_test "Single nexthop replace while in resilient group failure"
86762306a36Sopenharmony_ci
86862306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
86962306a36Sopenharmony_ci	ip netns exec testns1 \
87062306a36Sopenharmony_ci		echo 0 > $DEBUGFS_NET_DIR/fib/fail_nexthop_bucket_replace
87162306a36Sopenharmony_ci}
87262306a36Sopenharmony_ci
87362306a36Sopenharmony_cinexthop_single_in_group_delete_test()
87462306a36Sopenharmony_ci{
87562306a36Sopenharmony_ci	RET=0
87662306a36Sopenharmony_ci
87762306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
87862306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
87962306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2
88062306a36Sopenharmony_ci
88162306a36Sopenharmony_ci	$IP nexthop del id 1
88262306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 2 trap"
88362306a36Sopenharmony_ci	check_err $? "Unexpected nexthop group entry"
88462306a36Sopenharmony_ci
88562306a36Sopenharmony_ci	nexthop_resource_check 2
88662306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
88762306a36Sopenharmony_ci
88862306a36Sopenharmony_ci	log_test "Single nexthop delete while in group"
88962306a36Sopenharmony_ci
89062306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
89162306a36Sopenharmony_ci}
89262306a36Sopenharmony_ci
89362306a36Sopenharmony_cinexthop_single_in_group_delete_err_test()
89462306a36Sopenharmony_ci{
89562306a36Sopenharmony_ci	RET=0
89662306a36Sopenharmony_ci
89762306a36Sopenharmony_ci	# First, nexthop 1 will be deleted, which will reduce the occupancy to
89862306a36Sopenharmony_ci	# 5. Afterwards, a replace notification will be sent for nexthop group
89962306a36Sopenharmony_ci	# 10 with only two nexthops. Since the new group is allocated before
90062306a36Sopenharmony_ci	# the old is deleted, the replacement will fail as it will result in an
90162306a36Sopenharmony_ci	# occupancy of 7.
90262306a36Sopenharmony_ci	nexthop_resource_set 6
90362306a36Sopenharmony_ci
90462306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
90562306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
90662306a36Sopenharmony_ci	$IP nexthop add id 3 via 192.0.2.4 dev dummy1
90762306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2/3
90862306a36Sopenharmony_ci
90962306a36Sopenharmony_ci	$IP nexthop del id 1
91062306a36Sopenharmony_ci
91162306a36Sopenharmony_ci	nexthop_resource_check 5
91262306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_ci	log_test "Single nexthop delete while in group failure"
91562306a36Sopenharmony_ci
91662306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
91762306a36Sopenharmony_ci	nexthop_resource_set 9999
91862306a36Sopenharmony_ci}
91962306a36Sopenharmony_ci
92062306a36Sopenharmony_cinexthop_single_in_res_group_delete_test()
92162306a36Sopenharmony_ci{
92262306a36Sopenharmony_ci	RET=0
92362306a36Sopenharmony_ci
92462306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
92562306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
92662306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2 type resilient buckets 4
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_ci	$IP nexthop del id 1
92962306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 2 type resilient buckets 4 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap"
93062306a36Sopenharmony_ci	check_err $? "Unexpected nexthop group entry"
93162306a36Sopenharmony_ci
93262306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10 2 4
93362306a36Sopenharmony_ci	check_err $? "Wrong nexthop buckets count"
93462306a36Sopenharmony_ci
93562306a36Sopenharmony_ci	nexthop_resource_check 5
93662306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
93762306a36Sopenharmony_ci
93862306a36Sopenharmony_ci	log_test "Single nexthop delete while in resilient group"
93962306a36Sopenharmony_ci
94062306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
94162306a36Sopenharmony_ci}
94262306a36Sopenharmony_ci
94362306a36Sopenharmony_cinexthop_single_in_res_group_delete_err_test()
94462306a36Sopenharmony_ci{
94562306a36Sopenharmony_ci	RET=0
94662306a36Sopenharmony_ci
94762306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
94862306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
94962306a36Sopenharmony_ci	$IP nexthop add id 3 via 192.0.2.4 dev dummy1
95062306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2/3 type resilient buckets 6
95162306a36Sopenharmony_ci
95262306a36Sopenharmony_ci	ip netns exec testns1 \
95362306a36Sopenharmony_ci		echo 1 > $DEBUGFS_NET_DIR/fib/fail_nexthop_bucket_replace
95462306a36Sopenharmony_ci	$IP nexthop del id 1
95562306a36Sopenharmony_ci
95662306a36Sopenharmony_ci	# We failed to replace the two nexthop buckets that were originally
95762306a36Sopenharmony_ci	# assigned to nhid 1.
95862306a36Sopenharmony_ci	nexthop_bucket_nhid_count_check 10  2 2  3 2
95962306a36Sopenharmony_ci	check_err $? "Wrong nexthop buckets count"
96062306a36Sopenharmony_ci
96162306a36Sopenharmony_ci	nexthop_resource_check 8
96262306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
96362306a36Sopenharmony_ci
96462306a36Sopenharmony_ci	log_test "Single nexthop delete while in resilient group failure"
96562306a36Sopenharmony_ci
96662306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
96762306a36Sopenharmony_ci	ip netns exec testns1 \
96862306a36Sopenharmony_ci		echo 0 > $DEBUGFS_NET_DIR/fib/fail_nexthop_bucket_replace
96962306a36Sopenharmony_ci}
97062306a36Sopenharmony_ci
97162306a36Sopenharmony_cinexthop_replay_test()
97262306a36Sopenharmony_ci{
97362306a36Sopenharmony_ci	RET=0
97462306a36Sopenharmony_ci
97562306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
97662306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
97762306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2
97862306a36Sopenharmony_ci
97962306a36Sopenharmony_ci	$DEVLINK dev reload $DEVLINK_DEV
98062306a36Sopenharmony_ci	check_err $? "Failed to reload when should not"
98162306a36Sopenharmony_ci
98262306a36Sopenharmony_ci	nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap"
98362306a36Sopenharmony_ci	check_err $? "Unexpected nexthop entry after reload"
98462306a36Sopenharmony_ci
98562306a36Sopenharmony_ci	nexthop_check "id 2" "id 2 via 192.0.2.3 dev dummy1 scope link trap"
98662306a36Sopenharmony_ci	check_err $? "Unexpected nexthop entry after reload"
98762306a36Sopenharmony_ci
98862306a36Sopenharmony_ci	nexthop_check "id 10" "id 10 group 1/2 trap"
98962306a36Sopenharmony_ci	check_err $? "Unexpected nexthop group entry after reload"
99062306a36Sopenharmony_ci
99162306a36Sopenharmony_ci	nexthop_resource_check 4
99262306a36Sopenharmony_ci	check_err $? "Wrong nexthop occupancy"
99362306a36Sopenharmony_ci
99462306a36Sopenharmony_ci	log_test "Nexthop replay"
99562306a36Sopenharmony_ci
99662306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
99762306a36Sopenharmony_ci}
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_cinexthop_replay_err_test()
100062306a36Sopenharmony_ci{
100162306a36Sopenharmony_ci	RET=0
100262306a36Sopenharmony_ci
100362306a36Sopenharmony_ci	$IP nexthop add id 1 via 192.0.2.2 dev dummy1
100462306a36Sopenharmony_ci	$IP nexthop add id 2 via 192.0.2.3 dev dummy1
100562306a36Sopenharmony_ci	$IP nexthop add id 10 group 1/2
100662306a36Sopenharmony_ci
100762306a36Sopenharmony_ci	# Reduce size of nexthop resource so that reload will fail.
100862306a36Sopenharmony_ci	$DEVLINK resource set $DEVLINK_DEV path nexthops size 3
100962306a36Sopenharmony_ci	$DEVLINK dev reload $DEVLINK_DEV &> /dev/null
101062306a36Sopenharmony_ci	check_fail $? "Reload succeeded when should fail"
101162306a36Sopenharmony_ci
101262306a36Sopenharmony_ci	$DEVLINK resource set $DEVLINK_DEV path nexthops size 9999
101362306a36Sopenharmony_ci	$DEVLINK dev reload $DEVLINK_DEV
101462306a36Sopenharmony_ci	check_err $? "Failed to reload when should not"
101562306a36Sopenharmony_ci
101662306a36Sopenharmony_ci	log_test "Nexthop replay failure"
101762306a36Sopenharmony_ci
101862306a36Sopenharmony_ci	$IP nexthop flush &> /dev/null
101962306a36Sopenharmony_ci}
102062306a36Sopenharmony_ci
102162306a36Sopenharmony_cisetup_prepare()
102262306a36Sopenharmony_ci{
102362306a36Sopenharmony_ci	local netdev
102462306a36Sopenharmony_ci
102562306a36Sopenharmony_ci	modprobe netdevsim &> /dev/null
102662306a36Sopenharmony_ci
102762306a36Sopenharmony_ci	echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device
102862306a36Sopenharmony_ci	while [ ! -d $SYSFS_NET_DIR ] ; do :; done
102962306a36Sopenharmony_ci
103062306a36Sopenharmony_ci	set -e
103162306a36Sopenharmony_ci
103262306a36Sopenharmony_ci	ip netns add testns1
103362306a36Sopenharmony_ci	devlink dev reload $DEVLINK_DEV netns testns1
103462306a36Sopenharmony_ci
103562306a36Sopenharmony_ci	IP="ip -netns testns1"
103662306a36Sopenharmony_ci	DEVLINK="devlink -N testns1"
103762306a36Sopenharmony_ci
103862306a36Sopenharmony_ci	$IP link add name dummy1 up type dummy
103962306a36Sopenharmony_ci	$IP address add 192.0.2.1/24 dev dummy1
104062306a36Sopenharmony_ci
104162306a36Sopenharmony_ci	set +e
104262306a36Sopenharmony_ci}
104362306a36Sopenharmony_ci
104462306a36Sopenharmony_cicleanup()
104562306a36Sopenharmony_ci{
104662306a36Sopenharmony_ci	pre_cleanup
104762306a36Sopenharmony_ci	ip netns del testns1
104862306a36Sopenharmony_ci	echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device
104962306a36Sopenharmony_ci	modprobe -r netdevsim &> /dev/null
105062306a36Sopenharmony_ci}
105162306a36Sopenharmony_ci
105262306a36Sopenharmony_citrap cleanup EXIT
105362306a36Sopenharmony_ci
105462306a36Sopenharmony_cisetup_prepare
105562306a36Sopenharmony_ci
105662306a36Sopenharmony_citests_run
105762306a36Sopenharmony_ci
105862306a36Sopenharmony_ciexit $EXIT_STATUS
1059