blob: 326dce7f28bdbb1dd8f89d27c61ebe789ac82bac [file] [log] [blame]
// 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_