diff options
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | filter/config.Y | 28 | ||||
-rw-r--r-- | nest/config.Y | 6 |
3 files changed, 32 insertions, 3 deletions
@@ -50,7 +50,6 @@ shutdown # order system shutdown configure [<file>] debug <what> # dump debugging information to log show <name> # show everything you know about symbol <name> - route [<route>] [table <name>] [filter (<name> | { <inline> })] [where <condition>] [all] <-- WHERE rip ??? [<name>] ospf ??? [<name>] static ??? [<name>] diff --git a/filter/config.Y b/filter/config.Y index 05a0f2d..5369468 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -34,13 +34,13 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, CONST, UNSET, LEN, DEFINED, IMPOSSIBLE, - FILTER) + FILTER, WHERE) %nonassoc THEN %nonassoc ELSE %type <x> term block cmds cmd function_body constant print_one print_list var_list var_listn any_dynamic -%type <f> filter filter_body +%type <f> filter filter_body where_filter %type <i> type break_command pair %type <e> set_item set_items switch_body %type <v> set_atom prefix prefix_s ipa @@ -124,6 +124,30 @@ filter: | filter_body ; +where_filter: + WHERE term { + /* Construct 'IF term THEN ACCEPT; REJECT;' */ + struct filter *f = cfg_alloc(sizeof(struct filter)); + struct f_inst *i, *acc, *rej; + acc = f_new_inst(); /* ACCEPT */ + acc->code = 'p,'; + acc->a1.p = NULL; + acc->a2.i = F_ACCEPT; + rej = f_new_inst(); /* REJECT */ + rej->code = 'p,'; + rej->a1.p = NULL; + rej->a2.i = F_REJECT; + i = f_new_inst(); /* IF */ + i->code = '?'; + i->a1.p = $2; + i->a2.p = acc; + i->next = rej; + f->name = NULL; + f->root = i; + $$ = f; + } + ; + function_params: '(' declsn ')' { printf( "Have function parameters\n" ); $$=$2; } | '(' ')' { $$=NULL; } diff --git a/nest/config.Y b/nest/config.Y index 89177a7..01d34fa 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -237,8 +237,14 @@ r_args: } | r_args FILTER filter { $$ = $1; + if ($$->filter != FILTER_ACCEPT) cf_error("Filter specified twice"); $$->filter = $3; } + | r_args where_filter { + $$ = $1; + if ($$->filter != FILTER_ACCEPT) cf_error("Filter specified twice"); + $$->filter = $2; + } | r_args ALL { $$ = $1; $$->verbose = 1; |