]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-10258: [mod_sofia] FW must keep previously negotiated DTLS role during SIP re...
authorAnthony Minessale <anthm@freeswitch.org>
Mon, 24 Apr 2017 17:22:03 +0000 (12:22 -0500)
committerBrian West <brian@freeswitch.org>
Mon, 24 Apr 2017 17:22:03 +0000 (12:22 -0500)
src/include/switch_core.h
src/include/switch_core_media.h
src/switch_core_media.c

index dcbe308067598afd44c1a71f742829b35cf8b81e..4b67660e4409edb1f623d54bee368c96355261e8 100644 (file)
@@ -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);
index 906a6b104f98b91cb5594a90fd1cc0b6155edd8d..d4690339f2f5eb5547c98e0ed60cdd673e26b3a1 100644 (file)
@@ -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:
index 701a982bae7290c3541b26dcbf6316f82549e48a..86490e9c66ba459d9f8fa02a26ea1540175b7020 100644 (file)
@@ -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