Kernel: Calculate internet checksum in host endian
No need to swap bytes of every 16 bit word in the packet, we can just do one swap at the return
This commit is contained in:
@@ -18,16 +18,20 @@ namespace Kernel
|
||||
|
||||
const uint16_t* buffer_u16 = reinterpret_cast<const uint16_t*>(buffer.data());
|
||||
for (size_t j = 0; j < buffer.size() / 2; j++)
|
||||
checksum += BAN::host_to_network_endian(buffer_u16[j]);
|
||||
if (buffer.size() % 2 == 0)
|
||||
continue;
|
||||
checksum += buffer_u16[j];
|
||||
|
||||
if (buffer.size() % 2)
|
||||
{
|
||||
// NOTE: we only allow last buffer to be odd-length
|
||||
ASSERT(i == buffers.size() - 1);
|
||||
checksum += buffer[buffer.size() - 1] << 8;
|
||||
checksum += buffer[buffer.size() - 1];
|
||||
}
|
||||
}
|
||||
|
||||
while (checksum >> 16)
|
||||
checksum = (checksum >> 16) + (checksum & 0xFFFF);
|
||||
return ~(uint16_t)checksum;
|
||||
checksum = (checksum & 0xFFFF) + (checksum >> 16);
|
||||
|
||||
return BAN::host_to_network_endian<uint16_t>(~checksum);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user