From 8a6d9b5d88a60de436f677922ba63c2ca7dd8d33 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Sat, 3 Nov 2007 00:46:23 +0000 Subject: [PATCH] fix obscure bug in late neg git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@6157 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/endpoints/mod_sofia/mod_sofia.c | 37 ++++++++++++++----------- src/mod/endpoints/mod_sofia/sofia.c | 2 +- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index d6c318a423..dee922c5de 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -295,15 +295,17 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session) } } else { if (switch_test_flag(tech_pvt, TFLAG_LATE_NEGOTIATION)) { - const char *r_sdp = switch_channel_get_variable(channel, SWITCH_R_SDP_VARIABLE); - tech_pvt->num_codecs = 0; - sofia_glue_tech_prepare_codecs(tech_pvt); - if (sofia_glue_tech_media(tech_pvt, r_sdp) != SWITCH_STATUS_SUCCESS) { - switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "CODEC NEGOTIATION ERROR"); - nua_respond(tech_pvt->nh, SIP_488_NOT_ACCEPTABLE, TAG_END()); - return SWITCH_STATUS_FALSE; - } switch_clear_flag_locked(tech_pvt, TFLAG_LATE_NEGOTIATION); + if (!switch_channel_test_flag(tech_pvt->channel, CF_OUTBOUND)) { + const char *r_sdp = switch_channel_get_variable(channel, SWITCH_R_SDP_VARIABLE); + tech_pvt->num_codecs = 0; + sofia_glue_tech_prepare_codecs(tech_pvt); + if (sofia_glue_tech_media(tech_pvt, r_sdp) != SWITCH_STATUS_SUCCESS) { + switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "CODEC NEGOTIATION ERROR"); + nua_respond(tech_pvt->nh, SIP_488_NOT_ACCEPTABLE, TAG_END()); + return SWITCH_STATUS_FALSE; + } + } } if ((status = sofia_glue_tech_choose_port(tech_pvt)) != SWITCH_STATUS_SUCCESS) { @@ -900,15 +902,17 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi } } else { if (switch_test_flag(tech_pvt, TFLAG_LATE_NEGOTIATION)) { - const char *r_sdp = switch_channel_get_variable(channel, SWITCH_R_SDP_VARIABLE); - tech_pvt->num_codecs = 0; - sofia_glue_tech_prepare_codecs(tech_pvt); - if (sofia_glue_tech_media(tech_pvt, r_sdp) != SWITCH_STATUS_SUCCESS) { - switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "CODEC NEGOTIATION ERROR"); - nua_respond(tech_pvt->nh, SIP_488_NOT_ACCEPTABLE, TAG_END()); - return SWITCH_STATUS_FALSE; - } switch_clear_flag_locked(tech_pvt, TFLAG_LATE_NEGOTIATION); + if (!switch_channel_test_flag(tech_pvt->channel, CF_OUTBOUND)) { + const char *r_sdp = switch_channel_get_variable(channel, SWITCH_R_SDP_VARIABLE); + tech_pvt->num_codecs = 0; + sofia_glue_tech_prepare_codecs(tech_pvt); + if (sofia_glue_tech_media(tech_pvt, r_sdp) != SWITCH_STATUS_SUCCESS) { + switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "CODEC NEGOTIATION ERROR"); + nua_respond(tech_pvt->nh, SIP_488_NOT_ACCEPTABLE, TAG_END()); + return SWITCH_STATUS_FALSE; + } + } } if ((status = sofia_glue_tech_choose_port(tech_pvt)) != SWITCH_STATUS_SUCCESS) { @@ -1591,6 +1595,7 @@ static switch_call_cause_t sofia_outgoing_channel(switch_core_session_t *session switch_channel_set_caller_profile(nchannel, caller_profile); switch_channel_set_flag(nchannel, CF_OUTBOUND); switch_set_flag_locked(tech_pvt, TFLAG_OUTBOUND); + switch_clear_flag_locked(tech_pvt, TFLAG_LATE_NEGOTIATION); switch_channel_set_state(nchannel, CS_INIT); *new_session = nsession; cause = SWITCH_CAUSE_SUCCESS; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 2220052bd3..90cdfe9656 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -1214,7 +1214,7 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status, } goto done; } else { - if (switch_test_flag(tech_pvt, TFLAG_LATE_NEGOTIATION)) { + if (switch_test_flag(tech_pvt, TFLAG_LATE_NEGOTIATION) && !switch_channel_test_flag(tech_pvt->channel, CF_OUTBOUND)) { switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "DELAYED NEGOTIATION"); } else { if (sofia_glue_tech_media(tech_pvt, (char *) r_sdp) != SWITCH_STATUS_SUCCESS) {