pub const HEADER_MAGIC_V1: &[u8] = b"\x50\x52\x4F\x58\x59";
pub const HEADER_MAGIC_V2: &[u8] = b"\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A";
pub const MSG_HEADER_LOCAL_V2: &[u8] = b"\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A\x20\x00\x00\x00";
pub const HEADER_MAGINC_LEN: usize = HEADER_MAGIC_V2.len();
pub const HEADER_UNIX_ADDR_LEN: usize = 108;
#[repr(C, packed)]
pub struct PP2TlvSsl
{
pub client: u8,
pub verify: u32,
pub data: [u8; 0],
}
#[repr(C, packed)]
pub struct PP2Tlv
{
pub mtype: u8,
pub length_hi: u8,
pub length_lo: u8,
pub value: [u8; 0],
}
#[repr(C, packed)]
#[derive(Clone, Copy, Debug)]
pub struct Ipv4Addr
{
pub src_addr: u32,
pub dst_addr: u32,
pub src_port: u16,
pub dst_port: u16
}
#[repr(C, packed)]
#[derive(Clone, Copy, Debug)]
pub struct Ipv6Addr
{
pub src_addr: [u8; 16],
pub dst_addr: [u8; 16],
pub src_port: u16,
pub dst_port: u16
}
#[repr(C, packed)]
#[derive(Clone, Copy, Debug)]
pub struct UnixAddr
{
pub src_addr: [u8; HEADER_UNIX_ADDR_LEN],
pub dst_addr: [u8; HEADER_UNIX_ADDR_LEN],
}
#[repr(C, packed)]
pub union ProxyAddr
{
pub ipv4_addr: Ipv4Addr,
pub ipv6_addr: Ipv6Addr,
pub unix_addr: UnixAddr,
}
#[repr(C, packed)]
pub struct ProxyHdrV2
{
pub signature: [u8; HEADER_MAGINC_LEN],
pub ver_cmd: u8,
pub fam: u8,
pub len: u16,
pub address: [u8; 0]}
impl ProxyHdrV2
{
pub const VERSION_MASK: u8 = 0xF0;
pub const COMMAND_MASK: u8 = 0x0F;
pub const TRANSPT_MASK: u8 = 0x0F;
pub const ADDRESS_MASK: u8 = 0xF0;
pub const VERSION_RAW: u8 = 0x20;
pub const HEADER_LEN: usize = size_of::<Self>();
pub const HEADER_ADDR_LEN: usize = size_of::<Self>() + size_of::<ProxyAddr>();
}