Fix IP checksum calculation for odd-length packets.

This commit is contained in:
whitequark 2016-12-20 00:17:29 +00:00
parent 095005a597
commit 6d2c11fb61
1 changed files with 6 additions and 1 deletions

View File

@ -107,7 +107,12 @@ pub mod checksum {
pub fn data(data: &[u8]) -> u16 {
let mut accum: u32 = 0;
for i in (0..data.len()).step_by(2) {
let word = NetworkEndian::read_u16(&data[i..i + 2]) as u32;
let word;
if i + 2 <= data.len() {
word = NetworkEndian::read_u16(&data[i..i + 2]) as u32
} else {
word = (data[i] as u32) << 8
}
accum += word;
}
(((accum >> 16) as u16) + (accum as u16))