@@ -2564,7 +2564,6 @@ set_fwd_ports_list(unsigned int *portlist, unsigned int nb_pt)
unsigned int i;
portid_t port_id;
int record_now;
-
record_now = 0;
again:
for (i = 0; i < nb_pt; i++) {
@@ -2587,6 +2586,88 @@ set_fwd_ports_list(unsigned int *portlist, unsigned int nb_pt)
}
}
+static int
+parse_port_list(const char *list, int *values, int maxsize)
+{
+ unsigned int count = 0;
+ char *end = NULL;
+ int min, max;
+ int idx;
+
+ if (list == NULL || values == NULL || maxsize < 0)
+ return -1;
+
+ for (idx = 0; idx < maxsize; idx++)
+ values[idx] = -1;
+ /* Remove all blank characters ahead */
+ while (isblank(*list))
+ list++;
+
+ min = maxsize;
+
+ do {
+ while (isblank(*list))
+ list++;
+ if (*list == '\0')
+ return -1;
+ errno = 0;
+ idx = strtol(list, &end, 10);
+ if (errno || end == NULL)
+ return -1;
+ if (idx < 0 || idx >= maxsize)
+ return -1;
+ while (isblank(*end))
+ end++;
+ if (*end == '-') {
+ min = idx;
+ } else if ((*end == ',') || (*end == '\0')) {
+ max = idx;
+ if (min == maxsize)
+ min = idx;
+ for (idx = min; idx <= max; idx++) {
+ if (values[count] == -1) {
+ values[count] = idx;
+ count++;
+ }
+ }
+ min = maxsize;
+ } else
+ return -1;
+ list = end + 1;
+ } while (*end != '\0');
+
+ if (count == 0)
+ return -1;
+ return count;
+}
+
+void
+parse_fwd_portlist(const char *portlist)
+{
+ int portcount = 0;
+ int portindex[RTE_MAX_ETHPORTS];
+ unsigned int idx;
+
+ /*
+ * parse_port_list() will mark the portindex array
+ * with -1 if the port is not listed and with a positive value
+ * for the listed ports. So, the parser is designed in
+ * such a way that it will fill the portindex array with the
+ * valid ports from the user,and the function set_fwd_ports_list()
+ * will set those ports in the forwarding mode
+ */
+
+ if (parse_port_list(portlist, portindex, RTE_MAX_ETHPORTS) < 0)
+ rte_exit(EXIT_FAILURE, "Invalid fwd port list\n");
+
+ RTE_ETH_FOREACH_DEV(idx) {
+ if (portindex[idx] != -1)
+ portcount++;
+ }
+ printf("portcount = %d\n", portcount);
+ set_fwd_ports_list((unsigned int *)portindex, portcount);
+}
+
void
set_fwd_ports_mask(uint64_t portmask)
{
@@ -57,6 +57,7 @@ usage(char* progname)
"[--help|-h] | [--auto-start|-a] | ["
"--tx-first | --stats-period=PERIOD | "
"--coremask=COREMASK --portmask=PORTMASK --numa "
+ "--portlist=PORTLIST "
"--mbuf-size= | --total-num-mbufs= | "
"--nb-cores= | --nb-ports= | "
#ifdef RTE_LIBRTE_CMDLINE
@@ -92,6 +93,7 @@ usage(char* progname)
"packet forwarding.\n");
printf(" --portmask=PORTMASK: hexadecimal bitmask of ports used "
"by the packet forwarding test.\n");
+ printf(" --portlist=PORTLIST: list of forwarding ports\n");
printf(" --numa: enable NUMA-aware allocation of RX/TX rings and of "
"RX memory buffers (mbufs).\n");
printf(" --port-numa-config=(port,socket)[,(port,socket)]: "
@@ -587,6 +589,7 @@ launch_args_parse(int argc, char** argv)
{ "nb-ports", 1, 0, 0 },
{ "coremask", 1, 0, 0 },
{ "portmask", 1, 0, 0 },
+ { "portlist", 1, 0, 0 },
{ "numa", 0, 0, 0 },
{ "no-numa", 0, 0, 0 },
{ "mp-anon", 0, 0, 0 },
@@ -825,6 +828,8 @@ launch_args_parse(int argc, char** argv)
parse_fwd_coremask(optarg);
if (!strcmp(lgopts[opt_idx].name, "portmask"))
parse_fwd_portmask(optarg);
+ if (!strcmp(lgopts[opt_idx].name, "portlist"))
+ parse_fwd_portlist(optarg);
if (!strcmp(lgopts[opt_idx].name, "no-numa"))
numa_support = 0;
if (!strcmp(lgopts[opt_idx].name, "numa"))
@@ -614,6 +614,9 @@ lcore_num(void)
rte_panic("lcore_id of current thread not found in fwd_lcores_cpuids\n");
}
+void
+parse_fwd_portlist(const char *port);
+
static inline struct fwd_lcore *
current_fwd_lcore(void)
{
@@ -77,6 +77,10 @@ The command line options are:
Set the hexadecimal bitmask of the ports used by the packet forwarding test.
+* ``--portlist=0-X`` or ``--portlist=X,X`` or ``--portlist=0-X,X``
+
+ Set the forwarding ports based on the user input used by the packet forwarding test.
+
* ``--numa``
Enable NUMA-aware allocation of RX/TX rings and of RX memory buffers