@@ -4,11 +4,11 @@
#include <stdint.h>
#include <stdlib.h>
-#include <getopt.h>
#include <signal.h>
#include <stdbool.h>
#include <unistd.h>
+#include <rte_argparse.h>
#include <rte_malloc.h>
#include <rte_ethdev.h>
#include <rte_dmadev.h>
@@ -18,16 +18,18 @@
#define MAX_PKT_BURST 32
#define MEMPOOL_CACHE_SIZE 512
#define MIN_POOL_SIZE 65536U
-#define CMD_LINE_OPT_MAC_UPDATING "mac-updating"
-#define CMD_LINE_OPT_NO_MAC_UPDATING "no-mac-updating"
-#define CMD_LINE_OPT_PORTMASK "portmask"
-#define CMD_LINE_OPT_NB_QUEUE "nb-queue"
-#define CMD_LINE_OPT_COPY_TYPE "copy-type"
-#define CMD_LINE_OPT_RING_SIZE "ring-size"
-#define CMD_LINE_OPT_BATCH_SIZE "dma-batch-size"
-#define CMD_LINE_OPT_FRAME_SIZE "max-frame-size"
-#define CMD_LINE_OPT_FORCE_COPY_SIZE "force-min-copy-size"
-#define CMD_LINE_OPT_STATS_INTERVAL "stats-interval"
+#define CMD_LINE_OPT_MAC_UPDATING "--mac-updating"
+#define CMD_LINE_OPT_NO_MAC_UPDATING "--no-mac-updating"
+#define CMD_LINE_OPT_PORTMASK "--portmask"
+#define CMD_LINE_OPT_PORTMASK_INDEX 1
+#define CMD_LINE_OPT_NB_QUEUE "--nb-queue"
+#define CMD_LINE_OPT_COPY_TYPE "--copy-type"
+#define CMD_LINE_OPT_COPY_TYPE_INDEX 2
+#define CMD_LINE_OPT_RING_SIZE "--ring-size"
+#define CMD_LINE_OPT_BATCH_SIZE "--dma-batch-size"
+#define CMD_LINE_OPT_FRAME_SIZE "--max-frame-size"
+#define CMD_LINE_OPT_FORCE_COPY_SIZE "--force-min-copy-size"
+#define CMD_LINE_OPT_STATS_INTERVAL "--stats-interval"
/* configurable number of RX/TX ring descriptors */
#define RX_DEFAULT_RINGSIZE 1024
@@ -84,7 +86,7 @@ typedef enum copy_mode_t {
static uint32_t dma_enabled_port_mask;
/* number of RX queues per port */
-static uint16_t nb_queues = 1;
+static int nb_queues = 1;
/* MAC updating enabled by default. */
static int mac_updating = 1;
@@ -95,10 +97,10 @@ static copy_mode_t copy_mode = COPY_MODE_DMA_NUM;
/* size of descriptor ring for hardware copy mode or
* rte_ring for software copy mode
*/
-static unsigned short ring_size = 2048;
+static int ring_size = 2048;
/* interval, in seconds, between stats prints */
-static unsigned short stats_interval = 1;
+static int stats_interval = 1;
/* global mbuf arrays for tracking DMA bufs */
#define MBUF_RING_SIZE 2048
#define MBUF_RING_MASK (MBUF_RING_SIZE - 1)
@@ -118,9 +120,9 @@ static uint16_t nb_txd = TX_DEFAULT_RINGSIZE;
static volatile bool force_quit;
-static uint32_t dma_batch_sz = MAX_PKT_BURST;
-static uint32_t max_frame_size;
-static uint32_t force_min_copy_size;
+static int dma_batch_sz = MAX_PKT_BURST;
+static int max_frame_size;
+static int force_min_copy_size;
/* ethernet addresses of ports */
static struct rte_ether_addr dma_ports_eth_addr[RTE_MAX_ETHPORTS];
@@ -583,26 +585,6 @@ static void start_forwarding_cores(void)
}
/* >8 End of starting to process for each lcore. */
-/* Display usage */
-static void
-dma_usage(const char *prgname)
-{
- printf("%s [EAL options] -- -p PORTMASK [-q NQ]\n"
- " -b --dma-batch-size: number of requests per DMA batch\n"
- " -f --max-frame-size: max frame size\n"
- " -m --force-min-copy-size: force a minimum copy length, even for smaller packets\n"
- " -p --portmask: hexadecimal bitmask of ports to configure\n"
- " -q NQ: number of RX queues per port (default is 1)\n"
- " --[no-]mac-updating: Enable or disable MAC addresses updating (enabled by default)\n"
- " When enabled:\n"
- " - The source MAC address is replaced by the TX port MAC address\n"
- " - The destination MAC address is replaced by 02:00:00:00:00:TX_PORT_ID\n"
- " -c --copy-type CT: type of copy: sw|hw\n"
- " -s --ring-size RS: size of dmadev descriptor ring for hardware copy mode or rte_ring for software copy mode\n"
- " -i --stats-interval SI: interval, in seconds, between stats prints (default is 1)\n",
- prgname);
-}
-
static int
dma_parse_portmask(const char *portmask)
{
@@ -628,142 +610,132 @@ dma_parse_copy_mode(const char *copy_mode)
return COPY_MODE_INVALID_NUM;
}
+static int
+dma_parse_args_cb(uint32_t index, const char *value, void *opaque)
+{
+ int port_mask;
+
+ RTE_SET_USED(opaque);
+
+ if (index == CMD_LINE_OPT_PORTMASK_INDEX) {
+ port_mask = dma_parse_portmask(value);
+ if (port_mask & ~dma_enabled_port_mask || port_mask <= 0) {
+ printf("Invalid portmask, %s, suggest 0x%x\n",
+ value, dma_enabled_port_mask);
+ return -1;
+ }
+ dma_enabled_port_mask = port_mask;
+ } else if (index == CMD_LINE_OPT_COPY_TYPE_INDEX) {
+ copy_mode = dma_parse_copy_mode(value);
+ if (copy_mode == COPY_MODE_INVALID_NUM) {
+ printf("Invalid copy type. Use: sw, hw\n");
+ return -1;
+ }
+ } else {
+ printf("Invalid index %u\n", index);
+ return -1;
+ }
+
+ return 0;
+}
+
/* Parse the argument given in the command line of the application */
static int
dma_parse_args(int argc, char **argv, unsigned int nb_ports)
{
- static const char short_options[] =
- "b:" /* dma batch size */
- "c:" /* copy type (sw|hw) */
- "f:" /* max frame size */
- "m:" /* force min copy size */
- "p:" /* portmask */
- "q:" /* number of RX queues per port */
- "s:" /* ring size */
- "i:" /* interval, in seconds, between stats prints */
- ;
-
- static const struct option lgopts[] = {
- {CMD_LINE_OPT_MAC_UPDATING, no_argument, &mac_updating, 1},
- {CMD_LINE_OPT_NO_MAC_UPDATING, no_argument, &mac_updating, 0},
- {CMD_LINE_OPT_PORTMASK, required_argument, NULL, 'p'},
- {CMD_LINE_OPT_NB_QUEUE, required_argument, NULL, 'q'},
- {CMD_LINE_OPT_COPY_TYPE, required_argument, NULL, 'c'},
- {CMD_LINE_OPT_RING_SIZE, required_argument, NULL, 's'},
- {CMD_LINE_OPT_BATCH_SIZE, required_argument, NULL, 'b'},
- {CMD_LINE_OPT_FRAME_SIZE, required_argument, NULL, 'f'},
- {CMD_LINE_OPT_FORCE_COPY_SIZE, required_argument, NULL, 'm'},
- {CMD_LINE_OPT_STATS_INTERVAL, required_argument, NULL, 'i'},
- {NULL, 0, 0, 0}
+ static struct rte_argparse obj = {
+ .prog_name = "dma",
+ .usage = "[EAL options] -- [optional parameters]",
+ .descriptor = NULL,
+ .epilog = NULL,
+ .exit_on_error = false,
+ .callback = dma_parse_args_cb,
+ .opaque = NULL,
+ .args = {
+ { CMD_LINE_OPT_MAC_UPDATING, NULL, "Enable MAC addresses updating",
+ &mac_updating, (void *)1,
+ RTE_ARGPARSE_ARG_NO_VALUE | RTE_ARGPARSE_ARG_VALUE_INT,
+ },
+ { CMD_LINE_OPT_NO_MAC_UPDATING, NULL, "Disable MAC addresses updating",
+ &mac_updating, (void *)0,
+ RTE_ARGPARSE_ARG_NO_VALUE | RTE_ARGPARSE_ARG_VALUE_INT,
+ },
+ { CMD_LINE_OPT_PORTMASK, "-p", "hexadecimal bitmask of ports to configure",
+ NULL, (void *)CMD_LINE_OPT_PORTMASK_INDEX,
+ RTE_ARGPARSE_ARG_REQUIRED_VALUE,
+ },
+ { CMD_LINE_OPT_NB_QUEUE, "-q", "number of RX queues per port (default is 1)",
+ &nb_queues, NULL,
+ RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT,
+ },
+ { CMD_LINE_OPT_COPY_TYPE, "-c", "type of copy: sw|hw",
+ NULL, (void *)CMD_LINE_OPT_COPY_TYPE_INDEX,
+ RTE_ARGPARSE_ARG_REQUIRED_VALUE,
+ },
+ { CMD_LINE_OPT_RING_SIZE, "-s", "size of dmadev descriptor ring for hardware copy mode or rte_ring for software copy mode",
+ &ring_size, NULL,
+ RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT,
+ },
+ { CMD_LINE_OPT_BATCH_SIZE, "-b", "number of requests per DMA batch",
+ &dma_batch_sz, NULL,
+ RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT,
+ },
+ { CMD_LINE_OPT_FRAME_SIZE, "-f", "max frame size",
+ &max_frame_size, NULL,
+ RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT,
+ },
+ { CMD_LINE_OPT_FORCE_COPY_SIZE, "-m", "force a minimum copy length, even for smaller packets",
+ &force_min_copy_size, NULL,
+ RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT,
+ },
+ { CMD_LINE_OPT_STATS_INTERVAL, "-i", "interval, in seconds, between stats prints (default is 1)",
+ &stats_interval, NULL,
+ RTE_ARGPARSE_ARG_REQUIRED_VALUE | RTE_ARGPARSE_ARG_VALUE_INT,
+ },
+ },
};
const unsigned int default_port_mask = (1 << nb_ports) - 1;
- int opt, ret;
- char **argvopt;
- int option_index;
- char *prgname = argv[0];
+ int ret;
dma_enabled_port_mask = default_port_mask;
- argvopt = argv;
-
- while ((opt = getopt_long(argc, argvopt, short_options,
- lgopts, &option_index)) != EOF) {
-
- switch (opt) {
- case 'b':
- dma_batch_sz = atoi(optarg);
- if (dma_batch_sz > MAX_PKT_BURST) {
- printf("Invalid dma batch size, %s.\n", optarg);
- dma_usage(prgname);
- return -1;
- }
- break;
- case 'f':
- max_frame_size = atoi(optarg);
- if (max_frame_size > RTE_ETHER_MAX_JUMBO_FRAME_LEN) {
- printf("Invalid max frame size, %s.\n", optarg);
- dma_usage(prgname);
- return -1;
- }
- break;
-
- case 'm':
- force_min_copy_size = atoi(optarg);
- break;
-
- /* portmask */
- case 'p':
- dma_enabled_port_mask = dma_parse_portmask(optarg);
- if (dma_enabled_port_mask & ~default_port_mask ||
- dma_enabled_port_mask <= 0) {
- printf("Invalid portmask, %s, suggest 0x%x\n",
- optarg, default_port_mask);
- dma_usage(prgname);
- return -1;
- }
- break;
-
- case 'q':
- nb_queues = atoi(optarg);
- if (nb_queues == 0 || nb_queues > MAX_RX_QUEUES_COUNT) {
- printf("Invalid RX queues number %s. Max %u\n",
- optarg, MAX_RX_QUEUES_COUNT);
- dma_usage(prgname);
- return -1;
- }
- break;
-
- case 'c':
- copy_mode = dma_parse_copy_mode(optarg);
- if (copy_mode == COPY_MODE_INVALID_NUM) {
- printf("Invalid copy type. Use: sw, hw\n");
- dma_usage(prgname);
- return -1;
- }
- break;
+ ret = rte_argparse_parse(&obj, argc, argv);
+ if (ret != 0)
+ return ret;
- case 's':
- ring_size = atoi(optarg);
- if (ring_size == 0) {
- printf("Invalid ring size, %s.\n", optarg);
- dma_usage(prgname);
- return -1;
- }
- /* ring_size must be less-than or equal to MBUF_RING_SIZE
- * to avoid overwriting bufs
- */
- if (ring_size > MBUF_RING_SIZE) {
- printf("Max ring_size is %d, setting ring_size to max",
- MBUF_RING_SIZE);
- ring_size = MBUF_RING_SIZE;
- }
- break;
+ /* check argument's value which parsing by autosave. */
+ if (dma_batch_sz <= 0 || dma_batch_sz > MAX_PKT_BURST) {
+ printf("Invalid dma batch size, %d.\n", dma_batch_sz);
+ return -1;
+ }
- case 'i':
- stats_interval = atoi(optarg);
- if (stats_interval == 0) {
- printf("Invalid stats interval, setting to 1\n");
- stats_interval = 1; /* set to default */
- }
- break;
+ if (max_frame_size <= 0 || max_frame_size > RTE_ETHER_MAX_JUMBO_FRAME_LEN) {
+ printf("Invalid max frame size, %d.\n", max_frame_size);
+ return -1;
+ }
- /* long options */
- case 0:
- break;
+ if (nb_queues <= 0 || nb_queues > MAX_RX_QUEUES_COUNT) {
+ printf("Invalid RX queues number %d. Max %u\n",
+ nb_queues, MAX_RX_QUEUES_COUNT);
+ return -1;
+ }
- default:
- dma_usage(prgname);
- return -1;
- }
+ if (ring_size <= 0) {
+ printf("Invalid ring size, %d.\n", ring_size);
+ return -1;
+ }
+ if (ring_size > MBUF_RING_SIZE) {
+ printf("Max ring_size is %d, setting ring_size to max",
+ MBUF_RING_SIZE);
+ ring_size = MBUF_RING_SIZE;
}
- printf("MAC updating %s\n", mac_updating ? "enabled" : "disabled");
- if (optind >= 0)
- argv[optind - 1] = prgname;
+ if (stats_interval <= 0) {
+ printf("Invalid stats interval, setting to 1\n");
+ stats_interval = 1; /* set to default */
+ }
- ret = optind - 1;
- optind = 1; /* reset getopt lib */
- return ret;
+ return 0;
}
/* check link status, return true if at least one port is up */
@@ -1089,7 +1061,7 @@ main(int argc, char **argv)
rte_exit(EXIT_FAILURE, "Cannot init mbuf pool\n");
/* >8 End of allocates mempool to hold the mbufs. */
- if (force_min_copy_size >
+ if ((uint32_t)force_min_copy_size >
(uint32_t)(rte_pktmbuf_data_room_size(dma_pktmbuf_pool) -
RTE_PKTMBUF_HEADROOM))
rte_exit(EXIT_FAILURE,
@@ -8,7 +8,7 @@
allow_experimental_apis = true
-deps += ['dmadev']
+deps += ['argparse', 'dmadev']
sources = files(
'dmafwd.c',