]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-6544 v1.4
authorAnthony Minessale <anthm@freeswitch.org>
Fri, 5 Feb 2016 17:56:44 +0000 (11:56 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Fri, 5 Feb 2016 17:58:53 +0000 (11:58 -0600)
src/include/switch_core_media.h
src/mod/endpoints/mod_sofia/sofia.c
src/switch_core_media.c

index f137d6fba6d6f881a6475f42a1a6ac15e6ec8783..3e0a54695b28e29cc3c584349662c75c31ecbd1c 100644 (file)
@@ -242,6 +242,7 @@ SWITCH_DECLARE(void) switch_core_media_set_telephony_event(switch_core_session_t
 SWITCH_DECLARE(void) switch_core_media_set_telephony_recv_event(switch_core_session_t *session, switch_media_type_t type, switch_payload_t te);
 SWITCH_DECLARE(switch_rtp_stats_t *) switch_core_media_stats(switch_core_session_t *session, switch_media_type_t type, switch_memory_pool_t *pool);
 SWITCH_DECLARE(switch_status_t) switch_core_media_udptl_mode(switch_core_session_t *session, switch_media_type_t type);
+SWITCH_DECLARE(switch_bool_t) switch_core_media_check_udptl_mode(switch_core_session_t *session, switch_media_type_t type);
 
 SWITCH_DECLARE(void) switch_core_media_set_rtp_flag(switch_core_session_t *session, switch_media_type_t type, switch_rtp_flag_t flag);
 SWITCH_DECLARE(void) switch_core_media_clear_rtp_flag(switch_core_session_t *session, switch_media_type_t type, switch_rtp_flag_t flag);
index 94f0628abab1fe1a81d8be90ec09dc8727e46c2e..2a4d4cb941c3f7973f1b6de1d048eaba096e8960 100644 (file)
@@ -6647,7 +6647,7 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status,
        }
 
        if (session) {
-               if (switch_channel_test_flag(channel, CF_ANSWERED) && (status == 180 || status == 183) && !r_sdp) {
+               if ((switch_channel_test_flag(channel, CF_ANSWERED) && (status == 180 || status == 183) && !r_sdp) || (ss_state == nua_callstate_ready && status >= 300)) {
                        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Channel %s skipping state [%s][%d]\n",
                                                          switch_channel_get_name(channel), nua_callstate_name(ss_state), status);
                        goto done;
@@ -8855,7 +8855,14 @@ void sofia_handle_sip_i_reinvite(switch_core_session_t *session,
                                tech_pvt->mparams.last_sdp_str = tech_pvt->mparams.prev_sdp_str;
                        }
                }
-               switch_channel_execute_on(channel, "execute_on_sip_reinvite");
+
+               if (switch_core_media_check_udptl_mode(session, SWITCH_MEDIA_TYPE_AUDIO)) {
+                       /* Refuse all re-invites once we are doing T.38 */
+                       nua_respond(nh, SIP_488_NOT_ACCEPTABLE, TAG_END());
+                       switch_channel_hangup(channel, SWITCH_CAUSE_INCOMPATIBLE_DESTINATION);
+               } else {
+                       switch_channel_execute_on(channel, "execute_on_sip_reinvite");
+               }
        }
 
 }
index a85be9dde7e9b4e17b784e43e47b40f4de202d12..70541229d5b7e0dbc7a6935259c21909b6243dce 100644 (file)
@@ -8342,6 +8342,24 @@ SWITCH_DECLARE(switch_rtp_stats_t *) switch_core_media_get_stats(switch_core_ses
        return NULL;
 }
 
+//?
+SWITCH_DECLARE(switch_bool_t) switch_core_media_check_udptl_mode(switch_core_session_t *session, switch_media_type_t type)
+{
+       switch_media_handle_t *smh;
+
+       switch_assert(session);
+
+       if (!(smh = session->media_handle)) {
+               return SWITCH_STATUS_FALSE;
+       }
+
+       if (switch_rtp_ready(smh->engines[type].rtp_session)) {
+               return switch_rtp_test_flag(smh->engines[type].rtp_session, SWITCH_RTP_FLAG_UDPTL) ? SWITCH_TRUE : SWITCH_FALSE;
+       }
+
+       return SWITCH_FALSE;
+}
+
 //?
 SWITCH_DECLARE(switch_status_t) switch_core_media_udptl_mode(switch_core_session_t *session, switch_media_type_t type)
 {