1
0

rudp.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #include "rudp.h"
  2. #if WITH_RUDP
  3. #if WITH_KCP
  4. void kcp_release(kcp_t* kcp) {
  5. if (kcp->ikcp == NULL) return;
  6. if (kcp->update_timer) {
  7. htimer_del(kcp->update_timer);
  8. kcp->update_timer = NULL;
  9. }
  10. HV_FREE(kcp->readbuf.base);
  11. kcp->readbuf.len = 0;
  12. // printf("ikcp_release ikcp=%p\n", kcp->ikcp);
  13. ikcp_release(kcp->ikcp);
  14. kcp->ikcp = NULL;
  15. }
  16. #endif
  17. void rudp_entry_free(rudp_entry_t* entry) {
  18. #if WITH_KCP
  19. kcp_release(&entry->kcp);
  20. #endif
  21. HV_FREE(entry);
  22. }
  23. void rudp_init(rudp_t* rudp) {
  24. // printf("rudp init\n");
  25. rudp->rb_root.rb_node = NULL;
  26. hmutex_init(&rudp->mutex);
  27. }
  28. void rudp_cleanup(rudp_t* rudp) {
  29. // printf("rudp cleaup\n");
  30. struct rb_node* n = NULL;
  31. rudp_entry_t* e = NULL;
  32. while ((n = rudp->rb_root.rb_node)) {
  33. e = rb_entry(n, rudp_entry_t, rb_node);
  34. rb_erase(n, &rudp->rb_root);
  35. rudp_entry_free(e);
  36. }
  37. hmutex_destroy(&rudp->mutex);
  38. }
  39. bool rudp_insert(rudp_t* rudp, rudp_entry_t* entry) {
  40. struct rb_node** n = &rudp->rb_root.rb_node;
  41. struct rb_node* parent = NULL;
  42. rudp_entry_t* e = NULL;
  43. int cmp = 0;
  44. bool exists = false;
  45. while (*n) {
  46. parent = *n;
  47. e = rb_entry(*n, rudp_entry_t, rb_node);
  48. cmp = memcmp(&entry->addr, &e->addr, sizeof(sockaddr_u));
  49. if (cmp < 0) {
  50. n = &(*n)->rb_left;
  51. } else if (cmp > 0) {
  52. n = &(*n)->rb_right;
  53. } else {
  54. exists = true;
  55. break;
  56. }
  57. }
  58. if (!exists) {
  59. rb_link_node(&entry->rb_node, parent, n);
  60. rb_insert_color(&entry->rb_node, &rudp->rb_root);
  61. }
  62. return !exists;
  63. }
  64. rudp_entry_t* rudp_search(rudp_t* rudp, struct sockaddr* addr) {
  65. struct rb_node* n = rudp->rb_root.rb_node;
  66. rudp_entry_t* e = NULL;
  67. int cmp = 0;
  68. bool exists = false;
  69. while (n) {
  70. e = rb_entry(n, rudp_entry_t, rb_node);
  71. cmp = memcmp(addr, &e->addr, sizeof(sockaddr_u));
  72. if (cmp < 0) {
  73. n = n->rb_left;
  74. } else if (cmp > 0) {
  75. n = n->rb_right;
  76. } else {
  77. exists = true;
  78. break;
  79. }
  80. }
  81. return exists ? e : NULL;
  82. }
  83. rudp_entry_t* rudp_remove(rudp_t* rudp, struct sockaddr* addr) {
  84. hmutex_lock(&rudp->mutex);
  85. rudp_entry_t* e = rudp_search(rudp, addr);
  86. if (e) {
  87. // printf("rudp_remove ");
  88. // SOCKADDR_PRINT(addr);
  89. rb_erase(&e->rb_node, &rudp->rb_root);
  90. }
  91. hmutex_unlock(&rudp->mutex);
  92. return e;
  93. }
  94. rudp_entry_t* rudp_get(rudp_t* rudp, struct sockaddr* addr) {
  95. hmutex_lock(&rudp->mutex);
  96. struct rb_node** n = &rudp->rb_root.rb_node;
  97. struct rb_node* parent = NULL;
  98. rudp_entry_t* e = NULL;
  99. int cmp = 0;
  100. bool exists = false;
  101. // search
  102. while (*n) {
  103. parent = *n;
  104. e = rb_entry(*n, rudp_entry_t, rb_node);
  105. cmp = memcmp(addr, &e->addr, sizeof(sockaddr_u));
  106. if (cmp < 0) {
  107. n = &(*n)->rb_left;
  108. } else if (cmp > 0) {
  109. n = &(*n)->rb_right;
  110. } else {
  111. exists = true;
  112. break;
  113. }
  114. }
  115. if (!exists) {
  116. // insert
  117. // printf("rudp_insert ");
  118. // SOCKADDR_PRINT(addr);
  119. HV_ALLOC_SIZEOF(e);
  120. memcpy(&e->addr, addr, SOCKADDR_LEN(addr));
  121. rb_link_node(&e->rb_node, parent, n);
  122. rb_insert_color(&e->rb_node, &rudp->rb_root);
  123. }
  124. hmutex_unlock(&rudp->mutex);
  125. return e;
  126. }
  127. void rudp_del(rudp_t* rudp, struct sockaddr* addr) {
  128. hmutex_lock(&rudp->mutex);
  129. rudp_entry_t* e = rudp_search(rudp, addr);
  130. if (e) {
  131. // printf("rudp_remove ");
  132. // SOCKADDR_PRINT(addr);
  133. rb_erase(&e->rb_node, &rudp->rb_root);
  134. rudp_entry_free(e);
  135. }
  136. hmutex_unlock(&rudp->mutex);
  137. }
  138. #endif