Barefoot Tofino Workflow

 

Barefoot Workflow

⚠ 本Workflow描述使用P4-16和TNA下的工作流程,基本不涉及P4-14以及17年之前的内容。

Barefoot支持页面

P4官方网站

一、Tofino 1设备相关

Device Overview

  • Tofino 1的产品介绍。简单介绍了Tofino 1的产品规格和硬件架构。PDF

    Switch Architecture Specification

  • Tofino 1 的硬件架构说明文档。从接口、MAU、Traffic Manager等方面详细描述了Tofino 1中硬件架构和组成。PDF

    Wedge 100B User Guide

  • 设备盒子的用户手册。包括CLI操作(如何配置端口、查看端口状态、配置Pipeline等)、OpenBMC、ONL(Open Network Linux)、串口连接等操作说明。PDF

二、SDE与BSP

(一)Barefoot Networks P4 Studio™ Software Development Enviornment (P4 Studio SDE)

1. SDE安装

[下载链接](() 下载SDE后解压并设定环境变量export SDE=directory-where-you-extract-SDE,然后cd $SDE/p4studio_build进入p4studio_build目录。

SDE的安装脚本为`````./p4studio_build.sh```。 安装的配置文件有以下六种:

1) all_profile.yaml # builds all components and theirdependencies
2) diags_profile.yaml # builds diag and its dependencies
3) p414_examples_profile.yaml # builds P4 14 examples and theirdependencies
4) p416_examples_profile.yaml # builds P4 16 examples and theirdependencies
5) switch_p414_profile.yaml # builds switch P4 14 and its dependencies
6) switch_p416_profile.yaml # builds switch P4 16 and its dependencies
7) p4_runtime_profile.yaml # builds switchd with native P4Runtimesupport
8) stratum_profile.yaml # builds the SDE so it can be integratedwith Stratum

对于编译P4-16文件来说,只需要选择p416_examples_profile.yaml,即安P4-16的编译器并编译$SDE/pkgsrc/p4-examples/p416_programs/目录下的所示例程序。 安装SDE的脚本如下:

./p4studio_build.sh --use-profile p416_examples_profile

安装后需要按要求设置$SDE$SDE_INTSALL$PATH环境变量

2. ptf-tests测试

ptf-tests会通过SDE中的示例程序测试SDE是否正确安装、能否正常编译运行P4程序。ptf-tests需要在tofino_model下运行,可以不需要真机的运行环境。 首次运行ptf-tests之前需要运行以下命令:

$SDE/install_ptf_deps.sh
sudo $SDE_INSTALL/bin/veth_setup.sh

ptf-tests的详细使用说明请见$SDE/README第三节。 需要注意两点:

  1. 如果在tofino上运行ptf-tests,需要先卸载(make uninstall)BSP
  2. 如果测试tna/p416程序,在运行./run_p4_tests.sh时需要使用参数-t手动指定程序目录。 例:使用p416_programs/tna_counter进行测试
    ./run_tofino_model.sh -p tna_counter
    ./run_switchd.sh -p tna_counter
    ./run_p4_tests.sh -t pkgsrc/p4-examples/p416_programs/tna_counter
    

    (二)Barefoot Wedge 100B Board Support Package (BSP)

    [下载页面](()

  3. 设置export BSP_INSTALL=$SDE_INSTALL, export BSP=src_dir

  4. 使用自动解压脚本./extract_all.sh

  5. 解压后进入$BSP/pf-platforms-x.x.x,而后编译安装
./configure --prefix=$BSP_INSTALL -enable-thrift
make
make install

安装后需要按要求设置$BSP环境变量

三、程序的编写、编译与运行

(一)程序编写

1. 数据平面

P4 Specification(P4.org)

  • 来源于P4官方社区(与Barefoot无关)。包含P4-16的说明文档(PDF)。其中PSA之于P4-16语言的关系大概就是C++标准库之于C++语言的关系。需要说明的是,TNA(Tofino Native Architecture)实际上就是Tofino版本的PSA。

    P4_16 Tofino Native Architecture (TNA)

  • TNA的说明文档。TNA对应的是P4-16提出的PSA,类似C++语言中的标准库,即将所有Counter、Meter这些关键字从P4语言本身剥离出来,作为语言的标准库存在。简而言之,TNA文件中描述了Parser、Action Profile、Hash、Random、Counters、Checksums、Meters、Mirroring、Resubmit等原语或命令的用法。PDF

  • TNA可以在4个Pipeline编写不同的程序并级联。关于如何利用多Pipeline的slides。PDF

    在Tofino上编程的坑
    1. Register和Stateful_ALU

      • Register的宽度只能是1/8/16/32/64等值

      • Register_read/write必须用stateful_alu实现

      • 一个register只能关联一个stateful_alu

      • 一个stateful_alu只能被一个action执行

      • 一个action至多可以执行?个stateful_alu

      • stateful_alu中,condition运算的位宽需要小于等于对应register的位宽

    2. Stage
      • 如果后面的ifelse或table里面用到的metadata的值依赖上一个table,则这两个table必须放在不同的stage中
      • 可以使用@pragma stage X指定stage
    3. Control Flow

      • 判断上一个流表命中的action不用再打tag了!可以一定程度上解决上述依赖问题

        table table1 {
            reads {
                ...
            }
            actions {
                hit_action;
                miss_action;
            }
        }
        control ingress {
            apply(table1) {
                hit_action {
                    ...
                }
                miss_action {
                    ...
                }
            }
        }
        

2. 控制平面

BF-Runtime API Guide

  • BFRuntime的C++API文档(PDF)描述BFRuntime是如何从P4程序中产生对应的接口。
  • BFRuntime的gRPC文档(PDF)描述了gRPC文档的详细接口。

    BFRuntime Python Shell User Guide

  • Python下的命令行用户指南。此Shell可以直接对流表的表项进行操作。但是看起来并没有操作Register的示例。

(二)程序编译

P4 BUILD

  • P4-14/16的编译脚本。在页面最下方可以下载脚本。虽然文章注明不支持P416,但是根据barefoot的工作人员和下载下来的脚本内容应该是支持的

    Barefoot Compiler User Guide (P4_16)

  • P4-16的编译教程。详细说明了P4-16如何编译以及P4-16的Annotations。PDF

(三) 程序运行

  1. 启动Data Plane并进入cli:

    $SDE/run_switchd.sh -p program_name
    

    如果出现驱动未注入(重启后),需要执行

    $SDE/pkgsrc/bf-drivers/kdrv/bf_kdrv_mod_load $SDE_INSTALL
    

    如果运行多Pipeline程序,需要编写config文件,文件模板在$SDE/install/share/p4/targets/tofino中,然后在运行时执行

    $SDE/run_switchd.sh -p program_name -c config_file_dir
    
  2. 启动Control Plane(Python):

    $SDE/run_p4_tests.sh -t some_directory/tests.py
    

(四) 程序调试

  1. 命令行调试

使用run_switchd.sh进入cli后,输入ucli进入命令行。

port相关:pm命令。进入后可以使用show查看当前ENABLE的端口,show -a可以显示所有端口。通过port-loopback port-str <Mac-near, Pcs-near, Serdes-near>设置端口回环,例如设置16/0端口egress出的所有包进入该端口的ingress:port-loopback 16/0 Mac-near

有关多pipeline的调整可以参考pkgsrc/tna_multipipepkgssrc/p4-examples/p4_16_programs/tna_32q_2pipe

  1. 图形资源占用界面(要求p4程序使用p4c编译)

    1) 在tofino上运行p4i –no-browser

    2) 使用本地浏览器打开http://101.6.30.130:3000