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
58bail_on_lldpad()
59{
60	if systemctl is-active --quiet lldpad; then
61
62		cat >/dev/stderr <<-EOF
63		WARNING: lldpad is running
64
65			lldpad will likely configure DCB, and this test will
66			configure Qdiscs. mlxsw does not support both at the
67			same time, one of them is arbitrarily going to overwrite
68			the other. That will cause spurious failures (or,
69			unlikely, passes) of this test.
70		EOF
71
72		if [[ -z $ALLOW_LLDPAD ]]; then
73			cat >/dev/stderr <<-EOF
74
75				If you want to run the test anyway, please set
76				an environment variable ALLOW_LLDPAD to a
77				non-empty string.
78			EOF
79			exit 1
80		else
81			return
82		fi
83	fi
84}
85
86__mlnx_qos()
87{
88	local err
89
90	mlnx_qos "$@" 2>/dev/null
91	err=$?
92
93	if ((err)); then
94		echo "Error ($err) in mlnx_qos $@" >/dev/stderr
95	fi
96
97	return $err
98}
99