apputils.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084
  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 TCP_SOCKET_PROXY:
  372. case TLS_SOCKET:
  373. case TENTATIVE_TCP_SOCKET:
  374. case SCTP_SOCKET:
  375. case TLS_SCTP_SOCKET:
  376. case TENTATIVE_SCTP_SOCKET:
  377. return 1;
  378. default:
  379. ;
  380. }
  381. return 0;
  382. }
  383. int is_tcp_socket(int st) {
  384. switch(st) {
  385. case TCP_SOCKET:
  386. case TLS_SOCKET:
  387. case TENTATIVE_TCP_SOCKET:
  388. return 1;
  389. default:
  390. ;
  391. }
  392. return 0;
  393. }
  394. int is_sctp_socket(int st) {
  395. switch(st) {
  396. case SCTP_SOCKET:
  397. case TLS_SCTP_SOCKET:
  398. case TENTATIVE_SCTP_SOCKET:
  399. return 1;
  400. default:
  401. ;
  402. }
  403. return 0;
  404. }
  405. const char* socket_type_name(SOCKET_TYPE st)
  406. {
  407. switch(st) {
  408. case TCP_SOCKET:
  409. return "TCP";
  410. case SCTP_SOCKET:
  411. return "SCTP";
  412. case UDP_SOCKET:
  413. return "UDP";
  414. case TLS_SOCKET:
  415. return "TLS/TCP";
  416. case TLS_SCTP_SOCKET:
  417. return "TLS/SCTP";
  418. case DTLS_SOCKET:
  419. return "DTLS";
  420. case TENTATIVE_TCP_SOCKET:
  421. return "TLS/TCP ?";
  422. case TENTATIVE_SCTP_SOCKET:
  423. return "TLS/SCTP ?";
  424. default:
  425. ;
  426. };
  427. return "UNKNOWN";
  428. }
  429. /////////////////// MTU /////////////////////////////////////////
  430. int set_socket_df(evutil_socket_t fd, int family, int value)
  431. {
  432. int ret=0;
  433. #if defined(IP_DONTFRAG) && defined(IPPROTO_IP) //BSD
  434. {
  435. const int val=value;
  436. /* kernel sets DF bit on outgoing IP packets */
  437. if(family==AF_INET) {
  438. ret = setsockopt(fd, IPPROTO_IP, IP_DONTFRAG, &val, sizeof(val));
  439. } else {
  440. #if defined(IPV6_DONTFRAG) && defined(IPPROTO_IPV6)
  441. ret = setsockopt(fd, IPPROTO_IPV6, IPV6_DONTFRAG, &val, sizeof(val));
  442. #else
  443. #error CANNOT SET IPV6 SOCKET DF FLAG (1)
  444. #endif
  445. }
  446. if(ret<0) {
  447. int err=errno;
  448. perror("set socket df:");
  449. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"%s: set sockopt failed: fd=%d, err=%d, family=%d\n",__FUNCTION__,fd,err,family);
  450. }
  451. }
  452. #elif defined(IPPROTO_IP) && defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO) && defined(IP_PMTUDISC_DONT) //LINUX
  453. {
  454. /* kernel sets DF bit on outgoing IP packets */
  455. if(family==AF_INET) {
  456. int val=IP_PMTUDISC_DO;
  457. if(!value) val=IP_PMTUDISC_DONT;
  458. ret = setsockopt(fd, IPPROTO_IP, IP_MTU_DISCOVER, &val, sizeof(val));
  459. } else {
  460. #if defined(IPPROTO_IPV6) && defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO) && defined(IPV6_PMTUDISC_DONT)
  461. int val=IPV6_PMTUDISC_DO;
  462. if(!value) val=IPV6_PMTUDISC_DONT;
  463. ret = setsockopt(fd, IPPROTO_IPV6, IPV6_MTU_DISCOVER, &val, sizeof(val));
  464. #else
  465. #error CANNOT SET IPV6 SOCKET DF FLAG (2)
  466. #endif
  467. }
  468. if(ret<0) {
  469. perror("set DF");
  470. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"%s: set sockopt failed\n",__FUNCTION__);
  471. }
  472. }
  473. #else
  474. //CANNOT SET SOCKET DF FLAG (3) : UNKNOWN PLATFORM
  475. UNUSED_ARG(fd);
  476. UNUSED_ARG(family);
  477. UNUSED_ARG(value);
  478. #endif
  479. return ret;
  480. }
  481. static int get_mtu_from_ssl(SSL* ssl)
  482. {
  483. int ret = SOSO_MTU;
  484. #if DTLS_SUPPORTED
  485. if(ssl)
  486. ret = BIO_ctrl(SSL_get_wbio(ssl), BIO_CTRL_DGRAM_QUERY_MTU, 0, NULL);
  487. #else
  488. UNUSED_ARG(ssl);
  489. #endif
  490. return ret;
  491. }
  492. static void set_query_mtu(SSL* ssl) {
  493. if(ssl) {
  494. #if defined(SSL_OP_NO_QUERY_MTU)
  495. SSL_set_options(ssl, SSL_OP_NO_QUERY_MTU);
  496. #else
  497. ;
  498. #endif
  499. }
  500. }
  501. int decrease_mtu(SSL* ssl, int mtu, int verbose)
  502. {
  503. if (!ssl)
  504. return mtu;
  505. int new_mtu = get_mtu_from_ssl(ssl);
  506. if (new_mtu < 1)
  507. new_mtu = mtu;
  508. if (new_mtu > MAX_MTU)
  509. mtu = MAX_MTU;
  510. if (new_mtu > 0 && new_mtu < MIN_MTU)
  511. mtu = MIN_MTU;
  512. else if (new_mtu < mtu)
  513. mtu = new_mtu;
  514. else
  515. mtu -= MTU_STEP;
  516. if (mtu < MIN_MTU)
  517. mtu = MIN_MTU;
  518. set_query_mtu(ssl);
  519. if (verbose)
  520. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "1. mtu to use: %d\n", mtu);
  521. #if DTLS_SUPPORTED
  522. SSL_set_mtu(ssl,mtu);
  523. BIO_ctrl(SSL_get_wbio(ssl), BIO_CTRL_DGRAM_SET_MTU, mtu, NULL);
  524. #endif
  525. return mtu;
  526. }
  527. int set_mtu_df(SSL* ssl, evutil_socket_t fd, int family, int mtu, int df_value, int verbose) {
  528. if(!ssl || fd<0) return 0;
  529. int ret=set_socket_df(fd, family, df_value);
  530. if(!mtu) mtu=SOSO_MTU;
  531. else if(mtu<MIN_MTU) mtu=MIN_MTU;
  532. else if(mtu>MAX_MTU) mtu=MAX_MTU;
  533. set_query_mtu(ssl);
  534. if(verbose) TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"3. mtu to use: %d\n",mtu);
  535. #if DTLS_SUPPORTED
  536. SSL_set_mtu(ssl,mtu);
  537. BIO_ctrl(SSL_get_wbio(ssl), BIO_CTRL_DGRAM_SET_MTU, mtu, NULL);
  538. #endif
  539. if(verbose) TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"4. new mtu: %d\n",get_mtu_from_ssl(ssl));
  540. return ret;
  541. }
  542. int get_socket_mtu(evutil_socket_t fd, int family, int verbose)
  543. {
  544. int ret = 0;
  545. UNUSED_ARG(fd);
  546. UNUSED_ARG(family);
  547. UNUSED_ARG(verbose);
  548. #if defined(IP_MTU)
  549. int val = 0;
  550. socklen_t slen=sizeof(val);
  551. if(family==AF_INET) {
  552. ret = getsockopt(fd, IPPROTO_IP, IP_MTU, &val, &slen);
  553. } else {
  554. #if defined(IPPROTO_IPV6) && defined(IPV6_MTU)
  555. ret = getsockopt(fd, IPPROTO_IPV6, IPV6_MTU, &val, &slen);
  556. #endif
  557. ;
  558. }
  559. ret = val;
  560. #endif
  561. if (verbose)
  562. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s: final=%d\n", __FUNCTION__, ret);
  563. return ret;
  564. }
  565. //////////////////// socket error handle ////////////////////
  566. int handle_socket_error() {
  567. switch (errno) {
  568. case EINTR:
  569. /* Interrupted system call.
  570. * Just ignore.
  571. */
  572. return 1;
  573. case ENOBUFS:
  574. /* No buffers, temporary condition.
  575. * Just ignore and try later.
  576. */
  577. return 1;
  578. case EAGAIN:
  579. #if defined(EWOULDBLOCK)
  580. #if (EWOULDBLOCK != EAGAIN)
  581. case EWOULDBLOCK:
  582. #endif
  583. #endif
  584. return 1;
  585. case EMSGSIZE:
  586. return 1;
  587. case EBADF:
  588. /* Invalid socket.
  589. * Must close connection.
  590. */
  591. return 0;
  592. case EHOSTDOWN:
  593. /* Host is down.
  594. * Just ignore, might be an attacker
  595. * sending fake ICMP messages.
  596. */
  597. return 1;
  598. case ECONNRESET:
  599. case ECONNREFUSED:
  600. /* Connection reset by peer. */
  601. return 0;
  602. case ENOMEM:
  603. /* Out of memory.
  604. * Must close connection.
  605. */
  606. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"Out of memory!\n");
  607. return 0;
  608. case EACCES:
  609. /* Permission denied.
  610. * Just ignore, we might be blocked
  611. * by some firewall policy. Try again
  612. * and hope for the best.
  613. */
  614. return 1;
  615. default:
  616. /* Something unexpected happened */
  617. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"Unexpected error! (errno = %d)\n", errno);
  618. return 0;
  619. }
  620. }
  621. //////////////////// Misc utils //////////////////////////////
  622. char *skip_blanks(char* s)
  623. {
  624. while(*s==' ' || *s=='\t' || *s=='\n')
  625. ++s;
  626. return s;
  627. }
  628. //////////////////// Config file search //////////////////////
  629. #define Q(x) #x
  630. #define QUOTE(x) Q(x)
  631. #define ETCDIR INSTALL_PREFIX/etc/
  632. #define QETCDIR QUOTE(ETCDIR)
  633. #define ETCDIR1 INSTALL_PREFIX/etc/turnserver/
  634. #define QETCDIR1 QUOTE(ETCDIR1)
  635. #define ETCDIR2 INSTALL_PREFIX/etc/coturn/
  636. #define QETCDIR2 QUOTE(ETCDIR2)
  637. 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 };
  638. static char *c_execdir=NULL;
  639. void set_execdir(void)
  640. {
  641. /* On some systems, this may give us the execution path */
  642. char *_var = getenv("_");
  643. if(_var && *_var) {
  644. _var = strdup(_var);
  645. char *edir=_var;
  646. if(edir[0]!='.')
  647. edir = strstr(edir,"/");
  648. if(edir && *edir)
  649. edir = dirname(edir);
  650. else
  651. edir = dirname(_var);
  652. if(c_execdir)
  653. free(c_execdir);
  654. c_execdir = strdup(edir);
  655. free(_var);
  656. }
  657. }
  658. void print_abs_file_name(const char *msg1, const char *msg2, const char *fn)
  659. {
  660. char absfn[1025];
  661. absfn[0]=0;
  662. if(fn) {
  663. while(fn[0] && fn[0]==' ') ++fn;
  664. if(fn[0]) {
  665. if(fn[0]=='/') {
  666. STRCPY(absfn,fn);
  667. } else {
  668. if(fn[0]=='.' && fn[1] && fn[1]=='/')
  669. fn+=2;
  670. if(!getcwd(absfn,sizeof(absfn)-1))
  671. absfn[0]=0;
  672. size_t blen=strlen(absfn);
  673. if(blen<sizeof(absfn)-1) {
  674. strncpy(absfn+blen,"/",sizeof(absfn)-blen);
  675. strncpy(absfn+blen+1,fn,sizeof(absfn)-blen-1);
  676. } else {
  677. STRCPY(absfn,fn);
  678. }
  679. absfn[sizeof(absfn)-1]=0;
  680. }
  681. }
  682. }
  683. if(absfn[0]) {
  684. TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "%s%s file found: %s\n", msg1, msg2, absfn);
  685. }
  686. }
  687. char* find_config_file(const char *config_file, int print_file_name)
  688. {
  689. char *full_path_to_config_file = NULL;
  690. if (config_file && config_file[0]) {
  691. if ((config_file[0] == '/')||(config_file[0] == '~')) {
  692. FILE *f = fopen(config_file, "r");
  693. if (f) {
  694. fclose(f);
  695. full_path_to_config_file = strdup(config_file);
  696. }
  697. } else {
  698. int i = 0;
  699. size_t cflen = strlen(config_file);
  700. while (config_file_search_dirs[i]) {
  701. size_t dirlen = strlen(config_file_search_dirs[i]);
  702. size_t fnsz = sizeof(char) * (dirlen + cflen + 10);
  703. char *fn = (char*)malloc(fnsz+1);
  704. strncpy(fn, config_file_search_dirs[i], fnsz);
  705. strncpy(fn + dirlen, config_file, fnsz-dirlen);
  706. fn[fnsz]=0;
  707. FILE *f = fopen(fn, "r");
  708. if (f) {
  709. fclose(f);
  710. if (print_file_name)
  711. print_abs_file_name("","Config",fn);
  712. full_path_to_config_file = fn;
  713. break;
  714. }
  715. free(fn);
  716. if(config_file_search_dirs[i][0]!='/' &&
  717. config_file_search_dirs[i][0]!='.' &&
  718. c_execdir && c_execdir[0]) {
  719. size_t celen = strlen(c_execdir);
  720. fnsz = sizeof(char) * (dirlen + cflen + celen + 10);
  721. fn = (char*)malloc(fnsz+1);
  722. strncpy(fn,c_execdir,fnsz);
  723. size_t fnlen=strlen(fn);
  724. if(fnlen<fnsz) {
  725. strncpy(fn+fnlen,"/",fnsz-fnlen);
  726. fnlen=strlen(fn);
  727. if(fnlen<fnsz) {
  728. strncpy(fn+fnlen, config_file_search_dirs[i], fnsz-fnlen);
  729. fnlen=strlen(fn);
  730. if(fnlen<fnsz) {
  731. strncpy(fn+fnlen, config_file, fnsz-fnlen);
  732. }
  733. }
  734. }
  735. fn[fnsz]=0;
  736. if(strstr(fn,"//")!=fn) {
  737. f = fopen(fn, "r");
  738. if (f) {
  739. fclose(f);
  740. if (print_file_name)
  741. print_abs_file_name("","Config",fn);
  742. full_path_to_config_file = fn;
  743. break;
  744. }
  745. }
  746. free(fn);
  747. }
  748. ++i;
  749. }
  750. }
  751. if(!full_path_to_config_file) {
  752. if(strstr(config_file,"etc/")==config_file) {
  753. return find_config_file(config_file+4, print_file_name);
  754. }
  755. }
  756. }
  757. return full_path_to_config_file;
  758. }
  759. /////////////////// SYS SETTINGS ///////////////////////
  760. void ignore_sigpipe(void)
  761. {
  762. /* Ignore SIGPIPE from TCP sockets */
  763. if(signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
  764. perror("Cannot set SIGPIPE handler");
  765. }
  766. }
  767. static uint64_t turn_getRandTime(void) {
  768. struct timespec tp={0,0};
  769. #if defined(CLOCK_REALTIME)
  770. clock_gettime(CLOCK_REALTIME, &tp);
  771. #else
  772. tp.tv_sec = time(NULL);
  773. #endif
  774. uint64_t current_time = (uint64_t)(tp.tv_sec);
  775. uint64_t current_mstime = (uint64_t)(current_time + (tp.tv_nsec));
  776. return current_mstime;
  777. }
  778. unsigned long set_system_parameters(int max_resources)
  779. {
  780. srandom((unsigned int) (turn_getRandTime() + (unsigned int)((long)(&turn_getRandTime))));
  781. setlocale(LC_ALL, "C");
  782. build_base64_decoding_table();
  783. ignore_sigpipe();
  784. if(max_resources) {
  785. struct rlimit rlim;
  786. if(getrlimit(RLIMIT_NOFILE, &rlim)<0) {
  787. perror("Cannot get system limit");
  788. } else {
  789. rlim.rlim_cur = rlim.rlim_max;
  790. while((setrlimit(RLIMIT_NOFILE, &rlim)<0) && (rlim.rlim_cur>0)) {
  791. rlim.rlim_cur = rlim.rlim_cur>>1;
  792. }
  793. return (unsigned long)rlim.rlim_cur;
  794. }
  795. }
  796. return 0;
  797. }
  798. ////////////////////// Base 64 ////////////////////////////
  799. static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
  800. 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
  801. 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
  802. 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
  803. 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
  804. 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
  805. 'w', 'x', 'y', 'z', '0', '1', '2', '3',
  806. '4', '5', '6', '7', '8', '9', '+', '/'};
  807. static char *decoding_table = NULL;
  808. static size_t mod_table[] = {0, 2, 1};
  809. char *base64_encode(const unsigned char *data,
  810. size_t input_length,
  811. size_t *output_length) {
  812. *output_length = 4 * ((input_length + 2) / 3);
  813. char *encoded_data = (char*)malloc(*output_length+1);
  814. if (encoded_data == NULL) return NULL;
  815. size_t i,j;
  816. for (i = 0, j = 0; i < input_length;) {
  817. uint32_t octet_a = i < input_length ? data[i++] : 0;
  818. uint32_t octet_b = i < input_length ? data[i++] : 0;
  819. uint32_t octet_c = i < input_length ? data[i++] : 0;
  820. uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;
  821. encoded_data[j++] = encoding_table[(triple >> 3 * 6) & 0x3F];
  822. encoded_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F];
  823. encoded_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F];
  824. encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F];
  825. }
  826. for (i = 0; i < mod_table[input_length % 3]; i++)
  827. encoded_data[*output_length - 1 - i] = '=';
  828. encoded_data[*output_length]=0;
  829. return encoded_data;
  830. }
  831. void build_base64_decoding_table() {
  832. decoding_table = (char*)malloc(256);
  833. bzero(decoding_table,256);
  834. int i;
  835. for (i = 0; i < 64; i++)
  836. decoding_table[(unsigned char) encoding_table[i]] = (char)i;
  837. }
  838. unsigned char *base64_decode(const char *data,
  839. size_t input_length,
  840. size_t *output_length) {
  841. if (decoding_table == NULL) build_base64_decoding_table();
  842. if (input_length % 4 != 0) return NULL;
  843. *output_length = input_length / 4 * 3;
  844. if (data[input_length - 1] == '=') (*output_length)--;
  845. if (data[input_length - 2] == '=') (*output_length)--;
  846. unsigned char *decoded_data = (unsigned char*)malloc(*output_length);
  847. if (decoded_data == NULL) return NULL;
  848. int i;
  849. size_t j;
  850. for (i = 0, j = 0; i < (int)input_length;) {
  851. uint32_t sextet_a =
  852. data[i] == '=' ? 0 & i++ : decoding_table[(int)data[i++]];
  853. uint32_t sextet_b =
  854. data[i] == '=' ? 0 & i++ : decoding_table[(int)data[i++]];
  855. uint32_t sextet_c =
  856. data[i] == '=' ? 0 & i++ : decoding_table[(int)data[i++]];
  857. uint32_t sextet_d =
  858. data[i] == '=' ? 0 & i++ : decoding_table[(int)data[i++]];
  859. uint32_t triple = (sextet_a << 3 * 6) + (sextet_b << 2 * 6)
  860. + (sextet_c << 1 * 6) + (sextet_d << 0 * 6);
  861. if (j < *output_length)
  862. decoded_data[j++] = (triple >> 2 * 8) & 0xFF;
  863. if (j < *output_length)
  864. decoded_data[j++] = (triple >> 1 * 8) & 0xFF;
  865. if (j < *output_length)
  866. decoded_data[j++] = (triple >> 0 * 8) & 0xFF;
  867. }
  868. return decoded_data;
  869. }
  870. ////////////////// SSL /////////////////////
  871. const char* turn_get_ssl_method(SSL *ssl, const char* mdefault)
  872. {
  873. const char* ret = "unknown";
  874. if(!ssl) {
  875. ret = mdefault;
  876. } else {
  877. ret = SSL_get_version(ssl);
  878. }
  879. return ret;
  880. }
  881. //////////// EVENT BASE ///////////////
  882. struct event_base *turn_event_base_new(void)
  883. {
  884. struct event_config *cfg = event_config_new();
  885. event_config_set_flag(cfg,EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST);
  886. return event_base_new_with_config(cfg);
  887. }
  888. /////////// OAUTH /////////////////
  889. void convert_oauth_key_data_raw(const oauth_key_data_raw *raw, oauth_key_data *oakd)
  890. {
  891. if(raw && oakd) {
  892. bzero(oakd,sizeof(oauth_key_data));
  893. oakd->timestamp = (turn_time_t)raw->timestamp;
  894. oakd->lifetime = raw->lifetime;
  895. bcopy(raw->as_rs_alg,oakd->as_rs_alg,sizeof(oakd->as_rs_alg));
  896. bcopy(raw->kid,oakd->kid,sizeof(oakd->kid));
  897. if(raw->ikm_key[0]) {
  898. size_t ikm_key_size = 0;
  899. char *ikm_key = (char*)base64_decode(raw->ikm_key,strlen(raw->ikm_key),&ikm_key_size);
  900. if(ikm_key) {
  901. bcopy(ikm_key,oakd->ikm_key,ikm_key_size);
  902. oakd->ikm_key_size = ikm_key_size;
  903. free(ikm_key);
  904. }
  905. }
  906. }
  907. }
  908. //////////////////////////////////////////////////////////////