前言
可以通过此博客了解P4部署硬件的流程以及编程结构,对重要的match-action部分内容进行了补充。
本文目录
- 前言
- P4语言
- P4架构模型
- P4可编程块
- P4编程举例
- 头定义
- 解析器实现
- 什么是 match-action pipeline?
- 控制块:table实现
- key
- action
- 其他属性
- 控制块:apply块实现
- P4 程序编译和执行
- 参考资料
P4语言
- P416在P414的基础上降低了语言的复杂度以及提供了核心语言库。
- 最重要的就是P416引入了P4架构模型,定义给定数据平面存在的所有功能块。
P4架构模型
下面是P4通用架构模型介绍:
- 数据包将以流水线的形式被处理,将逐个访问所有块。
- 所有块分为固定块和可编程块。
tips:P4部署设备有好几种,每一种的架构细看不太一样,需要根据厂商给的架构模型来设计程序。目前我所了解到的由V1MODLE、PSA、PISA、VSA、TNA。
- PISA架构中所有块都是可编程的
P4可编程块
- 解析器:一种状态机,标识正在处理的数据包头。
- 控制块:匹配-动作表、执行检查和验证、解析等。
P4编程举例
头定义
所有需要使用的协议都需要自定义格式;左边的片段定义了ethernet的头部和ipv4的报头,右上片段自定义了一个协议报头,右下片段可以将所有结构体结合在一个结构体中。
解析器实现
- 解析器就像一个状态机,定义每个状态的结构。
什么是 match-action pipeline?
- pipeline中每个独立的control块有独立的表
控制块:table实现
- 表块分为action和table部分,其中table里面有一个key用于匹配定义条件,action定义相关操作。
补充资料:P4语法(3)Table,Action - 水喵桑 - 博客园 (cnblogs.com)
匹配动作表定义了匹配字段(key)、动作(action)等相关属性,其处理数据包的流程:
- 建立其匹配字段key
- 数据包中去匹配table中的key中的字段,并获得要执行的"action"。
- 执行动作action
key
key由一个个表单对组成(e:m),其中e是对应数据包中匹配的字段,而m是一个match_kind常数用来表示匹配的算法。
例如:
key = {hdr.ipv4.dstAddr:lpm;
}
就是以ipv4头的目的地址作为匹配字段,采用的是lpm(最长前缀字段)匹配方式。
p416 core现在提供三种默认的match_kind:
match_kind{ lpm,//最长前缀字段ternary,//三元匹配exact//完全匹配
}
action
table中的action list是列举了该table支持的action类型
- p4中在table里可以利用action去对封包做出处理,action非常类似于其他高级语言中所示的函数,抽象程度可以很高,并且表现出协议无关的特性,同时也能体现一部分p4的扩展性。
- action可以读取控制平面(control plane)提供的数据进行操作,然后根据action的代码内容影响数据平面(data plane)的工作。
对于action的定义:
action action_name(parameter1,parameter2,……){//语句块
}
p4有提供不少基本操作(Primitive Actions),这些action高度抽象。在p416中,大部分的基本操作被移动到了一些函数库中(arch.p4或者vendor.p4),部分操作依然保留在了core.p4中。另外,更多详细的内容可以在spec查看。
例如,ipv4转发的code:
action ipv4_forward(bit<48> dstAddr,bit<9> port){standard_metadata.egress_spec = port;hdr.ethernet.srcAddr = hdr.ethernet.dstAddr;hdr.ethernet.dstAddr = dstAddr;hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
}
其他属性
p416提供了一些预设的其他属性:
- default_action:当table miss的时候执行的动作。
- counters:计数器
- size:table大小
- implementation:指定table实际运作方式,这部分通常取决于架构,例如v1model中action profile提供了通过hash的方式随机选择一个action profile member去执行。
- const entries:预设的table entry,在编译阶段会写到编译好的档案中。
控制块:apply块实现
- 每个控制块包含一个apply子块,定义数据包处理中那个表会被使用以及应用的顺序。
- 示例中的代码就是定义了ecmp_group和ecmp_nhop两个表的使用及顺序。
P4 程序编译和执行
- 检查设备符合的模型架构,了解模型功能以及限制
- 编写完整的P4代码
- 使用设备制造商提供的编译器编译P4代码
- 编译器将代码编译成特定的二进制文件,该二进制文件被加载到目标设备。
- 控制平面软件管理和控制由P4定义的数据平面,例如使用一些开源软件作为终端控制器。
参考资料
- 【P4可编程】ONF2021 P4Workshop-从四个维度看P4可编程交换机_哔哩哔哩_bilibili
- P416 Programming for Intel Tofino Using Intel P4 Studio - Vladimir Gurevich & Andy Fingerhut, Intel - YouTube
- P4 programming language - introduction to network programming with P4 - YouTube
Note:主要来源于第三个视频,讲的很好,适合浅显了解。深入了解建议直接看p4官网和官方库。