res_pjsip_sdp_rtp: Accept DTLS attributes in top level, not just media session.

#SIPit31
........

Merged revisions 424287 from http://svn.asterisk.org/svn/asterisk/branches/12


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@424288 65c4cc65-6c06-0410-ace0-fbb531ad65f3
changes/97/197/1
Joshua Colp 11 years ago
parent e3da76a352
commit 0de2d080c2

@ -588,18 +588,14 @@ static int setup_dtls_srtp(struct ast_sip_session *session,
return 0;
}
static int parse_dtls_attrib(struct ast_sip_session_media *session_media,
const struct pjmedia_sdp_media *stream)
static void apply_dtls_attrib(struct ast_sip_session_media *session_media,
pjmedia_sdp_attr *attr)
{
int i;
struct ast_rtp_engine_dtls *dtls = ast_rtp_instance_get_dtls(session_media->rtp);
for (i = 0; i < stream->attr_count; i++) {
pjmedia_sdp_attr *attr = stream->attr[i];
pj_str_t *value;
if (!attr->value.ptr) {
continue;
return;
}
value = pj_strtrim(&attr->value);
@ -628,7 +624,6 @@ static int parse_dtls_attrib(struct ast_sip_session_media *session_media,
char hash_value[256], hash[32];
char fingerprint_text[value->slen + 1];
ast_copy_pj_str(fingerprint_text, value, sizeof(fingerprint_text));
if (sscanf(fingerprint_text, "%31s %255s", hash, hash_value) == 2) {
if (!strcasecmp(hash, "sha-1")) {
dtls->set_fingerprint(session_media->rtp, AST_RTP_DTLS_HASH_SHA1, hash_value);
@ -641,6 +636,21 @@ static int parse_dtls_attrib(struct ast_sip_session_media *session_media,
}
}
}
static int parse_dtls_attrib(struct ast_sip_session_media *session_media,
const struct pjmedia_sdp_session *sdp,
const struct pjmedia_sdp_media *stream)
{
int i;
for (i = 0; i < sdp->attr_count; i++) {
apply_dtls_attrib(session_media, sdp->attr[i]);
}
for (i = 0; i < stream->attr_count; i++) {
apply_dtls_attrib(session_media, stream->attr[i]);
}
ast_set_flag(session_media->srtp, AST_SRTP_CRYPTO_OFFER_OK);
return 0;
@ -684,6 +694,7 @@ static int setup_sdes_srtp(struct ast_sip_session_media *session_media,
static int setup_media_encryption(struct ast_sip_session *session,
struct ast_sip_session_media *session_media,
const struct pjmedia_sdp_session *sdp,
const struct pjmedia_sdp_media *stream)
{
switch (session->endpoint->media.rtp.encryption) {
@ -696,7 +707,7 @@ static int setup_media_encryption(struct ast_sip_session *session,
if (setup_dtls_srtp(session, session_media)) {
return -1;
}
if (parse_dtls_attrib(session_media, stream)) {
if (parse_dtls_attrib(session_media, sdp, stream)) {
return -1;
}
break;
@ -744,7 +755,7 @@ 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 (setup_media_encryption(session, session_media, stream)) {
if (setup_media_encryption(session, session_media, sdp, stream)) {
return -1;
}
@ -1061,7 +1072,7 @@ static int apply_negotiated_sdp_stream(struct ast_sip_session *session, struct a
return -1;
}
if (setup_media_encryption(session, session_media, remote_stream)) {
if (setup_media_encryption(session, session_media, remote, remote_stream)) {
return -1;
}

Loading…
Cancel
Save