From e6f1bb6661153ca2752e3b3b2c7f378901e0915a Mon Sep 17 00:00:00 2001 From: jacob Date: Fri, 16 Jan 2026 15:21:39 -0600 Subject: [PATCH] working net sequencing --- src/net/net_win32/net_win32.c | 178 ++++++++++++++++------------------ src/net/net_win32/net_win32.h | 5 +- 2 files changed, 85 insertions(+), 98 deletions(-) diff --git a/src/net/net_win32/net_win32.c b/src/net/net_win32/net_win32.c index 7424c0ee..4a1386f5 100644 --- a/src/net/net_win32/net_win32.c +++ b/src/net/net_win32/net_win32.c @@ -103,13 +103,6 @@ void NET_W32_SignalWorker(void) (struct sockaddr *)&NET_W32.wake_recv_sock.addr, NET_W32.wake_send_sock.addr_size ); - - - - i32 wsa_err = WSAGetLastError(); - - DEBUGBREAKABLE; - } NET_W32_Peer *NET_W32_TouchPeerFromKey(NET_W32_Pipe *pipe, NET_Key key) @@ -377,7 +370,6 @@ void NET_W32_TickForever(WaveLaneCtx *lane) for (NET_W32_Peer *peer = pipe->first_peer; peer; peer = peer->next) { peer->num_msg_packets_received_this_frame = 0; - peer->num_msg_packets_sent_this_frame = 0; } ////////////////////////////// @@ -559,33 +551,23 @@ void NET_W32_TickForever(WaveLaneCtx *lane) src_data.text = buff + sizeof(header); src_data.len = len - sizeof(header); - if (!(header.flags & NET_W32_PacketFlag_Heartbeat)) - { - LogDebugF( - "Received msg packet. seq: %F, msg seq: %F, data: \"%F\"", - FmtSint(header.seq), - FmtSint(header.msg_seq), - FmtString(src_data) - ); - } - //- Fetch peer NET_W32_Peer *peer = NET_W32_TouchPeerFromKey(pipe, key); peer->key = key; - - //- Read packet + peer->last_packet_received_ns = TimeNs(); + if (header.bottom_ack == peer->remote_bottom_ack) { - // Update remote stats - if (header.bottom_ack == peer->remote_bottom_ack) - { - peer->remote_ack_bits |= header.ack_bits; - } - else if (header.bottom_ack > peer->remote_bottom_ack) - { - peer->remote_bottom_ack = header.bottom_ack; - peer->remote_ack_bits = header.ack_bits; - } + peer->remote_ack_bits |= header.ack_bits; + } + else if (header.bottom_ack > peer->remote_bottom_ack) + { + peer->remote_bottom_ack = header.bottom_ack; + peer->remote_ack_bits = header.ack_bits; + } + //- Read msg packet + if (!(header.flags & NET_W32_PacketFlag_Heartbeat)) + { // Update our stats b32 is_sequential = 0; b32 should_process = 0; @@ -594,17 +576,13 @@ void NET_W32_TickForever(WaveLaneCtx *lane) is_sequential = 1; should_process = 1; } - if (header.seq > peer->bottom_ack + 1 && header.seq < peer->bottom_ack + 65) + else if (header.seq > peer->bottom_ack + 1 && header.seq <= peer->bottom_ack + 65) { - u64 ack_bit = (u64)1 << (header.seq - 2 - peer->bottom_ack); - should_process = !!(peer->ack_bits & ack_bit); + u64 ack_bit = (u64)1 << (header.seq - peer->bottom_ack - 2); + should_process = !(peer->ack_bits & ack_bit); peer->ack_bits |= ack_bit; } - if (!(header.flags & NET_W32_PacketFlag_Heartbeat)) - { - peer->num_msg_packets_received_this_frame += 1; - } - peer->last_packet_received_ns = TimeNs(); + peer->num_msg_packets_received_this_frame += 1; // Process packet if (should_process) @@ -681,10 +659,28 @@ void NET_W32_TickForever(WaveLaneCtx *lane) peer->first_fragmented_packet = contig_end->next; contig_end->next = 0; - peer->ack_bits >>= (contig_end->seq - peer->bottom_ack); + i64 diff = contig_end->seq - peer->bottom_ack; + if (diff <= 63) + { + peer->ack_bits >>= diff; + } + else + { + peer->ack_bits = 0; + } peer->bottom_ack = contig_end->seq; } } + + LogDebugF( + "Received msg packet. seq: %F, msg seq: %F, new bottom ack: %F, new ack bits: %F, should_process: %F, data: \"%F\"", + FmtSint(header.seq), + FmtSint(header.msg_seq), + FmtSint(peer->bottom_ack), + FmtUint(peer->ack_bits), + FmtUint(should_process), + FmtString(src_data) + ); } } } @@ -751,11 +747,6 @@ void NET_W32_TickForever(WaveLaneCtx *lane) FmtUint(msg->data.len), FmtString(msg->data) ); - - if (msg->data.len != 1620) - { - DEBUGBREAKABLE; - } } } else @@ -841,6 +832,52 @@ void NET_W32_TickForever(WaveLaneCtx *lane) } } + ////////////////////////////// + //- Send heartbeat packets + + for (NET_W32_Peer *peer = pipe->first_peer; peer; peer = peer->next) + { + b32 should_send_heartbeat = 0; + + // Send heartbeat packet if we received any packets this frame + if (peer->num_msg_packets_received_this_frame > 0) + { + should_send_heartbeat = 1; + } + + // Send heartbeat if we haven't sent any packets in a while + i64 now_ns = TimeNs(); + if (now_ns - peer->last_packet_sent_ns > heartbeat_threshold_ns) + { + should_send_heartbeat = 1; + } + + if (should_send_heartbeat) + { + struct sockaddr_in6 addr = NET_W32_AddressFromKey(peer->key); + i64 buff_len = 0; + u8 buff[Kibi(2)]; + NET_W32_PacketHeader header = Zi; + { + header.magic = magic; + header.flags = NET_W32_PacketFlag_Heartbeat; + header.bottom_ack = peer->bottom_ack; + header.ack_bits = peer->ack_bits; + } + CopyBytes(buff, &header, sizeof(header)); + buff_len += sizeof(header); + sendto( + pipe->udp, + (char *)buff, + buff_len, + 0, + (struct sockaddr *)&addr, + sizeof(addr) + ); + peer->last_packet_sent_ns = now_ns; + } + } + ////////////////////////////// //- Send message packets @@ -858,7 +895,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane) struct sockaddr_in6 addr = NET_W32_AddressFromKey(key); // TODO: Maybe send more than just bottom_ack + 65 packets at a time. - for (NET_W32_Packet *packet = peer->first_remote_packet; packet && packet->seq < bottom_ack + 65;) + for (NET_W32_Packet *packet = peer->first_remote_packet; packet && packet->seq <= bottom_ack + 65;) { NET_W32_Packet *next = packet->next; { @@ -869,7 +906,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane) { is_acked = 1; } - else if (seq > bottom_ack + 1 && packet->seq < bottom_ack + 65) + else if (seq > bottom_ack + 1 && packet->seq <= bottom_ack + 65) { u64 ack_bit = (u64)1 << (seq - 2 - bottom_ack); is_acked = !!(ack_bits & ack_bit); @@ -886,7 +923,6 @@ void NET_W32_TickForever(WaveLaneCtx *lane) i64 now_ns = TimeNs(); if (packet->last_sent_ns == 0 || (now_ns - packet->last_sent_ns > msg_resend_threshold_ns)) { - peer->num_msg_packets_sent_this_frame += 1; peer->last_packet_sent_ns = now_ns; packet->last_sent_ns = now_ns; @@ -933,54 +969,6 @@ void NET_W32_TickForever(WaveLaneCtx *lane) packet = next; } } - - ////////////////////////////// - //- Send heartbeats - - for (NET_W32_Peer *peer = pipe->first_peer; peer; peer = peer->next) - { - b32 should_send_heartbeat = 0; - - // If we received a message from a peer this frame but did not send any - // back, we should send a heartbeat packet so that the peer can still - // receive up to date ack info - if (peer->num_msg_packets_received_this_frame > 0 && peer->num_msg_packets_sent_this_frame == 0) - { - should_send_heartbeat = 1; - } - - // Send heartbeat if we haven't sent any packets in a while - i64 now_ns = TimeNs(); - if (now_ns - peer->last_packet_sent_ns > heartbeat_threshold_ns) - { - should_send_heartbeat = 1; - } - - if (should_send_heartbeat) - { - struct sockaddr_in6 addr = NET_W32_AddressFromKey(peer->key); - i64 buff_len = 0; - u8 buff[Kibi(2)]; - NET_W32_PacketHeader header = Zi; - { - header.magic = magic; - header.flags = NET_W32_PacketFlag_Heartbeat; - header.bottom_ack = peer->bottom_ack; - header.ack_bits = peer->ack_bits; - } - CopyBytes(buff, &header, sizeof(header)); - buff_len += sizeof(header); - sendto( - pipe->udp, - (char *)buff, - buff_len, - 0, - (struct sockaddr *)&addr, - sizeof(addr) - ); - peer->last_packet_sent_ns = now_ns; - } - } } EndScratch(scratch); diff --git a/src/net/net_win32/net_win32.h b/src/net/net_win32/net_win32.h index 854e992a..7c019d7c 100644 --- a/src/net/net_win32/net_win32.h +++ b/src/net/net_win32/net_win32.h @@ -81,9 +81,9 @@ Struct(NET_W32_Peer) NET_Key key; i64 remote_bottom_ack; - i64 remote_ack_bits; + u64 remote_ack_bits; i64 bottom_ack; - i64 ack_bits; + u64 ack_bits; NET_W32_Packet *first_remote_packet; NET_W32_Packet *last_remote_packet; @@ -101,7 +101,6 @@ Struct(NET_W32_Peer) i64 last_packet_received_ns; i64 last_packet_sent_ns; i64 num_msg_packets_received_this_frame; - i64 num_msg_packets_sent_this_frame; }; Struct(NET_W32_PeerBin)