diff --git a/src/server/ns_turn_allocation.c b/src/server/ns_turn_allocation.c index b39e6bad..89b946b3 100644 --- a/src/server/ns_turn_allocation.c +++ b/src/server/ns_turn_allocation.c @@ -92,6 +92,16 @@ relay_endpoint_session *get_relay_session(allocation *a, int family) return &(a->relay_sessions[ALLOC_INDEX(family)]); } +int get_relay_session_failure(allocation *a, int family) +{ + return a->relay_sessions_failure[ALLOC_INDEX(family)]; +} + +void set_relay_session_failure(allocation *a, int family) +{ + a->relay_sessions_failure[ALLOC_INDEX(family)] = 1; +} + ioa_socket_handle get_relay_socket(allocation *a, int family) { return a->relay_sessions[ALLOC_INDEX(family)].s; diff --git a/src/server/ns_turn_allocation.h b/src/server/ns_turn_allocation.h index 40b068a4..5f84f2f9 100644 --- a/src/server/ns_turn_allocation.h +++ b/src/server/ns_turn_allocation.h @@ -176,6 +176,7 @@ typedef struct _allocation { stun_tid tid; turn_permission_hashtable addr_to_perm; relay_endpoint_session relay_sessions[ALLOC_PROTOCOLS_NUMBER]; + int relay_sessions_failure[ALLOC_PROTOCOLS_NUMBER]; ch_map chns; /* chnum-to-ch_info* */ void *owner; //ss ur_map *tcp_connections; //global (per turn server) reference @@ -208,6 +209,8 @@ ch_info* allocation_get_ch_info(allocation* a, u16bits chnum); ch_info* allocation_get_ch_info_by_peer_addr(allocation* a, ioa_addr* peer_addr); relay_endpoint_session *get_relay_session(allocation *a, int family); +int get_relay_session_failure(allocation *a, int family); +void set_relay_session_failure(allocation *a, int family); ioa_socket_handle get_relay_socket(allocation *a, int family); tcp_connection *get_and_clean_tcp_connection_by_id(ur_map *map, tcp_connection_id id); diff --git a/src/server/ns_turn_server.c b/src/server/ns_turn_server.c index 60a6e4ff..b8a2c25a 100644 --- a/src/server/ns_turn_server.c +++ b/src/server/ns_turn_server.c @@ -904,7 +904,10 @@ static int handle_turn_allocate(turn_turnserver *server, ioa_addr *relayed_addr1 = get_local_addr_from_ioa_socket(get_relay_socket_ss(ss,AF_INET)); ioa_addr *relayed_addr2 = get_local_addr_from_ioa_socket(get_relay_socket_ss(ss,AF_INET6)); - if(relayed_addr1) { + if(get_relay_session_failure(a,AF_INET)) { + addr_set_any(&xor_relayed_addr1); + pxor_relayed_addr1 = &xor_relayed_addr1; + } else if(relayed_addr1) { if(server->external_ip_set) { addr_cpy(&xor_relayed_addr1, &(server->external_ip)); addr_set_port(&xor_relayed_addr1,addr_get_port(relayed_addr1)); @@ -914,7 +917,10 @@ static int handle_turn_allocate(turn_turnserver *server, pxor_relayed_addr1 = &xor_relayed_addr1; } - if(relayed_addr2) { + if(get_relay_session_failure(a,AF_INET6)) { + addr_set_any(&xor_relayed_addr2); + pxor_relayed_addr2 = &xor_relayed_addr2; + } else if(relayed_addr2) { if(server->external_ip_set) { addr_cpy(&xor_relayed_addr2, &(server->external_ip)); addr_set_port(&xor_relayed_addr2,addr_get_port(relayed_addr2)); @@ -1213,7 +1219,10 @@ static int handle_turn_allocate(turn_turnserver *server, ioa_addr *relayed_addr1 = get_local_addr_from_ioa_socket(get_relay_socket_ss(ss,AF_INET)); ioa_addr *relayed_addr2 = get_local_addr_from_ioa_socket(get_relay_socket_ss(ss,AF_INET6)); - if(relayed_addr1) { + if(get_relay_session_failure(a,AF_INET)) { + addr_set_any(&xor_relayed_addr1); + pxor_relayed_addr1 = &xor_relayed_addr1; + } else if(relayed_addr1) { if(server->external_ip_set) { addr_cpy(&xor_relayed_addr1, &(server->external_ip)); addr_set_port(&xor_relayed_addr1,addr_get_port(relayed_addr1)); @@ -1223,7 +1232,10 @@ static int handle_turn_allocate(turn_turnserver *server, pxor_relayed_addr1 = &xor_relayed_addr1; } - if(relayed_addr2) { + if(get_relay_session_failure(a,AF_INET6)) { + addr_set_any(&xor_relayed_addr2); + pxor_relayed_addr2 = &xor_relayed_addr2; + } else if(relayed_addr2) { if(server->external_ip_set) { addr_cpy(&xor_relayed_addr2, &(server->external_ip)); addr_set_port(&xor_relayed_addr2,addr_get_port(relayed_addr2));