apputils.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083
  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 "ns_turn_utils.h"
  31. #include "ns_turn_msg.h"
  32. #include "apputils.h"
  33. #include <event2/event.h>
  34. #include <stdlib.h>
  35. #include <stdio.h>
  36. #include <string.h>
  37. #include <time.h>
  38. #include <unistd.h>
  39. #include <limits.h>
  40. #include <ifaddrs.h>
  41. #include <getopt.h>
  42. #include <locale.h>
  43. #include <libgen.h>
  44. #include <fcntl.h>
  45. #include <pthread.h>
  46. #include <signal.h>
  47. #include <sys/types.h>
  48. #include <sys/time.h>
  49. #include <sys/stat.h>
  50. #include <sys/resource.h>
  51. #if !defined(TURN_NO_SCTP) && defined(TURN_SCTP_INCLUDE)
  52. #include TURN_SCTP_INCLUDE
  53. #endif
  54. /************************/
  55. int IS_TURN_SERVER = 0;
  56. /*********************** Sockets *********************************/
  57. int socket_set_nonblocking(evutil_socket_t fd)
  58. {
  59. #if defined(WIN32)
  60. unsigned long nonblocking = 1;
  61. ioctlsocket(fd, FIONBIO, (unsigned long*) &nonblocking);
  62. #else
  63. if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1) {
  64. perror("O_NONBLOCK");
  65. return -1;
  66. }
  67. #endif
  68. return 0;
  69. }
  70. void read_spare_buffer(evutil_socket_t fd)
  71. {
  72. if(fd >= 0) {
  73. static char buffer[65536];
  74. recv(fd, buffer, sizeof(buffer), MSG_DONTWAIT);
  75. }
  76. }
  77. int set_sock_buf_size(evutil_socket_t fd, int sz0)
  78. {
  79. int sz;
  80. sz = sz0;
  81. while (sz > 0) {
  82. if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (const void*) (&sz), (socklen_t) sizeof(sz)) < 0) {
  83. sz = sz / 2;
  84. } else {
  85. break;
  86. }
  87. }
  88. if (sz < 1) {
  89. perror("Cannot set socket rcv size");
  90. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Cannot set rcv sock size %d on fd %d\n", sz0, fd);
  91. }
  92. sz = sz0;
  93. while (sz > 0) {
  94. if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (const void*) (&sz), (socklen_t) sizeof(sz)) < 0) {
  95. sz = sz / 2;
  96. } else {
  97. break;
  98. }
  99. }
  100. if (sz < 1) {
  101. perror("Cannot set socket snd size");
  102. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Cannot set snd sock size %d on fd %d\n", sz0, fd);
  103. }
  104. return 0;
  105. }
  106. int socket_tcp_set_keepalive(evutil_socket_t fd,SOCKET_TYPE st)
  107. {
  108. UNUSED_ARG(st);
  109. #ifdef SO_KEEPALIVE
  110. /* Set the keepalive option active */
  111. {
  112. int on = 1;
  113. setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (const void*)&on, (socklen_t) sizeof(on));
  114. }
  115. #else
  116. UNUSED_ARG(fd);
  117. #endif
  118. #ifdef SO_NOSIGPIPE
  119. {
  120. int on = 1;
  121. setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, (const void*)&on, (socklen_t) sizeof(on));
  122. }
  123. #endif
  124. return 0;
  125. }
  126. int socket_set_reusable(evutil_socket_t fd, int flag, SOCKET_TYPE st)
  127. {
  128. UNUSED_ARG(st);
  129. if (fd < 0)
  130. return -1;
  131. else {
  132. #if defined(WIN32)
  133. int use_reuseaddr = IS_TURN_SERVER;
  134. #else
  135. int use_reuseaddr = 1;
  136. #endif
  137. #if defined(SO_REUSEADDR)
  138. if (use_reuseaddr) {
  139. int on = flag;
  140. int ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void*) &on, (socklen_t) sizeof(on));
  141. if (ret < 0)
  142. perror("SO_REUSEADDR");
  143. }
  144. #endif
  145. #if !defined(TURN_NO_SCTP)
  146. #if defined(SCTP_REUSE_PORT)
  147. if (use_reuseaddr) {
  148. if(is_sctp_socket(st)) {
  149. int on = flag;
  150. int ret = setsockopt(fd, IPPROTO_SCTP, SCTP_REUSE_PORT, (const void*) &on, (socklen_t) sizeof(on));
  151. if (ret < 0)
  152. perror("SCTP_REUSE_PORT");
  153. }
  154. }
  155. #endif
  156. #endif
  157. #if defined(SO_REUSEPORT)
  158. if (use_reuseaddr) {
  159. int on = flag;
  160. setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, (const void*) &on, (socklen_t) sizeof(on));
  161. }
  162. #endif
  163. return 0;
  164. }
  165. }
  166. int sock_bind_to_device(evutil_socket_t fd, const unsigned char* ifname) {
  167. if (fd >= 0 && ifname && ifname[0]) {
  168. #if defined(SO_BINDTODEVICE)
  169. struct ifreq ifr;
  170. memset(&ifr, 0, sizeof(ifr));
  171. strncpy(ifr.ifr_name, (const char*) ifname, sizeof(ifr.ifr_name));
  172. if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, (void *) &ifr, sizeof(ifr)) < 0) {
  173. if (errno == EPERM)
  174. perror("You must obtain superuser privileges to bind a socket to device");
  175. else
  176. perror("Cannot bind socket to device");
  177. return -1;
  178. }
  179. return 0;
  180. #endif
  181. }
  182. return 0;
  183. }
  184. int addr_connect(evutil_socket_t fd, const ioa_addr* addr, int *out_errno)
  185. {
  186. if (!addr || fd < 0)
  187. return -1;
  188. else {
  189. int err = 0;
  190. do {
  191. if (addr->ss.sa_family == AF_INET) {
  192. err = connect(fd, (const struct sockaddr *) addr, sizeof(struct sockaddr_in));
  193. } else if (addr->ss.sa_family == AF_INET6) {
  194. err = connect(fd, (const struct sockaddr *) addr, sizeof(struct sockaddr_in6));
  195. } else {
  196. return -1;
  197. }
  198. } while (err < 0 && errno == EINTR);
  199. if(out_errno)
  200. *out_errno = errno;
  201. if (err < 0 && errno != EINPROGRESS)
  202. perror("Connect");
  203. return err;
  204. }
  205. }
  206. int addr_bind(evutil_socket_t fd, const ioa_addr* addr, int reusable, int debug, SOCKET_TYPE st)
  207. {
  208. if (!addr || fd < 0) {
  209. return -1;
  210. } else {
  211. int ret = -1;
  212. socket_set_reusable(fd, reusable, st);
  213. if (addr->ss.sa_family == AF_INET) {
  214. do {
  215. ret = bind(fd, (const struct sockaddr *) addr, sizeof(struct sockaddr_in));
  216. } while (ret < 0 && errno == EINTR);
  217. } else if (addr->ss.sa_family == AF_INET6) {
  218. const int off = 0;
  219. setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (const char *) &off, sizeof(off));
  220. do {
  221. ret = bind(fd, (const struct sockaddr *) addr, sizeof(struct sockaddr_in6));
  222. } while (ret < 0 && errno == EINTR);
  223. } else {
  224. return -1;
  225. }
  226. if(ret<0) {
  227. if(debug) {
  228. int err = errno;
  229. perror("bind");
  230. char str[129];
  231. addr_to_string(addr,(uint8_t*)str);
  232. TURN_LOG_FUNC(TURN_LOG_LEVEL_WARNING, "Trying to bind fd %d to <%s>: errno=%d\n", fd, str, err);
  233. }
  234. }
  235. return ret;
  236. }
  237. }
  238. int addr_get_from_sock(evutil_socket_t fd, ioa_addr *addr)
  239. {
  240. if (fd < 0 || !addr)
  241. return -1;
  242. else {
  243. ioa_addr a;
  244. a.ss.sa_family = AF_INET6;
  245. socklen_t socklen = get_ioa_addr_len(&a);
  246. if (getsockname(fd, (struct sockaddr*) &a, &socklen) < 0) {
  247. a.ss.sa_family = AF_INET;
  248. socklen = get_ioa_addr_len(&a);
  249. if (getsockname(fd, (struct sockaddr*) &a, &socklen) < 0) {
  250. return -1;
  251. }
  252. }
  253. addr_cpy(addr, &a);
  254. return 0;
  255. }
  256. }
  257. int get_raw_socket_ttl(evutil_socket_t fd, int family)
  258. {
  259. int ttl = 0;
  260. if(family == AF_INET6) {
  261. #if !defined(IPV6_UNICAST_HOPS)
  262. UNUSED_ARG(fd);
  263. do { return TTL_IGNORE; } while(0);
  264. #else
  265. socklen_t slen = (socklen_t)sizeof(ttl);
  266. if(getsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl,&slen)<0) {
  267. perror("get HOPLIMIT on socket");
  268. return TTL_IGNORE;
  269. }
  270. #endif
  271. } else {
  272. #if !defined(IP_TTL)
  273. UNUSED_ARG(fd);
  274. do { return TTL_IGNORE; } while(0);
  275. #else
  276. socklen_t slen = (socklen_t)sizeof(ttl);
  277. if(getsockopt(fd, IPPROTO_IP, IP_TTL, &ttl,&slen)<0) {
  278. perror("get TTL on socket");
  279. return TTL_IGNORE;
  280. }
  281. #endif
  282. }
  283. CORRECT_RAW_TTL(ttl);
  284. return ttl;
  285. }
  286. int get_raw_socket_tos(evutil_socket_t fd, int family)
  287. {
  288. int tos = 0;
  289. if(family == AF_INET6) {
  290. #if !defined(IPV6_TCLASS)
  291. UNUSED_ARG(fd);
  292. do { return TOS_IGNORE; } while(0);
  293. #else
  294. socklen_t slen = (socklen_t)sizeof(tos);
  295. if(getsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &tos,&slen)<0) {
  296. perror("get TCLASS on socket");
  297. return -1;
  298. }
  299. #endif
  300. } else {
  301. #if !defined(IP_TOS)
  302. UNUSED_ARG(fd);
  303. do { return TOS_IGNORE; } while(0);
  304. #else
  305. socklen_t slen = (socklen_t)sizeof(tos);
  306. if(getsockopt(fd, IPPROTO_IP, IP_TOS, &tos,&slen)<0) {
  307. perror("get TOS on socket");
  308. return -1;
  309. }
  310. #endif
  311. }
  312. CORRECT_RAW_TOS(tos);
  313. return tos;
  314. }
  315. int set_raw_socket_ttl(evutil_socket_t fd, int family, int ttl)
  316. {
  317. if(family == AF_INET6) {
  318. #if !defined(IPV6_UNICAST_HOPS)
  319. UNUSED_ARG(fd);
  320. UNUSED_ARG(ttl);
  321. #else
  322. CORRECT_RAW_TTL(ttl);
  323. if(setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl,sizeof(ttl))<0) {
  324. perror("set HOPLIMIT on socket");
  325. return -1;
  326. }
  327. #endif
  328. } else {
  329. #if !defined(IP_TTL)
  330. UNUSED_ARG(fd);
  331. UNUSED_ARG(ttl);
  332. #else
  333. CORRECT_RAW_TTL(ttl);
  334. if(setsockopt(fd, IPPROTO_IP, IP_TTL, &ttl,sizeof(ttl))<0) {
  335. perror("set TTL on socket");
  336. return -1;
  337. }
  338. #endif
  339. }
  340. return 0;
  341. }
  342. int set_raw_socket_tos(evutil_socket_t fd, int family, int tos)
  343. {
  344. if(family == AF_INET6) {
  345. #if !defined(IPV6_TCLASS)
  346. UNUSED_ARG(fd);
  347. UNUSED_ARG(tos);
  348. #else
  349. CORRECT_RAW_TOS(tos);
  350. if(setsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &tos,sizeof(tos))<0) {
  351. perror("set TCLASS on socket");
  352. return -1;
  353. }
  354. #endif
  355. } else {
  356. #if !defined(IP_TOS)
  357. UNUSED_ARG(fd);
  358. UNUSED_ARG(tos);
  359. #else
  360. if(setsockopt(fd, IPPROTO_IP, IP_TOS, &tos,sizeof(tos))<0) {
  361. perror("set TOS on socket");
  362. return -1;
  363. }
  364. #endif
  365. }
  366. return 0;
  367. }
  368. int is_stream_socket(int st) {
  369. switch(st) {
  370. case TCP_SOCKET:
  371. case TLS_SOCKET:
  372. case TENTATIVE_TCP_SOCKET:
  373. case SCTP_SOCKET:
  374. case TLS_SCTP_SOCKET:
  375. case TENTATIVE_SCTP_SOCKET:
  376. return 1;
  377. default:
  378. ;
  379. }
  380. return 0;
  381. }
  382. int is_tcp_socket(int st) {
  383. switch(st) {
  384. case TCP_SOCKET:
  385. case TLS_SOCKET:
  386. case TENTATIVE_TCP_SOCKET:
  387. return 1;
  388. default:
  389. ;
  390. }
  391. return 0;
  392. }
  393. int is_sctp_socket(int st) {
  394. switch(st) {
  395. case SCTP_SOCKET:
  396. case TLS_SCTP_SOCKET:
  397. case TENTATIVE_SCTP_SOCKET:
  398. return 1;
  399. default:
  400. ;
  401. }
  402. return 0;
  403. }
  404. const char* socket_type_name(SOCKET_TYPE st)
  405. {
  406. switch(st) {
  407. case TCP_SOCKET:
  408. return "TCP";
  409. case SCTP_SOCKET:
  410. return "SCTP";
  411. case UDP_SOCKET:
  412. return "UDP";
  413. case TLS_SOCKET:
  414. return "TLS/TCP";
  415. case TLS_SCTP_SOCKET:
  416. return "TLS/SCTP";
  417. case DTLS_SOCKET:
  418. return "DTLS";
  419. case TENTATIVE_TCP_SOCKET:
  420. return "TLS/TCP ?";
  421. case TENTATIVE_SCTP_SOCKET:
  422. return "TLS/SCTP ?";
  423. default:
  424. ;
  425. };
  426. return "UNKNOWN";
  427. }
  428. /////////////////// MTU /////////////////////////////////////////
  429. int set_socket_df(evutil_socket_t fd, int family, int value)
  430. {
  431. int ret=0;
  432. #if defined(IP_DONTFRAG) && defined(IPPROTO_IP) //BSD
  433. {
  434. const int val=value;
  435. /* kernel sets DF bit on outgoing IP packets */
  436. if(family==AF_INET) {
  437. ret = setsockopt(fd, IPPROTO_IP, IP_DONTFRAG, &val, sizeof(val));
  438. } else {
  439. #if defined(IPV6_DONTFRAG) && defined(IPPROTO_IPV6)
  440. ret = setsockopt(fd, IPPROTO_IPV6, IPV6_DONTFRAG, &val, sizeof(val));
  441. #else
  442. #error CANNOT SET IPV6 SOCKET DF FLAG (1)
  443. #endif
  444. }
  445. if(ret<0) {
  446. int err=errno;
  447. perror("set socket df:");
  448. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"%s: set sockopt failed: fd=%d, err=%d, family=%d\n",__FUNCTION__,fd,err,family);
  449. }
  450. }
  451. #elif defined(IPPROTO_IP) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO) && defined(IP_PMTUDISC_DONT) //LINUX
  452. {
  453. /* kernel sets DF bit on outgoing IP packets */
  454. if(family==AF_INET) {
  455. int val=IP_PMTUDISC_DO;
  456. if(!value) val=IP_PMTUDISC_DONT;
  457. ret = setsockopt(fd, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val));
  458. } else {
  459. #if defined(IPPROTO_IPV6) && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO) && defined(IPV6_PMTUDISC_DONT)
  460. int val=IPV6_PMTUDISC_DO;
  461. if(!value) val=IPV6_PMTUDISC_DONT;
  462. ret = setsockopt(fd, IPPROTO_IPV6, IPV6_MTU_DISCOVER, &val, sizeof(val));
  463. #else
  464. #error CANNOT SET IPV6 SOCKET DF FLAG (2)
  465. #endif
  466. }
  467. if(ret<0) {
  468. perror("set DF");
  469. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"%s: set sockopt failed\n",__FUNCTION__);
  470. }
  471. }
  472. #else
  473. //CANNOT SET SOCKET DF FLAG (3) : UNKNOWN PLATFORM
  474. UNUSED_ARG(fd);
  475. UNUSED_ARG(family);
  476. UNUSED_ARG(value);
  477. #endif
  478. return ret;
  479. }
  480. static int get_mtu_from_ssl(SSL* ssl)
  481. {
  482. int ret = SOSO_MTU;
  483. #if DTLS_SUPPORTED
  484. if(ssl)
  485. ret = BIO_ctrl(SSL_get_wbio(ssl), BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);
  486. #else
  487. UNUSED_ARG(ssl);
  488. #endif
  489. return ret;
  490. }
  491. static void set_query_mtu(SSL* ssl) {
  492. if(ssl) {
  493. #if defined(SSL_OP_NO_QUERY_MTU)
  494. SSL_set_options(ssl, SSL_OP_NO_QUERY_MTU);
  495. #else
  496. ;
  497. #endif
  498. }
  499. }
  500. int decrease_mtu(SSL* ssl, int mtu, int verbose)
  501. {
  502. if (!ssl)
  503. return mtu;
  504. int new_mtu = get_mtu_from_ssl(ssl);
  505. if (new_mtu < 1)
  506. new_mtu = mtu;
  507. if (new_mtu > MAX_MTU)
  508. mtu = MAX_MTU;
  509. if (new_mtu > 0 && new_mtu < MIN_MTU)
  510. mtu = MIN_MTU;
  511. else if (new_mtu < mtu)
  512. mtu = new_mtu;
  513. else
  514. mtu -= MTU_STEP;
  515. if (mtu < MIN_MTU)
  516. mtu = MIN_MTU;
  517. set_query_mtu(ssl);
  518. if (verbose)
  519. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "1. mtu to use: %d\n", mtu);
  520. #if DTLS_SUPPORTED
  521. SSL_set_mtu(ssl,mtu);
  522. BIO_ctrl(SSL_get_wbio(ssl), BIO_CTRL_DGRAM_SET_MTU, mtu, NULL);
  523. #endif
  524. return mtu;
  525. }
  526. int set_mtu_df(SSL* ssl, evutil_socket_t fd, int family, int mtu, int df_value, int verbose) {
  527. if(!ssl || fd<0) return 0;
  528. int ret=set_socket_df(fd, family, df_value);
  529. if(!mtu) mtu=SOSO_MTU;
  530. else if(mtu<MIN_MTU) mtu=MIN_MTU;
  531. else if(mtu>MAX_MTU) mtu=MAX_MTU;
  532. set_query_mtu(ssl);
  533. if(verbose) TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"3. mtu to use: %d\n",mtu);
  534. #if DTLS_SUPPORTED
  535. SSL_set_mtu(ssl,mtu);
  536. BIO_ctrl(SSL_get_wbio(ssl), BIO_CTRL_DGRAM_SET_MTU, mtu, NULL);
  537. #endif
  538. if(verbose) TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"4. new mtu: %d\n",get_mtu_from_ssl(ssl));
  539. return ret;
  540. }
  541. int get_socket_mtu(evutil_socket_t fd, int family, int verbose)
  542. {
  543. int ret = 0;
  544. UNUSED_ARG(fd);
  545. UNUSED_ARG(family);
  546. UNUSED_ARG(verbose);
  547. #if defined(IP_MTU)
  548. int val = 0;
  549. socklen_t slen=sizeof(val);
  550. if(family==AF_INET) {
  551. ret = getsockopt(fd, IPPROTO_IP, IP_MTU, &val, &slen);
  552. } else {
  553. #if defined(IPPROTO_IPV6) && defined(IPV6_MTU)
  554. ret = getsockopt(fd, IPPROTO_IPV6, IPV6_MTU, &val, &slen);
  555. #endif
  556. ;
  557. }
  558. ret = val;
  559. #endif
  560. if (verbose)
  561. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: final=%d\n", __FUNCTION__, ret);
  562. return ret;
  563. }
  564. //////////////////// socket error handle ////////////////////
  565. int handle_socket_error() {
  566. switch (errno) {
  567. case EINTR:
  568. /* Interrupted system call.
  569. * Just ignore.
  570. */
  571. return 1;
  572. case ENOBUFS:
  573. /* No buffers, temporary condition.
  574. * Just ignore and try later.
  575. */
  576. return 1;
  577. case EAGAIN:
  578. #if defined(EWOULDBLOCK)
  579. #if (EWOULDBLOCK != EAGAIN)
  580. case EWOULDBLOCK:
  581. #endif
  582. #endif
  583. return 1;
  584. case EMSGSIZE:
  585. return 1;
  586. case EBADF:
  587. /* Invalid socket.
  588. * Must close connection.
  589. */
  590. return 0;
  591. case EHOSTDOWN:
  592. /* Host is down.
  593. * Just ignore, might be an attacker
  594. * sending fake ICMP messages.
  595. */
  596. return 1;
  597. case ECONNRESET:
  598. case ECONNREFUSED:
  599. /* Connection reset by peer. */
  600. return 0;
  601. case ENOMEM:
  602. /* Out of memory.
  603. * Must close connection.
  604. */
  605. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"Out of memory!\n");
  606. return 0;
  607. case EACCES:
  608. /* Permission denied.
  609. * Just ignore, we might be blocked
  610. * by some firewall policy. Try again
  611. * and hope for the best.
  612. */
  613. return 1;
  614. default:
  615. /* Something unexpected happened */
  616. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"Unexpected error! (errno = %d)\n", errno);
  617. return 0;
  618. }
  619. }
  620. //////////////////// Misc utils //////////////////////////////
  621. char *skip_blanks(char* s)
  622. {
  623. while(*s==' ' || *s=='\t' || *s=='\n')
  624. ++s;
  625. return s;
  626. }
  627. //////////////////// Config file search //////////////////////
  628. #define Q(x) #x
  629. #define QUOTE(x) Q(x)
  630. #define ETCDIR INSTALL_PREFIX/etc/
  631. #define QETCDIR QUOTE(ETCDIR)
  632. #define ETCDIR1 INSTALL_PREFIX/etc/turnserver/
  633. #define QETCDIR1 QUOTE(ETCDIR1)
  634. #define ETCDIR2 INSTALL_PREFIX/etc/coturn/
  635. #define QETCDIR2 QUOTE(ETCDIR2)
  636. static const char *config_file_search_dirs[] = {"./", "./turnserver/", "./coturn/", "./etc/", "./etc/turnserver/", "./etc/coturn/", "../etc/", "../etc/turnserver/", "../etc/coturn/", "/etc/", "/etc/turnserver/", "/etc/coturn/", "/usr/local/etc/", "/usr/local/etc/turnserver/", "/usr/local/etc/coturn/", QETCDIR, QETCDIR1, QETCDIR2, NULL };
  637. static char *c_execdir=NULL;
  638. void set_execdir(void)
  639. {
  640. /* On some systems, this may give us the execution path */
  641. char *_var = getenv("_");
  642. if(_var && *_var) {
  643. _var = strdup(_var);
  644. char *edir=_var;
  645. if(edir[0]!='.')
  646. edir = strstr(edir,"/");
  647. if(edir && *edir)
  648. edir = dirname(edir);
  649. else
  650. edir = dirname(_var);
  651. if(c_execdir)
  652. free(c_execdir);
  653. c_execdir = strdup(edir);
  654. free(_var);
  655. }
  656. }
  657. void print_abs_file_name(const char *msg1, const char *msg2, const char *fn)
  658. {
  659. char absfn[1025];
  660. absfn[0]=0;
  661. if(fn) {
  662. while(fn[0] && fn[0]==' ') ++fn;
  663. if(fn[0]) {
  664. if(fn[0]=='/') {
  665. STRCPY(absfn,fn);
  666. } else {
  667. if(fn[0]=='.' && fn[1]=='/')
  668. fn+=2;
  669. if(!getcwd(absfn,sizeof(absfn)-1))
  670. absfn[0]=0;
  671. size_t blen=strlen(absfn);
  672. if(blen<sizeof(absfn)-1) {
  673. strncpy(absfn+blen,"/",sizeof(absfn)-blen);
  674. strncpy(absfn+blen+1,fn,sizeof(absfn)-blen-1);
  675. } else {
  676. STRCPY(absfn,fn);
  677. }
  678. absfn[sizeof(absfn)-1]=0;
  679. }
  680. }
  681. }
  682. if(absfn[0]) {
  683. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s%s file found: %s\n", msg1, msg2, absfn);
  684. }
  685. }
  686. char* find_config_file(const char *config_file, int print_file_name)
  687. {
  688. char *full_path_to_config_file = NULL;
  689. if (config_file && config_file[0]) {
  690. if ((config_file[0] == '/')||(config_file[0] == '~')) {
  691. FILE *f = fopen(config_file, "r");
  692. if (f) {
  693. fclose(f);
  694. full_path_to_config_file = strdup(config_file);
  695. }
  696. } else {
  697. int i = 0;
  698. size_t cflen = strlen(config_file);
  699. while (config_file_search_dirs[i]) {
  700. size_t dirlen = strlen(config_file_search_dirs[i]);
  701. size_t fnsz = sizeof(char) * (dirlen + cflen + 10);
  702. char *fn = (char*)malloc(fnsz+1);
  703. strncpy(fn, config_file_search_dirs[i], fnsz);
  704. strncpy(fn + dirlen, config_file, fnsz-dirlen);
  705. fn[fnsz]=0;
  706. FILE *f = fopen(fn, "r");
  707. if (f) {
  708. fclose(f);
  709. if (print_file_name)
  710. print_abs_file_name("","Config",fn);
  711. full_path_to_config_file = fn;
  712. break;
  713. }
  714. free(fn);
  715. if(config_file_search_dirs[i][0]!='/' &&
  716. config_file_search_dirs[i][0]!='.' &&
  717. c_execdir && c_execdir[0]) {
  718. size_t celen = strlen(c_execdir);
  719. fnsz = sizeof(char) * (dirlen + cflen + celen + 10);
  720. fn = (char*)malloc(fnsz+1);
  721. strncpy(fn,c_execdir,fnsz);
  722. size_t fnlen=strlen(fn);
  723. if(fnlen<fnsz) {
  724. strncpy(fn+fnlen,"/",fnsz-fnlen);
  725. fnlen=strlen(fn);
  726. if(fnlen<fnsz) {
  727. strncpy(fn+fnlen, config_file_search_dirs[i], fnsz-fnlen);
  728. fnlen=strlen(fn);
  729. if(fnlen<fnsz) {
  730. strncpy(fn+fnlen, config_file, fnsz-fnlen);
  731. }
  732. }
  733. }
  734. fn[fnsz]=0;
  735. if(strstr(fn,"//")!=fn) {
  736. f = fopen(fn, "r");
  737. if (f) {
  738. fclose(f);
  739. if (print_file_name)
  740. print_abs_file_name("","Config",fn);
  741. full_path_to_config_file = fn;
  742. break;
  743. }
  744. }
  745. free(fn);
  746. }
  747. ++i;
  748. }
  749. }
  750. if(!full_path_to_config_file) {
  751. if(strstr(config_file,"etc/")==config_file) {
  752. return find_config_file(config_file+4, print_file_name);
  753. }
  754. }
  755. }
  756. return full_path_to_config_file;
  757. }
  758. /////////////////// SYS SETTINGS ///////////////////////
  759. void ignore_sigpipe(void)
  760. {
  761. /* Ignore SIGPIPE from TCP sockets */
  762. if(signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
  763. perror("Cannot set SIGPIPE handler");
  764. }
  765. }
  766. static uint64_t turn_getRandTime(void) {
  767. struct timespec tp={0,0};
  768. #if defined(CLOCK_REALTIME)
  769. clock_gettime(CLOCK_REALTIME, &tp);
  770. #else
  771. tp.tv_sec = time(NULL);
  772. #endif
  773. uint64_t current_time = (uint64_t)(tp.tv_sec);
  774. uint64_t current_mstime = (uint64_t)(current_time + (tp.tv_nsec));
  775. return current_mstime;
  776. }
  777. unsigned long set_system_parameters(int max_resources)
  778. {
  779. srandom((unsigned int) (turn_getRandTime() + (unsigned int)((long)(&turn_getRandTime))));
  780. setlocale(LC_ALL, "C");
  781. build_base64_decoding_table();
  782. ignore_sigpipe();
  783. if(max_resources) {
  784. struct rlimit rlim;
  785. if(getrlimit(RLIMIT_NOFILE, &rlim)<0) {
  786. perror("Cannot get system limit");
  787. } else {
  788. rlim.rlim_cur = rlim.rlim_max;
  789. while((setrlimit(RLIMIT_NOFILE, &rlim)<0) && (rlim.rlim_cur>0)) {
  790. rlim.rlim_cur = rlim.rlim_cur>>1;
  791. }
  792. return (unsigned long)rlim.rlim_cur;
  793. }
  794. }
  795. return 0;
  796. }
  797. ////////////////////// Base 64 ////////////////////////////
  798. static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
  799. 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
  800. 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
  801. 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
  802. 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
  803. 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
  804. 'w', 'x', 'y', 'z', '0', '1', '2', '3',
  805. '4', '5', '6', '7', '8', '9', '+', '/'};
  806. static char *decoding_table = NULL;
  807. static size_t mod_table[] = {0, 2, 1};
  808. char *base64_encode(const unsigned char *data,
  809. size_t input_length,
  810. size_t *output_length) {
  811. *output_length = 4 * ((input_length + 2) / 3);
  812. char *encoded_data = (char*)malloc(*output_length+1);
  813. if (encoded_data == NULL) return NULL;
  814. size_t i,j;
  815. for (i = 0, j = 0; i < input_length;) {
  816. uint32_t octet_a = i < input_length ? data[i++] : 0;
  817. uint32_t octet_b = i < input_length ? data[i++] : 0;
  818. uint32_t octet_c = i < input_length ? data[i++] : 0;
  819. uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;
  820. encoded_data[j++] = encoding_table[(triple >> 3 * 6) & 0x3F];
  821. encoded_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F];
  822. encoded_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F];
  823. encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F];
  824. }
  825. for (i = 0; i < mod_table[input_length % 3]; i++)
  826. encoded_data[*output_length - 1 - i] = '=';
  827. encoded_data[*output_length]=0;
  828. return encoded_data;
  829. }
  830. void build_base64_decoding_table() {
  831. decoding_table = (char*)malloc(256);
  832. bzero(decoding_table,256);
  833. int i;
  834. for (i = 0; i < 64; i++)
  835. decoding_table[(unsigned char) encoding_table[i]] = (char)i;
  836. }
  837. unsigned char *base64_decode(const char *data,
  838. size_t input_length,
  839. size_t *output_length) {
  840. if (decoding_table == NULL) build_base64_decoding_table();
  841. if (input_length % 4 != 0) return NULL;
  842. *output_length = input_length / 4 * 3;
  843. if (data[input_length - 1] == '=') (*output_length)--;
  844. if (data[input_length - 2] == '=') (*output_length)--;
  845. unsigned char *decoded_data = (unsigned char*)malloc(*output_length);
  846. if (decoded_data == NULL) return NULL;
  847. int i;
  848. size_t j;
  849. for (i = 0, j = 0; i < (int)input_length;) {
  850. uint32_t sextet_a =
  851. data[i] == '=' ? 0 & i++ : decoding_table[(int)data[i++]];
  852. uint32_t sextet_b =
  853. data[i] == '=' ? 0 & i++ : decoding_table[(int)data[i++]];
  854. uint32_t sextet_c =
  855. data[i] == '=' ? 0 & i++ : decoding_table[(int)data[i++]];
  856. uint32_t sextet_d =
  857. data[i] == '=' ? 0 & i++ : decoding_table[(int)data[i++]];
  858. uint32_t triple = (sextet_a << 3 * 6) + (sextet_b << 2 * 6)
  859. + (sextet_c << 1 * 6) + (sextet_d << 0 * 6);
  860. if (j < *output_length)
  861. decoded_data[j++] = (triple >> 2 * 8) & 0xFF;
  862. if (j < *output_length)
  863. decoded_data[j++] = (triple >> 1 * 8) & 0xFF;
  864. if (j < *output_length)
  865. decoded_data[j++] = (triple >> 0 * 8) & 0xFF;
  866. }
  867. return decoded_data;
  868. }
  869. ////////////////// SSL /////////////////////
  870. const char* turn_get_ssl_method(SSL *ssl, const char* mdefault)
  871. {
  872. const char* ret = "unknown";
  873. if(!ssl) {
  874. ret = mdefault;
  875. } else {
  876. ret = SSL_get_version(ssl);
  877. }
  878. return ret;
  879. }
  880. //////////// EVENT BASE ///////////////
  881. struct event_base *turn_event_base_new(void)
  882. {
  883. struct event_config *cfg = event_config_new();
  884. event_config_set_flag(cfg,EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST);
  885. return event_base_new_with_config(cfg);
  886. }
  887. /////////// OAUTH /////////////////
  888. void convert_oauth_key_data_raw(const oauth_key_data_raw *raw, oauth_key_data *oakd)
  889. {
  890. if(raw && oakd) {
  891. bzero(oakd,sizeof(oauth_key_data));
  892. oakd->timestamp = (turn_time_t)raw->timestamp;
  893. oakd->lifetime = raw->lifetime;
  894. bcopy(raw->as_rs_alg,oakd->as_rs_alg,sizeof(oakd->as_rs_alg));
  895. bcopy(raw->kid,oakd->kid,sizeof(oakd->kid));
  896. if(raw->ikm_key[0]) {
  897. size_t ikm_key_size = 0;
  898. char *ikm_key = (char*)base64_decode(raw->ikm_key,strlen(raw->ikm_key),&ikm_key_size);
  899. if(ikm_key) {
  900. bcopy(ikm_key,oakd->ikm_key,ikm_key_size);
  901. oakd->ikm_key_size = ikm_key_size;
  902. free(ikm_key);
  903. }
  904. }
  905. }
  906. }
  907. //////////////////////////////////////////////////////////////