DPDK patches and discussions
 help / color / mirror / Atom feed
From: Olivier Matz <olivier.matz@6wind.com>
To: "Lu, Wenzhuo" <wenzhuo.lu@intel.com>
Cc: "'dev@dpdk.org'" <dev@dpdk.org>
Subject: Re: [dpdk-dev] CLI parsing issue
Date: Mon, 24 Apr 2017 12:11:45 +0200	[thread overview]
Message-ID: <20170424121145.243614b1@platinum> (raw)
In-Reply-To: <6A0DE07E22DDAD4C9103DF62FEBC09093B59BE9C@shsmsx102.ccr.corp.intel.com>

Hi Wenzhuo,

On Mon, 24 Apr 2017 01:49:38 +0000, "Lu, Wenzhuo" <wenzhuo.lu@intel.com> wrote:
> Hi Olivier,
> 
> 
> > -----Original Message-----
> > From: Lu, Wenzhuo
> > Sent: Friday, April 21, 2017 9:18 AM
> > To: Olivier MATZ
> > Cc: dev@dpdk.org
> > Subject: RE: CLI parsing issue
> > 
> > Hi Olivier,
> >   
> > > -----Original Message-----
> > > From: Olivier MATZ [mailto:olivier.matz@6wind.com]
> > > Sent: Thursday, April 20, 2017 4:55 PM
> > > To: Lu, Wenzhuo
> > > Cc: dev@dpdk.org
> > > Subject: Re: CLI parsing issue
> > >
> > > Hi Wenzhuo,
> > >
> > > On Thu, 20 Apr 2017 08:36:38 +0000, "Lu, Wenzhuo"
> > > <wenzhuo.lu@intel.com>
> > > wrote:  
> > > > Hi Olivier,
> > > > I met a problem thar the parsing result of CLI is wrong.
> > > > I checked this function, cmdline_parse. It will check the CLI
> > > > instances one by one. Even if an instance is matched, the parsing
> > > > will not stop for ambiguous check. Seems the following check may
> > > > change the parsing result of the previous one,
> > > > /* fully parsed */
> > > >                               tok = match_inst(inst, buf, 0,
> > > > result.buf, sizeof(result.buf),
> > > >
> > > > &dyn_tokens);
> > > >
> > > >
> > > > Is it better to use a temporary validate for match_inst and only
> > > > store the result when it matches, so the previous result has no
> > > > chance to be changed? Like bellow,
> > > >
> > > >
> > > > diff --git a/lib/librte_cmdline/cmdline_parse.c
> > > > b/lib/librte_cmdline/cmdline_parse.c
> > > > index 763c286..663efd1 100644
> > > > --- a/lib/librte_cmdline/cmdline_parse.c
> > > > +++ b/lib/librte_cmdline/cmdline_parse.c
> > > > @@ -259,6 +259,7 @@
> > > >                 char buf[CMDLINE_PARSE_RESULT_BUFSIZE];
> > > >                 long double align; /* strong alignment constraint for buf */
> > > >         } result;
> > > > +       char tmp_buf[CMDLINE_PARSE_RESULT_BUFSIZE];
> > > >         cmdline_parse_token_hdr_t  
> > > *dyn_tokens[CMDLINE_PARSE_DYNAMIC_TOKENS];  
> > > >         void (*f)(void *, struct cmdline *, void *) = NULL;
> > > >         void *data = NULL;
> > > > @@ -321,7 +322,7 @@
> > > >                 debug_printf("INST %d\n", inst_num);
> > > >
> > > >                 /* fully parsed */
> > > > -               tok = match_inst(inst, buf, 0, result.buf, sizeof(result.buf),
> > > > +               tok = match_inst(inst, buf, 0, tmp_buf,
> > > > + sizeof(tmp_buf),
> > > >                                  &dyn_tokens);
> > > >
> > > >                 if (tok > 0) /* we matched at least one token */ @@
> > > > -329,6 +330,8 @@
> > > >
> > > >                 else if (!tok) {
> > > >                         debug_printf("INST fully parsed\n");
> > > > +                       memcpy(result.buf, tmp_buf,
> > > > +                              CMDLINE_PARSE_RESULT_BUFSIZE);
> > > >                         /* skip spaces */
> > > >                         while (isblank2(*curbuf)) {
> > > >                                 curbuf++;
> > > >
> > > >  
> > >
> > > At first glance, I think your patch doesn't hurt. Do you have an
> > > example code that triggers the issue?  
> > Sorry, I didn't show you the issue we met.
> > It's easy to reproduce on 17.05 RC1.  
> > "testpmd> set tx loopback 0 on  
> > Invalid port 116"
> > Whatever the input port id is, it's taken as 116 after parsing the CLI.
> > 
> > Interesting,  this issue is triggered by this patch, after I added a new CLI, the
> > "set tx loopback ..." is not working.
> > 
> > commit 22e6545fd02cab42332acd716b8921dd0aab3ad9
> > Author: Wenzhuo Lu <wenzhuo.lu@intel.com>
> > Date:   Fri Feb 24 11:24:35 2017 +0800
> > 
> >     app/testpmd: set TC strict link priority mode
> > 
> > I checked the implement of CLI parsing.
> > The implementation is going through all the instances in main_ctx to see
> > which instance can match the string we typed.
> > If typing "set tx loopback 0 on", it matches cmd_set_tx_loopback, and the
> > parsing result is,
> > $2 = {set = "set\000tx loopback 0 off \n", '\000' <repeats 104 times>, tx =
> > "tx\000loopback 0 off \n", '\000' <repeats 108 times>,
> >   loopback = "loopback\000\060 off \n",	'\000' <repeats	111 times>,
> > port_id = 0 '\000',
> >   on_off = "off\000\n", '\000' <repeats 122 times>}
> > 
> > Till now, everything is fine.
> > Then the parsing is not stopped, it's going on to check if the string can match
> > any of the left instances. When checking cmd_strict_link_prio, although it
> > doesn't match, the parsing result is changed to,
> > $1 = {set = "set\000tx loopback 0 off \n", '\000' <repeats 104 times>, tx =
> > "tx\000loopback 0 off \n", '\000' <repeats 108 times>,
> >   loopback = "loopback\000\060 off \n",	'\000' <repeats	111 times>,
> > port_id = 116 't',
> >   on_off = "x\000loopback 0 off \n", '\000' <repeats 109 times>}
> > 
> > You see, now the port id and on_off both are wrong. Port_id points to char
> > 't' of "tx loopback ...". So it's always 116, the ASCII of 't'.  
> Any news? Shall I send a patch? 

I checked in detail, and you're right there is a bug here. Your proposed
patch looks good, you can send it. Thank you for reporting it!

You can add in the log:
Fixes: af75078fece3 ("first public release")
CC: stable@dpdk.org


Regards,
Olivier

  reply	other threads:[~2017-04-24 10:11 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-20  8:36 Lu, Wenzhuo
2017-04-20  8:54 ` Olivier MATZ
2017-04-21  1:17   ` Lu, Wenzhuo
2017-04-24  1:49     ` Lu, Wenzhuo
2017-04-24 10:11       ` Olivier Matz [this message]
2017-04-25  1:16         ` Lu, Wenzhuo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170424121145.243614b1@platinum \
    --to=olivier.matz@6wind.com \
    --cc=dev@dpdk.org \
    --cc=wenzhuo.lu@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).