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