xref: /linux/tools/testing/selftests/drivers/net/hw/ethtool_std_stats.sh (revision 91a4855d6c03e770e42f17c798a36a3c46e63de2)
1*3016574eSIoana Ciornei#!/bin/bash
2*3016574eSIoana Ciornei# SPDX-License-Identifier: GPL-2.0
3*3016574eSIoana Ciornei#shellcheck disable=SC2034 # SC does not see the global variables
4*3016574eSIoana Ciornei#shellcheck disable=SC2317,SC2329 # unused functions
5*3016574eSIoana Ciornei
6*3016574eSIoana CiorneiALL_TESTS="
7*3016574eSIoana Ciornei	test_eth_ctrl_stats
8*3016574eSIoana Ciornei	test_eth_mac_stats
9*3016574eSIoana Ciornei	test_pause_stats
10*3016574eSIoana Ciornei"
11*3016574eSIoana Ciornei: "${DRIVER_TEST_CONFORMANT:=yes}"
12*3016574eSIoana CiorneiSTABLE_MAC_ADDRS=yes
13*3016574eSIoana CiorneiNUM_NETIFS=2
14*3016574eSIoana Ciorneilib_dir=$(dirname "$0")
15*3016574eSIoana Ciornei# shellcheck source=./../../../net/forwarding/lib.sh
16*3016574eSIoana Ciorneisource "$lib_dir"/../../../net/forwarding/lib.sh
17*3016574eSIoana Ciornei# shellcheck source=./../../../kselftest/ktap_helpers.sh
18*3016574eSIoana Ciorneisource "$lib_dir"/../../../kselftest/ktap_helpers.sh
19*3016574eSIoana Ciornei
20*3016574eSIoana CiorneiUINT32_MAX=$((2**32 - 1))
21*3016574eSIoana CiorneiSUBTESTS=0
22*3016574eSIoana CiorneiTEST_NAME=$(basename "$0" .sh)
23*3016574eSIoana Ciornei
24*3016574eSIoana Ciorneitraffic_test()
25*3016574eSIoana Ciornei{
26*3016574eSIoana Ciornei	local iface=$1; shift
27*3016574eSIoana Ciornei	local neigh=$1; shift
28*3016574eSIoana Ciornei	local num_tx=$1; shift
29*3016574eSIoana Ciornei	local pkt_format="$1"; shift
30*3016574eSIoana Ciornei	local -a counters=("$@")
31*3016574eSIoana Ciornei	local int grp cnt target exact_check
32*3016574eSIoana Ciornei	local before after delta
33*3016574eSIoana Ciornei	local num_rx=$((num_tx * 2))
34*3016574eSIoana Ciornei	local xfail_message
35*3016574eSIoana Ciornei	local src="aggregate"
36*3016574eSIoana Ciornei	local i
37*3016574eSIoana Ciornei
38*3016574eSIoana Ciornei	for i in "${!counters[@]}"; do
39*3016574eSIoana Ciornei		read -r int grp cnt target exact_check xfail_message \
40*3016574eSIoana Ciornei			<<< "${counters[$i]}"
41*3016574eSIoana Ciornei
42*3016574eSIoana Ciornei		before[i]=$(ethtool_std_stats_get "$int" "$grp" "$cnt" "$src")
43*3016574eSIoana Ciornei	done
44*3016574eSIoana Ciornei
45*3016574eSIoana Ciornei	# shellcheck disable=SC2086 # needs split options
46*3016574eSIoana Ciornei	run_on "$iface" "$MZ" "$iface" -q -c "$num_tx" $pkt_format
47*3016574eSIoana Ciornei
48*3016574eSIoana Ciornei	# shellcheck disable=SC2086 # needs split options
49*3016574eSIoana Ciornei	run_on "$neigh" "$MZ" "$neigh" -q -c "$num_rx" $pkt_format
50*3016574eSIoana Ciornei
51*3016574eSIoana Ciornei	for i in "${!counters[@]}"; do
52*3016574eSIoana Ciornei		read -r int grp cnt target exact_check xfail_message \
53*3016574eSIoana Ciornei			<<< "${counters[$i]}"
54*3016574eSIoana Ciornei
55*3016574eSIoana Ciornei		after[i]=$(ethtool_std_stats_get "$int" "$grp" "$cnt" "$src")
56*3016574eSIoana Ciornei		if [[ "${after[$i]}" == "null" ]]; then
57*3016574eSIoana Ciornei			ktap_test_skip "$TEST_NAME.$grp-$cnt"
58*3016574eSIoana Ciornei			continue;
59*3016574eSIoana Ciornei		fi
60*3016574eSIoana Ciornei
61*3016574eSIoana Ciornei		delta=$((after[i] - before[i]))
62*3016574eSIoana Ciornei
63*3016574eSIoana Ciornei		if [ "$exact_check" -ne 0 ]; then
64*3016574eSIoana Ciornei			[ "$delta" -eq "$target" ]
65*3016574eSIoana Ciornei		else
66*3016574eSIoana Ciornei			[ "$delta" -ge "$target" ] && \
67*3016574eSIoana Ciornei			[ "$delta" -le "$UINT32_MAX" ]
68*3016574eSIoana Ciornei		fi
69*3016574eSIoana Ciornei		err="$?"
70*3016574eSIoana Ciornei
71*3016574eSIoana Ciornei		if [[ $err != 0  ]] && [[ -n $xfail_message ]]; then
72*3016574eSIoana Ciornei			ktap_print_msg "$xfail_message"
73*3016574eSIoana Ciornei			ktap_test_xfail "$TEST_NAME.$grp-$cnt"
74*3016574eSIoana Ciornei			continue;
75*3016574eSIoana Ciornei		fi
76*3016574eSIoana Ciornei
77*3016574eSIoana Ciornei		if [[ $err != 0 ]]; then
78*3016574eSIoana Ciornei			ktap_print_msg "$grp-$cnt is not valid on $int (expected $target, got $delta)"
79*3016574eSIoana Ciornei			ktap_test_fail "$TEST_NAME.$grp-$cnt"
80*3016574eSIoana Ciornei		else
81*3016574eSIoana Ciornei			ktap_test_pass "$TEST_NAME.$grp-$cnt"
82*3016574eSIoana Ciornei		fi
83*3016574eSIoana Ciornei	done
84*3016574eSIoana Ciornei}
85*3016574eSIoana Ciornei
86*3016574eSIoana Ciorneitest_eth_ctrl_stats()
87*3016574eSIoana Ciornei{
88*3016574eSIoana Ciornei	local pkt_format="-a own -b bcast 88:08 -p 64"
89*3016574eSIoana Ciornei	local num_pkts=1000
90*3016574eSIoana Ciornei	local -a counters
91*3016574eSIoana Ciornei
92*3016574eSIoana Ciornei	counters=("$h1 eth-ctrl MACControlFramesTransmitted $num_pkts 0")
93*3016574eSIoana Ciornei	traffic_test "$h1" "$h2" "$num_pkts" "$pkt_format" \
94*3016574eSIoana Ciornei		"${counters[@]}"
95*3016574eSIoana Ciornei
96*3016574eSIoana Ciornei	counters=("$h1 eth-ctrl MACControlFramesReceived $num_pkts 0")
97*3016574eSIoana Ciornei	traffic_test "$h2" "$h1" "$num_pkts" "$pkt_format" \
98*3016574eSIoana Ciornei		"${counters[@]}"
99*3016574eSIoana Ciornei}
100*3016574eSIoana CiorneiSUBTESTS=$((SUBTESTS + 2))
101*3016574eSIoana Ciornei
102*3016574eSIoana Ciorneitest_eth_mac_stats()
103*3016574eSIoana Ciornei{
104*3016574eSIoana Ciornei	local pkt_size=100
105*3016574eSIoana Ciornei	local pkt_size_fcs=$((pkt_size + 4))
106*3016574eSIoana Ciornei	local bcast_pkt_format="-a own -b bcast -p $pkt_size"
107*3016574eSIoana Ciornei	local mcast_pkt_format="-a own -b 01:00:5E:00:00:01 -p $pkt_size"
108*3016574eSIoana Ciornei	local num_pkts=2000
109*3016574eSIoana Ciornei	local octets=$((pkt_size_fcs * num_pkts))
110*3016574eSIoana Ciornei	local -a counters error_cnt collision_cnt
111*3016574eSIoana Ciornei
112*3016574eSIoana Ciornei	# Error counters should be exactly zero
113*3016574eSIoana Ciornei	counters=("$h1 eth-mac FrameCheckSequenceErrors 0 1"
114*3016574eSIoana Ciornei		  "$h1 eth-mac AlignmentErrors 0 1"
115*3016574eSIoana Ciornei		  "$h1 eth-mac FramesLostDueToIntMACXmitError 0 1"
116*3016574eSIoana Ciornei		  "$h1 eth-mac CarrierSenseErrors 0 1"
117*3016574eSIoana Ciornei		  "$h1 eth-mac FramesLostDueToIntMACRcvError 0 1"
118*3016574eSIoana Ciornei		  "$h1 eth-mac InRangeLengthErrors 0 1"
119*3016574eSIoana Ciornei		  "$h1 eth-mac OutOfRangeLengthField 0 1"
120*3016574eSIoana Ciornei		  "$h1 eth-mac FrameTooLongErrors 0 1"
121*3016574eSIoana Ciornei		  "$h1 eth-mac FramesAbortedDueToXSColls 0 1")
122*3016574eSIoana Ciornei	traffic_test "$h1" "$h2" "$num_pkts" "$bcast_pkt_format" \
123*3016574eSIoana Ciornei		"${counters[@]}"
124*3016574eSIoana Ciornei
125*3016574eSIoana Ciornei	# Collision related counters should also be zero
126*3016574eSIoana Ciornei	counters=("$h1 eth-mac SingleCollisionFrames 0 1"
127*3016574eSIoana Ciornei		  "$h1 eth-mac MultipleCollisionFrames 0 1"
128*3016574eSIoana Ciornei		  "$h1 eth-mac FramesWithDeferredXmissions 0 1"
129*3016574eSIoana Ciornei		  "$h1 eth-mac LateCollisions 0 1"
130*3016574eSIoana Ciornei		  "$h1 eth-mac FramesWithExcessiveDeferral 0 1")
131*3016574eSIoana Ciornei	traffic_test "$h1" "$h2" "$num_pkts" "$bcast_pkt_format" \
132*3016574eSIoana Ciornei		"${counters[@]}"
133*3016574eSIoana Ciornei
134*3016574eSIoana Ciornei	counters=("$h1 eth-mac BroadcastFramesXmittedOK $num_pkts 0"
135*3016574eSIoana Ciornei		  "$h1 eth-mac OctetsTransmittedOK $octets 0")
136*3016574eSIoana Ciornei	traffic_test "$h1" "$h2" "$num_pkts" "$bcast_pkt_format" \
137*3016574eSIoana Ciornei		"${counters[@]}"
138*3016574eSIoana Ciornei
139*3016574eSIoana Ciornei	counters=("$h1 eth-mac BroadcastFramesReceivedOK $num_pkts 0"
140*3016574eSIoana Ciornei		  "$h1 eth-mac OctetsReceivedOK $octets 0")
141*3016574eSIoana Ciornei	traffic_test "$h2" "$h1" "$num_pkts" "$bcast_pkt_format" \
142*3016574eSIoana Ciornei		"${counters[@]}"
143*3016574eSIoana Ciornei
144*3016574eSIoana Ciornei	counters=("$h1 eth-mac FramesTransmittedOK $num_pkts 0"
145*3016574eSIoana Ciornei		  "$h1 eth-mac MulticastFramesXmittedOK $num_pkts 0")
146*3016574eSIoana Ciornei	traffic_test "$h1" "$h2" "$num_pkts" "$mcast_pkt_format" \
147*3016574eSIoana Ciornei		"${counters[@]}"
148*3016574eSIoana Ciornei
149*3016574eSIoana Ciornei	counters=("$h1 eth-mac FramesReceivedOK $num_pkts 0"
150*3016574eSIoana Ciornei		  "$h1 eth-mac MulticastFramesReceivedOK $num_pkts 0")
151*3016574eSIoana Ciornei	traffic_test "$h2" "$h1" "$num_pkts" "$mcast_pkt_format" \
152*3016574eSIoana Ciornei		"${counters[@]}"
153*3016574eSIoana Ciornei}
154*3016574eSIoana CiorneiSUBTESTS=$((SUBTESTS + 22))
155*3016574eSIoana Ciornei
156*3016574eSIoana Ciorneitest_pause_stats()
157*3016574eSIoana Ciornei{
158*3016574eSIoana Ciornei	local pkt_format="-a own -b 01:80:c2:00:00:01 88:08:00:01:00:01"
159*3016574eSIoana Ciornei	local xfail_message="software sent pause frames not detected"
160*3016574eSIoana Ciornei	local num_pkts=2000
161*3016574eSIoana Ciornei	local -a counters
162*3016574eSIoana Ciornei	local int
163*3016574eSIoana Ciornei	local i
164*3016574eSIoana Ciornei
165*3016574eSIoana Ciornei	# Check that there is pause frame support
166*3016574eSIoana Ciornei	for ((i = 1; i <= NUM_NETIFS; ++i)); do
167*3016574eSIoana Ciornei		int="${NETIFS[p$i]}"
168*3016574eSIoana Ciornei		if ! run_on "$int" ethtool -I --json -a "$int" > /dev/null 2>&1; then
169*3016574eSIoana Ciornei			ktap_test_skip "$TEST_NAME.tx_pause_frames"
170*3016574eSIoana Ciornei			ktap_test_skip "$TEST_NAME.rx_pause_frames"
171*3016574eSIoana Ciornei			return
172*3016574eSIoana Ciornei		fi
173*3016574eSIoana Ciornei	done
174*3016574eSIoana Ciornei
175*3016574eSIoana Ciornei	counters=("$h1 pause tx_pause_frames $num_pkts 0 $xfail_message")
176*3016574eSIoana Ciornei	traffic_test "$h1" "$h2" "$num_pkts" "$pkt_format" \
177*3016574eSIoana Ciornei		"${counters[@]}"
178*3016574eSIoana Ciornei
179*3016574eSIoana Ciornei	counters=("$h1 pause rx_pause_frames $num_pkts 0")
180*3016574eSIoana Ciornei	traffic_test "$h2" "$h1" "$num_pkts" "$pkt_format" \
181*3016574eSIoana Ciornei		"${counters[@]}"
182*3016574eSIoana Ciornei}
183*3016574eSIoana CiorneiSUBTESTS=$((SUBTESTS + 2))
184*3016574eSIoana Ciornei
185*3016574eSIoana Ciorneisetup_prepare()
186*3016574eSIoana Ciornei{
187*3016574eSIoana Ciornei	local iface
188*3016574eSIoana Ciornei
189*3016574eSIoana Ciornei	h1=${NETIFS[p1]}
190*3016574eSIoana Ciornei	h2=${NETIFS[p2]}
191*3016574eSIoana Ciornei
192*3016574eSIoana Ciornei	h2_mac=$(mac_get "$h2")
193*3016574eSIoana Ciornei}
194*3016574eSIoana Ciornei
195*3016574eSIoana Ciorneiktap_print_header
196*3016574eSIoana Ciorneiktap_set_plan $SUBTESTS
197*3016574eSIoana Ciornei
198*3016574eSIoana Ciorneicheck_ethtool_counter_group_support
199*3016574eSIoana Ciorneitrap cleanup EXIT
200*3016574eSIoana Ciornei
201*3016574eSIoana Ciorneisetup_prepare
202*3016574eSIoana Ciorneisetup_wait
203*3016574eSIoana Ciornei
204*3016574eSIoana Ciorneitests_run
205*3016574eSIoana Ciornei
206*3016574eSIoana Ciorneiktap_finished
207