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