From 2bd66b9a04be8a63d7ee0be2d633ead183fa7e76 Mon Sep 17 00:00:00 2001 From: gennyble Date: Sat, 17 May 2025 09:53:23 -0500 Subject: initial commit; meow --- src/layer3.rs | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/layer3.rs (limited to 'src/layer3.rs') diff --git a/src/layer3.rs b/src/layer3.rs new file mode 100644 index 0000000..7521c0d --- /dev/null +++ b/src/layer3.rs @@ -0,0 +1,65 @@ +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 + } +} -- cgit 1.4.1-3-g733a5