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