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