mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 04:11:08 +00:00
res_pjsip_sdp_rtp: include ice in ANSWER only if offered
Keep track if ICE candidates were in the SDP offer & only put them in the corresponding SDP answer if the offer condaind ICE candidates ASTERISK-27957 #close Change-Id: Idf2597ee48e9a287e07aa4030bfa705430a13a92
This commit is contained in:
committed by
George Joseph
parent
953bdc3365
commit
bd36ec69e2
@@ -85,6 +85,8 @@ struct ast_sip_session_media {
|
||||
unsigned int 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 Stream type this session media handles */
|
||||
char stream_type[1];
|
||||
};
|
||||
|
@@ -531,6 +531,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;
|
||||
@@ -576,6 +580,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)
|
||||
@@ -1033,6 +1064,9 @@ static int negotiate_incoming_sdp_stream(struct ast_sip_session *session, struct
|
||||
pj_strdup(session->inv_session->pool, &session_media->transport, &stream->desc.transport);
|
||||
}
|
||||
|
||||
/* If ICE support is enabled find all the needed attributes */
|
||||
check_ice_support(session, session_media, stream);
|
||||
|
||||
if (set_caps(session, session_media, stream)) {
|
||||
return 0;
|
||||
}
|
||||
|
@@ -1341,6 +1341,7 @@ static int add_session_media(void *obj, void *arg, int flags)
|
||||
return CMP_STOP;
|
||||
}
|
||||
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;
|
||||
/* Safe use of strcpy */
|
||||
|
Reference in New Issue
Block a user