OSDN Git Service

selftests: mlxsw: Add a self-test for port-default priority
authorPetr Machata <petrm@mellanox.com>
Sun, 29 Dec 2019 11:48:29 +0000 (13:48 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 2 Jan 2020 23:40:14 +0000 (15:40 -0800)
Send non-IP traffic to a port and observe that it gets prioritized
according to the lldptool app=$prio,1,0 rules.

Signed-off-by: Petr Machata <petrm@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/drivers/net/mlxsw/qos_defprio.sh [new file with mode: 0755]
tools/testing/selftests/net/forwarding/lib.sh

diff --git a/tools/testing/selftests/drivers/net/mlxsw/qos_defprio.sh b/tools/testing/selftests/drivers/net/mlxsw/qos_defprio.sh
new file mode 100755 (executable)
index 0000000..eff6393
--- /dev/null
@@ -0,0 +1,176 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+# Test for port-default priority. Non-IP packets ingress $swp1 and are
+# prioritized according to the default priority specified at the port.
+# rx_octets_prio_* counters are used to verify the prioritization.
+#
+# +-----------------------+
+# | H1                    |
+# |    + $h1              |
+# |    | 192.0.2.1/28     |
+# +----|------------------+
+#      |
+# +----|------------------+
+# | SW |                  |
+# |    + $swp1            |
+# |      192.0.2.2/28     |
+# |      APP=<prio>,1,0   |
+# +-----------------------+
+
+ALL_TESTS="
+       ping_ipv4
+       test_defprio
+"
+
+lib_dir=$(dirname $0)/../../../net/forwarding
+
+NUM_NETIFS=2
+: ${HIT_TIMEOUT:=1000} # ms
+source $lib_dir/lib.sh
+
+declare -a APP
+
+defprio_install()
+{
+       local dev=$1; shift
+       local prio=$1; shift
+       local app="app=$prio,1,0"
+
+       lldptool -T -i $dev -V APP $app >/dev/null
+       lldpad_app_wait_set $dev
+       APP[$prio]=$app
+}
+
+defprio_uninstall()
+{
+       local dev=$1; shift
+       local prio=$1; shift
+       local app=${APP[$prio]}
+
+       lldptool -T -i $dev -V APP -d $app >/dev/null
+       lldpad_app_wait_del
+       unset APP[$prio]
+}
+
+defprio_flush()
+{
+       local dev=$1; shift
+       local prio
+
+       if ((${#APP[@]})); then
+               lldptool -T -i $dev -V APP -d ${APP[@]} >/dev/null
+       fi
+       lldpad_app_wait_del
+       APP=()
+}
+
+h1_create()
+{
+       simple_if_init $h1 192.0.2.1/28
+}
+
+h1_destroy()
+{
+       simple_if_fini $h1 192.0.2.1/28
+}
+
+switch_create()
+{
+       ip link set dev $swp1 up
+       ip addr add dev $swp1 192.0.2.2/28
+}
+
+switch_destroy()
+{
+       defprio_flush $swp1
+       ip addr del dev $swp1 192.0.2.2/28
+       ip link set dev $swp1 down
+}
+
+setup_prepare()
+{
+       h1=${NETIFS[p1]}
+       swp1=${NETIFS[p2]}
+
+       vrf_prepare
+
+       h1_create
+       switch_create
+}
+
+cleanup()
+{
+       pre_cleanup
+
+       switch_destroy
+       h1_destroy
+
+       vrf_cleanup
+}
+
+ping_ipv4()
+{
+       ping_test $h1 192.0.2.2
+}
+
+wait_for_packets()
+{
+       local t0=$1; shift
+       local prio_observe=$1; shift
+
+       local t1=$(ethtool_stats_get $swp1 rx_frames_prio_$prio_observe)
+       local delta=$((t1 - t0))
+       echo $delta
+       ((delta >= 10))
+}
+
+__test_defprio()
+{
+       local prio_install=$1; shift
+       local prio_observe=$1; shift
+       local delta
+       local key
+       local i
+
+       RET=0
+
+       defprio_install $swp1 $prio_install
+
+       local t0=$(ethtool_stats_get $swp1 rx_frames_prio_$prio_observe)
+       mausezahn -q $h1 -d 100m -c 10 -t arp reply
+       delta=$(busywait "$HIT_TIMEOUT" wait_for_packets $t0 $prio_observe)
+
+       check_err $? "Default priority $prio_install/$prio_observe: Expected to capture 10 packets, got $delta."
+       log_test "Default priority $prio_install/$prio_observe"
+
+       defprio_uninstall $swp1 $prio_install
+}
+
+test_defprio()
+{
+       local prio
+
+       for prio in {0..7}; do
+               __test_defprio $prio $prio
+       done
+
+       defprio_install $swp1 3
+       __test_defprio 0 3
+       __test_defprio 1 3
+       __test_defprio 2 3
+       __test_defprio 4 4
+       __test_defprio 5 5
+       __test_defprio 6 6
+       __test_defprio 7 7
+       defprio_uninstall $swp1 3
+}
+
+trap cleanup EXIT
+
+setup_prepare
+setup_wait
+
+tests_run
+
+exit $EXIT_STATUS
index a0b09bb..8dc5fac 100644 (file)
@@ -225,6 +225,29 @@ log_info()
        echo "INFO: $msg"
 }
 
+busywait()
+{
+       local timeout=$1; shift
+
+       local start_time="$(date -u +%s%3N)"
+       while true
+       do
+               local out
+               out=$("$@")
+               local ret=$?
+               if ((!ret)); then
+                       echo -n "$out"
+                       return 0
+               fi
+
+               local current_time="$(date -u +%s%3N)"
+               if ((current_time - start_time > timeout)); then
+                       echo -n "$out"
+                       return 1
+               fi
+       done
+}
+
 setup_wait_dev()
 {
        local dev=$1; shift