src/vrrpv2.rs
changeset 25 72c4d898c478
parent 23 1bfa6fd5b5f9
child 26 4ad31d279c35
equal deleted inserted replaced
24:b45e6310310e 25:72c4d898c478
   161         return Err(VRRPv2Error::InvalidChecksum);
   161         return Err(VRRPv2Error::InvalidChecksum);
   162     }
   162     }
   163     Ok(vrrpv2)
   163     Ok(vrrpv2)
   164 }
   164 }
   165 
   165 
   166 /// TODO: as_chunks is nicer but not stabilised yet.
       
   167 fn checksum(bytes: &[u8]) -> u16 {
   166 fn checksum(bytes: &[u8]) -> u16 {
   168     let mut sum: u32 = 0;
   167     let (chunks, remainder) = bytes.as_chunks::<2>();
   169     for chunk in bytes.chunks(2) {
   168     let mut sum = chunks
   170         // Left over byte if any
   169         .iter()
   171         if chunk.len() == 1 {
   170         .fold(0, |acc, x| acc + u32::from(u16::from_be_bytes(*x)));
   172             sum += u32::from(chunk[0]);
   171     if !remainder.is_empty() {
   173         } else {
   172         sum += u32::from(remainder[0]);
   174             sum += u32::from(u16::from_be_bytes(chunk.try_into().unwrap()));
       
   175         }
       
   176     }
   173     }
   177     while (sum >> 16) > 0 {
   174     while (sum >> 16) > 0 {
   178         sum = (sum & 0xffff) + (sum >> 16);
   175         sum = (sum & 0xffff) + (sum >> 16);
   179     }
   176     }
   180     !(sum as u16)
   177     !(sum as u16)