+static int
+l2fwd_parse_port_pair_config(const char *q_arg)
+{
+ enum fieldnames {
+ FLD_PORT1 = 0,
+ FLD_PORT2,
+ _NUM_FLD
+ };
+ unsigned long int_fld[_NUM_FLD];
+ const char *p, *p0 = q_arg;
+ char *str_fld[_NUM_FLD];
+ unsigned int size;
+ char s[256];
+ char *end;
+ int i;
+
+ nb_port_pair_params = 0;
+
+ while ((p = strchr(p0, '(')) != NULL) {
+ ++p;
+ p0 = strchr(p, ')');
+ if (p0 == NULL)
+ return -1;
+
+ size = p0 - p;
+ if (size >= sizeof(s))
+ return -1;
+
+ memcpy(s, p, size);
+ s[size] = '\0';
+ if (rte_strsplit(s, sizeof(s), str_fld,
+ _NUM_FLD, ',') != _NUM_FLD)
+ return -1;
+ for (i = 0; i < _NUM_FLD; i++) {
+ errno = 0;
+ int_fld[i] = strtoul(str_fld[i], &end, 0);
+ if (errno != 0 || end == str_fld[i] ||
+ int_fld[i] >= RTE_MAX_ETHPORTS)
+ return -1;
+ }
+ if (nb_port_pair_params >= RTE_MAX_ETHPORTS/2) {
+ printf("exceeded max number of port pair params: %hu\n",
+ nb_port_pair_params);
+ return -1;
+ }
+ port_pair_params_array[nb_port_pair_params].port[0] =
+ (uint16_t)int_fld[FLD_PORT1];
+ port_pair_params_array[nb_port_pair_params].port[1] =
+ (uint16_t)int_fld[FLD_PORT2];
+ ++nb_port_pair_params;
+ }
+ port_pair_params = port_pair_params_array;
+ return 0;
+}
+