network reliability testing

This commit is contained in:
jacob 2026-01-16 14:23:53 -06:00
parent d9451af62e
commit 673c865d21
4 changed files with 109 additions and 43 deletions

View File

@ -288,6 +288,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
u32 magic = 0xde8c590b; u32 magic = 0xde8c590b;
i64 heartbeat_threshold_ns = NsFromSeconds(0.250); i64 heartbeat_threshold_ns = NsFromSeconds(0.250);
i64 passive_run_threshold_ns = NsFromSeconds(0.250); i64 passive_run_threshold_ns = NsFromSeconds(0.250);
i64 msg_resend_threshold_ns = NsFromSeconds(0.500);
////////////////////////////// //////////////////////////////
//- Wait //- Wait
@ -561,7 +562,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
if (!(header.flags & NET_W32_PacketFlag_Heartbeat)) if (!(header.flags & NET_W32_PacketFlag_Heartbeat))
{ {
LogDebugF( LogDebugF(
"Received msg. packet seq: %F, msg seq: %F, data: \"%F\"", "Received msg packet. seq: %F, msg seq: %F, data: \"%F\"",
FmtSint(header.seq), FmtSint(header.seq),
FmtSint(header.msg_seq), FmtSint(header.msg_seq),
FmtString(src_data) FmtString(src_data)
@ -592,10 +593,8 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
{ {
is_sequential = 1; is_sequential = 1;
should_process = 1; should_process = 1;
peer->bottom_ack = header.seq;
peer->ack_bits >>= 1;
} }
else if (header.seq > peer->bottom_ack + 1 && header.seq < peer->bottom_ack + 65) if (header.seq > peer->bottom_ack + 1 && header.seq < peer->bottom_ack + 65)
{ {
u64 ack_bit = (u64)1 << (header.seq - 2 - peer->bottom_ack); u64 ack_bit = (u64)1 << (header.seq - 2 - peer->bottom_ack);
should_process = !!(peer->ack_bits & ack_bit); should_process = !!(peer->ack_bits & ack_bit);
@ -646,21 +645,44 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
// Transfer fragmented -> contiguous packets // Transfer fragmented -> contiguous packets
if (is_sequential) if (is_sequential)
{ {
if (peer->last_contiguous_packet) NET_W32_Packet *contig_start = peer->first_fragmented_packet;
NET_W32_Packet *contig_end = packet;
for (NET_W32_Packet *tmp = packet->next; tmp; tmp = tmp->next)
{ {
peer->last_contiguous_packet->next = peer->first_fragmented_packet; if (tmp->seq == tmp->prev->seq + 1)
{
contig_end = tmp;
} }
else else
{ {
peer->first_contiguous_packet = peer->first_fragmented_packet; break;
} }
peer->first_fragmented_packet->prev = peer->last_contiguous_packet; }
peer->last_contiguous_packet = packet;
peer->first_fragmented_packet = packet->next; if (peer->last_contiguous_packet)
if (peer->last_fragmented_packet == packet) {
peer->last_contiguous_packet->next = contig_start;
}
else
{
peer->first_contiguous_packet = contig_start;
}
contig_start->prev = peer->last_contiguous_packet;
peer->last_contiguous_packet = contig_end;
if (contig_end->next)
{
contig_end->next->prev = 0;
}
else
{ {
peer->last_fragmented_packet = 0; peer->last_fragmented_packet = 0;
} }
peer->first_fragmented_packet = contig_end->next;
contig_end->next = 0;
peer->ack_bits >>= (contig_end->seq - peer->bottom_ack);
peer->bottom_ack = contig_end->seq;
} }
} }
} }
@ -672,6 +694,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
//- Assemble read messages //- Assemble read messages
// TODO: Maximum message size // TODO: Maximum message size
// TODO: Don't lock if no msgs received on pipe
{ {
LockTicketMutex(&pipe->back_msg_buff_seq_tm); LockTicketMutex(&pipe->back_msg_buff_seq_tm);
@ -721,6 +744,18 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
first_msg_packet = next; first_msg_packet = next;
msg_data.text = ArenaNext(msg_buff->arena, u8); msg_data.text = ArenaNext(msg_buff->arena, u8);
msg_data.len = 0; msg_data.len = 0;
LogDebugF(
"Assembled msg with msg seq: %F, data (%F bytes): \"%F\"",
FmtSint(packet->msg_seq),
FmtUint(msg->data.len),
FmtString(msg->data)
);
if (msg->data.len != 1620)
{
DEBUGBREAKABLE;
}
} }
} }
else else
@ -760,6 +795,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
String src_data = cmd->data; String src_data = cmd->data;
i64 src_pos = 0; i64 src_pos = 0;
i64 msg_seq = ++peer->msg_seq; i64 msg_seq = ++peer->msg_seq;
LogDebugF("Queued msg with seq %F", FmtSint(msg_seq));
// TODO: Burst packets // TODO: Burst packets
@ -846,9 +882,13 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
SllStackPush(NET_W32.first_free_packet, packet); SllStackPush(NET_W32.first_free_packet, packet);
} }
else else
{
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->num_msg_packets_sent_this_frame += 1;
peer->last_packet_sent_ns = TimeNs(); peer->last_packet_sent_ns = now_ns;
packet->last_sent_ns = now_ns;
// Transmit unacked packet // Transmit unacked packet
// FIXME: Rate limit, don't send if we've already sent in the last second. // FIXME: Rate limit, don't send if we've already sent in the last second.
@ -880,6 +920,14 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
(struct sockaddr *)&addr, (struct sockaddr *)&addr,
sizeof(addr) sizeof(addr)
); );
LogDebugF(
"Sent msg packet. seq: %F, msg seq: %F, data: \"%F\"",
FmtSint(header.seq),
FmtSint(header.msg_seq),
FmtString(packet->data)
);
}
} }
} }
packet = next; packet = next;

View File

@ -63,6 +63,8 @@ Struct(NET_W32_Packet)
i64 seq; i64 seq;
i64 msg_seq; i64 msg_seq;
String data; String data;
i64 last_sent_ns;
}; };
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////

View File

@ -141,6 +141,17 @@ void S_TickForever(WaveLaneCtx *lane)
// dst_msg->src_user = // dst_msg->src_user =
DllQueuePush(in_msgs.first, in_msgs.last, dst_msg_node); DllQueuePush(in_msgs.first, in_msgs.last, dst_msg_node);
++in_msgs.count; ++in_msgs.count;
// {
// LogDebugF(
// "Server received msg (%F bytes): \"%F\"",
// FmtUint(packed.len),
// FmtString(packed)
// );
// }
} }
} }

View File

@ -3760,9 +3760,14 @@ void V_TickForever(WaveLaneCtx *lane)
NET_Key server_key = NET_KeyFromString(Lit("127.0.0.1"), Lit("22121")); NET_Key server_key = NET_KeyFromString(Lit("127.0.0.1"), Lit("22121"));
if (frame->held_buttons[Button_R]) if (frame->held_buttons[Button_R] && !prev_frame->held_buttons[Button_R])
{ {
NET_Push(net_pipe, server_key, Lit("HELLO!!!!"), 0); for (i64 i = 0; i < 100; ++i)
{
// NET_Push(net_pipe, server_key, Lit("HELLO!!!!"), 0);
NET_Push(net_pipe, server_key, Lit("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 0);
}
// NET_Push(net_pipe, server_key, Lit("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), 0);
} }