P4 Program

#include <core.p4> #include <v1model.p4> const int MAX_HOPS = 10; const int STANDARD = 0x00; const int HOPS = 0x01; typedef standard_metadata_t std_meta_t; header type_t { bit<8> tag; } header hop_t { bit<8> port; bit<8> bos; } header standard_t { bit<8> src; bit<8> dst; } struct headers_t { type_t type; hop_t[MAX_HOPS] hops; standard_t standard; } struct meta_t { } parser MyParser(packet_in pkt, out headers_t hdr, inout meta_t meta, inout std_meta_t std_meta) { state start { pkt.extract(hdr.type); transition select(hdr.type.tag) { HOPS: parse_hops; STANDARD: parse_standard; default: accept; } } state parse_hops { pkt.extract(hdr.hops.next); transition select(hdr.hops.last.bos) { 1: parse_standard; default: parse_hops; } } state parse_standard { pkt.extract(hdr.standard); transition accept; } } control MyVerifyChecksum(inout headers_t hdr, inout meta_t meta) { apply { } } control MyComputeChecksum(inout headers_t hdr, inout meta_t meta) { apply { } } control MyIngress(inout headers_t hdr, inout meta_t meta, inout std_meta_t std_meta) { action allow() { } action deny() { std_meta.egress_spec = 9w511; } table acl { key = { hdr.standard.src : exact; hdr.standard.dst : exact; } actions = { allow; deny; } const entries = { (0xCC, 0xDD) : deny(); } default_action = allow(); } apply { std_meta.egress_spec = (bit<9>) hdr.hops[0].port; hdr.hops.pop_front(1); if (!hdr.hops[0].isValid()) { hdr.type.tag = 0x00; } acl.apply(); } } control MyEgress(inout headers_t hdr, inout meta_t meta, inout std_meta_t std_meta) { apply { } } control MyDeparser(packet_out pkt, in headers_t hdr) { apply { pkt.emit(hdr.type); pkt.emit(hdr.hops); pkt.emit(hdr.standard); } } V1Switch(MyParser(), MyVerifyChecksum(), MyIngress(), MyEgress(), MyComputeChecksum(), MyDeparser()) main;

Input Packet

Output Packet and Port