]> Git Repo - linux.git/blob - tools/testing/selftests/net/netdevice.sh
Linux 6.14-rc3
[linux.git] / tools / testing / selftests / net / netdevice.sh
1 #!/bin/sh
2 # SPDX-License-Identifier: GPL-2.0
3 #
4 # This test is for checking network interface
5 # For the moment it tests only ethernet interface (but wifi could be easily added)
6 #
7 # We assume that all network driver are loaded
8 # if not they probably have failed earlier in the boot process and their logged error will be catched by another test
9 #
10
11 # Kselftest framework requirement - SKIP code is 4.
12 ksft_skip=4
13
14 # this function will try to up the interface
15 # if already up, nothing done
16 # arg1: network interface name
17 kci_net_start()
18 {
19         netdev=$1
20
21         ip link show "$netdev" |grep -q UP
22         if [ $? -eq 0 ];then
23                 echo "SKIP: $netdev: interface already up"
24                 return $ksft_skip
25         fi
26
27         ip link set "$netdev" up
28         if [ $? -ne 0 ];then
29                 echo "FAIL: $netdev: Fail to up interface"
30                 return 1
31         else
32                 echo "PASS: $netdev: set interface up"
33                 NETDEV_STARTED=1
34         fi
35         return 0
36 }
37
38 # this function will try to setup an IP and MAC address on a network interface
39 # Doing nothing if the interface was already up
40 # arg1: network interface name
41 kci_net_setup()
42 {
43         netdev=$1
44
45         # do nothing if the interface was already up
46         if [ $NETDEV_STARTED -eq 0 ];then
47                 return 0
48         fi
49
50         MACADDR='02:03:04:05:06:07'
51         ip link set dev $netdev address "$MACADDR"
52         if [ $? -ne 0 ];then
53                 echo "FAIL: $netdev: Cannot set MAC address"
54         else
55                 ip link show $netdev |grep -q "$MACADDR"
56                 if [ $? -eq 0 ];then
57                         echo "PASS: $netdev: set MAC address"
58                 else
59                         echo "FAIL: $netdev: Cannot set MAC address"
60                 fi
61         fi
62
63         #check that the interface did not already have an IP
64         ip address show "$netdev" |grep '^[[:space:]]*inet'
65         if [ $? -eq 0 ];then
66                 echo "SKIP: $netdev: already have an IP"
67                 return $ksft_skip
68         fi
69
70         if [ "$veth_created" ]; then
71                 echo "XFAIL: $netdev: set IP address unsupported for veth*"
72         else
73                 # TODO what ipaddr to set ? DHCP ?
74                 echo "SKIP: $netdev: set IP address"
75         fi
76         return $ksft_skip
77 }
78
79 # test an ethtool command
80 # arg1: return code for not supported (see ethtool code source)
81 # arg2: summary of the command
82 # arg3: command to execute
83 kci_netdev_ethtool_test()
84 {
85         if [ $# -le 2 ];then
86                 echo "SKIP: $netdev: ethtool: invalid number of arguments"
87                 return 1
88         fi
89         $3 >/dev/null
90         ret=$?
91         if [ $ret -ne 0 ];then
92                 if [ $ret -eq "$1" ];then
93                         echo "XFAIL: $netdev: ethtool $2 not supported"
94                         return $ksft_skip
95                 else
96                         echo "FAIL: $netdev: ethtool $2"
97                         return 1
98                 fi
99         else
100                 echo "PASS: $netdev: ethtool $2"
101         fi
102         return 0
103 }
104
105 # test ethtool commands
106 # arg1: network interface name
107 kci_netdev_ethtool()
108 {
109         netdev=$1
110
111         #check presence of ethtool
112         ethtool --version 2>/dev/null >/dev/null
113         if [ $? -ne 0 ];then
114                 echo "SKIP: ethtool not present"
115                 return $ksft_skip
116         fi
117
118         TMP_ETHTOOL_FEATURES="$(mktemp)"
119         if [ ! -e "$TMP_ETHTOOL_FEATURES" ];then
120                 echo "SKIP: Cannot create a tmp file"
121                 return 1
122         fi
123
124         ethtool -k "$netdev" > "$TMP_ETHTOOL_FEATURES"
125         if [ $? -ne 0 ];then
126                 echo "FAIL: $netdev: ethtool list features"
127                 rm "$TMP_ETHTOOL_FEATURES"
128                 return 1
129         fi
130         echo "PASS: $netdev: ethtool list features"
131
132         while read -r FEATURE VALUE FIXED; do
133                 [ "$FEATURE" != "Features" ] || continue # Skip "Features"
134                 [ "$FIXED" != "[fixed]" ] || continue # Skip fixed features
135                 feature="${FEATURE%:*}"
136
137                 ethtool --offload "$netdev" "$feature" off
138                 if [ $? -eq 0 ]; then
139                         echo "PASS: $netdev: Turned off feature: $feature"
140                 else
141                         echo "FAIL: $netdev: Failed to turn off feature:" \
142                                 "$feature"
143                 fi
144
145                 ethtool --offload "$netdev" "$feature" on
146                 if [ $? -eq 0 ]; then
147                         echo "PASS: $netdev: Turned on feature: $feature"
148                 else
149                         echo "FAIL: $netdev: Failed to turn on feature:" \
150                                 "$feature"
151                 fi
152
153                 #restore the feature to its initial state
154                 ethtool --offload "$netdev" "$feature" "$VALUE"
155                 if [ $? -eq 0 ]; then
156                         echo "PASS: $netdev: Restore feature $feature" \
157                                 "to initial state $VALUE"
158                 else
159                         echo "FAIL: $netdev: Failed to restore feature" \
160                                 "$feature to initial state $VALUE"
161                 fi
162
163         done < "$TMP_ETHTOOL_FEATURES"
164
165         rm "$TMP_ETHTOOL_FEATURES"
166
167         kci_netdev_ethtool_test 74 'dump' "ethtool -d $netdev"
168         kci_netdev_ethtool_test 94 'stats' "ethtool -S $netdev"
169
170         return 0
171 }
172
173 # stop a netdev
174 # arg1: network interface name
175 kci_netdev_stop()
176 {
177         netdev=$1
178
179         if [ $NETDEV_STARTED -eq 0 ];then
180                 echo "SKIP: $netdev: interface kept up"
181                 return 0
182         fi
183
184         ip link set "$netdev" down
185         if [ $? -ne 0 ];then
186                 echo "FAIL: $netdev: stop interface"
187                 return 1
188         fi
189         echo "PASS: $netdev: stop interface"
190         return 0
191 }
192
193 # run all test on a netdev
194 # arg1: network interface name
195 kci_test_netdev()
196 {
197         NETDEV_STARTED=0
198         IFACE_TO_UPDOWN="$1"
199         IFACE_TO_TEST="$1"
200         #check for VLAN interface
201         MASTER_IFACE="$(echo $1 | cut -d@ -f2)"
202         if [ ! -z "$MASTER_IFACE" ];then
203                 IFACE_TO_UPDOWN="$MASTER_IFACE"
204                 IFACE_TO_TEST="$(echo $1 | cut -d@ -f1)"
205         fi
206
207         NETDEV_STARTED=0
208         kci_net_start "$IFACE_TO_UPDOWN"
209
210         kci_net_setup "$IFACE_TO_TEST"
211
212         kci_netdev_ethtool "$IFACE_TO_TEST"
213
214         kci_netdev_stop "$IFACE_TO_UPDOWN"
215         return 0
216 }
217
218 #check for needed privileges
219 if [ "$(id -u)" -ne 0 ];then
220         echo "SKIP: Need root privileges"
221         exit $ksft_skip
222 fi
223
224 ip link show 2>/dev/null >/dev/null
225 if [ $? -ne 0 ];then
226         echo "SKIP: Could not run test without the ip tool"
227         exit $ksft_skip
228 fi
229
230 TMP_LIST_NETDEV="$(mktemp)"
231 if [ ! -e "$TMP_LIST_NETDEV" ];then
232         echo "FAIL: Cannot create a tmp file"
233         exit 1
234 fi
235
236 ip link show |grep '^[0-9]' | grep -oE '[[:space:]].*eth[0-9]*:|[[:space:]].*enp[0-9]s[0-9]:' | cut -d\  -f2 | cut -d: -f1> "$TMP_LIST_NETDEV"
237
238 if [ ! -s "$TMP_LIST_NETDEV" ]; then
239         echo "No valid network device found, creating veth pair"
240         ip link add veth0 type veth peer name veth1
241         echo "veth0" > "$TMP_LIST_NETDEV"
242         veth_created=1
243 fi
244
245 while read netdev
246 do
247         kci_test_netdev "$netdev"
248 done < "$TMP_LIST_NETDEV"
249
250 #clean up veth interface pair if it was created
251 if [ "$veth_created" ]; then
252         ip link delete veth0
253         echo "Removed veth pair"
254 fi
255
256 rm "$TMP_LIST_NETDEV"
257 exit 0
This page took 0.042098 seconds and 4 git commands to generate.