]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-11646: Improved support for ICE-lite
authorChris Ayoup <ayochris@amazon.com>
Thu, 13 Dec 2018 18:21:29 +0000 (18:21 +0000)
committerChris Ayoup <ayochris@amazon.com>
Tue, 5 Feb 2019 18:17:35 +0000 (13:17 -0500)
Specifically:
* Send the a=ice-lite SDP attribute as a session-level attribute
* Suppress sending STUN connectivity checks when enabled
* Make sure FS is the controlled entity if it is declaring ICE-lite

src/include/switch_types.h
src/switch_core_media.c
src/switch_rtp.c

index 926c8a6bea0c6009d78d073e7fa7b10f2d68cd75..f871a79316a7045f41b8962ae459223172434d54 100644 (file)
@@ -2642,7 +2642,8 @@ typedef enum {
 typedef enum {
        ICE_GOOGLE_JINGLE = (1 << 0),
        ICE_VANILLA = (1 << 1),
-       ICE_CONTROLLED = (1 << 2)
+       ICE_CONTROLLED = (1 << 2),
+       ICE_LITE = (1 << 3)
 } switch_core_media_ice_type_t;
 
 typedef enum {
index 4df391da54754b41a5e2d3a8090cf58d7580eee7..c88656e9acfb6e2af88c669fbcb6080b27125eda 100644 (file)
@@ -4008,6 +4008,21 @@ static switch_call_direction_t switch_ice_direction(switch_rtp_engine_t *engine,
        return r;
 }
 
+static switch_core_media_ice_type_t switch_determine_ice_type(switch_rtp_engine_t *engine, switch_core_session_t *session) {
+       switch_core_media_ice_type_t ice_type = ICE_VANILLA;
+
+       if (switch_channel_var_true(session->channel, "ice_lite")) {
+               ice_type |= ICE_CONTROLLED;
+               ice_type |= ICE_LITE;
+       } else {
+               switch_call_direction_t direction = switch_ice_direction(engine, session);
+               if (direction == SWITCH_CALL_DIRECTION_INBOUND) {
+                       ice_type |= ICE_CONTROLLED;
+               }
+       }
+
+       return ice_type;
+}
 
 //?
 static switch_status_t ip_choose_family(switch_media_handle_t *smh, const char *ip)
@@ -4405,8 +4420,7 @@ static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t
                                                                        ICE_GOOGLE_JINGLE,
                                                                        NULL
 #else
-                                                                       switch_ice_direction(engine, smh->session) ==
-                                                                       SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED),
+                                                                       switch_determine_ice_type(engine, smh->session),
                                                                        &engine->ice_in
 #endif
                                                                        );
@@ -4460,8 +4474,7 @@ static switch_status_t check_ice(switch_media_handle_t *smh, switch_media_type_t
                                                                                ICE_GOOGLE_JINGLE,
                                                                                NULL
 #else
-                                                                               switch_ice_direction(engine, smh->session) ==
-                                                                               SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED),
+                                                                               switch_determine_ice_type(engine, smh->session),
                                                                                &engine->ice_in
 #endif
                                                                                );
@@ -8699,8 +8712,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi
                                                                        ICE_GOOGLE_JINGLE,
                                                                        NULL
 #else
-                                                                       switch_ice_direction(a_engine, session) ==
-                                                                       SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED),
+                                                                       switch_determine_ice_type(a_engine, session),
                                                                        &a_engine->ice_in
 #endif
                                                                        );
@@ -8753,8 +8765,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi
                                                                                        ICE_GOOGLE_JINGLE,
                                                                                        NULL
 #else
-                                                                                       switch_ice_direction(a_engine, session) ==
-                                                                                       SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED),
+                                                                                       switch_determine_ice_type(a_engine, session),
                                                                                        &a_engine->ice_in
 #endif
                                                                                );
@@ -9065,8 +9076,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi
                                                                                        ICE_GOOGLE_JINGLE,
                                                                                        NULL
 #else
-                                                                                       switch_ice_direction(t_engine, session) ==
-                                                                                       SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED),
+                                                                                       switch_determine_ice_type(t_engine, session),
                                                                                        &t_engine->ice_in
 #endif
                                                                                        );
@@ -9117,8 +9127,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi
                                                                                                        ICE_GOOGLE_JINGLE,
                                                                                                        NULL
 #else
-                                                                                                       switch_ice_direction(t_engine, session) ==
-                                                                                                       SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED),
+                                                                                                       switch_determine_ice_type(t_engine, session),
                                                                                                        &t_engine->ice_in
 #endif
                                                                                                        );
@@ -9393,8 +9402,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi
                                                                                        ICE_GOOGLE_JINGLE,
                                                                                        NULL
 #else
-                                                                                       switch_ice_direction(v_engine, session) ==
-                                                                                       SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED),
+                                                                                       switch_determine_ice_type(v_engine, session),
                                                                                        &v_engine->ice_in
 #endif
                                                                                        );
@@ -9446,8 +9454,7 @@ SWITCH_DECLARE(switch_status_t) switch_core_media_activate_rtp(switch_core_sessi
                                                                                                        ICE_GOOGLE_JINGLE,
                                                                                                        NULL
 #else
-                                                                                                       switch_ice_direction(v_engine, session) ==
-                                                                                                       SWITCH_CALL_DIRECTION_OUTBOUND ? ICE_VANILLA : (ICE_VANILLA | ICE_CONTROLLED),
+                                                                                                       switch_determine_ice_type(v_engine, session),
                                                                                                        &v_engine->ice_in
 #endif
                                                                                                        );
@@ -10364,6 +10371,9 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess
                                        "%s",
                                        username, smh->owner_id, smh->session_id, family, ip, username, family, ip, srbuf);
 
+       if (switch_channel_test_flag(smh->session->channel, CF_ICE) && switch_channel_var_true(session->channel, "ice_lite")) {
+               switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=ice-lite\r\n");
+       }
 
        if (a_engine->rmode == SWITCH_MEDIA_FLOW_DISABLED) {
                goto video;
@@ -10580,9 +10590,6 @@ SWITCH_DECLARE(void) switch_core_media_gen_local_sdp(switch_core_session_t *sess
                        }
 
                        switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=end-of-candidates\r\n");
-                       if (switch_true(switch_channel_get_variable(session->channel, "ice_lite"))) {
-                               switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=ice-lite\r\n");
-                       }
 
                        switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=ssrc:%u cname:%s\r\n", a_engine->ssrc, smh->cname);
                        switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=ssrc:%u msid:%s a0\r\n", a_engine->ssrc, smh->msid);
index 824e01b7eea020377c6bd659aa864bdebdfb87fd..15f53fc05f7109915b15141c75470129de3bf8b5 100644 (file)
@@ -808,6 +808,11 @@ static switch_status_t ice_out(switch_rtp_t *rtp_session, switch_rtp_ice_t *ice)
        switch_socket_t *sock_output = rtp_session->sock_output;
        switch_time_t now = switch_micro_time_now();
 
+       if (ice->type & ICE_LITE) {
+               // no connectivity checks for ICE-Lite
+               return SWITCH_STATUS_BREAK;
+       }
+
        if (ice->next_run && ice->next_run > now) {
                return SWITCH_STATUS_BREAK;
        }