1*308b7deeSHangbin Liu#!/bin/bash 2*308b7deeSHangbin Liu# SPDX-License-Identifier: GPL-2.0 3*308b7deeSHangbin Liu# Test YNL ethtool functionality 4*308b7deeSHangbin Liu 5*308b7deeSHangbin Liu# Load KTAP test helpers 6*308b7deeSHangbin LiuKSELFTEST_KTAP_HELPERS="$(dirname "$(realpath "$0")")/../../../testing/selftests/kselftest/ktap_helpers.sh" 7*308b7deeSHangbin Liu# shellcheck source=../../../testing/selftests/kselftest/ktap_helpers.sh 8*308b7deeSHangbin Liusource "$KSELFTEST_KTAP_HELPERS" 9*308b7deeSHangbin Liu 10*308b7deeSHangbin Liu# Default ynl-ethtool path for direct execution, can be overridden by make install 11*308b7deeSHangbin Liuynl_ethtool="../pyynl/ethtool.py" 12*308b7deeSHangbin Liu 13*308b7deeSHangbin Liureadonly NSIM_ID="1337" 14*308b7deeSHangbin Liureadonly NSIM_DEV_NAME="nsim${NSIM_ID}" 15*308b7deeSHangbin Liureadonly VETH_A="veth_a" 16*308b7deeSHangbin Liureadonly VETH_B="veth_b" 17*308b7deeSHangbin Liu 18*308b7deeSHangbin Liutestns="ynl-ethtool-$(mktemp -u XXXXXX)" 19*308b7deeSHangbin LiuTESTS_NO=0 20*308b7deeSHangbin Liu 21*308b7deeSHangbin Liu# Uses veth device as netdevsim doesn't support basic ethtool device info 22*308b7deeSHangbin Liuethtool_device_info() 23*308b7deeSHangbin Liu{ 24*308b7deeSHangbin Liu local info_output 25*308b7deeSHangbin Liu 26*308b7deeSHangbin Liu info_output=$(ip netns exec "$testns" $ynl_ethtool "$VETH_A" 2>/dev/null) 27*308b7deeSHangbin Liu 28*308b7deeSHangbin Liu if ! echo "$info_output" | grep -q "Settings for"; then 29*308b7deeSHangbin Liu ktap_test_fail "YNL ethtool device info (device info output missing expected content)" 30*308b7deeSHangbin Liu return 31*308b7deeSHangbin Liu fi 32*308b7deeSHangbin Liu 33*308b7deeSHangbin Liu ktap_test_pass "YNL ethtool device info" 34*308b7deeSHangbin Liu} 35*308b7deeSHangbin LiuTESTS_NO=$((TESTS_NO + 1)) 36*308b7deeSHangbin Liu 37*308b7deeSHangbin Liuethtool_statistics() 38*308b7deeSHangbin Liu{ 39*308b7deeSHangbin Liu local stats_output 40*308b7deeSHangbin Liu 41*308b7deeSHangbin Liu stats_output=$(ip netns exec "$testns" $ynl_ethtool --statistics "$NSIM_DEV_NAME" 2>/dev/null) 42*308b7deeSHangbin Liu 43*308b7deeSHangbin Liu if ! echo "$stats_output" | grep -q -E "(NIC statistics|packets|bytes)"; then 44*308b7deeSHangbin Liu ktap_test_fail "YNL ethtool statistics (statistics output missing expected content)" 45*308b7deeSHangbin Liu return 46*308b7deeSHangbin Liu fi 47*308b7deeSHangbin Liu 48*308b7deeSHangbin Liu ktap_test_pass "YNL ethtool statistics" 49*308b7deeSHangbin Liu} 50*308b7deeSHangbin LiuTESTS_NO=$((TESTS_NO + 1)) 51*308b7deeSHangbin Liu 52*308b7deeSHangbin Liuethtool_ring_params() 53*308b7deeSHangbin Liu{ 54*308b7deeSHangbin Liu local ring_output 55*308b7deeSHangbin Liu 56*308b7deeSHangbin Liu ring_output=$(ip netns exec "$testns" $ynl_ethtool --show-ring "$NSIM_DEV_NAME" 2>/dev/null) 57*308b7deeSHangbin Liu 58*308b7deeSHangbin Liu if ! echo "$ring_output" | grep -q -E "(Ring parameters|RX|TX)"; then 59*308b7deeSHangbin Liu ktap_test_fail "YNL ethtool ring parameters (ring parameters output missing expected content)" 60*308b7deeSHangbin Liu return 61*308b7deeSHangbin Liu fi 62*308b7deeSHangbin Liu 63*308b7deeSHangbin Liu if ! ip netns exec "$testns" $ynl_ethtool --set-ring "$NSIM_DEV_NAME" rx 64 2>/dev/null; then 64*308b7deeSHangbin Liu ktap_test_fail "YNL ethtool ring parameters (set-ring command failed unexpectedly)" 65*308b7deeSHangbin Liu return 66*308b7deeSHangbin Liu fi 67*308b7deeSHangbin Liu 68*308b7deeSHangbin Liu ktap_test_pass "YNL ethtool ring parameters (show/set)" 69*308b7deeSHangbin Liu} 70*308b7deeSHangbin LiuTESTS_NO=$((TESTS_NO + 1)) 71*308b7deeSHangbin Liu 72*308b7deeSHangbin Liuethtool_coalesce_params() 73*308b7deeSHangbin Liu{ 74*308b7deeSHangbin Liu if ! ip netns exec "$testns" $ynl_ethtool --show-coalesce "$NSIM_DEV_NAME" &>/dev/null; then 75*308b7deeSHangbin Liu ktap_test_fail "YNL ethtool coalesce parameters (failed to get coalesce parameters)" 76*308b7deeSHangbin Liu return 77*308b7deeSHangbin Liu fi 78*308b7deeSHangbin Liu 79*308b7deeSHangbin Liu if ! ip netns exec "$testns" $ynl_ethtool --set-coalesce "$NSIM_DEV_NAME" rx-usecs 50 2>/dev/null; then 80*308b7deeSHangbin Liu ktap_test_fail "YNL ethtool coalesce parameters (set-coalesce command failed unexpectedly)" 81*308b7deeSHangbin Liu return 82*308b7deeSHangbin Liu fi 83*308b7deeSHangbin Liu 84*308b7deeSHangbin Liu ktap_test_pass "YNL ethtool coalesce parameters (show/set)" 85*308b7deeSHangbin Liu} 86*308b7deeSHangbin LiuTESTS_NO=$((TESTS_NO + 1)) 87*308b7deeSHangbin Liu 88*308b7deeSHangbin Liuethtool_pause_params() 89*308b7deeSHangbin Liu{ 90*308b7deeSHangbin Liu if ! ip netns exec "$testns" $ynl_ethtool --show-pause "$NSIM_DEV_NAME" &>/dev/null; then 91*308b7deeSHangbin Liu ktap_test_fail "YNL ethtool pause parameters (failed to get pause parameters)" 92*308b7deeSHangbin Liu return 93*308b7deeSHangbin Liu fi 94*308b7deeSHangbin Liu 95*308b7deeSHangbin Liu if ! ip netns exec "$testns" $ynl_ethtool --set-pause "$NSIM_DEV_NAME" tx 1 rx 1 2>/dev/null; then 96*308b7deeSHangbin Liu ktap_test_fail "YNL ethtool pause parameters (set-pause command failed unexpectedly)" 97*308b7deeSHangbin Liu return 98*308b7deeSHangbin Liu fi 99*308b7deeSHangbin Liu 100*308b7deeSHangbin Liu ktap_test_pass "YNL ethtool pause parameters (show/set)" 101*308b7deeSHangbin Liu} 102*308b7deeSHangbin LiuTESTS_NO=$((TESTS_NO + 1)) 103*308b7deeSHangbin Liu 104*308b7deeSHangbin Liuethtool_features_info() 105*308b7deeSHangbin Liu{ 106*308b7deeSHangbin Liu local features_output 107*308b7deeSHangbin Liu 108*308b7deeSHangbin Liu features_output=$(ip netns exec "$testns" $ynl_ethtool --show-features "$NSIM_DEV_NAME" 2>/dev/null) 109*308b7deeSHangbin Liu 110*308b7deeSHangbin Liu if ! echo "$features_output" | grep -q -E "(Features|offload)"; then 111*308b7deeSHangbin Liu ktap_test_fail "YNL ethtool features info (features output missing expected content)" 112*308b7deeSHangbin Liu return 113*308b7deeSHangbin Liu fi 114*308b7deeSHangbin Liu 115*308b7deeSHangbin Liu ktap_test_pass "YNL ethtool features info (show/set)" 116*308b7deeSHangbin Liu} 117*308b7deeSHangbin LiuTESTS_NO=$((TESTS_NO + 1)) 118*308b7deeSHangbin Liu 119*308b7deeSHangbin Liuethtool_channels_info() 120*308b7deeSHangbin Liu{ 121*308b7deeSHangbin Liu local channels_output 122*308b7deeSHangbin Liu 123*308b7deeSHangbin Liu channels_output=$(ip netns exec "$testns" $ynl_ethtool --show-channels "$NSIM_DEV_NAME" 2>/dev/null) 124*308b7deeSHangbin Liu 125*308b7deeSHangbin Liu if ! echo "$channels_output" | grep -q -E "(Channel|Combined|RX|TX)"; then 126*308b7deeSHangbin Liu ktap_test_fail "YNL ethtool channels info (channels output missing expected content)" 127*308b7deeSHangbin Liu return 128*308b7deeSHangbin Liu fi 129*308b7deeSHangbin Liu 130*308b7deeSHangbin Liu if ! ip netns exec "$testns" $ynl_ethtool --set-channels "$NSIM_DEV_NAME" combined-count 1 2>/dev/null; then 131*308b7deeSHangbin Liu ktap_test_fail "YNL ethtool channels info (set-channels command failed unexpectedly)" 132*308b7deeSHangbin Liu return 133*308b7deeSHangbin Liu fi 134*308b7deeSHangbin Liu 135*308b7deeSHangbin Liu ktap_test_pass "YNL ethtool channels info (show/set)" 136*308b7deeSHangbin Liu} 137*308b7deeSHangbin LiuTESTS_NO=$((TESTS_NO + 1)) 138*308b7deeSHangbin Liu 139*308b7deeSHangbin Liuethtool_time_stamping() 140*308b7deeSHangbin Liu{ 141*308b7deeSHangbin Liu local ts_output 142*308b7deeSHangbin Liu 143*308b7deeSHangbin Liu ts_output=$(ip netns exec "$testns" $ynl_ethtool --show-time-stamping "$NSIM_DEV_NAME" 2>/dev/null) 144*308b7deeSHangbin Liu 145*308b7deeSHangbin Liu if ! echo "$ts_output" | grep -q -E "(Time stamping|timestamping|SOF_TIMESTAMPING)"; then 146*308b7deeSHangbin Liu ktap_test_fail "YNL ethtool time stamping (time stamping output missing expected content)" 147*308b7deeSHangbin Liu return 148*308b7deeSHangbin Liu fi 149*308b7deeSHangbin Liu 150*308b7deeSHangbin Liu ktap_test_pass "YNL ethtool time stamping" 151*308b7deeSHangbin Liu} 152*308b7deeSHangbin LiuTESTS_NO=$((TESTS_NO + 1)) 153*308b7deeSHangbin Liu 154*308b7deeSHangbin Liusetup() 155*308b7deeSHangbin Liu{ 156*308b7deeSHangbin Liu modprobe netdevsim &> /dev/null 157*308b7deeSHangbin Liu if ! [ -f /sys/bus/netdevsim/new_device ]; then 158*308b7deeSHangbin Liu ktap_skip_all "netdevsim module not available" 159*308b7deeSHangbin Liu exit "$KSFT_SKIP" 160*308b7deeSHangbin Liu fi 161*308b7deeSHangbin Liu 162*308b7deeSHangbin Liu if ! ip netns add "$testns" 2>/dev/null; then 163*308b7deeSHangbin Liu ktap_skip_all "failed to create test namespace" 164*308b7deeSHangbin Liu exit "$KSFT_SKIP" 165*308b7deeSHangbin Liu fi 166*308b7deeSHangbin Liu 167*308b7deeSHangbin Liu echo "$NSIM_ID 1" | ip netns exec "$testns" tee /sys/bus/netdevsim/new_device >/dev/null 2>&1 || { 168*308b7deeSHangbin Liu ktap_skip_all "failed to create netdevsim device" 169*308b7deeSHangbin Liu exit "$KSFT_SKIP" 170*308b7deeSHangbin Liu } 171*308b7deeSHangbin Liu 172*308b7deeSHangbin Liu local dev 173*308b7deeSHangbin Liu dev=$(ip netns exec "$testns" ls /sys/bus/netdevsim/devices/netdevsim$NSIM_ID/net 2>/dev/null | head -1) 174*308b7deeSHangbin Liu if [[ -z "$dev" ]]; then 175*308b7deeSHangbin Liu ktap_skip_all "failed to find netdevsim device" 176*308b7deeSHangbin Liu exit "$KSFT_SKIP" 177*308b7deeSHangbin Liu fi 178*308b7deeSHangbin Liu 179*308b7deeSHangbin Liu ip -netns "$testns" link set dev "$dev" name "$NSIM_DEV_NAME" 2>/dev/null || { 180*308b7deeSHangbin Liu ktap_skip_all "failed to rename netdevsim device" 181*308b7deeSHangbin Liu exit "$KSFT_SKIP" 182*308b7deeSHangbin Liu } 183*308b7deeSHangbin Liu 184*308b7deeSHangbin Liu ip -netns "$testns" link set dev "$NSIM_DEV_NAME" up 2>/dev/null 185*308b7deeSHangbin Liu 186*308b7deeSHangbin Liu if ! ip -n "$testns" link add "$VETH_A" type veth peer name "$VETH_B" 2>/dev/null; then 187*308b7deeSHangbin Liu ktap_skip_all "failed to create veth pair" 188*308b7deeSHangbin Liu exit "$KSFT_SKIP" 189*308b7deeSHangbin Liu fi 190*308b7deeSHangbin Liu 191*308b7deeSHangbin Liu ip -n "$testns" link set "$VETH_A" up 2>/dev/null 192*308b7deeSHangbin Liu ip -n "$testns" link set "$VETH_B" up 2>/dev/null 193*308b7deeSHangbin Liu} 194*308b7deeSHangbin Liu 195*308b7deeSHangbin Liucleanup() 196*308b7deeSHangbin Liu{ 197*308b7deeSHangbin Liu ip netns exec "$testns" bash -c "echo $NSIM_ID > /sys/bus/netdevsim/del_device" 2>/dev/null || true 198*308b7deeSHangbin Liu ip netns del "$testns" 2>/dev/null || true 199*308b7deeSHangbin Liu} 200*308b7deeSHangbin Liu 201*308b7deeSHangbin Liu# Check if ynl-ethtool command is available 202*308b7deeSHangbin Liuif ! command -v $ynl_ethtool &>/dev/null && [[ ! -x $ynl_ethtool ]]; then 203*308b7deeSHangbin Liu ktap_skip_all "ynl-ethtool command not found: $ynl_ethtool" 204*308b7deeSHangbin Liu exit "$KSFT_SKIP" 205*308b7deeSHangbin Liufi 206*308b7deeSHangbin Liu 207*308b7deeSHangbin Liutrap cleanup EXIT 208*308b7deeSHangbin Liu 209*308b7deeSHangbin Liuktap_print_header 210*308b7deeSHangbin Liusetup 211*308b7deeSHangbin Liuktap_set_plan "${TESTS_NO}" 212*308b7deeSHangbin Liu 213*308b7deeSHangbin Liuethtool_device_info 214*308b7deeSHangbin Liuethtool_statistics 215*308b7deeSHangbin Liuethtool_ring_params 216*308b7deeSHangbin Liuethtool_coalesce_params 217*308b7deeSHangbin Liuethtool_pause_params 218*308b7deeSHangbin Liuethtool_features_info 219*308b7deeSHangbin Liuethtool_channels_info 220*308b7deeSHangbin Liuethtool_time_stamping 221*308b7deeSHangbin Liu 222*308b7deeSHangbin Liuktap_finished 223