]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
First and last accessors to as_paths.
authorOndrej Zajicek <santiago@crfreenet.org>
Thu, 8 Oct 2009 14:23:24 +0000 (15:23 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Thu, 8 Oct 2009 14:23:24 +0000 (15:23 +0100)
filter/config.Y
filter/filter.c

index ee4e638d12839972c73e83220d2ff8c1a617c6a4..22206d09174d6dc20cba2af0a7d561f311275487 100644 (file)
@@ -36,7 +36,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
        LEN,
        DEFINED,
        ADD, DELETE, CONTAINS, RESET,
-       PREPEND, MATCH,
+       PREPEND, FIRST, LAST, MATCH,
        EMPTY,
        FILTER, WHERE, EVAL)
 
@@ -448,6 +448,8 @@ term:
  | term '.' IP { $$ = f_new_inst(); $$->code = P('c','p'); $$->a1.p = $1; $$->aux = T_IP; }
  | term '.' LEN { $$ = f_new_inst(); $$->code = 'L'; $$->a1.p = $1; }
  | term '.' MASK '(' term ')' { $$ = f_new_inst(); $$->code = P('i','M'); $$->a1.p = $1; $$->a2.p = $5; }
+ | term '.' FIRST { $$ = f_new_inst(); $$->code = P('a','f'); $$->a1.p = $1; }
+ | term '.' LAST  { $$ = f_new_inst(); $$->code = P('a','l'); $$->a1.p = $1; }
 
 /* Communities */
 /* This causes one shift/reduce conflict
index 8c0c4ab5a76da24487c5cec9df686334912a5cd5..7bcf383d4312d251718e4498b8110f3f9314ce63 100644 (file)
@@ -353,6 +353,7 @@ interpret(struct f_inst *what)
   struct f_val v1, v2, res;
   unsigned u1, u2;
   int i;
+  u32 as;
 
   res.type = T_VOID;
   if (!what)
@@ -727,6 +728,26 @@ interpret(struct f_inst *what)
     default: bug( "Unknown prefix to conversion" );
     }
     break;
+  case P('a','f'):     /* Get first ASN from AS PATH */
+    ONEARG;
+    if (v1.type != T_PATH)
+      runtime( "AS Path expected" );
+
+    as = 0;
+    as_path_get_last(v1.val.ad, &as); /* really last */
+    res.type = T_INT;
+    res.val.i = as;
+    break;
+  case P('a','l'):     /* Get last ASN from AS PATH */
+    ONEARG;
+    if (v1.type != T_PATH)
+      runtime( "AS path expected" );
+
+    as = 0;
+    as_path_get_first(v1.val.ad, &as); /* really first */
+    res.type = T_INT;
+    res.val.i = as;
+    break;
   case 'r':
     ONEARG;
     res = v1;