TNSM_Latency_Prediction / code / parser / example / ingress_parser.p4
ingress_parser.p4
Raw
parser IngressParser(packet_in        packet,
    /* User */
    out my_ingress_headers_t          hdr,
    out my_ingress_metadata_t         meta,
    /* Intrinsic */
    out ingress_intrinsic_metadata_t  ig_intr_md)
{
    /* This is a mandatory state, required by Tofino Architecture */
     state start {
        packet.extract(ig_intr_md);
        packet.advance(PORT_METADATA_SIZE);
        transition parse_ethernet;
    }

    state parse_ethernet {
        packet.extract(hdr.ethernet);
        transition select(hdr.ethernet.etherType) {
            ETHERTYPE_MPLS: parse_mpls;
            ETHERTYPE_IPV4: parse_ipv4;
            default: accept;
        }
    }

    state parse_mpls {
        packet.extract(hdr.mpls);
        transition select((packet.lookahead<bit<4>>())[3:0]) {
            4w0x4   : parse_ipv4; /* IPv4 only for now */
            default : accept;
        }
    }

    state parse_ipv4 {
        packet.extract(hdr.ipv4);
        transition select(hdr.ipv4.protocol) {
            IPPROTO_UDP  : parse_udp;
            IPPROTO_TCP  : parse_tcp;
            default      : accept;
        }
    }

    state parse_tcp {
        packet.extract(hdr.tcp);
        transition select(hdr.ipv4.dscp) {
            DSCP_INT     : parse_int_shim;
            default      : accept;
        }
    }

    state parse_udp {
        packet.extract(hdr.udp);
        transition select(hdr.ipv4.dscp) {
            DSCP_INT     : parse_int_shim;
            default      : accept;
        }
    }

    state parse_int_shim {
       packet.extract(hdr.int_shim);
       transition parse_int_meta;
    }

    state parse_int_meta {
        packet.extract(hdr.int_meta);
        transition select(hdr.int_shim.len) {
            8w7    : parse_int_metadata_stack2;
            8w5    : parse_int_metadata_stack1;
            default: accept;
        }
    }

    state parse_int_metadata_stack2 {
        packet.extract(hdr.int_metadata_stack2);
        transition parse_int_metadata_stack1;
    }

    state parse_int_metadata_stack1 {
        packet.extract(hdr.int_metadata_stack1);
        transition accept;
    }



    /*state parse_int_metadata_stack { //P4apps, Joghwan
        // Parse INT metadata, not INT header and INT shim header (length in bits)
        packet.extract(hdr.int_metadata_stack, (((bit<32>) (hdr.int_shim.len)) - 3) << 5);
        transition accept;
    }*/

}