/* -*- P4_16 -*- */ #ifndef PARSERS_P4 #define PARSERS_P4 #include #include #include "headers.p4" parser MyParser(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { state start { packet.extract(hdr.ethernet); transition select(hdr.ethernet.ethertype){ TYPE_IPV4: ipv4; TYPE_IPV6: ipv6; default: accept; } } state ipv4 { packet.extract(hdr.ipv4); meta.tcpLength = hdr.ipv4.totalLen - 16w20; transition select(hdr.ipv4.protocol){ TYPE_TCP: tcp; default: accept; } } state ipv6 { packet.extract(hdr.ipv6); meta.tcpLength = hdr.ipv6.payload_length; transition select(hdr.ipv6.next_header){ TYPE_TCP: tcp; default: accept; } } state tcp { packet.extract(hdr.tcp); transition accept; } } /************************************************************************* ************************ D E P A R S E R ******************************* *************************************************************************/ control MyDeparser(packet_out packet, in headers hdr) { apply { packet.emit(hdr.ethernet); /* either */ packet.emit(hdr.ipv4); packet.emit(hdr.ipv6); /* either */ packet.emit(hdr.tcp); // packet.emit(hdr.udp); // packet.emit(hdr.icmp); // packet.emit(hdr.icmpv6); } } #endif