# SPDX-License-Identifier: GPL-2.0 nh_stats_do_test() { local what=$1; shift local nh1_id=$1; shift local nh2_id=$1; shift local group_id=$1; shift local stats_get=$1; shift local mz="$@" local dp RET=0 sleep 2 for ((dp=0; dp < 60000; dp += 10000)); do local dd local t0_rp12=$(link_stats_tx_packets_get $rp12) local t0_rp13=$(link_stats_tx_packets_get $rp13) local t0_nh1=$($stats_get $group_id $nh1_id) local t0_nh2=$($stats_get $group_id $nh2_id) ip vrf exec vrf-h1 \ $mz -q -p 64 -d 0 -t udp \ "sp=1024,dp=$((dp))-$((dp + 10000))" sleep 2 local t1_rp12=$(link_stats_tx_packets_get $rp12) local t1_rp13=$(link_stats_tx_packets_get $rp13) local t1_nh1=$($stats_get $group_id $nh1_id) local t1_nh2=$($stats_get $group_id $nh2_id) local d_rp12=$((t1_rp12 - t0_rp12)) local d_rp13=$((t1_rp13 - t0_rp13)) local d_nh1=$((t1_nh1 - t0_nh1)) local d_nh2=$((t1_nh2 - t0_nh2)) dd=$(absval $((d_rp12 - d_nh1))) ((dd < 10)) check_err $? "Discrepancy between link and $stats_get: d_rp12=$d_rp12 d_nh1=$d_nh1" dd=$(absval $((d_rp13 - d_nh2))) ((dd < 10)) check_err $? "Discrepancy between link and $stats_get: d_rp13=$d_rp13 d_nh2=$d_nh2" done log_test "NH stats test $what" } nh_stats_test_dispatch_swhw() { local what=$1; shift local nh1_id=$1; shift local nh2_id=$1; shift local group_id=$1; shift local mz="$@" nh_stats_do_test "$what" "$nh1_id" "$nh2_id" "$group_id" \ nh_stats_get "${mz[@]}" xfail_on_veth $rp11 \ nh_stats_do_test "HW $what" "$nh1_id" "$nh2_id" "$group_id" \ nh_stats_get_hw "${mz[@]}" } nh_stats_test_dispatch() { local nhgtype=$1; shift local what=$1; shift local nh1_id=$1; shift local nh2_id=$1; shift local group_id=$1; shift local mz="$@" local enabled if ! ip nexthop help 2>&1 | grep -q hw_stats; then log_test_skip "NH stats test: ip doesn't support HW stats" return fi ip nexthop replace id $group_id group $nh1_id/$nh2_id \ hw_stats on type $nhgtype enabled=$(ip -s -j -d nexthop show id $group_id | jq '.[].hw_stats.enabled') if [[ $enabled == true ]]; then nh_stats_test_dispatch_swhw "$what" "$nh1_id" "$nh2_id" \ "$group_id" "${mz[@]}" elif [[ $enabled == false ]]; then check_err 1 "HW stats still disabled after enabling" log_test "NH stats test" else log_test_skip "NH stats test: ip doesn't report hw_stats info" fi ip nexthop replace id $group_id group $nh1_id/$nh2_id \ hw_stats off type $nhgtype } __nh_stats_test_v4() { local nhgtype=$1; shift sysctl_set net.ipv4.fib_multipath_hash_policy 1 nh_stats_test_dispatch $nhgtype "IPv4" 101 102 103 \ $MZ $h1 -A 192.0.2.2 -B 198.51.100.2 sysctl_restore net.ipv4.fib_multipath_hash_policy } __nh_stats_test_v6() { local nhgtype=$1; shift sysctl_set net.ipv6.fib_multipath_hash_policy 1 nh_stats_test_dispatch $nhgtype "IPv6" 104 105 106 \ $MZ -6 $h1 -A 2001:db8:1::2 -B 2001:db8:2::2 sysctl_restore net.ipv6.fib_multipath_hash_policy } check_nhgw16() { local nhid=$1; shift ip nexthop replace id 9999 group "$nhid,65535" &>/dev/null if (( $? )); then log_test_skip "16-bit multipath tests" \ "iproute2 or the kernel do not support 16-bit next hop weights" return 1 fi ip nexthop del id 9999 ||: }