summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1999-03-17 15:29:39 +0100
committerMartin Mares <mj@ucw.cz>1999-03-17 15:29:39 +0100
commite0f2e42f4f420f7bbdda3d4656c9dda585f1297a (patch)
treeb3db9ed1f4bd5af7bd05c509beb60aca3b6fda7a
parentc612a3be310069b9fbbcfef931bb546d536a716f (diff)
downloadbird-e0f2e42f4f420f7bbdda3d4656c9dda585f1297a.tar
bird-e0f2e42f4f420f7bbdda3d4656c9dda585f1297a.zip
A couple of filter tweaks:
o Introduced struct filter which serves as an external reference to filter. Using struct symbol for this is unwise since it doesn't allow extra information attached to the filter and it also forces all filters to be named. o Implemented config rule 'filter' which matches either named filter or an embedded unnamed filter (`{ <filter> }'). o Fixed totally bogus comment at the top of filter.h. o Added a missing prototype for f_run() to filter.h.
-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 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