
Hat
译者
⚠️ 注意
如果您发现了错误,欢迎 参与贡献。
💡 摘要 (Powered by OpenAI)
本文深入介绍了 BIRD 过滤器语言的内部实现:从用户源码到 f_inst 语法树,再翻译为 f_line 线性指令列表,最后通过解释器执行的完整数据流。
过滤器语言的源码位于 filter/ 目录下:
filter/
├── config.Y ← 语法定义 (Bison/YACC),翻译用户源码为 f_inst 指令树
├── filter.c ← 解释器,执行指令树
├── f-inst.c ← 指令定义文件,定义所有指令及其文档
├── f-val.c ← f_val 数据类型操作
├── data.h ← f_val 类型定义(所有类型以 T_ 为前缀)
├── tree.c ← 指令树构造和操作
└── test.c ← 单元测试💡 译者注
BIRD 的过滤器语言是一种专用领域语言 (DSL, Domain-Specific Language),设计目标是在路由处理中提供强大的可编程性。与其他路由软件(如 FRRouting 的 route-map)基于匹配-动作 (match-action) 的模式不同,BIRD 的过滤器语言更接近一门小型编程语言,支持变量、控制结构、函数调用和类型系统。这种设计在灵活性上优于简单的 match-action 模式,但也使解释器实现更为复杂。
一条过滤器从源码到执行经历三个处理阶段:
用户源码 (foo = 1; accept;)
│ config.Y (Bison 解析器)
▼
f_inst 指令树 (Tree of Instructions)
│ f-inst.c (翻译器)
▼
f_line 线性指令列表 (Linear List)
│ filter.c (解释器)
▼
执行结果 (accept / reject / 修改后的路由)每条指令 (f_inst) 有 4 个字段:
| 字段 | 类型 | 说明 |
|---|---|---|
code | 指令码 | 操作码,如 +、==、case、accept 等 |
aux | 扩展码 | 通常为类型信息(如 T_INT、T_IP),帮助分派操作 |
arg1 | 参数 | 整数、指向子树/变量的指针、或者过滤行索引 |
arg2 | 参数 | 同上 |
二元操作(如 a + b)使用 TWOARGS 宏同时求值两个子树:
#define TWOARGS \
struct f_val v1 = interpret(fs, v1_line, 0, NULL, NULL); \
struct f_val v2 = interpret(fs, v2_line, 0, NULL, NULL);过滤器中的所有数据使用 f_val 结构统一存储:
struct f_val {
enum f_type type; // T_INT, T_IP, T_STRING, T_PATH, T_ROUTE, ...
union {
int64_t i; // 整数
ip_addr ip; // IP 地址
char *s; // 字符串
struct f_path path; // AS 路径
// ... 其他类型
} val;
};所有类型常量以 T_ 为前缀,定义在 filter/data.h 中。
enum filter_return interpret(
struct filter_state *fs, // 过滤器运行时状态
const struct f_line *line, // 待执行的指令行
uint argc, // 参数个数
const struct f_val *argv, // 参数值
struct f_val *val // 返回值
);这是过滤器系统的核心函数,负责解释执行给定的过滤器指令序列。
enum filter_return f_run(
const struct filter *filter, // 要运行的过滤器
struct rte **rte, // 被过滤的路由(可能被修改)
struct linpool *tmp_pool, // 临时内存池(过滤期间分配从此池出)
int flags // 控制标志
);处理路由修改时的 COW (Copy-on-Write) 逻辑:
REF_COW 标志)→ 自动创建可读写副本rta,或包含修改后的未缓存 rta用于评估单行过滤器表达式,适用于调试和交互式 CLI 场景。

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