Merge remote-tracking branch 'origin/dev_ice_defered_response'

This commit is contained in:
Simon Morlat 2017-09-16 11:01:04 +02:00
commit ed5f18e32b
4 changed files with 46 additions and 1 deletions

View file

@ -688,6 +688,13 @@ static void call_paused_by_remote(LinphoneCore *lc, LinphoneCall *call){
static void call_updated_by_remote(LinphoneCore *lc, LinphoneCall *call){
linphone_core_notify_display_status(lc,_("Call is updated by remote."));
linphone_call_set_state(call, LinphoneCallUpdatedByRemote,"Call updated by remote");
if (call->ice_session && check_ice_reinvite_needs_defered_response(call)){
call->defer_update = TRUE;
ms_message("LinphoneCall [%p]: Ice reinvite received, but one or more check list are not completed. Response will be sent later, once ICE has completed.", call);
call->incoming_ice_reinvite_pending = TRUE;
}
if (call->defer_update == FALSE){
if (call->state == LinphoneCallUpdatedByRemote){
linphone_call_accept_update(call, NULL);

View file

@ -4662,7 +4662,7 @@ static void handle_ice_events(LinphoneCall *call, OrtpEvent *ev){
switch (ice_session_state(call->ice_session)) {
case IS_Completed:
case IS_Failed:
/* At least one ICE session has succeeded, so perform a call update. */
/* At least one ICE check list has succeeded, so perform a call update. */
if (ice_session_has_completed_check_list(call->ice_session) == TRUE) {
const LinphoneCallParams *current_param = linphone_call_get_current_params(call);
if (ice_session_role(call->ice_session) == IR_Controlling && current_param->update_call_when_ice_completed ) {
@ -4670,6 +4670,9 @@ static void handle_ice_events(LinphoneCall *call, OrtpEvent *ev){
params->internal_call_update = TRUE;
linphone_call_update(call, params);
linphone_call_params_unref(params);
}else if (ice_session_role(call->ice_session) == IR_Controlled && call->incoming_ice_reinvite_pending){
linphone_call_accept_update(call, NULL);
call->incoming_ice_reinvite_pending = FALSE;
}
start_dtls_on_all_streams(call);
}

View file

@ -813,6 +813,7 @@ void linphone_call_stop_ice_for_inactive_streams(LinphoneCall *call, SalMediaDes
linphone_call_update_ice_state_in_call_stats(call);
}
void _update_local_media_description_from_ice(SalMediaDescription *desc, IceSession *session, bool_t use_nortpproxy) {
IceCandidate *rtp_candidate = NULL;
IceCandidate *rtcp_candidate = NULL;
@ -1684,6 +1685,38 @@ static bool_t _check_for_ice_restart_and_set_remote_credentials(IceSession *ice_
return ice_restarted;
}
/*the purpose of this function is to detect a situation where a check list is still running while a reINVITE
with remote-candidates is received*/
bool_t check_ice_reinvite_needs_defered_response(LinphoneCall *call){
SalMediaDescription *md = sal_call_get_remote_media_description(call->op);
int i,j;
IceCheckList *cl;
if (ice_session_state(call->ice_session) != IS_Running ) return FALSE;
for (i = 0; i < md->nb_streams; i++) {
SalStreamDescription *stream = &md->streams[i];
cl = ice_session_check_list(call->ice_session, i);
if (cl==NULL) continue;
if (stream->ice_mismatch == TRUE) {
return FALSE;
}
if (stream->rtp_port == 0) {
continue;
}
if (ice_check_list_state(cl) != ICL_Running) continue;
for (j = 0; j < SAL_MEDIA_DESCRIPTION_MAX_ICE_CANDIDATES; j++) {
const SalIceRemoteCandidate *remote_candidate = &stream->ice_remote_candidates[j];
if (remote_candidate->addr[0] != '\0') return TRUE;
}
}
return FALSE;
}
static void _create_ice_check_lists_and_parse_ice_attributes(LinphoneCall *call, const SalMediaDescription *md, bool_t ice_restarted) {
const SalStreamDescription *stream;
IceCheckList *cl = NULL;

View file

@ -405,6 +405,7 @@ struct _LinphoneCall{
bool_t reinvite_on_cancel_response_requested;
bool_t non_op_error; /*set when the LinphoneErrorInfo was set at higher level than sal*/
bool_t incoming_ice_reinvite_pending;
bctbx_list_t *callbacks; /* A list of LinphoneCallCbs object */
LinphoneCallCbs *current_cbs; /* The current LinphoneCallCbs object used to call a callback */
@ -1996,6 +1997,7 @@ char *linphone_presence_model_to_xml(LinphonePresenceModel *model) ;
#define LINPHONE_SQLITE3_VFS "sqlite3bctbx_vfs"
void linphone_call_check_ice_session(LinphoneCall *call, IceRole role, bool_t is_reinvite);
bool_t check_ice_reinvite_needs_defered_response(LinphoneCall *call);
bool_t linphone_call_state_is_early(LinphoneCallState state);