P4学习——p4runtime


参考:https://blog.csdn.net/qq_33681684/article/details/123646883

在这个练习中,我们将使用P4Runtime向交换机发送流条目,而不是使用交换机的CLI。我们将基于您在basic_tunnel练习中使用的相同的P4程序进行构建。P4程序已被重命名为advanced_tunnel。p4和增加了两个计数器(ingressTunnelCounter, egressTunnelCounter)和两个新动作(myTunnel_ingress, myTunnel_egress)。

您将使用starter程序mycontroller.py和p4runtime_lib目录中的几个助手库来创建主机1和主机2之间的通道通信所需的表条目。
在这里插入图片描述
关于控制平面的说明
P4程序定义了一个包处理管道,但是每个表中的规则是由控制平面插入的。在本例中,mycontroller.py实现了我们的控制平面,而不是像我们在前面的练习中那样安装静态表条目。

重要提示:一个.p4的文件会编译生成一个Info文件里面是含有table id等信息是控制平面下发具体规则的依据;再生成一个配置文件(格式根据target而定)下发数据平面作为包处理的pipeline。控制平面还通过p4runtime对数据平面管理。
在这里插入图片描述

步骤一:运行不完整代码

  • sudo make run (编译advanced_tunnel.p4,启动mininet实例搭建拓扑,为hosts分配IP)
    在这里插入图片描述
  • h1 ping h2,此时还不能正常通信,因为此时交换机上还没有任何规则,所以不能够收到任何的回复
    在这里插入图片描述
  • 打开另一个终端,运行mycontroller.py。这将安装advanced_tunnel。p4在交换机上编程并加载tunnel ingress rules。该程序每2秒打印一次tunnel ingress 和 egres计数。您应该看到s1的tunnel ingress计数器在增加:
    因为s1和s2之间的transit rules还没有,所以只能看到s1 进入隧道计数。
    在这里插入图片描述
  • Ctrl-C 停止mycontroller.py,完成switches间的流量基于隧道ID转发的rules。打开mycontroller.py,完成TODO部分。目前每个交换机都在根据目的IP地址将流量映射到隧道中。目标是编写基于隧道ID在交换机之间转发流量的规则。

步骤二:开始实现隧道转发

mycontroller.py 是一个基础的控制平面,它会做以下操作:
1.为P4Runtime服务建立到switches的gRPC连接;
2.Pushes the P4 program to each switch.推送P4程序到每台switches;
3.为h1到h2间的两个隧道编写规则,h1到h2隧道ID 100,h2到h1隧道ID 200;
4.每2秒钟读取一次tunnel ingress和egress 的计数。

工作将是在writeTunnelRules函数中编写隧道传输规则,该函数将匹配隧道ID并将数据包转发到下一跳。
在这里插入图片描述

在实验中,会使用p4runtime_lib下的一些类和方法:
helper.py
包含用于解析p4info文件的 P4InfoHelper 类。
提供实体名称与ID的转换方法。
构建P4Runtime table的P4程序相关部分。

switch.py
包含SwitchConnection类,该类获取gRPC客户端stub,并建立到交换机的连接。
提供helper方法,用于构造P4Runtime协议缓冲区消息并进行P4Runtime gRPC服务调用

bmv2.py
包含Bmv2SwitchConnection,它扩展了SwitchConnections,并提供BMv2特定的设备载荷以加载P4程序。

convert.py
提供便捷的方法,将friendly字符串和数字编码、解码成协议缓冲区消息所需的字节字符串。
Helper.py 使用

步骤三:运行解决方案

打开另一个终端执行python文件,控制平面会把rules下发到数据平面。这时会看到计数增长
./my_controller.py
在这里插入图片描述
这时通过命令行登录s1,看下switch的转发规则如下:
simple_switch_CLI --thrift-port 9090

目的IP10.0.2.2/32进行LPM匹配,送进隧道100(显示的64是十六进制)。
精确匹配隧道ID100,送到接口2。
隧道ID是200(显示c8是十六进制),封装08–0111的h1的Mac,送到接口1。
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
P4Runtime是一种通过网络对程序进行编程和配置的协议。它是为了支持P4编程语言所设计的,并且可以从控制平面向数据平面发送指令。P4编程语言可以描述数据平面中的数据包处理逻辑,而P4Runtime则可以帮助在网络中管理和配置这些逻辑。 P4Runtime的主要目标是提供一个统一的界面,使控制平面可以管理和控制不同厂商的交换机和路由器。这样,网络管理员就可以通过一个标准的方式管理网络设备,而不用关心特定设备的细节。P4Runtime为控制平面和数据平面之间提供了一个交互的接口,使得控制平面可以向数据平面发送指令,例如请求统计信息、更改流表规则等。 P4Runtime的设计基于GRPC协议,使用Protobuf进行数据编码和解码。通过GRPC,控制平面和数据平面可以建立一个可靠的、基于流的通信通道。P4Runtime定义了一套规范的API,用于在控制平面和数据平面之间交换信息。这个API包括了各种操作,例如创建表、读取表、修改表、删除表等。 P4Runtime的优势包括灵活性和可扩展性。通过P4编程语言,网络管理员可以根据具体的需求编写出高度定制化的数据包处理逻辑。同时,P4Runtime可以与其他网络管理工具集成,例如SDN控制器、自动化管理系统等,从而进一步扩展其功能和适用范围。 总之,P4Runtime是一个用于管理和配置P4编程语言描述的数据平面的协议。通过P4Runtime,控制平面可以与数据平面进行交互,以实现对网络设备的统一管理和控制。它的设计目标是提供灵活性、可扩展性和与其他网络管理工具的集成性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值