跳转至

Tofino 交换机使用:Simple Forward

在本节中,实验者将使用 simple_forward 程序熟悉 Tofino P4 程序的编译与加载过程,学习如何开启交换机端口,并通过 BF-RT 向数据平面下发表项。

simple_forward 根据报文的 ingress port 选择 egress port。数据平面中的转发表定义如下:

action ai_forward(portid_t egress_port) {
    ig_tm_md.ucast_egress_port = egress_port;
}

table ti_forward {
    key = {
        ig_intr_md.ingress_port: exact;
    }
    actions = {
        ai_forward;
        ai_drop;
    }
    size = 1024;
    default_action = ai_drop;
}

表项命中后执行 ai_forward,将 ucast_egress_port 设置为控制平面指定的端口;未命中时执行默认动作 ai_drop。

程序编译

登录 Tofino 交换机,在 simple_forward 目录中运行:

cd ~/simple_forward
make

Makefile 调用 SDE 中的 p4_build.sh 编译 P4 程序。编译结果位于:

/root/bf-sde-9.13.0/build/p4-build/tofino/simple_forward/

程序运行

使用 run_switchd.sh 加载编译后的 pipeline:

/root/bf-sde-9.13.0/run_switchd.sh -p simple_forward

终端出现 bfshell> 提示符后,说明 bf_switchd 已完成初始化。

开启交换机端口

在 bfshell 中进入 UCLI 和 port manager:

bfshell> ucli
bf-sde> xcvr_pres_ignore 9/- 1
bf-sde> xcvr_los_ignore 9/- 1
bf-sde> pm
bf-sde.pm> port-add 9/0 10G NONE
bf-sde.pm> port-add 9/1 10G NONE
bf-sde.pm> port-enb 9/0
bf-sde.pm> port-enb 9/1
bf-sde.pm> show

show 命令会显示 front-panel port 与 device port 的对应关系。本实验使用的端口如下:

Front-panel port Device port 速率
9/0 132 10 Gbit/s
9/1 133 10 Gbit/s

开始收发报文前,应确认两个端口的 RDY 为 YES、ADM 为 ENB、OPR 为 UP。

查看 BF-RT 表

退出 port manager 和 UCLI,进入 bfrt_python:

bf-sde.pm> exit
bf-sde> exit
bfshell> bfrt_python

使用 bfrt.info() 查看当前 P4 程序暴露的 BF-RT 对象:

bfrt.info()

simple_forward 的转发表为:

pipe.SwitchIngress.ti_forward

可以使用以下命令查看表结构和可调用的方法:

tbl = bfrt.simple_forward.pipe.SwitchIngress.ti_forward
tbl.info()
tbl?

下发转发表项

向 ti_forward 添加两条表项,实现端口 132 和 133 之间的双向转发:

tbl.add_with_ai_forward(ingress_port=132, egress_port=133)
tbl.add_with_ai_forward(ingress_port=133, egress_port=132)

使用 dump() 检查已写入的表项:

tbl.dump()

下发完成后,从连接 9/0 的主机发送报文,报文应从 9/1 发出;反方向的报文应从 9/0 发出。可以在两端运行 tcpdump,并结合 port manager 中的 RX/TX 计数检查转发结果。

tcpdump -ni eth0 -e -vvv
作者:Zizhi Shang (64.29%), Haochen Zhang (35.71%)

评论