1#!/bin/sh 2# SPDX-License-Identifier: GPL-2.0 3# 4# This test is for checking network interface 5# For the moment it tests only ethernet interface (but wifi could be easily added) 6# 7# We assume that all network driver are loaded 8# if not they probably have failed earlier in the boot process and their logged error will be catched by another test 9# 10 11# Kselftest framework requirement - SKIP code is 4. 12ksft_skip=4 13 14# this function will try to up the interface 15# if already up, nothing done 16# arg1: network interface name 17kci_net_start() 18{ 19 netdev=$1 20 21 ip link show "$netdev" |grep -q UP 22 if [ $? -eq 0 ];then 23 echo "SKIP: $netdev: interface already up" 24 return $ksft_skip 25 fi 26 27 ip link set "$netdev" up 28 if [ $? -ne 0 ];then 29 echo "FAIL: $netdev: Fail to up interface" 30 return 1 31 else 32 echo "PASS: $netdev: set interface up" 33 NETDEV_STARTED=1 34 fi 35 return 0 36} 37 38# this function will try to setup an IP and MAC address on a network interface 39# Doing nothing if the interface was already up 40# arg1: network interface name 41kci_net_setup() 42{ 43 netdev=$1 44 45 # do nothing if the interface was already up 46 if [ $NETDEV_STARTED -eq 0 ];then 47 return 0 48 fi 49 50 MACADDR='02:03:04:05:06:07' 51 ip link set dev $netdev address "$MACADDR" 52 if [ $? -ne 0 ];then 53 echo "FAIL: $netdev: Cannot set MAC address" 54 else 55 ip link show $netdev |grep -q "$MACADDR" 56 if [ $? -eq 0 ];then 57 echo "PASS: $netdev: set MAC address" 58 else 59 echo "FAIL: $netdev: Cannot set MAC address" 60 fi 61 fi 62 63 #check that the interface did not already have an IP 64 ip address show "$netdev" |grep '^[[:space:]]*inet' 65 if [ $? -eq 0 ];then 66 echo "SKIP: $netdev: already have an IP" 67 return $ksft_skip 68 fi 69 70 if [ "$veth_created" ]; then 71 echo "XFAIL: $netdev: set IP address unsupported for veth*" 72 else 73 # TODO what ipaddr to set ? DHCP ? 74 echo "SKIP: $netdev: set IP address" 75 fi 76 return $ksft_skip 77} 78 79# test an ethtool command 80# arg1: return code for not supported (see ethtool code source) 81# arg2: summary of the command 82# arg3: command to execute 83kci_netdev_ethtool_test() 84{ 85 if [ $# -le 2 ];then 86 echo "SKIP: $netdev: ethtool: invalid number of arguments" 87 return 1 88 fi 89 $3 >/dev/null 90 ret=$? 91 if [ $ret -ne 0 ];then 92 if [ $ret -eq "$1" ];then 93 echo "XFAIL: $netdev: ethtool $2 not supported" 94 return $ksft_skip 95 else 96 echo "FAIL: $netdev: ethtool $2" 97 return 1 98 fi 99 else 100 echo "PASS: $netdev: ethtool $2" 101 fi 102 return 0 103} 104 105# test ethtool commands 106# arg1: network interface name 107kci_netdev_ethtool() 108{ 109 netdev=$1 110 111 #check presence of ethtool 112 ethtool --version 2>/dev/null >/dev/null 113 if [ $? -ne 0 ];then 114 echo "SKIP: ethtool not present" 115 return $ksft_skip 116 fi 117 118 TMP_ETHTOOL_FEATURES="$(mktemp)" 119 if [ ! -e "$TMP_ETHTOOL_FEATURES" ];then 120 echo "SKIP: Cannot create a tmp file" 121 return 1 122 fi 123 124 ethtool -k "$netdev" > "$TMP_ETHTOOL_FEATURES" 125 if [ $? -ne 0 ];then 126 echo "FAIL: $netdev: ethtool list features" 127 rm "$TMP_ETHTOOL_FEATURES" 128 return 1 129 fi 130 echo "PASS: $netdev: ethtool list features" 131 132 while read -r FEATURE VALUE FIXED; do 133 [ "$FEATURE" != "Features" ] || continue # Skip "Features" 134 [ "$FIXED" != "[fixed]" ] || continue # Skip fixed features 135 feature="${FEATURE%:*}" 136 137 ethtool --offload "$netdev" "$feature" off 138 if [ $? -eq 0 ]; then 139 echo "PASS: $netdev: Turned off feature: $feature" 140 else 141 echo "FAIL: $netdev: Failed to turn off feature:" \ 142 "$feature" 143 fi 144 145 ethtool --offload "$netdev" "$feature" on 146 if [ $? -eq 0 ]; then 147 echo "PASS: $netdev: Turned on feature: $feature" 148 else 149 echo "FAIL: $netdev: Failed to turn on feature:" \ 150 "$feature" 151 fi 152 153 #restore the feature to its initial state 154 ethtool --offload "$netdev" "$feature" "$VALUE" 155 if [ $? -eq 0 ]; then 156 echo "PASS: $netdev: Restore feature $feature" \ 157 "to initial state $VALUE" 158 else 159 echo "FAIL: $netdev: Failed to restore feature" \ 160 "$feature to initial state $VALUE" 161 fi 162 163 done < "$TMP_ETHTOOL_FEATURES" 164 165 rm "$TMP_ETHTOOL_FEATURES" 166 167 kci_netdev_ethtool_test 74 'dump' "ethtool -d $netdev" 168 kci_netdev_ethtool_test 94 'stats' "ethtool -S $netdev" 169 170 return 0 171} 172 173# stop a netdev 174# arg1: network interface name 175kci_netdev_stop() 176{ 177 netdev=$1 178 179 if [ $NETDEV_STARTED -eq 0 ];then 180 echo "SKIP: $netdev: interface kept up" 181 return 0 182 fi 183 184 ip link set "$netdev" down 185 if [ $? -ne 0 ];then 186 echo "FAIL: $netdev: stop interface" 187 return 1 188 fi 189 echo "PASS: $netdev: stop interface" 190 return 0 191} 192 193# run all test on a netdev 194# arg1: network interface name 195kci_test_netdev() 196{ 197 NETDEV_STARTED=0 198 IFACE_TO_UPDOWN="$1" 199 IFACE_TO_TEST="$1" 200 #check for VLAN interface 201 MASTER_IFACE="$(echo $1 | cut -d@ -f2)" 202 if [ ! -z "$MASTER_IFACE" ];then 203 IFACE_TO_UPDOWN="$MASTER_IFACE" 204 IFACE_TO_TEST="$(echo $1 | cut -d@ -f1)" 205 fi 206 207 NETDEV_STARTED=0 208 kci_net_start "$IFACE_TO_UPDOWN" 209 210 kci_net_setup "$IFACE_TO_TEST" 211 212 kci_netdev_ethtool "$IFACE_TO_TEST" 213 214 kci_netdev_stop "$IFACE_TO_UPDOWN" 215 return 0 216} 217 218#check for needed privileges 219if [ "$(id -u)" -ne 0 ];then 220 echo "SKIP: Need root privileges" 221 exit $ksft_skip 222fi 223 224ip link show 2>/dev/null >/dev/null 225if [ $? -ne 0 ];then 226 echo "SKIP: Could not run test without the ip tool" 227 exit $ksft_skip 228fi 229 230TMP_LIST_NETDEV="$(mktemp)" 231if [ ! -e "$TMP_LIST_NETDEV" ];then 232 echo "FAIL: Cannot create a tmp file" 233 exit 1 234fi 235 236ip 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" 237 238if [ ! -s "$TMP_LIST_NETDEV" ]; then 239 echo "No valid network device found, creating veth pair" 240 ip link add veth0 type veth peer name veth1 241 echo "veth0" > "$TMP_LIST_NETDEV" 242 veth_created=1 243fi 244 245while read netdev 246do 247 kci_test_netdev "$netdev" 248done < "$TMP_LIST_NETDEV" 249 250#clean up veth interface pair if it was created 251if [ "$veth_created" ]; then 252 ip link delete veth0 253 echo "Removed veth pair" 254fi 255 256rm "$TMP_LIST_NETDEV" 257exit 0 258