P4提供了一种称为Control的结构,它可以由多个表和命令语句组合成更大的代码块。
在 P4 裡面有两个主要的 control flow:ingress、 egress,这两个 control flow 分别代表了一个数据包的进入以及离开。
当 Parser 处理完数据包之后,会将相关的信息,例如解析出来的 header 以及 metadata 储存,然后交由 ingress 处理,ingress 会将封包送往不同的 table、更改数据包 header 内容、设定输出的 port 等等,最后再丢到一个 Queue 中。
Egress 则是会将 Queue 的信息拿出来,再一次的处理并且将数据包包送出、丢弃或是重新处理(recirculate)。
在control中,可以声明actions和tables,将actions和tables应用。
Egress spec/port
除了对数据包处理以外,数据包的转发也是网络设备的重要功能,要设定数据包送出去的port,只需要在ingress阶段中设定standard的egress_spec即可:
modify_field(standard_metadata.egress_spec,1);
egress_spec不一定只是一个port,他可以是一个route、VLAN fllod group或是multicast group,而这些要事先于switch中先定义好。
而在egress阶段可以通过standard_metadata取得egress_port这一个值(只读)来判断下一步做什么。