power_play/src/net/net_win32/net_win32.h

212 lines
4.1 KiB
C

////////////////////////////////////////////////////////////
//~ 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);