Eki
译者
⚠️ 注意
如果您发现了错误,欢迎 参与贡献。
💡 技巧小贴士
本页内容较多,您可以使用 Ctrl/Command
+ F
快速查找本页面的关键词。
如果想快速搜索全站内容,也可以在页面中单击 /
键 快速全文检索关键词。
对于小屏用户,您可以点击右上角的 放大镜
(🔍) 图标以输入关键词进行全文检索。
请注意查看下方的本节目录,点击目录中的链接可以快速跳转到对应的内容。
💡 摘要 (Powered by OpenAI)
本文是 BIRD 用户指南的第五章第二节,主要介绍了 BIRD 的基本、数值、地址、逻辑、BGP 等数据类型,以及细分的数据类型,包括布尔值、字符串、整数、整数对、整数四元组、字节串、IP 地址、地址前缀等内容。
BIRD 配置文件中的数据类型是一种用于存储数据的抽象概念。
在 BIRD 中,每一个变量和值都有一个特定的类型。为了防止明显的错误,布尔值,整数和列举类型的值互不兼容。
以下内容的标题均为 BIRD 配置文件中直接可用的关键字,例如 int a;
。
bool foo;
声明一个布尔值变量 foo。true
/ false
。布尔值是唯一一种可用于 if
判断的数据类型。
这种数据的文本表现形式为 "This is a string constant"
。
对于字符串的操作存在一些限制:
int foo;
声明一个整数型变量 bar。int foo = 100;
声明一个整数型变量 bar 并赋值为 100。它的底层类型为32位无符号整数,即可用范围 0 ~ 4294967295
,整数溢出在 BIRD 不被自动检查。
0x1234 格式的 16 进制 (hexadecimal) 值也可以被使用,例如 int foo = 0x1234;
。
0 ~ 65535
。用于 无符号短整数 对,每一个短整数的可用范围是 0 ~ 65535。
这种数据类型的文本表现形式为 (1234, 5678)
。
这种表现形式也可以在定义新整数对的时候包含数学表达式,例如 (1+2,a)
。
整数对类型有两个可用的操作对象: .asn
和 .data
。
它们分别对应整数对的两个项目,即 (asn, data)
。
用于点号 (.) 分隔的四个整数组成的整数对,用于表现 router ID 等数据,其中每一个整数的可用范围是 0 ~ 255。
这种数据类型的文本表现形式与 IPv4 地址相同,即 1.2.3.4
。
用于一串任意的字节。在过滤器中无法编辑字节串。字节串可以作为参数在函数之间被传递,可以被赋值到 bytestring 类型的变量,可以被打印,可以被比较是否相等 (=, !=)。
字节串的文本表现形式是一个十六进制数字的序列,并可以依据需要被分号分隔。
一个被这种方式定义的字节串必须至少有 16 个字节的长度(即 32 个数字),或者在前方声明 hex:
前缀。例如:
01:23:45:67:89:ab:cd:ef:01:23:45:67:89:ab:cd:ef
0123456789abcdef0123456789abcdef
hex:
hex:12:34:56
hex:12345678
也可以使用 from_hex()
函数与一个 16 进制字符串生成字节串。
源字符串可以使用:
.
);
)-
)与空格作为字节的分隔符。例如:from_hex(" 12.34 56:78 ab-cd-ef ")
。
用于存储单个 IP 地址。为了便于在同一种数据类型中存储 IPv4 和 IPv6 地址,IPv4 地址会被作为 IPv4 地址的 IPv6 地址映射存储(即例如:::ffff:1.2.3.4)。如果需要判断对象是否是一个 IPv4 地址,可用 .is_v4
操作符返回一个布尔值。
IP 地址的文本表现形式与标准写法相同(即 10.20.30.40
或 fec0:3:4::1
)。
一个特殊的可用操作符为 .mask(num)
。这个操作符将掩盖 IP 地址的除前 mask 位的所有 bit。即 1.2.3.4.mask(8) = 1.0.0.0 为 true。
这包括 IP 地址,前缀长度与一些其他数值。这种数据类型是路由表 (route table) 中的关键数值。
网络地址前缀可能有几种类型,它的具体类型可以使用 .type
特殊操作符取得。
具体的类型可以是:
NET_IP4
/ NET_IP6
。它们的文本表现形式写作:
ipaddress
- 例如 192.0.2.0
/ 2001:db8::
prefix_length
- 例如 24
/ 64
其示例值为:
192.0.2.0/24
(IPv4)2001:db8::/32
(IPv6)它们有两个特殊操作符:
.ip
返回 ipaddress 部分.len
返回前缀 (CIDR) 长度NET_IP6_SADR
其包含目标 (dst) 与源 (src) 的 IPv6 地址,其文本表现形式写作:
destination_ipaddress
- 目标地址prefix_length from source_ipaddress
- 源地址前缀长度prefix_length
- 目标地址前缀长度这种数据类型也对应普通前缀的操作符,但操作对象仅限于目标地址。
它还支持 .src
和 .dst
操作符用于提取目标地址和源地址到分别的 NET_IP6 值。
NET_VPN4
/ NET_VPN6
这种数据类型包括一个 IP 前缀与一个 VPN 路由区分值 (VPN Route Distinguisher, RFC 4364)。
它们支持与 IP 前缀相同的操作符,以及 .rd
用于提取路由区分值。这种数据的文本表现形式写作 vpnrd ipprefix
。
NET_ROA4
/ NET_ROA6
这种数据类型包括一个 IP 前缀与一个 ASN。
它们支持与 IP 前缀相同的操作符,以及 .maxlen
操作符用于提取最大前缀长度,.asn
操作符用于提取 ASN。
NET_FLOW4
/ NET_FLOW6
这种数据类型包括一个 IP 前缀与一个 flowspec 规则。
截至撰稿时,BIRD 过滤器仍不支持匹配大部分的 flowspec 内容,只有 .src
和 .dst
操作符用于提取源地址与目标地址为 NET_IP4
与 NET_IP6
值。
NET_MPLS
包括单个 MPLS 标签。但是截止于撰稿日,BIRD 的 MPLS 尚未被完全实现,因此本数据类型也还未实现。
用于存储路由区分值 (VPN Route Distinguisher, RFC 4364)。目前存在三种类型:
asn
: 32bit int (2Byte ASN)asn4
: 16bit int (4Byte ASN)IPv4 address
: 32bit int用于表现一个固定的各种可能性的组合。用户不被允许自行定义这种类型的变量,但有一些路由的属性是枚举类型的值。各种枚举类型的值互不兼容。
ec
用于 BGP 扩展社区属性 (BGP extended community values)。它的本质是一个64位值,其文本表现形式一般写作 (kind, key, value),其中 kind 用于表现扩展社区属性的类型(例如 rt / ro 用于表达 route target / route origin),key 和 value 的值一般是整数值,但取决于具体情况。
与整数对相同,ec 的 key 和 value 部分可以使用表达式进行定义,例如 (ro, variable_a, 3*10)。
lc
用于 BGP 大型社区属性 (BGP large community)。它的本质是三个32位值的组合,其中第一个值用于社区发行者的 ASN,而剩余两个的意义由发行者定义。这种数据类型的文本表现形式写作 (123,456,789),其中每一个值都是整数值。
与整数对相同,lc 的每一个值都可以使用表达式进行定义,例如 (variable_1, 10+20, 3*10)。
lc 有三个特殊操作对象,分别对应 lc 的三个值:(.asn, .data1, .data2)。
set
set 类型用于表示一些元素的集合,在其他语言中被称为数组 / 矩阵等。与字符串相似,set 可以被传递,但不可以被编辑。
set 类型中可以包含的数据类型为: int|pair|quad|ip|prefix|ec|lc|enum set
。
小贴士
由于整数对集合的文本表现形式与前缀集合相同,因此在使用前缀集合时需要注意。
(123, \*)
的表达式可以被用于表示范围(即 (123, 0), (123, 1), .. (123, 65535)
的范围)。(123, 5..100)
的表达式用于表示范围 (123, 5), (123, 6), .. (123, 100)
。(1..3, 100)
, (4..6, 20..30)
等)。(rt, 123, 10..20)
, (ro, 123, *)
等。但需要上文提及的翻译行为的表达式不被允许,例如 (rt, *, 3)
,因为这些数值通常有 4 byte 的范围,用于表达 ASN。(10, 20..30, *)
和 (10, 20, 30..40)
是合法的,但 (10, *, 20..30)
和 (10, 20..30, 40)
不合法。define one=1;
define myas=64500;
int set odds;
pair set ps;
ec set es;
odds = [ one, 2+1, 6-one, 2*2*2-1, 9, 11 ];
ps = [ (1,one+one), (3,4)..(4,8), (5,*), (6,3..6), (7..9,*) ];
es = [ (rt, myas, 3*10), (rt, myas+one, 0..16*16*16-1), (ro, myas+2, *) ];
前缀集合不允许包含数值范围,但可以使用 ipaddress/prefix_length{low,high}
的前缀长度范围。前缀 ip1/len1
将被 ip2/len2{l,h}
匹配,如果 ip1
和 ip2
的前 min(len1, len2)
位相同。
一个有效的前缀长度范围需要满足 low <= high
,但 prefix_mength
并不受 low
和 high
限制。如果将一个前缀对一个前缀集合进行匹配,则仅需要与集合中的任意一个前缀长度范围匹配即可。
前缀长度范围有两个简写形式:
address/len+
用于表达 address/len{len, maxlen}
(其中 maxlen
对于 IPv4 是 32,对于 IPv6 是 128),即 address/len
和它的所有子网;address/len-
用于表达 address/len{0,len}
,即 address/len
与所有包括它的网络。例如,[ 1.0.0.0/8, 2.0.0.0/8+, 3.0.0.0/8-, 4.0.0.0/8{16,24} ]
将匹配 1.0.0.0/8
, 2.0.0.0/8
的所有子前缀,3.0.0.0/8
的所有超级前缀 (super prefixes
),和满足前缀长度在 16 和 24 之间的 4.X.X.X
前缀。
而 [ 0.0.0.0/0{20,24} ]
将无视 IP 匹配所有长度在 20 和 24 之间的前缀,[ 1.2.3.4/32- ]
将匹配任何包括 IP 地址 1.2.3.4
的前缀。
1.2.0.0/16 ~ [ 1.0.0.0/8{15,17} ]
为 true,而 1.0.0.0/16 ~ [ 1.0.0.0/8- ]
为 false。
BGP mask 表达式也可以包含用括号分隔的整式与整数变量,如 [= * 4 (1+2) a =]
,也可以使用范围表达式,如 [= * 3..5 2 100..200 * =]
,和整数集合,如 [= 1 2 [3, 5, 7] * =]
。
一个 ASN 的列表,用于表现 BGP 路径。用户不被允许手动编辑这种类型的数据。
这种数据类型有如下的特殊操作符:
P.first
用于返回 BGP 路径中的第一个 ASN(即邻居 ASN)。P.last
用于返回 BGP 路径中的最后一个 ASN(即源 ASN)。P.last_nonaggregated
用于返回 BGP 路径中的最后一个非集合的 ASN。如果没有合适的 ASN 用于返回,例如 first
或 last
是一个 AS set
元素时,first
和 last
将返回 0
值。
这种情况需要考虑使用 last_nonaggregated
操作符。
P.len
用于返回 BGP 路径的长度。P.empty
用于清空 BGP 路径,不可作为一个数值被使用。P.prepend(A)
用于把 ASN A
前置在 BGP 路径中,并返回被修改后的 BGP 路径。P.delete(A)
用于从 BGP 路径中删除所有 ASN A
出现的实例。A
也可以是一个整数范围,则所有 A
范围内的 ASN 将被删除。P.filter(A)
与 delete
相似,但与 delete
不同的是,filter
将删除所有不是 A
的 ASN。只要不使用其返回结果, prepend
, delete
和 filter
方法将不会直接编辑原对象。
但如果 P.prepend(A);
被作为一个独立语句被写出来,则原对象将被修改后的对象替代。
小贴士
+
符号的使用需要注意,因为它与正则表达式中的 +
符号不同。
*
和 ?
是泛匹配 (wildcard) 风格的操作符,而 +
是正则表达式 (regular expression) 风格的操作符。
用于表达 BGP 路径匹配(例如 path ~ [= 2 3 5 * =]
)的规则。这种数据类型与 UNIX shell 使用的 wildcard 规则相同。
ASN 将匹配其本身,*
将匹配一个任意的 ASN 序列(包括空序列),?
将匹配单个 ASN。
例如,如果 bgp_path 为 4 3 2 1
,则:
bgp_path ~ [= * 4 3 * =
] 为 truebgp_path ~ [= * 4 5 * =]
为 false。+
符号将匹配一个 ASN 的一次或更多次数的出现,例如 [= 1 2+ 3 =]
:
1 2 3
和 1 2 2 2 3
成功匹配1 3
和 1 2 4 3
则无法匹配BGP mask 表达式可以使用以下风格:
[= * 4 (1+2) a =]
[= * 3..5 2 100..200 * =]
[= 1 2 [3, 5, 7] * =]
。用于一种可被编辑的集合。这种数据类型用于社区属性列表 (community list) 和 cluster list (quad集合)。这种数据类型没有文本表现形式。
Clist 可用的特殊操作符有:
P.add(A);
被作为一个独立语句被写出来,则原对象将被修改后的对象替代。类似的还有 eclist
, lclist
和 mplslist
,它们分别用于 BGP 扩展社区、BGP 大型社区。
译者
校对
原文作者: <Ondrej Filip>
, <Martin Mares>
, <Maria Matejka>
, <Ondrej Zajicek>
原文链接: https://bird.network.cz/?get_doc&v=20&f=bird-5.html#ss5.2
原文标题: 5.2 Data types
遵循协议: CC BY-NC-SA 4.0
译者: eki
校对: hat
翻译时间: 2023-12-17
更新时间: 2024-09-22
本文链接: https://bird.xmsl.dev/docs/user-guide/5-2-data-types.html