1# SPDX-License-Identifier: GPL-2.0
2
3check_rate()
4{
5	local rate=$1; shift
6	local min=$1; shift
7	local what=$1; shift
8
9	if ((rate > min)); then
10		return 0
11	fi
12
13	echo "$what $(humanize $ir) < $(humanize $min)" > /dev/stderr
14	return 1
15}
16
17measure_rate()
18{
19	local sw_in=$1; shift   # Where the traffic ingresses the switch
20	local host_in=$1; shift # Where it ingresses another host
21	local counter=$1; shift # Counter to use for measurement
22	local what=$1; shift
23
24	local interval=10
25	local i
26	local ret=0
27
28	# Dips in performance might cause momentary ingress rate to drop below
29	# 1Gbps. That wouldn't saturate egress and MC would thus get through,
30	# seemingly winning bandwidth on account of UC. Demand at least 2Gbps
31	# average ingress rate to somewhat mitigate this.
32	local min_ingress=2147483648
33
34	for i in {5..0}; do
35		local t0=$(ethtool_stats_get $host_in $counter)
36		local u0=$(ethtool_stats_get $sw_in $counter)
37		sleep $interval
38		local t1=$(ethtool_stats_get $host_in $counter)
39		local u1=$(ethtool_stats_get $sw_in $counter)
40
41		local ir=$(rate $u0 $u1 $interval)
42		local er=$(rate $t0 $t1 $interval)
43
44		if check_rate $ir $min_ingress "$what ingress rate"; then
45			break
46		fi
47
48		# Fail the test if we can't get the throughput.
49		if ((i == 0)); then
50			ret=1
51		fi
52	done
53
54	echo $ir $er
55	return $ret
56}
57