mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
4.4 KiB
205 lines
4.4 KiB
#!/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
|
|
|