]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
MODSOFIA-48
authorAnthony Minessale <anthony.minessale@gmail.com>
Sat, 19 Dec 2009 17:43:05 +0000 (17:43 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Sat, 19 Dec 2009 17:43:05 +0000 (17:43 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@16004 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/endpoints/mod_sofia/mod_sofia.c
src/mod/endpoints/mod_sofia/mod_sofia.h
src/mod/endpoints/mod_sofia/sofia.c

index 565efc445d33cedc300e03192ebd84994b549195..74f9740f73afaa1bffe8106ab85aa0669bd6fc29 100644 (file)
@@ -503,15 +503,28 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session)
                        /* Send the 200 OK */
                        if (!sofia_test_flag(tech_pvt, TFLAG_BYE)) {
                                char *extra_headers = sofia_glue_get_extra_headers(channel, SOFIA_SIP_PROGRESS_HEADER_PREFIX);
-                               nua_respond(tech_pvt->nh, SIP_200_OK,
-                                                       SIPTAG_CONTACT_STR(tech_pvt->profile->url),
-                                                       SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
-                                                       SOATAG_REUSE_REJECTED(1),
-                                                       SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), NUTAG_INCLUDE_EXTRA_SDP(1), 
-                                                       TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
-                                                       TAG_IF(switch_stristr("update_display", tech_pvt->x_freeswitch_support_remote), 
-                                                                  SIPTAG_HEADER_STR("X-FS-Support: "FREESWITCH_SUPPORT)),
-                                                       TAG_END());
+
+                               if (sofia_use_soa(tech_pvt)) {
+                                       nua_respond(tech_pvt->nh, SIP_200_OK,
+                                                               SIPTAG_CONTACT_STR(tech_pvt->profile->url),
+                                                               SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
+                                                               SOATAG_REUSE_REJECTED(1),
+                                                               SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), NUTAG_INCLUDE_EXTRA_SDP(1), 
+                                                               TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
+                                                               TAG_IF(switch_stristr("update_display", tech_pvt->x_freeswitch_support_remote), 
+                                                                          SIPTAG_HEADER_STR("X-FS-Support: "FREESWITCH_SUPPORT)),
+                                                               TAG_END());
+                               } else {
+                                       nua_respond(tech_pvt->nh, SIP_200_OK,
+                                                               NUTAG_MEDIA_ENABLE(0),
+                                                               SIPTAG_CONTACT_STR(tech_pvt->profile->url),
+                                                               TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
+                                                               SIPTAG_CONTENT_TYPE_STR("application/sdp"),
+                                                               SIPTAG_PAYLOAD_STR(tech_pvt->local_sdp_str),                                                            
+                                                               TAG_IF(switch_stristr("update_display", tech_pvt->x_freeswitch_support_remote), 
+                                                                          SIPTAG_HEADER_STR("X-FS-Support: "FREESWITCH_SUPPORT)),
+                                                               TAG_END());
+                               }
 
                                switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "3PCC-PROXY, Sent a 200 OK, waiting for ACK\n");
                                switch_safe_free(extra_headers);
@@ -590,19 +603,36 @@ 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_PROGRESS_HEADER_PREFIX);
-               nua_respond(tech_pvt->nh, SIP_200_OK,
-                                       NUTAG_AUTOANSWER(0),
-                                       TAG_IF(sticky, NUTAG_PROXY(tech_pvt->record_route)),
-                                       SIPTAG_HEADER_STR(generate_pai_str(session)),
-                                       NUTAG_SESSION_TIMER(session_timeout),
-                                       SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
-                                       SIPTAG_CALL_INFO_STR(switch_channel_get_variable(tech_pvt->channel, SOFIA_SIP_HEADER_PREFIX "call_info")),
-                                       SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
-                                       SOATAG_REUSE_REJECTED(1), SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), NUTAG_INCLUDE_EXTRA_SDP(1), 
-                                       TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
-                                       TAG_IF(switch_stristr("update_display", tech_pvt->x_freeswitch_support_remote), 
-                                                  SIPTAG_HEADER_STR("X-FS-Support: "FREESWITCH_SUPPORT)),
-                                       TAG_END());
+               if (sofia_use_soa(tech_pvt)) {
+                       nua_respond(tech_pvt->nh, SIP_200_OK,
+                                               NUTAG_AUTOANSWER(0),
+                                               TAG_IF(sticky, NUTAG_PROXY(tech_pvt->record_route)),
+                                               SIPTAG_HEADER_STR(generate_pai_str(session)),
+                                               NUTAG_SESSION_TIMER(session_timeout),
+                                               SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+                                               SIPTAG_CALL_INFO_STR(switch_channel_get_variable(tech_pvt->channel, SOFIA_SIP_HEADER_PREFIX "call_info")),
+                                               SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
+                                               SOATAG_REUSE_REJECTED(1), SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), NUTAG_INCLUDE_EXTRA_SDP(1), 
+                                               TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
+                                               TAG_IF(switch_stristr("update_display", tech_pvt->x_freeswitch_support_remote), 
+                                                          SIPTAG_HEADER_STR("X-FS-Support: "FREESWITCH_SUPPORT)),
+                                               TAG_END());
+               } else {
+                       nua_respond(tech_pvt->nh, SIP_200_OK,
+                                               NUTAG_AUTOANSWER(0),
+                                               NUTAG_MEDIA_ENABLE(0),
+                                               TAG_IF(sticky, NUTAG_PROXY(tech_pvt->record_route)),
+                                               SIPTAG_HEADER_STR(generate_pai_str(session)),
+                                               NUTAG_SESSION_TIMER(session_timeout),
+                                               SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+                                               SIPTAG_CALL_INFO_STR(switch_channel_get_variable(tech_pvt->channel, SOFIA_SIP_HEADER_PREFIX "call_info")),
+                                               SIPTAG_CONTENT_TYPE_STR("application/sdp"),
+                                               SIPTAG_PAYLOAD_STR(tech_pvt->local_sdp_str),                                            
+                                               TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
+                                               TAG_IF(switch_stristr("update_display", tech_pvt->x_freeswitch_support_remote), 
+                                                          SIPTAG_HEADER_STR("X-FS-Support: "FREESWITCH_SUPPORT)),
+                                               TAG_END());
+               }
                switch_safe_free(extra_headers);
                sofia_set_flag_locked(tech_pvt, TFLAG_ANS);
        }
@@ -1235,10 +1265,20 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
                        }
 
                        if (!sofia_test_flag(tech_pvt, TFLAG_BYE)) {
-                               nua_respond(tech_pvt->nh, SIP_200_OK,
-                                                       SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
-                                                       SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
-                                                       SOATAG_REUSE_REJECTED(1), SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), NUTAG_INCLUDE_EXTRA_SDP(1), TAG_END());
+                               if (sofia_use_soa(tech_pvt)) {
+                                       nua_respond(tech_pvt->nh, SIP_200_OK,
+                                                               SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+                                                               SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
+                                                               SOATAG_REUSE_REJECTED(1), SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), NUTAG_INCLUDE_EXTRA_SDP(1), 
+                                                               TAG_END());
+                               } else {
+                                       nua_respond(tech_pvt->nh, SIP_200_OK,
+                                                               NUTAG_MEDIA_ENABLE(0),
+                                                               SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+                                                               SIPTAG_CONTENT_TYPE_STR("application/sdp"),
+                                                               SIPTAG_PAYLOAD_STR(tech_pvt->local_sdp_str),                                                            
+                                                               TAG_END());
+                               }
                                switch_channel_mark_answered(channel);
                        }
                }
@@ -1604,12 +1644,21 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
                                                        sofia_glue_tech_patch_sdp(tech_pvt);
                                                        sofia_glue_tech_proxy_remote_addr(tech_pvt);
                                                }
-                                               nua_respond(tech_pvt->nh, code, su_strdup(nua_handle_home(tech_pvt->nh), reason), SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
-                                                                       SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
-                                                                       SOATAG_REUSE_REJECTED(1),
-                                                                       SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), NUTAG_INCLUDE_EXTRA_SDP(1), 
-                                                                       TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
-                                                                       TAG_END());
+                                               if (sofia_use_soa(tech_pvt)) {
+                                                       nua_respond(tech_pvt->nh, code, su_strdup(nua_handle_home(tech_pvt->nh), reason), SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+                                                                               SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
+                                                                               SOATAG_REUSE_REJECTED(1),
+                                                                               SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), NUTAG_INCLUDE_EXTRA_SDP(1), 
+                                                                               TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
+                                                                               TAG_END());
+                                               } else {
+                                                       nua_respond(tech_pvt->nh, code, su_strdup(nua_handle_home(tech_pvt->nh), reason), SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+                                                                               NUTAG_MEDIA_ENABLE(0),
+                                                                               SIPTAG_CONTENT_TYPE_STR("application/sdp"),
+                                                                               SIPTAG_PAYLOAD_STR(tech_pvt->local_sdp_str),                                                    
+                                                                               TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
+                                                                               TAG_END());
+                                               }
                                        } else {
                                                nua_respond(tech_pvt->nh, code, su_strdup(nua_handle_home(tech_pvt->nh), reason), SIPTAG_CONTACT_STR(tech_pvt->reply_contact), 
                                                                        TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
@@ -1725,20 +1774,36 @@ 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);
-                                       nua_respond(tech_pvt->nh,
-                                                               SIP_183_SESSION_PROGRESS,
-                                                               NUTAG_AUTOANSWER(0),
-                                                               TAG_IF(sticky, NUTAG_PROXY(tech_pvt->record_route)),
-                                                               SIPTAG_HEADER_STR(generate_pai_str(session)),
-                                                               SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
-                                                               SOATAG_REUSE_REJECTED(1),
-                                                               SOATAG_ORDERED_USER(1),
-                                                               SOATAG_ADDRESS(tech_pvt->adv_sdp_audio_ip),
-                                                               SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str), SOATAG_AUDIO_AUX("cn telephone-event"), 
-                                                               TAG_IF(!zstr(extra_header), SIPTAG_HEADER_STR(extra_header)),
-                                                               TAG_IF(switch_stristr("update_display", tech_pvt->x_freeswitch_support_remote), 
-                                                                          SIPTAG_HEADER_STR("X-FS-Support: "FREESWITCH_SUPPORT)),
-                                                               TAG_END());
+                                       if (sofia_use_soa(tech_pvt)) {
+                                               nua_respond(tech_pvt->nh,
+                                                                       SIP_183_SESSION_PROGRESS,
+                                                                       NUTAG_AUTOANSWER(0),
+                                                                       TAG_IF(sticky, NUTAG_PROXY(tech_pvt->record_route)),
+                                                                       SIPTAG_HEADER_STR(generate_pai_str(session)),
+                                                                       SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+                                                                       SOATAG_REUSE_REJECTED(1),
+                                                                       SOATAG_ORDERED_USER(1),
+                                                                       SOATAG_ADDRESS(tech_pvt->adv_sdp_audio_ip),
+                                                                       SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str), SOATAG_AUDIO_AUX("cn telephone-event"), 
+                                                                       TAG_IF(!zstr(extra_header), SIPTAG_HEADER_STR(extra_header)),
+                                                                       TAG_IF(switch_stristr("update_display", tech_pvt->x_freeswitch_support_remote), 
+                                                                                  SIPTAG_HEADER_STR("X-FS-Support: "FREESWITCH_SUPPORT)),
+                                                                       TAG_END());
+                                       } else {
+                                               nua_respond(tech_pvt->nh,
+                                                                       SIP_183_SESSION_PROGRESS,
+                                                                       NUTAG_AUTOANSWER(0),
+                                                                       NUTAG_MEDIA_ENABLE(0),
+                                                                       TAG_IF(sticky, NUTAG_PROXY(tech_pvt->record_route)),
+                                                                       SIPTAG_HEADER_STR(generate_pai_str(session)),
+                                                                       SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+                                                                       SIPTAG_CONTENT_TYPE_STR("application/sdp"),
+                                                                       SIPTAG_PAYLOAD_STR(tech_pvt->local_sdp_str),                                                                    
+                                                                       TAG_IF(!zstr(extra_header), SIPTAG_HEADER_STR(extra_header)),
+                                                                       TAG_IF(switch_stristr("update_display", tech_pvt->x_freeswitch_support_remote), 
+                                                                                  SIPTAG_HEADER_STR("X-FS-Support: "FREESWITCH_SUPPORT)),
+                                                                       TAG_END());
+                                       }
                                        switch_safe_free(extra_header);
                                }
                        }
index 8030a6fdc9adf09db953ea562255edfed1ce332f..b739d80b592db190d73260fa9d79c741452ccb12 100644 (file)
@@ -254,6 +254,7 @@ typedef enum {
        TFLAG_3PCC_HAS_ACK,
        TFLAG_PASS_RFC2833,
        TFLAG_UPDATING_DISPLAY,
+       TFLAG_ENABLE_SOA,
        /* No new flags below this line */
        TFLAG_MAX
 } TFLAGS;
@@ -835,6 +836,10 @@ sofia_gateway_subscription_t *sofia_find_gateway_subscription(sofia_gateway_t *g
 void sofia_reg_release_gateway__(const char *file, const char *func, int line, sofia_gateway_t *gateway);
 #define sofia_reg_release_gateway(x) sofia_reg_release_gateway__(__FILE__, __SWITCH_FUNC__, __LINE__, x);
 
+#define sofia_use_soa(_t) (sofia_test_flag(_t, TFLAG_ENABLE_SOA)               \
+                                                  && !switch_channel_test_flag(_t->channel, CF_PROXY_MODE) \
+                                                  && !switch_channel_test_flag(_t->channel, CF_PROXY_MEDIA))
+
 #define check_decode(_var, _session) do {                                                              \
                assert(_session);                                                                                               \
                if (!zstr(_var)) {                                                              \
index 257f89d75ba5eb8d9b2c34d815918c84d85d9457..78fb4b54969b801b16771886d2241b78a88c2e67 100644 (file)
@@ -2480,6 +2480,7 @@ switch_status_t config_sofia(int reload, char *profile_name)
                                sofia_set_pflag(profile, PFLAG_SQL_IN_TRANS);
                                profile->shutdown_type = "false";
                                profile->local_network = "localnet.auto";
+                               sofia_set_flag(profile, TFLAG_ENABLE_SOA);
 
                                for (param = switch_xml_child(settings, "param"); param; param = param->next) {
                                        char *var = (char *) switch_xml_attr_soft(param, "name");
@@ -2914,6 +2915,13 @@ switch_status_t config_sofia(int reload, char *profile_name)
                                                } else {
                                                        sofia_clear_pflag(profile, PFLAG_SQL_IN_TRANS);
                                                }
+
+                                       } else if (!strcasecmp(var, "enable-soa")) {
+                                               if (switch_true(val)) {
+                                                       sofia_set_flag(profile, TFLAG_ENABLE_SOA);
+                                               } else {
+                                                       sofia_clear_flag(profile, TFLAG_ENABLE_SOA);
+                                               }
                                        } else if (!strcasecmp(var, "bitpacking")) {
                                                if (!strcasecmp(val, "aal2")) {
                                                        profile->codec_flags = SWITCH_CODEC_FLAG_AAL2;
@@ -3736,6 +3744,7 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
        char st[80] = "";
        int is_dup_sdp = 0;
        switch_event_t *s_event = NULL;
+       char *p;
 
        tl_gets(tags,
                        NUTAG_CALLSTATE_REF(ss_state),
@@ -3745,7 +3754,16 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
                        NUTAG_ANSWER_SENT_REF(answer_sent),
                        SIPTAG_REPLACES_STR_REF(replaces_str), SOATAG_LOCAL_SDP_STR_REF(l_sdp), SOATAG_REMOTE_SDP_STR_REF(r_sdp), TAG_END());
        
-       
+       /* This marr in our code brought to you by people who can't read........*/
+       if (tech_pvt->profile->ndlb & PFLAG_NDLB_ALLOW_BAD_IANANAME && r_sdp && (p = (char *) switch_stristr("g729a/8000", r_sdp))) {
+               p += 4;
+               *p++ = '/';
+               *p++ = '8';
+               *p++ = '0';
+               *p++ = '0';
+               *p++ = '0';
+               *p++ = ' ';
+       }
 
        if (ss_state == nua_callstate_terminated) {
 
@@ -4000,12 +4018,21 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
                                                sofia_glue_set_local_sdp(tech_pvt, NULL, 0, NULL, 0);
                                                sofia_set_flag_locked(tech_pvt, TFLAG_3PCC);
                                                switch_channel_set_state(channel, CS_HIBERNATE);
-                                               nua_respond(tech_pvt->nh, SIP_200_OK,
-                                                                       SIPTAG_CONTACT_STR(tech_pvt->profile->url),
-                                                                       SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
-                                                                       SOATAG_REUSE_REJECTED(1),
-                                                                       SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), 
-                                                                       TAG_IF(sofia_test_pflag(profile, PFLAG_DISABLE_100REL), NUTAG_INCLUDE_EXTRA_SDP(1)), TAG_END());
+                                               if (sofia_use_soa(tech_pvt)) {
+                                                       nua_respond(tech_pvt->nh, SIP_200_OK,
+                                                                               SIPTAG_CONTACT_STR(tech_pvt->profile->url),
+                                                                               SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
+                                                                               SOATAG_REUSE_REJECTED(1),
+                                                                               SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), 
+                                                                               TAG_IF(sofia_test_pflag(profile, PFLAG_DISABLE_100REL), NUTAG_INCLUDE_EXTRA_SDP(1)), TAG_END());
+                                               } else {
+                                                       nua_respond(tech_pvt->nh, SIP_200_OK,
+                                                                               NUTAG_MEDIA_ENABLE(0),
+                                                                               SIPTAG_CONTACT_STR(tech_pvt->profile->url),
+                                                                               SIPTAG_CONTENT_TYPE_STR("application/sdp"),
+                                                                               SIPTAG_PAYLOAD_STR(tech_pvt->local_sdp_str),
+                                                                               TAG_END());
+                                               }
                                        } else if (sofia_test_pflag(profile, PFLAG_3PCC_PROXY)) {
                                                //3PCC proxy mode delays the 200 OK until the call is answered
                                                switch_channel_set_variable(channel, SWITCH_ENDPOINT_DISPOSITION_VARIABLE, "RECEIVED_NOSDP");
@@ -4090,12 +4117,21 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
                                                        }
                                                        sofia_glue_set_local_sdp(tech_pvt, NULL, 0, NULL, 1);
                                                        
-                                                       nua_respond(tech_pvt->nh, SIP_200_OK,
-                                                                               SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
-                                                                               SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
-                                                                               SOATAG_REUSE_REJECTED(1),
-                                                                               SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), 
-                                                                               TAG_IF(sofia_test_pflag(profile, PFLAG_DISABLE_100REL), NUTAG_INCLUDE_EXTRA_SDP(1)), TAG_END());
+                                                       if (sofia_use_soa(tech_pvt)) {
+                                                               nua_respond(tech_pvt->nh, SIP_200_OK,
+                                                                                       SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+                                                                                       SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
+                                                                                       SOATAG_REUSE_REJECTED(1),
+                                                                                       SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), 
+                                                                                       TAG_IF(sofia_test_pflag(profile, PFLAG_DISABLE_100REL), NUTAG_INCLUDE_EXTRA_SDP(1)), TAG_END());
+                                                       } else {
+                                                               nua_respond(tech_pvt->nh, SIP_200_OK,
+                                                                                       NUTAG_MEDIA_ENABLE(0),
+                                                                                       SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+                                                                                       SIPTAG_CONTENT_TYPE_STR("application/sdp"),
+                                                                                       SIPTAG_PAYLOAD_STR(tech_pvt->local_sdp_str),
+                                                                                       TAG_END());
+                                                       }
                                                        launch_media_on_hold(session);
                                                        
                                                        switch_core_session_rwunlock(other_session);
@@ -4165,13 +4201,20 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
                                        if (tech_pvt->local_crypto_key) {
                                                sofia_glue_set_local_sdp(tech_pvt, NULL, 0, NULL, 0);
                                        }
-                                       nua_respond(tech_pvt->nh, SIP_200_OK,
-                                                               SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
-                                                               SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
-                                                               SOATAG_REUSE_REJECTED(1),
-                                                               SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), 
-                                                               TAG_IF(sofia_test_pflag(profile, PFLAG_DISABLE_100REL), NUTAG_INCLUDE_EXTRA_SDP(1)), TAG_END());
-
+                                       if (sofia_use_soa(tech_pvt)) {
+                                               nua_respond(tech_pvt->nh, SIP_200_OK,
+                                                                       SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+                                                                       SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
+                                                                       SOATAG_REUSE_REJECTED(1),
+                                                                       SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"), 
+                                                                       TAG_IF(sofia_test_pflag(profile, PFLAG_DISABLE_100REL), NUTAG_INCLUDE_EXTRA_SDP(1)), TAG_END());
+                                       } else {
+                                               nua_respond(tech_pvt->nh, SIP_200_OK,
+                                                                       NUTAG_MEDIA_ENABLE(0),
+                                                                       SIPTAG_CONTACT_STR(tech_pvt->reply_contact),
+                                                                       SIPTAG_CONTENT_TYPE_STR("application/sdp"),
+                                                                       TAG_END());
+                                       }
                                        if (switch_event_create_subclass(&s_event, SWITCH_EVENT_CUSTOM, MY_EVENT_REINVITE) == SWITCH_STATUS_SUCCESS) {
                                                switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "Unique-ID", switch_core_session_get_uuid(session));
                                                switch_event_fire(&s_event);
@@ -6127,14 +6170,24 @@ void sofia_info_send_sipfrag(switch_core_session_t *aleg, switch_core_session_t
                                        sofia_glue_set_local_sdp(b_tech_pvt, NULL, 0, NULL, 0);
                                }
 
-                               nua_update(b_tech_pvt->nh,
-                                                  SIPTAG_CONTACT_STR(b_tech_pvt->reply_contact),
-                                                  SOATAG_USER_SDP_STR(b_tech_pvt->local_sdp_str),
-                                                  SOATAG_REUSE_REJECTED(1),
-                                                  SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"),
-                                                  TAG_IF(!zstr_buf(message), SIPTAG_HEADER_STR(message)),
-                                                  TAG_IF(!zstr(b_tech_pvt->user_via), SIPTAG_VIA_STR(b_tech_pvt->user_via)),
-                                                  TAG_END());
+                               if (sofia_use_soa(b_tech_pvt)) {
+                                       nua_update(b_tech_pvt->nh,
+                                                          SIPTAG_CONTACT_STR(b_tech_pvt->reply_contact),
+                                                          SOATAG_USER_SDP_STR(b_tech_pvt->local_sdp_str),
+                                                          SOATAG_REUSE_REJECTED(1),
+                                                          SOATAG_ORDERED_USER(1), SOATAG_AUDIO_AUX("cn telephone-event"),
+                                                          TAG_IF(!zstr_buf(message), SIPTAG_HEADER_STR(message)),
+                                                          TAG_IF(!zstr(b_tech_pvt->user_via), SIPTAG_VIA_STR(b_tech_pvt->user_via)),
+                                                          TAG_END());
+                               } else {
+                                       nua_update(b_tech_pvt->nh,
+                                                          NUTAG_MEDIA_ENABLE(0),
+                                                          SIPTAG_CONTACT_STR(b_tech_pvt->reply_contact),
+                                                          SIPTAG_CONTENT_TYPE_STR("application/sdp"),
+                                                          TAG_IF(!zstr_buf(message), SIPTAG_HEADER_STR(message)),
+                                                          TAG_IF(!zstr(b_tech_pvt->user_via), SIPTAG_VIA_STR(b_tech_pvt->user_via)),
+                                                          TAG_END());
+                               }
                        }
 
                }