enet.odin 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. package ENet
  2. when ODIN_OS == .Windows {
  3. when ODIN_ARCH == .amd64 {
  4. foreign import ENet {
  5. "lib/enet64.lib",
  6. "system:Ws2_32.lib",
  7. "system:Winmm.lib",
  8. }
  9. } else {
  10. foreign import ENet {
  11. "lib/enet.lib",
  12. "system:Ws2_32.lib",
  13. "system:Winmm.lib",
  14. }
  15. }
  16. } else {
  17. foreign import ENet "system:enet"
  18. }
  19. VERSION_MAJOR :: u8(1)
  20. VERSION_MINOR :: u8(3)
  21. VERSION_PATCH :: u8(17)
  22. VERSION_CREATE :: #force_inline proc "contextless" (major, minor, patch: u8) -> u32 {
  23. return (u32(major) << 16) | (u32(minor) << 8) | u32(patch)
  24. }
  25. VERSION_GET_MAJOR :: #force_inline proc "contextless" (version: u32) -> u8 {
  26. return u8((version >> 16) & 0xff)
  27. }
  28. VERSION_GET_MINOR :: #force_inline proc "contextless" (version: u32) -> u8 {
  29. return u8((version >> 8) & 0xff)
  30. }
  31. VERSION_GET_PATCH :: #force_inline proc "contextless" (version: u32) -> u8 {
  32. return u8(version & 0xff)
  33. }
  34. // Odin does not have "macros" or compile-time evaluation of functions, so the
  35. // following is just the same as.
  36. // VERSION :: VERSION_CREATE(VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
  37. VERSION :: (u32(VERSION_MAJOR) << 16) | (u32(VERSION_MINOR) << 8) | u32(VERSION_PATCH)
  38. // Network byte order is always Big Endian. Instead of using the method ENet
  39. // uses (leveraging {n,h}to{n,h}{s,l}), we can just use Odin's endianess types
  40. // to get the correct byte swaps, if any.
  41. HOST_TO_NET_16 :: #force_inline proc "contextless" (value: u16) -> u16 {
  42. return transmute(u16)u16be(value)
  43. }
  44. HOST_TO_NET_32 :: #force_inline proc "contextless" (value: u32) -> u32 {
  45. return transmute(u32)u32be(value)
  46. }
  47. NET_TO_HOST_16 :: #force_inline proc "contextless" (value: u16) -> u16 {
  48. return u16(transmute(u16be)value)
  49. }
  50. NET_TO_HOST_32 :: #force_inline proc "contextless" (value: u32) -> u32 {
  51. return u32(transmute(u32be)value)
  52. }
  53. Version :: u32
  54. SocketType :: enum i32 {
  55. STREAM = 1,
  56. DATAGRAM = 2,
  57. }
  58. SocketWait :: enum i32 {
  59. NONE = 0,
  60. SEND = 1 << 0,
  61. RECEIVE = 1 << 1,
  62. INTERRUPT = 1 << 2,
  63. }
  64. SocketOption :: enum i32 {
  65. NONBLOCK = 1,
  66. BROADCAST = 2,
  67. RCVBUF = 3,
  68. SNDBUF = 4,
  69. REUSEADDR = 5,
  70. RCVTIMEO = 6,
  71. SNDTIMEO = 7,
  72. ERROR = 8,
  73. NODELAY = 9,
  74. }
  75. SocketShutdown :: enum i32 {
  76. READ = 0,
  77. WRITE = 1,
  78. READ_WRITE = 2,
  79. }
  80. HOST_ANY :: u32(0)
  81. HOST_BROADCAST :: u32(0xffffffff)
  82. PORT_ANY :: u16(0)
  83. Address :: struct {
  84. host: u32,
  85. port: u16,
  86. }
  87. PacketFlags :: bit_set[PacketFlag; i32]
  88. PacketFlag :: enum i32 {
  89. RELIABLE = 0,
  90. UNSEQUENCED = 1,
  91. NO_ALLOCATE = 2,
  92. UNRELIABLE_FRAGMENT = 3,
  93. FLAG_SENT = 8,
  94. }
  95. PacketFreeCallback :: proc "c" (packet: ^Packet)
  96. Packet :: struct {
  97. referenceCount: uint,
  98. flags: u32,
  99. data: [^]u8 `fmt:"v,dataLength"`,
  100. dataLength: uint,
  101. freeCallback: PacketFreeCallback,
  102. userData: rawptr,
  103. }
  104. Acknowledgment :: struct {
  105. acknowledgementList: ListNode,
  106. sentTime: u32,
  107. command: Protocol,
  108. }
  109. OutgoingCommand :: struct {
  110. outgoingCommandList: ListNode,
  111. reliableSequenceNumber: u16,
  112. unreliableSequenceNumber: u16,
  113. sentTime: u32,
  114. roundTripTimeout: u32,
  115. roundTripTimeoutLimit: u32,
  116. fragmentOffset: u32,
  117. fragmentLength: u16,
  118. sendAttempts: u16,
  119. command: Protocol,
  120. packet: ^Packet,
  121. }
  122. IncomingCommand :: struct {
  123. incomingCommandList: ListNode,
  124. reliableSequenceNumber: u16,
  125. unreliableSequenceNumber: u16,
  126. command: Protocol,
  127. fragmentCount: u32,
  128. fragmentsRemaining: u32,
  129. fragments: [^]u32 `fmt:"v,fragmentCount"`,
  130. packet: ^Packet,
  131. }
  132. PeerState :: enum i32 {
  133. DISCONNECTED,
  134. CONNECTING,
  135. ACKNOWLEDGING_CONNECT,
  136. CONNECTION_PENDING,
  137. CONNECTION_SUCCEEDED,
  138. CONNECTED,
  139. DISCONNECT_LATER,
  140. DISCONNECTING,
  141. ACKNOWLEDGING_DISCONNECT,
  142. ZOMBIE,
  143. }
  144. BUFFER_MAXIMUM :: (1 + 2 * PROTOCOL_MAXIMUM_PACKET_COMMANDS)
  145. HOST_RECEIVE_BUFFER_SIZE :: 256 * 1024
  146. HOST_SEND_BUFFER_SIZE :: 256 * 1024
  147. HOST_BANDWIDTH_THROTTLE_INTERVAL :: 1000
  148. HOST_DEFAULT_MTU :: 1400
  149. HOST_DEFAULT_MAXIMUM_PACKET_SIZE :: 32 * 1024 * 1024
  150. HOST_DEFAULT_MAXIMUM_WAITING_DATA :: 32 * 1024 * 1024
  151. PEER_DEFAULT_ROUND_TRIP_TIME :: 500
  152. PEER_DEFAULT_PACKET_THROTTLE :: 32
  153. PEER_PACKET_THROTTLE_SCALE :: 32
  154. PEER_PACKET_THROTTLE_COUNTER :: 7
  155. PEER_PACKET_THROTTLE_ACCELERATION :: 2
  156. PEER_PACKET_THROTTLE_DECELERATION :: 2
  157. PEER_PACKET_THROTTLE_INTERVAL :: 5000
  158. PEER_PACKET_LOSS_SCALE :: 1 << 16
  159. PEER_PACKET_LOSS_INTERVAL :: 10000
  160. PEER_WINDOW_SIZE_SCALE :: 64 * 1024
  161. PEER_TIMEOUT_LIMIT :: 32
  162. PEER_TIMEOUT_MINIMUM :: 5000
  163. PEER_TIMEOUT_MAXIMUM :: 30000
  164. PEER_PING_INTERVAL :: 500
  165. PEER_UNSEQUENCED_WINDOWS :: 64
  166. PEER_UNSEQUENCED_WINDOW_SIZE :: 1024
  167. PEER_FREE_UNSEQUENCED_WINDOWS :: 32
  168. PEER_RELIABLE_WINDOWS :: 16
  169. PEER_RELIABLE_WINDOW_SIZE :: 0x1000
  170. PEER_FREE_RELIABLE_WINDOWS :: 8
  171. Channel :: struct {
  172. outgoingReliableSequenceNumber: u16,
  173. outgoingUnreliableSequenceNumber: u16,
  174. usedReliableWindows: u16,
  175. reliableWindows: [PEER_RELIABLE_WINDOWS]u16,
  176. incomingReliableSequenceNumber: u16,
  177. incomingUnreliableSequenceNumber: u16,
  178. incomingReliableCommands: List,
  179. incomingUnreliableCommands: List,
  180. }
  181. PeerFlag :: enum i32 {
  182. NEEDS_DISPATCH,
  183. }
  184. Peer :: struct {
  185. dispatchList: ListNode,
  186. host: ^Host,
  187. outgoingPeerID: u16,
  188. incomingPeerID: u16,
  189. connectID: u32,
  190. outgoingSessionID: u8,
  191. incomingSessionID: u8,
  192. address: Address,
  193. data: rawptr,
  194. state: PeerState,
  195. channels: [^]Channel `fmt:"v,channelCount"`,
  196. channelCount: uint,
  197. incomingBandwidth: u32,
  198. outgoingBandwidth: u32,
  199. incomingBandwidthThrottleEpoch: u32,
  200. outgoingBandwidthThrottleEpoch: u32,
  201. incomingDataTotal: u32,
  202. outgoingDataTotal: u32,
  203. lastSendTime: u32,
  204. lastReceiveTime: u32,
  205. nextTimeout: u32,
  206. earliestTimeout: u32,
  207. packetLossEpoch: u32,
  208. packetsSent: u32,
  209. packetsLost: u32,
  210. packetLoss: u32,
  211. packetLossVariance: u32,
  212. packetThrottle: u32,
  213. packetThrottleLimit: u32,
  214. packetThrottleCounter: u32,
  215. packetThrottleEpoch: u32,
  216. packetThrottleAcceleration: u32,
  217. packetThrottleDeceleration: u32,
  218. packetThrottleInterval: u32,
  219. pingInterval: u32,
  220. timeoutLimit: u32,
  221. timeoutMinimum: u32,
  222. timeoutMaximum: u32,
  223. lastRoundTripTime: u32,
  224. lowestRoundTripTime: u32,
  225. lastRoundTripTimeVariance: u32,
  226. highestRoundTripTimeVariance: u32,
  227. roundTripTime: u32,
  228. roundTripTimeVariance: u32,
  229. mtu: u32,
  230. windowSize: u32,
  231. reliableDataInTransit: u32,
  232. outgoingReliableSequenceNumber: u16,
  233. acknowledgements: List,
  234. sentReliableCommands: List,
  235. sentUnreliableCommands: List,
  236. outgoingCommands: List,
  237. dispatchedCommands: List,
  238. flags: u16,
  239. reserved: u16,
  240. incomingUnsequencedGroup: u16,
  241. outgoingUnsequencedGroup: u16,
  242. unsequencedWindow: [PEER_UNSEQUENCED_WINDOW_SIZE / 32]u32,
  243. eventData: u32,
  244. totalWaitingData: uint,
  245. }
  246. Compressor :: struct {
  247. context_: rawptr,
  248. compress: proc "c" (context_: rawptr, inBuffers: [^]Buffer, inBufferCount: uint, inLimit: uint, outData: [^]u8, outLimit: uint) -> uint,
  249. decompress: proc "c" (context_: rawptr, inData: [^]u8, inLimit: uint, outData: [^]u8, outLimit: uint) -> uint,
  250. destroy: proc "c" (context_: rawptr),
  251. }
  252. ChecksumCallback :: proc "c" (buffers: [^]Buffer, bufferCount: uint) -> u32
  253. InterceptCallback :: proc "c" (host: ^Host, event: ^Event) -> i32
  254. Host :: struct {
  255. socket: Socket,
  256. address: Address,
  257. incomingBandwidth: u32,
  258. outgoingBandwidth: u32,
  259. bandwidthThrottleEpoch: u32,
  260. mtu: u32,
  261. randomSeed: u32,
  262. recalculateBandwidthLimits: i32,
  263. peers: [^]Peer `fmt:"v,peerCount"`,
  264. peerCount: uint,
  265. channelLimit: uint,
  266. serviceTime: u32,
  267. dispatchQueue: List,
  268. continueSending: i32,
  269. packetSize: uint,
  270. headerFlags: u16,
  271. commands: [PROTOCOL_MAXIMUM_PACKET_COMMANDS]Protocol,
  272. commandCount: uint,
  273. buffers: [BUFFER_MAXIMUM]Buffer,
  274. bufferCount: uint,
  275. checksum: ChecksumCallback,
  276. compressor: Compressor,
  277. packetData: [2][PROTOCOL_MAXIMUM_MTU]u8,
  278. receivedAddress: Address,
  279. receivedData: [^]u8 `fmt:"v,receivedDataLength"`,
  280. receivedDataLength: uint,
  281. totalSentData: u32,
  282. totalSentPackets: u32,
  283. totalReceivedData: u32,
  284. totalReceivedPackets: u32,
  285. intercept: InterceptCallback,
  286. connectedPeers: uint,
  287. bandwidthLimitedPeers: uint,
  288. duplicatePeers: uint,
  289. maximumPacketSize: uint,
  290. maximumWaitingData: uint,
  291. }
  292. EventType :: enum i32 {
  293. NONE = 0,
  294. CONNECT = 1,
  295. DISCONNECT = 2,
  296. RECEIVE = 3,
  297. }
  298. Event :: struct {
  299. type: EventType,
  300. peer: ^Peer,
  301. channelID: u8,
  302. data: u32,
  303. packet: ^Packet,
  304. }
  305. @(default_calling_convention="c", link_prefix="enet_")
  306. foreign ENet {
  307. initialize :: proc() -> i32 ---
  308. initialize_with_callbacks :: proc(version: Version, inits: ^Callbacks) -> i32 ---
  309. deinitialize :: proc() ---
  310. linked_version :: proc() -> Version ---
  311. time_get :: proc() -> u32 ---
  312. time_set :: proc(newTimeBase: u32) ---
  313. socket_create :: proc(SocketType) -> Socket ---
  314. socket_bind :: proc(socket: Socket, address: ^Address) -> i32 ---
  315. socket_get_address :: proc(socket: Socket, address: ^Address) -> i32 ---
  316. socket_listen :: proc(socket: Socket, backlog: i32) -> i32 ---
  317. socket_accept :: proc(socket: Socket, address: ^Address) -> Socket ---
  318. socket_connect :: proc(socket: Socket, address: ^Address) -> i32 ---
  319. socket_send :: proc(socket: Socket, address: ^Address, buffers: [^]Buffer, bufferCount: uint) -> i32 ---
  320. socket_receive :: proc(socket: Socket, address: ^Address, buffers: [^]Buffer, bufferCount: uint) -> i32 ---
  321. socket_wait :: proc(socket: Socket, condition: ^u32, timeout: u32) -> i32 ---
  322. socket_set_option :: proc(socket: Socket, option: SocketOption, value: i32) -> i32 ---
  323. socket_get_option :: proc(socket: Socket, option: SocketOption, value: ^i32) -> i32 ---
  324. socket_shutdown :: proc(socket: Socket, how: SocketShutdown) -> i32 ---
  325. socket_destroy :: proc(socket: Socket) ---
  326. socketset_select :: proc(socket: Socket, readSet: ^SocketSet, writeSet: ^SocketSet, timeout: u32) -> i32 ---
  327. address_set_host_ip :: proc(address: ^Address, hostName: cstring) -> i32 ---
  328. address_set_host :: proc(address: ^Address, hostName: cstring) -> i32 ---
  329. address_get_host_ip :: proc(address: ^Address, hostName: [^]u8, nameLength: uint) -> i32 ---
  330. address_get_host :: proc(address: ^Address, hostName: [^]u8, nameLength: uint) -> i32 ---
  331. packet_create :: proc(data: rawptr, dataLength: uint, flags: PacketFlags) -> ^Packet ---
  332. packet_destroy :: proc(packet: ^Packet) ---
  333. packet_resize :: proc(packet: ^Packet, dataLength: uint) -> i32 ---
  334. crc32 :: proc(buffers: [^]Buffer, bufferCount: uint) -> u32 ---
  335. host_create :: proc(address: ^Address, peerCount: uint, channelLimit: uint, incomingBandwidth: u32, outgoingBandwidth: u32) -> ^Host ---
  336. host_destroy :: proc(host: ^Host) ---
  337. host_connect :: proc(host: ^Host, address: ^Address, channelCount: uint, data: u32) -> ^Peer ---
  338. host_check_events :: proc(host: ^Host, event: ^Event) -> i32 ---
  339. host_service :: proc(host: ^Host, event: ^Event, timeout: u32) -> i32 ---
  340. host_flush :: proc(host: ^Host) ---
  341. host_broadcast :: proc(host: ^Host, channelID: u8, packet: ^Packet) ---
  342. host_compress :: proc(host: ^Host, compressor: ^Compressor) ---
  343. host_compress_with_range_coder :: proc(host: ^Host) -> i32 ---
  344. host_channel_limit :: proc(host: ^Host, channelLimit: uint) ---
  345. host_bandwidth_limit :: proc(host: ^Host, incomingBandwidth: u32, outgoingBandwidth: u32) ---
  346. peer_send :: proc(peer: ^Peer, channelID: u8, packet: ^Packet) -> i32 ---
  347. peer_receive :: proc(peer: ^Peer, channelID: ^u8) -> ^Packet ---
  348. peer_ping :: proc(peer: ^Peer) ---
  349. peer_ping_interval :: proc(peer: ^Peer, pingInterval: u32) ---
  350. peer_timeout :: proc(peer: ^Peer, timoutLimit: u32, timeoutMinimum: u32, timeoutMaximum: u32) ---
  351. peer_reset :: proc(peer: ^Peer) ---
  352. peer_disconnect :: proc(peer: ^Peer, data: u32) ---
  353. peer_disconnect_now :: proc(peer: ^Peer, data: u32) ---
  354. peer_disconnect_later :: proc(peer: ^Peer, data: u32) ---
  355. peer_throttle_configure :: proc(peer: ^Peer, interval: u32, acceleration: u32, deceleration: u32) ---
  356. range_coder_create :: proc() -> rawptr ---
  357. range_coder_destroy :: proc(ctx: rawptr) ---
  358. range_coder_compress :: proc(ctx: rawptr, inBuffers: [^]Buffer, inBufferCount: uint, inLimit: uint, outData: [^]u8, outLimit: uint) -> uint ---
  359. range_coder_decompress :: proc(ctx: rawptr, inData: [^]u8, inLimit: uint, outData: [^]u8, outLimit: uint) -> uint ---
  360. }