]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Updated filters: they now actually see IP/pxlen of net being filtered,
authorPavel Machek <pavel@ucw.cz>
Mon, 19 Apr 1999 18:41:56 +0000 (18:41 +0000)
committerPavel Machek <pavel@ucw.cz>
Mon, 19 Apr 1999 18:41:56 +0000 (18:41 +0000)
gateway, and who told us, so they can do usefull jobs from now on.

bird.conf
conf/confbase.Y
doc/bird.conf.example
filter/config.Y
filter/filter.c
proto/rip/rip.c

index 2129bab1022f06c3fb06cf27e7375a903c9f5fa6..850b53e329e0e8529bb5f2fcabd53e1b71658873 100644 (file)
--- a/bird.conf
+++ b/bird.conf
@@ -32,15 +32,16 @@ int i;
        print "        false = " 1.2.3.4 ~ [ 1.2.3.3, 1.2.3.5 ];
        
        print "done";
-       quitbird;
+#      quitbird;
        print "*** FAIL: this is unreachable"; 
 }
 
 filter testf 
 int j; 
 { 
-       j = const(4321); 
-       print j;
+       print "Heya, filtering route to " rta.net.ip " prefixlen " rta.net.len;
+       print "This route was from " rta.from;
+       accept;
 }
 
 protocol rip MyRIP_test {
@@ -50,6 +51,7 @@ protocol rip MyRIP_test {
        period 5;
        garbagetime 30;
        interface "*";
+       export filter testf;
 }
 
 protocol device {
index f65a9f6b38db649851cb459d65b059bf6e393ce4..522a1803a4f2d7757fa725172551d35f0e32df97 100644 (file)
@@ -39,7 +39,7 @@ CF_DECLS
 
 %type <i> expr bool pxlen
 
-%nonassoc '=' '<' '>' '~' ELSE IF
+%nonassoc '=' '<' '>' '~' ELSE IF '.'
 %left '+' '-'
 %left '*' '/' '%'
 %left '!'
index c1bce7812609b31e685e6de51bdaf718ee208ac7..6580ee7a02c753f0c16af6668fe1219eb470ad5b 100644 (file)
@@ -14,6 +14,7 @@
 #protocol rip MyRIP_test {
 #      preference xyzzy;
 #      debug all;
+#      import filter okay;
 #}
 
 protocol direct {
index 4f910c2619089c2f6aee761f1745b6064b1730df..4fd181573ed39a07240ba1652fa8f806d9051673 100644 (file)
@@ -23,6 +23,9 @@ CF_KEYWORDS(FUNCTION, PRINT, CONST,
        INT, BOOL, IP, PREFIX, PAIR, SET, STRING,
        IF, THEN, ELSE,
        TRUE, FALSE,
+       RTA, FROM, GW, NET,
+       LEN,
+       IMPOSSIBLE,
        FILTER
        )
 
@@ -179,6 +182,13 @@ term:
      }
    }
  | constant { $$ = $1; }
+ | RTA '.' FROM { $$ = f_new_inst(); $$->code = 'a'; $$->a1.i = T_IP; $$->a2.i = OFFSETOF(struct rta, from); }
+
+ | RTA '.' GW { $$ = f_new_inst(); $$->code = 'a'; $$->a1.i = T_IP; $$->a2.i = OFFSETOF(struct rta, gw); }
+ | RTA '.' NET  { $$ = f_new_inst(); $$->code = 'a'; $$->a1.i = T_PREFIX; $$->a2.i = 0x12345678; }
+
+ | term '.' IP { $$ = f_new_inst(); $$->code = 'cp'; $$->a1.p = $1; $$->a2.i = T_IP; }
+ | term '.' LEN { $$ = f_new_inst(); $$->code = 'cp'; $$->a1.p = $1; $$->a2.i = T_INT; }
  ;
 
 break_command:
index c6c5c5af0ca5716d81ac3833fb701d36c83788ab..7afae43706b5f2288c01ea4e39bb9eb27872b12f 100644 (file)
@@ -93,6 +93,8 @@ val_print(struct f_val v)
   printf( buf );
 }
 
+static struct rte **f_rte;
+
 static struct f_val
 interpret(struct f_inst *what)
 {
@@ -218,6 +220,36 @@ interpret(struct f_inst *what)
       bug( "unknown return type: can not happen");
     }
     break;
+  case 'a':    /* rta access */
+    {
+      struct rta *rta = (*f_rte)->attrs;
+      res.type = what->a1.i;
+      switch(res.type) {
+      case T_IP:
+       res.val.ip = * (ip_addr *) ((char *) rta + what->a2.i);
+       break;
+      case T_PREFIX:   /* Warning: this works only for prefix of network */
+       {
+         res.val.px.ip = (*f_rte)->net->n.prefix;
+         res.val.px.len = (*f_rte)->net->n.pxlen;
+         break;
+       }
+      default:
+       bug( "Invalid type for rta access" );
+      }
+    }
+    break;
+  case 'cp':   /* Convert prefix to ... */
+    ONEARG;
+    if (v1.type != T_PREFIX)
+      runtime( "Can not convert non-prefix this way" );
+    res.type = what->a2.i;
+    switch(res.type) {
+    case T_INT:        res.val.i = v1.val.px.len; break;
+    case T_IP: res.val.ip = v1.val.px.ip; break;
+    default: bug( "Unknown prefix to conversion\n" );
+    }
+    break;
   default:
     bug( "Unknown instruction %d (%c)", what->code, what->code & 0xff);
   }
@@ -233,6 +265,7 @@ f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struc
   struct f_val res;
   debug( "Running filter `%s'...", filter->name );
 
+  f_rte = rte;
   inst = filter->root;
   res = interpret(inst);
   if (res.type != T_RETURN)
index cfaaa4c3da15e15d6703193910cf84ba40c2614f..24d2e82baf72c128a6d81c57bfa41c18ce7a14ef 100644 (file)
@@ -69,11 +69,6 @@ rip_tx( sock *s )
       return;
     }
 
-    if (c->done) {
-      DBG( "looks like I'm done!\n" );
-      return;
-    }
-
     DBG( "Preparing packet to send: " );
 
     packet->heading.command = RIPCMD_RESPONSE;