Get length in bits of IP address for the running BIRD in filters: 32 - for IPv4, and 128 - for IPv6. This is useful to determine address family for which BIRD was build in filters at runtime. --- doc/bird.sgml | 23 +++++++++++++++++++++++ filter/filter.c | 1 + 2 files changed, 24 insertions(+) diff --git a/doc/bird.sgml b/doc/bird.sgml index 65fc207..e4839a6 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -943,6 +943,29 @@ incompatible with each other (that is to prevent you from shooting in the foot). is either an IPv4 or IPv6 address. 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 <cf/1.2.3.4.mask(8) = 1.0.0.0/ is true. + Also <cf><m/I/.len</cf> operator could be used to get length in bits of the + IP address, which is useful in filters to determine address family + (IPv4 or IPv6) of the BIRD instance at runtime. For example + +<code> +function afi() +{ + case net.ip.len { + 32: return 4; + 128: return 6; + } +} + +function is_bird_ipv4() +{ + return afi() = 4; +} + +function is_bird_ipv6() +{ + return afi() = 6; +} +</code> <tag/prefix/ This type can hold a network prefix consisting of IP address and prefix length. Prefix literals are written as <cf><M>ipaddress</M>/<M>pxlen</M></cf>, or diff --git a/filter/filter.c b/filter/filter.c index 5610f3f..3e8af1e 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -1067,6 +1067,7 @@ interpret(struct f_inst *what) case T_PATH: res.val.i = as_path_getlen(v1.val.ad); break; case T_CLIST: res.val.i = v1.val.ad->length / 4; break; case T_ECLIST: res.val.i = v1.val.ad->length / 8; break; + case T_IP: res.val.i = sizeof(ip_addr) * 8; break; /* Use this to determine AFI in filters */ default: runtime( "Prefix, path, clist or eclist expected" ); } break; -- 1.7.10.4