1*4882a593Smuzhiyun#!/bin/sh 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun# This test is for checking network interface 5*4882a593Smuzhiyun# For the moment it tests only ethernet interface (but wifi could be easily added) 6*4882a593Smuzhiyun# 7*4882a593Smuzhiyun# We assume that all network driver are loaded 8*4882a593Smuzhiyun# if not they probably have failed earlier in the boot process and their logged error will be catched by another test 9*4882a593Smuzhiyun# 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun# Kselftest framework requirement - SKIP code is 4. 12*4882a593Smuzhiyunksft_skip=4 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun# this function will try to up the interface 15*4882a593Smuzhiyun# if already up, nothing done 16*4882a593Smuzhiyun# arg1: network interface name 17*4882a593Smuzhiyunkci_net_start() 18*4882a593Smuzhiyun{ 19*4882a593Smuzhiyun netdev=$1 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun ip link show "$netdev" |grep -q UP 22*4882a593Smuzhiyun if [ $? -eq 0 ];then 23*4882a593Smuzhiyun echo "SKIP: $netdev: interface already up" 24*4882a593Smuzhiyun return $ksft_skip 25*4882a593Smuzhiyun fi 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun ip link set "$netdev" up 28*4882a593Smuzhiyun if [ $? -ne 0 ];then 29*4882a593Smuzhiyun echo "FAIL: $netdev: Fail to up interface" 30*4882a593Smuzhiyun return 1 31*4882a593Smuzhiyun else 32*4882a593Smuzhiyun echo "PASS: $netdev: set interface up" 33*4882a593Smuzhiyun NETDEV_STARTED=1 34*4882a593Smuzhiyun fi 35*4882a593Smuzhiyun return 0 36*4882a593Smuzhiyun} 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun# this function will try to setup an IP and MAC address on a network interface 39*4882a593Smuzhiyun# Doing nothing if the interface was already up 40*4882a593Smuzhiyun# arg1: network interface name 41*4882a593Smuzhiyunkci_net_setup() 42*4882a593Smuzhiyun{ 43*4882a593Smuzhiyun netdev=$1 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun # do nothing if the interface was already up 46*4882a593Smuzhiyun if [ $NETDEV_STARTED -eq 0 ];then 47*4882a593Smuzhiyun return 0 48*4882a593Smuzhiyun fi 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun MACADDR='02:03:04:05:06:07' 51*4882a593Smuzhiyun ip link set dev $netdev address "$MACADDR" 52*4882a593Smuzhiyun if [ $? -ne 0 ];then 53*4882a593Smuzhiyun echo "FAIL: $netdev: Cannot set MAC address" 54*4882a593Smuzhiyun else 55*4882a593Smuzhiyun ip link show $netdev |grep -q "$MACADDR" 56*4882a593Smuzhiyun if [ $? -eq 0 ];then 57*4882a593Smuzhiyun echo "PASS: $netdev: set MAC address" 58*4882a593Smuzhiyun else 59*4882a593Smuzhiyun echo "FAIL: $netdev: Cannot set MAC address" 60*4882a593Smuzhiyun fi 61*4882a593Smuzhiyun fi 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #check that the interface did not already have an IP 64*4882a593Smuzhiyun ip address show "$netdev" |grep '^[[:space:]]*inet' 65*4882a593Smuzhiyun if [ $? -eq 0 ];then 66*4882a593Smuzhiyun echo "SKIP: $netdev: already have an IP" 67*4882a593Smuzhiyun return $ksft_skip 68*4882a593Smuzhiyun fi 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun # TODO what ipaddr to set ? DHCP ? 71*4882a593Smuzhiyun echo "SKIP: $netdev: set IP address" 72*4882a593Smuzhiyun return $ksft_skip 73*4882a593Smuzhiyun} 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun# test an ethtool command 76*4882a593Smuzhiyun# arg1: return code for not supported (see ethtool code source) 77*4882a593Smuzhiyun# arg2: summary of the command 78*4882a593Smuzhiyun# arg3: command to execute 79*4882a593Smuzhiyunkci_netdev_ethtool_test() 80*4882a593Smuzhiyun{ 81*4882a593Smuzhiyun if [ $# -le 2 ];then 82*4882a593Smuzhiyun echo "SKIP: $netdev: ethtool: invalid number of arguments" 83*4882a593Smuzhiyun return 1 84*4882a593Smuzhiyun fi 85*4882a593Smuzhiyun $3 >/dev/null 86*4882a593Smuzhiyun ret=$? 87*4882a593Smuzhiyun if [ $ret -ne 0 ];then 88*4882a593Smuzhiyun if [ $ret -eq "$1" ];then 89*4882a593Smuzhiyun echo "SKIP: $netdev: ethtool $2 not supported" 90*4882a593Smuzhiyun return $ksft_skip 91*4882a593Smuzhiyun else 92*4882a593Smuzhiyun echo "FAIL: $netdev: ethtool $2" 93*4882a593Smuzhiyun return 1 94*4882a593Smuzhiyun fi 95*4882a593Smuzhiyun else 96*4882a593Smuzhiyun echo "PASS: $netdev: ethtool $2" 97*4882a593Smuzhiyun fi 98*4882a593Smuzhiyun return 0 99*4882a593Smuzhiyun} 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun# test ethtool commands 102*4882a593Smuzhiyun# arg1: network interface name 103*4882a593Smuzhiyunkci_netdev_ethtool() 104*4882a593Smuzhiyun{ 105*4882a593Smuzhiyun netdev=$1 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun #check presence of ethtool 108*4882a593Smuzhiyun ethtool --version 2>/dev/null >/dev/null 109*4882a593Smuzhiyun if [ $? -ne 0 ];then 110*4882a593Smuzhiyun echo "SKIP: ethtool not present" 111*4882a593Smuzhiyun return $ksft_skip 112*4882a593Smuzhiyun fi 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun TMP_ETHTOOL_FEATURES="$(mktemp)" 115*4882a593Smuzhiyun if [ ! -e "$TMP_ETHTOOL_FEATURES" ];then 116*4882a593Smuzhiyun echo "SKIP: Cannot create a tmp file" 117*4882a593Smuzhiyun return 1 118*4882a593Smuzhiyun fi 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun ethtool -k "$netdev" > "$TMP_ETHTOOL_FEATURES" 121*4882a593Smuzhiyun if [ $? -ne 0 ];then 122*4882a593Smuzhiyun echo "FAIL: $netdev: ethtool list features" 123*4882a593Smuzhiyun rm "$TMP_ETHTOOL_FEATURES" 124*4882a593Smuzhiyun return 1 125*4882a593Smuzhiyun fi 126*4882a593Smuzhiyun echo "PASS: $netdev: ethtool list features" 127*4882a593Smuzhiyun #TODO for each non fixed features, try to turn them on/off 128*4882a593Smuzhiyun rm "$TMP_ETHTOOL_FEATURES" 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun kci_netdev_ethtool_test 74 'dump' "ethtool -d $netdev" 131*4882a593Smuzhiyun kci_netdev_ethtool_test 94 'stats' "ethtool -S $netdev" 132*4882a593Smuzhiyun return 0 133*4882a593Smuzhiyun} 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun# stop a netdev 136*4882a593Smuzhiyun# arg1: network interface name 137*4882a593Smuzhiyunkci_netdev_stop() 138*4882a593Smuzhiyun{ 139*4882a593Smuzhiyun netdev=$1 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun if [ $NETDEV_STARTED -eq 0 ];then 142*4882a593Smuzhiyun echo "SKIP: $netdev: interface kept up" 143*4882a593Smuzhiyun return 0 144*4882a593Smuzhiyun fi 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun ip link set "$netdev" down 147*4882a593Smuzhiyun if [ $? -ne 0 ];then 148*4882a593Smuzhiyun echo "FAIL: $netdev: stop interface" 149*4882a593Smuzhiyun return 1 150*4882a593Smuzhiyun fi 151*4882a593Smuzhiyun echo "PASS: $netdev: stop interface" 152*4882a593Smuzhiyun return 0 153*4882a593Smuzhiyun} 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun# run all test on a netdev 156*4882a593Smuzhiyun# arg1: network interface name 157*4882a593Smuzhiyunkci_test_netdev() 158*4882a593Smuzhiyun{ 159*4882a593Smuzhiyun NETDEV_STARTED=0 160*4882a593Smuzhiyun IFACE_TO_UPDOWN="$1" 161*4882a593Smuzhiyun IFACE_TO_TEST="$1" 162*4882a593Smuzhiyun #check for VLAN interface 163*4882a593Smuzhiyun MASTER_IFACE="$(echo $1 | cut -d@ -f2)" 164*4882a593Smuzhiyun if [ ! -z "$MASTER_IFACE" ];then 165*4882a593Smuzhiyun IFACE_TO_UPDOWN="$MASTER_IFACE" 166*4882a593Smuzhiyun IFACE_TO_TEST="$(echo $1 | cut -d@ -f1)" 167*4882a593Smuzhiyun fi 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun NETDEV_STARTED=0 170*4882a593Smuzhiyun kci_net_start "$IFACE_TO_UPDOWN" 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun kci_net_setup "$IFACE_TO_TEST" 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun kci_netdev_ethtool "$IFACE_TO_TEST" 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun kci_netdev_stop "$IFACE_TO_UPDOWN" 177*4882a593Smuzhiyun return 0 178*4882a593Smuzhiyun} 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun#check for needed privileges 181*4882a593Smuzhiyunif [ "$(id -u)" -ne 0 ];then 182*4882a593Smuzhiyun echo "SKIP: Need root privileges" 183*4882a593Smuzhiyun exit $ksft_skip 184*4882a593Smuzhiyunfi 185*4882a593Smuzhiyun 186*4882a593Smuzhiyunip link show 2>/dev/null >/dev/null 187*4882a593Smuzhiyunif [ $? -ne 0 ];then 188*4882a593Smuzhiyun echo "SKIP: Could not run test without the ip tool" 189*4882a593Smuzhiyun exit $ksft_skip 190*4882a593Smuzhiyunfi 191*4882a593Smuzhiyun 192*4882a593SmuzhiyunTMP_LIST_NETDEV="$(mktemp)" 193*4882a593Smuzhiyunif [ ! -e "$TMP_LIST_NETDEV" ];then 194*4882a593Smuzhiyun echo "FAIL: Cannot create a tmp file" 195*4882a593Smuzhiyun exit 1 196*4882a593Smuzhiyunfi 197*4882a593Smuzhiyun 198*4882a593Smuzhiyunip 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" 199*4882a593Smuzhiyunwhile read netdev 200*4882a593Smuzhiyundo 201*4882a593Smuzhiyun kci_test_netdev "$netdev" 202*4882a593Smuzhiyundone < "$TMP_LIST_NETDEV" 203*4882a593Smuzhiyun 204*4882a593Smuzhiyunrm "$TMP_LIST_NETDEV" 205*4882a593Smuzhiyunexit 0 206