diff options
| -rw-r--r-- | include/rule.h | 1 | ||||
| -rw-r--r-- | src/parser_bison.y | 28 | ||||
| -rw-r--r-- | src/rule.c | 19 | ||||
| -rw-r--r-- | src/scanner.l | 6 |
4 files changed, 20 insertions, 34 deletions
diff --git a/include/rule.h b/include/rule.h index e67a0152..7c704be8 100644 --- a/include/rule.h +++ b/include/rule.h @@ -260,7 +260,6 @@ struct chain { #define STD_PRIO_BUFSIZE 100 extern int std_prio_lookup(const char *std_prio_name, int family, int hook); -extern const char *chain_type_name_lookup(const char *name); extern const char *chain_hookname_lookup(const char *name); extern struct chain *chain_alloc(void); extern struct chain *chain_get(struct chain *chain); diff --git a/src/parser_bison.y b/src/parser_bison.y index 96d0e151..405fe8f2 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -715,6 +715,10 @@ int nft_lex(void *, void *, void *); %token XT "xt" +%token FILTER "filter" +%token NAT "nat" +%token ROUTE "route" + %type <limit_rate> limit_rate_pkts %type <limit_rate> limit_rate_bytes @@ -1034,6 +1038,9 @@ int nft_lex(void *, void *, void *); %type <expr> set_elem_key_expr %destructor { expr_free($$); } set_elem_key_expr +%type <string> chain_type +%destructor { free_const($$); } chain_type + %% input : /* empty */ @@ -2736,22 +2743,10 @@ type_identifier : STRING { $$ = $1; } | CLASSID { $$ = xstrdup("classid"); } ; -hook_spec : TYPE close_scope_type STRING HOOK STRING dev_spec prio_spec +hook_spec : TYPE chain_type close_scope_type HOOK STRING dev_spec prio_spec { - const char *chain_type = chain_type_name_lookup($3); - - if (chain_type == NULL) { - erec_queue(error(&@3, "unknown chain type"), - state->msgs); - free_const($3); - free_const($5); - expr_free($6); - expr_free($7.expr); - YYERROR; - } $<chain>0->type.loc = @3; - $<chain>0->type.str = xstrdup(chain_type); - free_const($3); + $<chain>0->type.str = $2; $<chain>0->loc = @$; $<chain>0->hook.loc = @5; @@ -2772,6 +2767,11 @@ hook_spec : TYPE close_scope_type STRING HOOK STRING dev_spec prio_spec } ; +chain_type : FILTER { $$ = xstrdup("filter"); } + | NAT { $$ = xstrdup("nat"); } + | ROUTE { $$ = xstrdup("route"); } + ; + prio_spec : PRIORITY extended_prio_spec { $$ = $2; @@ -676,25 +676,6 @@ struct symbol *symbol_lookup_fuzzy(const struct scope *scope, return st.obj; } -static const char * const chain_type_str_array[] = { - "filter", - "nat", - "route", - NULL, -}; - -const char *chain_type_name_lookup(const char *name) -{ - int i; - - for (i = 0; chain_type_str_array[i]; i++) { - if (!strcmp(name, chain_type_str_array[i])) - return chain_type_str_array[i]; - } - - return NULL; -} - static const char * const chain_hookname_str_array[] = { "prerouting", "input", diff --git a/src/scanner.l b/src/scanner.l index 99ace057..b397a147 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -858,6 +858,12 @@ addrstring ({macaddr}|{ip4addr}|{ip6addr}) "out" { return OUT; } } +<SCANSTATE_TYPE>{ + "filter" { return FILTER; } + "nat" { return NAT; } + "route" { return ROUTE; } +} + "secmark" { scanner_push_start_cond(yyscanner, SCANSTATE_SECMARK); return SECMARK; } "xt" { scanner_push_start_cond(yyscanner, SCANSTATE_XT); return XT; } |
