| // Copyright (c) 2017, Google Inc. |
| // |
| // P4_16 specification for a Class ID assignment table. |
| // Note: This code has not been tested and is expected to contain bugs. |
| |
| #ifndef P4_SPEC_CLASS_ID_P4_ |
| #define P4_SPEC_CLASS_ID_P4_ |
| |
| #include "headers.p4" |
| #include "parser.p4" |
| |
| //------------------------------------------------------------------------------ |
| // Packet Classification |
| //------------------------------------------------------------------------------ |
| |
| control class_id(inout parsed_packet_t hdr, |
| inout local_metadata_t local_metadata, |
| inout standard_metadata_t standard_metadata) { |
| |
| @proto_package("class_id") |
| action set_class_id(@proto_tag(1) bit<8> class_id_value) { |
| local_metadata.class_id = class_id_value; |
| } |
| |
| @proto_package("class_id") |
| table class_id_assignment_table { |
| key = { |
| hdr.ethernet.ether_type: exact @proto_tag(1); |
| |
| hdr.ipv4_base.ttl: ternary @proto_tag(2); |
| hdr.ipv6_base.hop_limit: ternary @proto_tag(3); |
| hdr.ipv4_base.dst_addr: ternary @proto_tag(4); |
| hdr.ipv6_base.dst_addr: ternary @proto_tag(5); |
| hdr.ipv4_base.protocol: ternary @proto_tag(6); |
| hdr.ipv6_base.next_header: ternary @proto_tag(7); |
| |
| local_metadata.l4_src_port: ternary @proto_tag(8); |
| local_metadata.l4_dst_port: ternary @proto_tag(9); |
| |
| hdr.vlan_tag[0].vid: ternary @proto_tag(10); |
| hdr.vlan_tag[0].pcp: ternary @proto_tag(11); |
| } |
| actions = { |
| @proto_tag(1) set_class_id; |
| } |
| const default_action = set_class_id(0); |
| } |
| apply { |
| class_id_assignment_table.apply(); |
| } |
| |
| } // end class_id |
| |
| #endif // P4_SPEC_CLASS_ID_P4_ |