When start the testpmd, the pmd driver initializes the RSS configuration. Generally, the recommended RSS hash key is used as the default key in the driver. In addition, the default key is different from the default RSS flow in testpmd without specifying RSS hash key. So. if you do not specify the RSS key when creating an RSS rule, the testpmd uses the default key as the default RSS key of the RSS rule. As a result, you may mistakenly consider that the RSS key in use is the valid default key of the NIC, actually, the key and the valid default key of the NIC are two values.
Consider the follow usage with testpmd: 1. first, startup testpmd: testpmd> show port 0 rss-hash key RSS functions: all ipv4-frag ipv4-other ipv6-frag ipv6-other ip RSS key: -6D5A56DA255B0EC24167253D43A38FB0D0CA2BCBAE7B30B477CB2DA38030F -20C6A42B73BBEAC01FA 2. create a rss rule testpmd> flow create 0 ingress pattern eth / ipv4 / udp / end actions rss \ types ipv4-udp end queues end / end 3. show rss-hash key testpmd> show port 0 rss-hash key RSS functions: all ipv4-udp udp RSS key: -74657374706D6427732064656661756C74205253532068617368206B65792C206F -76657272696465 In order to solve the above problems, it use the NIC valid default RSS key instead of the testpmd dummy RSS key in the flow configuration when the RSS key is not specified in the flow rule. If the NIC RSS key is invalid, it will use testpmd dummy RSS key as the default key. Fixes: ac8d22de2394 ("ethdev: flatten RSS configuration in flow API") Cc: sta...@dpdk.org Signed-off-by: Lijun Ou <ouli...@huawei.com> Reviewed-by: Phil Yang <phil.y...@arm.com> --- V4->V5: -rewrite the commit log -add reviewed-by V3->V4: -fix checkpatch warning and shorter commit content. V2->V3: -fix checkpatch warning. V1->V2: -fix the commit. --- app/test-pmd/cmdline_flow.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c index 84bba0f..578555e 100644 --- a/app/test-pmd/cmdline_flow.c +++ b/app/test-pmd/cmdline_flow.c @@ -4735,6 +4735,7 @@ parse_vc_action_rss(struct context *ctx, const struct token *token, action_rss_data->queue[i] = i; if (!port_id_is_invalid(ctx->port, DISABLED_WARN) && ctx->port != (portid_t)RTE_PORT_ALL) { + struct rte_eth_rss_conf rss_conf = {0}; struct rte_eth_dev_info info; int ret2; @@ -4745,6 +4746,13 @@ parse_vc_action_rss(struct context *ctx, const struct token *token, action_rss_data->conf.key_len = RTE_MIN(sizeof(action_rss_data->key), info.hash_key_size); + + rss_conf.rss_key_len = sizeof(action_rss_data->key); + rss_conf.rss_key = action_rss_data->key; + ret2 = rte_eth_dev_rss_hash_conf_get(ctx->port, &rss_conf); + if (ret2 != 0) + return ret2; + action_rss_data->conf.key = rss_conf.rss_key; } action->conf = &action_rss_data->conf; return ret; -- 2.7.4