ikcp.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. //=====================================================================
  2. //
  3. // KCP - A Better ARQ Protocol Implementation
  4. // skywind3000 (at) gmail.com, 2010-2011
  5. //
  6. // Features:
  7. // + Average RTT reduce 30% - 40% vs traditional ARQ like tcp.
  8. // + Maximum RTT reduce three times vs tcp.
  9. // + Lightweight, distributed as a single source file.
  10. //
  11. //=====================================================================
  12. #ifndef __IKCP_H__
  13. #define __IKCP_H__
  14. #include <stddef.h>
  15. #include <stdlib.h>
  16. #include <assert.h>
  17. //=====================================================================
  18. // 32BIT INTEGER DEFINITION
  19. //=====================================================================
  20. #ifndef __INTEGER_32_BITS__
  21. #define __INTEGER_32_BITS__
  22. #if defined(_WIN64) || defined(WIN64) || defined(__amd64__) || \
  23. defined(__x86_64) || defined(__x86_64__) || defined(_M_IA64) || \
  24. defined(_M_AMD64)
  25. typedef unsigned int ISTDUINT32;
  26. typedef int ISTDINT32;
  27. #elif defined(_WIN32) || defined(WIN32) || defined(__i386__) || \
  28. defined(__i386) || defined(_M_X86)
  29. typedef unsigned long ISTDUINT32;
  30. typedef long ISTDINT32;
  31. #elif defined(__MACOS__)
  32. typedef UInt32 ISTDUINT32;
  33. typedef SInt32 ISTDINT32;
  34. #elif defined(__APPLE__) && defined(__MACH__)
  35. #include <sys/types.h>
  36. typedef u_int32_t ISTDUINT32;
  37. typedef int32_t ISTDINT32;
  38. #elif defined(__BEOS__)
  39. #include <sys/inttypes.h>
  40. typedef u_int32_t ISTDUINT32;
  41. typedef int32_t ISTDINT32;
  42. #elif (defined(_MSC_VER) || defined(__BORLANDC__)) && (!defined(__MSDOS__))
  43. typedef unsigned __int32 ISTDUINT32;
  44. typedef __int32 ISTDINT32;
  45. #elif defined(__GNUC__)
  46. #include <stdint.h>
  47. typedef uint32_t ISTDUINT32;
  48. typedef int32_t ISTDINT32;
  49. #else
  50. typedef unsigned long ISTDUINT32;
  51. typedef long ISTDINT32;
  52. #endif
  53. #endif
  54. //=====================================================================
  55. // Integer Definition
  56. //=====================================================================
  57. #ifndef __IINT8_DEFINED
  58. #define __IINT8_DEFINED
  59. typedef char IINT8;
  60. #endif
  61. #ifndef __IUINT8_DEFINED
  62. #define __IUINT8_DEFINED
  63. typedef unsigned char IUINT8;
  64. #endif
  65. #ifndef __IUINT16_DEFINED
  66. #define __IUINT16_DEFINED
  67. typedef unsigned short IUINT16;
  68. #endif
  69. #ifndef __IINT16_DEFINED
  70. #define __IINT16_DEFINED
  71. typedef short IINT16;
  72. #endif
  73. #ifndef __IINT32_DEFINED
  74. #define __IINT32_DEFINED
  75. typedef ISTDINT32 IINT32;
  76. #endif
  77. #ifndef __IUINT32_DEFINED
  78. #define __IUINT32_DEFINED
  79. typedef ISTDUINT32 IUINT32;
  80. #endif
  81. #ifndef __IINT64_DEFINED
  82. #define __IINT64_DEFINED
  83. #if defined(_MSC_VER) || defined(__BORLANDC__)
  84. typedef __int64 IINT64;
  85. #else
  86. typedef long long IINT64;
  87. #endif
  88. #endif
  89. #ifndef __IUINT64_DEFINED
  90. #define __IUINT64_DEFINED
  91. #if defined(_MSC_VER) || defined(__BORLANDC__)
  92. typedef unsigned __int64 IUINT64;
  93. #else
  94. typedef unsigned long long IUINT64;
  95. #endif
  96. #endif
  97. #ifndef INLINE
  98. #if defined(__GNUC__)
  99. #if (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))
  100. #define INLINE __inline__ __attribute__((always_inline))
  101. #else
  102. #define INLINE __inline__
  103. #endif
  104. #elif (defined(_MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__))
  105. #define INLINE __inline
  106. #else
  107. #define INLINE
  108. #endif
  109. #endif
  110. #if (!defined(__cplusplus)) && (!defined(inline))
  111. #define inline INLINE
  112. #endif
  113. //=====================================================================
  114. // QUEUE DEFINITION
  115. //=====================================================================
  116. #ifndef __IQUEUE_DEF__
  117. #define __IQUEUE_DEF__
  118. struct IQUEUEHEAD {
  119. struct IQUEUEHEAD *next, *prev;
  120. };
  121. typedef struct IQUEUEHEAD iqueue_head;
  122. //---------------------------------------------------------------------
  123. // queue init
  124. //---------------------------------------------------------------------
  125. #define IQUEUE_HEAD_INIT(name) { &(name), &(name) }
  126. #define IQUEUE_HEAD(name) \
  127. struct IQUEUEHEAD name = IQUEUE_HEAD_INIT(name)
  128. #define IQUEUE_INIT(ptr) ( \
  129. (ptr)->next = (ptr), (ptr)->prev = (ptr))
  130. #define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
  131. #define ICONTAINEROF(ptr, type, member) ( \
  132. (type*)( ((char*)((type*)ptr)) - IOFFSETOF(type, member)) )
  133. #define IQUEUE_ENTRY(ptr, type, member) ICONTAINEROF(ptr, type, member)
  134. //---------------------------------------------------------------------
  135. // queue operation
  136. //---------------------------------------------------------------------
  137. #define IQUEUE_ADD(node, head) ( \
  138. (node)->prev = (head), (node)->next = (head)->next, \
  139. (head)->next->prev = (node), (head)->next = (node))
  140. #define IQUEUE_ADD_TAIL(node, head) ( \
  141. (node)->prev = (head)->prev, (node)->next = (head), \
  142. (head)->prev->next = (node), (head)->prev = (node))
  143. #define IQUEUE_DEL_BETWEEN(p, n) ((n)->prev = (p), (p)->next = (n))
  144. #define IQUEUE_DEL(entry) (\
  145. (entry)->next->prev = (entry)->prev, \
  146. (entry)->prev->next = (entry)->next, \
  147. (entry)->next = 0, (entry)->prev = 0)
  148. #define IQUEUE_DEL_INIT(entry) do { \
  149. IQUEUE_DEL(entry); IQUEUE_INIT(entry); } while (0)
  150. #define IQUEUE_IS_EMPTY(entry) ((entry) == (entry)->next)
  151. #define iqueue_init IQUEUE_INIT
  152. #define iqueue_entry IQUEUE_ENTRY
  153. #define iqueue_add IQUEUE_ADD
  154. #define iqueue_add_tail IQUEUE_ADD_TAIL
  155. #define iqueue_del IQUEUE_DEL
  156. #define iqueue_del_init IQUEUE_DEL_INIT
  157. #define iqueue_is_empty IQUEUE_IS_EMPTY
  158. #define IQUEUE_FOREACH(iterator, head, TYPE, MEMBER) \
  159. for ((iterator) = iqueue_entry((head)->next, TYPE, MEMBER); \
  160. &((iterator)->MEMBER) != (head); \
  161. (iterator) = iqueue_entry((iterator)->MEMBER.next, TYPE, MEMBER))
  162. #define iqueue_foreach(iterator, head, TYPE, MEMBER) \
  163. IQUEUE_FOREACH(iterator, head, TYPE, MEMBER)
  164. #define iqueue_foreach_entry(pos, head) \
  165. for( (pos) = (head)->next; (pos) != (head) ; (pos) = (pos)->next )
  166. #define __iqueue_splice(list, head) do { \
  167. iqueue_head *first = (list)->next, *last = (list)->prev; \
  168. iqueue_head *at = (head)->next; \
  169. (first)->prev = (head), (head)->next = (first); \
  170. (last)->next = (at), (at)->prev = (last); } while (0)
  171. #define iqueue_splice(list, head) do { \
  172. if (!iqueue_is_empty(list)) __iqueue_splice(list, head); } while (0)
  173. #define iqueue_splice_init(list, head) do { \
  174. iqueue_splice(list, head); iqueue_init(list); } while (0)
  175. #ifdef _MSC_VER
  176. #pragma warning(disable:4311)
  177. #pragma warning(disable:4312)
  178. #pragma warning(disable:4996)
  179. #endif
  180. #endif
  181. //---------------------------------------------------------------------
  182. // BYTE ORDER & ALIGNMENT
  183. //---------------------------------------------------------------------
  184. #ifndef IWORDS_BIG_ENDIAN
  185. #ifdef _BIG_ENDIAN_
  186. #if _BIG_ENDIAN_
  187. #define IWORDS_BIG_ENDIAN 1
  188. #endif
  189. #endif
  190. #ifndef IWORDS_BIG_ENDIAN
  191. #if defined(__hppa__) || \
  192. defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
  193. (defined(__MIPS__) && defined(__MIPSEB__)) || \
  194. defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
  195. defined(__sparc__) || defined(__powerpc__) || \
  196. defined(__mc68000__) || defined(__s390x__) || defined(__s390__)
  197. #define IWORDS_BIG_ENDIAN 1
  198. #endif
  199. #endif
  200. #ifndef IWORDS_BIG_ENDIAN
  201. #define IWORDS_BIG_ENDIAN 0
  202. #endif
  203. #endif
  204. #ifndef IWORDS_MUST_ALIGN
  205. #if defined(__i386__) || defined(__i386) || defined(_i386_)
  206. #define IWORDS_MUST_ALIGN 0
  207. #elif defined(_M_IX86) || defined(_X86_) || defined(__x86_64__)
  208. #define IWORDS_MUST_ALIGN 0
  209. #elif defined(__amd64) || defined(__amd64__)
  210. #define IWORDS_MUST_ALIGN 0
  211. #else
  212. #define IWORDS_MUST_ALIGN 1
  213. #endif
  214. #endif
  215. //=====================================================================
  216. // SEGMENT
  217. //=====================================================================
  218. struct IKCPSEG
  219. {
  220. struct IQUEUEHEAD node;
  221. IUINT32 conv;
  222. IUINT32 cmd;
  223. IUINT32 frg;
  224. IUINT32 wnd;
  225. IUINT32 ts;
  226. IUINT32 sn;
  227. IUINT32 una;
  228. IUINT32 len;
  229. IUINT32 resendts;
  230. IUINT32 rto;
  231. IUINT32 fastack;
  232. IUINT32 xmit;
  233. char data[1];
  234. };
  235. //---------------------------------------------------------------------
  236. // IKCPCB
  237. //---------------------------------------------------------------------
  238. struct IKCPCB
  239. {
  240. IUINT32 conv, mtu, mss, state;
  241. IUINT32 snd_una, snd_nxt, rcv_nxt;
  242. IUINT32 ts_recent, ts_lastack, ssthresh;
  243. IINT32 rx_rttval, rx_srtt, rx_rto, rx_minrto;
  244. IUINT32 snd_wnd, rcv_wnd, rmt_wnd, cwnd, probe;
  245. IUINT32 current, interval, ts_flush, xmit;
  246. IUINT32 nrcv_buf, nsnd_buf;
  247. IUINT32 nrcv_que, nsnd_que;
  248. IUINT32 nodelay, updated;
  249. IUINT32 ts_probe, probe_wait;
  250. IUINT32 dead_link, incr;
  251. struct IQUEUEHEAD snd_queue;
  252. struct IQUEUEHEAD rcv_queue;
  253. struct IQUEUEHEAD snd_buf;
  254. struct IQUEUEHEAD rcv_buf;
  255. IUINT32 *acklist;
  256. IUINT32 ackcount;
  257. IUINT32 ackblock;
  258. void *user;
  259. char *buffer;
  260. int fastresend;
  261. int fastlimit;
  262. int nocwnd, stream;
  263. int logmask;
  264. /*int (*output)(const char *buf, int len, struct IKCPCB *kcp, void *user);*/
  265. /*void (*writelog)(const char *log, struct IKCPCB *kcp, void *user);*/
  266. };
  267. typedef struct IKCPCB ikcpcb;
  268. #define IKCP_LOG_OUTPUT 1
  269. #define IKCP_LOG_INPUT 2
  270. #define IKCP_LOG_SEND 4
  271. #define IKCP_LOG_RECV 8
  272. #define IKCP_LOG_IN_DATA 16
  273. #define IKCP_LOG_IN_ACK 32
  274. #define IKCP_LOG_IN_PROBE 64
  275. #define IKCP_LOG_IN_WINS 128
  276. #define IKCP_LOG_OUT_DATA 256
  277. #define IKCP_LOG_OUT_ACK 512
  278. #define IKCP_LOG_OUT_PROBE 1024
  279. #define IKCP_LOG_OUT_WINS 2048
  280. #ifdef DLL_EXPORTS
  281. #define KCPDLL _declspec(dllexport)
  282. #else
  283. #define KCPDLL
  284. #endif
  285. #ifdef __cplusplus
  286. extern "C" {
  287. #endif
  288. //---------------------------------------------------------------------
  289. // interface
  290. //---------------------------------------------------------------------
  291. KCPDLL IINT64 ikcp_get_unixtime();
  292. // create a new kcp control object, 'conv' must equal in two endpoint
  293. // from the same connection. 'user' will be passed to the output callback
  294. // output callback can be setup like this: 'kcp->output = my_udp_output'
  295. KCPDLL ikcpcb* ikcp_create(IUINT32 conv, void *user);
  296. // release kcp control object
  297. KCPDLL void ikcp_release(ikcpcb *kcp);
  298. // set output callback, which will be invoked by kcp
  299. KCPDLL void ikcp_setoutput(int(*output)(const char *buf, int len, ikcpcb *kcp, void *user));
  300. KCPDLL void ikcp_setlog(void(*writelog)(const char *buf, int len, ikcpcb *kcp, void *user));
  301. // user/upper level recv: returns size, returns below zero for EAGAIN
  302. KCPDLL int ikcp_recv(ikcpcb *kcp, char *buffer, int index, int len);
  303. // user/upper level send, returns below zero for error
  304. KCPDLL int ikcp_send(ikcpcb *kcp, const char *buffer, int offset, int len);
  305. // update state (call it repeatedly, every 10ms-100ms), or you can ask
  306. // ikcp_check when to call it again (without ikcp_input/_send calling).
  307. // 'current' - current timestamp in millisec.
  308. KCPDLL void ikcp_update(ikcpcb *kcp, IUINT32 current);
  309. // Determine when should you invoke ikcp_update:
  310. // returns when you should invoke ikcp_update in millisec, if there
  311. // is no ikcp_input/_send calling. you can call ikcp_update in that
  312. // time, instead of call update repeatly.
  313. // Important to reduce unnacessary ikcp_update invoking. use it to
  314. // schedule ikcp_update (eg. implementing an epoll-like mechanism,
  315. // or optimize ikcp_update when handling massive kcp connections)
  316. KCPDLL IUINT32 ikcp_check(const ikcpcb *kcp, IUINT32 current);
  317. // when you received a low level packet (eg. UDP packet), call it
  318. KCPDLL int ikcp_input(ikcpcb* kcp, const char* data, int offset, int size);
  319. // flush pending data
  320. KCPDLL void ikcp_flush(ikcpcb *kcp);
  321. // check the size of next message in the recv queue
  322. KCPDLL int ikcp_peeksize(const ikcpcb *kcp);
  323. // change MTU size, default is 1400
  324. KCPDLL int ikcp_setmtu(ikcpcb *kcp, int mtu);
  325. // set maximum window size: sndwnd=32, rcvwnd=32 by default
  326. KCPDLL int ikcp_wndsize(ikcpcb *kcp, int sndwnd, int rcvwnd);
  327. // get how many packet is waiting to be sent
  328. KCPDLL int ikcp_waitsnd(const ikcpcb *kcp);
  329. // fastest: ikcp_nodelay(kcp, 1, 20, 2, 1)
  330. // nodelay: 0:disable(default), 1:enable
  331. // interval: internal update timer interval in millisec, default is 100ms
  332. // resend: 0:disable fast resend(default), 1:enable fast resend
  333. // nc: 0:normal congestion control(default), 1:disable congestion control
  334. KCPDLL int ikcp_nodelay(ikcpcb *kcp, int nodelay, int interval, int resend, int nc);
  335. KCPDLL void ikcp_log(ikcpcb *kcp, int mask, const char *fmt, ...);
  336. // setup allocator
  337. KCPDLL void ikcp_allocator(void* (*new_malloc)(size_t), void (*new_free)(void*));
  338. // read conv
  339. KCPDLL IUINT32 ikcp_getconv(const void *ptr);
  340. // set min rto
  341. KCPDLL void ikcp_setminrto(ikcpcb *kcp, int Minrto);
  342. #ifdef __cplusplus
  343. }
  344. #endif
  345. #endif