aboutsummaryrefslogtreecommitdiff
path: root/src/eth.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/eth.rs')
-rw-r--r--src/eth.rs45
1 files changed, 32 insertions, 13 deletions
diff --git a/src/eth.rs b/src/eth.rs
index 3c5292d..b13d707 100644
--- a/src/eth.rs
+++ b/src/eth.rs
@@ -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)
}
}