diff --git a/src/apps/relay/dtls_listener.c b/src/apps/relay/dtls_listener.c index e763f49..a68aad0 100644 --- a/src/apps/relay/dtls_listener.c +++ b/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 ); } diff --git a/src/apps/relay/ns_ioalib_engine_impl.c b/src/apps/relay/ns_ioalib_engine_impl.c index e834ec3..626f74d 100644 --- a/src/apps/relay/ns_ioalib_engine_impl.c +++ b/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 { diff --git a/src/apps/relay/ns_ioalib_impl.h b/src/apps/relay/ns_ioalib_impl.h index 198e7d9..998860a 100644 --- a/src/apps/relay/ns_ioalib_impl.h +++ b/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; diff --git a/src/apps/relay/tls_listener.c b/src/apps/relay/tls_listener.c index 53a605e..03208b4 100644 --- a/src/apps/relay/tls_listener.c +++ b/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; diff --git a/src/server/ns_turn_maps.c b/src/server/ns_turn_maps.c index 7fc1bc7..623e753 100644 --- a/src/server/ns_turn_maps.c +++ b/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 { diff --git a/src/server/ns_turn_maps.h b/src/server/ns_turn_maps.h index 3a873aa..636e7aa 100644 --- a/src/server/ns_turn_maps.h +++ b/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 ////////////////// diff --git a/src/server/ns_turn_server.c b/src/server/ns_turn_server.c index 1b45e2e..f128fcb 100644 --- a/src/server/ns_turn_server.c +++ b/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;