TNSM_Latency_Prediction / code / control / ingress / 2_custom / 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);
        packet.extract(hdr.ethernet);
        transition select(hdr.ethernet.etherType) {
            ETHERTYPE_IPV4      : parse_ipv4;
            ETHERTYPE_IPV6      : parse_ipv6;
            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_ipv6 {
        packet.extract(hdr.ipv6);
        transition select(hdr.ipv6.nextHdr) {
            IPPROTO_UDP       : parse_udp;
            IPPROTO_TCP       : parse_tcp;
            default           : accept;
        }
    }

    state parse_tcp {
        packet.extract(hdr.tcp);
    #ifdef CUSTOM_H1
        transition select(hdr.tcp.dstPort) {
            FIRST_CUSTOM_HEADER : parse_custom1;
            default             : accept;
        }
    #else
        transition accept;
    #endif        

    }

    state parse_udp {
        packet.extract(hdr.udp);
    #ifdef CUSTOM_H1
        transition select(hdr.udp.dstPort) {
            FIRST_CUSTOM_HEADER : parse_custom1;
            default             : accept;
        }
    #else
        transition accept;
    #endif
    }


#ifdef CUSTOM_H1    
    state parse_custom1 {
        packet.extract(hdr.custom1);
    #ifdef CUSTOM_H2
        transition select(hdr.custom1.field10) {
            SECOND_CUSTOM_HEADER : parse_custom2;
            default              : accept;
        }
    #else
        transition accept;
    #endif
    }
#endif

#ifdef CUSTOM_H2    
    state parse_custom2 {
        packet.extract(hdr.custom2);
    #ifdef CUSTOM_H3
        transition select(hdr.custom2.field10) {
            THIRD_CUSTOM_HEADER : parse_custom3;
            default             : accept;
        }
    #else
        transition accept;
    #endif
    }
#endif

#ifdef CUSTOM_H3    
    state parse_custom3 {
        packet.extract(hdr.custom3);
    #ifdef CUSTOM_H4
        transition select(hdr.custom3.field10) {
            FORTH_CUSTOM_HEADER : parse_custom4;
            default             : accept;
        }
    #else
        transition accept;
    #endif
    }
#endif

#ifdef CUSTOM_H4    
    state parse_custom4 {
        packet.extract(hdr.custom4);
        transition accept;
    }
#endif

}