From 703795e913408e5600426cd245b648787b3507f8 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 15 Sep 2015 20:33:44 -0500 Subject: [PATCH] FS-8130 FS-7432 FS-8115 --- src/mod/endpoints/mod_verto/mod_verto.c | 2 +- src/switch_core_media.c | 120 +++++++++++------------- 2 files changed, 57 insertions(+), 65 deletions(-) diff --git a/src/mod/endpoints/mod_verto/mod_verto.c b/src/mod/endpoints/mod_verto/mod_verto.c index 1ac88550e1..eea514822d 100644 --- a/src/mod/endpoints/mod_verto/mod_verto.c +++ b/src/mod/endpoints/mod_verto/mod_verto.c @@ -1171,7 +1171,7 @@ static void tech_reattach(verto_pvt_t *tech_pvt, jsock_t *jsock) switch_channel_set_flag(tech_pvt->channel, CF_REINVITE); switch_channel_set_flag(tech_pvt->channel, CF_RECOVERING); - switch_core_media_gen_local_sdp(tech_pvt->session, SDP_TYPE_RESPONSE, NULL, 0, NULL, 0); + switch_core_media_gen_local_sdp(tech_pvt->session, SDP_TYPE_REQUEST, NULL, 0, NULL, 0); switch_channel_clear_flag(tech_pvt->channel, CF_REINVITE); switch_channel_clear_flag(tech_pvt->channel, CF_RECOVERING); switch_core_session_request_video_refresh(tech_pvt->session); diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 389873fbda..1601e85382 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -157,6 +157,7 @@ typedef struct switch_rtp_engine_s { uint8_t nack; uint8_t tmmbr; uint8_t no_crypto; + uint8_t dtls_controller; switch_codec_settings_t codec_settings; switch_media_flow_t rmode; switch_media_flow_t smode; @@ -3078,23 +3079,6 @@ static int dtls_ok(switch_core_session_t *session) #pragma warning(disable:4702) #endif -//? -SWITCH_DECLARE(switch_call_direction_t) switch_ice_direction(switch_core_session_t *session) -{ - switch_call_direction_t r = switch_channel_direction(session->channel); - - 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; - } - - return r; -} - //? static switch_status_t ip_choose_family(switch_media_handle_t *smh, const char *ip) { @@ -3150,9 +3134,9 @@ static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t const char *val; int ice_seen = 0, cid = 0, ai = 0; - if (engine->ice_in.is_chosen[0] && engine->ice_in.is_chosen[1]) { - return SWITCH_STATUS_SUCCESS; - } + //if (engine->ice_in.is_chosen[0] && engine->ice_in.is_chosen[1]) { + //return SWITCH_STATUS_SUCCESS; + //} engine->ice_in.chosen[0] = 0; engine->ice_in.chosen[1] = 0; @@ -3175,14 +3159,33 @@ static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t if (zstr(attr->a_name)) { continue; } - + if (!strcasecmp(attr->a_name, "ice-ufrag")) { - engine->ice_in.ufrag = switch_core_session_strdup(smh->session, attr->a_value); + if (engine->ice_in.ufrag && !strcmp(engine->ice_in.ufrag, attr->a_value)) { + engine->new_ice = 0; + } else { + engine->ice_in.ufrag = switch_core_session_strdup(smh->session, attr->a_value); + engine->new_ice = 1; + } ice_seen++; } else if (!strcasecmp(attr->a_name, "ice-pwd")) { - engine->ice_in.pwd = switch_core_session_strdup(smh->session, attr->a_value); + if (!engine->ice_in.pwd || strcmp(engine->ice_in.pwd, attr->a_value)) { + engine->ice_in.pwd = switch_core_session_strdup(smh->session, attr->a_value); + } } 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 (!engine->dtls_controller) { + engine->new_dtls = 1; + } + engine->dtls_controller = 1; + } else if (!strcasecmp(attr->a_value, "active")) { + if (engine->dtls_controller) { + engine->new_dtls = 1; + } + engine->dtls_controller = 0; + } } else if (switch_rtp_has_dtls() && dtls_ok(smh->session) && !strcasecmp(attr->a_name, "fingerprint") && !zstr(attr->a_value)) { char *p; @@ -3190,9 +3193,17 @@ static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t if ((p = strchr(engine->remote_dtls_fingerprint.type, ' '))) { *p++ = '\0'; - switch_set_string(engine->local_dtls_fingerprint.str, p); + + if (switch_channel_test_flag(smh->session->channel, CF_REINVITE) && !switch_channel_test_flag(smh->session->channel, CF_RECOVERING) && + !zstr(engine->remote_dtls_fingerprint.str) && !strcmp(engine->remote_dtls_fingerprint.str, p)) { + engine->new_dtls = 0; + } else { + switch_set_string(engine->remote_dtls_fingerprint.str, p); + engine->new_dtls = 1; + } } + //if (strcasecmp(engine->remote_dtls_fingerprint.type, "sha-256")) { // switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(smh->session), SWITCH_LOG_WARNING, "Unsupported fingerprint type.\n"); //engine->local_dtls_fingerprint.type = NULL; @@ -3403,8 +3414,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_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), + engine->dtls_controller ? (ICE_VANILLA | ICE_CONTROLLED) : ICE_VANILLA, &engine->ice_in #endif ); @@ -3458,8 +3468,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_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), + engine->dtls_controller ? (ICE_VANILLA | ICE_CONTROLLED) : ICE_VANILLA, &engine->ice_in #endif ); @@ -3590,22 +3599,10 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s switch_channel_clear_flag(smh->session->channel, CF_DTLS); } - /* may have to test for a new dtls fingerprint here too and clear these flags */ - if (switch_channel_test_flag(smh->session->channel, CF_REINVITE) && !switch_channel_test_flag(smh->session->channel, CF_RECOVERING)) { - a_engine->new_ice = 0; - a_engine->new_dtls = 0; - v_engine->new_ice = 0; - v_engine->new_dtls = 0; - } else { - a_engine->new_ice = 1; - a_engine->new_dtls = 1; - v_engine->new_ice = 1; - v_engine->new_dtls = 1; - } - - //if (switch_channel_test_flag(session->channel, CF_REINVITE)) { - // switch_core_media_clear_ice(session); - //} + v_engine->new_dtls = 1; + v_engine->new_ice = 1; + a_engine->new_dtls = 1; + a_engine->new_ice = 1; switch_core_session_parse_crypto_prefs(session); @@ -4314,7 +4311,7 @@ SWITCH_DECLARE(uint8_t) switch_core_media_negotiate_sdp(switch_core_session_t *s } } - + if (match) { char tmp[50]; //const char *mirror = switch_channel_get_variable(session->channel, "rtp_mirror_remote_audio_codec_payload"); @@ -5839,7 +5836,7 @@ static void check_dtls_reinvite(switch_core_session_t *session, switch_rtp_engin if (switch_channel_test_flag(session->channel, CF_REINVITE) && engine->new_dtls) { if (!zstr(engine->local_dtls_fingerprint.str) && switch_rtp_has_dtls() && dtls_ok(session)) { - dtls_type_t xtype, dtype = switch_ice_direction(session) == SWITCH_CALL_DIRECTION_INBOUND ? DTLS_TYPE_CLIENT : DTLS_TYPE_SERVER; + dtls_type_t xtype, dtype = engine->dtls_controller ? DTLS_TYPE_CLIENT : DTLS_TYPE_SERVER; switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "RE-SETTING %s DTLS\n", type2str(engine->type)); @@ -6174,8 +6171,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_ice_direction(session) == - SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), + a_engine->dtls_controller ? (ICE_VANILLA | ICE_CONTROLLED) : ICE_VANILLA, &a_engine->ice_in #endif ); @@ -6227,8 +6223,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_ice_direction(session) == - SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), + a_engine->dtls_controller ? (ICE_VANILLA | ICE_CONTROLLED) : ICE_VANILLA, &a_engine->ice_in #endif ); @@ -6556,8 +6551,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_ice_direction(session) == - SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), + v_engine->dtls_controller ? (ICE_VANILLA | ICE_CONTROLLED) : ICE_VANILLA, &v_engine->ice_in #endif ); @@ -6607,9 +6601,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi ICE_GOOGLE_JINGLE, NULL #else - switch_ice_direction(session) == - SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED), - + v_engine->dtls_controller ? (ICE_VANILLA | ICE_CONTROLLED) : ICE_VANILLA, &v_engine->ice_in #endif ); @@ -6713,14 +6705,14 @@ static const char *get_media_profile_name(switch_core_session_t *session, int se } -static char *get_setup(switch_core_session_t *session, switch_sdp_type_t sdp_type) +static char *get_setup(switch_rtp_engine_t *engine, switch_core_session_t *session, switch_sdp_type_t sdp_type) { - if ((sdp_type == SDP_TYPE_RESPONSE || switch_channel_test_flag(session->channel, CF_REINVITE)) && - !switch_channel_test_flag(session->channel, CF_RECOVERING)) { - return "active"; + if (sdp_type == SDP_TYPE_REQUEST) { + engine->dtls_controller = 0; + return "actpass"; + } else { + return engine->dtls_controller ? "active" : "passive"; } - - return "actpass"; } //? @@ -6891,7 +6883,7 @@ static void generate_m(switch_core_session_t *session, char *buf, size_t buflen, if (!zstr(a_engine->local_dtls_fingerprint.type) && secure) { switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "a=fingerprint:%s %s\na=setup:%s\n", a_engine->local_dtls_fingerprint.type, - a_engine->local_dtls_fingerprint.str, get_setup(session, sdp_type)); + a_engine->local_dtls_fingerprint.str, get_setup(a_engine, session, sdp_type)); } if (smh->mparams->rtcp_audio_interval_msec) { @@ -7596,7 +7588,7 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess if (!zstr(a_engine->local_dtls_fingerprint.type)) { switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=fingerprint:%s %s\na=setup:%s\n", a_engine->local_dtls_fingerprint.type, - a_engine->local_dtls_fingerprint.str, get_setup(session, sdp_type)); + a_engine->local_dtls_fingerprint.str, get_setup(a_engine, session, sdp_type)); } if (smh->mparams->rtcp_audio_interval_msec) { @@ -8011,7 +8003,7 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess if (!zstr(v_engine->local_dtls_fingerprint.type)) { switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=fingerprint:%s %s\na=setup:%s\n", v_engine->local_dtls_fingerprint.type, - v_engine->local_dtls_fingerprint.str, get_setup(session, sdp_type)); + v_engine->local_dtls_fingerprint.str, get_setup(v_engine, session, sdp_type)); }