From 62a956986949d20a7f646ddca885c19c3b136416 Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Fri, 23 Jul 2021 17:39:55 +0200 Subject: scanner: dst, frag, hbh, mh: Move to own scopes These are the remaining IPv6 extension header expressions, only rt expression was scoped already. Signed-off-by: Phil Sutter --- include/parser.h | 4 ++++ src/parser_bison.y | 20 ++++++++++++-------- src/scanner.l | 36 +++++++++++++++++++++++++----------- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/include/parser.h b/include/parser.h index 7283a6e0..30ddef03 100644 --- a/include/parser.h +++ b/include/parser.h @@ -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, diff --git a/src/parser_bison.y b/src/parser_bison.y index aa8858fe..aa64f75c 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -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; } ; %% diff --git a/src/scanner.l b/src/scanner.l index 7c4d8b7f..e632d825 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -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; } +"id" { return ID; } { "cfi" { return CFI; } "dei" { return DEI; } @@ -462,16 +466,22 @@ addrstring ({macaddr}|{ip4addr}|{ip6addr}) { "version" { return HDRVERSION; } } -"hdrlength" { return HDRLENGTH; } +{ + "hdrlength" { return HDRLENGTH; } +} "dscp" { return DSCP; } "ecn" { return ECN; } "length" { return LENGTH; } -"frag-off" { return FRAG_OFF; } +{ + "frag-off" { return FRAG_OFF; } +} { "ttl" { return TTL; } } "protocol" { return PROTOCOL; } -"checksum" { return CHECKSUM; } +{ + "checksum" { return CHECKSUM; } +} { "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; } +{ + "reserved" { return RESERVED; } +} "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; } +{ + "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; } -- cgit v1.2.3