equal
deleted
inserted
replaced
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) |