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

目录

  • 一. 实验目的
  • 二.阅读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.mzph.cn/news/640318.shtml

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

相关文章

TensorRT部署--Linux(Ubuntu)环境配置

系列文章目录 TensorRT环境配置–Linux(Ubuntu) 文章目录 系列文章目录前言一、环境配置二、CUDA下载安装三、cuDNN下载安装四、TensorRT下载安装五、模型创建总结 前言 TensorRT部署-Windows环境配置: https://blog.csdn.net/m0_70420861/article/details/135658922?csdn_s…

深入了解WPF控件:常用属性与用法(六)

掌握WPF控件:熟练常用属性(六) ListView 用于展示数据项集合的列表控件。它提供了丰富的功能和灵活的定制性,可以轻松地展示和编辑大量的数据。 常用属性描述ItemsSource用于设置ListView的数据源。可以是一个集合、数组或列表…

透明拼接屏代工:专业制造与质量保证

透明拼接屏代工是指专业的代工厂家根据客户的需求,为其生产透明拼接屏产品。随着透明拼接屏市场的不断扩大,越来越多的企业选择通过代工方式快速进入市场。尼伽小编将深入探讨透明拼接屏代工的优势、选择合适的代工厂家以及质量保证等方面的内容。 一、透…

深度学习记录--指数加权平均

指数加权移动平均(exponentially weighted moving averages) 如何对杂乱的数据进行拟合? 通过指数加权平均可以把数据图近似拟合成一条曲线 公式: 其中表示第t个平均数,表示第t-1个平均数,表示第t个数据,表示变化参数…

【测试入门】测试用例经典设计方法 —— 因果图法

01、因果图设计测试用例的步骤 1、分析需求 阅读需求文档,如果User Case很复杂,尽量将它分解成若干个简单的部分。这样做的好处是,不必在一次处理过程中考虑所有的原因。没有固定的流程说明究竟分解到何种程度才算简单,需要测试…

IP2325 5V输入双节串联锂电池升压充电IC 英集芯参数

简介 IP2325是一款支持双节串联锂电池/锂离子电 池的升压充电管理IC。 IP2325集成功率MOS,采用同步开关架构, 使其在应用时仅需极少的外围器件,并有效减小整 体方案的尺寸,降低BOM成本。 IP2325的升压开关充电转换器工作频率500K…

免费的WordPress插件大全

在当今数字化的时代,拥有一个强大的在线存在变得至关重要。而对于使用WordPress建站的用户来说,插件是提高网站功能的关键。在这篇文章中,我们将为您推荐三款免费的WordPress插件,它们不仅是147SEO软件中的佼佼者,而且…

《WebKit 技术内幕》学习之五(3): HTML解释器和DOM 模型

3 DOM的事件机制 基于 WebKit 的浏览器事件处理过程:首先检测事件发生处的元素有无监听者,如果网页的相关节点注册了事件的监听者则浏览器会将事件派发给 WebKit 内核来处理。另外浏览器可能也需要处理这样的事件(浏览器对于有些事件必须响应…

makefile 编译动态链接库使用(.so库文件)

makefile 编译动态链接库使用(.so库文件) 动态链接库:不会把代码编译到二进制文件中,而是在运行时才去加载, 好处是程序可以和库文件分离,可以分别发版,然后库文件可以被多处共享 动态链接库 动态&#…

vue3项目eslint配置、配置prettier(格式化配置)

文章链接: 全部配置链接 第一步:eslint配置、配置prettier(代码格式化):点击链接 (1) .eslint.cjs—eslint配置文件 (2).eslintignore—校验忽略文件 (3).prettierrc.json添加规则 (4).prettierignore忽略文件 prettierrc规范说明: npm install -D eslint-plugin-import…

gdip-yolo项目解读:gdip模块 |mdgip模块 |GDIP regularizer模块的使用分析

gdip-yolo是2022年提出了一个端到端的图像自适应目标检测框架,其论文中的效果展示了良好的图像增强效果。其提出了gdip模块 |mdgip模块 |GDIP regularizer模块等模块,并表明这是效果提升的关键。为此对gdip-yolo的项目进行深入分析。 gdip-yolo的论文可以…

第15届蓝桥杯嵌入式省赛准备第三天总结笔记(使用STM32cubeMX创建hal库工程+串口接收发送)

因为我是自己搞得板子,原本的下程序和串口1有问题,所以我用的是串口2,用的PA2和PA3 一,使用CubeMX配置串口 选择A开头的这个是异步通信。 配置串口参数,往届的题基本用的9600波特率,所以我这里设置为9600…

C++——结构体

1,结构体基本概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。像int(整型),浮点型,bool型,字符串型等都是属于系统内置的数据类型。而今天要学习的结构体则是属于我们自定义…

导出 MySQL 数据库表结构、数据字典word设计文档

一、第一种 :利用sql语句查询 需要说明的是该方法应该适用很多工具,博主用的是navicat SELECT TABLE_NAME 表名,( i : i 1 ) AS 序号,COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE…

Linux: dev: glibc: 里面有很多的关于系统调用的函数

其实都没有实体源代码klogctl.c,而是通过编译时构造出来的源代码实体,比如klogctl这个函数,glibc的反汇编如下: 直接是0x67这个系统调用:103: Reading symbols from /usr/lib64/libc-2.28.so... (No debugg…

【C++】入门(一)

前言&#xff1a; 本篇博客将带大家认识C&#xff0c;熟悉基本语法 文章目录 认识CC的诞生与发展C 在行业中的运用 一、命名空间1.1 命名空间的定义1.2 命名空间的使用1.3 命名空间的访问 二、C输入&输出输出操作符 <<输入操作符 >>换行符和刷新输出缓冲区关键…

跟着我学Python进阶篇:03. 面向对象(下)

往期文章 跟着我学Python基础篇&#xff1a;01.初露端倪 跟着我学Python基础篇&#xff1a;02.数字与字符串编程 跟着我学Python基础篇&#xff1a;03.选择结构 跟着我学Python基础篇&#xff1a;04.循环 跟着我学Python基础篇&#xff1a;05.函数 跟着我学Python基础篇&#…

java实现将集合数据导入excel表格之竖向

这里使用的是apache.poi&#xff0c;当然如果使用easyExcel也可以实现 括号是EasyExcel官网&#xff08;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel&#xff09; 找到填充&#xff0c;都会有相对应的demo实列 下面是我写的apache.poi实现代码 public static vo…

初学python系列: pandas操作excel

媳妇工作中经常用到excel处理&#xff0c;想用python处理excel更高效&#xff0c;所以自学了python&#xff0c;觉得python比Java还是简单多了&#xff0c;没有变量类型声明&#xff0c;比Java也就多了元组&#xff0c;各种库很丰富。 需求是&#xff1a; 汇总两个excel中 列&…

2024年 复习 HTML5+CSS3+移动web 笔记 之CSS遍

28-第三天课程介绍_哔哩哔哩_bilibili CSS 第一天 1.1 引入方式 1.2 选择器 1.3 画盒子 div 独占一行 1.4 文字控制 div 外层 1.5 调试工具 F12 1.5 综合案例 一 新闻详情 1.6 综合案例 二 CSS 简介 CSS 第二天 2.1 复合选择器 2.2 伪类选择器 2.3 CSS 特性 2.4 Emmet 写法 2.5…