因为最近用到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 |
|