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

news2024/9/25 17:22:27

目录

  • 一. 实验目的
  • 二.阅读MyController.py文件
    • 1.导入P4Runtime的库
    • 2.main部分
      • 1. P4InfoHelper 实例化
      • 2. 创建交换机连接
      • 3. 设置主控制器
      • 4. 安装 P4 程序
      • 5. 写入隧道规则
      • 6. 读取表项和计数器(注释掉的部分)
      • 7. 定时打印隧道计数器
      • 8. 异常处理
      • 9. 关闭交换机连接
  • 二. 实验过程
    • 1. Topo
    • 2. 观察初始的工程
    • 3.S1与S2的隧道建立
    • 4. rules的打印
  • 三. 实验结果
  • 四.知识总结

一. 实验目的

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 文件
    定义: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 程序中定义的各种网络实体。

当然,我会详细解释脚本中 main 函数的内容。main 函数是这个脚本的核心,主要负责设置 P4Runtime 环境并在交换机上配置隧道规则。让我们分步骤详细解释:

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

在这里插入图片描述

2. 观察初始的工程

在这里插入图片描述
在这里插入图片描述
首先我们分别把服务起来后,可以看到只有s1的1端口接收到了数据包,这是因为我们只给s1的port2和s2的port1下发了表项,而隧道规则并没有下发,所以数据包会被drop,即只会有s1连接h1的那个端口会有packet接收,其它端口没有。

3.S1与S2的隧道建立

在这里插入图片描述

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

4. rules的打印

在这里插入图片描述
这段代码是用于从使用P4语言编程的交换机中读取并打印配置的表项(table entries)。代码的每部分功能如下:

三. 实验结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四.知识总结

翻译自官网

这个 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兼容的设备交互,包括配置网络转发规则、读取设备状态、以及管理设备连接等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1403593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划系列问题之打家劫舍和买股票

动态规划系列问题 1.打家劫舍问题1.1打家劫舍I1.2打家劫舍II1.3打家劫舍III 2.买股票问题2.1买股票的最佳时机2.2买股票的最佳时机II2.3买股票的最佳时机III2.4买股票的最佳时机IV2.5买卖股票的最佳时机含冷冻期2.6买卖股票的最佳时机含手续费 题目解析参考了代码随想录 https:…

【Redis漏洞利用总结】

前言 redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis默认使用 6379 端口。 一、redis未授权访问漏洞 0x01 漏洞描述 描述: Redis是一套开源的使用ANSI C编写、支持网络、可基于内存…

基于深度学习的交通标志检测和识别(从原理-环境配置-代码运行)

基于深度学习的交通标志检测和识别是一种先进的计算机视觉技术,利用深度神经网络模型来准确地检测和识别道路上的各种交通标志。下面是对其介绍并分点阐述其重要性和应用场景: 1. 深度学习技术: 交通标志检测和识别利用深度学习技术&#x…

笔试面试题——二叉树进阶(二)

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、二叉搜索树与双向链表1、题目讲解2、思路讲解递归展开图3、代码实现 二、从前序遍历和中序…

刷题 ------ 排序

文章目录 1.K 次取返后最大化的数组和(堆)2.数组的相对排序(桶)3.最小绝对差4.根据数字二进制下1的数目排序(qsort)5.有多少小于当前数字的数字6.非递增顺序的最小子序列7.按照频率将数组升序排序&#xff…

unity 2021 发布安卓版本,谷歌限流国内,报错CommandInvokationFailure: Gradle build failed

在使用 Unity 2022 打包安卓项目时,遇到 gradle 无法访问或下载超级慢最终超时出错的问题解决 解决方案: 1. 在 Build Settings 左下角打开 Player Settings,在 Android 平台图标选项卡下找到 Publishing Settings 区域 勾选 2. 从国内…

​《WebKit 技术内幕》学习之九(3): JavaScript引擎

3 JavaScriptCore引擎 3.1 原理 JavaScriptCore引擎是WebKit中的默认JavaScript引擎,也是苹果在开源WebKit项目之后,开源的另外一个重要的项目。同其他很多引擎一样,在刚开始的时候它的主要部分是一个基于抽象语法树的解释器,这…

【数据库原理】(38)数据仓库

数据仓库(Data Warehouse, DW)是为了满足企业决策分析需求而设计的数据环境,它与传统数据库有明显的不同。 一.数据库仓库概述 定义: 数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持企业管理和…

成都爱尔胡建斌院长提醒视网膜脱离到底有多危险?!

视网膜脱离是视网膜神经上皮层与色素上皮层的分离。 视网膜脱离之危险,在与视网膜脱离后外层视网膜得不到脉络膜的血液供应,如不及时复位,视网膜感光细胞会发生凋亡,视力就不易恢复。 就症状来说,患者发病初期眼前多有…

0122-1-JavaScript高级程序设计11-27章

前言 通过阅读这本书写下的一些笔记 《JavaScript高级程序设计》 第11章——期约与异步函数 11.2 期约(promise):是对 尚不存在结果 的一个替身。 /*** 期约与异步函数* 什么是Promise?* (1)从语法上来说:Promis…

np.argsort排序问题(关于位次)-含GitHub上在numpy项目下提问的回复-总结可行方案

np.argsort 与获取位相关问题 位次: 数组中的数据在其排序之后的另一个数组中的位置 [1,0,2,3] 中 0的位次是1 1的位次是2 2的位次是3 3的位次是4 这里先直接给出结论,np.argsort()返回的索引排序与实际位次在确实在某些情况下会出现一致,但后来numpy的开…

HubSpot SEO功能好用吗?

HubSpot对于SEO(搜索引擎优化)提供了全面的工具和功能,帮助用户优化其网站以在搜索引擎中取得更好的排名。以下是关于HubSpot SEO的一些关键方面: 内容优化: HubSpot的内容工具允许用户创建并优化吸引人的内容。通过关…

pikachu验证码绕过第三关攻略

打开pikachu靶场第三关: 挂上代理,随便输入账户密码: 返回bp。进行放包发现显示token错误。 每一次登录的返回包会带有token相关数据用于下一次的登录认证: 进行替换token值: 替换完成开始进行检点的爆破:…

s3fs挂载minio集群到本地目录

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 1. 前言 MinIO 是一款高性能的对象存储,与 Amazon S3 云存储服务兼容,并且号称是世界上最快的对象存储服…

LLM RAG 多种方式装载LLM的实践

一、大模型系统中检索增强生成(RAG)的意义 当前大模型在处理特定领域或者高度专业化的查询时表现出知识缺失,当所需信息超出模型训练数据范围或需要最新数据时,大模型可能无法提供准确答案。基于行业SOP、行业标准、互联网实时信…

中间件-缓存、索引、日志

文章目录 缓存中间件本地缓存中间件分布式缓存中间件全文索引中间件分布式日志中间件小结 缓存中间件 缓存是性能优化的一大利器 我们先一起来看一个用户中心查询用户信息的基本流程 这时候,如果查找用户信息这个 API 的调用频率增加,并且在整个业务流…

强化学习(四)动态规划——1

动态规划算法(DP):在马尔可夫决策过程(MDP)的完美环境模型下计算最优策略。但其在强化学习中实用性有限,其一是它是基于环境模型已知;其二是它的计算成本很大。但它在理论伤仍然很重要&#xff…

Vscode 顶部Menu(菜单)栏消失如何恢复

Vscode 顶部Menu(菜单)栏消失如何恢复? 首先按一下 Alt按键,看一下是否恢复了菜单栏如果恢复了想了解更进一步的设置,或是没能恢复菜单栏,可以看后续。 1.首先点击左下角 齿轮,打开settings; 或者 直接 ctrl 逗号 …

如何本地搭建Splunk Enterprise数据平台并实现任意浏览器公网访问

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 本文主要介绍如何简单几步,结合cpolar内网穿透工具实现随时随地在任意浏览器,远程访问在本地…

java SSM项目预算生成管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM项目预算生成管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的 源代码和数据库,系统主…