diff options
-rw-r--r-- | doc/bird.sgml | 32 | ||||
-rw-r--r-- | filter/filter.c | 7 | ||||
-rw-r--r-- | lib/net.c | 4 |
3 files changed, 22 insertions, 21 deletions
diff --git a/doc/bird.sgml b/doc/bird.sgml index e85ebf18..761c5396 100644 --- a/doc/bird.sgml +++ b/doc/bird.sgml @@ -1196,27 +1196,29 @@ foot). This type can hold a network prefix consisting of IP address, prefix length and several other values. This is the key in route tables. - Prefices may be of several types, which can be determined by the special - operator <cf/.type/ of type <m/enum/. The type may be: + Prefixes may be of several types, which can be determined by the special + operator <cf/.type/. The type may be: - <cf/NET_IP4/ and <cf/NET_IP6/ prefices hold an IP prefix. The literals are - written as <cf><m/ipaddress//<m/pxlen/</cf>, + <cf/NET_IP4/ and <cf/NET_IP6/ prefixes hold an IP prefix. The literals + are written as <cf><m/ipaddress//<m/pxlen/</cf>, or <cf><m>ipaddress</m>/<m>netmask</m></cf>. There are two special - operators on IP prefices: <cf/.ip/ which extracts the IP address from the - pair, and <cf/.len/, which separates prefix length from the pair. + operators on IP prefixes: <cf/.ip/ which extracts the IP address from + the pair, and <cf/.len/, which separates prefix length from the pair. So <cf>1.2.0.0/16.len = 16</cf> is true. - <cf/NET_VPN4/ and <cf/NET_VPN6/ prefices hold an IP prefix with - VPN Route Distinguisher (<rfc id="4364">). They support the same special - operators as IP prefices, and also <cf/.rd/ which extracts the Route Distinguisher. - Their literals are written as <cf><m/vpnrd/ <m/ipprefix/</cf> + <cf/NET_VPN4/ and <cf/NET_VPN6/ prefixes hold an IP prefix with VPN + Route Distinguisher (<rfc id="4364">). They support the same special + operators as IP prefixes, and also <cf/.rd/ which extracts the Route + Distinguisher. Their literals are written + as <cf><m/vpnrd/ <m/ipprefix/</cf> - <cf/NET_ROA4/ and <cf/NET_ROA6/ prefices hold an IP prefix range together - with an ASN. They support the same special operators as IP prefices, and also - <cf/.maxlen/ which extracts maximal prefix length, and <cf/.asn/ which extracts the ASN. + <cf/NET_ROA4/ and <cf/NET_ROA6/ prefixes hold an IP prefix range + together with an ASN. They support the same special operators as IP + prefixes, and also <cf/.maxlen/ which extracts maximal prefix length, + and <cf/.asn/ which extracts the ASN. - <cf/NET_FLOW4/ and <cf/NET_FLOW6/ hold an IP prefix together with - a flowspec rule. Filters currently don't support flowspec parsing. + <cf/NET_FLOW4/ and <cf/NET_FLOW6/ hold an IP prefix together with a + flowspec rule. Filters currently don't support flowspec parsing. <tag><label id="type-ec">ec</tag> This is a specialized type used to represent BGP extended community diff --git a/filter/filter.c b/filter/filter.c index a3caaf96..616f9e2a 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -1227,11 +1227,10 @@ interpret(struct f_inst *what) ONEARG; if (v1.type != T_NET) runtime( "Prefix expected" ); - res.type = T_RD; - if ((1 << v1.val.net->type) & (NB_VPN4 | NB_VPN6)) - res.val.ec = net_rd(v1.val.net); - else + if (!net_is_vpn(v1.val.net)) runtime( "VPN address expected" ); + res.type = T_RD; + res.val.ec = net_rd(v1.val.net); break; case P('a','f'): /* Get first ASN from AS PATH */ ONEARG; @@ -81,14 +81,14 @@ net_format(const net_addr *N, char *buf, int buflen) case NET_VPN4: { int c = rd_format(n->vpn4.rd, buf, buflen); - buf += c; buflen -= c; + ADVANCE(buf, buflen, c); return bsnprintf(buf, buflen, " %I4/%d", n->vpn4.prefix, n->vpn4.pxlen); } case NET_VPN6: { /* XXX: RD format is specified for VPN4; not found any for VPN6, reusing the same as for VPN4 */ int c = rd_format(n->vpn6.rd, buf, buflen); - buf += c; buflen -= c; + ADVANCE(buf, buflen, c); return bsnprintf(buf, buflen, " %I6/%d", n->vpn6.prefix, n->vpn6.pxlen); } case NET_ROA4: |