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 { | 
