mom040267 преди 11 години
родител
ревизия
58efbf9635

+ 4 - 12
src/apps/relay/dtls_listener.c

@@ -229,9 +229,6 @@ static ioa_socket_handle dtls_accept_client_connection(
 
 	ioa_socket_handle ioas = create_ioa_socket_from_ssl(server->e, sock, ssl, DTLS_SOCKET, CLIENT_SOCKET, remote_addr, local_addr);
 	if(ioas) {
-
-		ioas->listener_server = server;
-
 		addr_cpy(&(server->sm.m.sm.nd.src_addr),remote_addr);
 		server->sm.m.sm.nd.recv_ttl = TTL_IGNORE;
 		server->sm.m.sm.nd.recv_tos = TOS_IGNORE;
@@ -437,7 +434,6 @@ static int handle_udp_packet(dtls_listener_relay_server_type *server,
 					__FUNCTION__, (char*) saddr,(char*) rsaddr);
 			}
 			s->e = ioa_eng;
-			s->listener_server = server;
 			add_socket_to_map(s, amap);
 			open_client_connection_session(ts, &(sm->m.sm));
 		}
@@ -565,7 +561,6 @@ static int create_new_connected_udp_socket(
 				"Accepted DTLS connection from");
 
 		ret->ssl = connecting_ssl;
-		ret->listener_server = server;
 
 		ioa_network_buffer_delete(server->e, server->sm.m.sm.nd.nbh);
 		server->sm.m.sm.nd.nbh = NULL;
@@ -583,9 +578,8 @@ static void udp_server_input_handler(evutil_socket_t fd, short what, void* arg)
 {
 	int cycle = 0;
 
-	ioa_socket_handle s = (ioa_socket_handle)arg;
-
-	dtls_listener_relay_server_type* server = (dtls_listener_relay_server_type*)s->listener_server;
+	dtls_listener_relay_server_type* server = (dtls_listener_relay_server_type*)arg;
+	ioa_socket_handle s = server->udp_listen_s;
 
 	FUNCSTART;
 
@@ -726,8 +720,6 @@ static int create_server_socket(dtls_listener_relay_server_type* server, int rep
 
 	  server->udp_listen_s = create_ioa_socket_from_fd(server->e, udp_listen_fd, NULL, UDP_SOCKET, LISTENER_SOCKET, NULL, &(server->addr));
 
-	  server->udp_listen_s->listener_server = server;
-
 	  set_sock_buf_size(udp_listen_fd,UR_SERVER_SOCK_BUF_SIZE);
 
 	  if(sock_bind_to_device(udp_listen_fd, (unsigned char*)server->ifname)<0) {
@@ -756,7 +748,7 @@ static int create_server_socket(dtls_listener_relay_server_type* server, int rep
 
 	  server->udp_listen_ev = event_new(server->e->event_base,udp_listen_fd,
 				    EV_READ|EV_PERSIST,udp_server_input_handler,
-				    server->udp_listen_s);
+				    server);
 
 	  event_add(server->udp_listen_ev,NULL);
   }
@@ -827,7 +819,7 @@ static int reopen_server_socket(dtls_listener_relay_server_type* server, evutil_
 
 		server->udp_listen_ev = event_new(server->e->event_base, udp_listen_fd,
 				EV_READ | EV_PERSIST, udp_server_input_handler,
-				server->udp_listen_s);
+				server);
 
 		event_add(server->udp_listen_ev, NULL );
 	}

+ 14 - 1
src/apps/relay/ns_ioalib_engine_impl.c

@@ -1448,16 +1448,23 @@ void add_socket_to_map(ioa_socket_handle s, ur_addr_map *amap)
 				&(s->remote_addr),
 				(ur_addr_map_value_type)s);
 		s->sockets_container = amap;
+
+		//printf("%s: 111.111: amap=0x%lx: ne=%lu, sz=%lu\n",__FUNCTION__,(unsigned long)amap,(unsigned long)ur_addr_map_num_elements(amap),(unsigned long)ur_addr_map_size(amap));
 	}
 }
 
 void delete_socket_from_map(ioa_socket_handle s)
 {
 	if(s && s->sockets_container) {
+
+		//ur_addr_map *amap = s->sockets_container;
+
 		ur_addr_map_del(s->sockets_container,
 				&(s->remote_addr),
 				NULL);
 		s->sockets_container = NULL;
+
+		//printf("%s: 111.222: amap=0x%lx: ne=%lu, sz=%lu\n",__FUNCTION__,(unsigned long)amap,(unsigned long)ur_addr_map_num_elements(amap),(unsigned long)ur_addr_map_size(amap));
 	}
 }
 
@@ -1741,7 +1748,11 @@ ioa_socket_handle detach_ioa_socket(ioa_socket_handle s, int full_detach)
 		set_socket_ssl(ret,s->ssl);
 		ret->fd = s->fd;
 
-		ret->family = s->family;
+		if(s->parent_s)
+			ret->family = s->parent_s->family;
+		else
+			ret->family = s->family;
+
 		ret->st = s->st;
 		ret->sat = s->sat;
 		ret->bound = s->bound;
@@ -1836,6 +1847,8 @@ void set_ioa_socket_sub_session(ioa_socket_handle s, tcp_connection *tc)
 int get_ioa_socket_address_family(ioa_socket_handle s) {
 	if(!s) {
 		return AF_INET;
+	} else if(s->done) {
+		return s->family;
 	} else if(s->parent_s) {
 		return s->parent_s->family;
 	} else {

+ 0 - 1
src/apps/relay/ns_ioalib_impl.h

@@ -170,7 +170,6 @@ struct _ioa_socket
 {
 	evutil_socket_t fd;
 	struct _ioa_socket *parent_s;
-	void *listener_server;
 	u32bits magic;
 	ur_addr_map *sockets_container; /* relay container for UDP sockets */
 	struct bufferevent *bev;

+ 0 - 2
src/apps/relay/tls_listener.c

@@ -98,8 +98,6 @@ static void server_input_handler(struct evconnlistener *l, evutil_socket_t fd,
 
 	if (ioas) {
 
-		ioas->listener_server = server;
-
 		server->sm.m.sm.nd.recv_ttl = TTL_IGNORE;
 		server->sm.m.sm.nd.recv_tos = TOS_IGNORE;
 		server->sm.m.sm.nd.nbh = NULL;

+ 76 - 0
src/server/ns_turn_maps.c

@@ -692,6 +692,48 @@ static void addr_list_foreach(addr_list_header* slh,  ur_addr_map_func func) {
   }
 }
 
+static size_t addr_list_num_elements(const addr_list_header* slh) {
+
+	size_t ret = 0;
+
+	if (slh) {
+
+		size_t i;
+
+		for (i = 0; i < ADDR_ARRAY_SIZE; ++i) {
+			const addr_elem *elem = &(slh->main_list[i]);
+			if (elem->value) {
+				++ret;
+			}
+		}
+
+		if (slh->extra_list) {
+			for (i = 0; i < slh->extra_sz; ++i) {
+				addr_elem *elem = &(slh->extra_list[i]);
+				if (elem->value) {
+					++ret;
+				}
+			}
+		}
+	}
+
+	return ret;
+}
+
+static size_t addr_list_size(const addr_list_header* slh) {
+
+	size_t ret = 0;
+
+	if (slh) {
+
+		ret += ADDR_ARRAY_SIZE;
+
+		ret += slh->extra_sz;
+	}
+
+	return ret;
+}
+
 static addr_elem* addr_list_get(addr_list_header* slh, const ioa_addr* key) {
 
   if(!slh || !key) return NULL;
@@ -863,6 +905,40 @@ void ur_addr_map_foreach(ur_addr_map* map, ur_addr_map_func func) {
   }
 }
 
+size_t ur_addr_map_num_elements(const ur_addr_map* map) {
+
+	size_t ret = 0;
+
+	if (ur_addr_map_valid(map)) {
+		u32bits i = 0;
+		for (i = 0; i < ADDR_MAP_SIZE; i++) {
+
+			const addr_list_header* slh = &(map->lists[i]);
+
+			ret += addr_list_num_elements(slh);
+		}
+	}
+
+	return ret;
+}
+
+size_t ur_addr_map_size(const ur_addr_map* map) {
+
+	size_t ret = 0;
+
+	if (ur_addr_map_valid(map)) {
+		u32bits i = 0;
+		for (i = 0; i < ADDR_MAP_SIZE; i++) {
+
+			const addr_list_header* slh = &(map->lists[i]);
+
+			ret += addr_list_size(slh);
+		}
+	}
+
+	return ret;
+}
+
 ////////////////////  STRING LISTS ///////////////////////////////////
 
 typedef struct _string_list {

+ 1 - 0
src/server/ns_turn_maps.h

@@ -216,6 +216,7 @@ int ur_addr_map_del(ur_addr_map* map, ioa_addr* key,ur_addr_map_func func);
  */
 void ur_addr_map_foreach(ur_addr_map* map, ur_addr_map_func func);
 
+size_t ur_addr_map_num_elements(const ur_addr_map* map);
 size_t ur_addr_map_size(const ur_addr_map* map);
 
 //////////////// UR STRING MAP //////////////////

+ 1 - 1
src/server/ns_turn_server.c

@@ -1610,7 +1610,7 @@ static int handle_turn_refresh(turn_turnserver *server,
 
 								//Transfer socket:
 
-								ioa_socket_handle s = detach_ioa_socket(ss->client_socket,0);
+								ioa_socket_handle s = detach_ioa_socket(ss->client_socket,1);
 
 								ss->to_be_closed = 1;