diff --git a/include/asterisk/res_pjsip_session.h b/include/asterisk/res_pjsip_session.h index f6ee0f00b477f5ff0614b336dc6fc47cfc89c9e4..6c8cda632527189479559239daf7a33fd44b02c2 100644 --- a/include/asterisk/res_pjsip_session.h +++ b/include/asterisk/res_pjsip_session.h @@ -93,6 +93,8 @@ struct ast_sip_session_media { unsigned int locally_held:1; /*! \brief Does remote support rtcp_mux */ unsigned int remote_rtcp_mux:1; + /*! \brief Does remote support ice */ + unsigned int remote_ice:1; /*! \brief Media type of this session media */ enum ast_media_type type; /*! \brief The write callback when writing frames */ diff --git a/res/res_pjsip_sdp_rtp.c b/res/res_pjsip_sdp_rtp.c index 4f5a0b2744048b6db1b01bd14482b8163cd07dbc..03e50633ae7447d0a7712e4431efbf9415ad75b8 100644 --- a/res/res_pjsip_sdp_rtp.c +++ b/res/res_pjsip_sdp_rtp.c @@ -585,6 +585,10 @@ static void add_ice_to_stream(struct ast_sip_session *session, struct ast_sip_se return; } + if (!session_media->remote_ice) { + return; + } + if ((username = ice->get_ufrag(session_media->rtp))) { attr = pjmedia_sdp_attr_create(pool, "ice-ufrag", pj_cstr(&stmp, username)); media->attr[media->attr_count++] = attr; @@ -639,6 +643,33 @@ static void add_ice_to_stream(struct ast_sip_session *session, struct ast_sip_se ao2_ref(candidates, -1); } +/*! \brief Function which checks for ice attributes in an audio stream */ +static void check_ice_support(struct ast_sip_session *session, struct ast_sip_session_media *session_media, + const struct pjmedia_sdp_media *remote_stream) +{ + struct ast_rtp_engine_ice *ice; + const pjmedia_sdp_attr *attr; + unsigned int attr_i; + + if (!session->endpoint->media.rtp.ice_support || !(ice = ast_rtp_instance_get_ice(session_media->rtp))) { + session_media->remote_ice = 0; + return; + } + + /* Find all of the candidates */ + for (attr_i = 0; attr_i < remote_stream->attr_count; ++attr_i) { + attr = remote_stream->attr[attr_i]; + if (!pj_strcmp2(&attr->name, "candidate")) { + session_media->remote_ice = 1; + break; + } + } + + if (attr_i == remote_stream->attr_count) { + session_media->remote_ice = 0; + } +} + /*! \brief Function which processes ICE attributes in an audio stream */ static void process_ice_attributes(struct ast_sip_session *session, struct ast_sip_session_media *session_media, const struct pjmedia_sdp_session *remote, const struct pjmedia_sdp_media *remote_stream) @@ -1352,6 +1383,9 @@ static int negotiate_incoming_sdp_stream(struct ast_sip_session *session, enable_rtcp(session, session_media, stream); } + /* If ICE support is enabled find all the needed attributes */ + check_ice_support(session, session_media, stream); + if (set_caps(session, session_media, session_media_transport, stream, 1, asterisk_stream)) { return 0; } diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index c89a7a33b3eff6e892ddb706b10f78adf10a38fa..1300850ed6836d3c595dbd2a9f21482e56d42936 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -444,6 +444,7 @@ struct ast_sip_session_media *ast_sip_session_media_state_add(struct ast_sip_ses } session_media->encryption = session->endpoint->media.rtp.encryption; + session_media->remote_ice = session->endpoint->media.rtp.ice_support; session_media->keepalive_sched_id = -1; session_media->timeout_sched_id = -1; session_media->type = type;