DPDK patches and discussions
 help / color / mirror / Atom feed
From: Patrick Robb <probb@iol.unh.edu>
To: Andrew Bailey <abailey@iol.unh.edu>
Cc: luca.vizzarro@arm.com, dev@dpdk.org, dmarx@iol.unh.edu,
	 ivan.malov@arknetworks.am
Subject: Re: [PATCH v2 2/3] dts: add TX offload capabilities to NIC capabilities
Date: Wed, 3 Sep 2025 14:36:28 -0400	[thread overview]
Message-ID: <CAJvnSUDQTy7QbLe6GrPSc40mfKnYqQr06A=KPSUxvx9cvxgS1w@mail.gmail.com> (raw)
In-Reply-To: <20250903180414.83001-3-abailey@iol.unh.edu>

[-- Attachment #1: Type: text/plain, Size: 10187 bytes --]

On Wed, Sep 3, 2025 at 2:04 PM Andrew Bailey <abailey@iol.unh.edu> wrote:

> Currently, there is support for tracking the Rx offload capabilities of
> a NIC, but not for Tx offload capabilities. This is an issue if a test
> suite is written requiring one of these capabilities, since there is no
> way currently to verify that the NIC in use meets the requirements. Add
> Tx capabilities to the NIC capabilities at beginning of dts so
> requirements can be verified.
>
> Signed-off-by: Andrew Bailey <abailey@iol.unh.edu>
> ---
>  dts/framework/remote_session/testpmd_shell.py | 203 ++++++++++++++++++
>  1 file changed, 203 insertions(+)
>
> diff --git a/dts/framework/remote_session/testpmd_shell.py
> b/dts/framework/remote_session/testpmd_shell.py
> index 4d9caceb37..dfd83ebdb3 100644
> --- a/dts/framework/remote_session/testpmd_shell.py
> +++ b/dts/framework/remote_session/testpmd_shell.py
> @@ -1285,6 +1285,99 @@ class TestPmdVerbosePacket(TextParser):
>      )
>
>
> +class TxOffloadCapability(Flag):
> +    """TX offload capabilities of a device.
> +
> +    The flags are taken from ``lib/ethdev/rte_ethdev.h``.
> +    They're prefixed with ``RTE_ETH_TX_OFFLOAD`` in
> ``lib/ethdev/rte_ethdev.h``
> +    instead of ``TX_OFFLOAD``, which is what testpmd changes the prefix
> to.
> +    The values are not contiguous, so the correspondence is preserved
> +    by specifying concrete values interspersed between auto() values.
>

afaik only rx_offloads specify concrete values. It looks like these flags
are all auto().


> +
> +    The ``TX_OFFLOAD`` prefix has been preserved so that the same flag
> names can be used
> +    in :class:`NicCapability`. The prefix is needed in
> :class:`NicCapability` since there's
> +    no other qualifier which would sufficiently distinguish it from other
> capabilities.
> +
> +    References:
> +        DPDK lib: ``lib/ethdev/rte_ethdev.h``
> +        testpmd display function:
> ``app/test-pmd/cmdline.c:print_rx_offloads()``
> +    """
> +
> +    TX_OFFLOAD_VLAN_INSERT = auto()
> +    TX_OFFLOAD_IPV4_CKSUM = auto()
> +    TX_OFFLOAD_UDP_CKSUM = auto()
> +    TX_OFFLOAD_TCP_CKSUM = auto()
> +    TX_OFFLOAD_SCTP_CKSUM = auto()
> +    TX_OFFLOAD_TCP_TSO = auto()
> +    TX_OFFLOAD_UDP_TSO = auto()
> +    TX_OFFLOAD_OUTER_IPV4_CKSUM = auto()
> +    TX_OFFLOAD_QINQ_INSERT = auto()
> +    TX_OFFLOAD_VXLAN_TNL_TSO = auto()
> +    TX_OFFLOAD_GRE_TNL_TSO = auto()
> +    TX_OFFLOAD_IPIP_TNL_TSO = auto()
> +    TX_OFFLOAD_GENEVE_TNL_TSO = auto()
> +    TX_OFFLOAD_MACSEC_INSERT = auto()
> +    TX_OFFLOAD_MT_LOCKFREE = auto()
> +    TX_OFFLOAD_MULTI_SEGS = auto()
> +    TX_OFFLOAD_MBUF_FAST_FREE = auto()
> +    TX_OFFLOAD_SECURITY = auto()
> +    TX_OFFLOAD_UDP_TNL_TSO = auto()
> +    TX_OFFLOAD_IP_TNL_TSO = auto()
> +    TX_OFFLOAD_OUTER_UDP_CKSUM = auto()
> +    TX_OFFLOAD_SEND_ON_TIMESTAMP = auto()
> +
> +    @classmethod
> +    def from_string(cls, line: str) -> Self:
> +        """Make an instance from a string containing the flag names
> separated with a space.
> +
> +        Args:
> +            line: The line to parse.
> +
> +        Returns:
> +            A new instance containing all found flags.
> +        """
> +        flag = cls(0)
> +        for flag_name in line.split():
> +            flag |= cls[f"TX_OFFLOAD_{flag_name}"]
> +        return flag
> +
> +    @classmethod
> +    def make_parser(cls, per_port: bool) -> ParserFn:
> +        """Make a parser function.
> +
> +        Args:
> +            per_port: If :data:`True`, will return capabilities per port.
> If :data:`False`,
> +                will return capabilities per queue.
> +
> +        Returns:
> +            ParserFn: A dictionary for the `dataclasses.field` metadata
> argument containing a
> +                parser function that makes an instance of this flag from
> text.
> +        """
> +        granularity = "Port" if per_port else "Queue"
> +        return TextParser.wrap(
> +            TextParser.find(rf"Per {granularity}\s+:(.*)$", re.MULTILINE),
> +            cls.from_string,
> +        )
> +
> +
> +@dataclass
> +class TxOffloadCapabilities(TextParser):
> +    """The result of testpmd's ``show port <port_id> tx_offload
> capabilities`` command.
> +
> +    References:
> +        testpmd command function:
> ``app/test-pmd/cmdline.c:cmd_tx_offload_get_capa()``
> +        testpmd display function:
> ``app/test-pmd/cmdline.c:cmd_tx_offload_get_capa_parsed()``
> +    """
> +
> +    port_id: int = field(
> +        metadata=TextParser.find_int(r"Tx Offloading Capabilities of port
> (\d+) :")
> +    )
> +    #: Per-queue Tx offload capabilities.
> +    per_queue: TxOffloadCapability =
> field(metadata=TxOffloadCapability.make_parser(False))
> +    #: Capabilities other than per-queue Tx offload capabilities.
> +    per_port: TxOffloadCapability =
> field(metadata=TxOffloadCapability.make_parser(True))
> +
> +
>  class RxOffloadCapability(Flag):
>      """Rx offload capabilities of a device.
>
> @@ -2397,6 +2490,28 @@ def close(self) -> None:
>      ====== Capability retrieval methods ======
>      """
>
> +    def get_capabilities_tx_offload(
> +        self,
> +        supported_capabilities: MutableSet["NicCapability"],
> +        unsupported_capabilities: MutableSet["NicCapability"],
> +    ) -> None:
> +        """Get all TX offload capabilities and divide them into supported
> and unsupported.
> +
> +        Args:
> +            supported_capabilities: Supported capabilities will be added
> to this set.
> +            unsupported_capabilities: Unsupported capabilities will be
> added to this set.
> +        """
> +        self._logger.debug("Getting TX offload capabilities.")
> +        command = f"show port {self.ports[0].id} tx_offload capabilities"
> +        tx_offload_capabilities_out = self.send_command(command)
> +        tx_offload_capabilities =
> TxOffloadCapabilities.parse(tx_offload_capabilities_out)
> +        self._update_capabilities_from_flag(
> +            supported_capabilities,
> +            unsupported_capabilities,
> +            TxOffloadCapability,
> +            tx_offload_capabilities.per_port |
> tx_offload_capabilities.per_queue,
> +        )
> +
>      def get_capabilities_rx_offload(
>          self,
>          supported_capabilities: MutableSet["NicCapability"],
> @@ -2824,6 +2939,94 @@ class NicCapability(NoAliasEnum):
>      we don't go looking for it again if a different test case also needs
> it.
>      """
>
> +    TX_OFFLOAD_VLAN_INSERT: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_IPV4_CKSUM: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_UDP_CKSUM: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_TCP_CKSUM: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_SCTP_CKSUM: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_TCP_TSO: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_UDP_TSO: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_OUTER_IPV4_CKSUM: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_QINQ_INSERT: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_VXLAN_TNL_TSO: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_GRE_TNL_TSO: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_IPIP_TNL_TSO: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_GENEVE_TNL_TSO: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_MACSEC_INSERT: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_MT_LOCKFREE: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_MULTI_SEGS: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_MBUF_FAST_FREE: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_SECURITY: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_UDP_TNL_TSO: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_IP_TNL_TSO: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_OUTER_UDP_CKSUM: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
> +    TX_OFFLOAD_SEND_ON_TIMESTAMP: TestPmdShellNicCapability = (
> +        TestPmdShell.get_capabilities_tx_offload,
> +        None,
> +    )
>      #: Scattered packets Rx enabled
>      SCATTERED_RX_ENABLED: TestPmdShellNicCapability = (
>          TestPmdShell.get_capabilities_rxq_info,
> --
> 2.50.1
>
>
Looks good. Have you verified the docs will build from this patch? If you
haven't done this yet it's

meson setup my_build
ninja -C my_build doc

Reviewed-by: Patrick Robb <probb@iol.unh.edu>

[-- Attachment #2: Type: text/html, Size: 12276 bytes --]

  reply	other threads:[~2025-09-03 18:43 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-02 14:27 [PATCH v1 0/3] dts: add tx_offload support in dts Andrew Bailey
2025-09-02 14:27 ` [PATCH v1 1/3] dts: allow mbuf_fast_free to be set with testpmd shell Andrew Bailey
2025-09-02 19:37   ` Ivan Malov
2025-09-02 19:48     ` Ivan Malov
2025-09-02 14:27 ` [PATCH v1 2/3] dts: add TX offload capabilities to NIC capabilities Andrew Bailey
2025-09-04 14:43   ` Luca Vizzarro
2025-09-04 14:45     ` Luca Vizzarro
2025-09-02 14:27 ` [PATCH v1 3/3] dts: update tx_offload test from old dts Andrew Bailey
2025-09-03 18:04 ` [PATCH v2 0/3] dts: add tx_offlaod support in dts Andrew Bailey
2025-09-03 18:04   ` [PATCH v2 1/3] dts: allow mbuf_fast_free to be set with testpmd shell Andrew Bailey
2025-09-04 15:15     ` Luca Vizzarro
2025-09-04 21:18       ` Patrick Robb
2025-09-03 18:04   ` [PATCH v2 2/3] dts: add TX offload capabilities to NIC capabilities Andrew Bailey
2025-09-03 18:36     ` Patrick Robb [this message]
2025-09-04 14:47     ` Luca Vizzarro
2025-09-03 18:04   ` [PATCH v2 3/3] dts: update tx_offload test from old dts Andrew Bailey
2025-09-04 15:25     ` Luca Vizzarro

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='CAJvnSUDQTy7QbLe6GrPSc40mfKnYqQr06A=KPSUxvx9cvxgS1w@mail.gmail.com' \
    --to=probb@iol.unh.edu \
    --cc=abailey@iol.unh.edu \
    --cc=dev@dpdk.org \
    --cc=dmarx@iol.unh.edu \
    --cc=ivan.malov@arknetworks.am \
    --cc=luca.vizzarro@arm.com \
    /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;
as well as URLs for NNTP newsgroup(s).