selftests: forwarding: Add ethtool_lib.sh
authorAmit Cohen <amitc@mellanox.com>
Mon, 18 Nov 2019 07:50:00 +0000 (09:50 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 19 Nov 2019 01:11:54 +0000 (17:11 -0800)
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>
tools/testing/selftests/net/forwarding/ethtool_lib.sh [new file with mode: 0755]

diff --git a/tools/testing/selftests/net/forwarding/ethtool_lib.sh b/tools/testing/selftests/net/forwarding/ethtool_lib.sh
new file mode 100755 (executable)
index 0000000..925d229
--- /dev/null
@@ -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)
+}