#!/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
