summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conf/confbase.Y3
-rw-r--r--filter/config.Y28
-rw-r--r--filter/f-util.c4
-rw-r--r--filter/filter.h12
4 files changed, 36 insertions, 11 deletions
diff --git a/conf/confbase.Y b/conf/confbase.Y
index f498412a..7b5caf5f 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 3577b196..6d51dc74 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 7856d7f6..1f757ff4 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 8ea6b940..379a4ac9 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