
Hat
译者
⚠️ 注意
如果您发现了错误,欢迎 参与贡献。
BIRD 使用自己的 IP 地址抽象层,以便在 IPv4 和 IPv6 之间共享相同代码。IP 地址被表示为 ip_addr 类型的实体。
⚠️ 重要约束
ip_addr 严禁被当作普通数字处理——必须使用本节列出的函数和宏进行操作。直接进行数值运算会导致未定义行为,因为内部表示对上层代码是不透明的。
| 函数/宏 | 说明 |
|---|---|
ipa_equal(x, y) | 比较两个 IP 地址是否相等,返回 0 或 1 |
ipa_nonzero(x) | 测试 IP 地址是否已定义(非全零) |
ipa_and(x, y) / ipa_or(x, y) / ipa_xor(x, y) | 按位逻辑操作 |
ipa_mkmask(n) | 创建具有 n 位前缀长度的网络掩码 |
ipa_mklen(m) | 从网络掩码反推前缀长度 |
ipa_opposite(x, y) | 比较两个地址是否不同(一 IPv4、一 IPv6) |
ipa_classify(z) | 分类地址为 IPv4 或 IPv6(返回 IADDR_* 常量) |
ipa_scope(z) 返回地址的作用域,ip_scope_text(scope) 获取文本表示:
| 常量 | 含义 |
|---|---|
SCOPE_HOST | 主机本地(如 ::1 / 127.0.0.1) |
SCOPE_LINK | 链路本地(如 fe80:: / 169.254.0.0/16) |
SCOPE_SITE | 站点本地(已废弃) |
SCOPE_ORGANIZATION | 组织范围 |
SCOPE_UNIVERSE | 全局可达 |
网络前缀使用 net_addr 类型,支持多种网络类型(通过 NET_* 常量区分):
| 类型 | 说明 |
|---|---|
NET_IP4 / NET_IP6 | 标准 IPv4/IPv6 前缀 |
NET_VPN4 / NET_VPN6 | VPNv4/VPNv6 前缀(含 Route Distinguisher) |
NET_FLOW4 / NET_FLOW6 | Flowspec 流规范前缀 |
NET_ROA4 / NET_ROA6 | ROA 路由来源授权前缀 |
💡 译者注
地址抽象层是 BIRD 实现 IPv4/IPv6 双栈统一的基石。在 BIRD 的设计哲学中,IPv4 和 IPv6 不应被视为两个需要分别处理的独立系统,而是同一路由框架下的两种地址族。这一抽象层的存在使得 BIRD 的协议实现(如 BGP、OSPFv3)能够以几乎相同的代码处理两种地址族,大幅减少了代码重复和维护成本。

译者
原文作者: <Ondrej Filip>, <Martin Mares>, <Maria Matejka>, <Ondrej Zajicek> 原文链接: https://bird.network.cz/?get_doc&v=20&f=prog-7.html#ss7.1 原文标题: 7.1 IP addresses
遵循协议: CC BY-NC-SA 4.0 / 译者: hat / 翻译时间: 2026-05-01 / 本文链接: https://bird.xmsl.dev/docs/developer-guide/7-1-ip-addresses.html