working on double allocs

This commit is contained in:
mom040267 2014-07-07 06:35:32 +00:00
parent dbd1b97e57
commit b8c87ea5e8
6 changed files with 110 additions and 187 deletions

View File

@ -2761,7 +2761,7 @@ static void eventcb_bev(struct bufferevent *bev, short events, void *arg)
if (events & BEV_EVENT_EOF) {
if(server->verbose)
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"session %018llu: TCP socket closed remotely %s\n",(unsigned long long)(ss->id),sraddr);
if(s == ss->client_session.s) {
if(s == ss->client_socket) {
shutdown_client_connection(server, ss, 0, "TCP connection closed by client (callback)");
} else if(s == ss->alloc.relay_session.s) {
shutdown_client_connection(server, ss, 0, "TCP connection closed by peer (callback)");
@ -3432,10 +3432,10 @@ void turn_report_allocation_set(void *a, turn_time_t lifetime, int refresh)
turn_turnserver *server = (turn_turnserver*)ss->server;
if(server) {
ioa_engine_handle e = turn_server_get_engine(server);
if(e && e->verbose && ss->client_session.s) {
if(ss->client_session.s->ssl) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"session %018llu: %s, realm=<%s>, username=<%s>, lifetime=%lu, cipher=%s, method=%s (%s)\n", (unsigned long long)ss->id, status, (char*)ss->realm_options.name, (char*)ss->username, (unsigned long)lifetime, SSL_get_cipher(ss->client_session.s->ssl),
turn_get_ssl_method(ss->client_session.s->ssl, ss->client_session.s->orig_ctx_type),ss->client_session.s->orig_ctx_type);
if(e && e->verbose && ss->client_socket) {
if(ss->client_socket->ssl) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"session %018llu: %s, realm=<%s>, username=<%s>, lifetime=%lu, cipher=%s, method=%s (%s)\n", (unsigned long long)ss->id, status, (char*)ss->realm_options.name, (char*)ss->username, (unsigned long)lifetime, SSL_get_cipher(ss->client_socket->ssl),
turn_get_ssl_method(ss->client_socket->ssl, ss->client_socket->orig_ctx_type),ss->client_socket->orig_ctx_type);
} else {
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"session %018llu: %s, realm=<%s>, username=<%s>, lifetime=%lu\n", (unsigned long long)ss->id, status, (char*)ss->realm_options.name, (char*)ss->username, (unsigned long)lifetime);
}

View File

@ -95,7 +95,6 @@ typedef struct {
uint16_t chnum;
int wait_cycles;
int timer_cycle;
int known_mtu;
int completed;
struct event *input_ev;
struct event *input_tcp_data_ev;

View File

@ -71,9 +71,9 @@ void clear_allocation(allocation *a)
a->tcs.sz = 0;
clear_ioa_socket_session_if(a->relay_session.s, a->owner);
clear_ts_ur_session_data(&(a->relay_session));
clear_relay_endpoint_session_data(&(a->relay_session));
IOA_EVENT_DEL(a->lifetime_ev);
IOA_EVENT_DEL(a->relay_session.lifetime_ev);
/* The order is important here: */
free_turn_permission_hashtable(&(a->addr_to_perm));
@ -83,7 +83,7 @@ void clear_allocation(allocation *a)
}
}
ts_ur_session *get_relay_session(allocation *a)
relay_endpoint_session *get_relay_session(allocation *a)
{
return &(a->relay_session);
}
@ -96,9 +96,9 @@ ioa_socket_handle get_relay_socket(allocation *a)
void set_allocation_lifetime_ev(allocation *a, turn_time_t exp_time, ioa_timer_handle ev)
{
if (a) {
IOA_EVENT_DEL(a->lifetime_ev);
a->expiration_time = exp_time;
a->lifetime_ev = ev;
IOA_EVENT_DEL(a->relay_session.lifetime_ev);
a->relay_session.expiration_time = exp_time;
a->relay_session.lifetime_ev = ev;
}
}

View File

@ -45,26 +45,16 @@ extern "C" {
#define TCP_PEER_CONN_TIMEOUT (30)
#define TCP_CONN_BIND_TIMEOUT (30)
///////// types ////////////
enum _UR_STATE {
UR_STATE_UNKNOWN=0,
UR_STATE_READY,
UR_STATE_DONE
};
typedef enum _UR_STATE UR_STATE;
////////////// Network session ////////////////
typedef struct
{
UR_STATE state;
ioa_socket_handle s;
int known_mtu;
} ts_ur_session;
turn_time_t expiration_time;
ioa_timer_handle lifetime_ev;
} relay_endpoint_session;
static inline void clear_ts_ur_session_data(ts_ur_session* cdi)
static inline void clear_relay_endpoint_session_data(relay_endpoint_session* cdi)
{
if (cdi)
IOA_CLOSE_SOCKET(cdi->s);
@ -178,10 +168,8 @@ typedef struct _turn_permission_hashtable {
typedef struct _allocation {
int is_valid;
stun_tid tid;
turn_time_t expiration_time;
ioa_timer_handle lifetime_ev;
turn_permission_hashtable addr_to_perm;
ts_ur_session relay_session;
relay_endpoint_session relay_session;
ch_map chns; /* chnum-to-ch_info* */
void *owner; //ss
ur_map *tcp_connections; //global (per turn server) reference
@ -213,7 +201,7 @@ ch_info* allocation_get_new_ch_info(allocation* a, u16bits chnum, ioa_addr* peer
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);
ts_ur_session *get_relay_session(allocation *a);
relay_endpoint_session *get_relay_session(allocation *a);
ioa_socket_handle get_relay_socket(allocation *a);
tcp_connection *get_and_clean_tcp_connection_by_id(ur_map *map, tcp_connection_id id);

View File

@ -103,7 +103,7 @@ static int write_client_connection(turn_turnserver *server, ts_ur_super_session*
static void tcp_peer_accept_connection(ioa_socket_handle s, void *arg);
static int read_client_connection(turn_turnserver *server, ts_ur_session *elem,
static int read_client_connection(turn_turnserver *server,
ts_ur_super_session *ss, ioa_net_data *in_buffer,
int can_resume, int count_usage);
@ -210,8 +210,8 @@ static int is_rfc5780(turn_turnserver *server)
static int get_other_address(turn_turnserver *server, ts_ur_super_session *ss, ioa_addr *alt_addr)
{
if(is_rfc5780(server) && ss && ss->client_session.s) {
int ret = server->alt_addr_cb(get_local_addr_from_ioa_socket(ss->client_session.s), alt_addr);
if(is_rfc5780(server) && ss && ss->client_socket) {
int ret = server->alt_addr_cb(get_local_addr_from_ioa_socket(ss->client_socket), alt_addr);
return ret;
}
@ -308,7 +308,7 @@ allocation* get_allocation_ss(ts_ur_super_session *ss) {
return &(ss->alloc);
}
static inline ts_ur_session *get_relay_session_ss(ts_ur_super_session *ss)
static inline relay_endpoint_session *get_relay_session_ss(ts_ur_super_session *ss)
{
return &(ss->alloc.relay_session);
}
@ -401,12 +401,12 @@ int turn_session_info_copy_from(struct turn_session_info* tsi, ts_ur_super_sessi
tsi->start_time = ss->start_time;
tsi->valid = is_allocation_valid(&(ss->alloc)) && !(ss->to_be_closed) && (ss->quota_used);
if(tsi->valid) {
tsi->expiration_time = ss->alloc.expiration_time;
if(ss->client_session.s) {
tsi->client_protocol = get_ioa_socket_type(ss->client_session.s);
addr_cpy(&(tsi->local_addr_data.addr),get_local_addr_from_ioa_socket(ss->client_session.s));
tsi->expiration_time = ss->alloc.relay_session.expiration_time;
if(ss->client_socket) {
tsi->client_protocol = get_ioa_socket_type(ss->client_socket);
addr_cpy(&(tsi->local_addr_data.addr),get_local_addr_from_ioa_socket(ss->client_socket));
addr_to_string(&(tsi->local_addr_data.addr),(u08bits*)tsi->local_addr_data.saddr);
addr_cpy(&(tsi->remote_addr_data.addr),get_remote_addr_from_ioa_socket(ss->client_session.s));
addr_cpy(&(tsi->remote_addr_data.addr),get_remote_addr_from_ioa_socket(ss->client_socket));
addr_to_string(&(tsi->remote_addr_data.addr),(u08bits*)tsi->remote_addr_data.saddr);
}
if(ss->alloc.relay_session.s) {
@ -418,8 +418,8 @@ int turn_session_info_copy_from(struct turn_session_info* tsi, ts_ur_super_sessi
}
STRCPY(tsi->username,ss->username);
tsi->enforce_fingerprints = ss->enforce_fingerprints;
STRCPY(tsi->tls_method, get_ioa_socket_tls_method(ss->client_session.s));
STRCPY(tsi->tls_cipher, get_ioa_socket_tls_cipher(ss->client_session.s));
STRCPY(tsi->tls_method, get_ioa_socket_tls_method(ss->client_socket));
STRCPY(tsi->tls_cipher, get_ioa_socket_tls_cipher(ss->client_socket));
STRCPY(tsi->realm, ss->realm_options.name);
STRCPY(tsi->origin, ss->origin);
@ -712,7 +712,7 @@ static void delete_ur_map_ss(void *p) {
if (p) {
ts_ur_super_session* ss = (ts_ur_super_session*) p;
delete_session_from_map(ss);
clear_ts_ur_session_data(&(ss->client_session));
IOA_CLOSE_SOCKET(ss->client_socket);
clear_allocation(get_allocation_ss(ss));
IOA_EVENT_DEL(ss->to_be_allocated_timeout_ev);
turn_free(p,sizeof(ts_ur_super_session));
@ -726,8 +726,8 @@ static int turn_server_remove_all_from_ur_map_ss(ts_ur_super_session* ss) {
return 0;
else {
int ret = 0;
if (ss->client_session.s) {
clear_ioa_socket_session_if(ss->client_session.s, ss);
if (ss->client_socket) {
clear_ioa_socket_session_if(ss->client_socket, ss);
}
if (get_relay_socket_ss(ss)) {
clear_ioa_socket_session_if(get_relay_socket_ss(ss), ss);
@ -856,8 +856,6 @@ static int handle_turn_allocate(turn_turnserver *server,
allocation* a = get_allocation_ss(ss);
ts_ur_session* elem = &(ss->client_session);
if (is_allocation_valid(a)) {
if (!stun_tid_equals(tid, &(a->tid))) {
@ -877,8 +875,8 @@ static int handle_turn_allocate(turn_turnserver *server,
stun_set_allocate_response_str(ioa_network_buffer_data(nbh), &len,
tid,
&xor_relayed_addr,
get_remote_addr_from_ioa_socket(elem->s),
(a->expiration_time - server->ctime), 0, NULL, 0,
get_remote_addr_from_ioa_socket(ss->client_socket),
(a->relay_session.expiration_time - server->ctime), 0, NULL, 0,
ss->s_mobile_id);
ioa_network_buffer_set_size(nbh,len);
*resp_constructed = 1;
@ -957,8 +955,8 @@ static int handle_turn_allocate(turn_turnserver *server,
} else if((transport == STUN_ATTRIBUTE_TRANSPORT_UDP_VALUE) && *(server->no_udp_relay)) {
*err_code = 403;
*reason = (const u08bits *)"UDP Transport is not allowed by the TURN Server configuration";
} else if(ss->client_session.s) {
SOCKET_TYPE cst = get_ioa_socket_type(ss->client_session.s);
} else if(ss->client_socket) {
SOCKET_TYPE cst = get_ioa_socket_type(ss->client_socket);
if((transport == STUN_ATTRIBUTE_TRANSPORT_TCP_VALUE) &&
(cst!=TCP_SOCKET) && (cst!=TLS_SOCKET)) {
*err_code = 400;
@ -1149,7 +1147,7 @@ static int handle_turn_allocate(turn_turnserver *server,
stun_set_allocate_response_str(ioa_network_buffer_data(nbh), &len, tid,
&xor_relayed_addr,
get_remote_addr_from_ioa_socket(elem->s), lifetime,
get_remote_addr_from_ioa_socket(ss->client_socket), lifetime,
0,NULL,
out_reservation_token,
ss->s_mobile_id);
@ -1301,7 +1299,7 @@ static int handle_turn_refresh(turn_turnserver *server,
if(tsid != server->id) {
if(server->send_socket_to_relay) {
ioa_socket_handle new_s = detach_ioa_socket(ss->client_session.s,1);
ioa_socket_handle new_s = detach_ioa_socket(ss->client_socket,1);
if(new_s) {
if(server->send_socket_to_relay(tsid, mid, tid, new_s, message_integrity,
RMT_MOBILE_SOCKET, in_buffer, can_resume)<0) {
@ -1334,10 +1332,10 @@ static int handle_turn_refresh(turn_turnserver *server,
} else if(!(orig_ss->is_mobile)) {
*err_code = 500;
*reason = (const u08bits *)"Software error: invalid mobile allocation";
} else if(orig_ss->client_session.s == ss->client_session.s) {
} else if(orig_ss->client_socket == ss->client_socket) {
*err_code = 500;
*reason = (const u08bits *)"Software error: invalid mobile client socket (orig)";
} else if(!(ss->client_session.s)) {
} else if(!(ss->client_socket)) {
*err_code = 500;
*reason = (const u08bits *)"Software error: invalid mobile client socket (new)";
} else {
@ -1379,7 +1377,7 @@ static int handle_turn_refresh(turn_turnserver *server,
//Transfer socket:
ioa_socket_handle s = detach_ioa_socket(ss->client_session.s,0);
ioa_socket_handle s = detach_ioa_socket(ss->client_socket,0);
ss->to_be_closed = 1;
@ -1965,7 +1963,7 @@ static int handle_turn_connection_bind(turn_turnserver *server,
*err_code = 400;
*reason = (const u08bits *)"Bad request: CONNECTION_BIND cannot be issued after allocation";
} else if((get_ioa_socket_type(ss->client_session.s)!=TCP_SOCKET) && (get_ioa_socket_type(ss->client_session.s)!=TLS_SOCKET)) {
} else if((get_ioa_socket_type(ss->client_socket)!=TCP_SOCKET) && (get_ioa_socket_type(ss->client_socket)!=TLS_SOCKET)) {
*err_code = 400;
*reason = (const u08bits *)"Bad request: CONNECTION_BIND only possible with TCP/TLS";
@ -2014,7 +2012,7 @@ static int handle_turn_connection_bind(turn_turnserver *server,
} else {
if(server->send_socket_to_relay) {
turnserver_id sid = (id & 0xFF000000)>>24;
ioa_socket_handle s = ss->client_session.s;
ioa_socket_handle s = ss->client_socket;
if(s) {
ioa_socket_handle new_s = detach_ioa_socket(s,1);
if(new_s) {
@ -2035,7 +2033,7 @@ static int handle_turn_connection_bind(turn_turnserver *server,
}
}
if (!(*resp_constructed) && ss->client_session.s && !ioa_socket_tobeclosed(ss->client_session.s)) {
if (!(*resp_constructed) && ss->client_socket && !ioa_socket_tobeclosed(ss->client_socket)) {
if (!(*err_code)) {
*err_code = 437;
@ -2326,15 +2324,15 @@ static int handle_turn_channel_bind(turn_turnserver *server,
*resp_constructed = 1;
if(!(ss->is_mobile)) {
if(get_ioa_socket_type(ss->client_session.s) == UDP_SOCKET ||
get_ioa_socket_type(ss->client_session.s) == TCP_SOCKET) {
if(get_ioa_socket_type(ss->client_socket) == UDP_SOCKET ||
get_ioa_socket_type(ss->client_socket) == TCP_SOCKET) {
if(get_ioa_socket_type(ss->alloc.relay_session.s) == UDP_SOCKET) {
chn->kernel_channel = CREATE_TURN_CHANNEL_KERNEL(chn->chnum,
get_ioa_socket_address_family(ss->client_session.s),
get_ioa_socket_address_family(ss->client_socket),
get_ioa_socket_address_family(ss->alloc.relay_session.s),
(get_ioa_socket_type(ss->client_session.s)==UDP_SOCKET ? IPPROTO_UDP : IPPROTO_TCP),
&(get_remote_addr_from_ioa_socket(ss->client_session.s)->ss),
&(get_local_addr_from_ioa_socket(ss->client_session.s)->ss),
(get_ioa_socket_type(ss->client_socket)==UDP_SOCKET ? IPPROTO_UDP : IPPROTO_TCP),
&(get_remote_addr_from_ioa_socket(ss->client_socket)->ss),
&(get_local_addr_from_ioa_socket(ss->client_socket)->ss),
&(get_local_addr_from_ioa_socket(ss->alloc.relay_session.s)),
&(get_remote_addr_from_ioa_socket(ss->alloc.relay_session.s))
);
@ -2359,16 +2357,15 @@ static int handle_turn_binding(turn_turnserver *server,
u32bits cookie, int old_stun) {
FUNCSTART;
ts_ur_session* elem = &(ss->client_session);
int change_ip = 0;
int change_port = 0;
int padding = 0;
int response_port_present = 0;
u16bits response_port = 0;
SOCKET_TYPE st = get_ioa_socket_type(ss->client_session.s);
SOCKET_TYPE st = get_ioa_socket_type(ss->client_socket);
int use_reflected_from = 0;
if(!(ss->client_session.s))
if(!(ss->client_socket))
return -1;
*origin_changed = 0;
@ -2466,20 +2463,20 @@ static int handle_turn_binding(turn_turnserver *server,
;
} else if(ss->client_session.s) {
} else if(ss->client_socket) {
size_t len = ioa_network_buffer_get_size(nbh);
if (stun_set_binding_response_str(ioa_network_buffer_data(nbh), &len, tid,
get_remote_addr_from_ioa_socket(elem->s), 0, NULL, cookie, old_stun) >= 0) {
get_remote_addr_from_ioa_socket(ss->client_socket), 0, NULL, cookie, old_stun) >= 0) {
addr_cpy(response_origin, get_local_addr_from_ioa_socket(ss->client_session.s));
addr_cpy(response_origin, get_local_addr_from_ioa_socket(ss->client_socket));
*resp_constructed = 1;
if(old_stun && use_reflected_from) {
stun_attr_add_addr_str(ioa_network_buffer_data(nbh), &len,
OLD_STUN_ATTRIBUTE_REFLECTED_FROM,
get_remote_addr_from_ioa_socket(ss->client_session.s));
get_remote_addr_from_ioa_socket(ss->client_socket));
}
if(!is_rfc5780(server)) {
@ -2494,13 +2491,13 @@ static int handle_turn_binding(turn_turnserver *server,
STUN_ATTRIBUTE_RESPONSE_ORIGIN, response_origin);
}
} else if(ss->client_session.s) {
} else if(ss->client_socket) {
ioa_addr other_address;
if(get_other_address(server,ss,&other_address) == 0) {
addr_cpy(response_destination, get_remote_addr_from_ioa_socket(ss->client_session.s));
addr_cpy(response_destination, get_remote_addr_from_ioa_socket(ss->client_socket));
if(change_ip) {
*origin_changed = 1;
@ -2534,7 +2531,7 @@ static int handle_turn_binding(turn_turnserver *server,
}
if(padding) {
int mtu = get_local_mtu_ioa_socket(ss->client_session.s);
int mtu = get_local_mtu_ioa_socket(ss->client_socket);
if(mtu<68)
mtu=1500;
@ -2856,9 +2853,8 @@ static void resume_processing_after_username_check(int success, hmackey_t hmack
if(server && in_buffer && in_buffer->nbh) {
ts_ur_super_session *ss = get_session_from_map(server,(turnsession_id)ctxkey);
if(ss && ss->client_session.s) {
if(ss && ss->client_socket) {
turn_turnserver *server = (turn_turnserver *)ss->server;
ts_ur_session *elem = &(ss->client_session);
if(success) {
ns_bcopy(hmackey,ss->hmackey,sizeof(hmackey_t));
@ -2866,9 +2862,9 @@ static void resume_processing_after_username_check(int success, hmackey_t hmack
ns_bcopy(pwd,ss->pwd,sizeof(st_password_t));
}
read_client_connection(server,elem,ss,in_buffer,0,0);
read_client_connection(server,ss,in_buffer,0,0);
close_ioa_socket_after_processing_if_necessary(ss->client_session.s);
close_ioa_socket_after_processing_if_necessary(ss->client_socket);
ioa_network_buffer_delete(server->e, in_buffer->nbh);
in_buffer->nbh=NULL;
@ -3018,7 +3014,7 @@ static int check_stun_auth(turn_turnserver *server,
}
} else {
STRCPY(ss->username,usname);
set_username_hash(ss->client_session.s,ss->username,(u08bits*)ss->realm_options.name);
set_username_hash(ss->client_socket,ss->username,(u08bits*)ss->realm_options.name);
}
if(server->ct != TURN_CREDENTIALS_SHORT_TERM) {
@ -3173,7 +3169,7 @@ static int handle_turn_command(turn_turnserver *server, ts_ur_super_session *ss,
int no_response = 0;
int message_integrity = 0;
if(!(ss->client_session.s))
if(!(ss->client_socket))
return -1;
u16bits unknown_attrs[MAX_NUMBER_OF_UNKNOWN_ATTRS];
@ -3212,7 +3208,7 @@ static int handle_turn_command(turn_turnserver *server, ts_ur_super_session *ss,
if(method == STUN_METHOD_ALLOCATE) {
SOCKET_TYPE cst = get_ioa_socket_type(ss->client_session.s);
SOCKET_TYPE cst = get_ioa_socket_type(ss->client_socket);
turn_server_addrs_list_t *asl = server->alternate_servers_list;
if(((cst == UDP_SOCKET)||(cst == DTLS_SOCKET)) && server->self_udp_balance &&
@ -3225,7 +3221,7 @@ static int handle_turn_command(turn_turnserver *server, ts_ur_super_session *ss,
if(asl && asl->size) {
turn_mutex_lock(&(asl->m));
set_alternate_server(asl,get_local_addr_from_ioa_socket(ss->client_session.s),&(server->as_counter),method,&tid,resp_constructed,&err_code,&reason,nbh);
set_alternate_server(asl,get_local_addr_from_ioa_socket(ss->client_socket),&(server->as_counter),method,&tid,resp_constructed,&err_code,&reason,nbh);
turn_mutex_unlock(&(asl->m));
}
}
@ -3447,7 +3443,7 @@ static int handle_turn_command(turn_turnserver *server, ts_ur_super_session *ss,
}
}
if(ss->to_be_closed || !(ss->client_session.s) || ioa_socket_tobeclosed(ss->client_session.s))
if(ss->to_be_closed || !(ss->client_socket) || ioa_socket_tobeclosed(ss->client_socket))
return 0;
if (ua_num > 0) {
@ -3683,24 +3679,22 @@ int shutdown_client_connection(turn_turnserver *server, ts_ur_super_session *ss,
if (!ss)
return -1;
ts_ur_session* elem = &(ss->client_session);
report_turn_session_info(server,ss,1);
dec_quota(ss);
if(!force && ss->is_mobile) {
if (elem->s && server->verbose) {
if (ss->client_socket && server->verbose) {
char sraddr[129]="\0";
char sladdr[129]="\0";
addr_to_string(get_remote_addr_from_ioa_socket(elem->s),(u08bits*)sraddr);
addr_to_string(get_local_addr_from_ioa_socket(elem->s),(u08bits*)sladdr);
addr_to_string(get_remote_addr_from_ioa_socket(ss->client_socket),(u08bits*)sraddr);
addr_to_string(get_local_addr_from_ioa_socket(ss->client_socket),(u08bits*)sladdr);
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "session %018llu: closed (1st stage), user <%s> realm <%s> origin <%s>, local %s, remote %s, reason: %s\n",(unsigned long long)(ss->id),(char*)ss->username,(char*)ss->realm_options.name,(char*)ss->origin, sladdr,sraddr,reason);
}
IOA_CLOSE_SOCKET(elem->s);
IOA_CLOSE_SOCKET(ss->client_socket);
FUNCEND;
@ -3709,30 +3703,12 @@ int shutdown_client_connection(turn_turnserver *server, ts_ur_super_session *ss,
if (eve(server->verbose)) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,
"closing session 0x%lx, client socket 0x%lx in state %ld (socket session=0x%lx)\n",
"closing session 0x%lx, client socket 0x%lx (socket session=0x%lx)\n",
(long) ss,
(long) elem->s,
(long) (elem->state),
(long)get_ioa_socket_session(elem->s));
(long) ss->client_socket,
(long)get_ioa_socket_session(ss->client_socket));
}
if (elem->state == UR_STATE_DONE) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,
"!!! closing session 0x%lx, client session 0x%lx in DONE state\n",
(long)ss, (long) elem);
return -1;
}
elem->state = UR_STATE_DONE;
if (ss->alloc.relay_session.state == UR_STATE_DONE) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,
"!!! closing session 0x%lx, relay session 0x%lx in DONE state\n",
(long)ss, (long)&(ss->alloc.relay_session));
return -1;
}
ss->alloc.relay_session.state = UR_STATE_DONE;
if (server->disconnect)
server->disconnect(ss);
@ -3740,14 +3716,14 @@ int shutdown_client_connection(turn_turnserver *server, ts_ur_super_session *ss,
char sraddr[129]="\0";
char sladdr[129]="\0";
addr_to_string(get_remote_addr_from_ioa_socket(elem->s),(u08bits*)sraddr);
addr_to_string(get_local_addr_from_ioa_socket(elem->s),(u08bits*)sladdr);
addr_to_string(get_remote_addr_from_ioa_socket(ss->client_socket),(u08bits*)sraddr);
addr_to_string(get_local_addr_from_ioa_socket(ss->client_socket),(u08bits*)sladdr);
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "session %018llu: closed (2nd stage), user <%s> realm <%s> origin <%s>, local %s, remote %s, reason: %s\n",
(unsigned long long)(ss->id), (char*)ss->username,(char*)ss->realm_options.name,(char*)ss->origin, sladdr,sraddr, reason);
}
IOA_CLOSE_SOCKET(elem->s);
IOA_CLOSE_SOCKET(ss->client_socket);
IOA_CLOSE_SOCKET(ss->alloc.relay_session.s);
turn_server_remove_all_from_ur_map_ss(ss);
@ -3776,18 +3752,18 @@ static void client_to_be_allocated_timeout_handler(ioa_engine_handle e,
int to_close = 0;
ioa_socket_handle s = ss->client_session.s;
ioa_socket_handle s = ss->client_socket;
if(!s || ioa_socket_tobeclosed(s)) {
to_close = 1;
} else {
ioa_socket_handle rs = ss->alloc.relay_session.s;
if(!rs || ioa_socket_tobeclosed(rs)) {
to_close = 1;
} else if(ss->alloc.relay_session.state == UR_STATE_DONE) {
} else if(ss->alloc.relay_session.s == NULL) {
to_close = 1;
} else if(ss->client_session.state == UR_STATE_DONE) {
} else if(ss->client_socket == NULL) {
to_close = 1;
} else if(!(ss->alloc.lifetime_ev)) {
} else if(!(ss->alloc.relay_session.lifetime_ev)) {
to_close = 1;
} else if(!(ss->to_be_allocated_timeout_ev)) {
to_close = 1;
@ -3806,9 +3782,7 @@ static int write_client_connection(turn_turnserver *server, ts_ur_super_session*
FUNCSTART;
ts_ur_session* elem = &(ss->client_session);
if (elem->state != UR_STATE_READY) {
if (!(ss->client_socket)) {
ioa_network_buffer_delete(server->e, nbh);
FUNCEND;
return -1;
@ -3821,10 +3795,10 @@ static int write_client_connection(turn_turnserver *server, ts_ur_super_session*
if (eve(server->verbose)) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,
"%s: prepare to write to s 0x%lx\n", __FUNCTION__,
(long) (elem->s));
(long) (ss->client_socket));
}
int ret = send_data_from_ioa_socket_nbh(elem->s, NULL, nbh, ttl, tos);
int ret = send_data_from_ioa_socket_nbh(ss->client_socket, NULL, nbh, ttl, tos);
FUNCEND;
return ret;
@ -3866,14 +3840,14 @@ static int create_relay_connection(turn_turnserver* server,
int *err_code, const u08bits **reason,
accept_cb acb) {
if (server && ss && ss->client_session.s) {
if (server && ss && ss->client_socket) {
allocation* a = get_allocation_ss(ss);
ts_ur_session* newelem = get_relay_session_ss(ss);
relay_endpoint_session* newelem = get_relay_session_ss(ss);
IOA_CLOSE_SOCKET(newelem->s);
ns_bzero(newelem, sizeof(ts_ur_session));
ns_bzero(newelem, sizeof(relay_endpoint_session));
newelem->s = NULL;
ioa_socket_handle rtcp_s = NULL;
@ -3900,7 +3874,7 @@ static int create_relay_connection(turn_turnserver* server,
} else {
int res = create_relay_ioa_sockets(server->e,
ss->client_session.s,
ss->client_socket,
address_family, transport,
even_port, &(newelem->s), &rtcp_s, out_reservation_token,
err_code, reason, acb, ss);
@ -3937,11 +3911,9 @@ static int create_relay_connection(turn_turnserver* server,
}
}
newelem->state = UR_STATE_READY;
/* RFC6156: do not use DF when IPv6 is involved: */
if((get_local_addr_from_ioa_socket(newelem->s)->ss.sa_family == AF_INET6) ||
(get_local_addr_from_ioa_socket(ss->client_session.s)->ss.sa_family == AF_INET6))
(get_local_addr_from_ioa_socket(ss->client_socket)->ss.sa_family == AF_INET6))
set_do_not_use_df(newelem->s);
if(get_ioa_socket_type(newelem->s) != TCP_SOCKET) {
@ -3999,7 +3971,7 @@ static int refresh_relay_connection(turn_turnserver* server,
static void write_http_echo(turn_turnserver *server, ts_ur_super_session *ss)
{
if(server && ss && ss->client_session.s && !(ss->to_be_closed)) {
if(server && ss && ss->client_socket && !(ss->to_be_closed)) {
ioa_network_buffer_handle nbh_http = ioa_network_buffer_allocate(server->e);
size_t len_http = ioa_network_buffer_get_size(nbh_http);
u08bits *data = ioa_network_buffer_data(nbh_http);
@ -4011,22 +3983,17 @@ static void write_http_echo(turn_turnserver *server, ts_ur_super_session *ss)
len_http = strlen(data_http);
ns_bcopy(data_http,data,len_http);
ioa_network_buffer_set_size(nbh_http,len_http);
send_data_from_ioa_socket_nbh(ss->client_session.s, NULL, nbh_http, TTL_IGNORE, TOS_IGNORE);
send_data_from_ioa_socket_nbh(ss->client_socket, NULL, nbh_http, TTL_IGNORE, TOS_IGNORE);
}
}
static int read_client_connection(turn_turnserver *server, ts_ur_session *elem,
static int read_client_connection(turn_turnserver *server,
ts_ur_super_session *ss, ioa_net_data *in_buffer,
int can_resume, int count_usage) {
FUNCSTART;
if (!server || !elem || !ss || !in_buffer) {
FUNCEND;
return -1;
}
if (elem->state != UR_STATE_READY) {
if (!server || !ss || !in_buffer || !(ss->client_socket)) {
FUNCEND;
return -1;
}
@ -4055,7 +4022,7 @@ static int read_client_connection(turn_turnserver *server, ts_ur_session *elem,
size_t blen = ioa_network_buffer_get_size(in_buffer->nbh);
size_t orig_blen = blen;
SOCKET_TYPE st = get_ioa_socket_type(ss->client_session.s);
SOCKET_TYPE st = get_ioa_socket_type(ss->client_socket);
int is_padding_mandatory = ((st == TCP_SOCKET)||(st==TLS_SOCKET)||(st==TENTATIVE_TCP_SOCKET));
if (stun_is_channel_message_str(ioa_network_buffer_data(in_buffer->nbh),
@ -4097,7 +4064,7 @@ static int read_client_connection(turn_turnserver *server, ts_ur_session *elem,
if((method != STUN_METHOD_BINDING) && (method != STUN_METHOD_SEND))
report_turn_session_info(server,ss,0);
if(ss->to_be_closed || ioa_socket_tobeclosed(ss->client_session.s)) {
if(ss->to_be_closed || ioa_socket_tobeclosed(ss->client_socket)) {
FUNCEND;
ioa_network_buffer_delete(server->e, nbh);
return 0;
@ -4143,7 +4110,7 @@ static int read_client_connection(turn_turnserver *server, ts_ur_session *elem,
}
} else {
SOCKET_TYPE st = get_ioa_socket_type(ss->client_session.s);
SOCKET_TYPE st = get_ioa_socket_type(ss->client_socket);
if((st == TCP_SOCKET)||(st==TLS_SOCKET)||(st==TENTATIVE_TCP_SOCKET)) {
if(is_http_get((char*)ioa_network_buffer_data(in_buffer->nbh), ioa_network_buffer_get_size(in_buffer->nbh)))
write_http_echo(server,ss);
@ -4163,22 +4130,16 @@ static int attach_socket_to_session(turn_turnserver* server, ioa_socket_handle s
if(s && server && ss) {
if(ss->client_session.s != s) {
if(ss->client_socket != s) {
ts_ur_session *newelem = &(ss->client_session);
IOA_CLOSE_SOCKET(ss->client_socket);
if(newelem->s) {
IOA_CLOSE_SOCKET(newelem->s);
}
ss->client_socket = s;
newelem->s = s;
register_callback_on_ioa_socket(server->e, newelem->s, IOA_EV_READ,
register_callback_on_ioa_socket(server->e, s, IOA_EV_READ,
client_input_handler, ss, 0);
set_ioa_socket_session(newelem->s, ss);
newelem->state = UR_STATE_READY;
set_ioa_socket_session(s, ss);
}
ret = 0;
@ -4200,16 +4161,12 @@ int open_client_connection_session(turn_turnserver* server,
ts_ur_super_session* ss = create_new_ss(server);
ts_ur_session *newelem = &(ss->client_session);
ss->client_socket = sm->s;
newelem->s = sm->s;
register_callback_on_ioa_socket(server->e, newelem->s, IOA_EV_READ,
register_callback_on_ioa_socket(server->e, ss->client_socket, IOA_EV_READ,
client_input_handler, ss, 0);
set_ioa_socket_session(newelem->s, ss);
newelem->state = UR_STATE_READY;
set_ioa_socket_session(ss->client_socket, ss);
int at = TURN_MAX_ALLOCATE_TIMEOUT;
if(*(server->stun_only))
@ -4222,7 +4179,7 @@ int open_client_connection_session(turn_turnserver* server,
"client_to_be_allocated_timeout_handler");
if(sm->nd.nbh) {
client_input_handler(newelem->s,IOA_EV_READ,&(sm->nd),ss,sm->can_resume);
client_input_handler(ss->client_socket,IOA_EV_READ,&(sm->nd),ss,sm->can_resume);
ioa_network_buffer_delete(server->e, sm->nd.nbh);
sm->nd.nbh = NULL;
}
@ -4256,7 +4213,7 @@ static void peer_input_handler(ioa_socket_handle s, int event_type,
return;
}
ts_ur_session* elem = get_relay_session_ss(ss);
relay_endpoint_session* elem = get_relay_session_ss(ss);
if (elem->s == NULL) {
return;
}
@ -4295,7 +4252,7 @@ static void peer_input_handler(ioa_socket_handle s, int event_type,
ioa_network_buffer_header_init(nbh);
SOCKET_TYPE st = get_ioa_socket_type(ss->client_session.s);
SOCKET_TYPE st = get_ioa_socket_type(ss->client_socket);
int do_padding = ((st == TCP_SOCKET)||(st==TLS_SOCKET)||(st==TENTATIVE_TCP_SOCKET));
stun_init_channel_message_str(chnum, ioa_network_buffer_data(nbh), &len, len, do_padding);
@ -4365,34 +4322,13 @@ static void client_input_handler(ioa_socket_handle s, int event_type,
return;
}
ts_ur_session* elem = &(ss->client_session);
if (elem->s == NULL) {
if (ss->client_socket != s) {
return;
}
int ret = 0;
read_client_connection(server, ss, data, can_resume, 1);
switch (elem->state) {
case UR_STATE_READY:
read_client_connection(server, elem, ss, data, can_resume, 1);
break;
case UR_STATE_DONE:
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,
"!!! %s: Trying to read from closed socket: s=0x%lx\n",
__FUNCTION__, (long) (elem->s));
break;
default:
ret = -1;
}
if (ret < 0) {
if(server->verbose) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR,
"session %018llu: client socket error in client handler: s=0x%lx\n", (unsigned long long)(ss->id), (long) (elem->s));
}
set_ioa_socket_tobeclosed(s);
} else if (ss->to_be_closed) {
if (ss->to_be_closed) {
if(server->verbose) {
TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,
"session %018llu: client socket to be closed in client handler: ss=0x%lx\n", (unsigned long long)(ss->id), (long)ss);

View File

@ -69,7 +69,7 @@ struct _ts_ur_super_session {
void* server;
turnsession_id id;
turn_time_t start_time;
ts_ur_session client_session;
ioa_socket_handle client_socket;
allocation alloc;
ioa_timer_handle to_be_allocated_timeout_ev;
u08bits nonce[NONCE_MAX_SIZE];