summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2019-07-30 16:16:16 +0200
committerFlorian Westphal <fw@strlen.de>2019-12-17 23:10:01 +0100
commit14357cff40eda63f75efc878324aaaafbf3ed748 (patch)
treeb207d0467df218e5c4b28057ccf61d554b8c962c
parent9d65f388c42eaf387a0ae91587c28a29c8582f46 (diff)
parser: add typeof keyword for declarations
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>
-rw-r--r--src/parser_bison.y39
-rw-r--r--src/scanner.l1
2 files changed, 38 insertions, 2 deletions
diff --git a/src/parser_bison.y b/src/parser_bison.y
index 6d17539f..89ec564c 100644
--- a/src/parser_bison.y
+++ b/src/parser_bison.y
@@ -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
diff --git a/src/scanner.l b/src/scanner.l
index d32adf48..4fbdcf2a 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -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; }