From 33ea0f07b7e698d9c68015786671a016a00aef1a Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sat, 2 May 2026 18:11:29 +0300 Subject: [PATCH] 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 --- kernel/kernel/Networking/NetworkLayer.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/kernel/kernel/Networking/NetworkLayer.cpp b/kernel/kernel/Networking/NetworkLayer.cpp index 75ab9e7a..67b023b9 100644 --- a/kernel/kernel/Networking/NetworkLayer.cpp +++ b/kernel/kernel/Networking/NetworkLayer.cpp @@ -18,16 +18,20 @@ namespace Kernel const uint16_t* buffer_u16 = reinterpret_cast(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(~checksum); } }