]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
scanner: add ether scope
authorFlorian Westphal <fw@strlen.de>
Thu, 11 Mar 2021 13:23:06 +0000 (14:23 +0100)
committerFlorian Westphal <fw@strlen.de>
Tue, 16 Mar 2021 22:59:41 +0000 (23:59 +0100)
just like previous change: useless as-is, but prepares
for removal of saddr/daddr from INITIAL scope.

Signed-off-by: Florian Westphal <fw@strlen.de>
include/parser.h
src/parser_bison.y
src/scanner.l

index e338713dad322eae4462d2bc7d7a676fb8fa870f..cdc5fd094af54f382dd07c65edffe3fbc76effad 100644 (file)
@@ -29,6 +29,7 @@ struct parser_state {
 enum startcond_type {
        PARSER_SC_BEGIN,
        PARSER_SC_CT,
+       PARSER_SC_ETH,
        PARSER_SC_IP,
        PARSER_SC_IP6,
        PARSER_SC_EXPR_FIB,
index 74ab69dd882065de9afcbe4ee4e1201c070fc15c..9cfa336643e51bda3bd3a3d76d85d28be59b4ca7 100644 (file)
@@ -862,6 +862,7 @@ opt_newline         :       NEWLINE
                        ;
 
 close_scope_ct         : { scanner_pop_start_cond(nft->scanner, PARSER_SC_CT); };
+close_scope_eth                : { scanner_pop_start_cond(nft->scanner, PARSER_SC_ETH); };
 close_scope_fib                : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_FIB); };
 close_scope_hash       : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_HASH); };
 close_scope_ip         : { scanner_pop_start_cond(nft->scanner, PARSER_SC_IP); };
@@ -3015,7 +3016,7 @@ log_flags         :       TCP     log_flags_tcp
                        {
                                $$ = NF_LOG_UID;
                        }
-                       |       ETHER
+                       |       ETHER   close_scope_eth
                        {
                                $$ = NF_LOG_MACDECODE;
                        }
@@ -4539,7 +4540,7 @@ boolean_expr              :       boolean_keys
                        }
                        ;
 
-keyword_expr           :       ETHER                   { $$ = symbol_value(&@$, "ether"); }
+keyword_expr           :       ETHER   close_scope_eth { $$ = symbol_value(&@$, "ether"); }
                        |       IP      close_scope_ip  { $$ = symbol_value(&@$, "ip"); }
                        |       IP6     close_scope_ip6 { $$ = symbol_value(&@$, "ip6"); }
                        |       VLAN                    { $$ = symbol_value(&@$, "vlan"); }
@@ -5080,7 +5081,7 @@ payload_base_spec :       LL_HDR          { $$ = PROTO_BASE_LL_HDR; }
                        |       TRANSPORT_HDR   { $$ = PROTO_BASE_TRANSPORT_HDR; }
                        ;
 
-eth_hdr_expr           :       ETHER   eth_hdr_field
+eth_hdr_expr           :       ETHER   eth_hdr_field   close_scope_eth
                        {
                                $$ = payload_expr_alloc(&@$, &proto_eth, $2);
                        }
@@ -5114,8 +5115,8 @@ arp_hdr_field             :       HTYPE           { $$ = ARPHDR_HRD; }
                        |       HLEN            { $$ = ARPHDR_HLN; }
                        |       PLEN            { $$ = ARPHDR_PLN; }
                        |       OPERATION       { $$ = ARPHDR_OP; }
-                       |       SADDR ETHER     { $$ = ARPHDR_SADDR_ETHER; }
-                       |       DADDR ETHER     { $$ = ARPHDR_DADDR_ETHER; }
+                       |       SADDR ETHER     close_scope_eth { $$ = ARPHDR_SADDR_ETHER; }
+                       |       DADDR ETHER     close_scope_eth { $$ = ARPHDR_DADDR_ETHER; }
                        |       SADDR IP        close_scope_ip  { $$ = ARPHDR_SADDR_IP; }
                        |       DADDR IP        close_scope_ip  { $$ = ARPHDR_DADDR_IP; }
                        ;
index c78f34b625c25bd14ba09f2cbb44ff240b5d5a57..b1b03b95126349d1f1ff3022225951f34f56cb3c 100644 (file)
@@ -197,6 +197,7 @@ addrstring  ({macaddr}|{ip4addr}|{ip6addr})
 %option warn
 %option stack
 %s SCANSTATE_CT
+%s SCANSTATE_ETH
 %s SCANSTATE_IP
 %s SCANSTATE_IP6
 %s SCANSTATE_EXPR_FIB
@@ -393,7 +394,7 @@ addrstring  ({macaddr}|{ip4addr}|{ip6addr})
 
 "bridge"               { return BRIDGE; }
 
-"ether"                        { return ETHER; }
+"ether"                        { scanner_push_start_cond(yyscanner, SCANSTATE_ETH); return ETHER; }
 "saddr"                        { return SADDR; }
 "daddr"                        { return DADDR; }
 "type"                 { return TYPE; }