ikcp.h 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711
  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. #define KCP_VERSION 107 // 1.7
  15. #include <stddef.h>
  16. #include <stdlib.h>
  17. #include <assert.h>
  18. namespace asio2::detail::kcp {
  19. //=====================================================================
  20. // 32BIT INTEGER DEFINITION
  21. //=====================================================================
  22. #ifndef __INTEGER_32_BITS__
  23. #define __INTEGER_32_BITS__
  24. #if defined(_WIN64) || defined(WIN64) || defined(__amd64__) || \
  25. defined(__x86_64) || defined(__x86_64__) || defined(_M_IA64) || \
  26. defined(_M_AMD64)
  27. typedef unsigned int ISTDUINT32;
  28. typedef int ISTDINT32;
  29. #elif defined(_WIN32) || defined(WIN32) || defined(__i386__) || \
  30. defined(__i386) || defined(_M_X86)
  31. typedef unsigned long ISTDUINT32;
  32. typedef long ISTDINT32;
  33. #elif defined(__MACOS__)
  34. typedef UInt32 ISTDUINT32;
  35. typedef SInt32 ISTDINT32;
  36. #elif defined(__APPLE__) && defined(__MACH__)
  37. #include <sys/types.h>
  38. typedef u_int32_t ISTDUINT32;
  39. typedef int32_t ISTDINT32;
  40. #elif defined(__BEOS__)
  41. #include <sys/inttypes.h>
  42. typedef u_int32_t ISTDUINT32;
  43. typedef int32_t ISTDINT32;
  44. #elif (defined(_MSC_VER) || defined(__BORLANDC__)) && (!defined(__MSDOS__))
  45. typedef unsigned __int32 ISTDUINT32;
  46. typedef __int32 ISTDINT32;
  47. #elif defined(__GNUC__)
  48. #include <stdint.h>
  49. typedef uint32_t ISTDUINT32;
  50. typedef int32_t ISTDINT32;
  51. #else
  52. typedef unsigned long ISTDUINT32;
  53. typedef long ISTDINT32;
  54. #endif
  55. #endif
  56. //=====================================================================
  57. // Integer Definition
  58. //=====================================================================
  59. #ifndef __IINT8_DEFINED
  60. #define __IINT8_DEFINED
  61. typedef char IINT8;
  62. #endif
  63. #ifndef __IUINT8_DEFINED
  64. #define __IUINT8_DEFINED
  65. typedef unsigned char IUINT8;
  66. #endif
  67. #ifndef __IUINT16_DEFINED
  68. #define __IUINT16_DEFINED
  69. typedef unsigned short IUINT16;
  70. #endif
  71. #ifndef __IINT16_DEFINED
  72. #define __IINT16_DEFINED
  73. typedef short IINT16;
  74. #endif
  75. #ifndef __IINT32_DEFINED
  76. #define __IINT32_DEFINED
  77. typedef ISTDINT32 IINT32;
  78. #endif
  79. #ifndef __IUINT32_DEFINED
  80. #define __IUINT32_DEFINED
  81. typedef ISTDUINT32 IUINT32;
  82. #endif
  83. #ifndef __IINT64_DEFINED
  84. #define __IINT64_DEFINED
  85. #if defined(_MSC_VER) || defined(__BORLANDC__)
  86. typedef __int64 IINT64;
  87. #else
  88. typedef long long IINT64;
  89. #endif
  90. #endif
  91. #ifndef __IUINT64_DEFINED
  92. #define __IUINT64_DEFINED
  93. #if defined(_MSC_VER) || defined(__BORLANDC__)
  94. typedef unsigned __int64 IUINT64;
  95. #else
  96. typedef unsigned long long IUINT64;
  97. #endif
  98. #endif
  99. #ifndef INLINE
  100. #if defined(__GNUC__)
  101. #if (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))
  102. #define INLINE __inline__ __attribute__((always_inline))
  103. #else
  104. #define INLINE __inline__
  105. #endif
  106. #elif (defined(_MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__))
  107. #define INLINE __inline
  108. #else
  109. #define INLINE
  110. #endif
  111. #endif
  112. #if (!defined(__cplusplus)) && (!defined(inline))
  113. #define inline INLINE
  114. #endif
  115. //=====================================================================
  116. // QUEUE DEFINITION
  117. //=====================================================================
  118. #ifndef __IQUEUE_DEF__
  119. #define __IQUEUE_DEF__
  120. struct IQUEUEHEAD {
  121. struct IQUEUEHEAD *next, *prev;
  122. };
  123. typedef struct IQUEUEHEAD iqueue_head;
  124. //---------------------------------------------------------------------
  125. // queue init
  126. //---------------------------------------------------------------------
  127. #define IQUEUE_HEAD_INIT(name) { &(name), &(name) }
  128. #define IQUEUE_HEAD(name) \
  129. struct IQUEUEHEAD name = IQUEUE_HEAD_INIT(name)
  130. #define IQUEUE_INIT(ptr) ( \
  131. (ptr)->next = (ptr), (ptr)->prev = (ptr))
  132. #define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
  133. #define ICONTAINEROF(ptr, type, member) ( \
  134. (type*)( ((char*)((type*)ptr)) - IOFFSETOF(type, member)) )
  135. #define IQUEUE_ENTRY(ptr, type, member) ICONTAINEROF(ptr, type, member)
  136. //---------------------------------------------------------------------
  137. // queue operation
  138. //---------------------------------------------------------------------
  139. #define IQUEUE_ADD(node, head) ( \
  140. (node)->prev = (head), (node)->next = (head)->next, \
  141. (head)->next->prev = (node), (head)->next = (node))
  142. #define IQUEUE_ADD_TAIL(node, head) ( \
  143. (node)->prev = (head)->prev, (node)->next = (head), \
  144. (head)->prev->next = (node), (head)->prev = (node))
  145. #define IQUEUE_DEL_BETWEEN(p, n) ((n)->prev = (p), (p)->next = (n))
  146. #define IQUEUE_DEL(entry) (\
  147. (entry)->next->prev = (entry)->prev, \
  148. (entry)->prev->next = (entry)->next, \
  149. (entry)->next = 0, (entry)->prev = 0)
  150. #define IQUEUE_DEL_INIT(entry) do { \
  151. IQUEUE_DEL(entry); IQUEUE_INIT(entry); } while (0)
  152. #define IQUEUE_IS_EMPTY(entry) ((entry) == (entry)->next)
  153. #define iqueue_init IQUEUE_INIT
  154. #define iqueue_entry IQUEUE_ENTRY
  155. #define iqueue_add IQUEUE_ADD
  156. #define iqueue_add_tail IQUEUE_ADD_TAIL
  157. #define iqueue_del IQUEUE_DEL
  158. #define iqueue_del_init IQUEUE_DEL_INIT
  159. #define iqueue_is_empty IQUEUE_IS_EMPTY
  160. #define IQUEUE_FOREACH(iterator, head, TYPE, MEMBER) \
  161. for ((iterator) = iqueue_entry((head)->next, TYPE, MEMBER); \
  162. &((iterator)->MEMBER) != (head); \
  163. (iterator) = iqueue_entry((iterator)->MEMBER.next, TYPE, MEMBER))
  164. #define iqueue_foreach(iterator, head, TYPE, MEMBER) \
  165. IQUEUE_FOREACH(iterator, head, TYPE, MEMBER)
  166. #define iqueue_foreach_entry(pos, head) \
  167. for( (pos) = (head)->next; (pos) != (head) ; (pos) = (pos)->next )
  168. #define __iqueue_splice(list, head) do { \
  169. iqueue_head *first = (list)->next, *last = (list)->prev; \
  170. iqueue_head *at = (head)->next; \
  171. (first)->prev = (head), (head)->next = (first); \
  172. (last)->next = (at), (at)->prev = (last); } while (0)
  173. #define iqueue_splice(list, head) do { \
  174. if (!iqueue_is_empty(list)) __iqueue_splice(list, head); } while (0)
  175. #define iqueue_splice_init(list, head) do { \
  176. iqueue_splice(list, head); iqueue_init(list); } while (0)
  177. #ifdef _MSC_VER
  178. #pragma warning(disable:4311)
  179. #pragma warning(disable:4312)
  180. #pragma warning(disable:4996)
  181. #endif
  182. #endif
  183. //---------------------------------------------------------------------
  184. // BYTE ORDER & ALIGNMENT
  185. //---------------------------------------------------------------------
  186. #ifndef IWORDS_BIG_ENDIAN
  187. #ifdef _BIG_ENDIAN_
  188. #if _BIG_ENDIAN_
  189. #define IWORDS_BIG_ENDIAN 1
  190. #endif
  191. #endif
  192. #ifndef IWORDS_BIG_ENDIAN
  193. #if defined(__hppa__) || \
  194. defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
  195. (defined(__MIPS__) && defined(__MIPSEB__)) || \
  196. defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
  197. defined(__sparc__) || defined(__powerpc__) || \
  198. defined(__mc68000__) || defined(__s390x__) || defined(__s390__)
  199. #define IWORDS_BIG_ENDIAN 1
  200. #endif
  201. #endif
  202. #ifndef IWORDS_BIG_ENDIAN
  203. #define IWORDS_BIG_ENDIAN 0
  204. #endif
  205. #endif
  206. #ifndef IWORDS_MUST_ALIGN
  207. #if defined(__i386__) || defined(__i386) || defined(_i386_)
  208. #define IWORDS_MUST_ALIGN 0
  209. #elif defined(_M_IX86) || defined(_X86_) || defined(__x86_64__)
  210. #define IWORDS_MUST_ALIGN 0
  211. #elif defined(__amd64) || defined(__amd64__)
  212. #define IWORDS_MUST_ALIGN 0
  213. #else
  214. #define IWORDS_MUST_ALIGN 1
  215. #endif
  216. #endif
  217. //=====================================================================
  218. // SEGMENT
  219. //=====================================================================
  220. struct IKCPSEG
  221. {
  222. struct IQUEUEHEAD node;
  223. IUINT32 conv;
  224. IUINT32 cmd;
  225. IUINT32 frg;
  226. IUINT32 wnd;
  227. IUINT32 ts;
  228. IUINT32 sn;
  229. IUINT32 una;
  230. IUINT32 len;
  231. IUINT32 resendts;
  232. IUINT32 rto;
  233. IUINT32 fastack;
  234. IUINT32 xmit;
  235. char data[1];
  236. };
  237. //---------------------------------------------------------------------
  238. // IKCPCB
  239. //---------------------------------------------------------------------
  240. struct IKCPCB
  241. {
  242. IUINT32 conv, mtu, mss, state;
  243. IUINT32 snd_una, snd_nxt, rcv_nxt;
  244. IUINT32 ts_recent, ts_lastack, ssthresh;
  245. IINT32 rx_rttval, rx_srtt, rx_rto, rx_minrto;
  246. IUINT32 snd_wnd, rcv_wnd, rmt_wnd, cwnd, probe;
  247. IUINT32 current, interval, ts_flush, xmit;
  248. IUINT32 nrcv_buf, nsnd_buf;
  249. IUINT32 nrcv_que, nsnd_que;
  250. IUINT32 nodelay, updated;
  251. IUINT32 ts_probe, probe_wait;
  252. IUINT32 dead_link, incr;
  253. struct IQUEUEHEAD snd_queue;
  254. struct IQUEUEHEAD rcv_queue;
  255. struct IQUEUEHEAD snd_buf;
  256. struct IQUEUEHEAD rcv_buf;
  257. IUINT32 *acklist;
  258. IUINT32 ackcount;
  259. IUINT32 ackblock;
  260. void *user;
  261. char *buffer;
  262. int fastresend;
  263. int fastlimit;
  264. int nocwnd, stream;
  265. int logmask;
  266. int (*output)(const char *buf, int len, struct IKCPCB *kcp, void *user);
  267. void (*writelog)(const char *log, struct IKCPCB *kcp, void *user);
  268. };
  269. typedef struct IKCPCB ikcpcb;
  270. #define IKCP_LOG_OUTPUT 1
  271. #define IKCP_LOG_INPUT 2
  272. #define IKCP_LOG_SEND 4
  273. #define IKCP_LOG_RECV 8
  274. #define IKCP_LOG_IN_DATA 16
  275. #define IKCP_LOG_IN_ACK 32
  276. #define IKCP_LOG_IN_PROBE 64
  277. #define IKCP_LOG_IN_WINS 128
  278. #define IKCP_LOG_OUT_DATA 256
  279. #define IKCP_LOG_OUT_ACK 512
  280. #define IKCP_LOG_OUT_PROBE 1024
  281. #define IKCP_LOG_OUT_WINS 2048
  282. //#ifdef __cplusplus
  283. //extern "C" {
  284. //#endif
  285. namespace {
  286. //---------------------------------------------------------------------
  287. // interface
  288. //---------------------------------------------------------------------
  289. // create a new kcp control object, 'conv' must equal in two endpoint
  290. // from the same connection. 'user' will be passed to the output callback
  291. // output callback can be setup like this: 'kcp->output = my_udp_output'
  292. ikcpcb* ikcp_create(IUINT32 conv, void *user);
  293. // release kcp control object
  294. void ikcp_release(ikcpcb *kcp);
  295. // set output callback, which will be invoked by kcp
  296. void ikcp_setoutput(ikcpcb *kcp, int (*output)(const char *buf, int len,
  297. ikcpcb *kcp, void *user));
  298. // user/upper level recv: returns size, returns below zero for EAGAIN
  299. int ikcp_recv(ikcpcb *kcp, char *buffer, int len);
  300. // user/upper level send, returns below zero for error
  301. int ikcp_send(ikcpcb *kcp, const char *buffer, int len);
  302. // update state (call it repeatedly, every 10ms-100ms), or you can ask
  303. // ikcp_check when to call it again (without ikcp_input/_send calling).
  304. // 'current' - current timestamp in millisec.
  305. void ikcp_update(ikcpcb *kcp, IUINT32 current);
  306. // Determine when should you invoke ikcp_update:
  307. // returns when you should invoke ikcp_update in millisec, if there
  308. // is no ikcp_input/_send calling. you can call ikcp_update in that
  309. // time, instead of call update repeatly.
  310. // Important to reduce unnacessary ikcp_update invoking. use it to
  311. // schedule ikcp_update (eg. implementing an epoll-like mechanism,
  312. // or optimize ikcp_update when handling massive kcp connections)
  313. IUINT32 ikcp_check(const ikcpcb *kcp, IUINT32 current);
  314. // when you received a low level packet (eg. UDP packet), call it
  315. int ikcp_input(ikcpcb *kcp, const char *data, long size);
  316. // flush pending data
  317. void ikcp_flush(ikcpcb *kcp);
  318. // check the size of next message in the recv queue
  319. int ikcp_peeksize(const ikcpcb *kcp);
  320. // change MTU size, default is 1400
  321. int ikcp_setmtu(ikcpcb *kcp, int mtu);
  322. // set maximum window size: sndwnd=32, rcvwnd=32 by default
  323. int ikcp_wndsize(ikcpcb *kcp, int sndwnd, int rcvwnd);
  324. // get how many packet is waiting to be sent
  325. int ikcp_waitsnd(const ikcpcb *kcp);
  326. // fastest: ikcp_nodelay(kcp, 1, 20, 2, 1)
  327. // nodelay: 0:disable(default), 1:enable
  328. // interval: internal update timer interval in millisec, default is 100ms
  329. // resend: 0:disable fast resend(default), 1:enable fast resend
  330. // nc: 0:normal congestion control(default), 1:disable congestion control
  331. int ikcp_nodelay(ikcpcb *kcp, int nodelay, int interval, int resend, int nc);
  332. void ikcp_log(ikcpcb *kcp, int mask, const char *fmt, ...);
  333. // setup allocator
  334. void ikcp_allocator(void* (*new_malloc)(size_t), void (*new_free)(void*));
  335. // read conv
  336. IUINT32 ikcp_getconv(const void *ptr);
  337. #include <stddef.h>
  338. #include <stdlib.h>
  339. #include <string.h>
  340. #include <stdarg.h>
  341. #include <stdio.h>
  342. //=====================================================================
  343. // KCP BASIC
  344. //=====================================================================
  345. const IUINT32 IKCP_RTO_NDL = 30; // no delay min rto
  346. const IUINT32 IKCP_RTO_MIN = 100; // normal min rto
  347. const IUINT32 IKCP_RTO_DEF = 200;
  348. const IUINT32 IKCP_RTO_MAX = 60000;
  349. const IUINT32 IKCP_CMD_PUSH = 81; // cmd: push data
  350. const IUINT32 IKCP_CMD_ACK = 82; // cmd: ack
  351. const IUINT32 IKCP_CMD_WASK = 83; // cmd: window probe (ask)
  352. const IUINT32 IKCP_CMD_WINS = 84; // cmd: window size (tell)
  353. const IUINT32 IKCP_ASK_SEND = 1; // need to send IKCP_CMD_WASK
  354. const IUINT32 IKCP_ASK_TELL = 2; // need to send IKCP_CMD_WINS
  355. const IUINT32 IKCP_WND_SND = 32;
  356. const IUINT32 IKCP_WND_RCV = 128; // must >= max fragment size
  357. const IUINT32 IKCP_MTU_DEF = 1400;
  358. const IUINT32 IKCP_ACK_FAST = 3;
  359. const IUINT32 IKCP_INTERVAL = 100;
  360. const IUINT32 IKCP_OVERHEAD = 24;
  361. const IUINT32 IKCP_DEADLINK = 20;
  362. const IUINT32 IKCP_THRESH_INIT = 2;
  363. const IUINT32 IKCP_THRESH_MIN = 2;
  364. const IUINT32 IKCP_PROBE_INIT = 7000; // 7 secs to probe window size
  365. const IUINT32 IKCP_PROBE_LIMIT = 120000; // up to 120 secs to probe window
  366. const IUINT32 IKCP_FASTACK_LIMIT = 5; // max times to trigger fastack
  367. //---------------------------------------------------------------------
  368. // encode / decode
  369. //---------------------------------------------------------------------
  370. /* encode 8 bits unsigned int */
  371. static inline char *ikcp_encode8u(char *p, unsigned char c)
  372. {
  373. *(unsigned char*)p++ = c;
  374. return p;
  375. }
  376. /* decode 8 bits unsigned int */
  377. static inline const char *ikcp_decode8u(const char *p, unsigned char *c)
  378. {
  379. *c = *(unsigned char*)p++;
  380. return p;
  381. }
  382. /* encode 16 bits unsigned int (lsb) */
  383. static inline char *ikcp_encode16u(char *p, unsigned short w)
  384. {
  385. #if IWORDS_BIG_ENDIAN || IWORDS_MUST_ALIGN
  386. *(unsigned char*)(p + 0) = (w & 255);
  387. *(unsigned char*)(p + 1) = (w >> 8);
  388. #else
  389. memcpy(p, &w, 2);
  390. #endif
  391. p += 2;
  392. return p;
  393. }
  394. /* decode 16 bits unsigned int (lsb) */
  395. static inline const char *ikcp_decode16u(const char *p, unsigned short *w)
  396. {
  397. #if IWORDS_BIG_ENDIAN || IWORDS_MUST_ALIGN
  398. *w = *(const unsigned char*)(p + 1);
  399. *w = *(const unsigned char*)(p + 0) + (*w << 8);
  400. #else
  401. memcpy(w, p, 2);
  402. #endif
  403. p += 2;
  404. return p;
  405. }
  406. /* encode 32 bits unsigned int (lsb) */
  407. static inline char *ikcp_encode32u(char *p, IUINT32 l)
  408. {
  409. #if IWORDS_BIG_ENDIAN || IWORDS_MUST_ALIGN
  410. *(unsigned char*)(p + 0) = (unsigned char)((l >> 0) & 0xff);
  411. *(unsigned char*)(p + 1) = (unsigned char)((l >> 8) & 0xff);
  412. *(unsigned char*)(p + 2) = (unsigned char)((l >> 16) & 0xff);
  413. *(unsigned char*)(p + 3) = (unsigned char)((l >> 24) & 0xff);
  414. #else
  415. memcpy(p, &l, 4);
  416. #endif
  417. p += 4;
  418. return p;
  419. }
  420. /* decode 32 bits unsigned int (lsb) */
  421. static inline const char *ikcp_decode32u(const char *p, IUINT32 *l)
  422. {
  423. #if IWORDS_BIG_ENDIAN || IWORDS_MUST_ALIGN
  424. *l = *(const unsigned char*)(p + 3);
  425. *l = *(const unsigned char*)(p + 2) + (*l << 8);
  426. *l = *(const unsigned char*)(p + 1) + (*l << 8);
  427. *l = *(const unsigned char*)(p + 0) + (*l << 8);
  428. #else
  429. memcpy(l, p, 4);
  430. #endif
  431. p += 4;
  432. return p;
  433. }
  434. static inline IUINT32 _imin_(IUINT32 a, IUINT32 b) {
  435. return a <= b ? a : b;
  436. }
  437. static inline IUINT32 _imax_(IUINT32 a, IUINT32 b) {
  438. return a >= b ? a : b;
  439. }
  440. static inline IUINT32 _ibound_(IUINT32 lower, IUINT32 middle, IUINT32 upper)
  441. {
  442. return _imin_(_imax_(lower, middle), upper);
  443. }
  444. static inline long _itimediff(IUINT32 later, IUINT32 earlier)
  445. {
  446. return ((IINT32)(later - earlier));
  447. }
  448. //---------------------------------------------------------------------
  449. // manage segment
  450. //---------------------------------------------------------------------
  451. typedef struct IKCPSEG IKCPSEG;
  452. static void* (*ikcp_malloc_hook)(size_t) = NULL;
  453. static void (*ikcp_free_hook)(void *) = NULL;
  454. // internal malloc
  455. static void* ikcp_malloc(size_t size) {
  456. if (ikcp_malloc_hook)
  457. return ikcp_malloc_hook(size);
  458. return malloc(size);
  459. }
  460. // internal free
  461. static void ikcp_free(void *ptr) {
  462. if (ikcp_free_hook) {
  463. ikcp_free_hook(ptr);
  464. } else {
  465. free(ptr);
  466. }
  467. }
  468. // redefine allocator
  469. void ikcp_allocator(void* (*new_malloc)(size_t), void (*new_free)(void*))
  470. {
  471. ikcp_malloc_hook = new_malloc;
  472. ikcp_free_hook = new_free;
  473. }
  474. // allocate a new kcp segment
  475. static IKCPSEG* ikcp_segment_new(ikcpcb *kcp, int size)
  476. {
  477. return (IKCPSEG*)ikcp_malloc(sizeof(IKCPSEG) + size);
  478. }
  479. // delete a segment
  480. static void ikcp_segment_delete(ikcpcb *kcp, IKCPSEG *seg)
  481. {
  482. ikcp_free(seg);
  483. }
  484. // write log
  485. void ikcp_log(ikcpcb *kcp, int mask, const char *fmt, ...)
  486. {
  487. char buffer[1024];
  488. va_list argptr;
  489. if ((mask & kcp->logmask) == 0 || kcp->writelog == 0) return;
  490. va_start(argptr, fmt);
  491. vsprintf(buffer, fmt, argptr);
  492. va_end(argptr);
  493. kcp->writelog(buffer, kcp, kcp->user);
  494. }
  495. // check log mask
  496. static int ikcp_canlog(const ikcpcb *kcp, int mask)
  497. {
  498. if ((mask & kcp->logmask) == 0 || kcp->writelog == NULL) return 0;
  499. return 1;
  500. }
  501. // output segment
  502. static int ikcp_output(ikcpcb *kcp, const void *data, int size)
  503. {
  504. assert(kcp);
  505. assert(kcp->output);
  506. if (ikcp_canlog(kcp, IKCP_LOG_OUTPUT)) {
  507. ikcp_log(kcp, IKCP_LOG_OUTPUT, "[RO] %ld bytes", (long)size);
  508. }
  509. if (size == 0) return 0;
  510. return kcp->output((const char*)data, size, kcp, kcp->user);
  511. }
  512. // output queue
  513. void ikcp_qprint(const char *name, const struct IQUEUEHEAD *head)
  514. {
  515. #if 0
  516. const struct IQUEUEHEAD *p;
  517. printf("<%s>: [", name);
  518. for (p = head->next; p != head; p = p->next) {
  519. const IKCPSEG *seg = iqueue_entry(p, const IKCPSEG, node);
  520. printf("(%lu %d)", (unsigned long)seg->sn, (int)(seg->ts % 10000));
  521. if (p->next != head) printf(",");
  522. }
  523. printf("]\n");
  524. #endif
  525. }
  526. //---------------------------------------------------------------------
  527. // create a new kcpcb
  528. //---------------------------------------------------------------------
  529. ikcpcb* ikcp_create(IUINT32 conv, void *user)
  530. {
  531. ikcpcb *kcp = (ikcpcb*)ikcp_malloc(sizeof(struct IKCPCB));
  532. if (kcp == NULL) return NULL;
  533. kcp->conv = conv;
  534. kcp->user = user;
  535. kcp->snd_una = 0;
  536. kcp->snd_nxt = 0;
  537. kcp->rcv_nxt = 0;
  538. kcp->ts_recent = 0;
  539. kcp->ts_lastack = 0;
  540. kcp->ts_probe = 0;
  541. kcp->probe_wait = 0;
  542. kcp->snd_wnd = IKCP_WND_SND;
  543. kcp->rcv_wnd = IKCP_WND_RCV;
  544. kcp->rmt_wnd = IKCP_WND_RCV;
  545. kcp->cwnd = 0;
  546. kcp->incr = 0;
  547. kcp->probe = 0;
  548. kcp->mtu = IKCP_MTU_DEF;
  549. kcp->mss = kcp->mtu - IKCP_OVERHEAD;
  550. kcp->stream = 0;
  551. kcp->buffer = (char*)ikcp_malloc((kcp->mtu + IKCP_OVERHEAD) * 3);
  552. if (kcp->buffer == NULL) {
  553. ikcp_free(kcp);
  554. return NULL;
  555. }
  556. iqueue_init(&kcp->snd_queue);
  557. iqueue_init(&kcp->rcv_queue);
  558. iqueue_init(&kcp->snd_buf);
  559. iqueue_init(&kcp->rcv_buf);
  560. kcp->nrcv_buf = 0;
  561. kcp->nsnd_buf = 0;
  562. kcp->nrcv_que = 0;
  563. kcp->nsnd_que = 0;
  564. kcp->state = 0;
  565. kcp->acklist = NULL;
  566. kcp->ackblock = 0;
  567. kcp->ackcount = 0;
  568. kcp->rx_srtt = 0;
  569. kcp->rx_rttval = 0;
  570. kcp->rx_rto = IKCP_RTO_DEF;
  571. kcp->rx_minrto = IKCP_RTO_MIN;
  572. kcp->current = 0;
  573. kcp->interval = IKCP_INTERVAL;
  574. kcp->ts_flush = IKCP_INTERVAL;
  575. kcp->nodelay = 0;
  576. kcp->updated = 0;
  577. kcp->logmask = 0;
  578. kcp->ssthresh = IKCP_THRESH_INIT;
  579. kcp->fastresend = 0;
  580. kcp->fastlimit = IKCP_FASTACK_LIMIT;
  581. kcp->nocwnd = 0;
  582. kcp->xmit = 0;
  583. kcp->dead_link = IKCP_DEADLINK;
  584. kcp->output = NULL;
  585. kcp->writelog = NULL;
  586. return kcp;
  587. }
  588. //---------------------------------------------------------------------
  589. // release a new kcpcb
  590. //---------------------------------------------------------------------
  591. void ikcp_release(ikcpcb *kcp)
  592. {
  593. assert(kcp);
  594. if (kcp) {
  595. IKCPSEG *seg;
  596. while (!iqueue_is_empty(&kcp->snd_buf)) {
  597. seg = iqueue_entry(kcp->snd_buf.next, IKCPSEG, node);
  598. iqueue_del(&seg->node);
  599. ikcp_segment_delete(kcp, seg);
  600. }
  601. while (!iqueue_is_empty(&kcp->rcv_buf)) {
  602. seg = iqueue_entry(kcp->rcv_buf.next, IKCPSEG, node);
  603. iqueue_del(&seg->node);
  604. ikcp_segment_delete(kcp, seg);
  605. }
  606. while (!iqueue_is_empty(&kcp->snd_queue)) {
  607. seg = iqueue_entry(kcp->snd_queue.next, IKCPSEG, node);
  608. iqueue_del(&seg->node);
  609. ikcp_segment_delete(kcp, seg);
  610. }
  611. while (!iqueue_is_empty(&kcp->rcv_queue)) {
  612. seg = iqueue_entry(kcp->rcv_queue.next, IKCPSEG, node);
  613. iqueue_del(&seg->node);
  614. ikcp_segment_delete(kcp, seg);
  615. }
  616. if (kcp->buffer) {
  617. ikcp_free(kcp->buffer);
  618. }
  619. if (kcp->acklist) {
  620. ikcp_free(kcp->acklist);
  621. }
  622. kcp->nrcv_buf = 0;
  623. kcp->nsnd_buf = 0;
  624. kcp->nrcv_que = 0;
  625. kcp->nsnd_que = 0;
  626. kcp->ackcount = 0;
  627. kcp->buffer = NULL;
  628. kcp->acklist = NULL;
  629. ikcp_free(kcp);
  630. }
  631. }
  632. //---------------------------------------------------------------------
  633. // set output callback, which will be invoked by kcp
  634. //---------------------------------------------------------------------
  635. void ikcp_setoutput(ikcpcb *kcp, int (*output)(const char *buf, int len,
  636. ikcpcb *kcp, void *user))
  637. {
  638. kcp->output = output;
  639. }
  640. //---------------------------------------------------------------------
  641. // user/upper level recv: returns size, returns below zero for EAGAIN
  642. //---------------------------------------------------------------------
  643. int ikcp_recv(ikcpcb *kcp, char *buffer, int len)
  644. {
  645. struct IQUEUEHEAD *p;
  646. int ispeek = (len < 0)? 1 : 0;
  647. int peeksize;
  648. int recover = 0;
  649. IKCPSEG *seg;
  650. assert(kcp);
  651. if (iqueue_is_empty(&kcp->rcv_queue))
  652. return -1;
  653. if (len < 0) len = -len;
  654. peeksize = ikcp_peeksize(kcp);
  655. if (peeksize < 0)
  656. return -2;
  657. if (peeksize > len)
  658. return -3;
  659. if (kcp->nrcv_que >= kcp->rcv_wnd)
  660. recover = 1;
  661. // merge fragment
  662. for (len = 0, p = kcp->rcv_queue.next; p != &kcp->rcv_queue; ) {
  663. int fragment;
  664. seg = iqueue_entry(p, IKCPSEG, node);
  665. p = p->next;
  666. if (buffer) {
  667. memcpy(buffer, seg->data, seg->len);
  668. buffer += seg->len;
  669. }
  670. len += seg->len;
  671. fragment = seg->frg;
  672. if (ikcp_canlog(kcp, IKCP_LOG_RECV)) {
  673. ikcp_log(kcp, IKCP_LOG_RECV, "recv sn=%lu", (unsigned long)seg->sn);
  674. }
  675. if (ispeek == 0) {
  676. iqueue_del(&seg->node);
  677. ikcp_segment_delete(kcp, seg);
  678. kcp->nrcv_que--;
  679. }
  680. if (fragment == 0)
  681. break;
  682. }
  683. assert(len == peeksize);
  684. // move available data from rcv_buf -> rcv_queue
  685. while (! iqueue_is_empty(&kcp->rcv_buf)) {
  686. seg = iqueue_entry(kcp->rcv_buf.next, IKCPSEG, node);
  687. if (seg->sn == kcp->rcv_nxt && kcp->nrcv_que < kcp->rcv_wnd) {
  688. iqueue_del(&seg->node);
  689. kcp->nrcv_buf--;
  690. iqueue_add_tail(&seg->node, &kcp->rcv_queue);
  691. kcp->nrcv_que++;
  692. kcp->rcv_nxt++;
  693. } else {
  694. break;
  695. }
  696. }
  697. // fast recover
  698. if (kcp->nrcv_que < kcp->rcv_wnd && recover) {
  699. // ready to send back IKCP_CMD_WINS in ikcp_flush
  700. // tell remote my window size
  701. kcp->probe |= IKCP_ASK_TELL;
  702. }
  703. return len;
  704. }
  705. //---------------------------------------------------------------------
  706. // peek data size
  707. //---------------------------------------------------------------------
  708. int ikcp_peeksize(const ikcpcb *kcp)
  709. {
  710. struct IQUEUEHEAD *p;
  711. IKCPSEG *seg;
  712. int length = 0;
  713. assert(kcp);
  714. if (iqueue_is_empty(&kcp->rcv_queue)) return -1;
  715. seg = iqueue_entry(kcp->rcv_queue.next, IKCPSEG, node);
  716. if (seg->frg == 0) return seg->len;
  717. if (kcp->nrcv_que < seg->frg + 1) return -1;
  718. for (p = kcp->rcv_queue.next; p != &kcp->rcv_queue; p = p->next) {
  719. seg = iqueue_entry(p, IKCPSEG, node);
  720. length += seg->len;
  721. if (seg->frg == 0) break;
  722. }
  723. return length;
  724. }
  725. //---------------------------------------------------------------------
  726. // user/upper level send, returns below zero for error
  727. //---------------------------------------------------------------------
  728. int ikcp_send(ikcpcb *kcp, const char *buffer, int len)
  729. {
  730. IKCPSEG *seg;
  731. int count, i;
  732. assert(kcp->mss > 0);
  733. if (len < 0) return -1;
  734. // append to previous segment in streaming mode (if possible)
  735. if (kcp->stream != 0) {
  736. if (!iqueue_is_empty(&kcp->snd_queue)) {
  737. IKCPSEG *old = iqueue_entry(kcp->snd_queue.prev, IKCPSEG, node);
  738. if (old->len < kcp->mss) {
  739. int capacity = kcp->mss - old->len;
  740. int extend = (len < capacity)? len : capacity;
  741. seg = ikcp_segment_new(kcp, old->len + extend);
  742. assert(seg);
  743. if (seg == NULL) {
  744. return -2;
  745. }
  746. iqueue_add_tail(&seg->node, &kcp->snd_queue);
  747. memcpy(seg->data, old->data, old->len);
  748. if (buffer) {
  749. memcpy(seg->data + old->len, buffer, extend);
  750. buffer += extend;
  751. }
  752. seg->len = old->len + extend;
  753. seg->frg = 0;
  754. len -= extend;
  755. iqueue_del_init(&old->node);
  756. ikcp_segment_delete(kcp, old);
  757. }
  758. }
  759. if (len <= 0) {
  760. return 0;
  761. }
  762. }
  763. if (len <= (int)kcp->mss) count = 1;
  764. else count = (len + kcp->mss - 1) / kcp->mss;
  765. if (count >= (int)IKCP_WND_RCV) return -2;
  766. if (count == 0) count = 1;
  767. // fragment
  768. for (i = 0; i < count; i++) {
  769. int size = len > (int)kcp->mss ? (int)kcp->mss : len;
  770. seg = ikcp_segment_new(kcp, size);
  771. assert(seg);
  772. if (seg == NULL) {
  773. return -2;
  774. }
  775. if (buffer && len > 0) {
  776. memcpy(seg->data, buffer, size);
  777. }
  778. seg->len = size;
  779. seg->frg = (kcp->stream == 0)? (count - i - 1) : 0;
  780. iqueue_init(&seg->node);
  781. iqueue_add_tail(&seg->node, &kcp->snd_queue);
  782. kcp->nsnd_que++;
  783. if (buffer) {
  784. buffer += size;
  785. }
  786. len -= size;
  787. }
  788. return 0;
  789. }
  790. //---------------------------------------------------------------------
  791. // parse ack
  792. //---------------------------------------------------------------------
  793. static void ikcp_update_ack(ikcpcb *kcp, IINT32 rtt)
  794. {
  795. IINT32 rto = 0;
  796. if (kcp->rx_srtt == 0) {
  797. kcp->rx_srtt = rtt;
  798. kcp->rx_rttval = rtt / 2;
  799. } else {
  800. long delta = rtt - kcp->rx_srtt;
  801. if (delta < 0) delta = -delta;
  802. kcp->rx_rttval = (3 * kcp->rx_rttval + delta) / 4;
  803. kcp->rx_srtt = (7 * kcp->rx_srtt + rtt) / 8;
  804. if (kcp->rx_srtt < 1) kcp->rx_srtt = 1;
  805. }
  806. rto = kcp->rx_srtt + _imax_(kcp->interval, 4 * kcp->rx_rttval);
  807. kcp->rx_rto = _ibound_(kcp->rx_minrto, rto, IKCP_RTO_MAX);
  808. }
  809. static void ikcp_shrink_buf(ikcpcb *kcp)
  810. {
  811. struct IQUEUEHEAD *p = kcp->snd_buf.next;
  812. if (p != &kcp->snd_buf) {
  813. IKCPSEG *seg = iqueue_entry(p, IKCPSEG, node);
  814. kcp->snd_una = seg->sn;
  815. } else {
  816. kcp->snd_una = kcp->snd_nxt;
  817. }
  818. }
  819. static void ikcp_parse_ack(ikcpcb *kcp, IUINT32 sn)
  820. {
  821. struct IQUEUEHEAD *p, *next;
  822. if (_itimediff(sn, kcp->snd_una) < 0 || _itimediff(sn, kcp->snd_nxt) >= 0)
  823. return;
  824. for (p = kcp->snd_buf.next; p != &kcp->snd_buf; p = next) {
  825. IKCPSEG *seg = iqueue_entry(p, IKCPSEG, node);
  826. next = p->next;
  827. if (sn == seg->sn) {
  828. iqueue_del(p);
  829. ikcp_segment_delete(kcp, seg);
  830. kcp->nsnd_buf--;
  831. break;
  832. }
  833. if (_itimediff(sn, seg->sn) < 0) {
  834. break;
  835. }
  836. }
  837. }
  838. static void ikcp_parse_una(ikcpcb *kcp, IUINT32 una)
  839. {
  840. struct IQUEUEHEAD *p, *next;
  841. for (p = kcp->snd_buf.next; p != &kcp->snd_buf; p = next) {
  842. IKCPSEG *seg = iqueue_entry(p, IKCPSEG, node);
  843. next = p->next;
  844. if (_itimediff(una, seg->sn) > 0) {
  845. iqueue_del(p);
  846. ikcp_segment_delete(kcp, seg);
  847. kcp->nsnd_buf--;
  848. } else {
  849. break;
  850. }
  851. }
  852. }
  853. static void ikcp_parse_fastack(ikcpcb *kcp, IUINT32 sn, IUINT32 ts)
  854. {
  855. struct IQUEUEHEAD *p, *next;
  856. if (_itimediff(sn, kcp->snd_una) < 0 || _itimediff(sn, kcp->snd_nxt) >= 0)
  857. return;
  858. for (p = kcp->snd_buf.next; p != &kcp->snd_buf; p = next) {
  859. IKCPSEG *seg = iqueue_entry(p, IKCPSEG, node);
  860. next = p->next;
  861. if (_itimediff(sn, seg->sn) < 0) {
  862. break;
  863. }
  864. else if (sn != seg->sn) {
  865. #ifndef IKCP_FASTACK_CONSERVE
  866. seg->fastack++;
  867. #else
  868. if (_itimediff(ts, seg->ts) >= 0)
  869. seg->fastack++;
  870. #endif
  871. }
  872. }
  873. }
  874. //---------------------------------------------------------------------
  875. // ack append
  876. //---------------------------------------------------------------------
  877. static void ikcp_ack_push(ikcpcb *kcp, IUINT32 sn, IUINT32 ts)
  878. {
  879. size_t newsize = kcp->ackcount + 1;
  880. IUINT32 *ptr;
  881. if (newsize > kcp->ackblock) {
  882. IUINT32 *acklist;
  883. size_t newblock;
  884. for (newblock = 8; newblock < newsize; newblock <<= 1);
  885. acklist = (IUINT32*)ikcp_malloc(newblock * sizeof(IUINT32) * 2);
  886. if (acklist == NULL) {
  887. assert(acklist != NULL);
  888. abort();
  889. }
  890. if (kcp->acklist != NULL) {
  891. size_t x;
  892. for (x = 0; x < kcp->ackcount; x++) {
  893. acklist[x * 2 + 0] = kcp->acklist[x * 2 + 0];
  894. acklist[x * 2 + 1] = kcp->acklist[x * 2 + 1];
  895. }
  896. ikcp_free(kcp->acklist);
  897. }
  898. kcp->acklist = acklist;
  899. kcp->ackblock = newblock;
  900. }
  901. ptr = &kcp->acklist[kcp->ackcount * 2];
  902. ptr[0] = sn;
  903. ptr[1] = ts;
  904. kcp->ackcount++;
  905. }
  906. static void ikcp_ack_get(const ikcpcb *kcp, int p, IUINT32 *sn, IUINT32 *ts)
  907. {
  908. if (sn) sn[0] = kcp->acklist[p * 2 + 0];
  909. if (ts) ts[0] = kcp->acklist[p * 2 + 1];
  910. }
  911. //---------------------------------------------------------------------
  912. // parse data
  913. //---------------------------------------------------------------------
  914. void ikcp_parse_data(ikcpcb *kcp, IKCPSEG *newseg)
  915. {
  916. struct IQUEUEHEAD *p, *prev;
  917. IUINT32 sn = newseg->sn;
  918. int repeat = 0;
  919. if (_itimediff(sn, kcp->rcv_nxt + kcp->rcv_wnd) >= 0 ||
  920. _itimediff(sn, kcp->rcv_nxt) < 0) {
  921. ikcp_segment_delete(kcp, newseg);
  922. return;
  923. }
  924. for (p = kcp->rcv_buf.prev; p != &kcp->rcv_buf; p = prev) {
  925. IKCPSEG *seg = iqueue_entry(p, IKCPSEG, node);
  926. prev = p->prev;
  927. if (seg->sn == sn) {
  928. repeat = 1;
  929. break;
  930. }
  931. if (_itimediff(sn, seg->sn) > 0) {
  932. break;
  933. }
  934. }
  935. if (repeat == 0) {
  936. iqueue_init(&newseg->node);
  937. iqueue_add(&newseg->node, p);
  938. kcp->nrcv_buf++;
  939. } else {
  940. ikcp_segment_delete(kcp, newseg);
  941. }
  942. #if 0
  943. ikcp_qprint("rcvbuf", &kcp->rcv_buf);
  944. printf("rcv_nxt=%lu\n", kcp->rcv_nxt);
  945. #endif
  946. // move available data from rcv_buf -> rcv_queue
  947. while (! iqueue_is_empty(&kcp->rcv_buf)) {
  948. IKCPSEG *seg = iqueue_entry(kcp->rcv_buf.next, IKCPSEG, node);
  949. if (seg->sn == kcp->rcv_nxt && kcp->nrcv_que < kcp->rcv_wnd) {
  950. iqueue_del(&seg->node);
  951. kcp->nrcv_buf--;
  952. iqueue_add_tail(&seg->node, &kcp->rcv_queue);
  953. kcp->nrcv_que++;
  954. kcp->rcv_nxt++;
  955. } else {
  956. break;
  957. }
  958. }
  959. #if 0
  960. ikcp_qprint("queue", &kcp->rcv_queue);
  961. printf("rcv_nxt=%lu\n", kcp->rcv_nxt);
  962. #endif
  963. #if 1
  964. // printf("snd(buf=%d, queue=%d)\n", kcp->nsnd_buf, kcp->nsnd_que);
  965. // printf("rcv(buf=%d, queue=%d)\n", kcp->nrcv_buf, kcp->nrcv_que);
  966. #endif
  967. }
  968. //---------------------------------------------------------------------
  969. // input data
  970. //---------------------------------------------------------------------
  971. int ikcp_input(ikcpcb *kcp, const char *data, long size)
  972. {
  973. IUINT32 prev_una = kcp->snd_una;
  974. IUINT32 maxack = 0, latest_ts = 0;
  975. int flag = 0;
  976. if (ikcp_canlog(kcp, IKCP_LOG_INPUT)) {
  977. ikcp_log(kcp, IKCP_LOG_INPUT, "[RI] %d bytes", (int)size);
  978. }
  979. if (data == NULL || (int)size < (int)IKCP_OVERHEAD) return -1;
  980. while (1) {
  981. IUINT32 ts, sn, len, una, conv;
  982. IUINT16 wnd;
  983. IUINT8 cmd, frg;
  984. IKCPSEG *seg;
  985. if (size < (int)IKCP_OVERHEAD) break;
  986. data = ikcp_decode32u(data, &conv);
  987. if (conv != kcp->conv) return -1;
  988. data = ikcp_decode8u(data, &cmd);
  989. data = ikcp_decode8u(data, &frg);
  990. data = ikcp_decode16u(data, &wnd);
  991. data = ikcp_decode32u(data, &ts);
  992. data = ikcp_decode32u(data, &sn);
  993. data = ikcp_decode32u(data, &una);
  994. data = ikcp_decode32u(data, &len);
  995. size -= IKCP_OVERHEAD;
  996. if ((long)size < (long)len || (int)len < 0) return -2;
  997. if (cmd != IKCP_CMD_PUSH && cmd != IKCP_CMD_ACK &&
  998. cmd != IKCP_CMD_WASK && cmd != IKCP_CMD_WINS)
  999. return -3;
  1000. kcp->rmt_wnd = wnd;
  1001. ikcp_parse_una(kcp, una);
  1002. ikcp_shrink_buf(kcp);
  1003. if (cmd == IKCP_CMD_ACK) {
  1004. if (_itimediff(kcp->current, ts) >= 0) {
  1005. ikcp_update_ack(kcp, _itimediff(kcp->current, ts));
  1006. }
  1007. ikcp_parse_ack(kcp, sn);
  1008. ikcp_shrink_buf(kcp);
  1009. if (flag == 0) {
  1010. flag = 1;
  1011. maxack = sn;
  1012. latest_ts = ts;
  1013. } else {
  1014. if (_itimediff(sn, maxack) > 0) {
  1015. #ifndef IKCP_FASTACK_CONSERVE
  1016. maxack = sn;
  1017. latest_ts = ts;
  1018. #else
  1019. if (_itimediff(ts, latest_ts) > 0) {
  1020. maxack = sn;
  1021. latest_ts = ts;
  1022. }
  1023. #endif
  1024. }
  1025. }
  1026. if (ikcp_canlog(kcp, IKCP_LOG_IN_ACK)) {
  1027. ikcp_log(kcp, IKCP_LOG_IN_ACK,
  1028. "input ack: sn=%lu rtt=%ld rto=%ld", (unsigned long)sn,
  1029. (long)_itimediff(kcp->current, ts),
  1030. (long)kcp->rx_rto);
  1031. }
  1032. }
  1033. else if (cmd == IKCP_CMD_PUSH) {
  1034. if (ikcp_canlog(kcp, IKCP_LOG_IN_DATA)) {
  1035. ikcp_log(kcp, IKCP_LOG_IN_DATA,
  1036. "input psh: sn=%lu ts=%lu", (unsigned long)sn, (unsigned long)ts);
  1037. }
  1038. if (_itimediff(sn, kcp->rcv_nxt + kcp->rcv_wnd) < 0) {
  1039. ikcp_ack_push(kcp, sn, ts);
  1040. if (_itimediff(sn, kcp->rcv_nxt) >= 0) {
  1041. seg = ikcp_segment_new(kcp, len);
  1042. seg->conv = conv;
  1043. seg->cmd = cmd;
  1044. seg->frg = frg;
  1045. seg->wnd = wnd;
  1046. seg->ts = ts;
  1047. seg->sn = sn;
  1048. seg->una = una;
  1049. seg->len = len;
  1050. if (len > 0) {
  1051. memcpy(seg->data, data, len);
  1052. }
  1053. ikcp_parse_data(kcp, seg);
  1054. }
  1055. }
  1056. }
  1057. else if (cmd == IKCP_CMD_WASK) {
  1058. // ready to send back IKCP_CMD_WINS in ikcp_flush
  1059. // tell remote my window size
  1060. kcp->probe |= IKCP_ASK_TELL;
  1061. if (ikcp_canlog(kcp, IKCP_LOG_IN_PROBE)) {
  1062. ikcp_log(kcp, IKCP_LOG_IN_PROBE, "input probe");
  1063. }
  1064. }
  1065. else if (cmd == IKCP_CMD_WINS) {
  1066. // do nothing
  1067. if (ikcp_canlog(kcp, IKCP_LOG_IN_WINS)) {
  1068. ikcp_log(kcp, IKCP_LOG_IN_WINS,
  1069. "input wins: %lu", (unsigned long)(wnd));
  1070. }
  1071. }
  1072. else {
  1073. return -3;
  1074. }
  1075. data += len;
  1076. size -= len;
  1077. }
  1078. if (flag != 0) {
  1079. ikcp_parse_fastack(kcp, maxack, latest_ts);
  1080. }
  1081. if (_itimediff(kcp->snd_una, prev_una) > 0) {
  1082. if (kcp->cwnd < kcp->rmt_wnd) {
  1083. IUINT32 mss = kcp->mss;
  1084. if (kcp->cwnd < kcp->ssthresh) {
  1085. kcp->cwnd++;
  1086. kcp->incr += mss;
  1087. } else {
  1088. if (kcp->incr < mss) kcp->incr = mss;
  1089. kcp->incr += (mss * mss) / kcp->incr + (mss / 16);
  1090. if ((kcp->cwnd + 1) * mss <= kcp->incr) {
  1091. #if 1
  1092. kcp->cwnd = (kcp->incr + mss - 1) / ((mss > 0)? mss : 1);
  1093. #else
  1094. kcp->cwnd++;
  1095. #endif
  1096. }
  1097. }
  1098. if (kcp->cwnd > kcp->rmt_wnd) {
  1099. kcp->cwnd = kcp->rmt_wnd;
  1100. kcp->incr = kcp->rmt_wnd * mss;
  1101. }
  1102. }
  1103. }
  1104. return 0;
  1105. }
  1106. //---------------------------------------------------------------------
  1107. // ikcp_encode_seg
  1108. //---------------------------------------------------------------------
  1109. static char *ikcp_encode_seg(char *ptr, const IKCPSEG *seg)
  1110. {
  1111. ptr = ikcp_encode32u(ptr, seg->conv);
  1112. ptr = ikcp_encode8u(ptr, (IUINT8)seg->cmd);
  1113. ptr = ikcp_encode8u(ptr, (IUINT8)seg->frg);
  1114. ptr = ikcp_encode16u(ptr, (IUINT16)seg->wnd);
  1115. ptr = ikcp_encode32u(ptr, seg->ts);
  1116. ptr = ikcp_encode32u(ptr, seg->sn);
  1117. ptr = ikcp_encode32u(ptr, seg->una);
  1118. ptr = ikcp_encode32u(ptr, seg->len);
  1119. return ptr;
  1120. }
  1121. static int ikcp_wnd_unused(const ikcpcb *kcp)
  1122. {
  1123. if (kcp->nrcv_que < kcp->rcv_wnd) {
  1124. return kcp->rcv_wnd - kcp->nrcv_que;
  1125. }
  1126. return 0;
  1127. }
  1128. //---------------------------------------------------------------------
  1129. // ikcp_flush
  1130. //---------------------------------------------------------------------
  1131. void ikcp_flush(ikcpcb *kcp)
  1132. {
  1133. IUINT32 current = kcp->current;
  1134. char *buffer = kcp->buffer;
  1135. char *ptr = buffer;
  1136. int count, size, i;
  1137. IUINT32 resent, cwnd;
  1138. IUINT32 rtomin;
  1139. struct IQUEUEHEAD *p;
  1140. int change = 0;
  1141. int lost = 0;
  1142. IKCPSEG seg;
  1143. // 'ikcp_update' haven't been called.
  1144. if (kcp->updated == 0) return;
  1145. seg.conv = kcp->conv;
  1146. seg.cmd = IKCP_CMD_ACK;
  1147. seg.frg = 0;
  1148. seg.wnd = ikcp_wnd_unused(kcp);
  1149. seg.una = kcp->rcv_nxt;
  1150. seg.len = 0;
  1151. seg.sn = 0;
  1152. seg.ts = 0;
  1153. // flush acknowledges
  1154. count = kcp->ackcount;
  1155. for (i = 0; i < count; i++) {
  1156. size = (int)(ptr - buffer);
  1157. if (size + (int)IKCP_OVERHEAD > (int)kcp->mtu) {
  1158. ikcp_output(kcp, buffer, size);
  1159. ptr = buffer;
  1160. }
  1161. ikcp_ack_get(kcp, i, &seg.sn, &seg.ts);
  1162. ptr = ikcp_encode_seg(ptr, &seg);
  1163. }
  1164. kcp->ackcount = 0;
  1165. // probe window size (if remote window size equals zero)
  1166. if (kcp->rmt_wnd == 0) {
  1167. if (kcp->probe_wait == 0) {
  1168. kcp->probe_wait = IKCP_PROBE_INIT;
  1169. kcp->ts_probe = kcp->current + kcp->probe_wait;
  1170. }
  1171. else {
  1172. if (_itimediff(kcp->current, kcp->ts_probe) >= 0) {
  1173. if (kcp->probe_wait < IKCP_PROBE_INIT)
  1174. kcp->probe_wait = IKCP_PROBE_INIT;
  1175. kcp->probe_wait += kcp->probe_wait / 2;
  1176. if (kcp->probe_wait > IKCP_PROBE_LIMIT)
  1177. kcp->probe_wait = IKCP_PROBE_LIMIT;
  1178. kcp->ts_probe = kcp->current + kcp->probe_wait;
  1179. kcp->probe |= IKCP_ASK_SEND;
  1180. }
  1181. }
  1182. } else {
  1183. kcp->ts_probe = 0;
  1184. kcp->probe_wait = 0;
  1185. }
  1186. // flush window probing commands
  1187. if (kcp->probe & IKCP_ASK_SEND) {
  1188. seg.cmd = IKCP_CMD_WASK;
  1189. size = (int)(ptr - buffer);
  1190. if (size + (int)IKCP_OVERHEAD > (int)kcp->mtu) {
  1191. ikcp_output(kcp, buffer, size);
  1192. ptr = buffer;
  1193. }
  1194. ptr = ikcp_encode_seg(ptr, &seg);
  1195. }
  1196. // flush window probing commands
  1197. if (kcp->probe & IKCP_ASK_TELL) {
  1198. seg.cmd = IKCP_CMD_WINS;
  1199. size = (int)(ptr - buffer);
  1200. if (size + (int)IKCP_OVERHEAD > (int)kcp->mtu) {
  1201. ikcp_output(kcp, buffer, size);
  1202. ptr = buffer;
  1203. }
  1204. ptr = ikcp_encode_seg(ptr, &seg);
  1205. }
  1206. kcp->probe = 0;
  1207. // calculate window size
  1208. cwnd = _imin_(kcp->snd_wnd, kcp->rmt_wnd);
  1209. if (kcp->nocwnd == 0) cwnd = _imin_(kcp->cwnd, cwnd);
  1210. // move data from snd_queue to snd_buf
  1211. while (_itimediff(kcp->snd_nxt, kcp->snd_una + cwnd) < 0) {
  1212. IKCPSEG *newseg;
  1213. if (iqueue_is_empty(&kcp->snd_queue)) break;
  1214. newseg = iqueue_entry(kcp->snd_queue.next, IKCPSEG, node);
  1215. iqueue_del(&newseg->node);
  1216. iqueue_add_tail(&newseg->node, &kcp->snd_buf);
  1217. kcp->nsnd_que--;
  1218. kcp->nsnd_buf++;
  1219. newseg->conv = kcp->conv;
  1220. newseg->cmd = IKCP_CMD_PUSH;
  1221. newseg->wnd = seg.wnd;
  1222. newseg->ts = current;
  1223. newseg->sn = kcp->snd_nxt++;
  1224. newseg->una = kcp->rcv_nxt;
  1225. newseg->resendts = current;
  1226. newseg->rto = kcp->rx_rto;
  1227. newseg->fastack = 0;
  1228. newseg->xmit = 0;
  1229. }
  1230. // calculate resent
  1231. resent = (kcp->fastresend > 0)? (IUINT32)kcp->fastresend : 0xffffffff;
  1232. rtomin = (kcp->nodelay == 0)? (kcp->rx_rto >> 3) : 0;
  1233. // flush data segments
  1234. for (p = kcp->snd_buf.next; p != &kcp->snd_buf; p = p->next) {
  1235. IKCPSEG *segment = iqueue_entry(p, IKCPSEG, node);
  1236. int needsend = 0;
  1237. if (segment->xmit == 0) {
  1238. needsend = 1;
  1239. segment->xmit++;
  1240. segment->rto = kcp->rx_rto;
  1241. segment->resendts = current + segment->rto + rtomin;
  1242. }
  1243. else if (_itimediff(current, segment->resendts) >= 0) {
  1244. needsend = 1;
  1245. segment->xmit++;
  1246. kcp->xmit++;
  1247. if (kcp->nodelay == 0) {
  1248. segment->rto += _imax_(segment->rto, (IUINT32)kcp->rx_rto);
  1249. } else {
  1250. IINT32 step = (kcp->nodelay < 2)?
  1251. ((IINT32)(segment->rto)) : kcp->rx_rto;
  1252. segment->rto += step / 2;
  1253. }
  1254. segment->resendts = current + segment->rto;
  1255. lost = 1;
  1256. }
  1257. else if (segment->fastack >= resent) {
  1258. if ((int)segment->xmit <= kcp->fastlimit ||
  1259. kcp->fastlimit <= 0) {
  1260. needsend = 1;
  1261. segment->xmit++;
  1262. segment->fastack = 0;
  1263. segment->resendts = current + segment->rto;
  1264. change++;
  1265. }
  1266. }
  1267. if (needsend) {
  1268. int need;
  1269. segment->ts = current;
  1270. segment->wnd = seg.wnd;
  1271. segment->una = kcp->rcv_nxt;
  1272. size = (int)(ptr - buffer);
  1273. need = IKCP_OVERHEAD + segment->len;
  1274. if (size + need > (int)kcp->mtu) {
  1275. ikcp_output(kcp, buffer, size);
  1276. ptr = buffer;
  1277. }
  1278. ptr = ikcp_encode_seg(ptr, segment);
  1279. if (segment->len > 0) {
  1280. memcpy(ptr, segment->data, segment->len);
  1281. ptr += segment->len;
  1282. }
  1283. if (segment->xmit >= kcp->dead_link) {
  1284. kcp->state = (IUINT32)-1;
  1285. }
  1286. }
  1287. }
  1288. // flash remain segments
  1289. size = (int)(ptr - buffer);
  1290. if (size > 0) {
  1291. ikcp_output(kcp, buffer, size);
  1292. }
  1293. // update ssthresh
  1294. if (change) {
  1295. IUINT32 inflight = kcp->snd_nxt - kcp->snd_una;
  1296. kcp->ssthresh = inflight / 2;
  1297. if (kcp->ssthresh < IKCP_THRESH_MIN)
  1298. kcp->ssthresh = IKCP_THRESH_MIN;
  1299. kcp->cwnd = kcp->ssthresh + resent;
  1300. kcp->incr = kcp->cwnd * kcp->mss;
  1301. }
  1302. if (lost) {
  1303. kcp->ssthresh = cwnd / 2;
  1304. if (kcp->ssthresh < IKCP_THRESH_MIN)
  1305. kcp->ssthresh = IKCP_THRESH_MIN;
  1306. kcp->cwnd = 1;
  1307. kcp->incr = kcp->mss;
  1308. }
  1309. if (kcp->cwnd < 1) {
  1310. kcp->cwnd = 1;
  1311. kcp->incr = kcp->mss;
  1312. }
  1313. }
  1314. //---------------------------------------------------------------------
  1315. // update state (call it repeatedly, every 10ms-100ms), or you can ask
  1316. // ikcp_check when to call it again (without ikcp_input/_send calling).
  1317. // 'current' - current timestamp in millisec.
  1318. //---------------------------------------------------------------------
  1319. void ikcp_update(ikcpcb *kcp, IUINT32 current)
  1320. {
  1321. IINT32 slap;
  1322. kcp->current = current;
  1323. if (kcp->updated == 0) {
  1324. kcp->updated = 1;
  1325. kcp->ts_flush = kcp->current;
  1326. }
  1327. slap = _itimediff(kcp->current, kcp->ts_flush);
  1328. if (slap >= 10000 || slap < -10000) {
  1329. kcp->ts_flush = kcp->current;
  1330. slap = 0;
  1331. }
  1332. if (slap >= 0) {
  1333. kcp->ts_flush += kcp->interval;
  1334. if (_itimediff(kcp->current, kcp->ts_flush) >= 0) {
  1335. kcp->ts_flush = kcp->current + kcp->interval;
  1336. }
  1337. ikcp_flush(kcp);
  1338. }
  1339. }
  1340. //---------------------------------------------------------------------
  1341. // Determine when should you invoke ikcp_update:
  1342. // returns when you should invoke ikcp_update in millisec, if there
  1343. // is no ikcp_input/_send calling. you can call ikcp_update in that
  1344. // time, instead of call update repeatly.
  1345. // Important to reduce unnacessary ikcp_update invoking. use it to
  1346. // schedule ikcp_update (eg. implementing an epoll-like mechanism,
  1347. // or optimize ikcp_update when handling massive kcp connections)
  1348. //---------------------------------------------------------------------
  1349. IUINT32 ikcp_check(const ikcpcb *kcp, IUINT32 current)
  1350. {
  1351. IUINT32 ts_flush = kcp->ts_flush;
  1352. IINT32 tm_flush = 0x7fffffff;
  1353. IINT32 tm_packet = 0x7fffffff;
  1354. IUINT32 minimal = 0;
  1355. struct IQUEUEHEAD *p;
  1356. if (kcp->updated == 0) {
  1357. return current;
  1358. }
  1359. if (_itimediff(current, ts_flush) >= 10000 ||
  1360. _itimediff(current, ts_flush) < -10000) {
  1361. ts_flush = current;
  1362. }
  1363. if (_itimediff(current, ts_flush) >= 0) {
  1364. return current;
  1365. }
  1366. tm_flush = _itimediff(ts_flush, current);
  1367. for (p = kcp->snd_buf.next; p != &kcp->snd_buf; p = p->next) {
  1368. const IKCPSEG *seg = iqueue_entry(p, const IKCPSEG, node);
  1369. IINT32 diff = _itimediff(seg->resendts, current);
  1370. if (diff <= 0) {
  1371. return current;
  1372. }
  1373. if (diff < tm_packet) tm_packet = diff;
  1374. }
  1375. minimal = (IUINT32)(tm_packet < tm_flush ? tm_packet : tm_flush);
  1376. if (minimal >= kcp->interval) minimal = kcp->interval;
  1377. return current + minimal;
  1378. }
  1379. int ikcp_setmtu(ikcpcb *kcp, int mtu)
  1380. {
  1381. char *buffer;
  1382. if (mtu < 50 || mtu < (int)IKCP_OVERHEAD)
  1383. return -1;
  1384. buffer = (char*)ikcp_malloc((mtu + IKCP_OVERHEAD) * 3);
  1385. if (buffer == NULL)
  1386. return -2;
  1387. kcp->mtu = mtu;
  1388. kcp->mss = kcp->mtu - IKCP_OVERHEAD;
  1389. ikcp_free(kcp->buffer);
  1390. kcp->buffer = buffer;
  1391. return 0;
  1392. }
  1393. int ikcp_interval(ikcpcb *kcp, int interval)
  1394. {
  1395. if (interval > 5000) interval = 5000;
  1396. else if (interval < 10) interval = 10;
  1397. kcp->interval = interval;
  1398. return 0;
  1399. }
  1400. int ikcp_nodelay(ikcpcb *kcp, int nodelay, int interval, int resend, int nc)
  1401. {
  1402. if (nodelay >= 0) {
  1403. kcp->nodelay = nodelay;
  1404. if (nodelay) {
  1405. kcp->rx_minrto = IKCP_RTO_NDL;
  1406. }
  1407. else {
  1408. kcp->rx_minrto = IKCP_RTO_MIN;
  1409. }
  1410. }
  1411. if (interval >= 0) {
  1412. if (interval > 5000) interval = 5000;
  1413. else if (interval < 10) interval = 10;
  1414. kcp->interval = interval;
  1415. }
  1416. if (resend >= 0) {
  1417. kcp->fastresend = resend;
  1418. }
  1419. if (nc >= 0) {
  1420. kcp->nocwnd = nc;
  1421. }
  1422. return 0;
  1423. }
  1424. int ikcp_wndsize(ikcpcb *kcp, int sndwnd, int rcvwnd)
  1425. {
  1426. if (kcp) {
  1427. if (sndwnd > 0) {
  1428. kcp->snd_wnd = sndwnd;
  1429. }
  1430. if (rcvwnd > 0) { // must >= max fragment size
  1431. kcp->rcv_wnd = _imax_(rcvwnd, IKCP_WND_RCV);
  1432. }
  1433. }
  1434. return 0;
  1435. }
  1436. int ikcp_waitsnd(const ikcpcb *kcp)
  1437. {
  1438. return kcp->nsnd_buf + kcp->nsnd_que;
  1439. }
  1440. // read conv
  1441. IUINT32 ikcp_getconv(const void *ptr)
  1442. {
  1443. IUINT32 conv;
  1444. ikcp_decode32u((const char*)ptr, &conv);
  1445. return conv;
  1446. }
  1447. }
  1448. //#ifdef __cplusplus
  1449. //}
  1450. //#endif
  1451. }
  1452. #endif