working net sequencing
This commit is contained in:
parent
673c865d21
commit
e6f1bb6661
@ -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);
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user