blob: e29a9f2f1db527429124b4c287545310e9e88a92 [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 {
#ifdef __TOFINO_BUILD__
// Hack to force deparsing of packet_in hdr.
// We assume it's impossible to receive a pkt with the first 8 bits of etherType 0.
// p4c-tofino complains when switching over 16 bits, i.e. the full etherType
// FIXME: This solution appears to be very brittle!!!
return select(current(96, 8)) {
0 : parse_pkt_in;
#else
return select(EGR_PORT_FIELD) {
CPU_PORT : parse_pkt_in;
#endif
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