On Tue, Feb 25, 2025 at 10:34 AM Thomas Wilks <thomas.wi...@arm.com> wrote:
> From: Alex Chapman <alex.chap...@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.chap...@arm.com> > Signed-off-by: Thomas Wilks <thomas.wi...@arm.com> > > Reviewed-by: Paul Szczepanek <paul.szczepa...@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). Reviewed-by: Patrick Robb <pr...@iol.unh.edu> Tested-by: Patrick Robb <pr...@iol.unh.eu>