# P4 Tutorial 快速上手 (4) P4Runtime

2023-11-09 08:10
文章标签 快速 tutorial p4 p4runtime

本文主要是介绍# P4 Tutorial 快速上手 (4) P4Runtime,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

P4 Tutorial 快速上手 (4) P4Runtime

提示:本系列仅适用于软件交换机BMv2
P4 Tutorial 快速上手系列 (1)
P4 Tutorial 快速上手系列 (2)


文章目录

  • P4 Tutorial 快速上手 (4) P4Runtime
  • 简介
  • P4Runtime协议是?
  • Exercises说明
  • mycontroller.py
  • 测试
  • 总结
  • 附录


简介

代码库链接:https://github.com/p4lang/tutorials/tree/master/exercises/p4runtime
为了介绍用于向P4交换机下发策略的P4Runtime协议,官方教程中提供了基于Python的简易控制器(位于tutorials/utils/p4runtime_lib),并提供了相应的练习帮助理解。因此,本节围绕exercises中p4runtime进行说明,该练习所使用的P4程序为advanced_tunnel.p4,与之前的教程不同,该练习中P4文件已经被修改完善。其在上一篇中的basic_tunnel.p4的基础上增加了在交换机内部添加隧道头、按隧道转发与删除隧道头功能,读者需要对mycontroller.py进行修改,将缺少的流表规则下发到交换机中并远程监测交换机的计数器状态


P4Runtime协议是?

P4Runtime
P4Runtime是一组控制平面规范,是基于Protobuf以及gRPC框架的协议,用于控制由 P4 程序定义的设备或程序的数据平面实体。图 1 表示 P4 运行时参考体系结构。逻辑上,控制器位于顶部,转发设备或目标位于底部。P4Runtime 仅为每个读/写实体授予对单个主控制器的写入访问权限。P4Runtime 允许每个角色使用一个主控制器,并且基于角色的客户端仲裁方案确保只有一个控制器对每个读/写实体或管道配置本身具有访问权限。任何控制器都可以对任何实体或管道配置执行读取访问。关于P4Runtime API的介绍可以在此处找到:P4Runtime Specification

Exercises说明

该练习需关注的文件包括advanced_tunnel.p4mycontroller.py

在P4源程序中,首先,在Ingress中添加了两个计数器用于监测以网内隧道转发的数据包个数:

counter(MAX_TUNNEL_ID, CounterType.packets_and_bytes) ingressTunnelCounter;
counter(MAX_TUNNEL_ID, CounterType.packets_and_bytes) egressTunnelCounter;

其次,增添了两个action:

action myTunnel_ingress(bit<16> dst_id) {hdr.myTunnel.setValid();hdr.myTunnel.dst_id = dst_id;hdr.myTunnel.proto_id = hdr.ethernet.etherType;hdr.ethernet.etherType = TYPE_MYTUNNEL;ingressTunnelCounter.count((bit<32>) hdr.myTunnel.dst_id);}
action myTunnel_egress(macAddr_t dstAddr, egressSpec_t port) {standard_metadata.egress_spec = port;hdr.ethernet.dstAddr = dstAddr;hdr.ethernet.etherType = hdr.myTunnel.proto_id;hdr.myTunnel.setInvalid();egressTunnelCounter.count((bit<32>) hdr.myTunnel.dst_id);}

对于myTunnel_ingress,其为数据包增添了隧道包头,并希望根据流表规则插入目的地id(dst_id)。与之相反的是myTunnel_egress,在删除隧道包头的同时修改目的地mac地址。值得一提的是counter的用法,计数器将对对应索引地址计数。

在简易控制器mycontroller.py中,首先需要注意的是导入的包。

import p4runtime_lib.bmv2
import p4runtime_lib.helper
from p4runtime_lib.switch import ShutdownAllSwitchConnections

Lib文件夹位于tutorials/utils/p4runtime_lib中(后续若改用高级控制器可以略过),包括了一些用于控制数据平面的工具库,上述代码中涉及到bmv2.py/helper.py/switch.py三个文件。其中,helper.py主要负责与P4info文件的交互,switch.py主要负责对交换机的一系列操作(连接/读写流表等)。

教程重点在于使用该简易控制器体验实际的控制平面与数据平面的交互流程。

mycontroller.py

程序的主函数首先对P4info和json文件的检查,然后执行main()程序。main()程序逻辑如下:

  1. 连接交换机s1和s2
  2. 成为si和s2的主控制器
  3. 安装P4info与json文件
  4. 将隧道规则写入s1和s2流表
  5. 读取s1和s2的流表规则(记得取消注释)
  6. 每2秒统计一次各交换机ingress和egress计数器的值
  7. 当程序结束市会断开与所有交换机的连接

其中第4步中writeTunnelRules()与第5步readTableRules()是不完整的,需要对其进行修改,其中用到的方法均在tutorials/utils/p4runtime_lib/helper.py文件中。

对于方法writeTunnelRules(),需要补充安装transit tunnel表项的程序段,仿照其他tunnel表项的插入程序即可:

table_entry = p4info_helper.buildTableEntry(table_name="MyIngress.myTunnel_exact",match_fields={"hdr.myTunnel.dst_id": tunnel_id},action_name="MyIngress.myTunnel_forward",action_params={"port": SWITCH_TO_SWITCH_PORT})ingress_sw.WriteTableEntry(table_entry)print("Installed transit tunnel rule on %s" % ingress_sw.name)

注意advanced_tunnel.p4定义的动作myTunnel_forward只需要一个端口参数,由于是在交换机间传输,选择topology.json所设置的端口2即可(s1端口2与s2端口2相连接),mycontroller.py在程序第十九行定义了SWITCH_TO_SWITCH_PORT=2,直接使用即可(方便理解程序)。

对于方法readTableRules(),其目标是从返回的报文解析出想要的表项信息,例如表的名字,匹配域的名字和值,动作的名字和值等,同样需要用到helper.py中get开头的方法。

for response in sw.ReadTableEntries():for entity in response.entities:entry = entity.table_entry# TODO For extra credit, you can use the p4info_helper to translate#      the IDs in the entry to namestable_name = p4info_helper.get_tables_name(entry.table_id)print('%s: ' % table_name, end=' ')for m in entry.match:print(p4info_helper.get_match_field_name(table_name, m.field_id), end=' ')print('%r' % (p4info_helper.get_match_field_value(m),), end=' ')action = entry.action.actionaction_name = p4info_helper.get_actions_name(action.action_id)print('->', action_name, end=' ')for p in action.params:print(p4info_helper.get_action_param_name(action_name, p.param_id), end=' ')print('%r' % p.value, end=' ')print()

这里需要注意程序段首先调用了switch.py的ReadTableEntries()方法以获取table_id,基于helper.py的注释可以知道通过get_tables_name获取表名,以供其他get_……方法传参,从而print表项。

测试

该部分测试参照README.md即可

总结

以上就是本系列(4)的主要内容,该教程由于涉及控制平面与数据平面交互,并且使用的是教程制作者提供的lib库,较之前的教程更为复杂,主要是感受使用P4runtime协议完成从上至下的控制,后续建议使用成熟的商业网络控制器(e.g. ONOS/ODL)。

附录

mycontroller.py完整程序

这篇关于# P4 Tutorial 快速上手 (4) P4Runtime的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/374945

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析