From: Jie Hai <haij...@huawei.com>

Currently, rte_eth_rss_conf supports configuring rss hash
functions, rss key and it's length, but not rss hash algorithm.

The structure ``rte_eth_rss_conf`` is extended by adding a new field,
"func". This represents the RSS algorithms to apply. The following
API is affected:
        - rte_eth_dev_configure
        - rte_eth_dev_rss_hash_update
        - rte_eth_dev_rss_hash_conf_get

To prevent configuration failures caused by incorrect func input, check
this parameter in advance. If it's incorrect, a warning is generated
and the default value is set. Do the same for rte_eth_dev_rss_hash_update
and rte_eth_dev_configure.

To check whether the drivers report the func field, it is set to default
value before querying.

Signed-off-by: Jie Hai <haij...@huawei.com>
Signed-off-by: Dongdong Liu <liudongdo...@huawei.com>
---
 doc/guides/rel_notes/release_23_03.rst |  4 ++--
 lib/ethdev/rte_ethdev.c                | 18 ++++++++++++++++++
 lib/ethdev/rte_ethdev.h                |  5 +++++
 3 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/doc/guides/rel_notes/release_23_03.rst 
b/doc/guides/rel_notes/release_23_03.rst
index af6f37389c..7879567427 100644
--- a/doc/guides/rel_notes/release_23_03.rst
+++ b/doc/guides/rel_notes/release_23_03.rst
@@ -284,8 +284,8 @@ ABI Changes
    Also, make sure to start the actual text at the margin.
    =======================================================
 
-* No ABI change that would break compatibility with 22.11.
-
+* ethdev: Added "func" field to ``rte_eth_rss_conf`` structure for RSS hash
+  algorithm.
 
 Known Issues
 ------------
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 4d03255683..db561026bd 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -1368,6 +1368,15 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t 
nb_rx_q, uint16_t nb_tx_q,
                goto rollback;
        }
 
+       if (dev_conf->rx_adv_conf.rss_conf.func >= RTE_ETH_HASH_FUNCTION_MAX) {
+               RTE_ETHDEV_LOG(WARNING,
+                       "Ethdev port_id=%u invalid rss hash function (%u), 
modified to default value (%u)\n",
+                       port_id, dev_conf->rx_adv_conf.rss_conf.func,
+                       RTE_ETH_HASH_FUNCTION_DEFAULT);
+               dev->data->dev_conf.rx_adv_conf.rss_conf.func =
+                       RTE_ETH_HASH_FUNCTION_DEFAULT;
+       }
+
        /* Check if Rx RSS distribution is disabled but RSS hash is enabled. */
        if (((dev_conf->rxmode.mq_mode & RTE_ETH_MQ_RX_RSS_FLAG) == 0) &&
            (dev_conf->rxmode.offloads & RTE_ETH_RX_OFFLOAD_RSS_HASH)) {
@@ -4553,6 +4562,13 @@ rte_eth_dev_rss_hash_update(uint16_t port_id,
                return -ENOTSUP;
        }
 
+       if (rss_conf->func >= RTE_ETH_HASH_FUNCTION_MAX) {
+               RTE_ETHDEV_LOG(NOTICE,
+                       "Ethdev port_id=%u invalid rss hash function (%u), 
modified to default value (%u)\n",
+                       port_id, rss_conf->func, RTE_ETH_HASH_FUNCTION_DEFAULT);
+               rss_conf->func = RTE_ETH_HASH_FUNCTION_DEFAULT;
+       }
+
        if (*dev->dev_ops->rss_hash_update == NULL)
                return -ENOTSUP;
        ret = eth_err(port_id, (*dev->dev_ops->rss_hash_update)(dev,
@@ -4580,6 +4596,8 @@ rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
                return -EINVAL;
        }
 
+       rss_conf->func = RTE_ETH_HASH_FUNCTION_DEFAULT;
+
        if (*dev->dev_ops->rss_hash_conf_get == NULL)
                return -ENOTSUP;
        ret = eth_err(port_id, (*dev->dev_ops->rss_hash_conf_get)(dev,
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
index 99fe9e238b..5abe2cb36d 100644
--- a/lib/ethdev/rte_ethdev.h
+++ b/lib/ethdev/rte_ethdev.h
@@ -174,6 +174,7 @@ extern "C" {
 
 #include "rte_ethdev_trace_fp.h"
 #include "rte_dev_info.h"
+#include "rte_flow.h"
 
 extern int rte_eth_dev_logtype;
 
@@ -461,11 +462,15 @@ struct rte_vlan_filter_conf {
  * The *rss_hf* field of the *rss_conf* structure indicates the different
  * types of IPv4/IPv6 packets to which the RSS hashing must be applied.
  * Supplying an *rss_hf* equal to zero disables the RSS feature.
+ *
+ * The *func* field of the *rss_conf* structure indicates the different
+ * types of hash algorithms applied by the RSS hashing.
  */
 struct rte_eth_rss_conf {
        uint8_t *rss_key;    /**< If not NULL, 40-byte hash key. */
        uint8_t rss_key_len; /**< hash key length in bytes. */
        uint64_t rss_hf;     /**< Hash functions to apply - see below. */
+       enum rte_eth_hash_function func;        /**< Hash algorithm to apply. */
 };
 
 /*
-- 
2.22.0

Reply via email to