1a22b0426SPetr Machata# SPDX-License-Identifier: GPL-2.0 2a22b0426SPetr Machata 3a22b0426SPetr Machatanh_stats_do_test() 4a22b0426SPetr Machata{ 5a22b0426SPetr Machata local what=$1; shift 6a22b0426SPetr Machata local nh1_id=$1; shift 7a22b0426SPetr Machata local nh2_id=$1; shift 8a22b0426SPetr Machata local group_id=$1; shift 9a22b0426SPetr Machata local stats_get=$1; shift 10a22b0426SPetr Machata local mz="$@" 11a22b0426SPetr Machata 12a22b0426SPetr Machata local dp 13a22b0426SPetr Machata 14a22b0426SPetr Machata RET=0 15a22b0426SPetr Machata 16a22b0426SPetr Machata sleep 2 17a22b0426SPetr Machata for ((dp=0; dp < 60000; dp += 10000)); do 18a22b0426SPetr Machata local dd 19a22b0426SPetr Machata local t0_rp12=$(link_stats_tx_packets_get $rp12) 20a22b0426SPetr Machata local t0_rp13=$(link_stats_tx_packets_get $rp13) 21a22b0426SPetr Machata local t0_nh1=$($stats_get $group_id $nh1_id) 22a22b0426SPetr Machata local t0_nh2=$($stats_get $group_id $nh2_id) 23a22b0426SPetr Machata 24a22b0426SPetr Machata ip vrf exec vrf-h1 \ 25a22b0426SPetr Machata $mz -q -p 64 -d 0 -t udp \ 26a22b0426SPetr Machata "sp=1024,dp=$((dp))-$((dp + 10000))" 27a22b0426SPetr Machata sleep 2 28a22b0426SPetr Machata 29a22b0426SPetr Machata local t1_rp12=$(link_stats_tx_packets_get $rp12) 30a22b0426SPetr Machata local t1_rp13=$(link_stats_tx_packets_get $rp13) 31a22b0426SPetr Machata local t1_nh1=$($stats_get $group_id $nh1_id) 32a22b0426SPetr Machata local t1_nh2=$($stats_get $group_id $nh2_id) 33a22b0426SPetr Machata 34a22b0426SPetr Machata local d_rp12=$((t1_rp12 - t0_rp12)) 35a22b0426SPetr Machata local d_rp13=$((t1_rp13 - t0_rp13)) 36a22b0426SPetr Machata local d_nh1=$((t1_nh1 - t0_nh1)) 37a22b0426SPetr Machata local d_nh2=$((t1_nh2 - t0_nh2)) 38a22b0426SPetr Machata 39a22b0426SPetr Machata dd=$(absval $((d_rp12 - d_nh1))) 40a22b0426SPetr Machata ((dd < 10)) 41a22b0426SPetr Machata check_err $? "Discrepancy between link and $stats_get: d_rp12=$d_rp12 d_nh1=$d_nh1" 42a22b0426SPetr Machata 43a22b0426SPetr Machata dd=$(absval $((d_rp13 - d_nh2))) 44a22b0426SPetr Machata ((dd < 10)) 45a22b0426SPetr Machata check_err $? "Discrepancy between link and $stats_get: d_rp13=$d_rp13 d_nh2=$d_nh2" 46a22b0426SPetr Machata done 47a22b0426SPetr Machata 48a22b0426SPetr Machata log_test "NH stats test $what" 49a22b0426SPetr Machata} 50a22b0426SPetr Machata 51a22b0426SPetr Machatanh_stats_test_dispatch_swhw() 52a22b0426SPetr Machata{ 53a22b0426SPetr Machata local what=$1; shift 54a22b0426SPetr Machata local nh1_id=$1; shift 55a22b0426SPetr Machata local nh2_id=$1; shift 56a22b0426SPetr Machata local group_id=$1; shift 57a22b0426SPetr Machata local mz="$@" 58a22b0426SPetr Machata 59a22b0426SPetr Machata nh_stats_do_test "$what" "$nh1_id" "$nh2_id" "$group_id" \ 60a22b0426SPetr Machata nh_stats_get "${mz[@]}" 61a22b0426SPetr Machata 62*6db870bbSPetr Machata xfail_on_veth $rp11 \ 63a22b0426SPetr Machata nh_stats_do_test "HW $what" "$nh1_id" "$nh2_id" "$group_id" \ 64a22b0426SPetr Machata nh_stats_get_hw "${mz[@]}" 65a22b0426SPetr Machata} 66a22b0426SPetr Machata 67a22b0426SPetr Machatanh_stats_test_dispatch() 68a22b0426SPetr Machata{ 69a22b0426SPetr Machata local nhgtype=$1; shift 70a22b0426SPetr Machata local what=$1; shift 71a22b0426SPetr Machata local nh1_id=$1; shift 72a22b0426SPetr Machata local nh2_id=$1; shift 73a22b0426SPetr Machata local group_id=$1; shift 74a22b0426SPetr Machata local mz="$@" 75a22b0426SPetr Machata 76a22b0426SPetr Machata local enabled 77a22b0426SPetr Machata 78a22b0426SPetr Machata if ! ip nexthop help 2>&1 | grep -q hw_stats; then 79a22b0426SPetr Machata log_test_skip "NH stats test: ip doesn't support HW stats" 80a22b0426SPetr Machata return 81a22b0426SPetr Machata fi 82a22b0426SPetr Machata 83a22b0426SPetr Machata ip nexthop replace id $group_id group $nh1_id/$nh2_id \ 84a22b0426SPetr Machata hw_stats on type $nhgtype 85a22b0426SPetr Machata enabled=$(ip -s -j -d nexthop show id $group_id | 86a22b0426SPetr Machata jq '.[].hw_stats.enabled') 87a22b0426SPetr Machata if [[ $enabled == true ]]; then 88a22b0426SPetr Machata nh_stats_test_dispatch_swhw "$what" "$nh1_id" "$nh2_id" \ 89a22b0426SPetr Machata "$group_id" "${mz[@]}" 90a22b0426SPetr Machata elif [[ $enabled == false ]]; then 91a22b0426SPetr Machata check_err 1 "HW stats still disabled after enabling" 92a22b0426SPetr Machata log_test "NH stats test" 93a22b0426SPetr Machata else 94a22b0426SPetr Machata log_test_skip "NH stats test: ip doesn't report hw_stats info" 95a22b0426SPetr Machata fi 96a22b0426SPetr Machata 97a22b0426SPetr Machata ip nexthop replace id $group_id group $nh1_id/$nh2_id \ 98a22b0426SPetr Machata hw_stats off type $nhgtype 99a22b0426SPetr Machata} 100a22b0426SPetr Machata 101a22b0426SPetr Machata__nh_stats_test_v4() 102a22b0426SPetr Machata{ 103a22b0426SPetr Machata local nhgtype=$1; shift 104a22b0426SPetr Machata 105a22b0426SPetr Machata sysctl_set net.ipv4.fib_multipath_hash_policy 1 106a22b0426SPetr Machata nh_stats_test_dispatch $nhgtype "IPv4" 101 102 103 \ 107a22b0426SPetr Machata $MZ $h1 -A 192.0.2.2 -B 198.51.100.2 108a22b0426SPetr Machata sysctl_restore net.ipv4.fib_multipath_hash_policy 109a22b0426SPetr Machata} 110a22b0426SPetr Machata 111a22b0426SPetr Machata__nh_stats_test_v6() 112a22b0426SPetr Machata{ 113a22b0426SPetr Machata local nhgtype=$1; shift 114a22b0426SPetr Machata 115a22b0426SPetr Machata sysctl_set net.ipv6.fib_multipath_hash_policy 1 116a22b0426SPetr Machata nh_stats_test_dispatch $nhgtype "IPv6" 104 105 106 \ 117a22b0426SPetr Machata $MZ -6 $h1 -A 2001:db8:1::2 -B 2001:db8:2::2 118a22b0426SPetr Machata sysctl_restore net.ipv6.fib_multipath_hash_policy 119a22b0426SPetr Machata} 120