P4学习(六)实验三:a Control Plane using P4Runtime

这篇具有很好参考价值的文章主要介绍了P4学习(六)实验三:a Control Plane using P4Runtime。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 实验目的

In this exercise, we will add support for a basic tunneling protocol to the IP router that you completed in the previous assignment. The basic switch forwards based on the destination IP address. Your jobs is to define a new header type to encapsulate the IP packet and modify the switch code, so that it instead decides the destination port using a new tunnel header


需求提取;

1.编译隧道规则
2. 采用P4Runtime下发表项

二.阅读MyController.py文件

1.导入P4Runtime的库

sys.path.append(
  os.path.join(
	os.path.dirname(
	  os.path.abspath(__file__)),
	  '../../utils/'))

sys.path 是一个字符串列表,表示解释器在导入模块时会搜索的路径集合。
__file__ 是一个特殊变量,它包含了当前执行的 Python 脚本的路径。
所以这行代码的意思是将P4Runtime的utils库导入到项目中

2.main部分

1. P4InfoHelper 实例化

p4info_helper = 
p4runtime_lib.helper.P4InfoHelper(p4info_file_path)

在 P4Runtime 环境中,它创建了一个 P4InfoHelper 实例。

  • P4Info 文件
    定义:P4Info 是一个由 P4 编译器生成的文件,包含了 P4 程序的元数据。这些元数据包括但不限于表、动作、计数器等的定义。
    作用:P4Info 文件为 P4Runtime 控制器提供必要的信息,以便它可以正确地与 P4 编程的交换机交互。它是控制器理解 P4 编程网络设备的关键。

  • P4Runtime Lib Helper
    定义:一个 Python 库,提供了与P4Runtime操作相关函数
    作用:它包装了一些复杂的 P4Runtime 操作,使得在 Python 中编写控制器代码更加简单和直观,用于简化在 P4Runtime 中操作 P4Info 数据和与 P4Runtime 交换机交互的过程。

  • P4InfoHelper 类
    定义:p4runtime_lib 中的一个类,用来处理 P4Info 文件。
    作用:P4InfoHelper 类通过 P4Info 文件的路径初始化。它读取文件内容,并解析其中的元数据,使这些信息可以在后续操作中轻松使用。

所以这行代码创建个P4InfoHelper 对象充当了 P4 程序定义和控制器之间的桥梁。通过解析 P4Info 文件,它提供了一种高效的方式来访问和操作 P4 程序中定义的各种网络实体。

2. 创建交换机连接

s1 = p4runtime_lib.bmv2.Bmv2SwitchConnection(
    name='s1',
    address='127.0.0.1:50051',
    device_id=0,
    proto_dump_file='logs/s1-p4runtime-requests.txt')
-------省略
  • 这两段代码分别创建了两个 Bmv2SwitchConnection 对象,分别代表两个虚拟交换机(s1 和 s2)。这些对象负责管理与交换机的 P4Runtime 通信。
  • name 参数指定了交换机的名称。
  • address 是交换机的 gRPC 地址。
  • device_id 是交换机的设备ID。
  • proto_dump_file 参数指定了一个文件,用于记录与交换机通信的所有 P4Runtime 消息。

3. 设置主控制器

s1.MasterArbitrationUpdate()
s2.MasterArbitrationUpdate()
  • 这两行代码为两个交换机发送主仲裁更新消息。在 P4Runtime 中,控制器需要成为主控制器才能对交换机进行编程。

4. 安装 P4 程序

s1.SetForwardingPipelineConfig(p4info=p4info_helper.p4info,
                               bmv2_json_file_path=bmv2_file_path)
  • 这两行代码在交换机 s1 和 s2 上安装 P4 程序。它们通过 gRPC 设置转发管线配置。
  • p4info 参数是之前解析的 P4Info 数据。
  • bmv2_json_file_path 是 P4 编译器生成的 BMv2 JSON 文件的路径,该文件包含了 P4 程序的实现细节。

5. 写入隧道规则

writeTunnelRules(p4info_helper, ingress_sw=s1, egress_sw=s2, tunnel_id=100,
                 dst_eth_addr="08:00:00:00:02:22", dst_ip_addr="10.0.2.2")

writeTunnelRules(p4info_helper, ingress_sw=s2, egress_sw=s1, tunnel_id=200,
                 dst_eth_addr="08:00:00:00:01:11", dst_ip_addr="10.0.1.1")
  • 这两个 writeTunnelRules 函数调用配置了隧道规则。第一个调用设置了从 s1 到 s2 的隧道,第二个则相反。
  • 参数包括 p4info_helper(用于构建 P4 表项),ingress_swegress_sw(入口和出口交换机),tunnel_id(隧道标识符),目标以太网地址和目标 IP 地址。

6. 读取表项和计数器

# readTableRules(p4info_helper, s1)
# readTableRules(p4info_helper, s2)
  • 它们会读取并打印交换机 s1 和 s2 上的表项。

7. 定时打印隧道计数器

while True:
    sleep(2)
    print('\n----- Reading tunnel counters -----')
    # ... (省略了打印计数器的代码)
  • 这个循环每 2 秒打印一次隧道计数器的值,显示通过隧道发送的数据包和字节的数量。

8. 异常处理

except KeyboardInterrupt:
    print(" Shutting down.")
except grpc.RpcError as e:
    printGrpcError(e)
  • 这部分处理了两种异常。一种是用户中断(如按 Ctrl+C),另一种是 gRPC 错误。

9. 关闭交换机连接

ShutdownAllSwitchConnections()
  • 脚本结束时,关闭与所有交换机的连接。

二. 实验过程

1. Topo

P4学习(六)实验三:a Control Plane using P4Runtime,p4,网络,P4runtime,P4,SDN

2. 观察初始的工程

P4学习(六)实验三:a Control Plane using P4Runtime,p4,网络,P4runtime,P4,SDN
P4学习(六)实验三:a Control Plane using P4Runtime,p4,网络,P4runtime,P4,SDN
首先我们分别把服务起来后,可以看到只有s1的1端口接收到了数据包,这是因为我们只给s1的port2和s2的port1下发了表项,而隧道规则并没有下发,所以数据包会被drop,即只会有s1连接h1的那个端口会有packet接收,其它端口没有。

3.S1与S2的隧道建立

P4学习(六)实验三:a Control Plane using P4Runtime,p4,网络,P4runtime,P4,SDN

  1. p4info_helper.buildTableEntry(...): 这个函数用于创建一个表项。这个函数的参数包括:
    • table_name: 指定要配置的表的名称。
    • match_fields: 定义了需要匹配的字段。
    • action_name: 当匹配成功时,将要执行的动作。
    • action_params: 与动作相关的参数。
  2. ingress_sw.WriteTableEntry(table_entry): 将上面创建的表项写入到交换机的入口交换。

4. rules的打印

P4学习(六)实验三:a Control Plane using P4Runtime,p4,网络,P4runtime,P4,SDN
这段代码是用于从使用P4语言编程的交换机中读取并打印配置的表项(table entries)。

三. 实验结果

P4学习(六)实验三:a Control Plane using P4Runtime,p4,网络,P4runtime,P4,SDN
P4学习(六)实验三:a Control Plane using P4Runtime,p4,网络,P4runtime,P4,SDN
P4学习(六)实验三:a Control Plane using P4Runtime,p4,网络,P4runtime,P4,SDN
P4学习(六)实验三:a Control Plane using P4Runtime,p4,网络,P4runtime,P4,SDN

四.知识总结

翻译自官网

这个 p4runtime_lib 目录包含了几个Python文件,每个文件都承担着特定的角色以支持P4网络设备的控制和管理。以下是每个文件的概要说明:

  1. helper.py

    • 包含 P4InfoHelper 类,用于解析p4info文件。
    • 提供从实体名称到ID号以及从ID号到实体名称的转换方法。
    • 构建与P4程序相关的P4Runtime表项的部分。
  2. switch.py

    • 包含 SwitchConnection 类,负责获取gRPC客户端存根并建立与交换机的连接。
    • 提供辅助方法来构造P4Runtime协议缓冲消息,并执行P4Runtime gRPC服务调用。
  3. bmv2.py

    • 包含 Bmv2SwitchConnection 类,它扩展了 SwitchConnection 类,并提供BMv2特有的设备负载来加载P4程序。
  4. convert.py

    • 提供方便的方法来实现友好字符串和数字与协议缓冲消息所需的字节字符串之间的编码和解码。
    • helper.py 使用。

这些文件共同工作,为P4Runtime环境下的网络设备(如基于BMv2的交换机)提供了一个完整的控制和配置框架。通过这个库,开发人员可以更方便地与P4Runtime兼容的设备交互,包括配置网络转发规则、读取设备状态、以及管理设备连接等。文章来源地址https://www.toymoban.com/news/detail-817418.html

到了这里,关于P4学习(六)实验三:a Control Plane using P4Runtime的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【深度学习】S2 数学基础 P4 微积分(下)偏导数与链式法则

    总结来说 ,深度学习的核心在于优化;优化的重点在于降低损失值;降低损失值需要通过反向梯度下降;而微积分,判断的就是梯度下降的方向和大小。 铺开来说 ,深度学习的核心目标是通过优化过程来训练模型,以便在给定输入数据时能够产生准确的预测。而为了评估模

    2024年02月21日
    浏览(53)
  • WPF学习笔记04-控件Control_Part1

    之前我们已经学习过WPF布局了,这节我们开始简单介绍下控件。熟悉Winform的应该对控件并不陌生。WPF和Winform的渲染也是不一样的一个是基于DirectX一个是基于GDI+。 在WPF中,打交道最多的控件无非就那么几种。 1)布局控件。之前介绍过的,可以容纳多个控件或嵌套其他布局控

    2024年02月02日
    浏览(41)
  • 简单高效学习 LaTeX 007 - LaTex Format Control 科学排版之格式控制

    这一集的视频演示了如何在LaTeX中进行排版的格式控制: https://www.douyin.com/user/self?modal_id=7303925716830211379showTab=post

    2024年01月21日
    浏览(34)
  • [工具笔记]1.UnityEngine.Plane

    public struct Plane : IFormattable{} Plane是存在于 3D 空间中,无限大的平坦表面,将空间划分为两半(称为半空间)。可方便地确定特定点处于两个半空间的哪一个中,以及确定该点与平面相距多远。 此对象在unity并不可见,只是假设存在一个表面。 法线矢量源自哪一侧十分重要,

    2024年02月09日
    浏览(28)
  • 开源项目管理工具Plane

    本文软件由网友 不长到一百四誓不改名 推荐,不过这次是在他推荐之前,就已经完成了的 🙂 什么是 Plane ? Plane 是一个简单的、可扩展的、开源的项目和产品管理工具。它允许用户从一个基本的任务跟踪工具开始,逐步采用各种项目管理框架,如 Agile 、 Waterfall 等。 在群

    2024年02月12日
    浏览(41)
  • [NAND Flash 6.6] NAND FLASH Multi Plane Program(写)操作_multi plane 为何能提高闪存速度

    依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 返回总目录 Multi Plane 简介 Multi Plane Program 时序图 Multi Plane 提速机理 Multi Plane Program 状态检查 前言 上一篇我们介绍了 NAND FLASH 基本编程(写)操作及原理_ NAND FLASH Program Operation 源码实现。这只是一次对单

    2024年02月01日
    浏览(45)
  • [深入理解NAND Flash (指令篇) ] NAND FLASH Multi Plane Program(写)操作_multi plane 为何能提高闪存速度

    传送门    总目录 主页 : 元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 内容摘要 前言 Multi Plane 简介 Multi Plane Program 时序图 Multi Plane 提速机理 Multi Plane Program 状态检查 前言 上一篇我们介绍了 [深入理解SSD系列 闪存实

    2024年02月13日
    浏览(41)
  • Plane Geometry (Junior High School)

    初中平面几何, AC=BD, ∠CAD=60°,∠C=40°,求∠B Vertical Calculation-CSDN博客 Rectangular Area-CSDN博客

    2024年01月20日
    浏览(51)
  • 论文笔记:tri-plane 【持续更新】

    论文名称: Efficient Geometry-aware 3D Generative Adversarial Networks Project page: https://github.com/NVlabs/eg3d 任务: 从一堆单视角的2D图像中生成有效的三维表达。 途径: 混合的显式与隐式三维表达; dual-discremination的训练策略,以保持神经渲染之间的一致性。 为生成器引入 pose-based的条件

    2024年02月02日
    浏览(40)
  • 【ros2 control 机器人驱动开发】简单双关节机器人学习-example 1

    【ros2 control 机器人驱动开发】简单双关节机器人学习-example 1 本系列文件主要有以下目标和内容: 为系统、传感器和执行器创建 HardwareInterface 以URDF文件的形式创建机器人描述 加载配置并使用启动文件启动机器人 控制RRBot的两个关节(两旋转关节机器人) 六自由度机器人的

    2024年02月04日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包