From: Alex Chapman <alex.chapman@arm.com>
Port over the pmd_rss_hash test suite from old DTS. This
suite verifies that the 4 supported types of hashing
algorithm used in Receive Side Scaling (RSS) function
correctly. Them being DEFAULT, TOEPLITZ
SYMMETRIC_TOEPLITZ and SIMPLE_XOR. This test suite also
verifies the supported hashing algorithms reported by
the NIC are correct.
Signed-off-by: Alex Chapman <alex.chapman@arm.com>
Signed-off-by: Thomas Wilks <thomas.wilks@arm.com>
Reviewed-by: Paul Szczepanek <paul.szczepanek@arm.com>
---
dts/tests/TestSuite_pmd_rss_hash.py | 118 ++++++++++++++++++++++++++++
1 file changed, 118 insertions(+)
create mode 100644 dts/tests/TestSuite_pmd_rss_hash.py
diff --git a/dts/tests/TestSuite_pmd_rss_hash.py b/dts/tests/TestSuite_pmd_rss_hash.py
new file mode 100644
index 0000000000..d21e33456e
--- /dev/null
+++ b/dts/tests/TestSuite_pmd_rss_hash.py
@@ -0,0 +1,118 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2025 Arm Limited
+
+"""RSS Hash testing suite.
+
+Hashing algorithms are used in conjunction with a RSS hash keys to hash packets.
+This test suite verifies that updating the Hashing algorithms will
+continue to correctly hash packets.
+
+Symmetric_toeplitz_sort hasn't been included due to it not being supported by
+the rss func actions in the flow rule.
+"""
+
+from framework.remote_session.testpmd_shell import FlowRule, TestPmdShell
+from framework.test_suite import TestSuite, func_test
+from framework.testbed_model.capability import NicCapability, requires
+from framework.testbed_model.topology import TopologyType
+from framework.utils import StrEnum
+
+from .pmd_rss_utils import ( # type: ignore[import-untyped]
+ SendTestPackets,
+ SetupRssEnvironment,
+ VerifyHashQueue,
+)
+
+NUM_QUEUES = 16
+
+
+class HashAlgorithm(StrEnum):
+ """Enum of hashing algorithms."""
+
+ DEFAULT = "default"
+ SIMPLE_XOR = "simple_xor"
+ TOEPLITZ = "toeplitz"
+ SYMMETRIC_TOEPLITZ = "symmetric_toeplitz"
+
+
+@requires(topology_type=TopologyType.one_link)
+class TestPmdRssHash(TestSuite):
+ """PMD RSS Hash test suite.
+
+ Verifies the redirection table when updating the size.
+ The suite contains four tests, one for each hash algorithms.
+ """
+
+ def VerifyHashFunction(self, hash_algorithm: HashAlgorithm) -> None:
+ """Verifies the hash function is supported by the NIC.
+
+ Args:
+ hash_algorithm: The hash algorithm to be tested.
+ """
+ is_symmetric = hash_algorithm == HashAlgorithm.SYMMETRIC_TOEPLITZ
+ # Build flow rule
+ flow_rule = FlowRule(
+ group_id=0,
+ direction="ingress",
+ pattern=["eth / ipv4 / udp"],
+ actions=[f"rss types ipv4-udp end queues end func {str(hash_algorithm).lower()}"],
+ )
+
+ # Run the key update test suite with an asymmetric hash algorithm
+ with TestPmdShell(
+ rx_queues=NUM_QUEUES,
+ tx_queues=NUM_QUEUES,
+ ) as testpmd:
+ # Setup testpmd environment for RSS, create RETA table, return RETA table and key_size
+ reta, _ = SetupRssEnvironment(self, testpmd, NUM_QUEUES, flow_rule)
+ # Send udp packets and ensure hash corresponds with queue
+ parsed_output = SendTestPackets(self, testpmd, is_symmetric)
+ VerifyHashQueue(self, reta, parsed_output, is_symmetric)
+
+ @func_test
+ def TestDefaultHashAlgorithm(self) -> None:
+ """Default hashing algorithm test.
+
+ Steps:
+ Setup RSS environment using the default RSS hashing algorithm
+ and send test packets.
+ Verify:
+ Packet hash corresponds to the packet queue.
+ """
+ self.VerifyHashFunction(HashAlgorithm.DEFAULT)
+
+ @func_test
+ def TestToeplitzHashAlgorithm(self) -> None:
+ """Toeplitz hashing algorithm test.
+
+ Steps:
+ Setup RSS environment using the toeplitz RSS hashing algorithm and send test packets.
+ Verify:
+ Packet hash corresponds to the packet queue.
+ """
+ self.VerifyHashFunction(HashAlgorithm.TOEPLITZ)
+
+ @func_test
+ def TestSymmetricToeplitzHashAlgorithm(self) -> None:
+ """Symmetric toeplitz hashing algorithm test.
+
+ Steps:
+ Setup RSS environment using the symmetric_toeplitz RSS hashing algorithm
+ and send test packets.
+ Verify:
+ Packet hash corresponds to the packet queue.
+ """
+ self.VerifyHashFunction(HashAlgorithm.SYMMETRIC_TOEPLITZ)
+
+ @requires(NicCapability.XOR_SUPPORT)
+ @func_test
+ def TestSimpleXorHashAlgorithm(self) -> None:
+ """Simple xor hashing algorithm test.
+
+ Steps:
+ Setup RSS environment using the simple xor RSS hashing algorithm
+ and send test packets.
+ Verify:
+ Packet hash corresponds to the packet queue.
+ """
+ self.VerifyHashFunction(HashAlgorithm.SIMPLE_XOR)
--
2.43.0
The testsuite looks good although the functions need to move to snake style naming convention.
Tested on an Intel XL710, which skipped all but the default hash algorithm (passing).