ethdev: add new attributes to hairpin config
authorBing Zhao <bingz@nvidia.com>
Thu, 15 Oct 2020 13:08:52 +0000 (21:08 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 16 Oct 2020 17:48:19 +0000 (19:48 +0200)
To support two ports hairpin mode and keep the backward compatibility
for the application, two new attribute members of the hairpin queue
configuration structure will be added.

`tx_explicit` means if the application itself will insert the Tx part
flow rules. If not set, PMD will insert the rules implicitly.
`manual_bind` means if the hairpin Tx queue and peer Rx queue will be
bound automatically during the device start stage.

Different Tx and Rx queue pairs could have different values, but it
is highly recommended that all paired queues between one egress and
its peer ingress ports have the same values, in order not to bring
any chaos to the system. The actual support of these attribute
parameters will be checked and decided by the PMD drivers.

In the single port hairpin, if both are zero without any setting, the
behavior will remain the same as before. It means that no bind API
needs to be called and no Tx flow rules need to be inserted manually
by the application.

Signed-off-by: Bing Zhao <bingz@nvidia.com>
Acked-by: Ori Kam <orika@nvidia.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
doc/guides/prog_guide/rte_flow.rst
doc/guides/rel_notes/release_20_11.rst
lib/librte_ethdev/rte_ethdev.c
lib/librte_ethdev/rte_ethdev.h

index 9ccc1c7..8f0439f 100644 (file)
@@ -2618,6 +2618,9 @@ set, unpredictable value will be seen depending on driver implementation. For
 loopback/hairpin packet, metadata set on Rx/Tx may or may not be propagated to
 the other path depending on HW capability.
 
+In hairpin case with Tx explicit flow mode, metadata could (not mandatory) be
+used to connect the Rx and Tx flows if it can be propagated from Rx to Tx path.
+
 .. _table_rte_flow_action_set_meta:
 
 .. table:: SET_META
index b5b1b0b..151a589 100644 (file)
@@ -113,6 +113,7 @@ New Features
 * **Updated the ethdev library to support hairpin between two ports.**
 
   New APIs are introduced to support binding / unbinding 2 ports hairpin.
+  Hairpin Tx part flow rules can be inserted explicitly.
 
 * **Updated Broadcom bnxt driver.**
 
@@ -527,6 +528,11 @@ ABI Changes
     Applications should use the new values for identification of existing
     extensions in the packet header.
 
+  * ``struct rte_eth_hairpin_conf`` has two new members:
+
+    * ``uint32_t tx_explicit:1;``
+    * ``uint32_t manual_bind:1;``
+
 * eventdev: Following structures are modified to support DLB/DLB2 PMDs
   and future extensions:
 
index 8f6cda6..6f67c80 100644 (file)
@@ -2005,13 +2005,13 @@ rte_eth_rx_hairpin_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
        }
        if (conf->peer_count > cap.max_rx_2_tx) {
                RTE_ETHDEV_LOG(ERR,
-                       "Invalid value for number of peers for Rx queue(=%hu), should be: <= %hu",
+                       "Invalid value for number of peers for Rx queue(=%u), should be: <= %hu",
                        conf->peer_count, cap.max_rx_2_tx);
                return -EINVAL;
        }
        if (conf->peer_count == 0) {
                RTE_ETHDEV_LOG(ERR,
-                       "Invalid value for number of peers for Rx queue(=%hu), should be: > 0",
+                       "Invalid value for number of peers for Rx queue(=%u), should be: > 0",
                        conf->peer_count);
                return -EINVAL;
        }
@@ -2176,13 +2176,13 @@ rte_eth_tx_hairpin_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
        }
        if (conf->peer_count > cap.max_tx_2_rx) {
                RTE_ETHDEV_LOG(ERR,
-                       "Invalid value for number of peers for Tx queue(=%hu), should be: <= %hu",
+                       "Invalid value for number of peers for Tx queue(=%u), should be: <= %hu",
                        conf->peer_count, cap.max_tx_2_rx);
                return -EINVAL;
        }
        if (conf->peer_count == 0) {
                RTE_ETHDEV_LOG(ERR,
-                       "Invalid value for number of peers for Tx queue(=%hu), should be: > 0",
+                       "Invalid value for number of peers for Tx queue(=%u), should be: > 0",
                        conf->peer_count);
                return -EINVAL;
        }
index d8e6da1..bfcade7 100644 (file)
@@ -1045,7 +1045,32 @@ struct rte_eth_hairpin_peer {
  * A structure used to configure hairpin binding.
  */
 struct rte_eth_hairpin_conf {
-       uint16_t peer_count; /**< The number of peers. */
+       uint32_t peer_count:16; /**< The number of peers. */
+
+       /**
+        * Explicit Tx flow rule mode.
+        * One hairpin pair of queues should have the same attribute.
+        *
+        * - When set, the user should be responsible for inserting the hairpin
+        *   Tx part flows and removing them.
+        * - When clear, the PMD will try to handle the Tx part of the flows,
+        *   e.g., by splitting one flow into two parts.
+        */
+       uint32_t tx_explicit:1;
+
+       /**
+        * Manually bind hairpin queues.
+        * One hairpin pair of queues should have the same attribute.
+        *
+        * - When set, to enable hairpin, the user should call the hairpin bind
+        *   function after all the queues are set up properly and the ports are
+        *   started. Also, the hairpin unbind function should be called
+        *   accordingly before stopping a port that with hairpin configured.
+        * - When clear, the PMD will try to enable the hairpin with the queues
+        *   configured automatically during port start.
+        */
+       uint32_t manual_bind:1;
+       uint32_t reserved:14; /**< Reserved bits. */
        struct rte_eth_hairpin_peer peers[RTE_ETH_MAX_HAIRPIN_PEERS];
 };