-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests: add a generic testsuite for ethernet device
This patch add a generic testsuite for testing ethernet network device driver. Signed-off-by: Corentin Labbe <clabbe.montjoie@gmail.com> Tested-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
LABBE Corentin
authored and
David S. Miller
committed
Apr 5, 2017
1 parent
2e507e2
commit af0e546
Showing
2 changed files
with
201 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,200 @@ | ||
#!/bin/sh | ||
# | ||
# This test is for checking network interface | ||
# For the moment it tests only ethernet interface (but wifi could be easily added) | ||
# | ||
# We assume that all network driver are loaded | ||
# if not they probably have failed earlier in the boot process and their logged error will be catched by another test | ||
# | ||
|
||
# this function will try to up the interface | ||
# if already up, nothing done | ||
# arg1: network interface name | ||
kci_net_start() | ||
{ | ||
netdev=$1 | ||
|
||
ip link show "$netdev" |grep -q UP | ||
if [ $? -eq 0 ];then | ||
echo "SKIP: $netdev: interface already up" | ||
return 0 | ||
fi | ||
|
||
ip link set "$netdev" up | ||
if [ $? -ne 0 ];then | ||
echo "FAIL: $netdev: Fail to up interface" | ||
return 1 | ||
else | ||
echo "PASS: $netdev: set interface up" | ||
NETDEV_STARTED=1 | ||
fi | ||
return 0 | ||
} | ||
|
||
# this function will try to setup an IP and MAC address on a network interface | ||
# Doing nothing if the interface was already up | ||
# arg1: network interface name | ||
kci_net_setup() | ||
{ | ||
netdev=$1 | ||
|
||
# do nothing if the interface was already up | ||
if [ $NETDEV_STARTED -eq 0 ];then | ||
return 0 | ||
fi | ||
|
||
MACADDR='02:03:04:05:06:07' | ||
ip link set dev $netdev address "$MACADDR" | ||
if [ $? -ne 0 ];then | ||
echo "FAIL: $netdev: Cannot set MAC address" | ||
else | ||
ip link show $netdev |grep -q "$MACADDR" | ||
if [ $? -eq 0 ];then | ||
echo "PASS: $netdev: set MAC address" | ||
else | ||
echo "FAIL: $netdev: Cannot set MAC address" | ||
fi | ||
fi | ||
|
||
#check that the interface did not already have an IP | ||
ip address show "$netdev" |grep '^[[:space:]]*inet' | ||
if [ $? -eq 0 ];then | ||
echo "SKIP: $netdev: already have an IP" | ||
return 0 | ||
fi | ||
|
||
# TODO what ipaddr to set ? DHCP ? | ||
echo "SKIP: $netdev: set IP address" | ||
return 0 | ||
} | ||
|
||
# test an ethtool command | ||
# arg1: return code for not supported (see ethtool code source) | ||
# arg2: summary of the command | ||
# arg3: command to execute | ||
kci_netdev_ethtool_test() | ||
{ | ||
if [ $# -le 2 ];then | ||
echo "SKIP: $netdev: ethtool: invalid number of arguments" | ||
return 1 | ||
fi | ||
$3 >/dev/null | ||
ret=$? | ||
if [ $ret -ne 0 ];then | ||
if [ $ret -eq "$1" ];then | ||
echo "SKIP: $netdev: ethtool $2 not supported" | ||
else | ||
echo "FAIL: $netdev: ethtool $2" | ||
return 1 | ||
fi | ||
else | ||
echo "PASS: $netdev: ethtool $2" | ||
fi | ||
return 0 | ||
} | ||
|
||
# test ethtool commands | ||
# arg1: network interface name | ||
kci_netdev_ethtool() | ||
{ | ||
netdev=$1 | ||
|
||
#check presence of ethtool | ||
ethtool --version 2>/dev/null >/dev/null | ||
if [ $? -ne 0 ];then | ||
echo "SKIP: ethtool not present" | ||
return 1 | ||
fi | ||
|
||
TMP_ETHTOOL_FEATURES="$(mktemp)" | ||
if [ ! -e "$TMP_ETHTOOL_FEATURES" ];then | ||
echo "SKIP: Cannot create a tmp file" | ||
return 1 | ||
fi | ||
|
||
ethtool -k "$netdev" > "$TMP_ETHTOOL_FEATURES" | ||
if [ $? -ne 0 ];then | ||
echo "FAIL: $netdev: ethtool list features" | ||
rm "$TMP_ETHTOOL_FEATURES" | ||
return 1 | ||
fi | ||
echo "PASS: $netdev: ethtool list features" | ||
#TODO for each non fixed features, try to turn them on/off | ||
rm "$TMP_ETHTOOL_FEATURES" | ||
|
||
kci_netdev_ethtool_test 74 'dump' "ethtool -d $netdev" | ||
kci_netdev_ethtool_test 94 'stats' "ethtool -S $netdev" | ||
return 0 | ||
} | ||
|
||
# stop a netdev | ||
# arg1: network interface name | ||
kci_netdev_stop() | ||
{ | ||
netdev=$1 | ||
|
||
if [ $NETDEV_STARTED -eq 0 ];then | ||
echo "SKIP: $netdev: interface kept up" | ||
return 0 | ||
fi | ||
|
||
ip link set "$netdev" down | ||
if [ $? -ne 0 ];then | ||
echo "FAIL: $netdev: stop interface" | ||
return 1 | ||
fi | ||
echo "PASS: $netdev: stop interface" | ||
return 0 | ||
} | ||
|
||
# run all test on a netdev | ||
# arg1: network interface name | ||
kci_test_netdev() | ||
{ | ||
NETDEV_STARTED=0 | ||
IFACE_TO_UPDOWN="$1" | ||
IFACE_TO_TEST="$1" | ||
#check for VLAN interface | ||
MASTER_IFACE="$(echo $1 | cut -d@ -f2)" | ||
if [ ! -z "$MASTER_IFACE" ];then | ||
IFACE_TO_UPDOWN="$MASTER_IFACE" | ||
IFACE_TO_TEST="$(echo $1 | cut -d@ -f1)" | ||
fi | ||
|
||
NETDEV_STARTED=0 | ||
kci_net_start "$IFACE_TO_UPDOWN" | ||
|
||
kci_net_setup "$IFACE_TO_TEST" | ||
|
||
kci_netdev_ethtool "$IFACE_TO_TEST" | ||
|
||
kci_netdev_stop "$IFACE_TO_UPDOWN" | ||
return 0 | ||
} | ||
|
||
#check for needed privileges | ||
if [ "$(id -u)" -ne 0 ];then | ||
echo "SKIP: Need root privileges" | ||
exit 0 | ||
fi | ||
|
||
ip -Version 2>/dev/null >/dev/null | ||
if [ $? -ne 0 ];then | ||
echo "SKIP: Could not run test without the ip tool" | ||
exit 0 | ||
fi | ||
|
||
TMP_LIST_NETDEV="$(mktemp)" | ||
if [ ! -e "$TMP_LIST_NETDEV" ];then | ||
echo "FAIL: Cannot create a tmp file" | ||
exit 1 | ||
fi | ||
|
||
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" | ||
while read netdev | ||
do | ||
kci_test_netdev "$netdev" | ||
done < "$TMP_LIST_NETDEV" | ||
|
||
rm "$TMP_LIST_NETDEV" | ||
exit 0 |