On Thu, Jun 29, 2017 at 11:26:40AM +0300, Fathi Boudra wrote: > On 4 April 2017 at 16:32, Corentin Labbe <clabbe.montjoie@xxxxxxxxx> wrote: > > This patch add a generic testsuite for testing ethernet network device driver. > > > > Signed-off-by: Corentin Labbe <clabbe.montjoie@xxxxxxxxx> > > --- > > > > Changes since v1: > > - Test for starting master interface > > - Changed printing format to "RESULT: $netdev: line" > > - Use "ip link" to get device list > > > > tools/testing/selftests/net/Makefile | 2 +- > > tools/testing/selftests/net/netdevice.sh | 200 +++++++++++++++++++++++++++++++ > > 2 files changed, 201 insertions(+), 1 deletion(-) > > create mode 100755 tools/testing/selftests/net/netdevice.sh > > > > diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile > > index fbfe5d0..35cbb4c 100644 > > --- a/tools/testing/selftests/net/Makefile > > +++ b/tools/testing/selftests/net/Makefile > > @@ -5,7 +5,7 @@ CFLAGS += -I../../../../usr/include/ > > > > reuseport_bpf_numa: LDFLAGS += -lnuma > > > > -TEST_PROGS := run_netsocktests run_afpackettests test_bpf.sh > > +TEST_PROGS := run_netsocktests run_afpackettests test_bpf.sh netdevice.sh > > TEST_GEN_FILES = socket > > TEST_GEN_FILES += psock_fanout psock_tpacket > > TEST_GEN_FILES += reuseport_bpf reuseport_bpf_cpu reuseport_bpf_numa > > diff --git a/tools/testing/selftests/net/netdevice.sh b/tools/testing/selftests/net/netdevice.sh > > new file mode 100755 > > index 0000000..4e00568 > > --- /dev/null > > +++ b/tools/testing/selftests/net/netdevice.sh > > @@ -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 > > is the test supposed to work with busybox's ip or only with iproute2 version? > > # ip -Version > BusyBox v1.24.1 (2017-06-14 13:46:50 UTC) multi-call binary. > > Usage: ip [OPTIONS] {address | route | link | tunnel | } {COMMAND} > Hello Since I have forgotten that busybox have the ip tool, I have tested only with iproute2. But someone just sent a patch for handling busybox ip. Regards -- To unsubscribe from this list: send the line "unsubscribe linux-kselftest" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html