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