> -----Original Message----- > From: Burakov, Anatoly <anatoly.bura...@intel.com> > Sent: Tuesday, February 11, 2020 4:52 PM > To: Govindharajan, Hariprasad <hariprasad.govindhara...@intel.com>; Lu, > Wenzhuo <wenzhuo...@intel.com>; Wu, Jingjing <jingjing...@intel.com>; > Iremonger, Bernard <bernard.iremon...@intel.com>; Mcnamara, John > <john.mcnam...@intel.com>; Kovacevic, Marko > <marko.kovace...@intel.com> > Cc: dev@dpdk.org; Yigit, Ferruh <ferruh.yi...@intel.com>; > step...@networkplumber.org; david.march...@redhat.com > Subject: Re: [dpdk-dev] [PATCH v8] app/testpmd: add portlist option > > On 11-Feb-20 3:52 PM, Hariprasad Govindharajan wrote: > > In current version, we are setting the ports using portmask. With > > portmask, we can use only upto 64 ports. This portlist option enables > > the user to use more than 64 ports. > > Now we can specify the ports in 2 different ways > > - Using portmask (-p [0x]nnn): mask must be in hex format > > - Using portlist in the following format > > --portlist <p1>[-p2][,p3[-p4],...] > > > > --portmask 0x2 is same as --portlist 1 > > --portmask 0x3 is same as --portlist 0-1 > > > > Signed-off-by: Hariprasad Govindharajan > > <hariprasad.govindhara...@intel.com> > > --- > > v8: > > changed the data types of the variables. > > optimised the code by checking for blank spaces only once. > > > > v7: > > moved the port validation outside the parser function. > > added meaningful comments describing the new functionality. > > renamed the variables with meaningful names > > > > v6: > > optimized the code to check for duplicates > > > > v5: > > added a check to validate the ports available before setting them. > > also added comments in the testpmd file for the new function > > > > v4: > > the parser is modified so that we don't ues 2 arrays to convert the > > listed port values > > > > v3: > > squashed the 2 patches and made it 1 patch with changes only in > > testpmd. Also working on optmizing the parser > > > > v2: > > moved the parser function to testpmd > > --- > > app/test-pmd/config.c | 108 > ++++++++++++++++++++++++++++++++++ > > app/test-pmd/parameters.c | 5 ++ > > app/test-pmd/testpmd.h | 3 + > > doc/guides/testpmd_app_ug/run_app.rst | 7 +++ > > 4 files changed, 123 insertions(+) > > > > diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index > > 9669cbd..86566d9 100644 > > --- a/app/test-pmd/config.c > > +++ b/app/test-pmd/config.c > > @@ -2587,6 +2587,114 @@ set_fwd_ports_list(unsigned int *portlist, > unsigned int nb_pt) > > } > > } > > > > +/** > > + * Parse the user input and obtain the list of forwarding ports > > + * > > + * @param[in] list > > + * String containing the user input. User can specify > > + * in these formats 1,3,5 or 1-3 or 1-2,5 or 3,5-6. > > + * For example, if the user wants to use all the available > > + * 4 ports in his system, then the input can be 0-3 or 0,1,2,3. > > + * If the user wants to use only the ports 1,2 then the input > > + * is 1,2. > > + * valid characters are '-' and ',' > > + * invalid chars like '.' or '#' will result in > > + * EAL: Error - exiting with code: 1 > > + * Cause: Invalid fwd port list > > + * @param[out] values > > + * This array will be filled with a list of port IDs > > + * based on the user input > > + * Note that duplicate entries are discarded and only the first > > + * count entries in this array are port IDs and all the rest > > + * will contain default values > > + * @param[in] maxsize > > + * This parameter denotes 2 things > > + * 1) Maximum size of the values array > > + * 2) Maximum value of each element in the values array > > I still suspect the first item should say "number", not size. The 2) takes > care of > how big each individual value is, and 1) presumably takes care of how many > of these values there can be. Therefore i think it should be "number" (as in > how many), not "size" (as in how big). >
[Govindharajan, Hariprasad] Changed > > + * @return > > + * -returns total count of parsed port IDs > > + */ > > +static unsigned int > > +parse_port_list(const char *list, unsigned int *values, unsigned int > > +maxsize) { > > + unsigned int count = 0; > > + char *end = NULL; > > + int min, max; > > + int value, i; > > + unsigned int marked[maxsize]; > > + > > + if (list == NULL || values == NULL) > > + return -1; > > + > > + for (i = 0; i < (int)maxsize; i++) > > + marked[i] = 0; > > Then memset(), but that's just nitpicking, so feel free to disregard :) [Govindharajan, Hariprasad] It is disregarded.. 😊 > > > + > > + min = INT_MAX; > > + > > + do { > > + /*Remove the blank spaces if any*/ > > + while (*list != '\0' && isblank(*list)) > > + list++; > > My apologies. I've just checked if isblank() returns 0 on '\0', and it does. > So, > the `*list != '\0'` check is not necessary here after all. [Govindharajan, Hariprasad] Removed the isblank check > > > + if (*list == '\0') > > + break; > > + errno = 0; > > + value = strtol(list, &end, 10); > > + if (errno || end == NULL) > > + return 0; > > + if (value < 0 || value >= (int)maxsize) > > + return 0; > > + while (isblank(*end)) > > + end++; > > + if (*end == '-') { > > + min = value; > > This would accept input such as "1-2-3" and parse it as "2-3". Maybe > > if (*end == '-' && min == INT_MAX) > > ? This would then fall through to the failure path if end was '-' and min was > already set. > [Govindharajan, Hariprasad] corrected. > > -- > Thanks, > Anatoly