remove trailing whitespaces
[dpdk.git] / app / test-pmd / cmdline.c
index b3824f9..293c9a7 100644 (file)
@@ -1,14 +1,14 @@
 /*-
  *   BSD LICENSE
- * 
+ *
  *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
  *   Copyright(c) 2014 6WIND S.A.
  *   All rights reserved.
- * 
+ *
  *   Redistribution and use in source and binary forms, with or without
  *   modification, are permitted provided that the following conditions
  *   are met:
- * 
+ *
  *     * Redistributions of source code must retain the above copyright
  *       notice, this list of conditions and the following disclaimer.
  *     * Redistributions in binary form must reproduce the above copyright
@@ -18,7 +18,7 @@
  *     * Neither the name of Intel Corporation nor the names of its
  *       contributors may be used to endorse or promote products derived
  *       from this software without specific prior written permission.
- * 
+ *
  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -182,6 +182,10 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "show port (info|stats|fdir|stat_qmap) (port_id|all)\n"
                        "    Display information for port_id, or all.\n\n"
 
+                       "show port rss-hash [key]\n"
+                       "    Display the RSS hash functions and RSS hash key"
+                       " of port X\n\n"
+
                        "clear port (info|stats|fdir|stat_qmap) (port_id|all)\n"
                        "    Clear information for port_id, or all.\n\n"
 
@@ -268,10 +272,10 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "rx_vlan add (vlan_id) port (port_id) vf (vf_mask)\n"
                        "    Add a vlan_id, to the set of VLAN identifiers"
                        "filtered for VF(s) from port_id.\n\n"
-                       
+
                        "rx_vlan rm (vlan_id) port (port_id) vf (vf_mask)\n"
                        "    Remove a vlan_id, to the set of VLAN identifiers"
-                       "filtered for VF(s) from port_id.\n\n"                  
+                       "filtered for VF(s) from port_id.\n\n"
 
                        "rx_vlan set tpid (value) (port_id)\n"
                        "    Set the outer VLAN TPID for Packet Filtering on"
@@ -305,9 +309,9 @@ static void cmd_help_long_parsed(void *parsed_result,
 
                        "mac_addr add port (port_id) vf (vf_id) (mac_address)\n"
                        "    Add a MAC address for a VF on the port.\n\n"
-                       
+
                        "set port (port_id) uta (mac_address|all) (on|off)\n"
-                       "    Add/Remove a or all unicast hash filter(s)" 
+                       "    Add/Remove a or all unicast hash filter(s)"
                        "from port X.\n\n"
 
                        "set promisc (port_id|all) (on|off)\n"
@@ -342,8 +346,8 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "    BAM:accepts broadcast packets;"
                        "MPE:accepts all multicast packets\n\n"
                        "    Enable/Disable a VF receive mode of a port\n\n"
-                       
-                       "set port (port_id) mirror-rule (rule_id)" 
+
+                       "set port (port_id) mirror-rule (rule_id)"
                        "(pool-mirror|vlan-mirror)\n"
                        " (poolmask|vlanid[,vlanid]*) dst-pool (pool_id) (on|off)\n"
                        "   Set pool or vlan type mirror rule on a port.\n"
@@ -1124,26 +1128,22 @@ cmd_config_rss_parsed(void *parsed_result,
                        __attribute__((unused)) void *data)
 {
        struct cmd_config_rss *res = parsed_result;
-
-       if (!all_ports_stopped()) {
-               printf("Please stop all ports first\n");
-               return;
-       }
+       struct rte_eth_rss_conf rss_conf;
+       uint8_t i;
 
        if (!strcmp(res->value, "ip"))
-               rss_hf = ETH_RSS_IPV4 | ETH_RSS_IPV6;
+               rss_conf.rss_hf = ETH_RSS_IPV4 | ETH_RSS_IPV6;
        else if (!strcmp(res->value, "udp"))
-               rss_hf = ETH_RSS_IPV4 | ETH_RSS_IPV6 | ETH_RSS_IPV4_UDP;
+               rss_conf.rss_hf = ETH_RSS_IPV4_UDP | ETH_RSS_IPV6_UDP;
        else if (!strcmp(res->value, "none"))
-               rss_hf = 0;
+               rss_conf.rss_hf = 0;
        else {
                printf("Unknown parameter\n");
                return;
        }
-
-       init_port_config();
-
-       cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
+       rss_conf.rss_key = NULL;
+       for (i = 0; i < rte_eth_dev_count(); i++)
+               rte_eth_dev_rss_hash_update(i, &rss_conf);
 }
 
 cmdline_parse_token_string_t cmd_config_rss_port =
@@ -1171,6 +1171,99 @@ cmdline_parse_inst_t cmd_config_rss = {
        },
 };
 
+/* *** configure rss hash key *** */
+struct cmd_config_rss_hash_key {
+       cmdline_fixed_string_t port;
+       cmdline_fixed_string_t config;
+       uint8_t port_id;
+       cmdline_fixed_string_t rss_hash_key;
+       cmdline_fixed_string_t key;
+};
+
+#define RSS_HASH_KEY_LENGTH 40
+static uint8_t
+hexa_digit_to_value(char hexa_digit)
+{
+       if ((hexa_digit >= '0') && (hexa_digit <= '9'))
+               return (uint8_t) (hexa_digit - '0');
+       if ((hexa_digit >= 'a') && (hexa_digit <= 'f'))
+               return (uint8_t) ((hexa_digit - 'a') + 10);
+       if ((hexa_digit >= 'A') && (hexa_digit <= 'F'))
+               return (uint8_t) ((hexa_digit - 'A') + 10);
+       /* Invalid hexa digit */
+       return 0xFF;
+}
+
+static uint8_t
+parse_and_check_key_hexa_digit(char *key, int idx)
+{
+       uint8_t hexa_v;
+
+       hexa_v = hexa_digit_to_value(key[idx]);
+       if (hexa_v == 0xFF)
+               printf("invalid key: character %c at position %d is not a "
+                      "valid hexa digit\n", key[idx], idx);
+       return hexa_v;
+}
+
+static void
+cmd_config_rss_hash_key_parsed(void *parsed_result,
+                              __attribute__((unused)) struct cmdline *cl,
+                              __attribute__((unused)) void *data)
+{
+       struct cmd_config_rss_hash_key *res = parsed_result;
+       uint8_t hash_key[RSS_HASH_KEY_LENGTH];
+       uint8_t xdgt0;
+       uint8_t xdgt1;
+       int i;
+
+       /* Check the length of the RSS hash key */
+       if (strlen(res->key) != (RSS_HASH_KEY_LENGTH * 2)) {
+               printf("key length: %d invalid - key must be a string of %d"
+                      "hexa-decimal numbers\n", (int) strlen(res->key),
+                      RSS_HASH_KEY_LENGTH * 2);
+               return;
+       }
+       /* Translate RSS hash key into binary representation */
+       for (i = 0; i < RSS_HASH_KEY_LENGTH; i++) {
+               xdgt0 = parse_and_check_key_hexa_digit(res->key, (i * 2));
+               if (xdgt0 == 0xFF)
+                       return;
+               xdgt1 = parse_and_check_key_hexa_digit(res->key, (i * 2) + 1);
+               if (xdgt1 == 0xFF)
+                       return;
+               hash_key[i] = (uint8_t) ((xdgt0 * 16) + xdgt1);
+       }
+       port_rss_hash_key_update(res->port_id, hash_key);
+}
+
+cmdline_parse_token_string_t cmd_config_rss_hash_key_port =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, port, "port");
+cmdline_parse_token_string_t cmd_config_rss_hash_key_config =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, config,
+                                "config");
+cmdline_parse_token_string_t cmd_config_rss_hash_key_port_id =
+       TOKEN_NUM_INITIALIZER(struct cmd_config_rss_hash_key, port_id, UINT8);
+cmdline_parse_token_string_t cmd_config_rss_hash_key_rss_hash_key =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key,
+                                rss_hash_key, "rss-hash-key");
+cmdline_parse_token_string_t cmd_config_rss_hash_key_value =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, key, NULL);
+
+cmdline_parse_inst_t cmd_config_rss_hash_key = {
+       .f = cmd_config_rss_hash_key_parsed,
+       .data = NULL,
+       .help_str = "port config X rss-hash-key 80 hexa digits",
+       .tokens = {
+               (void *)&cmd_config_rss_hash_key_port,
+               (void *)&cmd_config_rss_hash_key_config,
+               (void *)&cmd_config_rss_hash_key_port_id,
+               (void *)&cmd_config_rss_hash_key_rss_hash_key,
+               (void *)&cmd_config_rss_hash_key_value,
+               NULL,
+       },
+};
+
 /* *** Configure RSS RETA *** */
 struct cmd_config_rss_reta {
        cmdline_fixed_string_t port;
@@ -1347,6 +1440,63 @@ cmdline_parse_inst_t cmd_showport_reta = {
        },
 };
 
+/* *** Show RSS hash configuration *** */
+struct cmd_showport_rss_hash {
+       cmdline_fixed_string_t show;
+       cmdline_fixed_string_t port;
+       uint8_t port_id;
+       cmdline_fixed_string_t rss_hash;
+       cmdline_fixed_string_t key; /* optional argument */
+};
+
+static void cmd_showport_rss_hash_parsed(void *parsed_result,
+                               __attribute__((unused)) struct cmdline *cl,
+                               void *show_rss_key)
+{
+       struct cmd_showport_rss_hash *res = parsed_result;
+
+       port_rss_hash_conf_show(res->port_id, show_rss_key != NULL);
+}
+
+cmdline_parse_token_string_t cmd_showport_rss_hash_show =
+       TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, show, "show");
+cmdline_parse_token_string_t cmd_showport_rss_hash_port =
+       TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, port, "port");
+cmdline_parse_token_num_t cmd_showport_rss_hash_port_id =
+       TOKEN_NUM_INITIALIZER(struct cmd_showport_rss_hash, port_id, UINT8);
+cmdline_parse_token_string_t cmd_showport_rss_hash_rss_hash =
+       TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, rss_hash,
+                                "rss-hash");
+cmdline_parse_token_string_t cmd_showport_rss_hash_rss_key =
+       TOKEN_STRING_INITIALIZER(struct cmd_showport_rss_hash, key, "key");
+
+cmdline_parse_inst_t cmd_showport_rss_hash = {
+       .f = cmd_showport_rss_hash_parsed,
+       .data = NULL,
+       .help_str = "show port X rss-hash (X = port number)\n",
+       .tokens = {
+               (void *)&cmd_showport_rss_hash_show,
+               (void *)&cmd_showport_rss_hash_port,
+               (void *)&cmd_showport_rss_hash_port_id,
+               (void *)&cmd_showport_rss_hash_rss_hash,
+               NULL,
+       },
+};
+
+cmdline_parse_inst_t cmd_showport_rss_hash_key = {
+       .f = cmd_showport_rss_hash_parsed,
+       .data = (void *)1,
+       .help_str = "show port X rss-hash key (X = port number)\n",
+       .tokens = {
+               (void *)&cmd_showport_rss_hash_show,
+               (void *)&cmd_showport_rss_hash_port,
+               (void *)&cmd_showport_rss_hash_port_id,
+               (void *)&cmd_showport_rss_hash_rss_hash,
+               (void *)&cmd_showport_rss_hash_rss_key,
+               NULL,
+       },
+};
+
 /* *** Configure DCB *** */
 struct cmd_config_dcb {
        cmdline_fixed_string_t port;
@@ -2777,9 +2927,9 @@ static void cmd_set_burst_tx_retry_parsed(void *parsed_result,
        if (!strcmp(res->set, "set") && !strcmp(res->burst, "burst")
                && !strcmp(res->tx, "tx")) {
                if (!strcmp(res->delay, "delay"))
-                       burst_tx_delay_time = res->time;        
+                       burst_tx_delay_time = res->time;
                if (!strcmp(res->retry, "retry"))
-                       burst_tx_retry_num = res->retry_num;    
+                       burst_tx_retry_num = res->retry_num;
        }
 
 }
@@ -4414,15 +4564,15 @@ cmd_set_uc_hash_parsed(void *parsed_result,
 {
        int ret=0;
        struct cmd_set_uc_hash_table *res = parsed_result;
-       
+
        int is_on = (strcmp(res->mode, "on") == 0) ? 1 : 0;
-       
+
        if (strcmp(res->what, "uta") == 0)
-               ret = rte_eth_dev_uc_hash_table_set(res->port_id, 
+               ret = rte_eth_dev_uc_hash_table_set(res->port_id,
                                                &res->address,(uint8_t)is_on);
        if (ret < 0)
                printf("bad unicast hash table parameter, return code = %d \n", ret);
-       
+
 }
 
 cmdline_parse_token_string_t cmd_set_uc_hash_set =
@@ -4438,7 +4588,7 @@ cmdline_parse_token_string_t cmd_set_uc_hash_what =
        TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table,
                                 what, "uta");
 cmdline_parse_token_etheraddr_t cmd_set_uc_hash_mac =
-       TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_uc_hash_table, 
+       TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_uc_hash_table,
                                address);
 cmdline_parse_token_string_t cmd_set_uc_hash_mode =
        TOKEN_STRING_INITIALIZER(struct cmd_set_uc_hash_table,
@@ -4475,14 +4625,14 @@ cmd_set_uc_all_hash_parsed(void *parsed_result,
 {
        int ret=0;
        struct cmd_set_uc_all_hash_table *res = parsed_result;
-       
+
        int is_on = (strcmp(res->mode, "on") == 0) ? 1 : 0;
-       
-       if ((strcmp(res->what, "uta") == 0) && 
+
+       if ((strcmp(res->what, "uta") == 0) &&
                (strcmp(res->value, "all") == 0))
                ret = rte_eth_dev_uc_all_hash_table_set(res->port_id,(uint8_t) is_on);
        if (ret < 0)
-               printf("bad unicast hash table parameter," 
+               printf("bad unicast hash table parameter,"
                        "return code = %d \n", ret);
 }
 
@@ -4499,7 +4649,7 @@ cmdline_parse_token_string_t cmd_set_uc_all_hash_what =
        TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table,
                                 what, "uta");
 cmdline_parse_token_string_t cmd_set_uc_all_hash_value =
-       TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table, 
+       TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table,
                                value,"all");
 cmdline_parse_token_string_t cmd_set_uc_all_hash_mode =
        TOKEN_STRING_INITIALIZER(struct cmd_set_uc_all_hash_table,
@@ -4601,7 +4751,7 @@ cmd_set_vf_rxmode_parsed(void *parsed_result,
        int ret;
        uint16_t rx_mode = 0;
        struct cmd_set_vf_rxmode *res = parsed_result;
-       
+
        int is_on = (strcmp(res->on, "on") == 0) ? 1 : 0;
        if (!strcmp(res->what,"rxmode")) {
                if (!strcmp(res->mode, "AUPE"))
@@ -4681,7 +4831,7 @@ static void cmd_vf_mac_addr_parsed(void *parsed_result,
        int ret = 0;
 
        if (strcmp(res->what, "add") == 0)
-               ret = rte_eth_dev_mac_addr_add(res->port_num, 
+               ret = rte_eth_dev_mac_addr_add(res->port_num,
                                        &res->address, res->vf_num);
        if(ret < 0)
                printf("vf_mac_addr_cmd error: (%s)\n", strerror(-ret));
@@ -4692,22 +4842,22 @@ cmdline_parse_token_string_t cmd_vf_mac_addr_cmd =
        TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result,
                                mac_addr_cmd,"mac_addr");
 cmdline_parse_token_string_t cmd_vf_mac_addr_what =
-       TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result, 
+       TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result,
                                what,"add");
 cmdline_parse_token_string_t cmd_vf_mac_addr_port =
-       TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result, 
+       TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result,
                                port,"port");
 cmdline_parse_token_num_t cmd_vf_mac_addr_portnum =
-       TOKEN_NUM_INITIALIZER(struct cmd_vf_mac_addr_result, 
+       TOKEN_NUM_INITIALIZER(struct cmd_vf_mac_addr_result,
                                port_num, UINT8);
 cmdline_parse_token_string_t cmd_vf_mac_addr_vf =
-       TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result, 
+       TOKEN_STRING_INITIALIZER(struct cmd_vf_mac_addr_result,
                                vf,"vf");
 cmdline_parse_token_num_t cmd_vf_mac_addr_vfnum =
        TOKEN_NUM_INITIALIZER(struct cmd_vf_mac_addr_result,
                                vf_num, UINT8);
 cmdline_parse_token_etheraddr_t cmd_vf_mac_addr_addr =
-       TOKEN_ETHERADDR_INITIALIZER(struct cmd_vf_mac_addr_result, 
+       TOKEN_ETHERADDR_INITIALIZER(struct cmd_vf_mac_addr_result,
                                address);
 
 cmdline_parse_inst_t cmd_vf_mac_addr_filter = {
@@ -4884,7 +5034,7 @@ cmd_set_mirror_mask_parsed(void *parsed_result,
 cmdline_parse_inst_t cmd_set_mirror_mask = {
                .f = cmd_set_mirror_mask_parsed,
                .data = NULL,
-               .help_str = "set port X mirror-rule Y pool-mirror|vlan-mirror " 
+               .help_str = "set port X mirror-rule Y pool-mirror|vlan-mirror "
                                "pool_mask|vlan_id[,vlan_id]* dst-pool Z on|off",
                .tokens = {
                        (void *)&cmd_mirror_mask_set,
@@ -5233,6 +5383,9 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_set_mirror_mask,
        (cmdline_parse_inst_t *)&cmd_set_mirror_link,
        (cmdline_parse_inst_t *)&cmd_reset_mirror_rule,
+       (cmdline_parse_inst_t *)&cmd_showport_rss_hash,
+       (cmdline_parse_inst_t *)&cmd_showport_rss_hash_key,
+       (cmdline_parse_inst_t *)&cmd_config_rss_hash_key,
        (cmdline_parse_inst_t *)&cmd_dump,
        (cmdline_parse_inst_t *)&cmd_dump_one,
        NULL,