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;
|
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)
|
||||||
{
|
{
|
||||||
|
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)
|
if (peer->last_contiguous_packet)
|
||||||
{
|
{
|
||||||
peer->last_contiguous_packet->next = peer->first_fragmented_packet;
|
peer->last_contiguous_packet->next = contig_start;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
peer->first_contiguous_packet = peer->first_fragmented_packet;
|
peer->first_contiguous_packet = contig_start;
|
||||||
}
|
}
|
||||||
peer->first_fragmented_packet->prev = peer->last_contiguous_packet;
|
contig_start->prev = peer->last_contiguous_packet;
|
||||||
peer->last_contiguous_packet = packet;
|
peer->last_contiguous_packet = contig_end;
|
||||||
peer->first_fragmented_packet = packet->next;
|
|
||||||
if (peer->last_fragmented_packet == packet)
|
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
|
||||||
|
|
||||||
@ -847,39 +883,51 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
peer->num_msg_packets_sent_this_frame += 1;
|
i64 now_ns = TimeNs();
|
||||||
peer->last_packet_sent_ns = TimeNs();
|
if (packet->last_sent_ns == 0 || (now_ns - packet->last_sent_ns > msg_resend_threshold_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;
|
peer->num_msg_packets_sent_this_frame += 1;
|
||||||
header.flags = packet->flags;
|
peer->last_packet_sent_ns = now_ns;
|
||||||
header.seq = packet->seq;
|
packet->last_sent_ns = now_ns;
|
||||||
header.msg_seq = packet->msg_seq;
|
|
||||||
header.bottom_ack = peer->bottom_ack;
|
// Transmit unacked packet
|
||||||
header.ack_bits = peer->ack_bits;
|
// 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;
|
packet = next;
|
||||||
|
|||||||
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@ -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)
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user