p4i的安装与使用

p4i 作为 Barefoot P4 开发工具链中的重要一部分,可用于SDE P4程序编译后的各资源分配情况查看,本文记录p4i的安装与简单使用方法。

架构:

  • BOE 容器:编译 SDE
  • BOE 中:启动 p4i
  • MAC 电脑:创建到 BOE 端口映射,本地访问映射端口

1. 安装 P4i

$SDE/pkgsrc/p4i/ 包含 p4i for Linux/MacOS 安装包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 检查 p4i 安装包 [sde9.3.2]
docker exec -it bf_sde_9_3_2_simulation ls -l /sde/bf-sde-9.3.2/pkgsrc/p4i/
# 检查 p4i 安装包 [sde9.9.0]
docker exec -it bf_sde_9_9_0_simulation ls -l /sde/bf-sde-9.9.0/pkgsrc/p4i/

# 从外部拷出容器中 p4i 安装包 [sde9.3.2]
docker cp bf_sde_9_3_2_simulation:/sde/bf-sde-9.3.2/pkgsrc/p4i/ /home/username/
# 从外部拷出容器中 p4i 安装包 [sde9.9.0]
docker cp bf_sde_9_9_0_simulation:/sde/bf-sde-9.9.0/pkgsrc/p4i/ /home/username/

# 安装 p4i
sudo dpkg -i /home/username/p4i/p4i.linux.deb
# check
sudo dpkg -l | grep p4i


# 修复安装依赖组件缺失问题 (e.g. libgbm-dev, libasound-dev, libasound2-dev, libnotify4, libxss1, xdg-utils, libappindicator3-1)
sudo apt --fix-broken install

# 再次尝试安装 p4i
sudo dpkg -i ~/p4i/p4i.linux.deb

# 安装 xvfb (解决P4i运行时会报错段错误,无图形化界面)
sudo apt install xvfb
sudo apt install libgbm1 libasound2

# check
which p4i

备注:如果Debian 9系统遇到spawn xdg-open ENOENT错误,可以sudo apt-get install xdg-utils解决

2. 启动 P4i

直接运行

1
2
xvfb-run p4i
# 默认 localhost:3000

从编译容器拷贝manifest.json等文件后运行
(start_p4i.sh)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/env bash

#
# Extra manifest.json and run p4i
#

# sde 9.3.2
SDE_CONTAINER_NAME='sde_9_3_2_build'
SRC_P4I_MANIFESTS_DIR='/sde/bf-sde-9.3.2/build/switch-p4-16/p4src/switch/'
# 确保容器中已经生成了 *.tar.bz
# /opt/bf-sde/install/bin/bf-p4c --std p4-16 --target tofino --arch tna -o ./switch --bf-rt-schema ./switch/bf-rt.json -g -Xp4c='--disable-power-check' -I /p4xgw/pkgsrc/switch-p4-16/p4src/shared/ /p4xgw/pkgsrc/switch-p4-16/p4src/switch-tofino/switch_tofino_xgw.p4

# rgw
/sde/bf-sde-9.3.2/install/bin/bf-p4c --std p4-16 --target tofino --arch tna -o ./switch --bf-rt-schema ./switch/bf-rt.json -g -Xp4c='--disable-power-check' -I /sde/bf-sde-9.3.2/pkgsrc/switch-p4-16/p4src/shared/ /sde/bf-sde-9.3.2/pkgsrc/switch-p4-16/p4src/switch-tofino/switch_tofino_p4gw.p4


# sde 9.9.0
# SDE_CONTAINER_NAME='bf_sde_9_9_0_simulation'
# SRC_P4I_MANIFESTS_DIR='/sde/bf-sde-9.9.0/build/pkgsrc/switch-p4-16/p4src/switch/'
# 确保容器中已经生成了 *.tar.bz2
/sde/bf-sde-9.9.0/install/bin/bf-p4c --std p4-16 --target tofino --arch tna -o ./switch --bf-rt-schema ./switch/bf-rt.json -g --archive -DXGW_PROFILE /sde/bf-sde-9.3.2/pkgsrc/switch-p4-16/p4src/switch-tofino/switch.p4


P4I_MANIFESTS_DIR='/data00/home/username/.p4i_manifests'

# Check if sde container is running
is_sde_container_running=$(docker ps | grep $SDE_CONTAINER_NAME > /dev/null; echo $?)
echo "is_sde_container_running=$is_sde_container_running"
if [ "$is_sde_container_running" == "0" ]; then
is_comparing=$(docker exec -it $SDE_CONTAINER_NAME ps -ef | grep p4c-barefoot > /dev/null; echo $?)
echo "is_comparing=$is_comparing"
# check if sde container is comparing
if [ "$is_comparing" == "0" ]; then
echo "Container $SDE_CONTAINER_NAME is comparing now, start p4i failed !!!"
exit 1
else
# stop sde container
echo "Container $SDE_CONTAINER_NAME is not comparing, stop it to run p4i."
docker stop $SDE_CONTAINER_NAME
sleep 1
fi
fi


# copy container manifest.json
if [ -d "$P4I_MANIFESTS_DIR/switch/" ]; then
rm -rf $P4I_MANIFESTS_DIR/switch/ > /dev/null 2>&1
fi

docker cp $SDE_CONTAINER_NAME:$SRC_P4I_MANIFESTS_DIR $P4I_MANIFESTS_DIR/

sleep 1

# start p4i
xvfb-run p4i

3. MAC 本地创建ssh 通道到远端 3000 端口映射

1
2
ssh username@A.B.C.D -L 127.0.0.1:1234:127.0.0.1:3000
# MacOS 浏览器访问 127.0.0.1:1234

4. 上传 p4i license(仅首次)

无 license 10min 后 p4i 自动退出

1
scp ~/Downloads/d1aba014-e594-41dc-b871-81a665d3c701.info username@A.B.C.D:/home/username/.local/p4i/

5. faketime within the docker

1
2
3
4
5
6
7
8
9
10
11
// https://102no.com/2019/11/28/libfaketime-docker-change/
// in dev-box
git clone https://github.com/wolfcw/libfaketime.git
cd libfaketime && make install
docker cp /usr/local/lib/faketime/libfaketime.so.1 gw-9.9-container:/usr/local/lib

// in docker
chmod +x /usr/local/lib/libfaketime.so.1
sudo su tiger
export LD_PRELOAD=/usr/local/lib/libfaketime.so.1 FAKETIME="-15d"
xvfb-run install/bin/p4i