Correctly propagate carries in the IP checksum.
parent
6b592742fd
commit
e6357ee79c
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue