diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 8a41722c60..21c332797d 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -387,6 +387,7 @@ typedef enum { SWITCH_MESSAGE_INDICATE_REDIRECT - indicate redirect SWITCH_MESSAGE_INDICATE_REJECT - indicate reject SWITCH_MESSAGE_INDICATE_BROADCAST - indicate media broadcast + SWITCH_MESSAGE_INDICATE_MEDIA_REDIRECT - indicate media broadcast </pre> */ typedef enum { @@ -404,7 +405,8 @@ typedef enum { SWITCH_MESSAGE_INDICATE_UNHOLD, SWITCH_MESSAGE_INDICATE_REDIRECT, SWITCH_MESSAGE_INDICATE_REJECT, - SWITCH_MESSAGE_INDICATE_BROADCAST + SWITCH_MESSAGE_INDICATE_BROADCAST, + SWITCH_MESSAGE_INDICATE_MEDIA_REDIRECT } switch_core_session_message_types_t; diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 8e48726249..ab5b2d1b47 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -689,7 +689,8 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi switch_channel_mark_answered(channel); } break; - case SWITCH_MESSAGE_INDICATE_NOMEDIA: { + case SWITCH_MESSAGE_INDICATE_NOMEDIA: + { char *uuid; switch_core_session_t *other_session; switch_channel_t *other_channel; @@ -715,16 +716,26 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi sofia_glue_tech_absorb_sdp(tech_pvt); } sofia_glue_do_invite(session); - } - break; - case SWITCH_MESSAGE_INDICATE_MEDIA:{ - uint32_t count = 0; - - if (switch_channel_get_state(channel) >= CS_HANGUP) { - return SWITCH_STATUS_FALSE; } + break; - switch_channel_clear_flag(channel, CF_BYPASS_MEDIA); + case SWITCH_MESSAGE_INDICATE_MEDIA_REDIRECT: + { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending media re-direct:\n%s\n", msg->string_arg); + tech_pvt->local_sdp_str = switch_core_session_strdup(session, msg->string_arg); + sofia_glue_do_invite(session); + } + break; + + case SWITCH_MESSAGE_INDICATE_MEDIA: + { + uint32_t count = 0; + + if (switch_channel_get_state(channel) >= CS_HANGUP) { + return SWITCH_STATUS_FALSE; + } + + switch_channel_clear_flag(channel, CF_BYPASS_MEDIA); tech_pvt->local_sdp_str = NULL; if (!switch_rtp_ready(tech_pvt->rtp_session)) { sofia_glue_tech_prepare_codecs(tech_pvt); @@ -751,13 +762,15 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi } break; - case SWITCH_MESSAGE_INDICATE_HOLD:{ + case SWITCH_MESSAGE_INDICATE_HOLD: + { switch_set_flag_locked(tech_pvt, TFLAG_SIP_HOLD); sofia_glue_do_invite(session); } break; - - case SWITCH_MESSAGE_INDICATE_UNHOLD:{ + + case SWITCH_MESSAGE_INDICATE_UNHOLD: + { switch_clear_flag_locked(tech_pvt, TFLAG_SIP_HOLD); sofia_glue_do_invite(session); } diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index aa4f6f3d6c..437bb08687 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -1210,6 +1210,19 @@ static void sofia_handle_sip_i_state(switch_core_session_t *session, int status, if (r_sdp) { if (switch_channel_test_flag(channel, CF_BYPASS_MEDIA)) { + if ((uuid = switch_channel_get_variable(channel, SWITCH_SIGNAL_BOND_VARIABLE)) + && (other_session = switch_core_session_locate(uuid))) { + switch_core_session_message_t msg = { 0 }; + + msg.message_id = SWITCH_MESSAGE_INDICATE_MEDIA_REDIRECT; + msg.from = __FILE__; + msg.string_arg = (char *) r_sdp; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Passing SDP to other leg.\n%s\n", r_sdp); + switch_core_session_receive_message(other_session, &msg); + switch_core_session_rwunlock(other_session); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Re-INVITE to a no-media channel that is not in a bridge.\n"); + } goto done; } else { if (tech_pvt->num_codecs) {