Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/sh
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 # This test is for checking network interface
0005 # For the moment it tests only ethernet interface (but wifi could be easily added)
0006 #
0007 # We assume that all network driver are loaded
0008 # if not they probably have failed earlier in the boot process and their logged error will be catched by another test
0009 #
0010 
0011 # Kselftest framework requirement - SKIP code is 4.
0012 ksft_skip=4
0013 
0014 # this function will try to up the interface
0015 # if already up, nothing done
0016 # arg1: network interface name
0017 kci_net_start()
0018 {
0019         netdev=$1
0020 
0021         ip link show "$netdev" |grep -q UP
0022         if [ $? -eq 0 ];then
0023                 echo "SKIP: $netdev: interface already up"
0024                 return $ksft_skip
0025         fi
0026 
0027         ip link set "$netdev" up
0028         if [ $? -ne 0 ];then
0029                 echo "FAIL: $netdev: Fail to up interface"
0030                 return 1
0031         else
0032                 echo "PASS: $netdev: set interface up"
0033                 NETDEV_STARTED=1
0034         fi
0035         return 0
0036 }
0037 
0038 # this function will try to setup an IP and MAC address on a network interface
0039 # Doing nothing if the interface was already up
0040 # arg1: network interface name
0041 kci_net_setup()
0042 {
0043         netdev=$1
0044 
0045         # do nothing if the interface was already up
0046         if [ $NETDEV_STARTED -eq 0 ];then
0047                 return 0
0048         fi
0049 
0050         MACADDR='02:03:04:05:06:07'
0051         ip link set dev $netdev address "$MACADDR"
0052         if [ $? -ne 0 ];then
0053                 echo "FAIL: $netdev: Cannot set MAC address"
0054         else
0055                 ip link show $netdev |grep -q "$MACADDR"
0056                 if [ $? -eq 0 ];then
0057                         echo "PASS: $netdev: set MAC address"
0058                 else
0059                         echo "FAIL: $netdev: Cannot set MAC address"
0060                 fi
0061         fi
0062 
0063         #check that the interface did not already have an IP
0064         ip address show "$netdev" |grep '^[[:space:]]*inet'
0065         if [ $? -eq 0 ];then
0066                 echo "SKIP: $netdev: already have an IP"
0067                 return $ksft_skip
0068         fi
0069 
0070         # TODO what ipaddr to set ? DHCP ?
0071         echo "SKIP: $netdev: set IP address"
0072         return $ksft_skip
0073 }
0074 
0075 # test an ethtool command
0076 # arg1: return code for not supported (see ethtool code source)
0077 # arg2: summary of the command
0078 # arg3: command to execute
0079 kci_netdev_ethtool_test()
0080 {
0081         if [ $# -le 2 ];then
0082                 echo "SKIP: $netdev: ethtool: invalid number of arguments"
0083                 return 1
0084         fi
0085         $3 >/dev/null
0086         ret=$?
0087         if [ $ret -ne 0 ];then
0088                 if [ $ret -eq "$1" ];then
0089                         echo "SKIP: $netdev: ethtool $2 not supported"
0090                         return $ksft_skip
0091                 else
0092                         echo "FAIL: $netdev: ethtool $2"
0093                         return 1
0094                 fi
0095         else
0096                 echo "PASS: $netdev: ethtool $2"
0097         fi
0098         return 0
0099 }
0100 
0101 # test ethtool commands
0102 # arg1: network interface name
0103 kci_netdev_ethtool()
0104 {
0105         netdev=$1
0106 
0107         #check presence of ethtool
0108         ethtool --version 2>/dev/null >/dev/null
0109         if [ $? -ne 0 ];then
0110                 echo "SKIP: ethtool not present"
0111                 return $ksft_skip
0112         fi
0113 
0114         TMP_ETHTOOL_FEATURES="$(mktemp)"
0115         if [ ! -e "$TMP_ETHTOOL_FEATURES" ];then
0116                 echo "SKIP: Cannot create a tmp file"
0117                 return 1
0118         fi
0119 
0120         ethtool -k "$netdev" > "$TMP_ETHTOOL_FEATURES"
0121         if [ $? -ne 0 ];then
0122                 echo "FAIL: $netdev: ethtool list features"
0123                 rm "$TMP_ETHTOOL_FEATURES"
0124                 return 1
0125         fi
0126         echo "PASS: $netdev: ethtool list features"
0127         #TODO for each non fixed features, try to turn them on/off
0128         rm "$TMP_ETHTOOL_FEATURES"
0129 
0130         kci_netdev_ethtool_test 74 'dump' "ethtool -d $netdev"
0131         kci_netdev_ethtool_test 94 'stats' "ethtool -S $netdev"
0132         return 0
0133 }
0134 
0135 # stop a netdev
0136 # arg1: network interface name
0137 kci_netdev_stop()
0138 {
0139         netdev=$1
0140 
0141         if [ $NETDEV_STARTED -eq 0 ];then
0142                 echo "SKIP: $netdev: interface kept up"
0143                 return 0
0144         fi
0145 
0146         ip link set "$netdev" down
0147         if [ $? -ne 0 ];then
0148                 echo "FAIL: $netdev: stop interface"
0149                 return 1
0150         fi
0151         echo "PASS: $netdev: stop interface"
0152         return 0
0153 }
0154 
0155 # run all test on a netdev
0156 # arg1: network interface name
0157 kci_test_netdev()
0158 {
0159         NETDEV_STARTED=0
0160         IFACE_TO_UPDOWN="$1"
0161         IFACE_TO_TEST="$1"
0162         #check for VLAN interface
0163         MASTER_IFACE="$(echo $1 | cut -d@ -f2)"
0164         if [ ! -z "$MASTER_IFACE" ];then
0165                 IFACE_TO_UPDOWN="$MASTER_IFACE"
0166                 IFACE_TO_TEST="$(echo $1 | cut -d@ -f1)"
0167         fi
0168 
0169         NETDEV_STARTED=0
0170         kci_net_start "$IFACE_TO_UPDOWN"
0171 
0172         kci_net_setup "$IFACE_TO_TEST"
0173 
0174         kci_netdev_ethtool "$IFACE_TO_TEST"
0175 
0176         kci_netdev_stop "$IFACE_TO_UPDOWN"
0177         return 0
0178 }
0179 
0180 #check for needed privileges
0181 if [ "$(id -u)" -ne 0 ];then
0182         echo "SKIP: Need root privileges"
0183         exit $ksft_skip
0184 fi
0185 
0186 ip link show 2>/dev/null >/dev/null
0187 if [ $? -ne 0 ];then
0188         echo "SKIP: Could not run test without the ip tool"
0189         exit $ksft_skip
0190 fi
0191 
0192 TMP_LIST_NETDEV="$(mktemp)"
0193 if [ ! -e "$TMP_LIST_NETDEV" ];then
0194         echo "FAIL: Cannot create a tmp file"
0195         exit 1
0196 fi
0197 
0198 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"
0199 while read netdev
0200 do
0201         kci_test_netdev "$netdev"
0202 done < "$TMP_LIST_NETDEV"
0203 
0204 rm "$TMP_LIST_NETDEV"
0205 exit 0