blob: 73dcdfd42b2bc2e90eb10ae83e20e2eecc55aa11 [file] [log] [blame]
Carmelo Cascone16de6db2017-08-22 00:27:57 +02001#ifndef __PARSER_P4__
2#define __PARSER_P4__
3#include "defines.p4"
4#include "headers.p4"
5
6header packet_in_t packet_in_hdr;
7header packet_out_t packet_out_hdr;
8header ethernet_t ethernet;
9header ipv4_t ipv4;
10header tcp_t tcp;
11header udp_t udp;
Carmelo Cascone4f011022017-06-05 01:41:02 -040012
13parser start {
Carmelo Cascone16de6db2017-08-22 00:27:57 +020014 // FIXME: Cheat the compiler to generate the deparser of packet in
15 // This is just a hack, we assume first 8 bit of etherType won't be 0
16 return select( current(96, 8) ) {
17 NULL_ETH_TYPE : parse_pkt_in;
18 default : default_parser;
19 }
20}
21
22parser parse_pkt_in {
23 extract(packet_in_hdr);
Carmelo Cascone4f011022017-06-05 01:41:02 -040024 return parse_ethernet;
25}
26
Carmelo Cascone16de6db2017-08-22 00:27:57 +020027parser default_parser {
28 return select(IGR_PORT_FIELD) {
29 CPU_PORT : parse_pkt_out;
30 default : parse_ethernet;
31 }
32}
Carmelo Cascone4f011022017-06-05 01:41:02 -040033
Carmelo Cascone16de6db2017-08-22 00:27:57 +020034parser parse_pkt_out {
35 extract(packet_out_hdr);
36 return parse_ethernet;
37}
Carmelo Cascone4f011022017-06-05 01:41:02 -040038
39parser parse_ethernet {
40 extract(ethernet);
41 return select(latest.etherType) {
42 ETHERTYPE_IPV4 : parse_ipv4;
43 default : ingress;
44 }
45}
46
Carmelo Cascone4f011022017-06-05 01:41:02 -040047parser parse_ipv4 {
48 extract(ipv4);
49 return select(latest.fragOffset, latest.protocol) {
50 IP_PROTOCOLS_TCP : parse_tcp;
51 IP_PROTOCOLS_UDP : parse_udp;
52 default: ingress;
53 }
54}
55
Carmelo Cascone4f011022017-06-05 01:41:02 -040056parser parse_tcp {
57 extract(tcp);
58 return ingress;
59}
60
Carmelo Cascone4f011022017-06-05 01:41:02 -040061parser parse_udp {
62 extract(udp);
63 return ingress;
Carmelo Cascone16de6db2017-08-22 00:27:57 +020064}
65
66#endif