P4学习——Basic Forwarding


https://github.com/p4lang/tutorials/tree/master/exercises/basic

一、实现基本的转发

为了简便,只实现IPv4的转发。对于IPv4的转发,交换机必须对每一个数据包执行以下的操作:

  • 更新源和目的MAC地址
  • 减少IP头中的生存时间TTL
  • 将数据包从适当的端口转发出去

交换机会有一个表,控制平面使用静态规则填充该表。每个规则将一个IP地址映射到一个MAC地址和下一跳的输出端口。我们已经定义了控制平面规则,所以只需要实现P4程序的数据平面逻辑。

我们将使用以下的拓扑结构:
在这里插入图片描述

步骤一:运行不完整的启动器代码
/tutorials/exercises/basic中还包括一个基本的P4程序框架,basic.p4,它起初丢弃所有的数据包。我们的工作就是扩展这个框架程序,以正确地转发IPv4数据包。
在此之前,让我们编译basic.p4,并在Mininet中开启一个交换机来测试它的行为

1、在shell中执行 sudo make run

  • 编译basic.p4
  • 在Mininet启动pod-topo(启动上面的拓扑图)以及用合适和P4程序和表项配置所有交换机
  • 使用pod-topo/topology.json中列出的命令配置所有的主机(包括主机的ip、mac、arp的设置)
    在这里插入图片描述
    成功之后,会显示:
    在这里插入图片描述

2、去ping一下拓扑结构中的主机
在这里插入图片描述
发现是ping不通的,因为每个交换机都是按照basic.p4去编程的,因此在到达终点的时候就会丢弃所有的书记包。那么我们就需要去扩展这个文件以便它转发数据包

控制平面注意点:

  • P4程序定义了一个包处理管道,但是每个表中的规则是由控制平面插入的。当一个规则与一个数据包匹配时,它的操作将使用控制平面作为规则的一部分提供的参数来调用
  • 在这个联系中,控制平面逻辑作为启动Mininet实例的一部分,make run命令将在每个交换机的表中安装包处理规则
  • 我们使用P4Runtime安装控制平面规则。 sX-runtime.json文件中有table、keys、actions的名称,如编译器生成的P4Info文件中定义的(执行make run后查找build/basic.P4Info文件)。P4程序中添加或重命名表、键或操作的任何更改都需要反映在这些sX-runtime.json文件中。

步骤二:实现L3转发
basic.p4文件包含一个P4程序的框架,其中的关键逻辑部分被TODO注释取代,我们的实现通过把P4程序中TODO的部分替换成自己的逻辑,最终完成L3转发
一个完整地basic.p4将包含以下的组件:

  • 以太网(ethernet_t)和IPv4(ipv4_t)报头类型的定义,格式已经定义好了,不用修改
    在这里插入图片描述

  • 填充ethernet_t和ipv4_t字段的以太网和IPv4解析器,例如首先解析以太网帧头,如etherType实0x800的再继续做ipv4解析
    在这里插入图片描述

  • ingress processing:有两个action,一个是drop,一个是ipv4_forward,是需要我们添加逻辑规则的,按照IPv4转发逻辑:有一个下一跳的出口、将以太网帧头的目的MAC替换为下一跳MAC、将以太网帧头的源MAC替换为交换机的MAC、将TTL减去1
    table ipv4_Ipm是控制平面的table,它的内容:1、基于目的IP掩码最长匹配规则做action,匹配就ipv4_forward,否则就drop,2、ipv4_Ipm.apply应用table
    在这里插入图片描述

  • 逆解析器deparser,将之前拆的包再组装回去
    在这里插入图片描述

步骤三:解决方案实施
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改好之后,重新执行sudo make run并且pingall
在这里插入图片描述
sudo make stop 停止后台运行
sudo make clean 清理上次程序残留的build,log文件
每次开始运行sudo make run前,建议先执行以上两个命令把环境清理干净。

猜你喜欢

转载自blog.csdn.net/weixin_46025531/article/details/124412648