diff options
Diffstat (limited to 'src/eth.rs')
-rw-r--r-- | src/eth.rs | 45 |
1 files changed, 32 insertions, 13 deletions
@@ -8,7 +8,7 @@ use crate::error::ParseError; pub struct Header<'a>(&'a mut [u8]); impl<'a> Header<'a> { - pub fn from_buffer(buffer: &'a mut [u8]) -> Result<Self, ParseError> { + pub fn with_buffer(buffer: &'a mut [u8]) -> Result<Self, ParseError> { if buffer.len() < 14 { return Err(ParseError::BufferTooSmall(buffer.len())); } @@ -20,31 +20,50 @@ impl<'a> Header<'a> { (&self.0[6..12]).try_into().unwrap() } - pub fn set_src_address(&mut self, addr: [u8; 6]) { - self.0[6..12].copy_from_slice(&addr); - } - pub fn dst_address(&self) -> &[u8; 6] { (&self.0[..6]).try_into().unwrap() } - pub fn set_dst_address(&mut self, addr: [u8; 6]) { - self.0[..6].copy_from_slice(&addr); - } - pub fn ether_type(&self) -> u16 { NE::read_u16(&self.0[12..]) } + pub fn as_bytes(&self) -> &[u8] { + &self.0 + } +} + +pub struct HeaderBuilder<'a>(&'a mut [u8]); + +impl<'a> HeaderBuilder<'a> { + pub fn with_buffer(buffer: &'a mut [u8]) -> Result<Self, ParseError> { + if buffer.len() < 14 { + return Err(ParseError::BufferTooSmall(buffer.len())); + } + Ok(Self(buffer)) + } + + pub fn set_src_address(&mut self, addr: [u8; 6]) { + self.0[6..12].copy_from_slice(&addr); + } + + pub fn set_dst_address(&mut self, addr: [u8; 6]) { + self.0[..6].copy_from_slice(&addr); + } + pub fn set_ether_type(&mut self, ether_type: u16) { NE::write_u16(&mut self.0[12..], ether_type); } - pub fn payload(&self) -> &[u8] { - &self.0[14..] + pub fn as_bytes(&self) -> &[u8] { + &self.0 + } + + pub fn as_mut_bytes(&mut self) -> &mut [u8] { + &mut self.0 } - pub fn payload_mut(&mut self) -> &mut [u8] { - &mut self.0[14..] + pub fn build(self) -> Result<Header<'a>, ParseError> { + Header::with_buffer(self.0) } } |