]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Filter: Check whether IP is 4 or 6 nexthop-merged
authorJan Moskyto Matejka <mq@ucw.cz>
Wed, 22 Mar 2017 13:53:37 +0000 (14:53 +0100)
committerJan Moskyto Matejka <mq@ucw.cz>
Wed, 22 Mar 2017 13:53:37 +0000 (14:53 +0100)
doc/bird.sgml
filter/config.Y
filter/filter.c
filter/test.conf

index 761c5396c92af99887200b22d59104298e817ae2..b10b1a215e70bd4e900b8cf3a835bf1bd76d527f 100644 (file)
@@ -1186,7 +1186,8 @@ foot).
        <tag><label id="type-ip">ip</tag>
        This type can hold a single IP address. Depending on the compile-time
        configuration of BIRD you are using, it is either an IPv4 or IPv6
-       address. IP addresses are written in the standard notation
+       address; this may be checked by <cf>.is_ip4</cf> which returns <cf/bool/.
+        IP addresses are written in the standard notation
        (<cf/10.20.30.40/ or <cf/fec0:3:4::1/). You can apply special operator
        <cf>.mask(<M>num</M>)</cf> on values of type ip. It masks out all but
        first <cf><M>num</M></cf> bits from the IP address. So
index f84360ff9516d9e0fc51326bd3eff11078343b75..2864d290c4e4f42bb3041533312c8034895af4b5 100644 (file)
@@ -400,6 +400,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
        FROM, GW, NET, MASK, PROTO, SOURCE, SCOPE, DEST, IFNAME, IFINDEX,
        PREFERENCE,
        ROA_CHECK, ASN,
+       IS_V4, IS_V6,
        LEN, MAXLEN,
        DEFINED,
        ADD, DELETE, CONTAINS, RESET,
@@ -890,7 +891,8 @@ term:
 
  | rtadot dynamic_attr { $$ = $2; $$->code = P('e','a'); }
 
- | term '.' TYPE { $$ = f_new_inst(); $$->code = 'T';  $$->a1.p = $1; }
+ | term '.' IS_V4 { $$ = f_new_inst(); $$->code = P('I','i'); $$->a1.p = $1; }
+ | term '.' TYPE { $$ = f_new_inst(); $$->code = 'T'; $$->a1.p = $1; }
  | term '.' IP { $$ = f_new_inst(); $$->code = P('c','p'); $$->a1.p = $1; $$->aux = T_IP; }
  | term '.' RD { $$ = f_new_inst(); $$->code = P('R','D'); $$->a1.p = $1; $$->aux = T_RD; }
  | term '.' LEN { $$ = f_new_inst(); $$->code = 'L'; $$->a1.p = $1; }
index 616f9e2ae7fb2bba6b355a7e8dac733b946f5712..9f6c2cdd0a46dc9b5522f1972080d40986630189 100644 (file)
@@ -829,6 +829,13 @@ interpret(struct f_inst *what)
        runtime( "Can't determine type of this item" );
     }
     break;
+  case P('I','i'):
+    ONEARG;
+    if (v1.type != T_IP)
+      runtime( "IP version check needs an IP address" );
+    res.type = T_BOOL;
+    res.val.i = ipa_is_ip4(v1.val.ip);
+    break;
 
   /* Set to indirect value, a1 = variable, a2 = value */
   case 's':
index 89c882ae2403ab3e4cb443e646982b04c96197d1..dedad1d85ff17d37415e95a4eb7dacacd424f7a0 100644 (file)
@@ -312,15 +312,18 @@ function t_ip()
 ip p;
 {
        p = 127.1.2.3;
+       bt_assert(p.is_v4);
        bt_assert(p.mask(8) = 127.0.0.0);
        bt_assert(1.2.3.4 = 1.2.3.4);
        bt_assert(1.2.3.4 = onetwo);
        bt_assert(format(p) = "127.1.2.3");
 
        p = ::fffe:6:c0c:936d:88c7:35d3;
+       bt_assert(!p.is_v4);
        bt_assert(format(p) = "::fffe:6:c0c:936d:88c7:35d3");
 
        p = 1234:5678::;
+       bt_assert(!p.is_v4);
        bt_assert(p.mask(24) = 1234:5600::);
 }