From: Kiran Kumar K <kirankum...@marvell.com>

Adding support to set RSS level from ethdev config.
level-default will requests the default behavior.
level-outer will requests RSS to be performed on the outermost packet
encapsulation level.
level-inner will request RSS to be performed on the specified inner packet
encapsulation level, from outermost to innermost.

Signed-off-by: Kiran Kumar K <kirankum...@marvell.com>
---
 app/test-pmd/cmdline.c    | 17 ++++++++++++++---
 app/test-pmd/parameters.c | 14 +++++++++++---
 2 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 0a6ed85f3..db6263026 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -794,7 +794,8 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "receive buffers available.\n\n"
 
                        "port config all rss (all|default|ip|tcp|udp|sctp|"
-                       
"ether|port|vxlan|geneve|nvgre|vxlan-gpe|none|<flowtype_id>)\n"
+                       
"ether|port|vxlan|geneve|nvgre|vxlan-gpe|none|level-default|"
+                       "level-outer|level-inner|<flowtype_id>)\n"
                        "    Set the RSS mode.\n\n"
 
                        "port config port-id rss reta 
(hash,queue)[,(hash,queue)]\n"
@@ -2334,7 +2335,16 @@ cmd_config_rss_parsed(void *parsed_result,
                rss_conf.rss_hf = ETH_RSS_GTPU;
        else if (!strcmp(res->value, "none"))
                rss_conf.rss_hf = 0;
-       else if (!strcmp(res->value, "default"))
+       else if (!strcmp(res->value, "level-default")) {
+               rss_hf &= (~ETH_RSS_LEVEL_MASK);
+               rss_conf.rss_hf = (rss_hf | ETH_RSS_LEVEL_PMD_DEFAULT);
+       } else if (!strcmp(res->value, "level-outer")) {
+               rss_hf &= (~ETH_RSS_LEVEL_MASK);
+               rss_conf.rss_hf = (rss_hf | ETH_RSS_LEVEL_OUTERMOST);
+       } else if (!strcmp(res->value, "level-inner")) {
+               rss_hf &= (~ETH_RSS_LEVEL_MASK);
+               rss_conf.rss_hf = (rss_hf | ETH_RSS_LEVEL_INNERMOST);
+       } else if (!strcmp(res->value, "default"))
                use_default = 1;
        else if (isdigit(res->value[0]) && atoi(res->value) > 0 &&
                                                atoi(res->value) < 64)
@@ -2393,7 +2403,8 @@ cmdline_parse_inst_t cmd_config_rss = {
        .data = NULL,
        .help_str = "port config all rss "
                "all|default|eth|vlan|ip|tcp|udp|sctp|ether|port|vxlan|geneve|"
-               "nvgre|vxlan-gpe|l2tpv3|esp|ah|pfcp|none|<flowtype_id>",
+               "nvgre|vxlan-gpe|l2tpv3|esp|ah|pfcp|none|level-default|"
+               "level-outer|level-inner|<flowtype_id>",
        .tokens = {
                (void *)&cmd_config_rss_port,
                (void *)&cmd_config_rss_keyword,
diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c
index 7cb0e3d6e..34a793945 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -66,9 +66,9 @@ usage(char* progname)
               "--tx-ip=SRC,DST | --tx-udp=PORT | "
 #endif
               "--pkt-filter-mode= |"
-              "--rss-ip | --rss-udp | "
-              "--rxpt= | --rxht= | --rxwt= | --rxfreet= | "
-              "--txpt= | --txht= | --txwt= | --txfreet= | "
+              "--rss-ip | --rss-udp | --rss-level-inner | --rss-level-outer |"
+              "--rxpt= | --rxht= | --rxwt= |"
+              " --rxfreet= | --txpt= | --txht= | --txwt= | --txfreet= | "
               "--txrst= | --tx-offloads= | | --rx-offloads= | "
               "--vxlan-gpe-port= ]\n",
               progname);
@@ -151,6 +151,8 @@ usage(char* progname)
                        "swap L2,L3,L4 for MAC, IPv4/IPv6 and TCP/UDP only.\n");
        printf("  --rss-ip: set RSS functions to IPv4/IPv6 only .\n");
        printf("  --rss-udp: set RSS functions to IPv4/IPv6 + UDP.\n");
+       printf("  --rss-level-inner: set RSS hash level to innermost\n");
+       printf("  --rss-level-outer: set RSS hash level to outermost\n");
        printf("  --rxq=N: set the number of RX queues per port to N.\n");
        printf("  --rxd=N: set the number of descriptors in RX rings to N.\n");
        printf("  --txq=N: set the number of TX queues per port to N.\n");
@@ -632,6 +634,8 @@ launch_args_parse(int argc, char** argv)
                { "forward-mode",               1, 0, 0 },
                { "rss-ip",                     0, 0, 0 },
                { "rss-udp",                    0, 0, 0 },
+               { "rss-level-outer",            0, 0, 0 },
+               { "rss-level-inner",            0, 0, 0 },
                { "rxq",                        1, 0, 0 },
                { "txq",                        1, 0, 0 },
                { "rxd",                        1, 0, 0 },
@@ -1051,6 +1055,10 @@ launch_args_parse(int argc, char** argv)
                                rss_hf = ETH_RSS_IP;
                        if (!strcmp(lgopts[opt_idx].name, "rss-udp"))
                                rss_hf = ETH_RSS_UDP;
+                       if (!strcmp(lgopts[opt_idx].name, "rss-level-inner"))
+                               rss_hf |= ETH_RSS_LEVEL_INNERMOST;
+                       if (!strcmp(lgopts[opt_idx].name, "rss-level-outer"))
+                               rss_hf |= ETH_RSS_LEVEL_OUTERMOST;
                        if (!strcmp(lgopts[opt_idx].name, "rxq")) {
                                n = atoi(optarg);
                                if (n >= 0 && check_nb_rxq((queueid_t)n) == 0)
-- 
2.25.1

Reply via email to