diff --git a/src/net/net_win32/net_win32.c b/src/net/net_win32/net_win32.c index 8e596b36..ca4d4626 100644 --- a/src/net/net_win32/net_win32.c +++ b/src/net/net_win32/net_win32.c @@ -140,18 +140,26 @@ NET_W32_Peer *NET_W32_TouchPeerFromKey(NET_W32_Pipe *pipe, NET_Key key) return peer; } -u32 NET_W32_ChecksumFromString(String str) +u32 NET_W32_ChecksumFromPacketString(String str) { - // Adler-32 - // https://en.wikipedia.org/wiki/Adler-32 - u32 a = 1; - u32 b = 0; - for (u64 idx = 0; idx < str.len; ++idx) + u32 result = 0; + if (str.len > 4) { - a = (a + str.text[idx]) % 65521; - b = (b + a) % 65521; + // Skip the first 4 bytes of packet since it contains the checksum itself + str.text += 4; + str.len -= 4; + + // https://en.wikipedia.org/wiki/Adler-32 + u32 a = 1; + u32 b = 0; + for (u64 idx = 0; idx < str.len; ++idx) + { + a = (a + str.text[idx]) % 65521; + b = (b + a) % 65521; + } + result = (b << 16) | a; } - return (b << 16) | a; + return result ^ NET_W32_ProtocolMagic; } //////////////////////////////////////////////////////////// @@ -326,7 +334,6 @@ void NET_W32_TickForever(WaveLaneCtx *lane) for (;;) { TempArena scratch = BeginScratchNoConflict(); - u32 magic = 0xde8c590b; i64 heartbeat_threshold_ns = NsFromSeconds(0.250); i64 passive_run_threshold_ns = NsFromSeconds(0.250); @@ -596,8 +603,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane) { NET_W32_PacketHeader header = Zi; CopyBytes(&header, buff, sizeof(header)); - CopyBytes(buff, &magic, sizeof(magic)); - u32 checksum = NET_W32_ChecksumFromString(STRING(len, buff)); + u32 checksum = NET_W32_ChecksumFromPacketString(STRING(len, buff)); if (header.checksum == checksum) { NET_Key key = NET_W32_KeyFromAddress(addr); @@ -914,7 +920,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane) u8 buff[Kibi(2)]; NET_W32_PacketHeader header = Zi; { - header.checksum = magic; + header.checksum = 0; header.flags = NET_W32_PacketFlag_Heartbeat; header.bottom_ack = peer->bottom_ack; header.ack_bits = peer->ack_bits; @@ -922,7 +928,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane) CopyBytes(buff, &header, sizeof(header)); buff_len += sizeof(header); - u32 checksum = NET_W32_ChecksumFromString(STRING(buff_len, buff)); + u32 checksum = NET_W32_ChecksumFromPacketString(STRING(buff_len, buff)); CopyBytes(buff, &checksum, sizeof(checksum)); sendto( pipe->udp, @@ -990,7 +996,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane) NET_W32_PacketHeader header = Zi; { - header.checksum = magic; + header.checksum = 0; header.flags = packet->flags; header.seq = packet->seq; header.msg_seq = packet->msg_seq; @@ -1003,7 +1009,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane) CopyBytes(buff + buff_len, packet->data.text, packet->data.len); buff_len += packet->data.len; - u32 checksum = NET_W32_ChecksumFromString(STRING(buff_len, buff)); + u32 checksum = NET_W32_ChecksumFromPacketString(STRING(buff_len, buff)); CopyBytes(buff, &checksum, sizeof(checksum)); sendto( pipe->udp, diff --git a/src/net/net_win32/net_win32.h b/src/net/net_win32/net_win32.h index d92de128..13940833 100644 --- a/src/net/net_win32/net_win32.h +++ b/src/net/net_win32/net_win32.h @@ -35,6 +35,8 @@ Struct(NET_W32_MsgBuff) //////////////////////////////////////////////////////////// //~ Packet types +#define NET_W32_ProtocolMagic 0xde8c590b + Enum(NET_W32_PacketFlag) { NET_W32_PacketFlag_None = 0, @@ -180,7 +182,7 @@ NET_Key NET_W32_KeyFromAddress(struct sockaddr_in6 addr); struct sockaddr_in6 NET_W32_AddressFromKey(NET_Key key); void NET_W32_SignalWorker(void); NET_W32_Peer *NET_W32_TouchPeerFromKey(NET_W32_Pipe *pipe, NET_Key key); -u32 NET_W32_ChecksumFromString(String str); +u32 NET_W32_ChecksumFromPacketString(String str); //////////////////////////////////////////////////////////// //~ Worker