xref: /linux/tools/net/ynl/tests/test_ynl_ethtool.sh (revision 24f171c7e145f43b9f187578e89b0982ce87e54c)
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