On Wed, Aug 01, 2018 at 06:50:14PM +0200, Máté Eckl wrote:
[...]
> > > > >
> > > > > 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 tried another way of doing this. I think it will be good if you don't mind
adding a new attribute to the parser's union. I have attached the diff for the
parser, I'd like to test it a bit more before sending a new version of the
patch.
I also changed the chain and flowtable priority attributes to prio_spec and this
way it is quite simple in the parser and in evaluate.c.
diff --git a/src/parser_bison.y b/src/parser_bison.y
index 98bfeba..73af3bc 100644
--- a/src/parser_bison.y
+++ b/src/parser_bison.y
@@ -153,6 +153,7 @@ int nft_lex(void *, void *, void *);
const struct datatype *datatype;
struct handle_spec handle_spec;
struct position_spec position_spec;
+ struct prio_spec prio_spec;
const struct exthdr_desc *exthdr_desc;
}
@@ -182,6 +183,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 +525,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 <prio_spec> extended_prio_spec
%type <string> dev_spec quota_unit
%destructor { xfree($$); } dev_spec quota_unit
@@ -1633,7 +1637,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 extended_prio_spec stmt_separator
{
$$->hookstr = chain_hookname_lookup($3);
if ($$->hookstr == NULL) {
@@ -1766,7 +1770,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 extended_prio_spec
{
const char *chain_type =
chain_type_name_lookup($2);
@@ -1788,9 +1792,37 @@ 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;
+ $<chain>0->dev = $5;
+ $<chain>0->priority = $7;
+ $<chain>0->flags |= CHAIN_F_BASECHAIN;
+ }
+ ;
+
+extended_prio_spec : prio_spec
+ {
+ struct prio_spec spec = {0};
+ spec.num = $1;
+ $$ = spec;
+ }
+ | STRING
+ {
+ struct prio_spec spec = {0};
+ spec.str = xstrdup($1);
+ $$ = spec;
+ }
+ | STRING PLUS NUM
+ {
+ struct prio_spec spec = {0};
+ spec.num = $3;
+ spec.str = xstrdup($1);
+ $$ = spec;
+ }
+ | STRING DASH NUM
+ {
+ struct prio_spec spec = {0};
+ spec.num = -$3;
+ spec.str = xstrdup($1);
+ $$ = spec;
}
;