summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--TODO1
-rw-r--r--filter/config.Y28
-rw-r--r--nest/config.Y6
3 files changed, 32 insertions, 3 deletions
diff --git a/TODO b/TODO
index e80d1b3..34dd1dc 100644
--- a/TODO
+++ b/TODO
@@ -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;