summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2014-01-15 07:35:20 +0000
committerPatrick McHardy <kaber@trash.net>2014-01-15 11:52:50 +0000
commit24879f1173e5778cc76507ae17df0cadb78e21a0 (patch)
tree25cbed864ca260385c9a95d088dbb186c6d40465
parent76482c13d0d04759e2982578a5477ef6fd180d90 (diff)
meta: don't require "meta" keyword for a subset of meta expressions
Don't require the meta keyword for mark, iif, oif, iifname, oifname, skuid, skgid, nftrace, rtclassid and secmark. The protocol and length types still need the meta keyword to avoid grammar conflicts. Signed-off-by: Patrick McHardy <kaber@trash.net> Conflicts: src/parser.y
-rw-r--r--src/meta.c13
-rw-r--r--src/parser.y20
2 files changed, 29 insertions, 4 deletions
diff --git a/src/meta.c b/src/meta.c
index 3d84c509..063e641e 100644
--- a/src/meta.c
+++ b/src/meta.c
@@ -331,7 +331,18 @@ static const struct meta_template meta_templates[] = {
static void meta_expr_print(const struct expr *expr)
{
- printf("meta %s", meta_templates[expr->meta.key].token);
+ switch (expr->meta.key) {
+ case NFT_META_LEN:
+ case NFT_META_NFPROTO:
+ case NFT_META_L4PROTO:
+ case NFT_META_PROTOCOL:
+ case NFT_META_PRIORITY:
+ printf("meta %s", meta_templates[expr->meta.key].token);
+ break;
+ default:
+ printf("%s", meta_templates[expr->meta.key].token);
+ break;
+ }
}
static void meta_expr_clone(struct expr *new, const struct expr *expr)
diff --git a/src/parser.y b/src/parser.y
index 86dfe3e8..038282ec 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -450,7 +450,7 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%type <expr> meta_expr
%destructor { expr_free($$); } meta_expr
-%type <val> meta_key
+%type <val> meta_key meta_key_qualified meta_key_unqualified
%type <expr> ct_expr
%destructor { expr_free($$); } ct_expr
@@ -1312,12 +1312,22 @@ meta_expr : META meta_key
{
$$ = meta_expr_alloc(&@$, $2);
}
+ | meta_key_unqualified
+ {
+ $$ = meta_expr_alloc(&@$, $1);
+ }
+ ;
+
+meta_key : meta_key_qualified
+ | meta_key_unqualified
;
-meta_key : LENGTH { $$ = NFT_META_LEN; }
+meta_key_qualified : LENGTH { $$ = NFT_META_LEN; }
| PROTOCOL { $$ = NFT_META_PROTOCOL; }
| PRIORITY { $$ = NFT_META_PRIORITY; }
- | MARK { $$ = NFT_META_MARK; }
+ ;
+
+meta_key_unqualified : MARK { $$ = NFT_META_MARK; }
| IIF { $$ = NFT_META_IIF; }
| IIFNAME { $$ = NFT_META_IIFNAME; }
| IIFTYPE { $$ = NFT_META_IIFTYPE; }
@@ -1334,6 +1344,10 @@ meta_stmt : META meta_key SET expr
{
$$ = meta_stmt_alloc(&@$, $2, $4);
}
+ | meta_key_unqualified SET expr
+ {
+ $$ = meta_stmt_alloc(&@$, $1, $3);
+ }
;
ct_expr : CT ct_key