// 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; | |
}; | |
} | |
} | |