//////////////////////////////////////////////////////////// //~ Command buff types Struct(NET_W32_Cmd) { NET_W32_Cmd *next; NET_Key key; String data; NET_SendFlag send_flags; }; Struct(NET_W32_CmdList) { i64 count; NET_W32_Cmd *first; NET_W32_Cmd *last; }; Struct(NET_W32_CmdBuff) { Arena *arena; NET_W32_CmdList cmds; }; //////////////////////////////////////////////////////////// //~ Message buff types Struct(NET_W32_MsgBuff) { Arena *arena; NET_MsgList msgs; }; //////////////////////////////////////////////////////////// //~ Packet types #define NET_W32_ProtocolMagic 0xde8c590b Enum(NET_W32_PacketFlag) { NET_W32_PacketFlag_None = 0, NET_W32_PacketFlag_EndMsg = (1 << 0), NET_W32_PacketFlag_Heartbeat = (1 << 2), NET_W32_PacketFlag_Raw = (1 << 3), }; Struct(NET_W32_PacketHeader) { u32 checksum; NET_W32_PacketFlag flags; i64 seq; i64 msg_seq; i64 bottom_ack; u64 ack_bits; }; Struct(NET_W32_Packet) { NET_W32_Packet *next; NET_W32_Packet *prev; NET_W32_PacketFlag flags; i64 seq; i64 msg_seq; String data; i64 last_sent_ns; }; //////////////////////////////////////////////////////////// //~ Peer types Struct(NET_W32_Peer) { NET_W32_Peer *next; NET_W32_Peer *prev; NET_W32_Peer *next_in_bin; NET_W32_Peer *prev_in_bin; u64 hash; NET_Key key; i64 remote_bottom_ack; u64 remote_ack_bits; i64 bottom_ack; u64 ack_bits; // Outgoing packets awaiting acknowledgement NET_W32_Packet *first_remote_packet; NET_W32_Packet *last_remote_packet; // Fragmented msg packets awaiting holes to be filled NET_W32_Packet *first_frag_packet; NET_W32_Packet *last_frag_packet; // Contiguous msg packets awaiting assembly NET_W32_Packet *first_cont_packet; NET_W32_Packet *last_cont_packet; i64 seq; i64 msg_seq; String msg_fragment; i64 last_ack_received_ns; i64 last_ack_sent_ns; i64 num_msg_packets_received_this_frame; }; Struct(NET_W32_PeerBin) { NET_W32_Peer *first; NET_W32_Peer *last; }; //////////////////////////////////////////////////////////// //~ Pipe types Struct(NET_W32_Pipe) { //- IOCP data OVERLAPPED ovl; // First field must be OVERLAPPED for cast from IOCP returns i32 iocp_count; // How many overlapped operations are currently queued. WSABUF recv_wsabuff; struct sockaddr_in6 recv_addr; i32 recv_addr_sz; SOCKET udp; //- Shared data NET_W32_Pipe *next; NET_W32_Pipe *prev; Atomic64 desired_port; // ports >64k become ephemeral Atomic64 seen_desired_port; Atomic64 total_bytes_sent; Atomic64 total_bytes_received; TicketMutex back_cmd_buff_seq_tm; i64 back_cmd_buff_seq; NET_W32_CmdBuff cmd_buffs[2]; TicketMutex back_msg_buff_seq_tm; i64 back_msg_buff_seq; NET_W32_MsgBuff msg_buffs[2]; //- Worker data i64 last_attempted_bind_ns; NET_W32_Peer *first_peer; NET_W32_Peer *last_peer; i64 num_msg_packets_received_this_frame; i64 peer_bins_count; NET_W32_PeerBin *peer_bins; u64 bound_port; }; //////////////////////////////////////////////////////////// //~ State types Struct(NET_W32_DummySocket) { SOCKET sock; i32 addr_size; struct sockaddr_storage addr; }; Struct(NET_W32_Ctx) { TicketMutex pipes_tm; i64 pipes_count; NET_W32_Pipe *first_pipe; NET_W32_Pipe *last_pipe; NET_W32_Peer *first_free_peer; NET_W32_Packet *first_free_packet; HANDLE iocp; Atomic64 signal; Atomic64 seen_signal; }; extern NET_W32_Ctx NET_W32; //////////////////////////////////////////////////////////// //~ Helpers NET_W32_DummySocket NET_W32_CreateDummySocket(void); NET_W32_Pipe *NET_W32_PipeFromHandle(NET_PipeHandle pipe_handle); NET_Key NET_W32_KeyFromAddress(struct sockaddr_in6 addr); struct sockaddr_in6 NET_W32_AddressFromKey(NET_Key key); void NET_W32_SignalWorker(void); NET_W32_Peer *NET_W32_TouchPeerFromKey(NET_W32_Pipe *pipe, NET_Key key); u32 NET_W32_ChecksumFromPacketString(String str); void NET_W32_PostRecv(NET_W32_Pipe *pipe); void NET_W32_SendTo(NET_W32_Pipe *pipe, NET_W32_Peer *peer, NET_W32_PacketHeader header, String data); //////////////////////////////////////////////////////////// //~ Worker void NET_W32_TickForever(WaveLaneCtx *lane);