1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun 4*4882a593SmuzhiyunALL_TESTS=" 5*4882a593Smuzhiyun port_pool_test 6*4882a593Smuzhiyun port_tc_ip_test 7*4882a593Smuzhiyun port_tc_arp_test 8*4882a593Smuzhiyun" 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunNUM_NETIFS=2 11*4882a593Smuzhiyunsource ../../../net/forwarding/lib.sh 12*4882a593Smuzhiyunsource ../../../net/forwarding/devlink_lib.sh 13*4882a593Smuzhiyunsource mlxsw_lib.sh 14*4882a593Smuzhiyun 15*4882a593SmuzhiyunSB_POOL_ING=0 16*4882a593SmuzhiyunSB_POOL_EGR_CPU=10 17*4882a593Smuzhiyun 18*4882a593SmuzhiyunSB_ITC_CPU_IP=2 19*4882a593SmuzhiyunSB_ITC_CPU_ARP=2 20*4882a593SmuzhiyunSB_ITC=0 21*4882a593Smuzhiyun 22*4882a593Smuzhiyunh1_create() 23*4882a593Smuzhiyun{ 24*4882a593Smuzhiyun simple_if_init $h1 192.0.1.1/24 25*4882a593Smuzhiyun} 26*4882a593Smuzhiyun 27*4882a593Smuzhiyunh1_destroy() 28*4882a593Smuzhiyun{ 29*4882a593Smuzhiyun simple_if_fini $h1 192.0.1.1/24 30*4882a593Smuzhiyun} 31*4882a593Smuzhiyun 32*4882a593Smuzhiyunh2_create() 33*4882a593Smuzhiyun{ 34*4882a593Smuzhiyun simple_if_init $h2 192.0.1.2/24 35*4882a593Smuzhiyun} 36*4882a593Smuzhiyun 37*4882a593Smuzhiyunh2_destroy() 38*4882a593Smuzhiyun{ 39*4882a593Smuzhiyun simple_if_fini $h2 192.0.1.2/24 40*4882a593Smuzhiyun} 41*4882a593Smuzhiyun 42*4882a593Smuzhiyunsb_occ_pool_check() 43*4882a593Smuzhiyun{ 44*4882a593Smuzhiyun local dl_port=$1; shift 45*4882a593Smuzhiyun local pool=$1; shift 46*4882a593Smuzhiyun local exp_max_occ=$1 47*4882a593Smuzhiyun local max_occ 48*4882a593Smuzhiyun local err=0 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun max_occ=$(devlink sb -j occupancy show $dl_port \ 51*4882a593Smuzhiyun | jq -e ".[][][\"pool\"][\"$pool\"][\"max\"]") 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun if [[ "$max_occ" -ne "$exp_max_occ" ]]; then 54*4882a593Smuzhiyun err=1 55*4882a593Smuzhiyun fi 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun echo $max_occ 58*4882a593Smuzhiyun return $err 59*4882a593Smuzhiyun} 60*4882a593Smuzhiyun 61*4882a593Smuzhiyunsb_occ_itc_check() 62*4882a593Smuzhiyun{ 63*4882a593Smuzhiyun local dl_port=$1; shift 64*4882a593Smuzhiyun local itc=$1; shift 65*4882a593Smuzhiyun local exp_max_occ=$1 66*4882a593Smuzhiyun local max_occ 67*4882a593Smuzhiyun local err=0 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun max_occ=$(devlink sb -j occupancy show $dl_port \ 70*4882a593Smuzhiyun | jq -e ".[][][\"itc\"][\"$itc\"][\"max\"]") 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun if [[ "$max_occ" -ne "$exp_max_occ" ]]; then 73*4882a593Smuzhiyun err=1 74*4882a593Smuzhiyun fi 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun echo $max_occ 77*4882a593Smuzhiyun return $err 78*4882a593Smuzhiyun} 79*4882a593Smuzhiyun 80*4882a593Smuzhiyunsb_occ_etc_check() 81*4882a593Smuzhiyun{ 82*4882a593Smuzhiyun local dl_port=$1; shift 83*4882a593Smuzhiyun local etc=$1; shift 84*4882a593Smuzhiyun local exp_max_occ=$1; shift 85*4882a593Smuzhiyun local max_occ 86*4882a593Smuzhiyun local err=0 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun max_occ=$(devlink sb -j occupancy show $dl_port \ 89*4882a593Smuzhiyun | jq -e ".[][][\"etc\"][\"$etc\"][\"max\"]") 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun if [[ "$max_occ" -ne "$exp_max_occ" ]]; then 92*4882a593Smuzhiyun err=1 93*4882a593Smuzhiyun fi 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun echo $max_occ 96*4882a593Smuzhiyun return $err 97*4882a593Smuzhiyun} 98*4882a593Smuzhiyun 99*4882a593Smuzhiyunport_pool_test() 100*4882a593Smuzhiyun{ 101*4882a593Smuzhiyun local exp_max_occ=288 102*4882a593Smuzhiyun local max_occ 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun devlink sb occupancy clearmax $DEVLINK_DEV 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun $MZ $h1 -c 1 -p 160 -a $h1mac -b $h2mac -A 192.0.1.1 -B 192.0.1.2 \ 107*4882a593Smuzhiyun -t ip -q 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun devlink sb occupancy snapshot $DEVLINK_DEV 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun RET=0 112*4882a593Smuzhiyun max_occ=$(sb_occ_pool_check $dl_port1 $SB_POOL_ING $exp_max_occ) 113*4882a593Smuzhiyun check_err $? "Expected iPool($SB_POOL_ING) max occupancy to be $exp_max_occ, but got $max_occ" 114*4882a593Smuzhiyun log_test "physical port's($h1) ingress pool" 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun RET=0 117*4882a593Smuzhiyun max_occ=$(sb_occ_pool_check $dl_port2 $SB_POOL_ING $exp_max_occ) 118*4882a593Smuzhiyun check_err $? "Expected iPool($SB_POOL_ING) max occupancy to be $exp_max_occ, but got $max_occ" 119*4882a593Smuzhiyun log_test "physical port's($h2) ingress pool" 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun RET=0 122*4882a593Smuzhiyun max_occ=$(sb_occ_pool_check $cpu_dl_port $SB_POOL_EGR_CPU $exp_max_occ) 123*4882a593Smuzhiyun check_err $? "Expected ePool($SB_POOL_EGR_CPU) max occupancy to be $exp_max_occ, but got $max_occ" 124*4882a593Smuzhiyun log_test "CPU port's egress pool" 125*4882a593Smuzhiyun} 126*4882a593Smuzhiyun 127*4882a593Smuzhiyunport_tc_ip_test() 128*4882a593Smuzhiyun{ 129*4882a593Smuzhiyun local exp_max_occ=288 130*4882a593Smuzhiyun local max_occ 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun devlink sb occupancy clearmax $DEVLINK_DEV 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun $MZ $h1 -c 1 -p 160 -a $h1mac -b $h2mac -A 192.0.1.1 -B 192.0.1.2 \ 135*4882a593Smuzhiyun -t ip -q 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun devlink sb occupancy snapshot $DEVLINK_DEV 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun RET=0 140*4882a593Smuzhiyun max_occ=$(sb_occ_itc_check $dl_port2 $SB_ITC $exp_max_occ) 141*4882a593Smuzhiyun check_err $? "Expected ingress TC($SB_ITC) max occupancy to be $exp_max_occ, but got $max_occ" 142*4882a593Smuzhiyun log_test "physical port's($h1) ingress TC - IP packet" 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun RET=0 145*4882a593Smuzhiyun max_occ=$(sb_occ_itc_check $dl_port2 $SB_ITC $exp_max_occ) 146*4882a593Smuzhiyun check_err $? "Expected ingress TC($SB_ITC) max occupancy to be $exp_max_occ, but got $max_occ" 147*4882a593Smuzhiyun log_test "physical port's($h2) ingress TC - IP packet" 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun RET=0 150*4882a593Smuzhiyun max_occ=$(sb_occ_etc_check $cpu_dl_port $SB_ITC_CPU_IP $exp_max_occ) 151*4882a593Smuzhiyun check_err $? "Expected egress TC($SB_ITC_CPU_IP) max occupancy to be $exp_max_occ, but got $max_occ" 152*4882a593Smuzhiyun log_test "CPU port's egress TC - IP packet" 153*4882a593Smuzhiyun} 154*4882a593Smuzhiyun 155*4882a593Smuzhiyunport_tc_arp_test() 156*4882a593Smuzhiyun{ 157*4882a593Smuzhiyun local exp_max_occ=96 158*4882a593Smuzhiyun local max_occ 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun if [[ $MLXSW_CHIP != "mlxsw_spectrum" ]]; then 161*4882a593Smuzhiyun exp_max_occ=144 162*4882a593Smuzhiyun fi 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun devlink sb occupancy clearmax $DEVLINK_DEV 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun $MZ $h1 -c 1 -p 160 -a $h1mac -A 192.0.1.1 -t arp -q 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun devlink sb occupancy snapshot $DEVLINK_DEV 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun RET=0 171*4882a593Smuzhiyun max_occ=$(sb_occ_itc_check $dl_port2 $SB_ITC $exp_max_occ) 172*4882a593Smuzhiyun check_err $? "Expected ingress TC($SB_ITC) max occupancy to be $exp_max_occ, but got $max_occ" 173*4882a593Smuzhiyun log_test "physical port's($h1) ingress TC - ARP packet" 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun RET=0 176*4882a593Smuzhiyun max_occ=$(sb_occ_itc_check $dl_port2 $SB_ITC $exp_max_occ) 177*4882a593Smuzhiyun check_err $? "Expected ingress TC($SB_ITC) max occupancy to be $exp_max_occ, but got $max_occ" 178*4882a593Smuzhiyun log_test "physical port's($h2) ingress TC - ARP packet" 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun RET=0 181*4882a593Smuzhiyun max_occ=$(sb_occ_etc_check $cpu_dl_port $SB_ITC_CPU_ARP $exp_max_occ) 182*4882a593Smuzhiyun check_err $? "Expected egress TC($SB_ITC_IP2ME) max occupancy to be $exp_max_occ, but got $max_occ" 183*4882a593Smuzhiyun log_test "CPU port's egress TC - ARP packet" 184*4882a593Smuzhiyun} 185*4882a593Smuzhiyun 186*4882a593Smuzhiyunsetup_prepare() 187*4882a593Smuzhiyun{ 188*4882a593Smuzhiyun h1=${NETIFS[p1]} 189*4882a593Smuzhiyun h2=${NETIFS[p2]} 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun h1mac=$(mac_get $h1) 192*4882a593Smuzhiyun h2mac=$(mac_get $h2) 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun dl_port1=$(devlink_port_by_netdev $h1) 195*4882a593Smuzhiyun dl_port2=$(devlink_port_by_netdev $h2) 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun cpu_dl_port=$(devlink_cpu_port_get) 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun vrf_prepare 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun h1_create 202*4882a593Smuzhiyun h2_create 203*4882a593Smuzhiyun} 204*4882a593Smuzhiyun 205*4882a593Smuzhiyuncleanup() 206*4882a593Smuzhiyun{ 207*4882a593Smuzhiyun pre_cleanup 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun h2_destroy 210*4882a593Smuzhiyun h1_destroy 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun vrf_cleanup 213*4882a593Smuzhiyun} 214*4882a593Smuzhiyun 215*4882a593Smuzhiyuntrap cleanup EXIT 216*4882a593Smuzhiyun 217*4882a593Smuzhiyunsetup_prepare 218*4882a593Smuzhiyunsetup_wait 219*4882a593Smuzhiyun 220*4882a593Smuzhiyuntests_run 221*4882a593Smuzhiyun 222*4882a593Smuzhiyunexit $EXIT_STATUS 223