netengine.c 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952
  1. /*
  2. * Copyright (C) 2011, 2012, 2013 Citrix Systems
  3. *
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. * 1. Redistributions of source code must retain the above copyright
  10. * notice, this list of conditions and the following disclaimer.
  11. * 2. Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in the
  13. * documentation and/or other materials provided with the distribution.
  14. * 3. Neither the name of the project nor the names of its contributors
  15. * may be used to endorse or promote products derived from this software
  16. * without specific prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
  19. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  20. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  21. * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
  22. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  23. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  24. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  25. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  26. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  27. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  28. * SUCH DAMAGE.
  29. */
  30. #include "mainrelay.h"
  31. //////////// Backward compatibility with OpenSSL 1.0.x //////////////
  32. #define HAVE_OPENSSL11_API (!(OPENSSL_VERSION_NUMBER < 0x10100001L || defined LIBRESSL_VERSION_NUMBER))
  33. #ifndef HAVE_SSL_CTX_UP_REF
  34. #define HAVE_SSL_CTX_UP_REF HAVE_OPENSSL11_API
  35. #endif
  36. #if !HAVE_SSL_CTX_UP_REF
  37. #define SSL_CTX_up_ref(ctx) CRYPTO_add(&(ctx)->references, 1, CRYPTO_LOCK_SSL_CTX)
  38. #endif
  39. //////////// Barrier for the threads //////////////
  40. #if !defined(TURN_NO_THREAD_BARRIERS)
  41. static unsigned int barrier_count = 0;
  42. static pthread_barrier_t barrier;
  43. #endif
  44. ////////////// Auth Server ////////////////
  45. typedef unsigned char authserver_id;
  46. struct auth_server {
  47. authserver_id id;
  48. struct event_base* event_base;
  49. struct bufferevent *in_buf;
  50. struct bufferevent *out_buf;
  51. pthread_t thr;
  52. redis_context_handle rch;
  53. };
  54. #define MIN_AUTHSERVER_NUMBER (3)
  55. static authserver_id authserver_number = MIN_AUTHSERVER_NUMBER;
  56. static struct auth_server authserver[256];
  57. //////////////////////////////////////////////
  58. #define get_real_general_relay_servers_number() (turn_params.general_relay_servers_number > 1 ? turn_params.general_relay_servers_number : 1)
  59. #define get_real_udp_relay_servers_number() (turn_params.udp_relay_servers_number > 1 ? turn_params.udp_relay_servers_number : 1)
  60. static struct relay_server *general_relay_servers[1+((turnserver_id)-1)];
  61. static struct relay_server *udp_relay_servers[1+((turnserver_id)-1)];
  62. //////////////////////////////////////////////
  63. static void run_events(struct event_base *eb, ioa_engine_handle e);
  64. static void setup_relay_server(struct relay_server *rs, ioa_engine_handle e, int to_set_rfc5780);
  65. /////////////// BARRIERS ///////////////////
  66. #if !defined(PTHREAD_BARRIER_SERIAL_THREAD)
  67. #define PTHREAD_BARRIER_SERIAL_THREAD (-1)
  68. #endif
  69. static void barrier_wait_func(const char* func, int line)
  70. {
  71. #if !defined(TURN_NO_THREAD_BARRIERS)
  72. int br = 0;
  73. do {
  74. br = pthread_barrier_wait(&barrier);
  75. if ((br < 0)&&(br != PTHREAD_BARRIER_SERIAL_THREAD)) {
  76. int err = errno;
  77. perror("barrier wait");
  78. printf("%s:%s:%d: %d\n", __FUNCTION__, func,line,err);
  79. }
  80. } while (((br < 0)&&(br != PTHREAD_BARRIER_SERIAL_THREAD)) && (errno == EINTR));
  81. #else
  82. UNUSED_ARG(func);
  83. UNUSED_ARG(line);
  84. sleep(5);
  85. #endif
  86. }
  87. #define barrier_wait() barrier_wait_func(__FUNCTION__,__LINE__)
  88. /////////////// Bandwidth //////////////////
  89. static pthread_mutex_t mutex_bps;
  90. static band_limit_t allocate_bps(band_limit_t bps, int positive)
  91. {
  92. band_limit_t ret = 0;
  93. if(bps>0) {
  94. pthread_mutex_lock(&mutex_bps);
  95. if(positive) {
  96. if(!(turn_params.bps_capacity)) {
  97. ret = bps;
  98. turn_params.bps_capacity_allocated += ret;
  99. } else if(turn_params.bps_capacity_allocated < turn_params.bps_capacity) {
  100. band_limit_t reserve = turn_params.bps_capacity - turn_params.bps_capacity_allocated;
  101. if(reserve <= bps) {
  102. ret = reserve;
  103. turn_params.bps_capacity_allocated = turn_params.bps_capacity;
  104. } else {
  105. ret = bps;
  106. turn_params.bps_capacity_allocated += ret;
  107. }
  108. }
  109. } else {
  110. if(turn_params.bps_capacity_allocated >= bps) {
  111. turn_params.bps_capacity_allocated -= bps;
  112. } else {
  113. turn_params.bps_capacity_allocated = 0;
  114. }
  115. }
  116. pthread_mutex_unlock(&mutex_bps);
  117. }
  118. return ret;
  119. }
  120. band_limit_t get_bps_capacity_allocated(void)
  121. {
  122. band_limit_t ret = 0;
  123. pthread_mutex_lock(&mutex_bps);
  124. ret = turn_params.bps_capacity_allocated;
  125. pthread_mutex_unlock(&mutex_bps);
  126. return ret;
  127. }
  128. band_limit_t get_bps_capacity(void)
  129. {
  130. band_limit_t ret = 0;
  131. pthread_mutex_lock(&mutex_bps);
  132. ret = turn_params.bps_capacity;
  133. pthread_mutex_unlock(&mutex_bps);
  134. return ret;
  135. }
  136. void set_bps_capacity(band_limit_t value)
  137. {
  138. pthread_mutex_lock(&mutex_bps);
  139. turn_params.bps_capacity = value;
  140. pthread_mutex_unlock(&mutex_bps);
  141. }
  142. band_limit_t get_max_bps(void)
  143. {
  144. band_limit_t ret = 0;
  145. pthread_mutex_lock(&mutex_bps);
  146. ret = turn_params.max_bps;
  147. pthread_mutex_unlock(&mutex_bps);
  148. return ret;
  149. }
  150. void set_max_bps(band_limit_t value)
  151. {
  152. pthread_mutex_lock(&mutex_bps);
  153. turn_params.max_bps = value;
  154. pthread_mutex_unlock(&mutex_bps);
  155. }
  156. /////////////// AUX SERVERS ////////////////
  157. static void add_aux_server_list(const char *saddr, turn_server_addrs_list_t *list)
  158. {
  159. if(saddr && list) {
  160. ioa_addr addr;
  161. if(make_ioa_addr_from_full_string((const uint8_t*)saddr, 0, &addr)!=0) {
  162. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "Wrong full address format: %s\n",saddr);
  163. } else {
  164. list->addrs = (ioa_addr*)realloc(list->addrs,sizeof(ioa_addr)*(list->size+1));
  165. addr_cpy(&(list->addrs[(list->size)++]),&addr);
  166. {
  167. uint8_t s[1025];
  168. addr_to_string(&addr, s);
  169. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Aux server: %s\n",s);
  170. }
  171. }
  172. }
  173. }
  174. void add_aux_server(const char *saddr)
  175. {
  176. add_aux_server_list(saddr,&turn_params.aux_servers_list);
  177. }
  178. /////////////// ALTERNATE SERVERS ////////////////
  179. static void add_alt_server(const char *saddr, int default_port, turn_server_addrs_list_t *list)
  180. {
  181. if(saddr && list) {
  182. ioa_addr addr;
  183. turn_mutex_lock(&(list->m));
  184. if(make_ioa_addr_from_full_string((const uint8_t*)saddr, default_port, &addr)!=0) {
  185. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "Wrong IP address format: %s\n",saddr);
  186. } else {
  187. list->addrs = (ioa_addr*)realloc(list->addrs,sizeof(ioa_addr)*(list->size+1));
  188. addr_cpy(&(list->addrs[(list->size)++]),&addr);
  189. {
  190. uint8_t s[1025];
  191. addr_to_string(&addr, s);
  192. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Alternate server added: %s\n",s);
  193. }
  194. }
  195. turn_mutex_unlock(&(list->m));
  196. }
  197. }
  198. static void del_alt_server(const char *saddr, int default_port, turn_server_addrs_list_t *list)
  199. {
  200. if(saddr && list && list->size && list->addrs) {
  201. ioa_addr addr;
  202. turn_mutex_lock(&(list->m));
  203. if(make_ioa_addr_from_full_string((const uint8_t*)saddr, default_port, &addr)!=0) {
  204. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "Wrong IP address format: %s\n",saddr);
  205. } else {
  206. size_t i;
  207. int found = 0;
  208. for(i=0;i<list->size;++i) {
  209. if(addr_eq(&(list->addrs[i]),&addr)) {
  210. found = 1;
  211. break;
  212. }
  213. }
  214. if(found) {
  215. size_t j;
  216. ioa_addr *new_addrs = (ioa_addr*)malloc(sizeof(ioa_addr)*(list->size-1));
  217. for(j=0;j<i;++j) {
  218. addr_cpy(&(new_addrs[j]),&(list->addrs[j]));
  219. }
  220. for(j=i;j<list->size-1;++j) {
  221. addr_cpy(&(new_addrs[j]),&(list->addrs[j+1]));
  222. }
  223. free(list->addrs);
  224. list->addrs = new_addrs;
  225. list->size -= 1;
  226. {
  227. uint8_t s[1025];
  228. addr_to_string(&addr, s);
  229. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Alternate server removed: %s\n",s);
  230. }
  231. del_alt_server(saddr, default_port, list);
  232. }
  233. }
  234. turn_mutex_unlock(&(list->m));
  235. }
  236. }
  237. void add_alternate_server(const char *saddr)
  238. {
  239. add_alt_server(saddr,DEFAULT_STUN_PORT,&turn_params.alternate_servers_list);
  240. }
  241. void del_alternate_server(const char *saddr)
  242. {
  243. del_alt_server(saddr,DEFAULT_STUN_PORT,&turn_params.alternate_servers_list);
  244. }
  245. void add_tls_alternate_server(const char *saddr)
  246. {
  247. add_alt_server(saddr,DEFAULT_STUN_TLS_PORT,&turn_params.tls_alternate_servers_list);
  248. }
  249. void del_tls_alternate_server(const char *saddr)
  250. {
  251. del_alt_server(saddr,DEFAULT_STUN_TLS_PORT,&turn_params.tls_alternate_servers_list);
  252. }
  253. //////////////////////////////////////////////////
  254. typedef struct update_ssl_ctx_cb_args {
  255. ioa_engine_handle engine;
  256. turn_params_t *params;
  257. struct event *next;
  258. } update_ssl_ctx_cb_args_t;
  259. /*
  260. * Copy SSL context at "from", which may be NULL if no context in use
  261. */
  262. static void replace_one_ssl_ctx(SSL_CTX **to, SSL_CTX *from)
  263. {
  264. if (*to)
  265. SSL_CTX_free(*to);
  266. if (from != NULL)
  267. SSL_CTX_up_ref(from);
  268. *to = from;
  269. }
  270. /*
  271. * Synchronise the ioa_engine's SSL certificates with the global ones
  272. */
  273. static void update_ssl_ctx(evutil_socket_t sock, short events, update_ssl_ctx_cb_args_t *args)
  274. {
  275. ioa_engine_handle e = args->engine;
  276. turn_params_t *params = args->params;
  277. /* No mutex with "e" as these are only used in the same event loop */
  278. pthread_mutex_lock(&turn_params.tls_mutex);
  279. replace_one_ssl_ctx(&e->tls_ctx_ssl23, params->tls_ctx_ssl23);
  280. replace_one_ssl_ctx(&e->tls_ctx_v1_0, params->tls_ctx_v1_0);
  281. #if TLSv1_1_SUPPORTED
  282. replace_one_ssl_ctx(&e->tls_ctx_v1_1, params->tls_ctx_v1_1);
  283. #if TLSv1_2_SUPPORTED
  284. replace_one_ssl_ctx(&e->tls_ctx_v1_2, params->tls_ctx_v1_2);
  285. #endif
  286. #endif
  287. #if DTLS_SUPPORTED
  288. replace_one_ssl_ctx(&e->dtls_ctx, params->dtls_ctx);
  289. #endif
  290. #if DTLSv1_2_SUPPORTED
  291. replace_one_ssl_ctx(&e->dtls_ctx_v1_2, params->dtls_ctx_v1_2);
  292. #endif
  293. struct event *next = args->next;
  294. pthread_mutex_unlock(&turn_params.tls_mutex);
  295. if (next != NULL)
  296. event_active(next, EV_READ, 0);
  297. UNUSED_ARG(sock);
  298. UNUSED_ARG(events);
  299. }
  300. void set_ssl_ctx(ioa_engine_handle e, turn_params_t *params)
  301. {
  302. update_ssl_ctx_cb_args_t *args = (update_ssl_ctx_cb_args_t *)malloc(sizeof(update_ssl_ctx_cb_args_t));
  303. args->engine = e;
  304. args->params = params;
  305. args->next = NULL;
  306. update_ssl_ctx(-1, 0, args);
  307. struct event_base *base = e->event_base;
  308. if (base != NULL) {
  309. struct event *ev = event_new(base, -1, EV_PERSIST, (event_callback_fn)update_ssl_ctx, (void *)args);
  310. pthread_mutex_lock(&turn_params.tls_mutex);
  311. args->next = params->tls_ctx_update_ev;
  312. params->tls_ctx_update_ev = ev;
  313. pthread_mutex_unlock(&turn_params.tls_mutex);
  314. }
  315. }
  316. //////////////////////////////////////////////////
  317. void add_listener_addr(const char* addr) {
  318. ioa_addr baddr;
  319. if(make_ioa_addr((const uint8_t*)addr,0,&baddr)<0) {
  320. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"Cannot add a listener address: %s\n",addr);
  321. } else {
  322. char sbaddr[129];
  323. addr_to_string_no_port(&baddr,(uint8_t*)sbaddr);
  324. size_t i = 0;
  325. for(i=0;i<turn_params.listener.addrs_number;++i) {
  326. if(addr_eq(turn_params.listener.encaddrs[i],&baddr)) {
  327. return;
  328. }
  329. }
  330. ++turn_params.listener.addrs_number;
  331. ++turn_params.listener.services_number;
  332. turn_params.listener.addrs = (char**)realloc(turn_params.listener.addrs, sizeof(char*)*turn_params.listener.addrs_number);
  333. turn_params.listener.addrs[turn_params.listener.addrs_number-1]=strdup(sbaddr);
  334. turn_params.listener.encaddrs = (ioa_addr**)realloc(turn_params.listener.encaddrs, sizeof(ioa_addr*)*turn_params.listener.addrs_number);
  335. turn_params.listener.encaddrs[turn_params.listener.addrs_number-1]=(ioa_addr*)malloc(sizeof(ioa_addr));
  336. addr_cpy(turn_params.listener.encaddrs[turn_params.listener.addrs_number-1],&baddr);
  337. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Listener address to use: %s\n",sbaddr);
  338. }
  339. }
  340. int add_relay_addr(const char* addr) {
  341. ioa_addr baddr;
  342. if(make_ioa_addr((const uint8_t*)addr,0,&baddr)<0) {
  343. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"Cannot add a relay address: %s\n",addr);
  344. return -1;
  345. } else {
  346. char sbaddr[129];
  347. addr_to_string_no_port(&baddr,(uint8_t*)sbaddr);
  348. size_t i = 0;
  349. for(i=0;i<turn_params.relays_number;++i) {
  350. if(!strcmp(turn_params.relay_addrs[i],sbaddr)) {
  351. return 0;
  352. }
  353. }
  354. ++turn_params.relays_number;
  355. turn_params.relay_addrs = (char**)realloc(turn_params.relay_addrs, sizeof(char*)*turn_params.relays_number);
  356. turn_params.relay_addrs[turn_params.relays_number-1]=strdup(sbaddr);
  357. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Relay address to use: %s\n",sbaddr);
  358. return 1;
  359. }
  360. }
  361. static void allocate_relay_addrs_ports(void) {
  362. int i;
  363. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Wait for relay ports initialization...\n");
  364. for(i=0;i<(int)turn_params.relays_number;i++) {
  365. ioa_addr baddr;
  366. if(make_ioa_addr((const uint8_t*)turn_params.relay_addrs[i],0,&baddr)>=0) {
  367. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, " relay %s initialization...\n",turn_params.relay_addrs[i]);
  368. turnipports_add_ip(STUN_ATTRIBUTE_TRANSPORT_UDP_VALUE, &baddr);
  369. turnipports_add_ip(STUN_ATTRIBUTE_TRANSPORT_TCP_VALUE, &baddr);
  370. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, " relay %s initialization done\n",turn_params.relay_addrs[i]);
  371. }
  372. }
  373. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Relay ports initialization done\n");
  374. }
  375. //////////////////////////////////////////////////
  376. // communications between listener and relays ==>>
  377. static int handle_relay_message(relay_server_handle rs, struct message_to_relay *sm);
  378. static pthread_mutex_t auth_message_counter_mutex = PTHREAD_MUTEX_INITIALIZER;
  379. static authserver_id auth_message_counter = 1;
  380. void send_auth_message_to_auth_server(struct auth_message *am)
  381. {
  382. pthread_mutex_lock(&auth_message_counter_mutex);
  383. if(auth_message_counter>=authserver_number) auth_message_counter = 1;
  384. else if(auth_message_counter<1) auth_message_counter = 1;
  385. authserver_id sn = auth_message_counter++;
  386. pthread_mutex_unlock(&auth_message_counter_mutex);
  387. struct evbuffer *output = bufferevent_get_output(authserver[sn].out_buf);
  388. if(evbuffer_add(output,am,sizeof(struct auth_message))<0) {
  389. fprintf(stderr,"%s: Weird buffer error\n",__FUNCTION__);
  390. }
  391. }
  392. static void auth_server_receive_message(struct bufferevent *bev, void *ptr)
  393. {
  394. UNUSED_ARG(ptr);
  395. struct auth_message am;
  396. int n = 0;
  397. struct evbuffer *input = bufferevent_get_input(bev);
  398. while ((n = evbuffer_remove(input, &am, sizeof(struct auth_message))) > 0) {
  399. if (n != sizeof(struct auth_message)) {
  400. fprintf(stderr,"%s: Weird buffer error: size=%d\n",__FUNCTION__,n);
  401. continue;
  402. }
  403. {
  404. hmackey_t key;
  405. if(get_user_key(am.in_oauth,&(am.out_oauth),&(am.max_session_time),am.username,am.realm,key,am.in_buffer.nbh)<0) {
  406. am.success = 0;
  407. } else {
  408. bcopy(key,am.key,sizeof(hmackey_t));
  409. am.success = 1;
  410. }
  411. }
  412. size_t dest = am.id;
  413. struct evbuffer *output = NULL;
  414. if(dest>=TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP) {
  415. dest -= TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP;
  416. if(dest >= get_real_udp_relay_servers_number()) {
  417. TURN_LOG_FUNC(
  418. TURN_LOG_LEVEL_ERROR,
  419. "%s: Too large UDP relay number: %d\n",
  420. __FUNCTION__,(int)dest);
  421. } else if(!(udp_relay_servers[dest])) {
  422. TURN_LOG_FUNC(
  423. TURN_LOG_LEVEL_ERROR,
  424. "%s: Wrong UDP relay number: %d, total %d\n",
  425. __FUNCTION__,(int)dest, (int)get_real_udp_relay_servers_number());
  426. } else {
  427. output = bufferevent_get_output(udp_relay_servers[dest]->auth_out_buf);
  428. }
  429. } else {
  430. if(dest >= get_real_general_relay_servers_number()) {
  431. TURN_LOG_FUNC(
  432. TURN_LOG_LEVEL_ERROR,
  433. "%s: Too large general relay number: %d, total %d\n",
  434. __FUNCTION__,(int)dest,(int)get_real_general_relay_servers_number());
  435. } else if(!(general_relay_servers[dest])) {
  436. TURN_LOG_FUNC(
  437. TURN_LOG_LEVEL_ERROR,
  438. "%s: Wrong general relay number: %d, total %d\n",
  439. __FUNCTION__,(int)dest,(int)get_real_general_relay_servers_number());
  440. } else {
  441. output = bufferevent_get_output(general_relay_servers[dest]->auth_out_buf);
  442. }
  443. }
  444. if(output)
  445. evbuffer_add(output,&am,sizeof(struct auth_message));
  446. else {
  447. ioa_network_buffer_delete(NULL, am.in_buffer.nbh);
  448. am.in_buffer.nbh = NULL;
  449. }
  450. }
  451. }
  452. static int send_socket_to_general_relay(ioa_engine_handle e, struct message_to_relay *sm)
  453. {
  454. struct relay_server *rdest = sm->relay_server;
  455. if(!rdest) {
  456. size_t dest = (hash_int32(addr_get_port(&(sm->m.sm.nd.src_addr)))) % get_real_general_relay_servers_number();
  457. rdest = general_relay_servers[dest];
  458. }
  459. struct message_to_relay *smptr = sm;
  460. smptr->t = RMT_SOCKET;
  461. struct evbuffer *output = NULL;
  462. int success = 0;
  463. if(!rdest) {
  464. goto label_end;
  465. }
  466. output = bufferevent_get_output(rdest->out_buf);
  467. if(output) {
  468. if(evbuffer_add(output,smptr,sizeof(struct message_to_relay))<0) {
  469. TURN_LOG_FUNC(
  470. TURN_LOG_LEVEL_ERROR,
  471. "%s: Cannot add message to relay output buffer\n",
  472. __FUNCTION__);
  473. } else {
  474. success = 1;
  475. smptr->m.sm.nd.nbh=NULL;
  476. }
  477. }
  478. label_end:
  479. if(!success) {
  480. ioa_network_buffer_delete(e, smptr->m.sm.nd.nbh);
  481. smptr->m.sm.nd.nbh=NULL;
  482. IOA_CLOSE_SOCKET(smptr->m.sm.s);
  483. return -1;
  484. }
  485. return 0;
  486. }
  487. static int send_socket_to_relay(turnserver_id id, uint64_t cid, stun_tid *tid, ioa_socket_handle s,
  488. int message_integrity, MESSAGE_TO_RELAY_TYPE rmt, ioa_net_data *nd,
  489. int can_resume)
  490. {
  491. int ret = -1;
  492. struct message_to_relay sm;
  493. bzero(&sm,sizeof(struct message_to_relay));
  494. sm.t = rmt;
  495. ioa_socket_handle s_to_delete = s;
  496. struct relay_server *rs = NULL;
  497. if(id>=TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP) {
  498. size_t dest = id-TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP;
  499. if(dest >= get_real_udp_relay_servers_number()) {
  500. TURN_LOG_FUNC(
  501. TURN_LOG_LEVEL_ERROR,
  502. "%s: Too large UDP relay number: %d, rmt=%d, total=%d\n",
  503. __FUNCTION__,(int)dest,(int)rmt, (int)get_real_udp_relay_servers_number());
  504. goto err;
  505. }
  506. rs = udp_relay_servers[dest];
  507. if(!rs) {
  508. TURN_LOG_FUNC(
  509. TURN_LOG_LEVEL_ERROR,
  510. "%s: Wrong UDP relay number: %d, rmt=%d, total=%d\n",
  511. __FUNCTION__,(int)dest,(int)rmt, (int)get_real_udp_relay_servers_number());
  512. goto err;
  513. }
  514. } else {
  515. size_t dest = id;
  516. if(dest >= get_real_general_relay_servers_number()) {
  517. TURN_LOG_FUNC(
  518. TURN_LOG_LEVEL_ERROR,
  519. "%s: Too large general relay number: %d, rmt=%d, total=%d\n",
  520. __FUNCTION__,(int)dest,(int)rmt, (int)get_real_general_relay_servers_number());
  521. goto err;
  522. }
  523. rs = general_relay_servers[dest];
  524. if(!rs) {
  525. TURN_LOG_FUNC(
  526. TURN_LOG_LEVEL_ERROR,
  527. "%s: Wrong general relay number: %d, rmt=%d, total=%d\n",
  528. __FUNCTION__,(int)dest,(int)rmt, (int)get_real_general_relay_servers_number());
  529. goto err;
  530. }
  531. }
  532. switch (rmt) {
  533. case(RMT_CB_SOCKET): {
  534. if(nd && nd->nbh) {
  535. sm.m.cb_sm.id = id;
  536. sm.m.cb_sm.connection_id = (tcp_connection_id)cid;
  537. stun_tid_cpy(&(sm.m.cb_sm.tid),tid);
  538. sm.m.cb_sm.s = s;
  539. sm.m.cb_sm.message_integrity = message_integrity;
  540. addr_cpy(&(sm.m.cb_sm.nd.src_addr),&(nd->src_addr));
  541. sm.m.cb_sm.nd.recv_tos = nd->recv_tos;
  542. sm.m.cb_sm.nd.recv_ttl = nd->recv_ttl;
  543. sm.m.cb_sm.nd.nbh = nd->nbh;
  544. sm.m.cb_sm.can_resume = can_resume;
  545. nd->nbh = NULL;
  546. s_to_delete = NULL;
  547. ret = 0;
  548. }
  549. break;
  550. }
  551. case (RMT_MOBILE_SOCKET): {
  552. if(nd && nd->nbh) {
  553. sm.m.sm.s = s;
  554. addr_cpy(&(sm.m.sm.nd.src_addr),&(nd->src_addr));
  555. sm.m.sm.nd.recv_tos = nd->recv_tos;
  556. sm.m.sm.nd.recv_ttl = nd->recv_ttl;
  557. sm.m.sm.nd.nbh = nd->nbh;
  558. sm.m.sm.can_resume = can_resume;
  559. nd->nbh = NULL;
  560. s_to_delete = NULL;
  561. ret = 0;
  562. } else {
  563. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: Empty buffer with mobile socket\n",__FUNCTION__);
  564. }
  565. break;
  566. }
  567. default: {
  568. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "%s: UNKNOWN RMT message: %d\n",__FUNCTION__,(int)rmt);
  569. }
  570. }
  571. if(ret == 0) {
  572. struct evbuffer *output = bufferevent_get_output(rs->out_buf);
  573. if(output) {
  574. evbuffer_add(output,&sm,sizeof(struct message_to_relay));
  575. } else {
  576. TURN_LOG_FUNC(
  577. TURN_LOG_LEVEL_ERROR,
  578. "%s: Empty output buffer\n",
  579. __FUNCTION__);
  580. ret = -1;
  581. s_to_delete = s;
  582. }
  583. }
  584. err:
  585. IOA_CLOSE_SOCKET(s_to_delete);
  586. if(nd && nd->nbh) {
  587. ioa_network_buffer_delete(NULL, nd->nbh);
  588. nd->nbh = NULL;
  589. }
  590. if(ret<0) {
  591. if(rmt == RMT_MOBILE_SOCKET) {
  592. ioa_network_buffer_delete(NULL, sm.m.sm.nd.nbh);
  593. sm.m.sm.nd.nbh = NULL;
  594. } else if(rmt == RMT_CB_SOCKET) {
  595. ioa_network_buffer_delete(NULL, sm.m.cb_sm.nd.nbh);
  596. sm.m.cb_sm.nd.nbh = NULL;
  597. }
  598. }
  599. return ret;
  600. }
  601. int send_session_cancellation_to_relay(turnsession_id sid)
  602. {
  603. int ret = 0;
  604. struct message_to_relay sm;
  605. bzero(&sm,sizeof(struct message_to_relay));
  606. sm.t = RMT_CANCEL_SESSION;
  607. turnserver_id id = (turnserver_id)(sid / TURN_SESSION_ID_FACTOR);
  608. struct relay_server *rs = NULL;
  609. if(id>=TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP) {
  610. size_t dest = id-TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP;
  611. if(dest >= get_real_udp_relay_servers_number()) {
  612. TURN_LOG_FUNC(
  613. TURN_LOG_LEVEL_ERROR,
  614. "%s: Too large UDP relay number: %d, total=%d\n",
  615. __FUNCTION__,(int)dest,(int)get_real_udp_relay_servers_number());
  616. ret = -1;
  617. goto err;
  618. }
  619. rs = udp_relay_servers[dest];
  620. if(!rs) {
  621. TURN_LOG_FUNC(
  622. TURN_LOG_LEVEL_ERROR,
  623. "%s: Wrong UDP relay number: %d, total=%d\n",
  624. __FUNCTION__,(int)dest,(int)get_real_udp_relay_servers_number());
  625. ret = -1;
  626. goto err;
  627. }
  628. } else {
  629. size_t dest = id;
  630. if(dest >= get_real_general_relay_servers_number()) {
  631. TURN_LOG_FUNC(
  632. TURN_LOG_LEVEL_ERROR,
  633. "%s: Too large general relay number: %d, total=%d\n",
  634. __FUNCTION__,(int)dest,(int)get_real_general_relay_servers_number());
  635. ret = -1;
  636. goto err;
  637. }
  638. rs = general_relay_servers[dest];
  639. if(!rs) {
  640. TURN_LOG_FUNC(
  641. TURN_LOG_LEVEL_ERROR,
  642. "%s: Wrong general relay number: %d, total=%d\n",
  643. __FUNCTION__,(int)dest,(int)get_real_general_relay_servers_number());
  644. ret = -1;
  645. goto err;
  646. }
  647. }
  648. sm.relay_server = rs;
  649. sm.m.csm.id = sid;
  650. {
  651. struct evbuffer *output = bufferevent_get_output(rs->out_buf);
  652. if(output) {
  653. evbuffer_add(output,&sm,sizeof(struct message_to_relay));
  654. } else {
  655. TURN_LOG_FUNC(
  656. TURN_LOG_LEVEL_ERROR,
  657. "%s: Empty output buffer\n",
  658. __FUNCTION__);
  659. ret = -1;
  660. }
  661. }
  662. err:
  663. return ret;
  664. }
  665. static int handle_relay_message(relay_server_handle rs, struct message_to_relay *sm)
  666. {
  667. if(rs && sm) {
  668. switch (sm->t) {
  669. case RMT_CANCEL_SESSION: {
  670. turn_cancel_session(&(rs->server),sm->m.csm.id);
  671. }
  672. break;
  673. case RMT_SOCKET: {
  674. if (sm->m.sm.s->defer_nbh) {
  675. if (!sm->m.sm.nd.nbh) {
  676. sm->m.sm.nd.nbh = sm->m.sm.s->defer_nbh;
  677. sm->m.sm.s->defer_nbh = NULL;
  678. } else {
  679. ioa_network_buffer_delete(rs->ioa_eng, sm->m.sm.s->defer_nbh);
  680. sm->m.sm.s->defer_nbh = NULL;
  681. }
  682. }
  683. ioa_socket_handle s = sm->m.sm.s;
  684. if (!s) {
  685. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,
  686. "%s: socket EMPTY\n",__FUNCTION__);
  687. } else if (s->read_event || s->bev) {
  688. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,
  689. "%s: socket wrongly preset: 0x%lx : 0x%lx\n",
  690. __FUNCTION__, (long) s->read_event, (long) s->bev);
  691. IOA_CLOSE_SOCKET(s);
  692. sm->m.sm.s = NULL;
  693. } else {
  694. s->e = rs->ioa_eng;
  695. if(open_client_connection_session(&(rs->server), &(sm->m.sm))<0) {
  696. IOA_CLOSE_SOCKET(s);
  697. sm->m.sm.s = NULL;
  698. }
  699. }
  700. ioa_network_buffer_delete(rs->ioa_eng, sm->m.sm.nd.nbh);
  701. sm->m.sm.nd.nbh = NULL;
  702. }
  703. break;
  704. case RMT_CB_SOCKET:
  705. turnserver_accept_tcp_client_data_connection(&(rs->server), sm->m.cb_sm.connection_id,
  706. &(sm->m.cb_sm.tid), sm->m.cb_sm.s, sm->m.cb_sm.message_integrity, &(sm->m.cb_sm.nd),
  707. /*sm->m.cb_sm.can_resume*/
  708. /* Note: we cannot resume this call, it must be authenticated in-place.
  709. * There are two reasons for that:
  710. * 1) Technical. That's very difficult with the current code structure.
  711. * 2) Security (more important). We do not want 'stealing' connections between the users.
  712. * */
  713. 0);
  714. ioa_network_buffer_delete(rs->ioa_eng, sm->m.cb_sm.nd.nbh);
  715. sm->m.cb_sm.nd.nbh = NULL;
  716. break;
  717. case RMT_MOBILE_SOCKET: {
  718. ioa_socket_handle s = sm->m.sm.s;
  719. if (!s) {
  720. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,
  721. "%s: mobile socket EMPTY\n",__FUNCTION__);
  722. } else if (s->read_event || s->bev) {
  723. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,
  724. "%s: mobile socket wrongly preset: 0x%lx : 0x%lx\n",
  725. __FUNCTION__, (long) s->read_event, (long) s->bev);
  726. IOA_CLOSE_SOCKET(s);
  727. sm->m.sm.s = NULL;
  728. } else {
  729. s->e = rs->ioa_eng;
  730. if(open_client_connection_session(&(rs->server), &(sm->m.sm))<0) {
  731. IOA_CLOSE_SOCKET(s);
  732. sm->m.sm.s = NULL;
  733. }
  734. }
  735. ioa_network_buffer_delete(rs->ioa_eng, sm->m.sm.nd.nbh);
  736. sm->m.sm.nd.nbh = NULL;
  737. break;
  738. }
  739. default: {
  740. perror("Weird buffer type\n");
  741. }
  742. }
  743. }
  744. return 0;
  745. }
  746. static void handle_relay_auth_message(struct relay_server *rs, struct auth_message *am)
  747. {
  748. am->resume_func(am->success, am->out_oauth, am->max_session_time, am->key, am->pwd,
  749. &(rs->server), am->ctxkey, &(am->in_buffer), am->realm);
  750. if (am->in_buffer.nbh) {
  751. ioa_network_buffer_delete(rs->ioa_eng, am->in_buffer.nbh);
  752. am->in_buffer.nbh = NULL;
  753. }
  754. }
  755. static void relay_receive_message(struct bufferevent *bev, void *ptr)
  756. {
  757. struct message_to_relay sm;
  758. int n = 0;
  759. struct evbuffer *input = bufferevent_get_input(bev);
  760. struct relay_server *rs = (struct relay_server *)ptr;
  761. while ((n = evbuffer_remove(input, &sm, sizeof(struct message_to_relay))) > 0) {
  762. if (n != sizeof(struct message_to_relay)) {
  763. perror("Weird buffer error\n");
  764. continue;
  765. }
  766. handle_relay_message(rs, &sm);
  767. }
  768. }
  769. static void relay_receive_auth_message(struct bufferevent *bev, void *ptr)
  770. {
  771. struct auth_message am;
  772. int n = 0;
  773. struct evbuffer *input = bufferevent_get_input(bev);
  774. struct relay_server *rs = (struct relay_server *)ptr;
  775. while ((n = evbuffer_remove(input, &am, sizeof(struct auth_message))) > 0) {
  776. if (n != sizeof(struct auth_message)) {
  777. perror("Weird auth_buffer error\n");
  778. continue;
  779. }
  780. handle_relay_auth_message(rs, &am);
  781. }
  782. }
  783. static int send_message_from_listener_to_client(ioa_engine_handle e, ioa_network_buffer_handle nbh, ioa_addr *origin, ioa_addr *destination)
  784. {
  785. struct message_to_listener mm;
  786. mm.t = LMT_TO_CLIENT;
  787. addr_cpy(&(mm.m.tc.origin),origin);
  788. addr_cpy(&(mm.m.tc.destination),destination);
  789. mm.m.tc.nbh = ioa_network_buffer_allocate(e);
  790. ioa_network_buffer_header_init(mm.m.tc.nbh);
  791. bcopy(ioa_network_buffer_data(nbh),ioa_network_buffer_data(mm.m.tc.nbh),ioa_network_buffer_get_size(nbh));
  792. ioa_network_buffer_set_size(mm.m.tc.nbh,ioa_network_buffer_get_size(nbh));
  793. struct evbuffer *output = bufferevent_get_output(turn_params.listener.out_buf);
  794. evbuffer_add(output,&mm,sizeof(struct message_to_listener));
  795. return 0;
  796. }
  797. static void listener_receive_message(struct bufferevent *bev, void *ptr)
  798. {
  799. UNUSED_ARG(ptr);
  800. struct message_to_listener mm;
  801. int n = 0;
  802. struct evbuffer *input = bufferevent_get_input(bev);
  803. while ((n = evbuffer_remove(input, &mm, sizeof(struct message_to_listener))) > 0) {
  804. if (n != sizeof(struct message_to_listener)) {
  805. perror("Weird buffer error\n");
  806. continue;
  807. }
  808. if (mm.t != LMT_TO_CLIENT) {
  809. perror("Weird buffer type\n");
  810. continue;
  811. }
  812. size_t relay_thread_index = 0;
  813. if(turn_params.net_engine_version == NEV_UDP_SOCKET_PER_THREAD) {
  814. size_t ri;
  815. for(ri=0;ri<get_real_general_relay_servers_number();ri++) {
  816. if(!(general_relay_servers[ri])) {
  817. TURN_LOG_FUNC(
  818. TURN_LOG_LEVEL_ERROR,
  819. "%s: Wrong general relay number: %d, total %d\n",
  820. __FUNCTION__,(int)ri,(int)get_real_general_relay_servers_number());
  821. } else if(general_relay_servers[ri]->thr == pthread_self()) {
  822. relay_thread_index=ri;
  823. break;
  824. }
  825. }
  826. }
  827. size_t i;
  828. int found = 0;
  829. for(i=0;i<turn_params.listener.addrs_number;i++) {
  830. if(addr_eq_no_port(turn_params.listener.encaddrs[i],&mm.m.tc.origin)) {
  831. int o_port = addr_get_port(&mm.m.tc.origin);
  832. if(turn_params.listener.addrs_number == turn_params.listener.services_number) {
  833. if(o_port == turn_params.listener_port) {
  834. if(turn_params.listener.udp_services && turn_params.listener.udp_services[i] && turn_params.listener.udp_services[i][relay_thread_index]) {
  835. found = 1;
  836. udp_send_message(turn_params.listener.udp_services[i][relay_thread_index], mm.m.tc.nbh, &mm.m.tc.destination);
  837. }
  838. } else {
  839. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"%s: Wrong origin port(1): %d\n",__FUNCTION__,o_port);
  840. }
  841. } else if((turn_params.listener.addrs_number * 2) == turn_params.listener.services_number) {
  842. if(o_port == turn_params.listener_port) {
  843. if(turn_params.listener.udp_services && turn_params.listener.udp_services[i*2] && turn_params.listener.udp_services[i*2][relay_thread_index]) {
  844. found = 1;
  845. udp_send_message(turn_params.listener.udp_services[i*2][relay_thread_index], mm.m.tc.nbh, &mm.m.tc.destination);
  846. }
  847. } else if(o_port == get_alt_listener_port()) {
  848. if(turn_params.listener.udp_services && turn_params.listener.udp_services[i*2+1] && turn_params.listener.udp_services[i*2+1][relay_thread_index]) {
  849. found = 1;
  850. udp_send_message(turn_params.listener.udp_services[i*2+1][relay_thread_index], mm.m.tc.nbh, &mm.m.tc.destination);
  851. }
  852. } else {
  853. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"%s: Wrong origin port(2): %d\n",__FUNCTION__,o_port);
  854. }
  855. } else {
  856. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"%s: Wrong listener setup\n",__FUNCTION__);
  857. }
  858. break;
  859. }
  860. }
  861. if(!found) {
  862. uint8_t saddr[129];
  863. addr_to_string(&mm.m.tc.origin, saddr);
  864. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"%s: Cannot find local source %s\n",__FUNCTION__,saddr);
  865. }
  866. ioa_network_buffer_delete(turn_params.listener.ioa_eng, mm.m.tc.nbh);
  867. mm.m.tc.nbh = NULL;
  868. }
  869. }
  870. // <<== communications between listener and relays
  871. static ioa_engine_handle create_new_listener_engine(void)
  872. {
  873. struct event_base *eb = turn_event_base_new();
  874. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"IO method (udp listener/relay thread): %s\n",event_base_get_method(eb));
  875. super_memory_t* sm = new_super_memory_region();
  876. ioa_engine_handle e = create_ioa_engine(sm, eb, turn_params.listener.tp, turn_params.relay_ifname, turn_params.relays_number, turn_params.relay_addrs,
  877. turn_params.default_relays, turn_params.verbose
  878. #if !defined(TURN_NO_HIREDIS)
  879. ,turn_params.redis_statsdb
  880. #endif
  881. );
  882. set_ssl_ctx(e, &turn_params);
  883. ioa_engine_set_rtcp_map(e, turn_params.listener.rtcpmap);
  884. return e;
  885. }
  886. static void *run_udp_listener_thread(void *arg)
  887. {
  888. static int always_true = 1;
  889. ignore_sigpipe();
  890. barrier_wait();
  891. dtls_listener_relay_server_type *server = (dtls_listener_relay_server_type *)arg;
  892. while(always_true && server) {
  893. run_events(NULL, get_engine(server));
  894. }
  895. return arg;
  896. }
  897. static void setup_listener(void)
  898. {
  899. super_memory_t* sm = new_super_memory_region();
  900. turn_params.listener.tp = turnipports_create(sm, turn_params.min_port, turn_params.max_port);
  901. turn_params.listener.event_base = turn_event_base_new();
  902. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"IO method (main listener thread): %s\n",event_base_get_method(turn_params.listener.event_base));
  903. turn_params.listener.ioa_eng = create_ioa_engine(sm, turn_params.listener.event_base, turn_params.listener.tp,
  904. turn_params.relay_ifname, turn_params.relays_number, turn_params.relay_addrs,
  905. turn_params.default_relays, turn_params.verbose
  906. #if !defined(TURN_NO_HIREDIS)
  907. ,turn_params.redis_statsdb
  908. #endif
  909. );
  910. if(!turn_params.listener.ioa_eng)
  911. exit(-1);
  912. set_ssl_ctx(turn_params.listener.ioa_eng, &turn_params);
  913. turn_params.listener.rtcpmap = rtcp_map_create(turn_params.listener.ioa_eng);
  914. ioa_engine_set_rtcp_map(turn_params.listener.ioa_eng, turn_params.listener.rtcpmap);
  915. {
  916. struct bufferevent *pair[2];
  917. bufferevent_pair_new(turn_params.listener.event_base, TURN_BUFFEREVENTS_OPTIONS, pair);
  918. turn_params.listener.in_buf = pair[0];
  919. turn_params.listener.out_buf = pair[1];
  920. bufferevent_setcb(turn_params.listener.in_buf, listener_receive_message, NULL, NULL, &turn_params.listener);
  921. bufferevent_enable(turn_params.listener.in_buf, EV_READ);
  922. }
  923. if (turn_params.rfc5780 == 1) {
  924. if(turn_params.listener.addrs_number<2 || turn_params.external_ip) {
  925. turn_params.rfc5780 = 0;
  926. TURN_LOG_FUNC(TURN_LOG_LEVEL_WARNING, "WARNING: I cannot support STUN CHANGE_REQUEST functionality because only one IP address is provided\n");
  927. } else {
  928. turn_params.listener.services_number = turn_params.listener.services_number * 2;
  929. }
  930. } else {
  931. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "INFO: RFC5780 disabled! /NAT behavior discovery/\n");
  932. }
  933. turn_params.listener.udp_services = (dtls_listener_relay_server_type***)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(dtls_listener_relay_server_type**)*turn_params.listener.services_number);
  934. turn_params.listener.dtls_services = (dtls_listener_relay_server_type***)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(dtls_listener_relay_server_type**)*turn_params.listener.services_number);
  935. turn_params.listener.aux_udp_services = (dtls_listener_relay_server_type***)allocate_super_memory_engine(turn_params.listener.ioa_eng, (sizeof(dtls_listener_relay_server_type**)*turn_params.aux_servers_list.size)+sizeof(void*));
  936. }
  937. static void setup_barriers(void)
  938. {
  939. /* Adjust barriers: */
  940. #if !defined(TURN_NO_THREAD_BARRIERS)
  941. if((turn_params.net_engine_version == NEV_UDP_SOCKET_PER_ENDPOINT) && turn_params.general_relay_servers_number>1) {
  942. /* UDP: */
  943. if(!turn_params.no_udp) {
  944. barrier_count += turn_params.listener.addrs_number;
  945. if(turn_params.rfc5780) {
  946. barrier_count += turn_params.listener.addrs_number;
  947. }
  948. }
  949. if(!turn_params.no_dtls && (turn_params.no_udp || (turn_params.listener_port != turn_params.tls_listener_port))) {
  950. barrier_count += turn_params.listener.addrs_number;
  951. if(turn_params.rfc5780) {
  952. barrier_count += turn_params.listener.addrs_number;
  953. }
  954. }
  955. if(!turn_params.no_udp || !turn_params.no_dtls) {
  956. barrier_count += (unsigned int)turn_params.aux_servers_list.size;
  957. }
  958. }
  959. #endif
  960. #if !defined(TURN_NO_THREAD_BARRIERS)
  961. {
  962. if(pthread_barrier_init(&barrier,NULL,barrier_count)<0)
  963. perror("barrier init");
  964. }
  965. #endif
  966. }
  967. static void setup_socket_per_endpoint_udp_listener_servers(void)
  968. {
  969. size_t i = 0;
  970. /* Adjust udp relay number */
  971. if(turn_params.general_relay_servers_number>1) {
  972. if (!turn_params.no_udp) {
  973. turn_params.udp_relay_servers_number += turn_params.listener.addrs_number;
  974. if (turn_params.rfc5780) {
  975. turn_params.udp_relay_servers_number += turn_params.listener.addrs_number;
  976. }
  977. }
  978. if (!turn_params.no_dtls && (turn_params.no_udp || (turn_params.listener_port != turn_params.tls_listener_port))) {
  979. turn_params.udp_relay_servers_number += turn_params.listener.addrs_number;
  980. if (turn_params.rfc5780) {
  981. turn_params.udp_relay_servers_number += turn_params.listener.addrs_number;
  982. }
  983. }
  984. if (!turn_params.no_udp || !turn_params.no_dtls) {
  985. turn_params.udp_relay_servers_number += (unsigned int) turn_params.aux_servers_list.size;
  986. }
  987. }
  988. {
  989. if (!turn_params.no_udp || !turn_params.no_dtls) {
  990. for (i = 0; i < get_real_udp_relay_servers_number(); i++) {
  991. ioa_engine_handle e = turn_params.listener.ioa_eng;
  992. int is_5780 = turn_params.rfc5780;
  993. if(turn_params.general_relay_servers_number<=1) {
  994. while(!(general_relay_servers[0]->ioa_eng))
  995. sched_yield();
  996. udp_relay_servers[i] = general_relay_servers[0];
  997. continue;
  998. } else if(turn_params.general_relay_servers_number>1) {
  999. e = create_new_listener_engine();
  1000. is_5780 = is_5780 && (i >= (size_t) (turn_params.aux_servers_list.size));
  1001. }
  1002. super_memory_t *sm = new_super_memory_region();
  1003. struct relay_server* udp_rs = (struct relay_server*) allocate_super_memory_region(sm, sizeof(struct relay_server));
  1004. udp_rs->id = (turnserver_id) i + TURNSERVER_ID_BOUNDARY_BETWEEN_TCP_AND_UDP;
  1005. udp_rs->sm = sm;
  1006. setup_relay_server(udp_rs, e, is_5780);
  1007. udp_relay_servers[i] = udp_rs;
  1008. }
  1009. }
  1010. }
  1011. int udp_relay_server_index = 0;
  1012. /* Create listeners */
  1013. /* Aux UDP servers */
  1014. for(i=0; i<turn_params.aux_servers_list.size; i++) {
  1015. int index = i;
  1016. if(!turn_params.no_udp || !turn_params.no_dtls) {
  1017. ioa_addr addr;
  1018. char saddr[129];
  1019. addr_cpy(&addr,&turn_params.aux_servers_list.addrs[i]);
  1020. int port = (int)addr_get_port(&addr);
  1021. addr_to_string_no_port(&addr,(uint8_t*)saddr);
  1022. turn_params.listener.aux_udp_services[index] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(udp_relay_servers[udp_relay_server_index]->ioa_eng, sizeof(dtls_listener_relay_server_type*));
  1023. turn_params.listener.aux_udp_services[index][0] = create_dtls_listener_server(turn_params.listener_ifname, saddr, port, turn_params.verbose, udp_relay_servers[udp_relay_server_index]->ioa_eng, &(udp_relay_servers[udp_relay_server_index]->server), 1, NULL);
  1024. if(turn_params.general_relay_servers_number>1) {
  1025. ++udp_relay_server_index;
  1026. pthread_t thr;
  1027. if(pthread_create(&thr, NULL, run_udp_listener_thread, turn_params.listener.aux_udp_services[index][0])) {
  1028. perror("Cannot create aux listener thread\n");
  1029. exit(-1);
  1030. }
  1031. pthread_detach(thr);
  1032. }
  1033. }
  1034. }
  1035. /* Main servers */
  1036. for(i=0; i<turn_params.listener.addrs_number; i++) {
  1037. int index = turn_params.rfc5780 ? i*2 : i;
  1038. /* UDP: */
  1039. if(!turn_params.no_udp) {
  1040. turn_params.listener.udp_services[index] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(udp_relay_servers[udp_relay_server_index]->ioa_eng, sizeof(dtls_listener_relay_server_type*));
  1041. turn_params.listener.udp_services[index][0] = create_dtls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], turn_params.listener_port, turn_params.verbose, udp_relay_servers[udp_relay_server_index]->ioa_eng, &(udp_relay_servers[udp_relay_server_index]->server), 1, NULL);
  1042. if(turn_params.general_relay_servers_number>1) {
  1043. ++udp_relay_server_index;
  1044. pthread_t thr;
  1045. if(pthread_create(&thr, NULL, run_udp_listener_thread, turn_params.listener.udp_services[index][0])) {
  1046. perror("Cannot create listener thread\n");
  1047. exit(-1);
  1048. }
  1049. pthread_detach(thr);
  1050. }
  1051. if(turn_params.rfc5780) {
  1052. turn_params.listener.udp_services[index+1] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(udp_relay_servers[udp_relay_server_index]->ioa_eng, sizeof(dtls_listener_relay_server_type*));
  1053. turn_params.listener.udp_services[index+1][0] = create_dtls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], get_alt_listener_port(), turn_params.verbose, udp_relay_servers[udp_relay_server_index]->ioa_eng, &(udp_relay_servers[udp_relay_server_index]->server), 1, NULL);
  1054. if(turn_params.general_relay_servers_number>1) {
  1055. ++udp_relay_server_index;
  1056. pthread_t thr;
  1057. if(pthread_create(&thr, NULL, run_udp_listener_thread, turn_params.listener.udp_services[index+1][0])) {
  1058. perror("Cannot create listener thread\n");
  1059. exit(-1);
  1060. }
  1061. pthread_detach(thr);
  1062. }
  1063. }
  1064. } else {
  1065. turn_params.listener.udp_services[index] = NULL;
  1066. if(turn_params.rfc5780)
  1067. turn_params.listener.udp_services[index+1] = NULL;
  1068. }
  1069. if(!turn_params.no_dtls && (turn_params.no_udp || (turn_params.listener_port != turn_params.tls_listener_port))) {
  1070. turn_params.listener.dtls_services[index] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(udp_relay_servers[udp_relay_server_index]->ioa_eng, sizeof(dtls_listener_relay_server_type*));
  1071. turn_params.listener.dtls_services[index][0] = create_dtls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], turn_params.tls_listener_port, turn_params.verbose, udp_relay_servers[udp_relay_server_index]->ioa_eng, &(udp_relay_servers[udp_relay_server_index]->server), 1, NULL);
  1072. if(turn_params.general_relay_servers_number>1) {
  1073. ++udp_relay_server_index;
  1074. pthread_t thr;
  1075. if(pthread_create(&thr, NULL, run_udp_listener_thread, turn_params.listener.dtls_services[index][0])) {
  1076. perror("Cannot create listener thread\n");
  1077. exit(-1);
  1078. }
  1079. pthread_detach(thr);
  1080. }
  1081. if(turn_params.rfc5780) {
  1082. turn_params.listener.dtls_services[index+1] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(udp_relay_servers[udp_relay_server_index]->ioa_eng, sizeof(dtls_listener_relay_server_type*));
  1083. turn_params.listener.dtls_services[index+1][0] = create_dtls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], get_alt_tls_listener_port(), turn_params.verbose, udp_relay_servers[udp_relay_server_index]->ioa_eng, &(udp_relay_servers[udp_relay_server_index]->server), 1, NULL);
  1084. if(turn_params.general_relay_servers_number>1) {
  1085. ++udp_relay_server_index;
  1086. pthread_t thr;
  1087. if(pthread_create(&thr, NULL, run_udp_listener_thread, turn_params.listener.dtls_services[index+1][0])) {
  1088. perror("Cannot create listener thread\n");
  1089. exit(-1);
  1090. }
  1091. pthread_detach(thr);
  1092. }
  1093. }
  1094. } else {
  1095. turn_params.listener.dtls_services[index] = NULL;
  1096. if(turn_params.rfc5780)
  1097. turn_params.listener.dtls_services[index+1] = NULL;
  1098. }
  1099. }
  1100. }
  1101. static void setup_socket_per_thread_udp_listener_servers(void)
  1102. {
  1103. size_t i = 0;
  1104. size_t relayindex = 0;
  1105. /* Create listeners */
  1106. for(relayindex=0;relayindex<get_real_general_relay_servers_number();relayindex++) {
  1107. while(!(general_relay_servers[relayindex]->ioa_eng) || !(general_relay_servers[relayindex]->server.e))
  1108. sched_yield();
  1109. }
  1110. /* Aux UDP servers */
  1111. for(i=0; i<turn_params.aux_servers_list.size; i++) {
  1112. int index = i;
  1113. if(!turn_params.no_udp || !turn_params.no_dtls) {
  1114. ioa_addr addr;
  1115. char saddr[129];
  1116. addr_cpy(&addr,&turn_params.aux_servers_list.addrs[i]);
  1117. int port = (int)addr_get_port(&addr);
  1118. addr_to_string_no_port(&addr,(uint8_t*)saddr);
  1119. turn_params.listener.aux_udp_services[index] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(dtls_listener_relay_server_type*) * get_real_general_relay_servers_number());
  1120. for(relayindex=0;relayindex<get_real_general_relay_servers_number();relayindex++) {
  1121. turn_params.listener.aux_udp_services[index][relayindex] = create_dtls_listener_server(turn_params.listener_ifname, saddr, port, turn_params.verbose,
  1122. general_relay_servers[relayindex]->ioa_eng, &(general_relay_servers[relayindex]->server), !relayindex, NULL);
  1123. }
  1124. }
  1125. }
  1126. /* Main servers */
  1127. for(i=0; i<turn_params.listener.addrs_number; i++) {
  1128. int index = turn_params.rfc5780 ? i*2 : i;
  1129. /* UDP: */
  1130. if(!turn_params.no_udp) {
  1131. turn_params.listener.udp_services[index] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(dtls_listener_relay_server_type*) * get_real_general_relay_servers_number());
  1132. for(relayindex=0;relayindex<get_real_general_relay_servers_number();relayindex++) {
  1133. turn_params.listener.udp_services[index][relayindex] = create_dtls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], turn_params.listener_port, turn_params.verbose,
  1134. general_relay_servers[relayindex]->ioa_eng, &(general_relay_servers[relayindex]->server), !relayindex, NULL);
  1135. }
  1136. if(turn_params.rfc5780) {
  1137. turn_params.listener.udp_services[index+1] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(dtls_listener_relay_server_type*) * get_real_general_relay_servers_number());
  1138. for(relayindex=0;relayindex<get_real_general_relay_servers_number();relayindex++) {
  1139. turn_params.listener.udp_services[index+1][relayindex] = create_dtls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], get_alt_listener_port(), turn_params.verbose,
  1140. general_relay_servers[relayindex]->ioa_eng, &(general_relay_servers[relayindex]->server), !relayindex, NULL);
  1141. }
  1142. }
  1143. } else {
  1144. turn_params.listener.udp_services[index] = NULL;
  1145. if(turn_params.rfc5780)
  1146. turn_params.listener.udp_services[index+1] = NULL;
  1147. }
  1148. if(!turn_params.no_dtls && (turn_params.no_udp || (turn_params.listener_port != turn_params.tls_listener_port))) {
  1149. turn_params.listener.dtls_services[index] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(dtls_listener_relay_server_type*) * get_real_general_relay_servers_number());
  1150. for(relayindex=0;relayindex<get_real_general_relay_servers_number();relayindex++) {
  1151. turn_params.listener.dtls_services[index][relayindex] = create_dtls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], turn_params.tls_listener_port, turn_params.verbose,
  1152. general_relay_servers[relayindex]->ioa_eng, &(general_relay_servers[relayindex]->server), !relayindex, NULL);
  1153. }
  1154. if(turn_params.rfc5780) {
  1155. turn_params.listener.dtls_services[index+1] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(dtls_listener_relay_server_type*) * get_real_general_relay_servers_number());
  1156. for(relayindex=0;relayindex<get_real_general_relay_servers_number();relayindex++) {
  1157. turn_params.listener.dtls_services[index+1][relayindex] = create_dtls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], get_alt_tls_listener_port(), turn_params.verbose,
  1158. general_relay_servers[relayindex]->ioa_eng, &(general_relay_servers[relayindex]->server), !relayindex, NULL);
  1159. }
  1160. }
  1161. } else {
  1162. turn_params.listener.dtls_services[index] = NULL;
  1163. if(turn_params.rfc5780)
  1164. turn_params.listener.dtls_services[index+1] = NULL;
  1165. }
  1166. }
  1167. }
  1168. static void setup_socket_per_session_udp_listener_servers(void)
  1169. {
  1170. size_t i = 0;
  1171. /* Aux UDP servers */
  1172. for(i=0; i<turn_params.aux_servers_list.size; i++) {
  1173. int index = i;
  1174. if(!turn_params.no_udp || !turn_params.no_dtls) {
  1175. ioa_addr addr;
  1176. char saddr[129];
  1177. addr_cpy(&addr,&turn_params.aux_servers_list.addrs[i]);
  1178. int port = (int)addr_get_port(&addr);
  1179. addr_to_string_no_port(&addr,(uint8_t*)saddr);
  1180. turn_params.listener.aux_udp_services[index] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(dtls_listener_relay_server_type*));
  1181. turn_params.listener.aux_udp_services[index][0] = create_dtls_listener_server(turn_params.listener_ifname, saddr, port, turn_params.verbose,
  1182. turn_params.listener.ioa_eng, NULL, 1, send_socket_to_general_relay);
  1183. }
  1184. }
  1185. /* Main servers */
  1186. for(i=0; i<turn_params.listener.addrs_number; i++) {
  1187. int index = turn_params.rfc5780 ? i*2 : i;
  1188. /* UDP: */
  1189. if(!turn_params.no_udp) {
  1190. turn_params.listener.udp_services[index] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(dtls_listener_relay_server_type*));
  1191. turn_params.listener.udp_services[index][0] = create_dtls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], turn_params.listener_port, turn_params.verbose,
  1192. turn_params.listener.ioa_eng, NULL, 1, send_socket_to_general_relay);
  1193. if(turn_params.rfc5780) {
  1194. turn_params.listener.udp_services[index+1] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(dtls_listener_relay_server_type*));
  1195. turn_params.listener.udp_services[index+1][0] = create_dtls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], get_alt_listener_port(), turn_params.verbose,
  1196. turn_params.listener.ioa_eng, NULL, 1, send_socket_to_general_relay);
  1197. }
  1198. } else {
  1199. turn_params.listener.udp_services[index] = NULL;
  1200. if(turn_params.rfc5780)
  1201. turn_params.listener.udp_services[index+1] = NULL;
  1202. }
  1203. if(!turn_params.no_dtls && (turn_params.no_udp || (turn_params.listener_port != turn_params.tls_listener_port))) {
  1204. turn_params.listener.dtls_services[index] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(dtls_listener_relay_server_type*));
  1205. turn_params.listener.dtls_services[index][0] = create_dtls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], turn_params.tls_listener_port, turn_params.verbose,
  1206. turn_params.listener.ioa_eng, NULL, 1, send_socket_to_general_relay);
  1207. if(turn_params.rfc5780) {
  1208. turn_params.listener.dtls_services[index+1] = (dtls_listener_relay_server_type**)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(dtls_listener_relay_server_type*));
  1209. turn_params.listener.dtls_services[index+1][0] = create_dtls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], get_alt_tls_listener_port(), turn_params.verbose,
  1210. turn_params.listener.ioa_eng, NULL, 1, send_socket_to_general_relay);
  1211. }
  1212. } else {
  1213. turn_params.listener.dtls_services[index] = NULL;
  1214. if(turn_params.rfc5780)
  1215. turn_params.listener.dtls_services[index+1] = NULL;
  1216. }
  1217. }
  1218. }
  1219. static void setup_tcp_listener_servers(ioa_engine_handle e, struct relay_server *relay_server)
  1220. {
  1221. size_t i = 0;
  1222. tls_listener_relay_server_type **tcp_services = (tls_listener_relay_server_type**)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(tls_listener_relay_server_type*)*turn_params.listener.services_number);
  1223. tls_listener_relay_server_type **tls_services = (tls_listener_relay_server_type**)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(tls_listener_relay_server_type*)*turn_params.listener.services_number);
  1224. tls_listener_relay_server_type **aux_tcp_services = (tls_listener_relay_server_type**)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(tls_listener_relay_server_type*)*turn_params.aux_servers_list.size+1);
  1225. /* Create listeners */
  1226. /* Aux TCP servers */
  1227. if(!turn_params.tcp_use_proxy && (!turn_params.no_tls || !turn_params.no_tcp)) {
  1228. for(i=0; i<turn_params.aux_servers_list.size; i++) {
  1229. ioa_addr addr;
  1230. char saddr[129];
  1231. addr_cpy(&addr,&turn_params.aux_servers_list.addrs[i]);
  1232. int port = (int)addr_get_port(&addr);
  1233. addr_to_string_no_port(&addr,(uint8_t*)saddr);
  1234. aux_tcp_services[i] = create_tls_listener_server(turn_params.listener_ifname, saddr, port, turn_params.verbose, e, send_socket_to_general_relay, relay_server);
  1235. }
  1236. }
  1237. /* Main servers */
  1238. for(i=0; i<turn_params.listener.addrs_number; i++) {
  1239. int index = turn_params.rfc5780 ? i*2 : i;
  1240. /* TCP: */
  1241. if(!turn_params.no_tcp) {
  1242. tcp_services[index] = create_tls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], turn_params.tcp_use_proxy?turn_params.tcp_proxy_port:turn_params.listener_port, turn_params.verbose, e, send_socket_to_general_relay, relay_server);
  1243. if(turn_params.rfc5780)
  1244. tcp_services[index+1] = turn_params.tcp_use_proxy?NULL:create_tls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], get_alt_listener_port(), turn_params.verbose, e, send_socket_to_general_relay, relay_server);
  1245. } else {
  1246. tcp_services[index] = NULL;
  1247. if(turn_params.rfc5780)
  1248. tcp_services[index+1] = NULL;
  1249. }
  1250. if(!turn_params.no_tls && !turn_params.tcp_use_proxy && (turn_params.no_tcp || (turn_params.listener_port != turn_params.tls_listener_port))) {
  1251. tls_services[index] = create_tls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], turn_params.tls_listener_port, turn_params.verbose, e, send_socket_to_general_relay, relay_server);
  1252. if(turn_params.rfc5780)
  1253. tls_services[index+1] = create_tls_listener_server(turn_params.listener_ifname, turn_params.listener.addrs[i], get_alt_tls_listener_port(), turn_params.verbose, e, send_socket_to_general_relay, relay_server);
  1254. } else {
  1255. tls_services[index] = NULL;
  1256. if(turn_params.rfc5780)
  1257. tls_services[index+1] = NULL;
  1258. }
  1259. }
  1260. }
  1261. static int get_alt_addr(ioa_addr *addr, ioa_addr *alt_addr)
  1262. {
  1263. if(!addr || !turn_params.rfc5780 || (turn_params.listener.addrs_number<2))
  1264. ;
  1265. else {
  1266. size_t index = 0xffff;
  1267. size_t i = 0;
  1268. int alt_port = -1;
  1269. int port = addr_get_port(addr);
  1270. if(port == turn_params.listener_port)
  1271. alt_port = get_alt_listener_port();
  1272. else if(port == get_alt_listener_port())
  1273. alt_port = turn_params.listener_port;
  1274. else if(port == turn_params.tls_listener_port)
  1275. alt_port = get_alt_tls_listener_port();
  1276. else if(port == get_alt_tls_listener_port())
  1277. alt_port = turn_params.tls_listener_port;
  1278. else
  1279. return -1;
  1280. for(i=0;i<turn_params.listener.addrs_number;i++) {
  1281. if(turn_params.listener.encaddrs && turn_params.listener.encaddrs[i]) {
  1282. if(addr->ss.sa_family == turn_params.listener.encaddrs[i]->ss.sa_family) {
  1283. index=i;
  1284. break;
  1285. }
  1286. }
  1287. }
  1288. if(index!=0xffff) {
  1289. for(i=0;i<turn_params.listener.addrs_number;i++) {
  1290. size_t ind = (index+i+1) % turn_params.listener.addrs_number;
  1291. if(turn_params.listener.encaddrs && turn_params.listener.encaddrs[ind]) {
  1292. ioa_addr *caddr = turn_params.listener.encaddrs[ind];
  1293. if(caddr->ss.sa_family == addr->ss.sa_family) {
  1294. addr_cpy(alt_addr,caddr);
  1295. addr_set_port(alt_addr, alt_port);
  1296. return 0;
  1297. }
  1298. }
  1299. }
  1300. }
  1301. }
  1302. return -1;
  1303. }
  1304. static void run_events(struct event_base *eb, ioa_engine_handle e)
  1305. {
  1306. if(!eb && e)
  1307. eb = e->event_base;
  1308. if (!eb)
  1309. return;
  1310. struct timeval timeout;
  1311. timeout.tv_sec = 5;
  1312. timeout.tv_usec = 0;
  1313. event_base_loopexit(eb, &timeout);
  1314. event_base_dispatch(eb);
  1315. #if !defined(TURN_NO_HIREDIS)
  1316. if(e)
  1317. send_message_to_redis(e->rch, "publish", "__XXX__", "__YYY__");
  1318. #endif
  1319. }
  1320. void run_listener_server(struct listener_server *ls)
  1321. {
  1322. unsigned int cycle = 0;
  1323. while (!turn_params.stop_turn_server) {
  1324. #if !defined(TURN_NO_SYSTEMD)
  1325. sd_notify (0, "READY=1");
  1326. #endif
  1327. if (eve(turn_params.verbose)) {
  1328. if ((cycle++ & 15) == 0) {
  1329. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: cycle=%u\n", __FUNCTION__, cycle);
  1330. }
  1331. }
  1332. run_events(ls->event_base, ls->ioa_eng);
  1333. rollover_logfile();
  1334. }
  1335. #if !defined(TURN_NO_SYSTEMD)
  1336. sd_notify (0, "STOPPING=1");
  1337. #endif
  1338. }
  1339. static void setup_relay_server(struct relay_server *rs, ioa_engine_handle e, int to_set_rfc5780)
  1340. {
  1341. struct bufferevent *pair[2];
  1342. if(e) {
  1343. rs->event_base = e->event_base;
  1344. rs->ioa_eng = e;
  1345. } else {
  1346. rs->event_base = turn_event_base_new();
  1347. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"IO method (general relay thread): %s\n",event_base_get_method(rs->event_base));
  1348. rs->ioa_eng = create_ioa_engine(rs->sm, rs->event_base, turn_params.listener.tp, turn_params.relay_ifname,
  1349. turn_params.relays_number, turn_params.relay_addrs, turn_params.default_relays, turn_params.verbose
  1350. #if !defined(TURN_NO_HIREDIS)
  1351. ,turn_params.redis_statsdb
  1352. #endif
  1353. );
  1354. set_ssl_ctx(rs->ioa_eng, &turn_params);
  1355. ioa_engine_set_rtcp_map(rs->ioa_eng, turn_params.listener.rtcpmap);
  1356. }
  1357. bufferevent_pair_new(rs->event_base, TURN_BUFFEREVENTS_OPTIONS, pair);
  1358. rs->in_buf = pair[0];
  1359. rs->out_buf = pair[1];
  1360. bufferevent_setcb(rs->in_buf, relay_receive_message, NULL, NULL, rs);
  1361. bufferevent_enable(rs->in_buf, EV_READ);
  1362. bufferevent_pair_new(rs->event_base, TURN_BUFFEREVENTS_OPTIONS, pair);
  1363. rs->auth_in_buf = pair[0];
  1364. rs->auth_out_buf = pair[1];
  1365. bufferevent_setcb(rs->auth_in_buf, relay_receive_auth_message, NULL, NULL, rs);
  1366. bufferevent_enable(rs->auth_in_buf, EV_READ);
  1367. init_turn_server(&(rs->server),
  1368. rs->id, turn_params.verbose,
  1369. rs->ioa_eng, turn_params.ct, 0,
  1370. turn_params.fingerprint, DONT_FRAGMENT_SUPPORTED,
  1371. start_user_check,
  1372. check_new_allocation_quota,
  1373. release_allocation_quota,
  1374. turn_params.external_ip,
  1375. &turn_params.check_origin,
  1376. &turn_params.no_tcp_relay,
  1377. &turn_params.no_udp_relay,
  1378. &turn_params.stale_nonce,
  1379. &turn_params.max_allocate_lifetime,
  1380. &turn_params.channel_lifetime,
  1381. &turn_params.permission_lifetime,
  1382. &turn_params.stun_only,
  1383. &turn_params.no_stun,
  1384. &turn_params.no_software_attribute,
  1385. &turn_params.web_admin_listen_on_workers,
  1386. &turn_params.alternate_servers_list,
  1387. &turn_params.tls_alternate_servers_list,
  1388. &turn_params.aux_servers_list,
  1389. turn_params.udp_self_balance,
  1390. &turn_params.no_multicast_peers, &turn_params.allow_loopback_peers,
  1391. &turn_params.ip_whitelist, &turn_params.ip_blacklist,
  1392. send_socket_to_relay,
  1393. &turn_params.secure_stun, &turn_params.mobility,
  1394. turn_params.server_relay,
  1395. send_turn_session_info,
  1396. send_https_socket,
  1397. allocate_bps,
  1398. turn_params.oauth,
  1399. turn_params.oauth_server_name,
  1400. turn_params.acme_redirect,
  1401. turn_params.allocation_default_address_family,
  1402. &turn_params.log_binding,
  1403. &turn_params.no_stun_backward_compatibility,
  1404. &turn_params.response_origin_only_with_rfc5780
  1405. );
  1406. if(to_set_rfc5780) {
  1407. set_rfc5780(&(rs->server), get_alt_addr, send_message_from_listener_to_client);
  1408. }
  1409. if(turn_params.net_engine_version == NEV_UDP_SOCKET_PER_THREAD) {
  1410. setup_tcp_listener_servers(rs->ioa_eng, rs);
  1411. }
  1412. }
  1413. static void *run_general_relay_thread(void *arg)
  1414. {
  1415. static int always_true = 1;
  1416. struct relay_server *rs = (struct relay_server *)arg;
  1417. int udp_reuses_the_same_relay_server = (turn_params.general_relay_servers_number<=1) || (turn_params.net_engine_version == NEV_UDP_SOCKET_PER_THREAD) || (turn_params.net_engine_version == NEV_UDP_SOCKET_PER_SESSION);
  1418. int we_need_rfc5780 = udp_reuses_the_same_relay_server && turn_params.rfc5780;
  1419. ignore_sigpipe();
  1420. setup_relay_server(rs, NULL, we_need_rfc5780);
  1421. barrier_wait();
  1422. while(always_true) {
  1423. run_events(rs->event_base, rs->ioa_eng);
  1424. }
  1425. return arg;
  1426. }
  1427. static void setup_general_relay_servers(void)
  1428. {
  1429. size_t i = 0;
  1430. for(i=0;i<get_real_general_relay_servers_number();i++) {
  1431. if(turn_params.general_relay_servers_number == 0) {
  1432. general_relay_servers[i] = (struct relay_server*)allocate_super_memory_engine(turn_params.listener.ioa_eng, sizeof(struct relay_server));
  1433. general_relay_servers[i]->id = (turnserver_id)i;
  1434. general_relay_servers[i]->sm = NULL;
  1435. setup_relay_server(general_relay_servers[i], turn_params.listener.ioa_eng, ((turn_params.net_engine_version == NEV_UDP_SOCKET_PER_THREAD) || (turn_params.net_engine_version == NEV_UDP_SOCKET_PER_SESSION)) && turn_params.rfc5780);
  1436. general_relay_servers[i]->thr = pthread_self();
  1437. } else {
  1438. super_memory_t *sm = new_super_memory_region();
  1439. general_relay_servers[i] = (struct relay_server*)allocate_super_memory_region(sm,sizeof(struct relay_server));
  1440. general_relay_servers[i]->id = (turnserver_id)i;
  1441. general_relay_servers[i]->sm = sm;
  1442. if(pthread_create(&(general_relay_servers[i]->thr), NULL, run_general_relay_thread, general_relay_servers[i])) {
  1443. perror("Cannot create relay thread\n");
  1444. exit(-1);
  1445. }
  1446. pthread_detach(general_relay_servers[i]->thr);
  1447. }
  1448. }
  1449. }
  1450. static int run_auth_server_flag = 1;
  1451. static void* run_auth_server_thread(void *arg)
  1452. {
  1453. ignore_sigpipe();
  1454. struct auth_server *as = (struct auth_server*)arg;
  1455. authserver_id id = as->id;
  1456. if(id == 0) {
  1457. reread_realms();
  1458. update_white_and_black_lists();
  1459. barrier_wait();
  1460. while(run_auth_server_flag) {
  1461. #if defined(DB_TEST)
  1462. run_db_test();
  1463. #endif
  1464. sleep(5);
  1465. reread_realms();
  1466. update_white_and_black_lists();
  1467. }
  1468. } else {
  1469. bzero(as,sizeof(struct auth_server));
  1470. as->id = id;
  1471. as->event_base = turn_event_base_new();
  1472. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"IO method (auth thread): %s\n",event_base_get_method(as->event_base));
  1473. struct bufferevent *pair[2];
  1474. bufferevent_pair_new(as->event_base, TURN_BUFFEREVENTS_OPTIONS, pair);
  1475. as->in_buf = pair[0];
  1476. as->out_buf = pair[1];
  1477. bufferevent_setcb(as->in_buf, auth_server_receive_message, NULL, NULL, as);
  1478. bufferevent_enable(as->in_buf, EV_READ);
  1479. #if !defined(TURN_NO_HIREDIS)
  1480. as->rch = get_redis_async_connection(as->event_base, turn_params.redis_statsdb, 1);
  1481. #endif
  1482. barrier_wait();
  1483. while(run_auth_server_flag) {
  1484. if (!turn_params.no_auth_pings) {
  1485. auth_ping(as->rch);
  1486. }
  1487. run_events(as->event_base,NULL);
  1488. }
  1489. }
  1490. return arg;
  1491. }
  1492. static void setup_auth_server(struct auth_server *as)
  1493. {
  1494. pthread_attr_t attr;
  1495. if(pthread_attr_init(&attr) ||
  1496. pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) ||
  1497. pthread_create(&(as->thr), &attr, run_auth_server_thread, as)) {
  1498. perror("Cannot create auth thread\n");
  1499. exit(-1);
  1500. }
  1501. }
  1502. static void* run_admin_server_thread(void *arg)
  1503. {
  1504. ignore_sigpipe();
  1505. setup_admin_thread();
  1506. barrier_wait();
  1507. while(adminserver.event_base) {
  1508. run_events(adminserver.event_base,NULL);
  1509. }
  1510. return arg;
  1511. }
  1512. static void setup_admin_server(void)
  1513. {
  1514. bzero(&adminserver,sizeof(struct admin_server));
  1515. adminserver.listen_fd = -1;
  1516. adminserver.verbose = turn_params.verbose;
  1517. if(pthread_create(&(adminserver.thr), NULL, run_admin_server_thread, &adminserver)) {
  1518. perror("Cannot create cli thread\n");
  1519. exit(-1);
  1520. }
  1521. pthread_detach(adminserver.thr);
  1522. }
  1523. void setup_server(void)
  1524. {
  1525. evthread_use_pthreads();
  1526. pthread_mutex_init(&mutex_bps, NULL);
  1527. authserver_number = 1 + (authserver_id)(turn_params.cpus / 2);
  1528. if(authserver_number < MIN_AUTHSERVER_NUMBER) authserver_number = MIN_AUTHSERVER_NUMBER;
  1529. #if !defined(TURN_NO_THREAD_BARRIERS)
  1530. /* relay threads plus auth threads plus main listener thread */
  1531. /* plus admin thread */
  1532. /* udp address listener thread(s) will start later */
  1533. barrier_count = turn_params.general_relay_servers_number+authserver_number+1+1;
  1534. #endif
  1535. setup_listener();
  1536. allocate_relay_addrs_ports();
  1537. setup_barriers();
  1538. setup_general_relay_servers();
  1539. if(turn_params.net_engine_version == NEV_UDP_SOCKET_PER_THREAD)
  1540. setup_socket_per_thread_udp_listener_servers();
  1541. else if(turn_params.net_engine_version == NEV_UDP_SOCKET_PER_ENDPOINT)
  1542. setup_socket_per_endpoint_udp_listener_servers();
  1543. else if(turn_params.net_engine_version == NEV_UDP_SOCKET_PER_SESSION)
  1544. setup_socket_per_session_udp_listener_servers();
  1545. if(turn_params.net_engine_version != NEV_UDP_SOCKET_PER_THREAD) {
  1546. setup_tcp_listener_servers(turn_params.listener.ioa_eng, NULL);
  1547. }
  1548. {
  1549. int tot = 0;
  1550. if(udp_relay_servers[0]) {
  1551. tot = get_real_udp_relay_servers_number();
  1552. }
  1553. if(tot) {
  1554. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"Total UDP servers: %d\n",(int)tot);
  1555. }
  1556. }
  1557. {
  1558. int tot = get_real_general_relay_servers_number();
  1559. if(tot) {
  1560. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"Total General servers: %d\n",(int)tot);
  1561. int i;
  1562. for(i = 0;i<tot;i++) {
  1563. if(!(general_relay_servers[i])) {
  1564. TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,"General server %d is not initialized !\n",(int)i);
  1565. }
  1566. }
  1567. }
  1568. }
  1569. {
  1570. authserver_id sn = 0;
  1571. for(sn = 0; sn < authserver_number;++sn) {
  1572. authserver[sn].id = sn;
  1573. setup_auth_server(&(authserver[sn]));
  1574. }
  1575. }
  1576. setup_admin_server();
  1577. barrier_wait();
  1578. }
  1579. void init_listener(void)
  1580. {
  1581. bzero(&turn_params.listener,sizeof(struct listener_server));
  1582. }
  1583. ///////////////////////////////