Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

LABBE Corentin and committed by
David S. Miller
af0e5461 2e507e24

+201 -1
+1 -1
tools/testing/selftests/net/Makefile
··· 5 5 6 6 reuseport_bpf_numa: LDFLAGS += -lnuma 7 7 8 - TEST_PROGS := run_netsocktests run_afpackettests test_bpf.sh 8 + TEST_PROGS := run_netsocktests run_afpackettests test_bpf.sh netdevice.sh 9 9 TEST_GEN_FILES = socket 10 10 TEST_GEN_FILES += psock_fanout psock_tpacket 11 11 TEST_GEN_FILES += reuseport_bpf reuseport_bpf_cpu reuseport_bpf_numa
+200
tools/testing/selftests/net/netdevice.sh
··· 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 13 + kci_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 37 + kci_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 75 + kci_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 98 + kci_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 132 + kci_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 152 + kci_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 176 + if [ "$(id -u)" -ne 0 ];then 177 + echo "SKIP: Need root privileges" 178 + exit 0 179 + fi 180 + 181 + ip -Version 2>/dev/null >/dev/null 182 + if [ $? -ne 0 ];then 183 + echo "SKIP: Could not run test without the ip tool" 184 + exit 0 185 + fi 186 + 187 + TMP_LIST_NETDEV="$(mktemp)" 188 + if [ ! -e "$TMP_LIST_NETDEV" ];then 189 + echo "FAIL: Cannot create a tmp file" 190 + exit 1 191 + fi 192 + 193 + 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" 194 + while read netdev 195 + do 196 + kci_test_netdev "$netdev" 197 + done < "$TMP_LIST_NETDEV" 198 + 199 + rm "$TMP_LIST_NETDEV" 200 + exit 0