selftests: forwarding: Add a tunnel-based test for L3 HW stats
authorPetr Machata <petrm@nvidia.com>
Sun, 8 May 2022 08:08:23 +0000 (11:08 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sun, 8 May 2022 10:46:21 +0000 (11:46 +0100)
Add a selftest that uses an IPIP topology and tests that L3 HW stats
reflect the traffic in the tunnel.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/net/forwarding/Makefile
tools/testing/selftests/net/forwarding/hw_stats_l3_gre.sh [new file with mode: 0755]

index 0912f5a..b5181b5 100644 (file)
@@ -20,6 +20,7 @@ TEST_PROGS = bridge_igmp.sh \
        gre_multipath_nh.sh \
        gre_multipath.sh \
        hw_stats_l3.sh \
+       hw_stats_l3_gre.sh \
        ip6_forward_instats_vrf.sh \
        ip6gre_custom_multipath_hash.sh \
        ip6gre_flat_key.sh \
diff --git a/tools/testing/selftests/net/forwarding/hw_stats_l3_gre.sh b/tools/testing/selftests/net/forwarding/hw_stats_l3_gre.sh
new file mode 100755 (executable)
index 0000000..eb9ec4a
--- /dev/null
@@ -0,0 +1,109 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+# Test L3 stats on IP-in-IP GRE tunnel without key.
+
+# This test uses flat topology for IP tunneling tests. See ipip_lib.sh for more
+# details.
+
+ALL_TESTS="
+       ping_ipv4
+       test_stats_rx
+       test_stats_tx
+"
+NUM_NETIFS=6
+source lib.sh
+source ipip_lib.sh
+
+setup_prepare()
+{
+       h1=${NETIFS[p1]}
+       ol1=${NETIFS[p2]}
+
+       ul1=${NETIFS[p3]}
+       ul2=${NETIFS[p4]}
+
+       ol2=${NETIFS[p5]}
+       h2=${NETIFS[p6]}
+
+       ol1mac=$(mac_get $ol1)
+
+       forwarding_enable
+       vrf_prepare
+       h1_create
+       h2_create
+       sw1_flat_create gre $ol1 $ul1
+       sw2_flat_create gre $ol2 $ul2
+       ip stats set dev g1a l3_stats on
+       ip stats set dev g2a l3_stats on
+}
+
+cleanup()
+{
+       pre_cleanup
+
+       ip stats set dev g1a l3_stats off
+       ip stats set dev g2a l3_stats off
+
+       sw2_flat_destroy $ol2 $ul2
+       sw1_flat_destroy $ol1 $ul1
+       h2_destroy
+       h1_destroy
+
+       vrf_cleanup
+       forwarding_restore
+}
+
+ping_ipv4()
+{
+       RET=0
+
+       ping_test $h1 192.0.2.18 " gre flat"
+}
+
+send_packets_ipv4()
+{
+       # Send 21 packets instead of 20, because the first one might trap and go
+       # through the SW datapath, which might not bump the HW counter.
+       $MZ $h1 -c 21 -d 20msec -p 100 \
+           -a own -b $ol1mac -A 192.0.2.1 -B 192.0.2.18 \
+           -q -t udp sp=54321,dp=12345
+}
+
+test_stats()
+{
+       local dev=$1; shift
+       local dir=$1; shift
+
+       local a
+       local b
+
+       RET=0
+
+       a=$(hw_stats_get l3_stats $dev $dir packets)
+       send_packets_ipv4
+       b=$(busywait "$TC_HIT_TIMEOUT" until_counter_is ">= $a + 20" \
+                    hw_stats_get l3_stats $dev $dir packets)
+       check_err $? "Traffic not reflected in the counter: $a -> $b"
+
+       log_test "Test $dir packets: $prot"
+}
+
+test_stats_tx()
+{
+       test_stats g1a tx
+}
+
+test_stats_rx()
+{
+       test_stats g2a rx
+}
+
+trap cleanup EXIT
+
+setup_prepare
+setup_wait
+
+tests_run
+
+exit $EXIT_STATUS