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