运行环境
ubuntu 16.04 + linux kernel 3.19
步骤
详见:
问题 fix 见下文。
运行成功图示
- 执行
int_ref_topology.py
- iperf 打流
- webui - 拓扑
- webui - flows
- webui - 时延
- webui - notification
问题解决记录
内核版本切换为 3.19
目前 vxlan-gpe 的内核模块基于内核 3.19,而目前常用 Linux 发行版的内核版本都在 4.2 以上,不切换则编译不过。更好的办法是,直接使用内核版本为 3.19 的 Linux 发行版。
详见 p4factory issue 136
用于支持内核版本 3.19。详见另一篇文章 ubuntu 用回旧版内核
1 | sunyongfeng@openswitch-OptiPlex-380:~/workshop/p4factory/apps/int/vxlan-gpe$ make |
解决 Linux 内核到 3.19 后,docker 无法运行
详见另一篇文章 Linux升级内核后 docker 不可用
1 | sunyongfeng@openswitch-OptiPlex-380:~/workshop/p4factory/makefiles$ sudo service docker start |
解决 int_ref_topology.py 失败问题
docker_node.py 运行失败
执行 mininet 起 docker 起不来。解决:
replace :
start = int(line)
to
start = int(line.strip()) # strip will chop the '\n'
1 | sunyongfeng@openswitch-OptiPlex-380:~/workshop/p4factory/mininet$ sudo ./int_ref_topology.py --model-dir=$P4HOME/install |
ps_out 的结果 ["'22326'\n"]
,因此 L119 应改为:
1 | self.pid = int((ps_out[0].strip()).strip('\'')) |
链接:Python strip() 方法用于移除字符串头尾指定的字符(默认为空格)。
解决 docker 内 bmv2 无法运行的问题
非必需。
原因:ubuntu 16.04 默认 gcc 版为 5.4.0,而 bmv2 docker ubuntu 版本为 14.04,其默认 gcc 为 4.8。因此升级 docker 中的 ubuntu 版本为 16.04
1 | sunyongfeng@openswitch-OptiPlex-380:~/workshop/p4factory/mininet$ sudo ./int_ref_topology.py --model-dir=$P4HOME/install |
根本原因为工具链问题,gcc 版本不一致。
1 | sunyongfeng@openswitch-OptiPlex-380:~/workshop/p4factory/mininet$ docker ps |
更新后的 Dockerfile patch:
1 | diff --git a/docker/Dockerfile b/docker/Dockerfile |
DockerFile 解决 tshark 卡在 yes/no
DockerFile 的改造,tshark 无法直接配置通过,卡在 yes/no。详见上一小节 Dockerfile,先不安装 tshark,等 bmv2 docker image 打好后,再进去安装、重新 commit docker image。
在 docker 内使用 simple_switch_CLI
非必需,仅用于确认表项是否正常下发。
leaf/spine docker 内无法使用 simple_switch_CLI:
- 改 Dockerfile 的 thrift 配置为默认配置,不简化 docker 内的 thrift
- 在 docker 内通过 pip 安装 thrift,
pip install --upgrade thrift
- 通过命令访问 simple_switch_CLI,
/home/sunyongfeng/workshop/p4/install/bin/simple_switch_CLI --json /home/sunyongfeng/workshop/p4/install/share/bmpd/switch/switch.json --thrift-port 10001
没有安装好 thrift 的问题:
1 | root@leaf1:/home/sunyongfeng# /home/sunyongfeng/workshop/p4/install/bin/simple_switch_CLI |
一开始不知道 simple_switch thrift 开放的端口是多少,通过 netstat -anp 确认为 10001。
1 | root@leaf1:/# /home/sunyongfeng/workshop/p4/install/bin/simple_switch_CLI --json /home/sunyongfeng/workshop/p4/install/share/bmpd/switch/switch.json |
查看 ipv4_fib
和 ipv4_fib_lpm
表,确认表项安装 OK。
1 | RuntimeCmd: show_tables |
解决 mininet 起来后 host 间无法互 Ping
原因:docker 的物理端口配置问题,实际拓扑使用 leaf1-eth1,但是配置却配到 swp1。
patch 如下:
1 | diff --git a/mininet/configs/leaf1/l3_int_ref_topo/startup_config.sh b/mininet/configs/leaf1/l3_int_ref_topo/startup_config.sh |
iperf 提示拒绝连接
非必需,仅出现过一次,默认每个 host 的 iperf server 都会启动。
h3 iperf 似乎默认没有启动。
1 | root ~ workshop p4factory mininet iperf -c 10.2.1.3 -t 60 |
在 h3 中启动:
1 | root ~ workshop p4factory mininet iperf -s |
在 h1 中 运行 iperf 客户端:
1 | root ~ workshop p4factory mininet iperf -c 10.2.1.3 -t 6000000 |
monitor 网页无法显示正在运行的流
目前在 h1 iperf h3 的时候,可以通过在 leaf1 中 tshark -i leaf1-eth1
确认输入报文,tshark -i leaf1-eth4
确认输出报文。
可看到报文是 vxlan-gpe 封装(UDP port 4790),但是目前 monitor client 网页上还无法看到 INT 汇总会的图表以及正在运行的流。
- 问题原因:bridge 过滤掉 UDP 报文,具体为哪条过滤表项目前还未细究。
Okay. The solution to this lies in the quirks of how linux bridges get filtered. Essentially, you need to go in disable all the filters so that the UDP packets can get through. Details here: https://wiki.linuxfoundation.org/networking/bridge
- 解决方法:
1 | cd /proc/sys/net/bridge |
详见 p4-dev 邮件列表,INT demo issue - Bad UDP checksum for packets headed to monitor。