public inbox for netdev@vger.kernel.org
 help / color / mirror / Atom feed
From: Vladimir Oltean <vladimir.oltean@nxp.com>
To: netdev@vger.kernel.org
Cc: "Abdul Rahim, Faizal" <faizal.abdul.rahim@linux.intel.com>
Subject: [RFC PATCH for-faizal 4/4] selftests: net: tsn: add tc-taprio test cases (WIP)
Date: Thu, 21 Dec 2023 15:25:21 +0200	[thread overview]
Message-ID: <20231221132521.2314811-5-vladimir.oltean@nxp.com> (raw)
In-Reply-To: <20231221132521.2314811-1-vladimir.oltean@nxp.com>

Obviously this is unfinished. While we were discussing about tc-taprio
behavior during schedule changes in particular, it would be much better
if the tests could slowly build up towards that complicated case, and
make sure that the simpler cases work well first: a packet gets sent
when it should (when it's sent in band with its time slot), gets blocked
when it's sent out of band with its time slot, etc.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
 .../testing/selftests/net/forwarding/Makefile |   1 +
 .../selftests/net/forwarding/tc_taprio.sh     | 143 ++++++++++++++++++
 .../selftests/net/forwarding/tsn_lib.sh       |  42 +++++
 3 files changed, 186 insertions(+)
 create mode 100755 tools/testing/selftests/net/forwarding/tc_taprio.sh

diff --git a/tools/testing/selftests/net/forwarding/Makefile b/tools/testing/selftests/net/forwarding/Makefile
index 452693514be4..8e8ed75a3aac 100644
--- a/tools/testing/selftests/net/forwarding/Makefile
+++ b/tools/testing/selftests/net/forwarding/Makefile
@@ -97,6 +97,7 @@ TEST_PROGS = bridge_fdb_learning_limit.sh \
 	tc_mpls_l2vpn.sh \
 	tc_police.sh \
 	tc_shblocks.sh \
+	tc_taprio.sh \
 	tc_tunnel_key.sh \
 	tc_vlan_modify.sh \
 	vxlan_asymmetric_ipv6.sh \
diff --git a/tools/testing/selftests/net/forwarding/tc_taprio.sh b/tools/testing/selftests/net/forwarding/tc_taprio.sh
new file mode 100755
index 000000000000..387cc0860d4f
--- /dev/null
+++ b/tools/testing/selftests/net/forwarding/tc_taprio.sh
@@ -0,0 +1,143 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+ALL_TESTS="in_band out_of_band cycle_extension"
+NUM_NETIFS=2
+VETH_OPTS="numtxqueues 8 numrxqueues 8"
+source lib.sh
+source tsn_lib.sh
+
+in_band()
+{
+	local basetime=$(clock_gettime CLOCK_REALTIME)
+	local window_size=$((NSEC_PER_SEC / 2))
+	local cycletime=$((2 * window_size))
+	local expected=1
+	local isochron_dat="$(mktemp)"
+	local window_start
+	local window_end
+
+	basetime=$((basetime + UTC_TAI_OFFSET * NSEC_PER_SEC))
+	basetime=$(round_up_with_margin $basetime $NSEC_PER_SEC $NSEC_PER_SEC)
+
+	tc qdisc replace dev $h1 root stab overhead 24 taprio num_tc 2 \
+		map 0 1 \
+		queues 1@0 1@1 \
+		base-time $basetime \
+		sched-entry S 0x3 500000000 \
+		sched-entry S 0x0 500000000 \
+		clockid CLOCK_TAI \
+		flags 0x0
+
+	isochron_do \
+		$h1 $h2 \
+		"" "" \
+		$((basetime + 2 * cycletime)) \
+		$cycletime \
+		0 \
+		${expected} \
+		"" \
+		1 \
+		"" \
+		"--omit-hwts --taprio --window-size $window_size" \
+		"--omit-hwts" \
+		"${isochron_dat}"
+
+	# Count all received packets by looking at the non-zero RX timestamps
+	received=$(isochron report \
+		--input-file "${isochron_dat}" \
+		--printf-format "%u\n" --printf-args "r" | \
+		grep -w -v '0' | wc -l)
+
+	if [ "${received}" = "${expected}" ]; then
+		RET=0
+	else
+		RET=1
+		echo "Expected isochron to receive ${expected} packets but received ${received}"
+	fi
+
+	tx_tstamp=$(isochron report \
+		--input-file "${isochron_dat}" \
+		--printf-format "%u\n" --printf-args "t")
+
+	window_start=$((basetime + 2 * cycletime))
+	window_end=$((window_start + window_size))
+
+	if (( tx_tstamp >= window_start && tx_tstamp <= window_end )); then
+		RET=0
+	else
+		RET=1
+		printf "Isochron TX timestamp %s sent outside expected window (%s - %s)\n" \
+			$(ns_to_time $tx_tstamp) \
+			$(ns_to_time $window_start) \
+			$(ns_to_time $window_end)
+	fi
+
+	log_test "${test_name}"
+
+	rm ${isochron_dat} 2> /dev/null
+
+	tc qdisc del dev $h1 root
+}
+
+out_of_band()
+{
+	:
+}
+
+cycle_extension()
+{
+	:
+}
+
+h1_create()
+{
+	simple_if_init $h1 192.0.2.1/24
+}
+
+h1_destroy()
+{
+	simple_if_fini $h1 192.0.2.1/24
+}
+
+h2_create()
+{
+	simple_if_init $h2 192.0.2.2/24
+}
+
+h2_destroy()
+{
+	simple_if_fini $h2 192.0.2.2/24
+}
+
+setup_prepare()
+{
+	h1=${NETIFS[p1]}
+	h2=${NETIFS[p2]}
+
+	vrf_prepare
+
+	h1_create
+	h2_create
+}
+
+cleanup()
+{
+	pre_cleanup
+
+	isochron_recv_stop
+
+	h2_destroy
+	h1_destroy
+
+	vrf_cleanup
+}
+
+trap cleanup EXIT
+
+setup_prepare
+setup_wait
+
+tests_run
+
+exit $EXIT_STATUS
diff --git a/tools/testing/selftests/net/forwarding/tsn_lib.sh b/tools/testing/selftests/net/forwarding/tsn_lib.sh
index 189bf27bad76..e72a18a1dee0 100644
--- a/tools/testing/selftests/net/forwarding/tsn_lib.sh
+++ b/tools/testing/selftests/net/forwarding/tsn_lib.sh
@@ -5,6 +5,8 @@
 REQUIRE_ISOCHRON=${REQUIRE_ISOCHRON:=yes}
 REQUIRE_LINUXPTP=${REQUIRE_LINUXPTP:=yes}
 
+NSEC_PER_SEC=1000000000
+
 # Tunables
 UTC_TAI_OFFSET=37
 ISOCHRON_CPU=1
@@ -18,6 +20,7 @@ fi
 if [[ "$REQUIRE_LINUXPTP" = "yes" ]]; then
 	require_command phc2sys
 	require_command ptp4l
+	require_command phc_ctl
 fi
 
 phc2sys_start()
@@ -251,3 +254,42 @@ isochron_do()
 
 	cpufreq_restore ${ISOCHRON_CPU}
 }
+
+# Convert a time specifier from 1.23456789 format to nanoseconds
+time_to_ns()
+{
+	local time="$1"
+	local sec=${time%%.*}
+	local nsec=${time##*.}
+
+	echo $((sec * NSEC_PER_SEC + 10#$nsec))
+}
+
+ns_to_time()
+{
+	local nsec="$1"
+	local sec=$((nsec / NSEC_PER_SEC))
+
+	nsec=$((nsec - (sec * NSEC_PER_SEC)))
+
+	printf "%d.%09lld" $sec $nsec
+}
+
+clock_gettime()
+{
+	local clkid=$1; shift
+	local time=$(phc_ctl $clkid get | awk '/clock time is/ { print $5 }')
+
+	echo $(time_to_ns $time)
+}
+
+# Round up value to next multiple, leaving a specified margin
+round_up_with_margin()
+{
+	local val=$1; shift
+	local multiple=$1; shift
+	local margin=$1; shift
+
+	val=$((val + margin))
+	echo $((((val + margin - 1) / margin) * margin))
+}
-- 
2.34.1


  parent reply	other threads:[~2023-12-21 13:25 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-21 13:25 [RFC PATCH for-faizal 0/4] tc-taprio selftests Vladimir Oltean
2023-12-21 13:25 ` [RFC PATCH for-faizal 1/4] selftests: net: forwarding: allow veth pairs to be created with multiple queues Vladimir Oltean
2023-12-21 13:25 ` [RFC PATCH for-faizal 2/4] selftests: net: tsn: push --txtime out of isochron_do() Vladimir Oltean
2023-12-21 13:25 ` [RFC PATCH for-faizal 3/4] selftests: net: tsn: allow isochron_do() to skip sync monitoring on sender too Vladimir Oltean
2023-12-21 13:25 ` Vladimir Oltean [this message]
2023-12-22  6:28 ` [RFC PATCH for-faizal 0/4] tc-taprio selftests Hangbin Liu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231221132521.2314811-5-vladimir.oltean@nxp.com \
    --to=vladimir.oltean@nxp.com \
    --cc=faizal.abdul.rahim@linux.intel.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox