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 3874e0ed1e
commit 33ea0f07b7

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;
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);
}
}