diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/vrrpv2.rs | 60 |
1 files changed, 26 insertions, 34 deletions
diff --git a/src/vrrpv2.rs b/src/vrrpv2.rs index 5f5de92..63c58c8 100644 --- a/src/vrrpv2.rs +++ b/src/vrrpv2.rs @@ -82,32 +82,6 @@ pub enum AuthType { Reserved2 = 0x02, } -trait BytesReader { - fn read_u8(&mut self) -> io::Result<u8>; - fn read_u16(&mut self) -> io::Result<u16>; - fn read_u32(&mut self) -> io::Result<u32>; -} - -impl<T: AsRef<[u8]>> BytesReader for Cursor<T> { - fn read_u8(&mut self) -> io::Result<u8> { - let mut buffer = [0; 1]; - self.read_exact(&mut buffer)?; - Ok(u8::from_be_bytes(buffer)) - } - - fn read_u16(&mut self) -> io::Result<u16> { - let mut buffer = [0; 2]; - self.read_exact(&mut buffer)?; - Ok(u16::from_be_bytes(buffer)) - } - - fn read_u32(&mut self) -> io::Result<u32> { - let mut buffer = [0; 4]; - self.read_exact(&mut buffer)?; - Ok(u32::from_be_bytes(buffer)) - } -} - impl VRRPv2 { pub fn to_bytes(&self) -> Result<Vec<u8>, std::io::Error> { let sz = MIN_PACKET_SIZE + (self.ip_addrs.len() * 4); @@ -140,16 +114,34 @@ impl VRRPv2 { } } +fn read_u8(cursor: &mut Cursor<&[u8]>) -> io::Result<u8> { + let mut buffer = [0; 1]; + cursor.read_exact(&mut buffer)?; + Ok(u8::from_be_bytes(buffer)) +} + +fn read_u16(cursor: &mut Cursor<&[u8]>) -> io::Result<u16> { + let mut buffer = [0; 2]; + cursor.read_exact(&mut buffer)?; + Ok(u16::from_be_bytes(buffer)) +} + +fn read_u32(cursor: &mut Cursor<&[u8]>) -> io::Result<u32> { + let mut buffer = [0; 4]; + cursor.read_exact(&mut buffer)?; + Ok(u32::from_be_bytes(buffer)) +} + fn parse(bytes: &[u8]) -> Result<VRRPv2, VRRPv2Error> { let mut rdr = Cursor::new(bytes); - match rdr.read_u8()? { + match read_u8(&mut rdr)? { i if (i & 0xF) != TYPE => return Err(VRRPv2Error::InvalidType), i if (i >> 4) != VERSION => return Err(VRRPv2Error::InvalidVersion), _ => {} }; - let virtual_router_id = rdr.read_u8()?; - let priority = rdr.read_u8()?; - let count_ip_addrs = rdr.read_u8()?; + let virtual_router_id = read_u8(&mut rdr)?; + let priority = read_u8(&mut rdr)?; + let count_ip_addrs = read_u8(&mut rdr)?; if count_ip_addrs == 0 { return Err(VRRPv2Error::InvalidIPCount); } @@ -158,18 +150,18 @@ fn parse(bytes: &[u8]) -> Result<VRRPv2, VRRPv2Error> { return Err(VRRPv2Error::InvalidPacketSize); } - let auth_type = rdr.read_u8()?; + let auth_type = read_u8(&mut rdr)?; let auth_type = match auth_type { 0 => AuthType::NoAuth, 1 => AuthType::Reserved1, 2 => AuthType::Reserved2, _ => return Err(VRRPv2Error::InvalidAuthType), }; - let advertisement_interval = rdr.read_u8()?; - let checksum = rdr.read_u16()?; + let advertisement_interval = read_u8(&mut rdr)?; + let checksum = read_u16(&mut rdr)?; let mut ip_addrs = Vec::with_capacity(count_ip_addrs as usize); for _i in 0..count_ip_addrs { - let b = rdr.read_u32()?; + let b = read_u32(&mut rdr)?; ip_addrs.push(Ipv4Addr::from(b)); } Ok(VRRPv2 { |