From a1cb0080871d1fff727e4b339e8c06f9948b8bef Mon Sep 17 00:00:00 2001 From: Chris Ayoup Date: Thu, 13 Dec 2018 18:21:29 +0000 Subject: [PATCH] FS-11646: Improved support for ICE-lite 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 | 3 ++- src/switch_core_media.c | 45 ++++++++++++++++++++++---------------- src/switch_rtp.c | 5 +++++ 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 926c8a6bea..f871a79316 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -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 { diff --git a/src/switch_core_media.c b/src/switch_core_media.c index 4df391da54..c88656e9ac 100644 --- a/src/switch_core_media.c +++ b/src/switch_core_media.c @@ -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); diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 824e01b7ee..15f53fc05f 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -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; }