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