diff --git a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.c b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.c index a72bfae4..23a62a43 100644 --- a/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.c +++ b/branches/2.0/doubango/tinyNET/src/ice/tnet_ice_ctx.c @@ -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); diff --git a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_session.c b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_session.c index 93784408..aa12347e 100644 --- a/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_session.c +++ b/branches/2.0/doubango/tinyNET/src/turn/tnet_turn_session.c @@ -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),