xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/net/netdevice.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/sh
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun#
4*4882a593Smuzhiyun# This test is for checking network interface
5*4882a593Smuzhiyun# For the moment it tests only ethernet interface (but wifi could be easily added)
6*4882a593Smuzhiyun#
7*4882a593Smuzhiyun# We assume that all network driver are loaded
8*4882a593Smuzhiyun# if not they probably have failed earlier in the boot process and their logged error will be catched by another test
9*4882a593Smuzhiyun#
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun# Kselftest framework requirement - SKIP code is 4.
12*4882a593Smuzhiyunksft_skip=4
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun# this function will try to up the interface
15*4882a593Smuzhiyun# if already up, nothing done
16*4882a593Smuzhiyun# arg1: network interface name
17*4882a593Smuzhiyunkci_net_start()
18*4882a593Smuzhiyun{
19*4882a593Smuzhiyun	netdev=$1
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun	ip link show "$netdev" |grep -q UP
22*4882a593Smuzhiyun	if [ $? -eq 0 ];then
23*4882a593Smuzhiyun		echo "SKIP: $netdev: interface already up"
24*4882a593Smuzhiyun		return $ksft_skip
25*4882a593Smuzhiyun	fi
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun	ip link set "$netdev" up
28*4882a593Smuzhiyun	if [ $? -ne 0 ];then
29*4882a593Smuzhiyun		echo "FAIL: $netdev: Fail to up interface"
30*4882a593Smuzhiyun		return 1
31*4882a593Smuzhiyun	else
32*4882a593Smuzhiyun		echo "PASS: $netdev: set interface up"
33*4882a593Smuzhiyun		NETDEV_STARTED=1
34*4882a593Smuzhiyun	fi
35*4882a593Smuzhiyun	return 0
36*4882a593Smuzhiyun}
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun# this function will try to setup an IP and MAC address on a network interface
39*4882a593Smuzhiyun# Doing nothing if the interface was already up
40*4882a593Smuzhiyun# arg1: network interface name
41*4882a593Smuzhiyunkci_net_setup()
42*4882a593Smuzhiyun{
43*4882a593Smuzhiyun	netdev=$1
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun	# do nothing if the interface was already up
46*4882a593Smuzhiyun	if [ $NETDEV_STARTED -eq 0 ];then
47*4882a593Smuzhiyun		return 0
48*4882a593Smuzhiyun	fi
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun	MACADDR='02:03:04:05:06:07'
51*4882a593Smuzhiyun	ip link set dev $netdev address "$MACADDR"
52*4882a593Smuzhiyun	if [ $? -ne 0 ];then
53*4882a593Smuzhiyun		echo "FAIL: $netdev: Cannot set MAC address"
54*4882a593Smuzhiyun	else
55*4882a593Smuzhiyun		ip link show $netdev |grep -q "$MACADDR"
56*4882a593Smuzhiyun		if [ $? -eq 0 ];then
57*4882a593Smuzhiyun			echo "PASS: $netdev: set MAC address"
58*4882a593Smuzhiyun		else
59*4882a593Smuzhiyun			echo "FAIL: $netdev: Cannot set MAC address"
60*4882a593Smuzhiyun		fi
61*4882a593Smuzhiyun	fi
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun	#check that the interface did not already have an IP
64*4882a593Smuzhiyun	ip address show "$netdev" |grep '^[[:space:]]*inet'
65*4882a593Smuzhiyun	if [ $? -eq 0 ];then
66*4882a593Smuzhiyun		echo "SKIP: $netdev: already have an IP"
67*4882a593Smuzhiyun		return $ksft_skip
68*4882a593Smuzhiyun	fi
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun	# TODO what ipaddr to set ? DHCP ?
71*4882a593Smuzhiyun	echo "SKIP: $netdev: set IP address"
72*4882a593Smuzhiyun	return $ksft_skip
73*4882a593Smuzhiyun}
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun# test an ethtool command
76*4882a593Smuzhiyun# arg1: return code for not supported (see ethtool code source)
77*4882a593Smuzhiyun# arg2: summary of the command
78*4882a593Smuzhiyun# arg3: command to execute
79*4882a593Smuzhiyunkci_netdev_ethtool_test()
80*4882a593Smuzhiyun{
81*4882a593Smuzhiyun	if [ $# -le 2 ];then
82*4882a593Smuzhiyun		echo "SKIP: $netdev: ethtool: invalid number of arguments"
83*4882a593Smuzhiyun		return 1
84*4882a593Smuzhiyun	fi
85*4882a593Smuzhiyun	$3 >/dev/null
86*4882a593Smuzhiyun	ret=$?
87*4882a593Smuzhiyun	if [ $ret -ne 0 ];then
88*4882a593Smuzhiyun		if [ $ret -eq "$1" ];then
89*4882a593Smuzhiyun			echo "SKIP: $netdev: ethtool $2 not supported"
90*4882a593Smuzhiyun			return $ksft_skip
91*4882a593Smuzhiyun		else
92*4882a593Smuzhiyun			echo "FAIL: $netdev: ethtool $2"
93*4882a593Smuzhiyun			return 1
94*4882a593Smuzhiyun		fi
95*4882a593Smuzhiyun	else
96*4882a593Smuzhiyun		echo "PASS: $netdev: ethtool $2"
97*4882a593Smuzhiyun	fi
98*4882a593Smuzhiyun	return 0
99*4882a593Smuzhiyun}
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun# test ethtool commands
102*4882a593Smuzhiyun# arg1: network interface name
103*4882a593Smuzhiyunkci_netdev_ethtool()
104*4882a593Smuzhiyun{
105*4882a593Smuzhiyun	netdev=$1
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun	#check presence of ethtool
108*4882a593Smuzhiyun	ethtool --version 2>/dev/null >/dev/null
109*4882a593Smuzhiyun	if [ $? -ne 0 ];then
110*4882a593Smuzhiyun		echo "SKIP: ethtool not present"
111*4882a593Smuzhiyun		return $ksft_skip
112*4882a593Smuzhiyun	fi
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun	TMP_ETHTOOL_FEATURES="$(mktemp)"
115*4882a593Smuzhiyun	if [ ! -e "$TMP_ETHTOOL_FEATURES" ];then
116*4882a593Smuzhiyun		echo "SKIP: Cannot create a tmp file"
117*4882a593Smuzhiyun		return 1
118*4882a593Smuzhiyun	fi
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun	ethtool -k "$netdev" > "$TMP_ETHTOOL_FEATURES"
121*4882a593Smuzhiyun	if [ $? -ne 0 ];then
122*4882a593Smuzhiyun		echo "FAIL: $netdev: ethtool list features"
123*4882a593Smuzhiyun		rm "$TMP_ETHTOOL_FEATURES"
124*4882a593Smuzhiyun		return 1
125*4882a593Smuzhiyun	fi
126*4882a593Smuzhiyun	echo "PASS: $netdev: ethtool list features"
127*4882a593Smuzhiyun	#TODO for each non fixed features, try to turn them on/off
128*4882a593Smuzhiyun	rm "$TMP_ETHTOOL_FEATURES"
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun	kci_netdev_ethtool_test 74 'dump' "ethtool -d $netdev"
131*4882a593Smuzhiyun	kci_netdev_ethtool_test 94 'stats' "ethtool -S $netdev"
132*4882a593Smuzhiyun	return 0
133*4882a593Smuzhiyun}
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun# stop a netdev
136*4882a593Smuzhiyun# arg1: network interface name
137*4882a593Smuzhiyunkci_netdev_stop()
138*4882a593Smuzhiyun{
139*4882a593Smuzhiyun	netdev=$1
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun	if [ $NETDEV_STARTED -eq 0 ];then
142*4882a593Smuzhiyun		echo "SKIP: $netdev: interface kept up"
143*4882a593Smuzhiyun		return 0
144*4882a593Smuzhiyun	fi
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun	ip link set "$netdev" down
147*4882a593Smuzhiyun	if [ $? -ne 0 ];then
148*4882a593Smuzhiyun		echo "FAIL: $netdev: stop interface"
149*4882a593Smuzhiyun		return 1
150*4882a593Smuzhiyun	fi
151*4882a593Smuzhiyun	echo "PASS: $netdev: stop interface"
152*4882a593Smuzhiyun	return 0
153*4882a593Smuzhiyun}
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun# run all test on a netdev
156*4882a593Smuzhiyun# arg1: network interface name
157*4882a593Smuzhiyunkci_test_netdev()
158*4882a593Smuzhiyun{
159*4882a593Smuzhiyun	NETDEV_STARTED=0
160*4882a593Smuzhiyun	IFACE_TO_UPDOWN="$1"
161*4882a593Smuzhiyun	IFACE_TO_TEST="$1"
162*4882a593Smuzhiyun	#check for VLAN interface
163*4882a593Smuzhiyun	MASTER_IFACE="$(echo $1 | cut -d@ -f2)"
164*4882a593Smuzhiyun	if [ ! -z "$MASTER_IFACE" ];then
165*4882a593Smuzhiyun		IFACE_TO_UPDOWN="$MASTER_IFACE"
166*4882a593Smuzhiyun		IFACE_TO_TEST="$(echo $1 | cut -d@ -f1)"
167*4882a593Smuzhiyun	fi
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun	NETDEV_STARTED=0
170*4882a593Smuzhiyun	kci_net_start "$IFACE_TO_UPDOWN"
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun	kci_net_setup "$IFACE_TO_TEST"
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun	kci_netdev_ethtool "$IFACE_TO_TEST"
175*4882a593Smuzhiyun
176*4882a593Smuzhiyun	kci_netdev_stop "$IFACE_TO_UPDOWN"
177*4882a593Smuzhiyun	return 0
178*4882a593Smuzhiyun}
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun#check for needed privileges
181*4882a593Smuzhiyunif [ "$(id -u)" -ne 0 ];then
182*4882a593Smuzhiyun	echo "SKIP: Need root privileges"
183*4882a593Smuzhiyun	exit $ksft_skip
184*4882a593Smuzhiyunfi
185*4882a593Smuzhiyun
186*4882a593Smuzhiyunip link show 2>/dev/null >/dev/null
187*4882a593Smuzhiyunif [ $? -ne 0 ];then
188*4882a593Smuzhiyun	echo "SKIP: Could not run test without the ip tool"
189*4882a593Smuzhiyun	exit $ksft_skip
190*4882a593Smuzhiyunfi
191*4882a593Smuzhiyun
192*4882a593SmuzhiyunTMP_LIST_NETDEV="$(mktemp)"
193*4882a593Smuzhiyunif [ ! -e "$TMP_LIST_NETDEV" ];then
194*4882a593Smuzhiyun	echo "FAIL: Cannot create a tmp file"
195*4882a593Smuzhiyun	exit 1
196*4882a593Smuzhiyunfi
197*4882a593Smuzhiyun
198*4882a593Smuzhiyunip 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"
199*4882a593Smuzhiyunwhile read netdev
200*4882a593Smuzhiyundo
201*4882a593Smuzhiyun	kci_test_netdev "$netdev"
202*4882a593Smuzhiyundone < "$TMP_LIST_NETDEV"
203*4882a593Smuzhiyun
204*4882a593Smuzhiyunrm "$TMP_LIST_NETDEV"
205*4882a593Smuzhiyunexit 0
206