// Copyright (c) PLUMgrid, Inc. // Licensed under the Apache License, Version 2.0 (the "License") #packed "true" struct ethernet { u64 dst:48; u64 src:48; u32 type:16; }; state ethernet { switch $ethernet.type { case 0x0800 { next proto::ip; }; case 0x8100 { next proto::dot1q; }; case * { goto EOP; }; } } struct dot1q { u32 pri:3; u32 cfi:1; u32 vlanid:12; u32 type:16; }; state dot1q { switch $dot1q.type { case 0x0800 { next proto::ip; }; case * { goto EOP; }; } } struct ip { u32 ver:4; u32 hlen:4; u32 tos:8; u32 tlen:16; u32 identification:16; u32 ffo_unused:1; u32 df:1; u32 mf:1; u32 foffset:13; u32 ttl:8; u32 nextp:8; u32 hchecksum:16; u32 src:32; u32 dst:32; }; state ip { switch $ip.nextp { case 6 { next proto::tcp; }; case 17 { next proto::udp; }; case 47 { next proto::gre; }; case * { goto EOP; }; } } struct udp { u32 sport:16; u32 dport:16; u32 length:16; u32 crc:16; }; state udp { switch $udp.dport { case 8472 { next proto::vxlan; }; case * { goto EOP; }; } } struct tcp { u16 src_port:16; u16 dst_port:16; u32 seq_num:32; u32 ack_num:32; u8 offset:4; u8 reserved:4; u8 flag_cwr:1; u8 flag_ece:1; u8 flag_urg:1; u8 flag_ack:1; u8 flag_psh:1; u8 flag_rst:1; u8 flag_syn:1; u8 flag_fin:1; u16 rcv_wnd:16; u16 cksum:16; u16 urg_ptr:16; }; state tcp { goto EOP; } struct vxlan { u32 rsv1:4; u32 iflag:1; u32 rsv2:3; u32 rsv3:24; u32 key:24; u32 rsv4:8; }; state vxlan { goto EOP; } struct gre { u32 cflag:1; u32 rflag:1; u32 kflag:1; u32 snflag:1; u32 srflag:1; u32 recurflag:3; u32 reserved:5; u32 vflag:3; u32 protocol:16; u32 key:32; }; state gre { switch $gre.protocol { case * { goto EOP; }; } }