blob: 73dcdfd42b2bc2e90eb10ae83e20e2eecc55aa11 [file] [log] [blame]
#ifndef __PARSER_P4__
#define __PARSER_P4__
#include "defines.p4"
#include "headers.p4"
header packet_in_t packet_in_hdr;
header packet_out_t packet_out_hdr;
header ethernet_t ethernet;
header ipv4_t ipv4;
header tcp_t tcp;
header udp_t udp;
parser start {
// FIXME: Cheat the compiler to generate the deparser of packet in
// This is just a hack, we assume first 8 bit of etherType won't be 0
return select( current(96, 8) ) {
NULL_ETH_TYPE : parse_pkt_in;
default : default_parser;
}
}
parser parse_pkt_in {
extract(packet_in_hdr);
return parse_ethernet;
}
parser default_parser {
return select(IGR_PORT_FIELD) {
CPU_PORT : parse_pkt_out;
default : parse_ethernet;
}
}
parser parse_pkt_out {
extract(packet_out_hdr);
return parse_ethernet;
}
parser parse_ethernet {
extract(ethernet);
return select(latest.etherType) {
ETHERTYPE_IPV4 : parse_ipv4;
default : ingress;
}
}
parser parse_ipv4 {
extract(ipv4);
return select(latest.fragOffset, latest.protocol) {
IP_PROTOCOLS_TCP : parse_tcp;
IP_PROTOCOLS_UDP : parse_udp;
default: ingress;
}
}
parser parse_tcp {
extract(tcp);
return ingress;
}
parser parse_udp {
extract(udp);
return ingress;
}
#endif