X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest-pmd%2Fcmdline.c;h=293c9a74b61c98a2a8e76869a9560349b28a39ef;hb=3031749c2df04a63cdcef186dcce3781e61436e8;hp=b3824f92179b8b043ad38fa0e074c86b03963524;hpb=591a9d7985c1230652d9f7ea1f9221e8c66ec188;p=dpdk.git diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index b3824f9217..293c9a74b6 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -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,