]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
scanner: dst, frag, hbh, mh: Move to own scopes
authorPhil Sutter <phil@nwl.cc>
Fri, 23 Jul 2021 15:39:55 +0000 (17:39 +0200)
committerPhil Sutter <phil@nwl.cc>
Tue, 1 Mar 2022 09:54:03 +0000 (10:54 +0100)
These are the remaining IPv6 extension header expressions, only rt
expression was scoped already.

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

index 7283a6e0652895b209a0cd64f79434d1e3312cfe..30ddef0326faec2f9acf95478e5db8f5c8952db0 100644 (file)
@@ -48,10 +48,14 @@ enum startcond_type {
        PARSER_SC_EXPR_AH,
        PARSER_SC_EXPR_COMP,
        PARSER_SC_EXPR_DCCP,
+       PARSER_SC_EXPR_DST,
        PARSER_SC_EXPR_ESP,
        PARSER_SC_EXPR_FIB,
+       PARSER_SC_EXPR_FRAG,
        PARSER_SC_EXPR_HASH,
+       PARSER_SC_EXPR_HBH,
        PARSER_SC_EXPR_IPSEC,
+       PARSER_SC_EXPR_MH,
        PARSER_SC_EXPR_NUMGEN,
        PARSER_SC_EXPR_OSF,
        PARSER_SC_EXPR_QUEUE,
index aa8858fe0e831a2f2cbea1dd8a9210949fbb58a1..aa64f75cec7c65bb282d9bd8f1324928f8736547 100644 (file)
@@ -935,10 +935,13 @@ close_scope_comp  : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_COMP);
 close_scope_ct         : { scanner_pop_start_cond(nft->scanner, PARSER_SC_CT); };
 close_scope_counter    : { scanner_pop_start_cond(nft->scanner, PARSER_SC_COUNTER); };
 close_scope_dccp       : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_DCCP); };
+close_scope_dst                : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_DST); };
 close_scope_esp                : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_ESP); };
 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_frag       : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_FRAG); };
 close_scope_hash       : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_HASH); };
+close_scope_hbh                : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_HBH); };
 close_scope_ip         : { scanner_pop_start_cond(nft->scanner, PARSER_SC_IP); };
 close_scope_ip6                : { scanner_pop_start_cond(nft->scanner, PARSER_SC_IP6); };
 close_scope_vlan       : { scanner_pop_start_cond(nft->scanner, PARSER_SC_VLAN); };
@@ -947,6 +950,7 @@ close_scope_igmp    : { scanner_pop_start_cond(nft->scanner, PARSER_SC_IGMP); };
 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_mh         : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_MH); };
 close_scope_numgen     : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_NUMGEN); };
 close_scope_osf                : { scanner_pop_start_cond(nft->scanner, PARSER_SC_EXPR_OSF); };
 close_scope_quota      : { scanner_pop_start_cond(nft->scanner, PARSER_SC_QUOTA); };
@@ -5776,7 +5780,7 @@ exthdr_expr               :       hbh_hdr_expr
                        |       mh_hdr_expr
                        ;
 
-hbh_hdr_expr           :       HBH     hbh_hdr_field
+hbh_hdr_expr           :       HBH     hbh_hdr_field   close_scope_hbh
                        {
                                $$ = exthdr_expr_alloc(&@$, &exthdr_hbh, $2);
                        }
@@ -5834,7 +5838,7 @@ rt4_hdr_field             :       LAST_ENT        { $$ = RT4HDR_LASTENT; }
                        }
                        ;
 
-frag_hdr_expr          :       FRAG    frag_hdr_field
+frag_hdr_expr          :       FRAG    frag_hdr_field  close_scope_frag
                        {
                                $$ = exthdr_expr_alloc(&@$, &exthdr_frag, $2);
                        }
@@ -5848,7 +5852,7 @@ frag_hdr_field            :       NEXTHDR         { $$ = FRAGHDR_NEXTHDR; }
                        |       ID              { $$ = FRAGHDR_ID; }
                        ;
 
-dst_hdr_expr           :       DST     dst_hdr_field
+dst_hdr_expr           :       DST     dst_hdr_field   close_scope_dst
                        {
                                $$ = exthdr_expr_alloc(&@$, &exthdr_dst, $2);
                        }
@@ -5858,7 +5862,7 @@ dst_hdr_field             :       NEXTHDR         { $$ = DSTHDR_NEXTHDR; }
                        |       HDRLENGTH       { $$ = DSTHDR_HDRLENGTH; }
                        ;
 
-mh_hdr_expr            :       MH      mh_hdr_field
+mh_hdr_expr            :       MH      mh_hdr_field    close_scope_mh
                        {
                                $$ = exthdr_expr_alloc(&@$, &exthdr_mh, $2);
                        }
@@ -5885,11 +5889,11 @@ exthdr_exists_expr      :       EXTHDR  exthdr_key
                        }
                        ;
 
-exthdr_key             :       HBH     { $$ = IPPROTO_HOPOPTS; }
+exthdr_key             :       HBH     close_scope_hbh { $$ = IPPROTO_HOPOPTS; }
                        |       RT      close_scope_rt  { $$ = IPPROTO_ROUTING; }
-                       |       FRAG    { $$ = IPPROTO_FRAGMENT; }
-                       |       DST     { $$ = IPPROTO_DSTOPTS; }
-                       |       MH      { $$ = IPPROTO_MH; }
+                       |       FRAG    close_scope_frag        { $$ = IPPROTO_FRAGMENT; }
+                       |       DST     close_scope_dst { $$ = IPPROTO_DSTOPTS; }
+                       |       MH      close_scope_mh  { $$ = IPPROTO_MH; }
                        ;
 
 %%
index 7c4d8b7f904c47ae39576139ed5b649b55312272..e632d825f9ed842dccb488b40e8790774a29d1ae 100644 (file)
@@ -214,10 +214,14 @@ addrstring        ({macaddr}|{ip4addr}|{ip6addr})
 %s SCANSTATE_EXPR_AH
 %s SCANSTATE_EXPR_COMP
 %s SCANSTATE_EXPR_DCCP
+%s SCANSTATE_EXPR_DST
 %s SCANSTATE_EXPR_ESP
 %s SCANSTATE_EXPR_FIB
+%s SCANSTATE_EXPR_FRAG
 %s SCANSTATE_EXPR_HASH
+%s SCANSTATE_EXPR_HBH
 %s SCANSTATE_EXPR_IPSEC
+%s SCANSTATE_EXPR_MH
 %s SCANSTATE_EXPR_NUMGEN
 %s SCANSTATE_EXPR_OSF
 %s SCANSTATE_EXPR_QUEUE
@@ -440,7 +444,7 @@ addrstring  ({macaddr}|{ip4addr}|{ip6addr})
 "typeof"               { return TYPEOF; }
 
 "vlan"                 { scanner_push_start_cond(yyscanner, SCANSTATE_VLAN); return VLAN; }
-"id"                   { return ID; }
+<SCANSTATE_CT,SCANSTATE_EXPR_FRAG,SCANSTATE_VLAN,SCANSTATE_IP,SCANSTATE_ICMP>"id"                      { return ID; }
 <SCANSTATE_VLAN>{
        "cfi"           { return CFI; }
        "dei"           { return DEI; }
@@ -462,16 +466,22 @@ addrstring        ({macaddr}|{ip4addr}|{ip6addr})
 <SCANSTATE_IP,SCANSTATE_IP6,SCANSTATE_EXPR_OSF>{
        "version"               { return HDRVERSION; }
 }
-"hdrlength"            { return HDRLENGTH; }
+<SCANSTATE_EXPR_AH,SCANSTATE_EXPR_DST,SCANSTATE_EXPR_HBH,SCANSTATE_EXPR_MH,SCANSTATE_EXPR_RT,SCANSTATE_IP>{
+       "hdrlength"             { return HDRLENGTH; }
+}
 "dscp"                 { return DSCP; }
 "ecn"                  { return ECN; }
 "length"               { return LENGTH; }
-"frag-off"             { return FRAG_OFF; }
+<SCANSTATE_EXPR_FRAG,SCANSTATE_IP>{
+       "frag-off"              { return FRAG_OFF; }
+}
 <SCANSTATE_EXPR_OSF,SCANSTATE_IP>{
        "ttl"                   { return TTL; }
 }
 "protocol"             { return PROTOCOL; }
-"checksum"             { return CHECKSUM; }
+<SCANSTATE_EXPR_MH,SCANSTATE_EXPR_UDP,SCANSTATE_EXPR_UDPLITE,SCANSTATE_ICMP,SCANSTATE_IGMP,SCANSTATE_IP,SCANSTATE_SCTP,SCANSTATE_TCP>{
+       "checksum"              { return CHECKSUM; }
+}
 
 <SCANSTATE_IP>{
        "lsrr"                  { return LSRR; }
@@ -553,7 +563,9 @@ addrstring  ({macaddr}|{ip4addr}|{ip6addr})
 "nexthdr"              { return NEXTHDR; }
 
 "ah"                   { scanner_push_start_cond(yyscanner, SCANSTATE_EXPR_AH); return AH; }
-"reserved"             { return RESERVED; }
+<SCANSTATE_EXPR_AH,SCANSTATE_EXPR_FRAG,SCANSTATE_EXPR_MH,SCANSTATE_TCP>{
+       "reserved"              { return RESERVED; }
+}
 <SCANSTATE_EXPR_AH,SCANSTATE_EXPR_ESP,SCANSTATE_EXPR_IPSEC>"spi"                       { return SPI; }
 
 "esp"                  { scanner_push_start_cond(yyscanner, SCANSTATE_EXPR_ESP); return ESP; }
@@ -634,15 +646,17 @@ addrstring        ({macaddr}|{ip4addr}|{ip6addr})
 "tag"                  { return TAG; }
 "sid"                  { return SID; }
 
-"hbh"                  { return HBH; }
+"hbh"                  { scanner_push_start_cond(yyscanner, SCANSTATE_EXPR_HBH); return HBH; }
 
-"frag"                 { return FRAG; }
-"reserved2"            { return RESERVED2; }
-"more-fragments"       { return MORE_FRAGMENTS; }
+"frag"                 { scanner_push_start_cond(yyscanner, SCANSTATE_EXPR_FRAG); return FRAG; }
+<SCANSTATE_EXPR_FRAG>{
+       "reserved2"             { return RESERVED2; }
+       "more-fragments"        { return MORE_FRAGMENTS; }
+}
 
-"dst"                  { return DST; }
+"dst"                  { scanner_push_start_cond(yyscanner, SCANSTATE_EXPR_DST); return DST; }
 
-"mh"                   { return MH; }
+"mh"                   { scanner_push_start_cond(yyscanner, SCANSTATE_EXPR_MH); return MH; }
 
 "meta"                 { return META; }
 "mark"                 { return MARK; }