From 83322661a5f57f7f0c9b4a085327b2f0c8d2f0c3 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 24 Apr 2017 12:22:03 -0500 Subject: [PATCH] FS-10258: [mod_sofia] FW must keep previously negotiated DTLS role during SIP re-INVITE --- src/include/switch_core.h | 2 +- src/include/switch_core_media.h | 1 + src/switch_core_media.c | 38 ++++++++++++++++++++++----------- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/include/switch_core.h b/src/include/switch_core.h index dcbe308067..4b67660e44 100644 --- a/src/include/switch_core.h +++ b/src/include/switch_core.h @@ -2761,7 +2761,7 @@ SWITCH_DECLARE(int) switch_system(const char *cmd, switch_bool_t wait); SWITCH_DECLARE(int) switch_stream_system_fork(const char *cmd, switch_stream_handle_t *stream); SWITCH_DECLARE(int) switch_stream_system(const char *cmd, switch_stream_handle_t *stream); -SWITCH_DECLARE(switch_call_direction_t) switch_ice_direction(switch_core_session_t *session); + SWITCH_DECLARE(void) switch_core_session_debug_pool(switch_stream_handle_t *stream); SWITCH_DECLARE(switch_status_t) switch_core_session_override_io_routines(switch_core_session_t *session, switch_io_routines_t *ior); diff --git a/src/include/switch_core_media.h b/src/include/switch_core_media.h index 906a6b104f..d4690339f2 100644 --- a/src/include/switch_core_media.h +++ b/src/include/switch_core_media.h @@ -379,6 +379,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_printf(switch_core_session_t SWITCH_DECLARE(switch_msrp_session_t *) switch_core_media_get_msrp_session(switch_core_session_t *session); + SWITCH_END_EXTERN_C #endif /* For Emacs: diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 701a982bae..86490e9c66 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -3625,17 +3625,28 @@ static int dtls_ok(switch_core_session_t *session) #endif //? -SWITCH_DECLARE(switch_call_direction_t) switch_ice_direction(switch_core_session_t *session) +static switch_call_direction_t switch_ice_direction(switch_rtp_engine_t *engine, switch_core_session_t *session) { switch_call_direction_t r = switch_channel_direction(session->channel); + switch_media_handle_t *smh; + switch_assert(session); + + if (!(smh = session->media_handle)) { + return SWITCH_CALL_DIRECTION_OUTBOUND; + } + if (switch_channel_test_flag(session->channel, CF_3PCC)) { r = (r == SWITCH_CALL_DIRECTION_INBOUND) ? SWITCH_CALL_DIRECTION_OUTBOUND : SWITCH_CALL_DIRECTION_INBOUND; } - if ((switch_channel_test_flag(session->channel, CF_REINVITE) || switch_channel_test_flag(session->channel, CF_RECOVERING)) - && switch_channel_test_flag(session->channel, CF_AVPF)) { - r = SWITCH_CALL_DIRECTION_OUTBOUND; + if (switch_rtp_has_dtls() && dtls_ok(smh->session)) { + r = engine->dtls_controller ? SWITCH_CALL_DIRECTION_OUTBOUND : SWITCH_CALL_DIRECTION_INBOUND; + } else { + if ((switch_channel_test_flag(session->channel, CF_REINVITE) || switch_channel_test_flag(session->channel, CF_RECOVERING)) + && switch_channel_test_flag(session->channel, CF_AVPF)) { + r = SWITCH_CALL_DIRECTION_OUTBOUND; + } } return r; @@ -3745,7 +3756,8 @@ static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t } else if (!strcasecmp(attr->a_name, "ice-options")) { engine->ice_in.options = switch_core_session_strdup(smh->session, attr->a_value); } else if (!strcasecmp(attr->a_name, "setup")) { - if (!strcasecmp(attr->a_value, "passive") || !strcasecmp(attr->a_value, "actpass")) { + if (!strcasecmp(attr->a_value, "passive") || + (!strcasecmp(attr->a_value, "actpass") && !switch_channel_test_flag(smh->session->channel, CF_REINVITE))) { if (!engine->dtls_controller) { engine->new_dtls = 1; engine->new_ice = 1; @@ -4025,7 +4037,7 @@ static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t ICE_GOOGLE_JINGLE, NULL #else - switch_ice_direction(smh->session) == + switch_ice_direction(engine, smh->session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &engine->ice_in #endif @@ -4080,7 +4092,7 @@ static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t ICE_GOOGLE_JINGLE, NULL #else - switch_ice_direction(smh->session) == + switch_ice_direction(engine, smh->session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &engine->ice_in #endif @@ -8324,7 +8336,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_ice_direction(session) == + switch_ice_direction(a_engine, session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &a_engine->ice_in #endif @@ -8377,7 +8389,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_ice_direction(session) == + switch_ice_direction(a_engine, session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &a_engine->ice_in #endif @@ -8689,7 +8701,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_ice_direction(session) == + switch_ice_direction(t_engine, session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &t_engine->ice_in #endif @@ -8739,7 +8751,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_ice_direction(session) == + switch_ice_direction(t_engine, session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &t_engine->ice_in #endif @@ -9015,7 +9027,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_ice_direction(session) == + switch_ice_direction(v_engine, session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &v_engine->ice_in #endif @@ -9066,7 +9078,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_ice_direction(session) == + switch_ice_direction(v_engine, session) == SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), &v_engine->ice_in #endif