Correctly propagate carries in the IP checksum.

v0.7.x
whitequark 2016-12-27 18:43:49 +00:00
parent 6b592742fd
commit e6357ee79c
1 changed files with 7 additions and 2 deletions

View File

@ -229,6 +229,11 @@ pub mod checksum {
use super::*;
fn propagate_carries(word: u32) -> u16 {
let sum = (word >> 16) + (word & 0xffff);
((sum >> 16) as u16) + (sum as u16)
}
/// Compute an RFC 1071 compliant checksum (without the final complement).
pub fn data(data: &[u8]) -> u16 {
let mut accum: u32 = 0;
@ -241,7 +246,7 @@ pub mod checksum {
}
accum += word;
}
(((accum >> 16) as u16) + (accum as u16))
propagate_carries(accum)
}
/// Combine several RFC 1071 compliant checksums.
@ -250,7 +255,7 @@ pub mod checksum {
for &word in checksums {
accum += word as u32;
}
(((accum >> 16) as u16) + (accum as u16))
propagate_carries(accum)
}
/// Compute an IP pseudo header checksum.