selftests: forwarding: Add ethtool_lib.sh
Functions:
1. speeds_arr_get
The function returns an array of speed values from
/usr/include/linux/ethtool.h The array looks as follows:
[10baseT/Half] = 0,
[10baseT/Full] = 1,
...
2. ethtool_set:
params: cmd
The function runs ethtool by cmd (ethtool -s cmd) and checks if
there was an error in configuration
3. dev_speeds_get:
params: dev, with_mode (0 or 1), adver (0 or 1)
return value: Array of supported/Advertised link modes
with/without mode
* Example 1:
speeds_get swp1 0 0
return: 1000 10000 40000
* Example 2:
speeds_get swp1 1 1
return: 1000baseKX/Full 10000baseKR/Full 40000baseCR4/Full
4. common_speeds_get:
params: dev1, dev2, with_mode (0 or 1), adver (0 or 1)
return value: Array of common speeds of dev1 and dev2
* Example:
common_speeds_get swp1 swp2 0 0
return: 1000 10000
Assuming that swp1 supports 1000 10000 40000 and swp2 supports
1000 10000
Signed-off-by: Amit Cohen <amitc@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
b22b0b0b10
commit
646cf7ed9a
69
tools/testing/selftests/net/forwarding/ethtool_lib.sh
Executable file
69
tools/testing/selftests/net/forwarding/ethtool_lib.sh
Executable file
@@ -0,0 +1,69 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
speeds_arr_get()
|
||||
{
|
||||
cmd='/ETHTOOL_LINK_MODE_[^[:space:]]*_BIT[[:space:]]+=[[:space:]]+/ \
|
||||
{sub(/,$/, "") \
|
||||
sub(/ETHTOOL_LINK_MODE_/,"") \
|
||||
sub(/_BIT/,"") \
|
||||
sub(/_Full/,"/Full") \
|
||||
sub(/_Half/,"/Half");\
|
||||
print "["$1"]="$3}'
|
||||
|
||||
awk "${cmd}" /usr/include/linux/ethtool.h
|
||||
}
|
||||
|
||||
ethtool_set()
|
||||
{
|
||||
local cmd="$@"
|
||||
local out=$(ethtool -s $cmd 2>&1 | wc -l)
|
||||
|
||||
check_err $out "error in configuration. $cmd"
|
||||
}
|
||||
|
||||
dev_speeds_get()
|
||||
{
|
||||
local dev=$1; shift
|
||||
local with_mode=$1; shift
|
||||
local adver=$1; shift
|
||||
local speeds_str
|
||||
|
||||
if (($adver)); then
|
||||
mode="Advertised link modes"
|
||||
else
|
||||
mode="Supported link modes"
|
||||
fi
|
||||
|
||||
speeds_str=$(ethtool "$dev" | \
|
||||
# Snip everything before the link modes section.
|
||||
sed -n '/'"$mode"':/,$p' | \
|
||||
# Quit processing the rest at the start of the next section.
|
||||
# When checking, skip the header of this section (hence the 2,).
|
||||
sed -n '2,${/^[\t][^ \t]/q};p' | \
|
||||
# Drop the section header of the current section.
|
||||
cut -d':' -f2)
|
||||
|
||||
local -a speeds_arr=($speeds_str)
|
||||
if [[ $with_mode -eq 0 ]]; then
|
||||
for ((i=0; i<${#speeds_arr[@]}; i++)); do
|
||||
speeds_arr[$i]=${speeds_arr[$i]%base*}
|
||||
done
|
||||
fi
|
||||
echo ${speeds_arr[@]}
|
||||
}
|
||||
|
||||
common_speeds_get()
|
||||
{
|
||||
dev1=$1; shift
|
||||
dev2=$1; shift
|
||||
with_mode=$1; shift
|
||||
adver=$1; shift
|
||||
|
||||
local -a dev1_speeds=($(dev_speeds_get $dev1 $with_mode $adver))
|
||||
local -a dev2_speeds=($(dev_speeds_get $dev2 $with_mode $adver))
|
||||
|
||||
comm -12 \
|
||||
<(printf '%s\n' "${dev1_speeds[@]}" | sort -u) \
|
||||
<(printf '%s\n' "${dev2_speeds[@]}" | sort -u)
|
||||
}
|
||||
Reference in New Issue
Block a user