Carmelo Cascone | 16de6db | 2017-08-22 00:27:57 +0200 | [diff] [blame] | 1 | #ifndef __PARSER_P4__ |
| 2 | #define __PARSER_P4__ |
| 3 | #include "defines.p4" |
| 4 | #include "headers.p4" |
| 5 | |
| 6 | header packet_in_t packet_in_hdr; |
| 7 | header packet_out_t packet_out_hdr; |
| 8 | header ethernet_t ethernet; |
| 9 | header ipv4_t ipv4; |
| 10 | header tcp_t tcp; |
| 11 | header udp_t udp; |
Carmelo Cascone | 4f01102 | 2017-06-05 01:41:02 -0400 | [diff] [blame] | 12 | |
| 13 | parser start { |
Carmelo Cascone | 16de6db | 2017-08-22 00:27:57 +0200 | [diff] [blame] | 14 | // 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 | |
| 22 | parser parse_pkt_in { |
| 23 | extract(packet_in_hdr); |
Carmelo Cascone | 4f01102 | 2017-06-05 01:41:02 -0400 | [diff] [blame] | 24 | return parse_ethernet; |
| 25 | } |
| 26 | |
Carmelo Cascone | 16de6db | 2017-08-22 00:27:57 +0200 | [diff] [blame] | 27 | parser default_parser { |
| 28 | return select(IGR_PORT_FIELD) { |
| 29 | CPU_PORT : parse_pkt_out; |
| 30 | default : parse_ethernet; |
| 31 | } |
| 32 | } |
Carmelo Cascone | 4f01102 | 2017-06-05 01:41:02 -0400 | [diff] [blame] | 33 | |
Carmelo Cascone | 16de6db | 2017-08-22 00:27:57 +0200 | [diff] [blame] | 34 | parser parse_pkt_out { |
| 35 | extract(packet_out_hdr); |
| 36 | return parse_ethernet; |
| 37 | } |
Carmelo Cascone | 4f01102 | 2017-06-05 01:41:02 -0400 | [diff] [blame] | 38 | |
| 39 | parser parse_ethernet { |
| 40 | extract(ethernet); |
| 41 | return select(latest.etherType) { |
| 42 | ETHERTYPE_IPV4 : parse_ipv4; |
| 43 | default : ingress; |
| 44 | } |
| 45 | } |
| 46 | |
Carmelo Cascone | 4f01102 | 2017-06-05 01:41:02 -0400 | [diff] [blame] | 47 | parser 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 Cascone | 4f01102 | 2017-06-05 01:41:02 -0400 | [diff] [blame] | 56 | parser parse_tcp { |
| 57 | extract(tcp); |
| 58 | return ingress; |
| 59 | } |
| 60 | |
Carmelo Cascone | 4f01102 | 2017-06-05 01:41:02 -0400 | [diff] [blame] | 61 | parser parse_udp { |
| 62 | extract(udp); |
| 63 | return ingress; |
Carmelo Cascone | 16de6db | 2017-08-22 00:27:57 +0200 | [diff] [blame] | 64 | } |
| 65 | |
| 66 | #endif |