@@ -83,6 +83,7 @@
*/
#define RTE_TEST_RX_DESC_DEFAULT 128
#define RTE_TEST_TX_DESC_DEFAULT 512
+#define RTE_PMD_PARAM_UNSET -1
#define MAX_TX_QUEUE_PER_PORT RTE_MAX_ETHPORTS
#define MAX_RX_QUEUE_PER_PORT 128
@@ -92,6 +93,9 @@
/* Static global variables used within this file. */
static uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT;
static uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT;
+static int16_t rx_free_thresh = RTE_PMD_PARAM_UNSET;
+static int16_t tx_free_thresh = RTE_PMD_PARAM_UNSET;
+static int16_t tx_rs_thresh = RTE_PMD_PARAM_UNSET;
/**< Ports set in promiscuous mode off by default. */
static int promiscuous_on;
@@ -320,7 +324,12 @@ print_usage(const char *prgname)
" [--no-numa]"
" [--hash-entry-num]"
" [--ipv6]"
- " [--parse-ptype]\n\n"
+ " [--parse-ptype]"
+ " [--nb-rxd]"
+ " [--nb-txd]"
+ " [--rx-free-thresh]"
+ " [--tx-free-thresh]"
+ " [--tx-rs-thresh]\n\n"
" -p PORTMASK: Hexadecimal bitmask of ports to configure\n"
" -P : Enable promiscuous mode\n"
@@ -334,7 +343,12 @@ print_usage(const char *prgname)
" --no-numa: Disable numa awareness\n"
" --hash-entry-num: Specify the hash entry number in hexadecimal to be setup\n"
" --ipv6: Set if running ipv6 packets\n"
- " --parse-ptype: Set to use software to analyze packet type\n\n",
+ " --parse-ptype: Set to use software to analyze packet type\n\n"
+ " --nb-rxd: Set number of descriptors of Rx queue\n"
+ " --nb-txd: Set number of descriptors of Tx queue\n"
+ " --rx-free-thresh: Set value of Tx free threshold\n"
+ " --tx-free-thresh: Set value of Rx free threshold\n"
+ " --tx-rs-thresh: Set value of Tx RS bit threshold\n\n",
prgname);
}
@@ -389,6 +403,91 @@ parse_hash_entry_number(const char *hash_entry_num)
}
static int
+parse_nb_rxd(const char *nb_rxd_c)
+{
+ char *end = NULL;
+ unsigned int nb_rxd_t;
+
+ /* parse hexadecimal string */
+ nb_rxd_t = strtoul(nb_rxd_c, &end, 10);
+ if ((nb_rxd_c[0] == '\0') || (end == NULL) || (*end != '\0'))
+ return -1;
+
+ if (nb_rxd_t == 0)
+ return -1;
+
+ return nb_rxd_t;
+}
+
+static int
+parse_nb_txd(const char *nb_txd_c)
+{
+ char *end = NULL;
+ unsigned int nb_txd_t;
+
+ /* parse hexadecimal string */
+ nb_txd_t = strtoul(nb_txd_c, &end, 10);
+ if ((nb_txd_c[0] == '\0') || (end == NULL) || (*end != '\0'))
+ return -1;
+
+ if (nb_txd_t == 0)
+ return -1;
+
+ return nb_txd_t;
+}
+
+static int
+parse_rx_free_thresh(const char *rx_free_thresh_c)
+{
+ char *end = NULL;
+ unsigned int rx_free_thresh_t;
+
+ /* parse hexadecimal string */
+ rx_free_thresh_t = strtoul(rx_free_thresh_c, &end, 10);
+ if ((rx_free_thresh_c[0] == '\0') || (end == NULL) || (*end != '\0'))
+ return -1;
+
+ if (rx_free_thresh_t == 0)
+ return -1;
+
+ return rx_free_thresh_t;
+}
+
+static int
+parse_tx_free_thresh(const char *tx_free_thresh_c)
+{
+ char *end = NULL;
+ unsigned int tx_free_thresh_t;
+
+ /* parse hexadecimal string */
+ tx_free_thresh_t = strtoul(tx_free_thresh_c, &end, 16);
+ if ((tx_free_thresh_c[0] == '\0') || (end == NULL) || (*end != '\0'))
+ return -1;
+
+ if (tx_free_thresh_t == 0)
+ return -1;
+
+ return tx_free_thresh_t;
+}
+
+static int
+parse_tx_rs_thresh(const char *tx_rs_thresh_c)
+{
+ char *end = NULL;
+ unsigned int tx_rs_thresh_t;
+
+ /* parse hexadecimal string */
+ tx_rs_thresh_t = strtoul(tx_rs_thresh_c, &end, 10);
+ if ((tx_rs_thresh_c[0] == '\0') || (end == NULL) || (*end != '\0'))
+ return -1;
+
+ if (tx_rs_thresh_t == 0)
+ return -1;
+
+ return tx_rs_thresh_t;
+}
+
+static int
parse_config(const char *q_arg)
{
char s[256];
@@ -487,6 +586,11 @@ static const char short_options[] =
#define CMD_LINE_OPT_ENABLE_JUMBO "enable-jumbo"
#define CMD_LINE_OPT_HASH_ENTRY_NUM "hash-entry-num"
#define CMD_LINE_OPT_PARSE_PTYPE "parse-ptype"
+#define CMD_LINE_OPT_NB_RXD "nb-rxd"
+#define CMD_LINE_OPT_NB_TXD "nb-txd"
+#define CMD_LINE_OPT_RX_FREE_THRESH "rx-free-thresh"
+#define CMD_LINE_OPT_TX_FREE_THRESH "tx-free-thresh"
+#define CMD_LINE_OPT_TX_RS_THRESH "tx-rs-thresh"
enum {
/* long options mapped to a short option */
@@ -500,6 +604,11 @@ enum {
CMD_LINE_OPT_ENABLE_JUMBO_NUM,
CMD_LINE_OPT_HASH_ENTRY_NUM_NUM,
CMD_LINE_OPT_PARSE_PTYPE_NUM,
+ CMD_LINE_OPT_NB_RXD_NUM,
+ CMD_LINE_OPT_NB_TXD_NUM,
+ CMD_LINE_OPT_RX_FREE_THRESH_NUM,
+ CMD_LINE_OPT_TX_FREE_THRESH_NUM,
+ CMD_LINE_OPT_TX_RS_THRESH_NUM,
};
static const struct option lgopts[] = {
@@ -510,6 +619,11 @@ static const struct option lgopts[] = {
{CMD_LINE_OPT_ENABLE_JUMBO, 0, 0, CMD_LINE_OPT_ENABLE_JUMBO_NUM},
{CMD_LINE_OPT_HASH_ENTRY_NUM, 1, 0, CMD_LINE_OPT_HASH_ENTRY_NUM_NUM},
{CMD_LINE_OPT_PARSE_PTYPE, 0, 0, CMD_LINE_OPT_PARSE_PTYPE_NUM},
+ {CMD_LINE_OPT_NB_RXD, 1, 0, CMD_LINE_OPT_NB_RXD_NUM},
+ {CMD_LINE_OPT_NB_TXD, 1, 0, CMD_LINE_OPT_NB_TXD_NUM},
+ {CMD_LINE_OPT_RX_FREE_THRESH, 1, 0, CMD_LINE_OPT_RX_FREE_THRESH_NUM},
+ {CMD_LINE_OPT_TX_FREE_THRESH, 1, 0, CMD_LINE_OPT_TX_FREE_THRESH_NUM},
+ {CMD_LINE_OPT_TX_RS_THRESH, 1, 0, CMD_LINE_OPT_TX_RS_THRESH_NUM},
{NULL, 0, 0, 0}
};
@@ -554,6 +668,11 @@ parse_args(int argc, char **argv)
const char *str12 =
"L3FWD: LPM and EM are mutually exclusive, select only one";
const char *str13 = "L3FWD: LPM or EM none selected, default LPM on";
+ const char *str14 = "L3FWD: Invalid Rx descriptors number";
+ const char *str15 = "L3FWD: Invalid Tx descriptors number";
+ const char *str16 = "L3FWD: Invalid Rx free threshold value";
+ const char *str17 = "L3FWD: Invalid Tx free threshold value";
+ const char *str18 = "L3FWD: Invalid Tx RS bit threshold value";
while ((opt = getopt_long(argc, argvopt, short_options,
lgopts, &option_index)) != EOF) {
@@ -652,6 +771,61 @@ parse_args(int argc, char **argv)
parse_ptype = 1;
break;
+ case CMD_LINE_OPT_NB_RXD_NUM:
+ ret = parse_nb_rxd(optarg);
+ if (ret > 0)
+ nb_rxd = ret;
+ else{
+ printf("%s\n", str14);
+ print_usage(prgname);
+ return -1;
+ }
+ break;
+
+ case CMD_LINE_OPT_NB_TXD_NUM:
+ ret = parse_nb_txd(optarg);
+ if (ret > 0)
+ nb_txd = ret;
+ else{
+ printf("%s\n", str15);
+ print_usage(prgname);
+ return -1;
+ }
+ break;
+
+ case CMD_LINE_OPT_RX_FREE_THRESH_NUM:
+ ret = parse_rx_free_thresh(optarg);
+ if (ret > 0)
+ rx_free_thresh = ret;
+ else{
+ printf("%s\n", str16);
+ print_usage(prgname);
+ return -1;
+ }
+ break;
+
+ case CMD_LINE_OPT_TX_FREE_THRESH_NUM:
+ ret = parse_tx_free_thresh(optarg);
+ if (ret > 0)
+ tx_free_thresh = ret;
+ else{
+ printf("%s\n", str17);
+ print_usage(prgname);
+ return -1;
+ }
+ break;
+
+ case CMD_LINE_OPT_TX_RS_THRESH_NUM:
+ ret = parse_tx_rs_thresh(optarg);
+ if (ret > 0)
+ tx_rs_thresh = ret;
+ else{
+ printf("%s\n", str18);
+ print_usage(prgname);
+ return -1;
+ }
+ break;
+
default:
print_usage(prgname);
return -1;
@@ -894,6 +1068,19 @@ main(int argc, char **argv)
/* initialize all ports */
for (portid = 0; portid < nb_ports; portid++) {
+ rte_eth_dev_info_get(portid, &dev_info);
+
+ if (rx_free_thresh != RTE_PMD_PARAM_UNSET)
+ dev_info.default_rxconf.rx_free_thresh = rx_free_thresh;
+
+ if (tx_free_thresh != RTE_PMD_PARAM_UNSET)
+ dev_info.default_txconf.tx_free_thresh = tx_free_thresh;
+
+ if (tx_rs_thresh != RTE_PMD_PARAM_UNSET)
+ dev_info.default_txconf.tx_rs_thresh = tx_rs_thresh;
+ }
+
+ for (portid = 0; portid < nb_ports; portid++) {
/* skip ports that are not enabled */
if ((enabled_port_mask & (1 << portid)) == 0) {
printf("\nSkipping disabled port %d\n", portid);