src/vrrpv2.rs
author Sunil Nimmagadda <sunil@nimmagadda.net>
Sun, 26 May 2024 13:19:51 +0530
changeset 29 277a2f8b3653
parent 26 4ad31d279c35
permissions -rw-r--r--
Make VRRPv2Error std::error::Error trait compliant.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29
277a2f8b3653 Make VRRPv2Error std::error::Error trait compliant.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
     1
use std::fmt::Display;
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
     2
use std::io::Read;
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
     3
use std::io::{self, Cursor};
7
e3058ceb81cc Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     4
use std::net::Ipv4Addr;
e3058ceb81cc Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     5
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
     6
/// A VRRP version 2 packet.
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
     7
///
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
     8
/// Packet format
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
     9
///
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    10
///  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    11
/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    12
/// |Version| Type  | Virtual Rtr ID|   Priority    | Count IP Addrs|
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    13
/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    14
/// |   Auth Type   |   Adver Int   |          Checksum             |
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    15
/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    16
/// |                         IP Address (1)                        |
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    17
/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    18
/// |                            .                                  |
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    19
/// |                            .                                  |
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    20
/// |                            .                                  |
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    21
/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    22
/// |                         IP Address (n)                        |
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    23
/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    24
/// |                     Authentication Data (1)                   |
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    25
/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    26
/// |                     Authentication Data (2)                   |
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    27
/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    28
#[derive(Debug, PartialEq)]
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    29
pub struct VRRPv2 {
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    30
    pub virtual_router_id: u8,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    31
    pub priority: u8,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    32
    pub count_ip_addrs: u8,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    33
    pub auth_type: VRRPv2AuthType,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    34
    pub advertisement_interval: u8,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    35
    pub checksum: u16,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    36
    pub ip_addrs: Vec<Ipv4Addr>,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    37
}
7
e3058ceb81cc Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    38
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
    39
#[derive(Debug, Clone, PartialEq)]
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
    40
pub enum VRRPv2Error {
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    41
    InvalidAuthType,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    42
    InvalidChecksum,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    43
    InvalidType,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    44
    InvalidVersion,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    45
    ParseError,
7
e3058ceb81cc Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    46
}
e3058ceb81cc Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    47
29
277a2f8b3653 Make VRRPv2Error std::error::Error trait compliant.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
    48
impl Display for VRRPv2Error {
277a2f8b3653 Make VRRPv2Error std::error::Error trait compliant.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
    49
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
277a2f8b3653 Make VRRPv2Error std::error::Error trait compliant.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
    50
        match self {
277a2f8b3653 Make VRRPv2Error std::error::Error trait compliant.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
    51
            Self::InvalidAuthType => write!(f, "Invalid Auth Type"),
277a2f8b3653 Make VRRPv2Error std::error::Error trait compliant.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
    52
            Self::InvalidChecksum => write!(f, "Invalid Checksum"),
277a2f8b3653 Make VRRPv2Error std::error::Error trait compliant.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
    53
            Self::InvalidType => write!(f, "Invalid Type"),
277a2f8b3653 Make VRRPv2Error std::error::Error trait compliant.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
    54
            Self::InvalidVersion => write!(f, "Invalid Version"),
277a2f8b3653 Make VRRPv2Error std::error::Error trait compliant.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
    55
            Self::ParseError => write!(f, "Parse Error"),
277a2f8b3653 Make VRRPv2Error std::error::Error trait compliant.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
    56
        }
277a2f8b3653 Make VRRPv2Error std::error::Error trait compliant.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
    57
    }
277a2f8b3653 Make VRRPv2Error std::error::Error trait compliant.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
    58
}
277a2f8b3653 Make VRRPv2Error std::error::Error trait compliant.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 26
diff changeset
    59
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
    60
#[derive(Debug, PartialEq)]
7
e3058ceb81cc Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    61
pub enum VRRPv2AuthType {
e3058ceb81cc Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    62
    VRRPv2AuthNoAuth = 0x00,
e3058ceb81cc Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    63
    VRRPv2AuthReserved1 = 0x01,
e3058ceb81cc Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    64
    VRRPv2AuthReserved2 = 0x02,
e3058ceb81cc Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    65
}
e3058ceb81cc Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    66
26
4ad31d279c35 ByteReader -> BytesReader.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 25
diff changeset
    67
trait BytesReader {
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    68
    fn read_u8(&mut self) -> io::Result<u8>;
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    69
    fn read_u16(&mut self) -> io::Result<u16>;
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    70
    fn read_u32(&mut self) -> io::Result<u32>;
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
    71
}
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
    72
26
4ad31d279c35 ByteReader -> BytesReader.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 25
diff changeset
    73
impl<T: AsRef<[u8]>> BytesReader for Cursor<T> {
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    74
    fn read_u8(&mut self) -> io::Result<u8> {
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    75
        let mut buffer = [0; 1];
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    76
        self.read_exact(&mut buffer)?;
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    77
        Ok(u8::from_be_bytes(buffer))
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    78
    }
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    79
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    80
    fn read_u16(&mut self) -> io::Result<u16> {
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    81
        let mut buffer = [0; 2];
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    82
        self.read_exact(&mut buffer)?;
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    83
        Ok(u16::from_be_bytes(buffer))
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    84
    }
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    85
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    86
    fn read_u32(&mut self) -> io::Result<u32> {
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    87
        let mut buffer = [0; 4];
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    88
        self.read_exact(&mut buffer)?;
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    89
        Ok(u32::from_be_bytes(buffer))
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    90
    }
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    91
}
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    92
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    93
fn parse(bytes: &[u8]) -> Result<VRRPv2, VRRPv2Error> {
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    94
    let mut rdr = Cursor::new(bytes);
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    95
    let Ok(vertype) = rdr.read_u8() else {
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    96
        return Err(VRRPv2Error::ParseError);
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
    97
    };
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
    98
    if (vertype & 0xF) != 1 {
21
17afb5ba9c2b Still confused by lsb/msb.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 20
diff changeset
    99
        return Err(VRRPv2Error::InvalidType);
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   100
    }
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   101
    if (vertype >> 4) != 2 {
21
17afb5ba9c2b Still confused by lsb/msb.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 20
diff changeset
   102
        return Err(VRRPv2Error::InvalidVersion);
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   103
    }
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   104
    let Ok(virtual_router_id) = rdr.read_u8() else {
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   105
        return Err(VRRPv2Error::ParseError);
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   106
    };
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   107
    let Ok(priority) = rdr.read_u8() else {
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   108
        return Err(VRRPv2Error::ParseError);
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   109
    };
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   110
    let Ok(count_ip_addrs) = rdr.read_u8() else {
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   111
        return Err(VRRPv2Error::ParseError);
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   112
    };
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   113
    let Ok(auth_type) = rdr.read_u8() else {
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   114
        return Err(VRRPv2Error::ParseError);
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   115
    };
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   116
    let auth_type = match auth_type {
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   117
        0 => VRRPv2AuthType::VRRPv2AuthNoAuth,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   118
        1 => VRRPv2AuthType::VRRPv2AuthReserved1,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   119
        2 => VRRPv2AuthType::VRRPv2AuthReserved2,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   120
        _ => return Err(VRRPv2Error::InvalidAuthType),
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   121
    };
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   122
    let Ok(advertisement_interval) = rdr.read_u8() else {
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   123
        return Err(VRRPv2Error::ParseError);
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   124
    };
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   125
    let Ok(checksum) = rdr.read_u16() else {
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   126
        return Err(VRRPv2Error::ParseError);
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   127
    };
23
1bfa6fd5b5f9 Use with_capacity as it's known by now.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 22
diff changeset
   128
    let mut ip_addrs = Vec::with_capacity(count_ip_addrs as usize);
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   129
    for _i in 0..count_ip_addrs {
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   130
        let Ok(b) = rdr.read_u32() else {
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   131
            return Err(VRRPv2Error::ParseError);
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   132
        };
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   133
        ip_addrs.push(Ipv4Addr::from(b));
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   134
    }
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   135
    Ok(VRRPv2 {
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   136
        virtual_router_id,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   137
        priority,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   138
        count_ip_addrs,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   139
        auth_type,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   140
        advertisement_interval,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   141
        checksum,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   142
        ip_addrs,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   143
    })
7
e3058ceb81cc Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   144
}
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   145
19
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   146
/// Parse and validate a byte array to construct a VRRPv2 struct.
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   147
///
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   148
/// # Examples
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   149
///
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   150
/// ```
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   151
/// use vrrpd::vrrpv2::VRRPv2;
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   152
/// use vrrpd::vrrpv2::VRRPv2AuthType;
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   153
/// use vrrpd::vrrpv2::from_bytes;
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   154
/// use std::net::Ipv4Addr;
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   155
///
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   156
/// let bytes = [
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   157
///    0x21, 0x01, 0x64, 0x01, 0x00, 0x01, 0xba, 0x52, 0xc0, 0xa8, 0x00, 0x01, 0x00, 0x00, 0x00,
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   158
///    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   159
/// ];
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   160
/// let expected = VRRPv2 {
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   161
///     virtual_router_id: 1,
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   162
///     priority: 100,
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   163
///     count_ip_addrs: 1,
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   164
///     auth_type: VRRPv2AuthType::VRRPv2AuthNoAuth,
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   165
///     checksum: 47698,
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   166
///     advertisement_interval: 1,
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   167
///     ip_addrs: vec![Ipv4Addr::from([192, 168, 0, 1])],
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   168
/// };
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   169
/// assert_eq!(from_bytes(&bytes), Ok(expected));
1567e8a5a0cb Recover a lost doc test.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 18
diff changeset
   170
/// ```
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   171
pub fn from_bytes(bytes: &[u8]) -> Result<VRRPv2, VRRPv2Error> {
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   172
    let vrrpv2 = parse(bytes)?;
17
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   173
    if checksum(bytes) != 0 {
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   174
        return Err(VRRPv2Error::InvalidChecksum);
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   175
    }
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   176
    Ok(vrrpv2)
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   177
}
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   178
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   179
fn checksum(bytes: &[u8]) -> u16 {
25
72c4d898c478 Move to as_chunks.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 23
diff changeset
   180
    let (chunks, remainder) = bytes.as_chunks::<2>();
72c4d898c478 Move to as_chunks.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 23
diff changeset
   181
    let mut sum = chunks
72c4d898c478 Move to as_chunks.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 23
diff changeset
   182
        .iter()
72c4d898c478 Move to as_chunks.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 23
diff changeset
   183
        .fold(0, |acc, x| acc + u32::from(u16::from_be_bytes(*x)));
72c4d898c478 Move to as_chunks.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 23
diff changeset
   184
    if !remainder.is_empty() {
72c4d898c478 Move to as_chunks.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 23
diff changeset
   185
        sum += u32::from(remainder[0]);
20
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   186
    }
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   187
    while (sum >> 16) > 0 {
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   188
        sum = (sum & 0xffff) + (sum >> 16);
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   189
    }
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   190
    !(sum as u16)
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   191
}
fd3474f42783 Replace nom with std::io::Cursor
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 19
diff changeset
   192
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   193
#[test]
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   194
fn test_incomplete_bytes() {
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   195
    let bytes = [0x21, 0x01];
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   196
    assert_eq!(from_bytes(&bytes), Err(VRRPv2Error::ParseError));
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   197
}
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   198
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   199
#[test]
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   200
fn test_invalid_version() {
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   201
    let bytes = [
21
17afb5ba9c2b Still confused by lsb/msb.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 20
diff changeset
   202
        0x31, 0x1, 0x2a, 0x0, 0x0, 0x1, 0xb5, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   203
        0x0, 0x0, 0x0,
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   204
    ];
18
2470a15711b1 Fix clippy warnings.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 17
diff changeset
   205
    assert_eq!(from_bytes(&bytes), Err(VRRPv2Error::InvalidVersion));
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   206
}
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   207
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   208
#[test]
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   209
fn test_invalid_type() {
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   210
    let bytes = [
21
17afb5ba9c2b Still confused by lsb/msb.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 20
diff changeset
   211
        0x20, 0x2a, 0x64, 0x1, 0x0, 0x1, 0xaa, 0x29, 0xc0, 0xa8, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   212
        0x0, 0x0, 0x0,
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   213
    ];
18
2470a15711b1 Fix clippy warnings.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 17
diff changeset
   214
    assert_eq!(from_bytes(&bytes), Err(VRRPv2Error::InvalidType));
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   215
}
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   216
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   217
#[test]
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   218
fn test_invalid_auth_type() {
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   219
    let bytes = [
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   220
        0x21, 0x01, 0x64, 0x01, 0x03, 0x01, 0xba, 0x52, 0xc0, 0xa8, 0x00, 0x01, 0x00, 0x00, 0x00,
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   221
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   222
    ];
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   223
    assert_eq!(from_bytes(&bytes), Err(VRRPv2Error::InvalidAuthType));
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   224
}
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   225
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   226
#[test]
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   227
fn test_invalid_checksum() {
10
aef7eb135a0c Validate checksum.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 8
diff changeset
   228
    let bytes = [
aef7eb135a0c Validate checksum.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 8
diff changeset
   229
        0x21, 0x01, 0x64, 0x01, 0x00, 0x01, 0xbb, 0x52, 0xc0, 0xa8, 0x00, 0x01, 0x00, 0x00, 0x00,
aef7eb135a0c Validate checksum.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 8
diff changeset
   230
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
aef7eb135a0c Validate checksum.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 8
diff changeset
   231
    ];
16
8c8be538d0e6 Refactor parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 13
diff changeset
   232
    assert_eq!(from_bytes(&bytes), Err(VRRPv2Error::InvalidChecksum));
8
e4cad4eba60b Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 7
diff changeset
   233
}
17
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   234
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   235
#[test]
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   236
fn test_checksum() {
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   237
    let bytes = [0x00, 0x01, 0xf2, 0x03, 0xf4, 0xf5, 0xf6, 0xf7];
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   238
    assert_eq!(checksum(&bytes), 0x220d);
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   239
}
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   240
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   241
#[test]
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   242
fn test_checksum_singlebyte() {
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   243
    let bytes = [0; 1];
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   244
    assert_eq!(checksum(&bytes), 0xffff);
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   245
}
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   246
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   247
#[test]
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   248
fn test_checksum_twobytes() {
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   249
    let bytes = [0x00, 0xff];
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   250
    assert_eq!(checksum(&bytes), 0xff00);
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   251
}
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   252
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   253
#[test]
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   254
fn test_checksum_another() {
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   255
    let bytes = [0xe3, 0x4f, 0x23, 0x96, 0x44, 0x27, 0x99, 0xf3];
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   256
    assert_eq!(checksum(&bytes), 0x1aff);
90d097c9ea62 Rectify checksum calculation.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents: 16
diff changeset
   257
}