发布网友 发布时间:21小时前
共1个回答
热心网友 时间:21小时前
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编程基础-云社区-华为云