Add command "port config <port_id> rss-hash-func <func>" to set RSS
hash algorithms.

Signed-off-by: Jie Hai <haij...@huawei.com>
---
 app/test-pmd/cmdline.c | 78 ++++++++++++++++++++++++++++++++++++++++--
 app/test-pmd/config.c  | 16 ++++-----
 app/test-pmd/testpmd.h |  3 +-
 3 files changed, 84 insertions(+), 13 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index e7888be305da..375f16fcee14 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -2136,6 +2136,76 @@ static cmdline_parse_inst_t cmd_config_rss = {
        },
 };
 
+/* *** configure rss hash algorithms *** */
+struct cmd_config_rss_hash_func {
+       cmdline_fixed_string_t port;
+       cmdline_fixed_string_t config;
+       portid_t port_id;
+       cmdline_fixed_string_t rss_hash_func;
+       cmdline_fixed_string_t func;
+};
+
+static void
+cmd_config_rss_hash_func_parsed(void *parsed_result,
+                              __rte_unused struct cmdline *cl,
+                              __rte_unused void *data)
+{
+       struct cmd_config_rss_hash_func *res = parsed_result;
+       struct rte_eth_rss_conf rss_conf = {0};
+       struct {
+               const char *name;
+               enum rte_eth_hash_function func;
+       } hash_func_map[] = {
+               {"default",             RTE_ETH_HASH_FUNCTION_DEFAULT},
+               {"toeplitz",            RTE_ETH_HASH_FUNCTION_TOEPLITZ},
+               {"simple_xor",          RTE_ETH_HASH_FUNCTION_SIMPLE_XOR},
+               {"symmetric_toeplitz",  
RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ},
+               {NULL,                  RTE_ETH_HASH_FUNCTION_MAX},
+       };
+       int i = 0;
+
+       rss_conf.func = RTE_ETH_HASH_FUNCTION_MAX;
+       while (hash_func_map[i].name != NULL) {
+               if (!strcmp(hash_func_map[i].name, res->func)) {
+                       rss_conf.func = hash_func_map[i].func;
+                       break;
+               }
+               i++;
+       }
+
+       port_rss_hash_key_update(res->port_id, &rss_conf);
+}
+
+static cmdline_parse_token_string_t cmd_config_rss_hash_func_port =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_func, port, "port");
+static cmdline_parse_token_string_t cmd_config_rss_hash_func_config =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_func, config,
+                                "config");
+static cmdline_parse_token_num_t cmd_config_rss_hash_func_port_id =
+       TOKEN_NUM_INITIALIZER(struct cmd_config_rss_hash_func, port_id,
+                                RTE_UINT16);
+static cmdline_parse_token_string_t cmd_config_rss_hash_func_rss_hash_func =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_func,
+                                rss_hash_func, "rss-hash-func");
+static cmdline_parse_token_string_t cmd_config_rss_hash_func_value =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_func, func,
+                               
"default#toeplitz#simple_xor#symmetric_toeplitz");
+
+static cmdline_parse_inst_t cmd_config_rss_hash_func = {
+       .f = cmd_config_rss_hash_func_parsed,
+       .data = NULL,
+       .help_str = "port config <port_id> rss-hash-func"
+               "default|toeplitz|simple_xor|symmetric_toeplitz",
+       .tokens = {
+               (void *)&cmd_config_rss_hash_func_port,
+               (void *)&cmd_config_rss_hash_func_config,
+               (void *)&cmd_config_rss_hash_func_port_id,
+               (void *)&cmd_config_rss_hash_func_rss_hash_func,
+               (void *)&cmd_config_rss_hash_func_value,
+               NULL,
+       },
+};
+
 /* *** configure rss hash key *** */
 struct cmd_config_rss_hash_key {
        cmdline_fixed_string_t port;
@@ -2182,6 +2252,7 @@ cmd_config_rss_hash_key_parsed(void *parsed_result,
        uint8_t xdgt0;
        uint8_t xdgt1;
        int i;
+       struct rte_eth_rss_conf rss_conf = {0};
        struct rte_eth_dev_info dev_info;
        uint8_t hash_key_size;
        uint32_t key_len;
@@ -2217,8 +2288,10 @@ cmd_config_rss_hash_key_parsed(void *parsed_result,
                        return;
                hash_key[i] = (uint8_t) ((xdgt0 * 16) + xdgt1);
        }
-       port_rss_hash_key_update(res->port_id, res->rss_type, hash_key,
-                       hash_key_size);
+       rss_conf.rss_key = hash_key;
+       rss_conf.rss_key_len = hash_key_size;
+       rss_conf.rss_hf = str_to_rsstypes(res->rss_type);
+       port_rss_hash_key_update(res->port_id, &rss_conf);
 }
 
 static cmdline_parse_token_string_t cmd_config_rss_hash_key_port =
@@ -12946,6 +13019,7 @@ static cmdline_parse_ctx_t builtin_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_showport_rss_hash_func,
        (cmdline_parse_inst_t *)&cmd_showport_rss_hash_all,
        (cmdline_parse_inst_t *)&cmd_config_rss_hash_key,
+       (cmdline_parse_inst_t *)&cmd_config_rss_hash_func,
        (cmdline_parse_inst_t *)&cmd_cleanup_txq_mbufs,
        (cmdline_parse_inst_t *)&cmd_dump,
        (cmdline_parse_inst_t *)&cmd_dump_one,
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index 65eca8467d61..2f27642c31d2 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -4477,21 +4477,19 @@ port_rss_hash_conf_show(portid_t port_id, int 
show_rss_key, int show_rss_func)
 }
 
 void
-port_rss_hash_key_update(portid_t port_id, char rss_type[], uint8_t *hash_key,
-                        uint8_t hash_key_len)
+port_rss_hash_key_update(portid_t port_id, struct rte_eth_rss_conf *conf)
 {
-       struct rte_eth_rss_conf rss_conf;
+       struct rte_eth_rss_conf rss_conf = {0};
        int diag;
 
-       rss_conf.rss_key = NULL;
-       rss_conf.rss_key_len = 0;
-       rss_conf.rss_hf = str_to_rsstypes(rss_type);
        diag = rte_eth_dev_rss_hash_conf_get(port_id, &rss_conf);
        if (diag == 0) {
-               rss_conf.rss_key = hash_key;
-               rss_conf.rss_key_len = hash_key_len;
-               diag = rte_eth_dev_rss_hash_update(port_id, &rss_conf);
+               conf->rss_key = conf->rss_key == NULL ? rss_conf.rss_key : 
conf->rss_key;
+               conf->rss_key_len = conf->rss_key_len == 0 ? 
rss_conf.rss_key_len : conf->rss_key_len;
+               conf->rss_hf = conf->rss_hf == 0 ? rss_conf.rss_hf : 
conf->rss_hf;
+               diag = rte_eth_dev_rss_hash_update(port_id, conf);
        }
+
        if (diag == 0)
                return;
 
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 3dc2f47280ad..8ec7fd39e586 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -1147,8 +1147,7 @@ int set_rxq_avail_thresh(portid_t port_id, uint16_t 
queue_id,
                         uint8_t avail_thresh);
 
 void port_rss_hash_conf_show(portid_t port_id, int show_rss_key, int 
show_rss_func);
-void port_rss_hash_key_update(portid_t port_id, char rss_type[],
-                             uint8_t *hash_key, uint8_t hash_key_len);
+void port_rss_hash_key_update(portid_t port_id, struct rte_eth_rss_conf 
*rss_conf);
 int rx_queue_id_is_invalid(queueid_t rxq_id);
 int tx_queue_id_is_invalid(queueid_t txq_id);
 #ifdef RTE_LIB_GRO
-- 
2.33.0

Reply via email to