pub struct Tcp<'p> { src: u16, dst: u16, payload: &'p [u8], } impl<'p> Tcp<'p> { pub fn new(buffer: &'p [u8]) -> Self { let src = u16::from_be_bytes([buffer[0], buffer[1]]); let dst = u16::from_be_bytes([buffer[2], buffer[3]]); let data_offset = (buffer[12].to_be() & 0b1111_0000) >> 4; // Offset is number of 32-bit words let true_offset = data_offset as usize * 4; Self { src, dst, payload: &buffer[true_offset..], } } pub fn source_port(&self) -> u16 { self.src } pub fn destination_port(&self) -> u16 { self.dst } pub fn payload(&self) -> &[u8] { self.payload } } pub struct Udp<'p> { src: u16, dst: u16, payload: &'p [u8], } impl<'p> Udp<'p> { pub fn new(buffer: &'p [u8]) -> Self { let src = u16::from_be_bytes([buffer[0], buffer[1]]); let dst = u16::from_be_bytes([buffer[2], buffer[3]]); let _len = u16::from_be_bytes([buffer[4], buffer[5]]); Self { src, dst, payload: &buffer[8..], } } pub fn source_port(&self) -> u16 { self.src } pub fn destination_port(&self) -> u16 { self.dst } pub fn payload(&self) -> &[u8] { self.payload } }