因为最近用到p4,总结一下p4的学习
P4概念
P4由以下部分构成
- Headers
 - Parsers
 - Tables
 - Actions
 - Control Programs
 
Headers
用来形容the sequence and structure of a series of fields,包括了字段的宽度和字段值的限制。
1  | header ethernet {  | 
Parsers
P4用一个transition的集合来表示state machine,用来提取字段的value,然后发送到match+action表。论文给了一个示例
1  | parser start {  | 
解析从start state开始。知道一个显式声明的stop state结束(或者遇到一个unhandled case报错)。
遇到一个新的header的state,状态机会提取出header然后继续下一次处理,被提取出的头会被发送到match+action进行处理。
Table Specification
1  | table mTag_table {  | 
reads属性声明match什么字段,指定match的类型(exact, ternary)等。
actions属性列举所有对packet的可能行为
max_size属性声明table应该支持多少entries
Action Specifications
P4定义了一堆动作原语。每一个P4程序都通过动作原语定义新的动作。
如上文提到的add_mTag
1  | action add_mTag(up1, up2, down1, down2, egr_spec) {  | 
如果action需要某些参数,如up1,会由match table在运行的时候提供。
p4的动作原语包括
- set_field
 - copy_field
 - add_header
 - remove_header
 - increment
 - checksum
 
The Control Program

主要通过函数、条件、对table的引用来完成。如以下代码完成了对上图的构建。
1  | 
  |