]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
scanner: meta: Move to own scope
authorPhil Sutter <phil@nwl.cc>
Fri, 30 Jul 2021 16:05:19 +0000 (18:05 +0200)
committerPhil Sutter <phil@nwl.cc>
Tue, 1 Mar 2022 09:54:03 +0000 (10:54 +0100)
This allows to isolate 'length' and 'protocol' keywords shared by other
scopes as well.

Signed-off-by: Phil Sutter <phil@nwl.cc>
include/parser.h
src/parser_bison.y
src/scanner.l

index 0dcc30be64780ef44a4373e65c14d7f706292a85..bc42229c1a83b2fdc167792117d1457f6e0188fb 100644 (file)
@@ -41,6 +41,7 @@ enum startcond_type {
        PARSER_SC_IP,
        PARSER_SC_IP6,
        PARSER_SC_LIMIT,
+       PARSER_SC_META,
        PARSER_SC_POLICY,
        PARSER_SC_QUOTA,
        PARSER_SC_SCTP,
index 794a273f5844e8452131eef76dcc575200dd65bb..428df69055eaa28c2310f7f8d03c1a81876367dc 100644 (file)
@@ -954,6 +954,7 @@ close_scope_import  : { scanner_pop_start_cond(nft->scanner, PARSER_SC_CMD_IMPORT
 close_scope_ipsec      : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_IPSEC); };
 close_scope_list       : { scanner_pop_start_cond(nft->scanner, PARSER_SC_CMD_LIST); };
 close_scope_limit      : { scanner_pop_start_cond(nft->scanner, PARSER_SC_LIMIT); };
+close_scope_meta       : { scanner_pop_start_cond(nft->scanner, PARSER_SC_META); };
 close_scope_mh         : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_MH); };
 close_scope_monitor    : { scanner_pop_start_cond(nft->scanner, PARSER_SC_CMD_MONITOR); };
 close_scope_nat                : { scanner_pop_start_cond(nft->scanner, PARSER_SC_STMT_NAT); };
@@ -4916,7 +4917,7 @@ chain_expr                :       variable_expr
                        }
                        ;
 
-meta_expr              :       META    meta_key
+meta_expr              :       META    meta_key        close_scope_meta
                        {
                                $$ = meta_expr_alloc(&@$, $2);
                        }
@@ -4924,7 +4925,7 @@ meta_expr         :       META    meta_key
                        {
                                $$ = meta_expr_alloc(&@$, $1);
                        }
-                       |       META    STRING
+                       |       META    STRING  close_scope_meta
                        {
                                struct error_record *erec;
                                unsigned int key;
@@ -4977,7 +4978,7 @@ meta_key_unqualified      :       MARK            { $$ = NFT_META_MARK; }
                        |       HOUR            { $$ = NFT_META_TIME_HOUR; }
                        ;
 
-meta_stmt              :       META    meta_key        SET     stmt_expr
+meta_stmt              :       META    meta_key        SET     stmt_expr       close_scope_meta
                        {
                                switch ($2) {
                                case NFT_META_SECMARK:
@@ -5001,7 +5002,7 @@ meta_stmt         :       META    meta_key        SET     stmt_expr
                        {
                                $$ = meta_stmt_alloc(&@$, $1, $3);
                        }
-                       |       META    STRING  SET     stmt_expr
+                       |       META    STRING  SET     stmt_expr       close_scope_meta
                        {
                                struct error_record *erec;
                                unsigned int key;
index 8d4907dc1fdfe4ed3eda1c98dce42672cf43eeea..be01c6f3b3bc6fd2193cc375bf2941fea75205a3 100644 (file)
@@ -207,6 +207,7 @@ addrstring  ({macaddr}|{ip4addr}|{ip6addr})
 %s SCANSTATE_IP
 %s SCANSTATE_IP6
 %s SCANSTATE_LIMIT
+%s SCANSTATE_META
 %s SCANSTATE_POLICY
 %s SCANSTATE_QUOTA
 %s SCANSTATE_SCTP
@@ -503,14 +504,14 @@ addrstring        ({macaddr}|{ip4addr}|{ip6addr})
        "dscp"                  { return DSCP; }
 }
 "ecn"                  { return ECN; }
-"length"               { return LENGTH; }
+<SCANSTATE_EXPR_UDP,SCANSTATE_IP,SCANSTATE_IP6,SCANSTATE_META,SCANSTATE_TCP,SCANSTATE_SCTP,SCANSTATE_EXPR_SCTP_CHUNK>"length"          { return LENGTH; }
 <SCANSTATE_EXPR_FRAG,SCANSTATE_IP>{
        "frag-off"              { return FRAG_OFF; }
 }
 <SCANSTATE_EXPR_OSF,SCANSTATE_IP>{
        "ttl"                   { return TTL; }
 }
-"protocol"             { return PROTOCOL; }
+<SCANSTATE_CT,SCANSTATE_IP,SCANSTATE_META,SCANSTATE_TYPE>"protocol"            { return PROTOCOL; }
 <SCANSTATE_EXPR_MH,SCANSTATE_EXPR_UDP,SCANSTATE_EXPR_UDPLITE,SCANSTATE_ICMP,SCANSTATE_IGMP,SCANSTATE_IP,SCANSTATE_SCTP,SCANSTATE_TCP>{
        "checksum"              { return CHECKSUM; }
 }
@@ -688,7 +689,7 @@ addrstring  ({macaddr}|{ip4addr}|{ip6addr})
 
 "mh"                   { scanner_push_start_cond(yyscanner, SCANSTATE_EXPR_MH); return MH; }
 
-"meta"                 { return META; }
+"meta"                 { scanner_push_start_cond(yyscanner, SCANSTATE_META); return META; }
 "mark"                 { return MARK; }
 "iif"                  { return IIF; }
 "iifname"              { return IIFNAME; }