元数据是用来携带数据和配置性的东西,元数据的申明与包头类似,但在实例化的时候有所不同,而且包头和元数据在字段值的约束上存在一定的差别。
元数据分为两种,一种是用来携带P4程序运行过程中产生的数据的用户自定义元数据(User-Defined Metadata),如首部字段的运算结果等。另一种是固有元数据(Intrinsic Metadata),用于携带交换机自身的配置信息,如数据包进入交换机时的端口号等。
自定义元数据
开发者自定义metadata,定义方式和header一样。
然后可以直接应用在Action和Control里。
固有元数据
可以直接使用。
有8种固有元数据,这些元数据携带了数据包相关的状态信息。
**ingress_port :**数据包的入端口,解析之前设置,只读。
**packet_length:**数据包的字节数,当交换机在快速转发模式下,该元数据不能在动作(action)中匹配或引用。只读。
**egress_spec :**在入端口流水线的匹配-动作过程之后设置,指定数据包出端口,可以是物理端口、逻辑端口或者多播组。
**egress_instance :**用于区分复制后数据包实例的标识符。只读。
**instance_type:**数据包实例类型:正常(Normal)、入端口复制(ingress clone)、出端口复制(egress clone)、再循环(recirculated)。
**parser_sratus :**解析器解析结果,0表示无错误,其实数字代表了对应的错误类型。
**parser_error_location :**指向P4程序错误发生处。