编译环境: Ubuntu 18.04 LTS
1、安装P4编译器
从Github仓库克隆P4编译器

安装依赖

安装谷歌神器protobuf 3.2.0依赖包

在make的过程中会产生一些warning(不是errors),比如

在make check的过程中也会产生一些warning(不是erroes),比如

因为所有的warning被认为是errors,导致make check会failed,我们选择忽略。

此时可以Build P4编译器了

在make -j4时会产生一些错误,比如

在make -j4 check时会产生很多test case失败,这些测试失败都与eBGP有关,这个特性本实验不会涉及。

此时可以安装P4编译器

2、安装P4软件交换机
现在开始安装运行P4程序的软交换机,行为模型v2简称BMV2或者“simple_switch”。适用于P4软交换机的架构文件是 v1model.p4。
从Github仓库克隆P4行为模型

安装依赖

Build软交换机

安装软件交换机

3、编写一段P4软件代码
我们的“Hello World”P4程序将非常简单,只处理IPv4报文,包含一个最长前缀匹配查询表,用于根据目的IP地址确定出端口。本教程的主要目的在于记录开始P4实验的整个流程。
为P4程序建立目录:

用编辑器比如VIM创建如下的~/test/test.p4程序

4、编译P4程序
用下面的命令行编译P4代码,其中-b选项代表选择bmv2作为目标设备,也就是用来运行P4程序的软交换机;

编译器生成目录test.bmv2,其中包含的test.json文件就是运行于软交换机上的可执行代码;
5、创建虚以太网接口
现在我们要建立三对虚拟以太网(veth)接口。
(veth)接口和实际的以太网接口一样,是应用也就是本例中的软交换机用来发送和接收以太网报文的接口。(veth)会成对创建,我们建立三对接口:veth0-veth1, veth2-veth3和veth4-veth5。当应用在一个veth接口发送报文时,在对应的veth接口会接收到报文。
创建过程如下。设置每个接口的MTU值为9500,这样可以发送和接收jumbo帧。同时我们在每个接口禁止IPv6,防止kernel发送RS和组播侦听报告。

6、运行软交换机并执行P4程序
接下来我们会启动多个SSH进程,所以需要打开多个终端窗口或者标签。
在第一个SSH进程,启动软交换机作为后台处理

在同一个SSH进程,启动软交换机的命令行(CLI)

然后得到RunTimeCmd输入对话框:

到这一步我们就实现了一个带三个接口的软交换机,如下图所示:

7、CLI命令行
在软交换机的CLI输入help命令,可以看到可以执行的命令行如下:

执行show_tables命令,显示有一个my_ingress.ipv4_match表;

执行table_info后可以看到更多表信息;

8、添加路由条目
在软交换机的CLI命令行界面用table_add命令添加四条路由实现如下的功能:
All traffic to prefix 10.10.0.0/16 is sent to port 0
All traffic to prefix 11.11.0.0/16 is sent to port 1
All traffic to prefix 12.12.0.0/16 is sent to port 2
All traffic to prefix 20.20.20.0/24 is dropped
没有匹配上述前缀的流量将被默认丢弃

用table_dump命令可以看到刚刚加入的路由表项:

9、观察软交换机的行为
在另外一个终端窗口和SSH进程,执行下列命令行来获取在veth1接口接收到的报文:

输出截屏如下:

10、为软交换机输入报文
在另一个终端窗口,利用scapy来为软交换机注入报文;

此时可以得到欢迎信息,告警和对话框如下:

通过Scapy在接口veth1上输入一个目标IP地址为11.11.1.1的报文

报文到达软交换机的端口0(接口veth0),匹配路由表11.11.0.0/16,然后被转到到端口1(接口veth2)
在第二个SSH进程,通过tcpdump可以看到收到如下报文:

回到第三个SSH进程,通过scapy在接口veth0上发送一个目标IP地址为12.12.1.1 的报文

这一次报文被转发到端口2(接口veth4)。tcpdump不会收到任何报文,因为它监控的是veth3接口而不是veth5。
总结
JUST DO IT!
P4课程系列:
一堂关于P4可编程网络的课程设计
不包教不包会不包就业的P4培训来了
学期收山大课详解P4可编程网络实验
学好这堂P4可编程网课谁还要去斯坦福
思科与Barefoot联手打造P4培训
厉害了我的INT!人生第二个P4编程实验搞定
俺们乡下人刚用上P4交换机,城里人又说P5好!

本文详细介绍了如何在Ubuntu 18.04上安装P4编译器和软件交换机BMV2,编写并编译简单的P4程序,创建虚拟以太网接口,以及通过CLI添加路由条目并观察软交换机行为的过程。


被折叠的 条评论
为什么被折叠?



