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?

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