From beae21d7292fd0432e4d75bca94b4f2277ebe725 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Fri, 18 Jun 2010 15:42:14 -0500 Subject: [PATCH] MODSOFIA-59 --- src/mod/endpoints/mod_sofia/mod_sofia.c | 10 ++++++++++ src/mod/endpoints/mod_sofia/mod_sofia.h | 1 + 2 files changed, 11 insertions(+) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index fb206cf030..27f98edd47 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -687,6 +687,14 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session) if (!sofia_test_flag(tech_pvt, TFLAG_BYE)) { char *extra_headers = sofia_glue_get_extra_headers(channel, SOFIA_SIP_RESPONSE_HEADER_PREFIX); + + if (switch_channel_test_flag(tech_pvt->channel, CF_PROXY_MODE) && tech_pvt->early_sdp && strcmp(tech_pvt->early_sdp, tech_pvt->local_sdp_str)) { + /* The SIP RFC for SOA forbids sending a 183 with one sdp then a 200 with another but it won't do us much good unless + we do so in this case we will abandon the SOA rules and go rogue. + */ + sofia_clear_flag(tech_pvt, TFLAG_ENABLE_SOA); + } + if (sofia_use_soa(tech_pvt)) { nua_respond(tech_pvt->nh, SIP_200_OK, NUTAG_AUTOANSWER(0), @@ -2171,6 +2179,8 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi if (!sofia_test_flag(tech_pvt, TFLAG_BYE)) { char *extra_header = sofia_glue_get_extra_headers(channel, SOFIA_SIP_PROGRESS_HEADER_PREFIX); + tech_pvt->early_sdp = switch_core_session_strdup(tech_pvt->session, tech_pvt->local_sdp_str); + if (sofia_use_soa(tech_pvt)) { nua_respond(tech_pvt->nh, SIP_183_SESSION_PROGRESS, diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index fbe87a2109..e6a857875e 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -605,6 +605,7 @@ struct private_object { switch_rtp_crypto_key_type_t crypto_send_type; switch_rtp_crypto_key_type_t crypto_recv_type; switch_rtp_crypto_key_type_t crypto_type; + char *early_sdp; char *local_sdp_str; char *last_sdp_str; char *dest;