Adopts XEP-0343 for DTLS/SCTP Jingle signaling.

This commit is contained in:
paweldomas 2014-05-26 14:54:17 +02:00 committed by yanas
parent 8ba531ed22
commit be42629a63
3 changed files with 42 additions and 32 deletions

View File

@ -423,7 +423,7 @@ ColibriFocus.prototype.createdConference = function (result) {
else else
{ {
var sctpmap = SDPUtil.find_line(media, 'a=sctpmap:' + mline.fmt[0]); var sctpmap = SDPUtil.find_line(media, 'a=sctpmap:' + mline.fmt[0]);
var sctpPort = SDPUtil.parse_sctpmap(sctpmap); var sctpPort = SDPUtil.parse_sctpmap(sctpmap)[0];
elem.c("sctpconnection", elem.c("sctpconnection",
{ {
initiator: 'true', initiator: 'true',
@ -712,7 +712,7 @@ ColibriFocus.prototype.updateChannel = function (remoteSDP, participant) {
change.c('sctpconnection', { change.c('sctpconnection', {
endpoint: $(this.channels[participant][channel]).attr('endpoint'), endpoint: $(this.channels[participant][channel]).attr('endpoint'),
expire: self.channelExpire, expire: self.channelExpire,
port: SDPUtil.parse_sctpmap(sctpmap) port: SDPUtil.parse_sctpmap(sctpmap)[0]
}); });
} }
// now add transport // now add transport

View File

@ -179,24 +179,6 @@ SDP.prototype.toJingle = function (elem, thecreator) {
bundle.splice(bundle.indexOf(mid), 1); bundle.splice(bundle.indexOf(mid), 1);
} }
} }
// Sctp
if (SDPUtil.find_line(this.media[i], 'a=sctpmap:').length)
{
for (j = 0; j < mline.fmt.length; j++)
{
var sctpmap = SDPUtil.find_line(
this.media[i], 'a=sctpmap:' + mline.fmt[j]);
if (sctpmap)
{
elem.c('sctp',
{
xmlns: 'http://jitsi.org/ns/sctp',
port : SDPUtil.parse_sctpmap(sctpmap)
});
elem.up();
}
}
}
if (SDPUtil.find_line(this.media[i], 'a=rtpmap:').length) if (SDPUtil.find_line(this.media[i], 'a=rtpmap:').length)
{ {
@ -327,6 +309,26 @@ SDP.prototype.TransportToJingle = function (mediaindex, elem) {
var self = this; var self = this;
elem.c('transport'); elem.c('transport');
// XEP-0343 DTLS/SCTP
if (SDPUtil.find_line(this.media[mediaindex], 'a=sctpmap:').length)
{
var sctpmap = SDPUtil.find_line(
this.media[i], 'a=sctpmap:', self.session);
if (sctpmap)
{
var sctpAttrs = SDPUtil.parse_sctpmap(sctpmap);
elem.c('sctpmap',
{
xmlns: 'urn:xmpp:jingle:transports:dtls-sctp:1',
number: sctpAttrs[0], /* SCTP port */
protocol: sctpAttrs[1], /* protocol */
});
// Optional stream count attribute
if (sctpAttrs.length > 2)
elem.attrs({ streams: sctpAttrs[2]});
elem.up();
}
}
// XEP-0320 // XEP-0320
var fingerprints = SDPUtil.find_lines(this.media[mediaindex], 'a=fingerprint:', this.session); var fingerprints = SDPUtil.find_lines(this.media[mediaindex], 'a=fingerprint:', this.session);
fingerprints.forEach(function(line) { fingerprints.forEach(function(line) {
@ -461,11 +463,8 @@ SDP.prototype.jingle2media = function (content) {
ssrc = desc.attr('ssrc'), ssrc = desc.attr('ssrc'),
self = this, self = this,
tmp; tmp;
var sctp = null; var sctp = content.find(
if (!desc.length) '>transport>sctpmap[xmlns="urn:xmpp:jingle:transports:dtls-sctp:1"]');
{
sctp = content.find('sctp');
}
tmp = { media: desc.attr('media') }; tmp = { media: desc.attr('media') };
tmp.port = '1'; tmp.port = '1';
@ -474,14 +473,14 @@ SDP.prototype.jingle2media = function (content) {
tmp.port = '0'; tmp.port = '0';
} }
if (content.find('>transport>fingerprint').length || desc.find('encryption').length) { if (content.find('>transport>fingerprint').length || desc.find('encryption').length) {
if (sctp) if (sctp.length)
tmp.proto = 'DTLS/SCTP'; tmp.proto = 'DTLS/SCTP';
else else
tmp.proto = 'RTP/SAVPF'; tmp.proto = 'RTP/SAVPF';
} else { } else {
tmp.proto = 'RTP/AVPF'; tmp.proto = 'RTP/AVPF';
} }
if (!sctp) if (!sctp.length)
{ {
tmp.fmt = desc.find('payload-type').map( tmp.fmt = desc.find('payload-type').map(
function () { return this.getAttribute('id'); }).get(); function () { return this.getAttribute('id'); }).get();
@ -489,12 +488,19 @@ SDP.prototype.jingle2media = function (content) {
} }
else else
{ {
media += 'm=application 1 DTLS/SCTP ' + sctp.attr('port') + '\r\n'; media += 'm=application 1 DTLS/SCTP ' + sctp.attr('number') + '\r\n';
media += 'a=sctpmap:' + sctp.attr('port') + ' webrtc-datachannel\r\n'; media += 'a=sctpmap:' + sctp.attr('number') +
' ' + sctp.attr('protocol');
var streamCount = sctp.attr('streams');
if (streamCount)
media += ' ' + streamCount + '\r\n';
else
media += '\r\n';
} }
media += 'c=IN IP4 0.0.0.0\r\n'; media += 'c=IN IP4 0.0.0.0\r\n';
if (!sctp) if (!sctp.length)
media += 'a=rtcp:1 IN IP4 0.0.0.0\r\n'; media += 'a=rtcp:1 IN IP4 0.0.0.0\r\n';
tmp = content.find('>transport[xmlns="urn:xmpp:jingle:transports:ice-udp:1"]'); tmp = content.find('>transport[xmlns="urn:xmpp:jingle:transports:ice-udp:1"]');
if (tmp.length) { if (tmp.length) {

View File

@ -93,12 +93,16 @@ SDPUtil = {
/** /**
* Parses SDP line "a=sctpmap:..." and extracts SCTP port from it. * Parses SDP line "a=sctpmap:..." and extracts SCTP port from it.
* @param line eg. "a=sctpmap:5000 webrtc-datachannel" * @param line eg. "a=sctpmap:5000 webrtc-datachannel"
* @returns SCTP port number * @returns [SCTP port number, protocol, streams]
*/ */
parse_sctpmap: function (line) parse_sctpmap: function (line)
{ {
var parts = line.substring(10).split(' '); var parts = line.substring(10).split(' ');
return parts[0];// SCTP port var sctpPort = parts[0];
var protocol = parts[1];
// Stream count is optional
var streamCount = parts.length > 2 ? parts[2] : null;
return [sctpPort, protocol, streamCount];// SCTP port
}, },
build_rtpmap: function (el) { build_rtpmap: function (el) {
var line = 'a=rtpmap:' + el.getAttribute('id') + ' ' + el.getAttribute('name') + '/' + el.getAttribute('clockrate'); var line = 'a=rtpmap:' + el.getAttribute('id') + ' ' + el.getAttribute('name') + '/' + el.getAttribute('clockrate');