]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
A couple of filter tweaks:
authorMartin Mares <mj@ucw.cz>
Wed, 17 Mar 1999 14:29:39 +0000 (14:29 +0000)
committerMartin Mares <mj@ucw.cz>
Wed, 17 Mar 1999 14:29:39 +0000 (14:29 +0000)
   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.

conf/confbase.Y
filter/config.Y
filter/f-util.c
filter/filter.h

index f498412af01ed65b0b3addcda2a65bc548573fb0..7b5caf5fe3c47dfc012cd464ec43661d899d2eba 100644 (file)
@@ -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
index 3577b196b2ed7b13da42004197a6a9d17b9edd55..6d51dc746cd1f1db8e9af9a2dba98d8191cf6bb4 100644 (file)
@@ -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:
index 7856d7f6b7ab4e76b842b4ec5abaff83c97223f9..1f757ff49279e2f1328e6a20673095425945437d 100644 (file)
@@ -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;
index 8ea6b94045e4f791e74a196337866799b7b287ac..379a4ac9942118699f5245871d1efdedafd29735 100644 (file)
@@ -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