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
}