Release useless TURN allocations as soon as ICE connection checking is finished

This commit is contained in:
bossiel 2015-05-06 21:40:47 +00:00
parent 5409a375f2
commit e4438eb20e
2 changed files with 37 additions and 1 deletions

View File

@ -2008,6 +2008,7 @@ static int _tnet_ice_ctx_fsm_ConnChecking_2_ConnCheckingCompleted_X_Success(va_l
const tnet_ice_pair_t *pair_offer, *pair_answer_src, *pair_answer_dest;
const tsk_list_item_t *item;
const tnet_ice_pair_t *pair;
const tnet_ice_candidate_t *candidate;
tsk_list_t* sessions = tsk_list_create(); // for lock-free TURN sessions destroying
int ret;
@ -2048,7 +2049,7 @@ static int _tnet_ice_ctx_fsm_ConnChecking_2_ConnCheckingCompleted_X_Success(va_l
}
if (ret == 0 && pair_offer) ((tnet_ice_pair_t *)pair_offer)->is_nominated = tsk_true;
// collect all useless TURN sessions (lock-free)
// collect all useless TURN sessions (pairs)
tsk_list_foreach(item, self->candidates_pairs) {
if (!(pair = item->data) || !pair->candidate_offer || !pair->candidate_offer->turn.ss) {
continue;
@ -2061,6 +2062,32 @@ static int _tnet_ice_ctx_fsm_ConnChecking_2_ConnCheckingCompleted_X_Success(va_l
tsk_list_unlock(self->candidates_pairs);
// collect all useless TURN sessions (local candidates)
tsk_list_lock(self->candidates_local);
tsk_list_foreach(item, self->candidates_local) {
if (!(candidate = item->data) || !candidate->turn.ss) {
continue;
}
if (candidate->turn.ss != self->turn.ss_nominated_rtp && candidate->turn.ss != self->turn.ss_nominated_rtcp) {
tsk_list_push_back_data(sessions, (void**)&candidate->turn.ss);
TSK_OBJECT_SAFE_FREE(((tnet_ice_candidate_t*)candidate)->turn.ss);
}
}
tsk_list_unlock(self->candidates_local);
// collect all useless TURN sessions (remote candidates)
tsk_list_lock(self->candidates_remote);
tsk_list_foreach(item, self->candidates_remote) {
if (!(candidate = item->data) || !candidate->turn.ss) {
continue;
}
if (candidate->turn.ss != self->turn.ss_nominated_rtp && candidate->turn.ss != self->turn.ss_nominated_rtcp) {
tsk_list_push_back_data(sessions, (void**)&candidate->turn.ss);
TSK_OBJECT_SAFE_FREE(((tnet_ice_candidate_t*)candidate)->turn.ss);
}
}
tsk_list_unlock(self->candidates_remote);
// lock-free destruction
TSK_OBJECT_SAFE_FREE(sessions);

View File

@ -1315,6 +1315,15 @@ static int _tnet_turn_session_send_refresh(tnet_turn_session_t* p_self)
}
// add authentication info
tnet_stun_pkt_auth_copy(p_self->p_pkt_refresh, p_self->cred.p_usr_name, p_self->cred.p_pwd, p_self->p_pkt_alloc);
#if 0
if (p_self->u_lifetime_alloc_in_sec == 0) {
const tnet_stun_attr_vdata_t *pc_attr_nonce = tsk_null;
tnet_stun_pkt_attr_find_first(p_self->p_pkt_refresh, tnet_stun_attr_type_nonce, (const tnet_stun_attr_t**)&pc_attr_nonce);
if (pc_attr_nonce) {
pc_attr_nonce->p_data_ptr[0] = 'a';
}
}
#endif
// add attributes
ret = tnet_stun_pkt_attrs_add(p_self->p_pkt_refresh,
TNET_STUN_PKT_ATTR_ADD_LIFETIME(p_self->u_lifetime_alloc_in_sec),