美文网首页
p4学习笔记-1

p4学习笔记-1

作者: SmartSloth | 来源:发表于2018-07-30 16:24 被阅读0次

    准备工作

    在官网下载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

    相关文章

      网友评论

          本文标题:p4学习笔记-1

          本文链接:https://www.haomeiwen.com/subject/xorfvftx.html