On Mon, Jul 16, 2018 at 09:58:44AM +0200, Máté Eckl wrote:
> On Tue, Jul 10, 2018 at 12:10:22PM +0200, Pablo Neira Ayuso wrote:
> > > diff --git a/src/parser_bison.y b/src/parser_bison.y
> > > index 98bfeba..2b7d7cc 100644
> > > --- a/src/parser_bison.y
> > > +++ b/src/parser_bison.y
> > > @@ -182,6 +182,8 @@ int nft_lex(void *, void *, void *);
> > >  %token AT                        "@"
> > >  %token VMAP                      "vmap"
> > >  
> > > +%token PLUS                      "+"
> > > +
> > >  %token INCLUDE                   "include"
> > >  %token DEFINE                    "define"
> > >  %token REDEFINE                  "redefine"
> > > @@ -522,6 +524,7 @@ int nft_lex(void *, void *, void *);
> > >  %type <handle>                   set_spec setid_spec set_identifier 
> > > flowtable_identifier obj_spec objid_spec obj_identifier
> > >  %destructor { handle_free(&$$); } set_spec setid_spec set_identifier 
> > > obj_spec objid_spec obj_identifier
> > >  %type <val>                      family_spec family_spec_explicit 
> > > chain_policy prio_spec
> > > +%type <string>           str_prio_spec
> > >  
> > >  %type <string>                   dev_spec quota_unit
> > >  %destructor { xfree($$); }       dev_spec quota_unit
> > > @@ -1633,7 +1636,7 @@ flowtable_block_alloc       :       /* empty */
> > >  flowtable_block          :       /* empty */     { $$ = $<flowtable>-1; }
> > >                   |       flowtable_block common_block
> > >                   |       flowtable_block stmt_separator
> > > -                 |       flowtable_block HOOK            STRING  
> > > PRIORITY        prio_spec       stmt_separator
> > > +                 |       flowtable_block HOOK            STRING  
> > > PRIORITY    str_prio_spec       stmt_separator
> > >                   {
> > >                           $$->hookstr     = chain_hookname_lookup($3);
> > >                           if ($$->hookstr == NULL) {
> > > @@ -1644,7 +1647,7 @@ flowtable_block             :       /* empty */     
> > > { $$ = $<flowtable>-1; }
> > >                           }
> > >                           xfree($3);
> > >  
> > > -                         $$->priority = $5;
> > > +                         $$->priostr = $5;
> > >                   }
> > >                   |       flowtable_block DEVICES         '='     
> > > flowtable_expr  stmt_separator
> > >                   {
> > > @@ -1766,7 +1769,7 @@ type_identifier             :       STRING  { $$ = 
> > > $1; }
> > >                   |       CLASSID { $$ = xstrdup("classid"); }
> > >                   ;
> > >  
> > > -hook_spec                :       TYPE            STRING          HOOK    
> > >         STRING          dev_spec        PRIORITY        prio_spec
> > > +hook_spec                :       TYPE            STRING          HOOK    
> > >         STRING          dev_spec        PRIORITY        str_prio_spec
> > >                   {
> > >                           const char *chain_type = 
> > > chain_type_name_lookup($2);
> > >  
> > > @@ -1789,13 +1792,34 @@ hook_spec         :       TYPE            STRING  
> > >         HOOK            STRING          dev_spec        PRIORITY        
> > > prio_spec
> > >                           xfree($4);
> > >  
> > >                           $<chain>0->dev          = $5;
> > > -                         $<chain>0->priority     = $7;
> > > +                         $<chain>0->priostr      = $7;
> > >                           $<chain>0->flags        |= CHAIN_F_BASECHAIN;
> > >                   }
> > >                   ;
> > >  
> > > -prio_spec                :       NUM                     { $$ = $1; }
> > > -                 |       DASH    NUM             { $$ = -$2; }
> > > +str_prio_spec    :       prio_spec
> > > +                 {
> > > +                         char buf[STD_PRIO_BUFSIZE];
> > > +                         snprintf(buf, STD_PRIO_BUFSIZE, "%d", (int)$1);
> > > +                         $$ = xstrdup(buf);
> > > +                 }
> > > +                 |       STRING  { $$ = xstrdup($1); }
> > > +                 |       STRING PLUS NUM
> > > +                 {
> > > +                         char buf[STD_PRIO_BUFSIZE];
> > > +                         snprintf(buf, STD_PRIO_BUFSIZE, "%s+%d",$1, 
> > > (int)$3);
> > 
> > Could you store the string plus offset instead of building this
> > string that you need to parse again from the evaluation phase?
> > 
> > Probably you could reuse the existing priority integer field, then, if
> > the label is non-NULL, then it means the priority integer becomes an
> > offset.
> 
> I thought about different possibilities to do this, and I think the diff below
> does this with the less possible code duplication (it's only the parser, the
> other components would not be duplicated). And for now it does not even work 
> for
> some obscure reason. (The chain pointer is not tha same at the evaluation 
> phase
> as in the parser, so the values are in the bad place...)
> Of course the evaluation is simpler.
> 
> I personally prefer my former solution as it is more general and results in 
> less
> code duplication so I would stay with that.
> What do you think?

Do you want me to go on with this Pablo? I can make this work, but I don't think
this is better than what I've already done.

> diff --git a/src/parser_bison.y b/src/parser_bison.y
> index 98bfeba..db55cc5 100644
> --- a/src/parser_bison.y
> +++ b/src/parser_bison.y
> @@ -182,6 +182,8 @@ int nft_lex(void *, void *, void *);
>  %token AT                    "@"
>  %token VMAP                  "vmap"
>  
> +%token PLUS                  "+"
> +
>  %token INCLUDE                       "include"
>  %token DEFINE                        "define"
>  %token REDEFINE                      "redefine"
> @@ -1633,7 +1635,7 @@ flowtable_block_alloc   :       /* empty */
>  flowtable_block              :       /* empty */     { $$ = $<flowtable>-1; }
>                       |       flowtable_block common_block
>                       |       flowtable_block stmt_separator
> -                     |       flowtable_block HOOK            STRING  
> PRIORITY        prio_spec       stmt_separator
> +                     |       flowtable_block HOOK            STRING  
> PRIORITY    flowtable_prio_spec stmt_separator
>                       {
>                               $$->hookstr     = chain_hookname_lookup($3);
>                               if ($$->hookstr == NULL) {
> @@ -1643,8 +1645,6 @@ flowtable_block         :       /* empty */     { $$ = 
> $<flowtable>-1; }
>                                       YYERROR;
>                               }
>                               xfree($3);
> -
> -                             $$->priority = $5;
>                       }
>                       |       flowtable_block DEVICES         '='     
> flowtable_expr  stmt_separator
>                       {
> @@ -1652,6 +1652,23 @@ flowtable_block                :       /* empty */     
> { $$ = $<flowtable>-1; }
>                       }
>                       ;
>  
> +flowtable_prio_spec: prio_spec
> +                     {
> +                             $<flowtable>0->priority = $1;
> +                     }
> +                     |       STRING  { $<flowtable>0->priostr = xstrdup($1); 
> }
> +                     |       STRING PLUS NUM
> +                     {
> +                             $<flowtable>0->priostr = xstrdup($1);
> +                             $<flowtable>0->priority = $3;
> +                     }
> +                     |       STRING DASH NUM
> +                     {
> +                             $<flowtable>0->priostr = xstrdup($1);
> +                             $<flowtable>0->priority = -$3;
> +                     }
> +                     ;
> +
>  flowtable_expr               :       '{'     flowtable_list_expr     '}'
>                       {
>                               $2->location = @$;
> @@ -1766,7 +1783,7 @@ type_identifier         :       STRING  { $$ = $1; }
>                       |       CLASSID { $$ = xstrdup("classid"); }
>                       ;
>  
> -hook_spec            :       TYPE            STRING          HOOK            
> STRING          dev_spec        PRIORITY        prio_spec
> +hook_spec            :       TYPE            STRING          HOOK            
> STRING          dev_spec        PRIORITY        hook_prio_spec
>                       {
>                               const char *chain_type = 
> chain_type_name_lookup($2);
>  
> @@ -1789,11 +1806,27 @@ hook_spec             :       TYPE            STRING  
>         HOOK            STRING          dev_spec        PRIORITY        
> prio_spec
>                               xfree($4);
>  
>                               $<chain>0->dev          = $5;
> -                             $<chain>0->priority     = $7;
>                               $<chain>0->flags        |= CHAIN_F_BASECHAIN;
>                       }
>                       ;
>  
> +hook_prio_spec       :       prio_spec
> +                     {
> +                             $<chain>0->priority = $1;
> +                     }
> +                     |       STRING  { $<chain>0->priostr = xstrdup($1); }
> +                     |       STRING PLUS NUM
> +                     {
> +                             $<chain>0->priostr = xstrdup($1);
> +                             $<chain>0->priority = $3;
> +                     }
> +                     |       STRING DASH NUM
> +                     {
> +                             $<chain>0->priostr = xstrdup($1);
> +                             $<chain>0->priority = -$3;
> +                     }
> +                     ;
> +
>  prio_spec            :       NUM                     { $$ = $1; }
>                       |       DASH    NUM             { $$ = -$2; }
>                       ;
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to