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