准备工作
在官网下载p4的虚拟机之后在virtualbox上运行
虚拟机是在https://p4.org/events/2018-06-06-p4-developer-day/里找到的
下载链接如下(需要翻墙)
https://drive.google.com/uc?id=1f22-DYlUV33DsR88_MeMb4s7-1NX_ams&export=download
打开虚拟机之后就可以按GitHub里的tutorials进行学习
第一个是验证实施基本转发(Implementing Basic Forwarding)
但是basic这个文件夹里的basic.p4文件是不完整的,运行这个原本的basic.p4没有收到消息,因为每个交换机都是按照编程的basic.p4,它会在到达时丢弃所有数据包。需要填充以下内容(您的交换机将具有单个表,控制平面将使用静态规则填充该表。每个规则都会将IP地址映射到下一跳的MAC地址和输出端口。我们已经定义了控制平面规则,因此您只需要实现P4程序的数据平面逻辑。)
在solution文件夹里有一个官方提供的完整的可以参考一下的basic.p4文件。
## 官网教程
### 第1步:运行(不完整的)入门代码
在扩展basic.p4文件之前,让我们编译不完整的basic.p4并在Mininet中调出一个开关来测试它的行为。
在你的shell中,运行:
```
make run
```
这会:
- 编译basic.p4,和
- 启动一个Mininet实例与三个开关(s1,s2,s3)以三角形构造中,每个连接到一个主机(h1,h2,和h3)。
- 该主机被分配的IP地址10.0.1.1,10.0.2.2和10.0.3.3。
您现在应该看到Mininet命令提示符。打开两个端子h1和h2,分别为:
```
mininet > xterm h1 h2
```
每个主机都包含一个基于Python的小型消息传递客户端和服务器 在h2的xterm中,启动服务器:
```
./receive.py
```
在h1的xterm中,发送消息给h2:
```
./send.py 10.0.2.2 "P4 is cool"
```
将不会收到该消息。
键入exit以保留每个xterm和Mininet命令行。然后,停止mininet:
```
make stop
```
并删除所有pcaps,构建文件和日志:
```
make clean
```
没有收到消息,因为每个交换机都是按照编程的basic.p4,它会在到达时丢弃所有数据包。您的工作是扩展此文件,以便转发数据包。
#### 关于控制平面的说明
P4程序定义了数据包处理流水线,但每个表中的规则都由控制平面插入。当规则与数据包匹配时,将使用控制平面提供的参数作为规则的一部分来调用其操作。
在本练习中,我们已经为您实现了控制平面逻辑。作为启动Mininet实例的一部分,该 make run命令将在每个交换机的表中安装数据包处理规则。这些在sX-runtime.json文件中定义,其中 X对应于交换机编号。
重要提示:我们使用P4Runtime来安装控制平面规则。文件内容是sX-runtime.json指表,键和操作的特定名称,如编译器生成的P4Info文件中所定义(build/basic.p4info执行后查找文件make run)。添加或重命名表,键或操作的P4程序中的任何更改都需要反映在这些sX-runtime.json文件中。
### 第2步:实施L3转发
该basic.p4文件包含一个骨架P4程序,其中关键的逻辑部分被TODO注释替换。您的实现应遵循此文件中给出的结构---将每个TODO实现替换为实现缺失部分的逻辑。
完整basic.p4包含以下组件:
以太网(ethernet_t)和IPv4(ipv4_t)的标头类型定义。
TODO:
- 用于填充ethernet_t和填充以太网和IPv4的解析器ipv4_t。
- 使用丢弃数据包的操作mark_to_drop()。
TODO:
- 一种行动(称为ipv4_forward):
- 设置下一跳的出口端口。
- 使用下一跳的地址更新以太网目标地址。
- 使用交换机的地址更新以太网源地址。
- 减少TTL。
TODO:
- 一个control:定义一个表,该表将读取IPv4目标地址,并调用其中一个drop或ipv4_forward。
- apply应用表的块。
TODO:
- 一个deparser,用于选择字段插入传出数据包的顺序。
- package解析器,控件和解析器提供的实例化。
通常,包还需要校验和验证和重新计算控制的实例。这些不是本教程所必需的,而是替换为空控件的实例化。
### 第3步:运行您的解决方案
按照步骤1中的说明进行操作。这次,您的消息 h1应该发送到h2。
**值得深思**
“测试套件”为您的解决方案---从发送消息h1到 h2---不是很强劲。您应该测试什么才能对您的实施充满信心?
虽然Python scapy库超出了本教程的范围,但它可用于生成用于测试的数据包。该send.py文件显示了如何使用它。
其他需要考虑的问题:
您如何增强您的计划以支持下一跳?
这个程序足以取代路由器吗?少了什么东西?
故障排除
在开发程序时可能会出现几个问题:
basic.p4可能无法编译。在这种情况下,make run将报告编译器发出的错误并暂停。
basic.p4可能编译但无法支持尝试使用P4Runtime安装的s1-runtime.json直通s3-runtime.json文件中 的控制平面规则make run。在这种情况下,make run如果无法安装控制平面规则,将报告错误。使用这些错误消息来修复您的basic.p4实现。
basic.p4可能会编译,并且可能会安装控制平面规则,但交换机可能无法以所需方式处理数据包。这些/tmp/p4s..log文件包含描述每个交换机如何处理每个数据包的详细日志。输出详细,可以帮助查明实现中的逻辑错误。
```
clean mininet
```
在上面的后两种情况中,make run可能会在后台运行Mininet实例。使用以下命令清除这些实例:
```
make stop
```
## 下一步
恭喜,您的实施工作正常!在下一个练习中,我们将在此基础上构建并添加对基本隧道协议的支持:basic_tunnel!
网友评论