2017-04-04 13:35:20

by Corentin Labbe

[permalink] [raw]
Subject: [PATCH v2] 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 <[email protected]>
---

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
+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
--
2.10.2


2017-04-04 14:25:08

by Andrew Lunn

[permalink] [raw]
Subject: Re: [PATCH v2] selftests: add a generic testsuite for ethernet device

On Tue, Apr 04, 2017 at 03:32:47PM +0200, Corentin Labbe wrote:
> This patch add a generic testsuite for testing ethernet network device driver.

# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAUL0
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFA2
link/ether 94:10:3e:80:bc:f3 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFA2
link/ether a2:e2:da:92:7e:8c brd ff:ff:ff:ff:ff:ff
4: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default0
link/sit 0.0.0.0 brd 0.0.0.0
5: lan4@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state 0
link/ether 94:10:3e:80:bc:f3 brd ff:ff:ff:ff:ff:ff
6: lan3@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT0
link/ether 94:10:3e:80:bc:f3 brd ff:ff:ff:ff:ff:ff
7: lan2@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state 0
link/ether 94:10:3e:80:bc:f3 brd ff:ff:ff:ff:ff:ff
8: lan1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP0
link/ether 94:10:3e:80:bc:f3 brd ff:ff:ff:ff:ff:ff
9: internet@eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue st0
link/ether 94:10:3e:80:bc:f3 brd ff:ff:ff:ff:ff:ff

# /home/andrew/netdevice.sh
[ 151.417351] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
PASS: eth0: set interface up
PASS: eth0: set MAC address
SKIP: eth0: set IP address
PASS: eth0: ethtool list features
Cannot get register dump: Operation not supported
SKIP: eth0: ethtool dump not supported
PASS: eth0: ethtool stats
PASS: eth0: stop interface
SKIP: eth1: interface already up
PASS: eth1: ethtool list features
Cannot get register dump: Operation not supported
SKIP: eth1: ethtool dump not supported
PASS: eth1: ethtool stats
SKIP: eth1: interface kept up
PASS: eth0: set interface up
PASS: lan4: set MAC address
inet 192.168.13.2/24 brd 192.168.13.255 scope global lan4
SKIP: lan4: already have an IP
PASS: lan4: ethtool list features
PASS: lan4: ethtool dump
PASS: lan4: ethtool stats
PASS: eth0: stop interface
PASS: eth0: set interface up
PASS: lan3: set MAC address
SKIP: lan3: set IP address
PASS: lan3: ethtool list features
PASS: lan3: ethtool dump
PASS: lan3: ethtool stats
PASS: eth0: stop interface
PASS: eth0: set interface up
PASS: lan2: set MAC address
SKIP: lan2: set IP address
PASS: lan2: ethtool list features
PASS: lan2: ethtool dump
PASS: lan2: ethtool stats
PASS: eth0: stop interface
PASS: eth0: set interface up
PASS: lan1: set MAC address
inet 10.0.0.12/24 brd 10.0.0.255 scope global lan1
SKIP: lan1: already have an IP
PASS: lan1: ethtool list features
PASS: lan1: ethtool dump
PASS: lan1: ethtool stats
PASS: eth0: stop interface
PASS: eth0: set interface up
PASS: internet: set MAC address
inet 192.168.10.2/24 brd 192.168.10.255 scope global internet
SKIP: internet: already have an IP
PASS: internet: ethtool list features
PASS: internet: ethtool dump
PASS: internet: ethtool stats
PASS: eth0: stop interface

Cool

Tested-by: Andrew Lunn <[email protected]>

Andrew

2017-04-04 14:43:26

by Niklas Cassel

[permalink] [raw]
Subject: Re: [PATCH v2] selftests: add a generic testsuite for ethernet device

On 04/04/2017 03:32 PM, Corentin Labbe wrote:
> This patch add a generic testsuite for testing ethernet network device driver.
>
> Signed-off-by: Corentin Labbe <[email protected]>
> ---
>
> 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
>
(snip)

Good work!

I suggest adding a test for setting MTU as well.
It doesn't have to be added before merging, but it
would be great if it could be added in the near future.


Regards,
Niklas

2017-04-04 14:50:31

by Corentin Labbe

[permalink] [raw]
Subject: Re: [PATCH v2] selftests: add a generic testsuite for ethernet device

On Tue, Apr 04, 2017 at 04:43:19PM +0200, Niklas Cassel wrote:
> On 04/04/2017 03:32 PM, Corentin Labbe wrote:
> > This patch add a generic testsuite for testing ethernet network device driver.
> >
> > Signed-off-by: Corentin Labbe <[email protected]>
> > ---
> >
> > 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
> >
> (snip)
>
> Good work!
>
> I suggest adding a test for setting MTU as well.
> It doesn't have to be added before merging, but it
> would be great if it could be added in the near future.
>
>
> Regards,
> Niklas

I already have it but prefer to add few test and add the rest one by one.
But yes, I should add it as TODO like set ipaddr.

Regards

2017-04-04 15:00:38

by Andrew Lunn

[permalink] [raw]
Subject: Re: [PATCH v2] selftests: add a generic testsuite for ethernet device

On Tue, Apr 04, 2017 at 04:43:19PM +0200, Niklas Cassel wrote:
> On 04/04/2017 03:32 PM, Corentin Labbe wrote:
> > This patch add a generic testsuite for testing ethernet network device driver.
> >
> > Signed-off-by: Corentin Labbe <[email protected]>
> > ---
> >
> > 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
> >
> (snip)
>
> Good work!
>
> I suggest adding a test for setting MTU as well.

That one might be tricky. Some devices don't allow the MTU to be
changed when the device is up. Others might require the interface is
up...

Andrew

2017-04-05 15:30:41

by David Miller

[permalink] [raw]
Subject: Re: [PATCH v2] selftests: add a generic testsuite for ethernet device

From: Corentin Labbe <[email protected]>
Date: Tue, 4 Apr 2017 15:32:47 +0200

> This patch add a generic testsuite for testing ethernet network device driver.
>
> Signed-off-by: Corentin Labbe <[email protected]>
> ---
>
> Changes since v1:
> - Test for starting master interface
> - Changed printing format to "RESULT: $netdev: line"
> - Use "ip link" to get device list

Applied, thanks.

2017-06-29 08:26:51

by Fathi Boudra

[permalink] [raw]
Subject: Re: [PATCH v2] selftests: add a generic testsuite for ethernet device

On 4 April 2017 at 16:32, Corentin Labbe <[email protected]> wrote:
> This patch add a generic testsuite for testing ethernet network device driver.
>
> Signed-off-by: Corentin Labbe <[email protected]>
> ---
>
> 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}

> +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
> --
> 2.10.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kselftest" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

2017-07-01 06:42:33

by Corentin Labbe

[permalink] [raw]
Subject: Re: [PATCH v2] selftests: add a generic testsuite for ethernet device

On Thu, Jun 29, 2017 at 11:26:40AM +0300, Fathi Boudra wrote:
> On 4 April 2017 at 16:32, Corentin Labbe <[email protected]> wrote:
> > This patch add a generic testsuite for testing ethernet network device driver.
> >
> > Signed-off-by: Corentin Labbe <[email protected]>
> > ---
> >
> > 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