diff --git a/src/net/net_win32/net_win32.c b/src/net/net_win32/net_win32.c index d0be06f0..7424c0ee 100644 --- a/src/net/net_win32/net_win32.c +++ b/src/net/net_win32/net_win32.c @@ -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; diff --git a/src/net/net_win32/net_win32.h b/src/net/net_win32/net_win32.h index 2c686c61..854e992a 100644 --- a/src/net/net_win32/net_win32.h +++ b/src/net/net_win32/net_win32.h @@ -63,6 +63,8 @@ Struct(NET_W32_Packet) i64 seq; i64 msg_seq; String data; + + i64 last_sent_ns; }; //////////////////////////////////////////////////////////// diff --git a/src/pp/pp_sim/pp_sim_core.c b/src/pp/pp_sim/pp_sim_core.c index 8060597f..298f87c6 100644 --- a/src/pp/pp_sim/pp_sim_core.c +++ b/src/pp/pp_sim/pp_sim_core.c @@ -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) + // ); + // } + } } diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index 6f2b429e..2297db6e 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -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); }