From 2e0b8aefcca4f982ac79ee9961cc8b880eeb0c9a Mon Sep 17 00:00:00 2001 From: mom040267 Date: Wed, 4 Feb 2015 06:14:11 +0000 Subject: [PATCH] TOS fixed --- ChangeLog | 6 +- rpm/build.settings.sh | 2 +- rpm/turnserver.spec | 6 +- src/apps/common/apputils.c | 125 +++++++++++++++++++++++ src/apps/common/apputils.h | 8 ++ src/apps/relay/ns_ioalib_engine_impl.c | 136 +------------------------ src/apps/rfc5769/rfc5769check.c | 6 +- src/apps/uclient/startuclient.c | 3 + src/ns_turn_defs.h | 2 +- 9 files changed, 152 insertions(+), 142 deletions(-) diff --git a/ChangeLog b/ChangeLog index 81cf010..081ad00 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,8 @@ -2/2/2015 Oleg Moskalenko -Version 4.4.1.3 'Ardee West': +2/3/2015 Oleg Moskalenko +Version 4.4.2.1 'Ardee West': - SHA-512 added to oAuth; + - updates according to the new third-party-auth draft (oauth); + - TOS behavior fixed; 2/1/2015 Oleg Moskalenko Version 4.4.1.2 'Ardee West': diff --git a/rpm/build.settings.sh b/rpm/build.settings.sh index 7057e03..7b0ed99 100755 --- a/rpm/build.settings.sh +++ b/rpm/build.settings.sh @@ -2,7 +2,7 @@ # Common settings script. -TURNVERSION=4.4.1.3 +TURNVERSION=4.4.2.1 BUILDDIR=~/rpmbuild ARCH=`uname -p` TURNSERVER_SVN_URL=http://coturn.googlecode.com/svn diff --git a/rpm/turnserver.spec b/rpm/turnserver.spec index 96cd465..9f1cd82 100644 --- a/rpm/turnserver.spec +++ b/rpm/turnserver.spec @@ -1,5 +1,5 @@ Name: turnserver -Version: 4.4.1.3 +Version: 4.4.2.1 Release: 0%{dist} Summary: Coturn TURN Server @@ -288,8 +288,8 @@ fi %{_includedir}/turn/client/TurnMsgLib.h %changelog -* Sun Feb 2 2015 Oleg Moskalenko - - Sync to 4.4.1.3 +* Tue Feb 3 2015 Oleg Moskalenko + - Sync to 4.4.2.1 * Sun Feb 1 2015 Oleg Moskalenko - Sync to 4.4.1.2 * Sat Jan 24 2015 Oleg Moskalenko diff --git a/src/apps/common/apputils.c b/src/apps/common/apputils.c index a8ec8ef..690c60d 100644 --- a/src/apps/common/apputils.c +++ b/src/apps/common/apputils.c @@ -289,6 +289,131 @@ int addr_get_from_sock(evutil_socket_t fd, ioa_addr *addr) } } +int get_raw_socket_ttl(evutil_socket_t fd, int family) +{ + int ttl = 0; + + if(family == AF_INET6) { +#if !defined(IPV6_UNICAST_HOPS) + UNUSED_ARG(fd); + do { return TTL_IGNORE; } while(0); +#else + socklen_t slen = (socklen_t)sizeof(ttl); + if(getsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl,&slen)<0) { + perror("get HOPLIMIT on socket"); + return TTL_IGNORE; + } +#endif + } else { +#if !defined(IP_TTL) + UNUSED_ARG(fd); + do { return TTL_IGNORE; } while(0); +#else + socklen_t slen = (socklen_t)sizeof(ttl); + if(getsockopt(fd, IPPROTO_IP, IP_TTL, &ttl,&slen)<0) { + perror("get TTL on socket"); + return TTL_IGNORE; + } +#endif + } + + CORRECT_RAW_TTL(ttl); + + return ttl; +} + +int get_raw_socket_tos(evutil_socket_t fd, int family) +{ + int tos = 0; + + if(family == AF_INET6) { +#if !defined(IPV6_TCLASS) + UNUSED_ARG(fd); + do { return TOS_IGNORE; } while(0); +#else + socklen_t slen = (socklen_t)sizeof(tos); + if(getsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &tos,&slen)<0) { + perror("get TCLASS on socket"); + return -1; + } +#endif + } else { +#if !defined(IP_TOS) + UNUSED_ARG(fd); + do { return TOS_IGNORE; } while(0); +#else + socklen_t slen = (socklen_t)sizeof(tos); + if(getsockopt(fd, IPPROTO_IP, IP_TOS, &tos,&slen)<0) { + perror("get TOS on socket"); + return -1; + } +#endif + } + + CORRECT_RAW_TOS(tos); + + return tos; +} + +int set_raw_socket_ttl(evutil_socket_t fd, int family, int ttl) +{ + + if(family == AF_INET6) { +#if !defined(IPV6_UNICAST_HOPS) + UNUSED_ARG(fd); + UNUSED_ARG(ttl); +#else + CORRECT_RAW_TTL(ttl); + if(setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl,sizeof(ttl))<0) { + perror("set HOPLIMIT on socket"); + return -1; + } +#endif + } else { +#if !defined(IP_TTL) + UNUSED_ARG(fd); + UNUSED_ARG(ttl); +#else + CORRECT_RAW_TTL(ttl); + if(setsockopt(fd, IPPROTO_IP, IP_TTL, &ttl,sizeof(ttl))<0) { + perror("set TTL on socket"); + return -1; + } +#endif + } + + return 0; +} + +int set_raw_socket_tos(evutil_socket_t fd, int family, int tos) +{ + + if(family == AF_INET6) { +#if !defined(IPV6_TCLASS) + UNUSED_ARG(fd); + UNUSED_ARG(tos); +#else + CORRECT_RAW_TOS(tos); + if(setsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &tos,sizeof(tos))<0) { + perror("set TCLASS on socket"); + return -1; + } +#endif + } else { +#if !defined(IP_TOS) + UNUSED_ARG(fd); + UNUSED_ARG(tos); +#else + if(setsockopt(fd, IPPROTO_IP, IP_TOS, &tos,sizeof(tos))<0) { + perror("set TOS on socket"); + return -1; + } +#endif + } + + return 0; +} + /////////////////// MTU ///////////////////////////////////////// int set_socket_df(evutil_socket_t fd, int family, int value) diff --git a/src/apps/common/apputils.h b/src/apps/common/apputils.h index adb38b6..fb3133b 100644 --- a/src/apps/common/apputils.h +++ b/src/apps/common/apputils.h @@ -186,6 +186,14 @@ int addr_get_from_sock(evutil_socket_t fd, ioa_addr *addr); int handle_socket_error(void); +#define CORRECT_RAW_TTL(ttl) do { if(ttl<0 || ttl>255) ttl=TTL_DEFAULT; } while(0) +#define CORRECT_RAW_TOS(tos) do { if(tos<0 || tos>255) tos=TOS_DEFAULT; } while(0) + +int set_raw_socket_tos(evutil_socket_t fd, int family, int tos); +int set_raw_socket_ttl(evutil_socket_t fd, int family, int ttl); +int get_raw_socket_tos(evutil_socket_t fd, int family); +int get_raw_socket_ttl(evutil_socket_t fd, int family); + /////////////////////// SYS ///////////////////// void ignore_sigpipe(void); diff --git a/src/apps/relay/ns_ioalib_engine_impl.c b/src/apps/relay/ns_ioalib_engine_impl.c index 3402785..697d63c 100644 --- a/src/apps/relay/ns_ioalib_engine_impl.c +++ b/src/apps/relay/ns_ioalib_engine_impl.c @@ -355,16 +355,16 @@ ioa_engine_handle create_ioa_engine(super_memory_t *sm, #if !defined(CMSG_SPACE) TURN_LOG_FUNC(TURN_LOG_LEVEL_WARNING, "On this platform, I am using alternative behavior of TTL/TOS according to RFC 5766.\n"); #endif -#if !defined(IP_RECVTTL) +#if !defined(IP_RECVTTL) || !defined(IP_TTL) TURN_LOG_FUNC(TURN_LOG_LEVEL_WARNING, "IPv4: On this platform, I am using alternative behavior of TTL according to RFC 5766.\n"); #endif -#if !defined(IPV6_RECVHOPLIMIT) +#if !defined(IPV6_RECVHOPLIMIT) || !defined(IPV6_HOPLIMIT) TURN_LOG_FUNC(TURN_LOG_LEVEL_WARNING, "IPv6: On this platform, I am using alternative behavior of TTL (HOPLIMIT) according to RFC 6156.\n"); #endif -#if !defined(IP_RECVTOS) +#if !defined(IP_RECVTOS) || !defined(IP_TOS) TURN_LOG_FUNC(TURN_LOG_LEVEL_WARNING, "IPv4: On this platform, I am using alternative behavior of TOS according to RFC 5766.\n"); #endif -#if !defined(IPV6_RECVTCLASS) +#if !defined(IPV6_RECVTCLASS) || !defined(IPV6_TCLASS) TURN_LOG_FUNC(TURN_LOG_LEVEL_WARNING, "IPv6: On this platform, I am using alternative behavior of TRAFFIC CLASS according to RFC 6156.\n"); #endif } @@ -706,134 +706,6 @@ int get_ioa_socket_from_reservation(ioa_engine_handle e, u64bits in_reservation_ /* Socket options helpers ==>> */ -#define CORRECT_RAW_TTL(ttl) do { if(ttl<0 || ttl>255) ttl=TTL_DEFAULT; } while(0) -#define CORRECT_RAW_TOS(tos) do { if(tos<0 || tos>255) tos=TOS_DEFAULT; } while(0) - -static int get_raw_socket_ttl(evutil_socket_t fd, int family) -{ - int ttl = 0; - - if(family == AF_INET6) { -#if !defined(IPV6_RECVHOPLIMIT) - UNUSED_ARG(fd); - do { return TTL_IGNORE; } while(0); -#else - socklen_t slen = (socklen_t)sizeof(ttl); - if(getsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl,&slen)<0) { - perror("get HOPLIMIT on socket"); - return TTL_IGNORE; - } -#endif - } else { -#if !defined(IP_RECVTTL) - UNUSED_ARG(fd); - do { return TTL_IGNORE; } while(0); -#else - socklen_t slen = (socklen_t)sizeof(ttl); - if(getsockopt(fd, IPPROTO_IP, IP_TTL, &ttl,&slen)<0) { - perror("get TTL on socket"); - return TTL_IGNORE; - } -#endif - } - - CORRECT_RAW_TTL(ttl); - - return ttl; -} - -static int get_raw_socket_tos(evutil_socket_t fd, int family) -{ - int tos = 0; - - if(family == AF_INET6) { -#if !defined(IPV6_RECVTCLASS) - UNUSED_ARG(fd); - do { return TOS_IGNORE; } while(0); -#else - socklen_t slen = (socklen_t)sizeof(tos); - if(getsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &tos,&slen)<0) { - perror("get TCLASS on socket"); - return -1; - } -#endif - } else { -#if !defined(IP_RECVTOS) - UNUSED_ARG(fd); - do { return TOS_IGNORE; } while(0); -#else - socklen_t slen = (socklen_t)sizeof(tos); - if(getsockopt(fd, IPPROTO_IP, IP_TOS, &tos,&slen)<0) { - perror("get TOS on socket"); - return -1; - } -#endif - } - - CORRECT_RAW_TOS(tos); - - return tos; -} - -static int set_raw_socket_ttl(evutil_socket_t fd, int family, int ttl) -{ - - if(family == AF_INET6) { -#if !defined(IPV6_RECVHOPLIMIT) - UNUSED_ARG(fd); - UNUSED_ARG(ttl); -#else - CORRECT_RAW_TTL(ttl); - if(setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &ttl,sizeof(ttl))<0) { - perror("set HOPLIMIT on socket"); - return -1; - } -#endif - } else { -#if !defined(IP_RECVTTL) - UNUSED_ARG(fd); - UNUSED_ARG(ttl); -#else - CORRECT_RAW_TTL(ttl); - if(setsockopt(fd, IPPROTO_IP, IP_TTL, &ttl,sizeof(ttl))<0) { - perror("set TTL on socket"); - return -1; - } -#endif - } - - return 0; -} - -static int set_raw_socket_tos(evutil_socket_t fd, int family, int tos) -{ - - if(family == AF_INET6) { -#if !defined(IPV6_RECVTCLASS) - UNUSED_ARG(fd); - UNUSED_ARG(tos); -#else - CORRECT_RAW_TOS(tos); - if(setsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &tos,sizeof(tos))<0) { - perror("set TCLASS on socket"); - return -1; - } -#endif - } else { -#if !defined(IPV6_RECVTOS) - UNUSED_ARG(fd); - UNUSED_ARG(tos); -#else - if(setsockopt(fd, IPPROTO_IP, IP_TOS, &tos,sizeof(tos))<0) { - perror("set TOS on socket"); - return -1; - } -#endif - } - - return 0; -} - static int set_socket_ttl(ioa_socket_handle s, int ttl) { if(s->default_ttl < 0) //Unsupported diff --git a/src/apps/rfc5769/rfc5769check.c b/src/apps/rfc5769/rfc5769check.c index af781f8..dee77a7 100644 --- a/src/apps/rfc5769/rfc5769check.c +++ b/src/apps/rfc5769/rfc5769check.c @@ -82,12 +82,12 @@ static int check_oauth(void) { size_t i_hmacs,i_shas,i_encs; - const char long_term_password[33] = "HGkj32KJGiuy098sdfaqbNjOiaz71923"; + const char long_term_key[33] = "HGkj32KJGiuy098sdfaqbNjOiaz71923"; size_t ltp_output_length=0; - const char* base64encoded_ltp = base64_encode((const unsigned char *)long_term_password, - strlen(long_term_password), + const char* base64encoded_ltp = base64_encode((const unsigned char *)long_term_key, + strlen(long_term_key), <p_output_length); const char mac_key[33] = "ZksjpweoixXmvn67534m"; diff --git a/src/apps/uclient/startuclient.c b/src/apps/uclient/startuclient.c index d26cd71..4dd6a13 100644 --- a/src/apps/uclient/startuclient.c +++ b/src/apps/uclient/startuclient.c @@ -242,6 +242,9 @@ static int clnet_connect(uint16_t clnet_remote_port, const char *remote_address, set_sock_buf_size(clnet_fd, UR_CLIENT_SOCK_BUF_SIZE); + set_raw_socket_tos(clnet_fd, remote_addr.ss.sa_family, 0x22); + set_raw_socket_ttl(clnet_fd, remote_addr.ss.sa_family, 47); + if(clnet_info->is_peer && (*local_address==0)) { if(remote_addr.ss.sa_family == AF_INET6) { diff --git a/src/ns_turn_defs.h b/src/ns_turn_defs.h index 4e48fa0..b3d091a 100644 --- a/src/ns_turn_defs.h +++ b/src/ns_turn_defs.h @@ -31,7 +31,7 @@ #ifndef __IOADEFS__ #define __IOADEFS__ -#define TURN_SERVER_VERSION "4.4.1.3" +#define TURN_SERVER_VERSION "4.4.2.1" #define TURN_SERVER_VERSION_NAME "Ardee West" #define TURN_SOFTWARE "Coturn-" TURN_SERVER_VERSION " '" TURN_SERVER_VERSION_NAME "'"