network reliability testing
This commit is contained in:
parent
d9451af62e
commit
673c865d21
@ -288,6 +288,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
|
||||
u32 magic = 0xde8c590b;
|
||||
i64 heartbeat_threshold_ns = NsFromSeconds(0.250);
|
||||
i64 passive_run_threshold_ns = NsFromSeconds(0.250);
|
||||
i64 msg_resend_threshold_ns = NsFromSeconds(0.500);
|
||||
|
||||
//////////////////////////////
|
||||
//- Wait
|
||||
@ -561,7 +562,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
|
||||
if (!(header.flags & NET_W32_PacketFlag_Heartbeat))
|
||||
{
|
||||
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.msg_seq),
|
||||
FmtString(src_data)
|
||||
@ -592,10 +593,8 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
|
||||
{
|
||||
is_sequential = 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);
|
||||
should_process = !!(peer->ack_bits & ack_bit);
|
||||
@ -646,21 +645,44 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
|
||||
// Transfer fragmented -> contiguous packets
|
||||
if (is_sequential)
|
||||
{
|
||||
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)
|
||||
{
|
||||
if (tmp->seq == tmp->prev->seq + 1)
|
||||
{
|
||||
contig_end = tmp;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (peer->last_contiguous_packet)
|
||||
{
|
||||
peer->last_contiguous_packet->next = peer->first_fragmented_packet;
|
||||
peer->last_contiguous_packet->next = contig_start;
|
||||
}
|
||||
else
|
||||
{
|
||||
peer->first_contiguous_packet = peer->first_fragmented_packet;
|
||||
peer->first_contiguous_packet = contig_start;
|
||||
}
|
||||
peer->first_fragmented_packet->prev = peer->last_contiguous_packet;
|
||||
peer->last_contiguous_packet = packet;
|
||||
peer->first_fragmented_packet = packet->next;
|
||||
if (peer->last_fragmented_packet == packet)
|
||||
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->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
|
||||
|
||||
// TODO: Maximum message size
|
||||
// TODO: Don't lock if no msgs received on pipe
|
||||
|
||||
{
|
||||
LockTicketMutex(&pipe->back_msg_buff_seq_tm);
|
||||
@ -721,6 +744,18 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
|
||||
first_msg_packet = next;
|
||||
msg_data.text = ArenaNext(msg_buff->arena, u8);
|
||||
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
|
||||
@ -760,6 +795,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
|
||||
String src_data = cmd->data;
|
||||
i64 src_pos = 0;
|
||||
i64 msg_seq = ++peer->msg_seq;
|
||||
LogDebugF("Queued msg with seq %F", FmtSint(msg_seq));
|
||||
|
||||
// TODO: Burst packets
|
||||
|
||||
@ -847,39 +883,51 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
|
||||
}
|
||||
else
|
||||
{
|
||||
peer->num_msg_packets_sent_this_frame += 1;
|
||||
peer->last_packet_sent_ns = TimeNs();
|
||||
|
||||
// Transmit unacked packet
|
||||
// FIXME: Rate limit, don't send if we've already sent in the last second.
|
||||
// NOTE: If we do this we should probably put the net worker on something like a 1-second auto-run timer
|
||||
// TODO: crc32
|
||||
i64 buff_len = 0;
|
||||
u8 buff[Kibi(2)];
|
||||
|
||||
NET_W32_PacketHeader header = Zi;
|
||||
i64 now_ns = TimeNs();
|
||||
if (packet->last_sent_ns == 0 || (now_ns - packet->last_sent_ns > msg_resend_threshold_ns))
|
||||
{
|
||||
header.magic = magic;
|
||||
header.flags = packet->flags;
|
||||
header.seq = packet->seq;
|
||||
header.msg_seq = packet->msg_seq;
|
||||
header.bottom_ack = peer->bottom_ack;
|
||||
header.ack_bits = peer->ack_bits;
|
||||
peer->num_msg_packets_sent_this_frame += 1;
|
||||
peer->last_packet_sent_ns = now_ns;
|
||||
packet->last_sent_ns = now_ns;
|
||||
|
||||
// Transmit unacked packet
|
||||
// FIXME: Rate limit, don't send if we've already sent in the last second.
|
||||
// NOTE: If we do this we should probably put the net worker on something like a 1-second auto-run timer
|
||||
// TODO: crc32
|
||||
i64 buff_len = 0;
|
||||
u8 buff[Kibi(2)];
|
||||
|
||||
NET_W32_PacketHeader header = Zi;
|
||||
{
|
||||
header.magic = magic;
|
||||
header.flags = packet->flags;
|
||||
header.seq = packet->seq;
|
||||
header.msg_seq = packet->msg_seq;
|
||||
header.bottom_ack = peer->bottom_ack;
|
||||
header.ack_bits = peer->ack_bits;
|
||||
}
|
||||
CopyBytes(buff, &header, sizeof(header));
|
||||
buff_len += sizeof(header);
|
||||
|
||||
CopyBytes(buff + buff_len, packet->data.text, packet->data.len);
|
||||
buff_len += packet->data.len;
|
||||
|
||||
sendto(
|
||||
pipe->udp,
|
||||
(char *)buff,
|
||||
buff_len,
|
||||
0,
|
||||
(struct sockaddr *)&addr,
|
||||
sizeof(addr)
|
||||
);
|
||||
|
||||
LogDebugF(
|
||||
"Sent msg packet. seq: %F, msg seq: %F, data: \"%F\"",
|
||||
FmtSint(header.seq),
|
||||
FmtSint(header.msg_seq),
|
||||
FmtString(packet->data)
|
||||
);
|
||||
}
|
||||
CopyBytes(buff, &header, sizeof(header));
|
||||
buff_len += sizeof(header);
|
||||
|
||||
CopyBytes(buff + buff_len, packet->data.text, packet->data.len);
|
||||
buff_len += packet->data.len;
|
||||
|
||||
sendto(
|
||||
pipe->udp,
|
||||
(char *)buff,
|
||||
buff_len,
|
||||
0,
|
||||
(struct sockaddr *)&addr,
|
||||
sizeof(addr)
|
||||
);
|
||||
}
|
||||
}
|
||||
packet = next;
|
||||
|
||||
@ -63,6 +63,8 @@ Struct(NET_W32_Packet)
|
||||
i64 seq;
|
||||
i64 msg_seq;
|
||||
String data;
|
||||
|
||||
i64 last_sent_ns;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
@ -141,6 +141,17 @@ void S_TickForever(WaveLaneCtx *lane)
|
||||
// dst_msg->src_user =
|
||||
DllQueuePush(in_msgs.first, in_msgs.last, dst_msg_node);
|
||||
++in_msgs.count;
|
||||
|
||||
|
||||
|
||||
// {
|
||||
// LogDebugF(
|
||||
// "Server received msg (%F bytes): \"%F\"",
|
||||
// FmtUint(packed.len),
|
||||
// FmtString(packed)
|
||||
// );
|
||||
// }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -3760,9 +3760,14 @@ void V_TickForever(WaveLaneCtx *lane)
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user