add p4 多个文件_手把手教你实现P4语言的“Hello World"

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

编译环境: Ubuntu 18.04 LTS

1、安装P4编译器

从Github仓库克隆P4编译器

a616e54e9dcf9da8c2aa97cfeadd4c81.png

安装依赖

ff0c60da744cae07bbd801f9bef551ff.png

安装谷歌神器protobuf 3.2.0依赖包

e8807dbdab2fa99284d31985b724c69b.png

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

45164f8beada3e06c34c977114cd8734.png

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

08bb1828198aa4272e89108d94dfb205.png

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

b71024133f5ae55dab20102fc3a434b5.png

此时可以Build P4编译器了 

9693b7d939fe71584833de1ae889b9cd.png

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

1402bf0b59278f3f51689fd9abe1fcfe.png

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

b6b9dcf6de4d082bb3bd9264fa5eaa64.png

此时可以安装P4编译器

3594e5ed66a780592eafdcf742d9bdb1.png

2、安装P4软件交换机

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

从Github仓库克隆P4行为模型

8a46722eb83ca9ce07b527f4e263d4a3.png

安装依赖

73dea717bf3420c8d92764f1bc589fdd.png

Build软交换机

77ca7c7993c16148eeb709aa9a12e9a3.png

安装软件交换机

6495d03d403131232a48b8d2a3dab697.png

3、编写一段P4软件代码

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

为P4程序建立目录:

bd2812dd718cd97ff1006ae3b5d8f0c0.png

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

7d670828b9599619483ebac40be15a69.png

4、编译P4程序

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

71ed004c72a887b162cd88a77377f62d.png

编译器生成目录test.bmv2,其中包含的test.json文件就是运行于软交换机上的可执行代码;

5、创建虚以太网接口

现在我们要建立三对虚拟以太网(veth)接口。

(veth)接口和实际的以太网接口一样,是应用也就是本例中的软交换机用来发送和接收以太网报文的接口。(veth)会成对创建,我们建立三对接口:veth0-veth1veth2-veth3veth4-veth5。当应用在一个veth接口发送报文时,在对应的veth接口会接收到报文。

创建过程如下。设置每个接口的MTU值为9500,这样可以发送和接收jumbo帧。同时我们在每个接口禁止IPv6,防止kernel发送RS和组播侦听报告。

440eef81488a02a893db14b646b3204b.png

6、运行软交换机并执行P4程序

接下来我们会启动多个SSH进程,所以需要打开多个终端窗口或者标签。

在第一个SSH进程,启动软交换机作为后台处理

b0cdd74be403f08371e8ee838a7357c5.png

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

bb52dd867c4ad69e2606fd3fd1bfe365.png

然后得到RunTimeCmd输入对话框:

761d6480382ff4898393ffb2a7a03525.png

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

abe679ab474b1ad3107823948fb9214a.png

7、CLI命令行

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

070f3370f6e0217f3b7f3ef8b0ad9148.png

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

0eba2ee1468d762efaee95e16d64b441.png

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

4c3d03680c6e2af180d2e42af8fe7882.png

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

  • 没有匹配上述前缀的流量将被默认丢弃

21d563a7ecfb4fa0dbee3f03bfcae55c.png

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

220b0b0b4436265002ccd7efad690ae7.png

9、观察软交换机的行为

在另外一个终端窗口和SSH进程,执行下列命令行来获取在veth1接口接收到的报文:

67b4cab29e4ff278724b362418563372.png

输出截屏如下:

d708c11d01e31123b7e9140226c065be.png

10、为软交换机输入报文

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

05a2d0d4832cd3ee847bf8070da12b02.png

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

8edcd375e5f3ec01f41235fb276adfaa.png

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

8b501cefa461b4b16e83915959907779.png

报文到达软交换机的端口0(接口veth0),匹配路由表11.11.0.0/16,然后被转到到端口1(接口veth2)

在第二个SSH进程,通过tcpdump可以看到收到如下报文:

2a337502e9229b1eae648878d3786454.png

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

1361d514ff1a432f38a01e5ebd125a87.png

这一次报文被转发到端口2(接口veth4)。tcpdump不会收到任何报文,因为它监控的是veth3接口而不是veth5。

总结

JUST DO IT

P4课程系列:

一堂关于P4可编程网络的课程设计

不包教不包会不包就业的P4培训来了

学期收山大课详解P4可编程网络实验

学好这堂P4可编程网课谁还要去斯坦福

思科与Barefoot联手打造P4培训

厉害了我的INT!人生第二个P4编程实验搞定

俺们乡下人刚用上P4交换机,城里人又说P5好! 3c02df08b4359fea9ee88edaf4fb10a2.gif

71b97ed5a18418f150db3abf762c9885.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值