Browse Source

working on double allocations

mom040267 11 years ago
parent
commit
62301f57ac
3 changed files with 46 additions and 24 deletions
  1. 10 4
      src/apps/relay/turncli.c
  2. 33 18
      src/server/ns_turn_server.c
  3. 3 2
      src/server/ns_turn_session.h

+ 10 - 4
src/apps/relay/turncli.c

@@ -502,13 +502,19 @@ static int print_session(ur_map_key_type key, ur_map_value_type value, void *arg
 						addr_to_string(&(tsi->local_addr_data.addr),(u08bits*)tsi->local_addr_data.saddr);
 					if(!tsi->remote_addr_data.saddr[0])
 						addr_to_string(&(tsi->remote_addr_data.addr),(u08bits*)tsi->remote_addr_data.saddr);
-					if(!tsi->relay_addr_data.saddr[0])
-						addr_to_string(&(tsi->relay_addr_data.addr),(u08bits*)tsi->relay_addr_data.saddr);
+					if(!tsi->relay_addr_data_ipv4.saddr[0])
+						addr_to_string(&(tsi->relay_addr_data_ipv4.addr),(u08bits*)tsi->relay_addr_data_ipv4.saddr);
+					if(!tsi->relay_addr_data_ipv6.saddr[0])
+						addr_to_string(&(tsi->relay_addr_data_ipv6.addr),(u08bits*)tsi->relay_addr_data_ipv6.saddr);
 					myprintf(cs,"      client addr %s, server addr %s\n",
 									tsi->remote_addr_data.saddr,
 									tsi->local_addr_data.saddr);
-					myprintf(cs,"      relay addr %s\n",
-									tsi->relay_addr_data.saddr);
+					if(tsi->relay_addr_data_ipv4.saddr[0]) {
+						myprintf(cs,"      relay addr %s\n", tsi->relay_addr_data_ipv4.saddr);
+					}
+					if(tsi->relay_addr_data_ipv6.saddr[0]) {
+						myprintf(cs,"      relay addr %s\n", tsi->relay_addr_data_ipv6.saddr);
+					}
 				}
 				myprintf(cs,"      fingerprints enforced: %s\n",get_flag(tsi->enforce_fingerprints));
 				myprintf(cs,"      mobile: %s\n",get_flag(tsi->is_mobile));

+ 33 - 18
src/server/ns_turn_server.c

@@ -434,15 +434,18 @@ int turn_session_info_copy_from(struct turn_session_info* tsi, ts_ur_super_sessi
 				addr_to_string(&(tsi->remote_addr_data.addr),(u08bits*)tsi->remote_addr_data.saddr);
 			}
 			{
-				int i;
-				for(i=0;i<ALLOC_PROTOCOLS_NUMBER;++i) {
-					if(ss->alloc.relay_sessions[i].s) {
-						tsi->peer_protocol = get_ioa_socket_type(ss->alloc.relay_sessions[i].s);
-						if(ss->alloc.is_valid) {
-							addr_cpy(&(tsi->relay_addr_data.addr),get_local_addr_from_ioa_socket(ss->alloc.relay_sessions[i].s));
-							addr_to_string(&(tsi->relay_addr_data.addr),(u08bits*)tsi->relay_addr_data.saddr);
-						}
-						break;
+				if(ss->alloc.relay_sessions[ALLOC_IPV4_INDEX].s) {
+					tsi->peer_protocol = get_ioa_socket_type(ss->alloc.relay_sessions[ALLOC_IPV4_INDEX].s);
+					if(ss->alloc.is_valid) {
+						addr_cpy(&(tsi->relay_addr_data_ipv4.addr),get_local_addr_from_ioa_socket(ss->alloc.relay_sessions[ALLOC_IPV4_INDEX].s));
+						addr_to_string(&(tsi->relay_addr_data_ipv4.addr),(u08bits*)tsi->relay_addr_data_ipv4.saddr);
+					}
+				}
+				if(ss->alloc.relay_sessions[ALLOC_IPV6_INDEX].s) {
+					tsi->peer_protocol = get_ioa_socket_type(ss->alloc.relay_sessions[ALLOC_IPV6_INDEX].s);
+					if(ss->alloc.is_valid) {
+						addr_cpy(&(tsi->relay_addr_data_ipv6.addr),get_local_addr_from_ioa_socket(ss->alloc.relay_sessions[ALLOC_IPV6_INDEX].s));
+						addr_to_string(&(tsi->relay_addr_data_ipv6.addr),(u08bits*)tsi->relay_addr_data_ipv6.saddr);
 					}
 				}
 			}
@@ -3896,25 +3899,30 @@ static int create_relay_connection(turn_turnserver* server,
 	if (server && ss && ss->client_socket) {
 
 		allocation* a = get_allocation_ss(ss);
-		relay_endpoint_session* newelem = get_relay_session_ss(ss,get_family(address_family));
-
-		IOA_CLOSE_SOCKET(newelem->s);
-
-		ns_bzero(newelem, sizeof(relay_endpoint_session));
-		newelem->s = NULL;
-
+		relay_endpoint_session* newelem = NULL;
 		ioa_socket_handle rtcp_s = NULL;
 
 		if (in_reservation_token) {
 
+			ioa_socket_handle s = NULL;
+
 			if (get_ioa_socket_from_reservation(server->e, in_reservation_token,
-					&newelem->s) < 0) {
-				IOA_CLOSE_SOCKET(newelem->s);
+					&s) < 0) {
+				IOA_CLOSE_SOCKET(s);
 				*err_code = 508;
 				*reason = (const u08bits *)"Cannot find reserved socket";
 				return -1;
 			}
 
+			int family = get_ioa_socket_address_family(s);
+
+			newelem = get_relay_session_ss(ss,family);
+
+			IOA_CLOSE_SOCKET(newelem->s);
+
+			ns_bzero(newelem, sizeof(relay_endpoint_session));
+			newelem->s = s;
+
 			if(!check_username_hash(newelem->s,ss->username,(u08bits*)ss->realm_options.name)) {
 				IOA_CLOSE_SOCKET(newelem->s);
 				*err_code = 508;
@@ -3926,6 +3934,13 @@ static int create_relay_connection(turn_turnserver* server,
 
 		} else {
 
+			newelem = get_relay_session_ss(ss,get_family(address_family));
+
+			IOA_CLOSE_SOCKET(newelem->s);
+
+			ns_bzero(newelem, sizeof(relay_endpoint_session));
+			newelem->s = NULL;
+
 			int res = create_relay_ioa_sockets(server->e,
 							ss->client_socket,
 							address_family, transport,

+ 3 - 2
src/server/ns_turn_session.h

@@ -127,7 +127,8 @@ struct turn_session_info {
 	char tls_cipher[65];
 	addr_data local_addr_data;
 	addr_data remote_addr_data;
-	addr_data relay_addr_data;
+	addr_data relay_addr_data_ipv4;
+	addr_data relay_addr_data_ipv6;
 	u08bits username[STUN_MAX_USERNAME_SIZE+1];
 	int enforce_fingerprints;
 /* Stats */
@@ -146,7 +147,7 @@ struct turn_session_info {
 	addr_data *extra_peers_data;
 	size_t extra_peers_size;
 /* Realm */
-	char realm[STUN_MAX_REALM_SIZE+1];
+	char realm[STUN_MAX_REALM_SIZE + 1];
 	char origin[STUN_MAX_ORIGIN_SIZE + 1];
 /* Bandwidth */
 	band_limit_t bps;