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>

Reply via email to