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:
2026-05-02 18:11:29 +03:00
parent fde085e04b
commit 2f45349658

View File

@@ -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;
ASSERT(i == buffers.size() - 1);
checksum += buffer[buffer.size() - 1] << 8;
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];
}
}
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);
}
}