123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- #!/bin/sh
- # SPDX-License-Identifier: GPL-2.0
- #
- # 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
- #
- # Kselftest framework requirement - SKIP code is 4.
- ksft_skip=4
- # 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 $ksft_skip
- 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 $ksft_skip
- fi
- # TODO what ipaddr to set ? DHCP ?
- echo "SKIP: $netdev: set IP address"
- return $ksft_skip
- }
- # 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"
- return $ksft_skip
- 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 $ksft_skip
- 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 $ksft_skip
- fi
- ip link show 2>/dev/null >/dev/null
- if [ $? -ne 0 ];then
- echo "SKIP: Could not run test without the ip tool"
- exit $ksft_skip
- 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
|