#define NET_PacketSize 1024 #define NET_Ephemeral 0xFFFFFFFFFFFFFFFFull //////////////////////////////////////////////////////////// //~ Opaque types Struct(NET_PipeHandle) { u64 v; }; #define NET_IsPipeNil(h) ((h).v == 0) //////////////////////////////////////////////////////////// //~ Key types Struct(NET_Key) { u8 addr[32]; }; #define NET_NilKey ((NET_Key) { 0 }) #define NET_IsKeyNil(k) (MatchStructZero(&k)) //////////////////////////////////////////////////////////// //~ Send types Enum(NET_SendFlag) { NET_SendFlag_None = 0, // Raw messages send unreliably and immediately // NOTE: Raw message data exceeding packet size will drop NET_SendFlag_Raw = (1 << 0), }; //////////////////////////////////////////////////////////// //~ Message types Struct(NET_Msg) { NET_Msg *next; NET_Msg *prev; NET_Key sender; String data; }; Struct(NET_MsgList) { i64 count; NET_Msg *first; NET_Msg *last; }; //////////////////////////////////////////////////////////// //~ Stat types Struct(NET_PipeStatistics) { i64 total_bytes_sent; i64 total_bytes_received; }; //////////////////////////////////////////////////////////// //~ @hookdecl Bootstrap void NET_Bootstrap(void); //////////////////////////////////////////////////////////// //~ @hookdecl Net ops NET_Key NET_KeyFromString(String host, String port); String NET_StringFromKey(Arena *arena, NET_Key key); b32 NET_MatchKey(NET_Key a, NET_Key b); u64 NET_HashFromKey(NET_Key key); NET_PipeHandle NET_AcquirePipe(void); void NET_Listen(NET_PipeHandle pipe_handle, u64 port); NET_MsgList NET_Swap(Arena *arena, NET_PipeHandle pipe_handle); void NET_Send(NET_PipeHandle pipe_handle, NET_Key dst, String data, NET_SendFlag flags); NET_PipeStatistics NET_StatsFromPipe(NET_PipeHandle pipe_handle);