P4-16编程基础

发布网友 发布时间:20小时前

我来回答

1个回答

热心网友 时间:20小时前

P4项目源码可以在github上直接获取( https://github.com/p4lang )。


项目关系如下:


P4项目由很多个单独的模块组成,每个模块就是一个子项目,各子项目功能介绍如下:


整个过程由几部分组成,如下:


(1) 基础类型


示例:


(2)typedef 定义类型别名


设置类型别名,如:


(3)header 类型


header类型为有序的程序集合,特点如下:


示例:


(4)struct类型


struct类型为无序数据类型集合,且不需字节对齐。可用于元数据的组织。


示例:


(5)parser


类似于C语言的function声明关键字,可以有循环。通过一系列状态(state)执行与转换,提取报头字段与元数据。


示例如下:


parser的输入与输出


parser的输入与输出模型如下:


注意extern packet_in提供几个接口,说明如下:


parser的状态与转化


状态


parser有三种预设状态state,为:


其他states,用户可以自行定义。每个state执行0次或以上,然后转换为其他state。(允许循环)


转换


示例:


select声明类似C语言中的switch...case,但是其没有fall-through行为,不用break进行中断后续选择。


value_set


只能用在parser 语句块中。


emit


pkt.emit 不支持条件emit,mirror.emit支持单bit的条件emit


header stacks


头堆栈有两个属性next与last,其可以在解析器中解析时使用。


举例如下,使用如下mpls定义表示10个MPLS头:


mpls.next 表示 mpls 堆栈中的一个元素的值。初始时,mpls.next 指向堆栈的第一个元素,当成功调用extract方法后,mpls.next将自动向前偏移,指向下一个元素。 mpls.last指向 next 前面的那个元素(如果元素存在),即最近 extract 出来的那个元素。


注意:通过 next 或 last 属性访问头堆栈中不存在的元素将引发 transition reject 状态转换,并设置错误到 error.StackOutOfBounds


(6) control


对于固定硬件,SwitchIngress 控制流程的参数固定,如下:


示例:


上述程序的功能是:将源MAC与目的MAC对换,然后从输入口转发出去。


(7) action


上小结的功能可以通过简单的action语句重新实现:


action关键字的特点:


(8) table


table主要由key与actions两部分组成。 可选的,可以指定table其他属性,如:


示例:


一个table的表项包含如下几部分:


match-action 处理流程


大致过程主要分为两部分:


标准的匹配种类有:exact,ternary, lpm, index, range, valid


① exact 精确匹配


② ternary


基于三态内容寻址器的匹配,匹配表的每个表项都有一个掩码,将掩码和字段值进行逻辑与运算,再执行匹配。为了避免导致多条表项匹配成功,每条表项都需要设定一个优先级。对于每一个ternary字段,表项的值由两部分组成:value &&& mask,先value后mask,顺序一定不能错!mask表示在这个字段上希望匹配哪些bits,1表示匹配,0表示忽略。若匹配字段 & mask == value则匹配成功。例如:


当然,除了以const entries的形式写入表项,还可以通过P4 Controller 来写入。以下为如何构造一个新的表项(Python)


通过控制器写入表项时要注意一点,如果你不关心某个字段,应该直接在match_fields中直接不写该字段而不是将mask全设为0,这与const entries是不一样的。


③ lpm


lpm match: 最长前缀匹配,这是三重匹配的一种特殊情况,当多个表项匹配成功时,选择掩码最长的最为最高优先级进行匹配。


上述匹配方法定义在core.p4中:


v1model架构还支持range与selector匹配。


有些架构还支持regexp与fuzzy匹配。


(9) apply


在apply执行action,或将table应用。


示例:


(10) deparser


deparser将报头组装到数据报中,其不需要额外的新组建,使用control功能进行表示即可。


示例:


deparser的参数由两部分组成:


(1) 集合运算


①通用集合


default 或者_表示通用集合,包含指定类型的所有可能。


②debug


查看bmv 日志


③ 使用debug流表


使用table读取headers或metadata信息。如:


打印结果如下:


(2) 常用技巧


使用hdr.ipv4.frag_offset字段区分,如果为0,则解析,否则若数据报文分段,则不解析。


(3) P4Runtime


本节关注红框内的部分。


运行时控制方法比较


各运行时控制API优缺点总结如下:


可见,P4Runtime API可以做到目标与协议,那么,什么是P4Runtime?


Protocol Buffers基础


Protocol Buffers,简称protobuf,是一种序列化数据结构的协议。


gRPC基础


gRPC是一个高性能、通用的开源 RPC 框架,其由 Google 主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。


P4Runtime Service


使本地或远程实体能够仲裁主控权,加载管道/程序,发送/接收数据包,以及读写转发表条目,计数器和其他P4实体。


转载自: 1小时学会P4-16编程基础-云社区-华为云

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com