diff options
-rw-r--r-- | conf/confbase.Y | 3 | ||||
-rw-r--r-- | filter/config.Y | 28 | ||||
-rw-r--r-- | filter/f-util.c | 4 | ||||
-rw-r--r-- | filter/filter.h | 12 |
4 files changed, 36 insertions, 11 deletions
diff --git a/conf/confbase.Y b/conf/confbase.Y index f498412..7b5caf5 100644 --- a/conf/confbase.Y +++ b/conf/confbase.Y @@ -25,7 +25,8 @@ CF_DECLS ip_addr a; struct symbol *s; char *t; - struct f_inst *x; + struct f_inst *x; + struct filter *f; } %token END diff --git a/filter/config.Y b/filter/config.Y index 3577b19..6d51dc7 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -9,7 +9,6 @@ CF_HDR #include "nest/bird.h" -#include "filter/filter.h" #include "lib/resource.h" #include "lib/socket.h" #include "lib/timer.h" @@ -25,6 +24,7 @@ CF_KEYWORDS(FUNCTION, FILTER, PRINTDEBUG, INT, PRINT, CONST, VAR, PUTS, IF, %type <x> term %type <x> block %type <x> cmds +%type <f> filter filter_body CF_GRAMMAR @@ -41,16 +41,34 @@ function: } ; -CF_ADDTO(conf, filter) -filter: - FILTER SYM '{' cmds '}' { +CF_ADDTO(conf, filter_def) +filter_def: + FILTER SYM filter_body { if ($2->class != SYM_VOID) cf_error("Symbol already defined" ); $2->class = SYM_FILTER; - $2->def = $4; + $2->def = $3; + $3->name = $2->name; printf( "We have new filter defined (%s)\n", $2->name ) } ; +filter_body: + '{' cmds '}' { + struct filter *f = cfg_alloc(sizeof(struct filter)); + f->name = NULL; + f->root = $2; + $$ = f; + } + ; + +filter: + SYM { + if ($1->class != SYM_FILTER) cf_error("No such filter"); + $$ = $1->def; + } + | filter_body + ; + /* Programs */ cmds: diff --git a/filter/f-util.c b/filter/f-util.c index 7856d7f..1f757ff 100644 --- a/filter/f-util.c +++ b/filter/f-util.c @@ -146,13 +146,13 @@ f_new_inst(void) } int -f_run(struct symbol *filter, struct rte *rtein, struct rte **rteout) +f_run(struct filter *filter, struct rte *rtein, struct rte **rteout) { struct f_inst *inst; struct f_val res; debug( "Running filter `%s'...", filter->name ); - inst = filter->def; + inst = filter->root; res = interpret(inst); if (res.type != T_RETURN) return F_ERROR; diff --git a/filter/filter.h b/filter/filter.h index 8ea6b94..379a4ac 100644 --- a/filter/filter.h +++ b/filter/filter.h @@ -1,7 +1,7 @@ /* - * BIRD Internet Routing Daemon -- Configuration File Handling + * BIRD Internet Routing Daemon -- Filters * - * (c) 1998 Martin Mares <mj@ucw.cz> + * (c) 1999 Pavel Machek <pavel@ucw.cz> * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -24,9 +24,16 @@ struct f_val { } val; }; +struct filter { + char *name; + struct f_inst *root; +}; + void filters_postconfig(void); struct f_inst *f_new_inst(void); +int f_run(struct filter *filter, struct rte *rtein, struct rte **rteout); + #define F_ACCEPT 1 #define F_REJECT 2 #define F_MODIFY 3 @@ -39,5 +46,4 @@ struct f_inst *f_new_inst(void); #define T_PX 11 /* prefix */ #define T_INTLIST 12 - #endif |