]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
parser: add typeof keyword for declarations
authorPablo Neira Ayuso <pablo@netfilter.org>
Tue, 30 Jul 2019 14:16:16 +0000 (16:16 +0200)
committerFlorian Westphal <fw@strlen.de>
Tue, 17 Dec 2019 22:10:01 +0000 (23:10 +0100)
Add a typeof keyword to automatically use the correct type in set and map
declarations.

table filter {
set blacklist {
typeof ip saddr
}

chain input {
ip saddr @blacklist counter drop
}
}

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Florian Westphal <fw@strlen.de>
src/parser_bison.y
src/scanner.l

index 6d17539fa57e16644f1e6dccf262ce1a49e902fb..89ec564cee46b1a251ba4b39fe9dd959081c4576 100644 (file)
@@ -223,6 +223,8 @@ int nft_lex(void *, void *, void *);
 %token WSCALE                  "wscale"
 %token SACKPERM                        "sack-perm"
 
+%token TYPEOF                  "typeof"
+
 %token HOOK                    "hook"
 %token DEVICE                  "device"
 %token DEVICES                 "devices"
@@ -658,8 +660,8 @@ int nft_lex(void *, void *, void *);
 
 %type <expr>                   symbol_expr verdict_expr integer_expr variable_expr chain_expr policy_expr
 %destructor { expr_free($$); } symbol_expr verdict_expr integer_expr variable_expr chain_expr policy_expr
-%type <expr>                   primary_expr shift_expr and_expr
-%destructor { expr_free($$); } primary_expr shift_expr and_expr
+%type <expr>                   primary_expr shift_expr and_expr typeof_expr
+%destructor { expr_free($$); } primary_expr shift_expr and_expr typeof_expr
 %type <expr>                   exclusive_or_expr inclusive_or_expr
 %destructor { expr_free($$); } exclusive_or_expr inclusive_or_expr
 %type <expr>                   basic_expr
@@ -1671,6 +1673,22 @@ chain_block              :       /* empty */     { $$ = $<chain>-1; }
                        }
                        ;
 
+typeof_expr            :       primary_expr
+                       {
+                               $$ = $1;
+                       }
+                       |       typeof_expr             DOT             primary_expr
+                       {
+                               struct location rhs[] = {
+                                       [1]     = @2,
+                                       [2]     = @3,
+                               };
+
+                               $$ = handle_concat_expr(&@$, $$, $1, $3, rhs);
+                       }
+                       ;
+
+
 set_block_alloc                :       /* empty */
                        {
                                $$ = set_alloc(NULL);
@@ -1685,6 +1703,12 @@ set_block                :       /* empty */     { $$ = $<set>-1; }
                                $1->key = $3;
                                $$ = $1;
                        }
+                       |       set_block       TYPEOF          typeof_expr     stmt_separator
+                       {
+                               $1->key = $3;
+                               datatype_set($1->key, $3->dtype);
+                               $$ = $1;
+                       }
                        |       set_block       FLAGS           set_flag_list   stmt_separator
                        {
                                $1->flags = $3;
@@ -1754,6 +1778,17 @@ map_block                :       /* empty */     { $$ = $<set>-1; }
                                $1->flags |= NFT_SET_MAP;
                                $$ = $1;
                        }
+                       |       map_block       TYPEOF
+                                               typeof_expr     COLON   typeof_expr
+                                               stmt_separator
+                       {
+                               $1->key = $3;
+                               datatype_set($1->key, $3->dtype);
+                               $1->data = $5;
+
+                               $1->flags |= NFT_SET_MAP;
+                               $$ = $1;
+                       }
                        |       map_block       TYPE
                                                data_type_expr  COLON   COUNTER
                                                stmt_separator
index d32adf4897ae19670f7daeabd79e143fe28b5c6b..4fbdcf2afa4b8bc52cf0cf276b148d49562ced0f 100644 (file)
@@ -385,6 +385,7 @@ addrstring  ({macaddr}|{ip4addr}|{ip6addr})
 "saddr"                        { return SADDR; }
 "daddr"                        { return DADDR; }
 "type"                 { return TYPE; }
+"typeof"               { return TYPEOF; }
 
 "vlan"                 { return VLAN; }
 "id"                   { return ID; }