SRv6项目实践(三):P4Runtime基础以及交换机控制

news2025/1/19 14:32:48

在正式介绍P4runtime基础之前,先说一说P4的编译和实现的过程

  • bmv2.json:p4文件经过编译器编译以后会生成bmv2.json文件,此文件以JSON格式定义BMv2 simple_switch目标的配置。当simple_switch接收到新的数据包时,它使用此配置以与P4程序一致的方式处理数据包。
  • p4info.txt:该文件包含了各个表和操作,它们的id用一个索引值来表示,比如a表用b操作,不会直接说用名字为B的操作,而是说用索引为xxx的操作,然后锁定到b上执行相关的功能,其次,用了一个bitwith来描述,要访问的数据的比特长度是多长。

  • p4c编译器将p4编译成两份文件,其中一份是p4info.txt,另一份是bmv2.json(在bmv2这个p4target中是这种格式),将这两个文件再整合起来,作为配置,放到交换机中。另一方面,P4 Info也会将进入给控制器供控制器去查询,当控制器拿到P4 Info之后,即可透过P4 Info来产生P4 Runtime的讯息。

  • 从右边的图可以看出,控制平面和P4Runtime服务器是以p4runtime.proto的rpc支持的,具体可以看下文,介绍了P4和P4runtime的具体工作

P4 与 P4Runtime 介绍 - 知乎 (zhihu.com)

1.创建数据平面与控制平面环境

通过make start,我们创建了两个容器,其中一个是mininet另一个是onos,但是在本文中没有被用到。(我这里用的是restart)

用make mn-log可以查看数据平面的基本创建信息

这个拓扑如顶上的那幅图所示,是一个2x2的拓扑,其中h1a h1b h1c被划在一个子网中,其他在别的子网,mininet容器被创建以后,在tmp文件夹的每一个转发设备下生成了三个文件

  • tmp/leaf1/stratum_bmv2.log:包含了叶节点的stratum_bmv2日志
  • tmp/leaf1/chassis-config.txt: Stratum“机箱配置”文件,用于指定交换机启动时使用的初始端口配置;该文件由mininet/topo-v6.py调用的StratumBmv2Switch类自动生成。
  • tmp/leaf1/write-reqs.txt: 交换机处理的所有P4Runtime写入请求的日志(如果交换机未接收到任何写入请求,则该文件可能不存在)。

2.使用P4Runtime

在本部分中,我们将使用P4Runtime Shell,这是一个交互式Python CLI,可用于连接P4Runtime服务器并运行P4Runtime命令。例如,它可以用于创建、读取、更新和删除流表条目。

shell可以在两种模式下启动,有或没有P4管道配置。在第一种情况下,shell将使用P4Runtime SetPipelineConfig RPC将给定的管道配置推送到交换机;在第二种情况下,shell将尝试检索交换机中当前配置的P4Info。

在这两种情况下,shell都会使用P4Info文件做如下工作:

  • 允许使用P4Info名称而不是数字ID来指定运行时实体,例如表条目(更容易记忆和读取)
  • 提供自动补全功能
  • 验证CLI命令

最后,连接P4runtime服务器,有几个重要项:

util/p4rt-sh --grpc-addr localhost:50001 --config 
p4src/build/p4info.txt,p4src/build/bmv2.json --election-id 0,1
  • util/p4rt-sh:这是一个使用p4runtime的工具
  • --grpc-addr localhost:50001:grpc的远程过程调用,下图所示,每一个p4rumtime server都对应了一个转发设备,所以如果我们要同时控制所有的交换机,我们要访问4个server,这个远程过程调用的p4runtime服务器就放在在BMV2这个转发实体上,我们在本机中,要访问他们,就等于是同时访问了4台服务器,这里只先访问一台。

 

 --config p4src/build/p4info.txt,p4src/build/bmv2.json:这个配置包含了两个关键文件,一个是bmv2.json文件,另一个是P4info文件:分别描述了交换机的行为模型的具体行为,P4info则指定可通过P4Runtime访问的P4实体的元数据,实体与P4源代码中的实例化对象具有一一对应关系,在运行时安装表条目时需要该文件,额外的,还有一个重要的事情,我们可以看到这两个文件是在build下的,是编译后的,所以我们需要先make p4-build才可以使用rumtime

--election-id 0,1 当连接到P4Runtime服务器时,规范要求我们提供一个主控权选举ID,以便能够写入状态,例如管道配置和表条目,通过这个指令,我们可以访问到数据平面交换机leaf1

 好的,现在我们进来了rumtime的命令行,我们可以用各种指令访问到p4交换机它现在身上的表和操作或者计数器有哪些,也可以访问到表、操作、计数器对应的值,让我们来看看吧!如果想知道一个table的具体内容,可以用tables["IngressPipeImpl.<tab>"]来访问。

 

这里有一些功能和表是涉及到后面的代码的,我们先不在乎这些,就看看这几个访问的指令的用法就好了,分别是:tablesactionsaction_profilescountersdirect_counters

大家还可以看看添加表项或者counter的用法,这里就不多说了:

3.P4runtime操作leaf1

首先,使用make mn-cli这个命令,打开mininet的命令行

  • NDP:为了能够ping同一子网中的两个IPv6主机,首先,主机需要使用邻居发现协议(NDP)解析其各自的MAC地址,这相当于IPv4网络中的ARP。例如,当尝试从h1a ping h1b时,h1a将首先生成NDP邻居请求(NS)消息以解析h1b的MAC地址。一旦h1b接收到NDP NS消息,它就应该用具有它自己的MAC地址的NDP邻居广告(NA)来回复。现在,两个主机都知道彼此的MAC地址,并且可以交换ping数据包。
  • 如果使用P4Runtime正确编程,交换机应该能够处理NDP数据包(请参阅l2_ternary_table),但是,为了使事情变得简单,让我们在主机中插入两个静态NDP条目

为两个主机设计静态的条目,在这里,主机1a把1b的ipv6地址和以太网地址对上,然后用h1a的以太网0接口这个网卡来交互

h1a ip -6 neigh replace 2001:1:1::B lladdr 00:00:00:00:00:1B dev h1a-eth0
h1b ip -6 neigh replace 2001:1:1::A lladdr 00:00:00:00:00:1A dev h1b-eth0

使用ip neigh show就可以查看邻居了

 

 但是现在呢,你尝试去ping双方并没有用,因为,就算你主机知道在哪,p4交换机不知道

 为了让交换机能够转发,我们需要做出如下设置,正好对应了顶上的图

Match (Ethernet dest)Egress port number
00:00:00:00:00:1B4
00:00:00:00:00:1A3

 在p4runtime的命令行中,输入:

te = table_entry['IngressPipeImpl.l2_exact_table'](action='IngressPipeImpl.set_egress_port')
te.match['hdr.ethernet.dst_addr'] = '00:00:00:00:00:1A'
te.action['port_num'] = '3'
te.insert()

te = table_entry['IngressPipeImpl.l2_exact_table'](action='IngressPipeImpl.set_egress_port')
te.match['hdr.ethernet.dst_addr'] = '00:00:00:00:00:1B'
te.action['port_num'] = '4'
te.insert()

这样就打了两个表项进去了,注意格式,是:

  • tables[要插的表](要做的操作)
  • match[匹配的数据]=数据的值
  • action[操作的数据]=数据的值
  • insert()完成插入

到此,我们就成功插入了表项了,来看看表项:

好了,我们实现了双方的互ping,实验很简单,主要是对操作以及原理的理解。 

 

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

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

相关文章

24.Spring练习(spring、springMVC)

目录 一、Spring练习环境搭建。 &#xff08;1&#xff09;设置服务器启动的展示页面。 &#xff08;2&#xff09;创建工程步骤。 &#xff08;3&#xff09;applicationContext.xml配置文件。 &#xff08;4&#xff09;spring-mvc.xml配置文件。 &#xff08;5&…

新建论文三线表模板,一键格式刷

论文三线表模板 写在最前面①表设计&#xff0c;新建表格样式②三线表上下线③三线表标题线④设置表格居中⑤设置表头格式容易出错的步骤 写在最前面 论文写完啦&#xff0c;准备调整格式 之前建模也是三线表&#xff0c;但只能基于该文档模板&#xff0c;所以重新设置一下。 …

linux speedtest-cli工具测试网络带宽、测试网速(下载速度、上传速度和延迟等信息)

speedtest-cli是一个命令行工具&#xff0c;用于测试网络的带宽。它可以在Linux、macOS和Windows等操作系统上运行。下面是使用speedtest-cli测试网络带宽的步骤&#xff1a; 安装speedtest-cli。在Linux系统上&#xff0c;可以使用以下命令安装&#xff1a; sudo apt-get in…

cookies 和 Session

并且注意 meta complete改为“false”,不然不支持Servlet注解 Session会话 会话&#xff1a;用户打开一个浏览器&#xff0c;点击了很多超链接&#xff0c;访问了 有状态会话&#xff1a;一个同学曾今来过教室&#xff0c;下次再来教室&#xff0c;我们会知道这个同学&#…

verdaccio搭建npm私服

1 安装依赖 npm install verdaccio -g开机自启 npm install pm2 -g2启动服务 pm2 start verdaccio 进入页面 http://localhost:4873/ 其他 修改 config.yaml 源为淘宝源 uplinks:npmjs:url: https://registry.npm.taobao.org/

【花雕学AI】真是太多了:汇总国内免费在线使用ChatGPT的完整镜像站列表大全(1000+)

一、ChatGPT为什么火爆&#xff1f; 它是一个可以和你聊天的人工智能程序&#xff0c;它可以用文字回答你的问题&#xff0c;也可以根据你的提示写出文章、歌词、代码等内容。ChatGPT是由一个叫OpenAI的机构开发的&#xff0c;它使用了一种叫做GPT的技术&#xff0c;这种技术可…

[Android+JetPack] (Java实现) Retrofit2+RxJava3+Paging3+RecyclerView 实现加载网络数据例子 记录

文章目录 前言参考链接依赖库及版本Demo效果接口及数据展示各项模块Retrofit2Bean,对应上面的接口返回.Service API部分 Paging3PagingSource以及 RxPagingSourcePagingDataAdapter 适配器ViewModelPublicInfoPage /Activity 最后 前言 继续安卓学习之旅,本章的主要目标是: 1.完…

2023年mathorcup杯A题代码小技巧总结

写篇杂文&#xff0c;不属于我的任何一个栏目&#xff0c;没啥案例含义&#xff0c;主要是记录一下mathorcup杯期间写的代码技巧。 mathorcup杯大部分都是组合优化问题&#xff0c;这让我擅长的机器学习都深度学习毫无作用....... 还好这个A题是可以遍历求所有解的&#xff0c…

SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇

文章目录 通过CSV文件创建物料主数据的一些建议在DIF中使用CSV文件文件转换器类型BAdIBAdI 示例代码测试 DIF全篇总结 通过CSV文件创建物料主数据的一些建议 在Staging Area中创建/修改小批量的物料主数据&#xff0c;推荐使用标准文件上载功能&#xff08;USMD_FILE_UPLOAD&am…

计算机基础--Redis

参考文献 https://zhuanlan.zhihu.com/p/599663544 基础知识 1. Redis的数据类型及使用场景 Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff…

使用assembly插件对boot项目打zip和war部署包

目录 一、maven-assembly-plugin插件的简单使用 1、什么是assembly&#xff1f; 2. 常见的maven插件 3、如何使用&#xff1f; 二、如何通过assembly打不同的包 三、boot项目如何转成war包部署 背景&#xff1a;之前项目上已经使用了assembly对多个boot项目分别打zip包且…

MATLAB应用笔记

其他 1、NaN值 MATLAB判断数据是否为NaN可以直接使用函数&#xff1a;isnan() 三、数据分析 1、相关性 均值、方差、协方差、标准差、相关系数 mean() %均值 nanmean()%去除NAN值求均值 var() %方差 cov() %协方差 std() %标准差 corrcoef(B,b) %R 相关系数plot()…

[ 云原生 | Docker ] 构建高可用性的 SQL Server:Docker 容器下的主从同步实现指南

文章目录 一、前言二、SQL Server 主从同步的原理介绍三、具体的搭建过程3.1 准备工作3.1.1 卸载旧版本&#xff08;如果有&#xff0c;可选&#xff0c;非必须&#xff09;3.1.2 安装 Docker3.1.3 验证本地 Docker 是否安装成功 3.2 创建 Docker 网络3.3 创建主从节点的 SQL S…

部署环境从docker swarm迁移到k8s后kie-server的发布方式变化(二)

正如后来的考虑, 如果外接maven私库照理说是ok的, 这样去掉volume的设计整个流程更加的自动化标准化. 开搞 第一步先部署一个nexus yaml文件如下: apiVersion: v1 kind: Namespace metadata:name: nexus---apiVersion: v1 kind: Service metadata:labels:k8s-app: nexusname…

【数据结构与算法】八大排序

[数据结构与算法]八大排序 数据结构与算法-八大排序排序的概念及其应用排序的概念排序的应用 常见的排序算法实现常见的排序算法插入排序直接插入排序希尔排序(缩小增量排序)希尔排序的时间复杂度希尔排序对插入排序的优化效果 选择排序直接选择排序堆排序向上调整建堆&#xf…

【C语言】从n个字符串中匹配查找abc字符串个数

目录 前言知识点重温1、scanf和scanf_s区别2、指针3、char、char*使用查找字符串收尾前言 这是小5聊的《C语言知识点例子》系列的第四篇文章。 在软件行业已经有快十年,技术虽然一般般,但是足够应付和解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自…

数据库基础篇 《1. 概述》

目录 1. 为什么要使用数据库 2. 数据库与数据库管理系统 2.1 数据库的相关概念 2.2 数据库与数据库管理系统的关系 2.3 常见的数据库管理系统排名(DBMS) 2.4 常见的数据库介绍 3. MySQL介绍 3.1 概述 3.2 MySQL发展史重大事件 4. RDBMS 与 非RDBMS 4.1 关系型数据库…

Delphi Web Server 流程分析

通过向导 "Web Server Application" (选择 "Stand-alone GUI Application") 创建一个 WebServer Demo。 主单元代码: ...... private FServer: TIdHTTPWebBrokerBridge; procedure StartServer; ............. Delphi的网络组件是基于INDY的&a…

项目四:无极调光台灯

项目四&#xff1a;无极调光台灯 文章目录 项目四&#xff1a;无极调光台灯一、导入(5分钟&#xff09;学习目的 二、新授(65分钟)1.预展示结果(5分钟)2.本节课所用的软硬件(5分钟)3.硬件介绍(5分钟)4.图形化块介绍(10分钟)5.单个模块的简单使用(10分钟)6.无极调光台灯编程逻辑…

SQLServer的内存管理架构

内存管理架构说明 一、Windows的虚拟内存管理器二、SQL Server 内存体系结构2.1、传统&#xff08;虚拟&#xff09;内存2.2、地址窗口扩展 &#xff08;AWE&#xff09; 内存 三、从 SQL Server 2012 &#xff08;11.x&#xff09; 开始发生的改变3.1、对内存管理的更改3.2、对…