Merge "res_pjsip_sdp_rtp: include ice in ANSWER only if offered"

This commit is contained in:
George Joseph 2018-07-18 14:29:19 -05:00 committed by Gerrit Code Review
commit c8e4cd8bce
3 changed files with 37 additions and 0 deletions

View File

@ -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 */

View File

@ -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;
}

View File

@ -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;