Hey Jitsi Team,
Need your help in debugging my customized solution that uses Videobridge by itself. I have my own signaling service already, which seems to be able to negotiate SDP properly using the bridge. I am having an issue where it looks like UDP traffic is not able to pass between clients.
For starters, I am using the REST Colibri API. Here is the log from my signaling server
-
Create the conference:
[axios] Starting Request to http://192.168.1.19:8080/colibri/conferences {}
[axios] Response: { id: ‘69c3350b16137b2f’ } -
Patch the conference for a client
[axios] Starting Request to http://192.168.1.19:8080/colibri/conferences/69c3350b16137b2f { id: ‘69c3350b16137b2f’,
contents:
[ { name: ‘audio’,
channels:
[ ColibriAudioChannel {
expire: 10,
initiator: true,
endpoint: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
‘channel-bundle-id’: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
direction: ‘sendrecv’,
‘rtp-level-relay-type’: ‘mixer’ } ] },
{ name: ‘data’,
sctpconnections:
[ ColibriDataConnection {
expire: 20,
initiator: true,
endpoint: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
‘channel-bundle-id’: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
port: 5000 } ] } ],
‘channel-bundles’:
[ ColibriChannelBundle {
id: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
transport:
{ xlns: ‘urn:xmpp:jingle:transports:ice-udp:1’,
‘rtcp-mux’: true } } ] }[axios] Response: { ‘channel-bundles’:
[ { id: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
transport:
{ candidates:
[ { generation: ‘0’,
component: ‘1’,
protocol: ‘udp’,
port: ‘10000’,
ip: ‘192.168.1.19’,
foundation: ‘1’,
id: ‘698442b72e80c8a30ffffffffe6af73cb’,
priority: ‘2130706431’,
type: ‘host’,
network: ‘0’ },
{ generation: ‘0’,
‘rel-port’: ‘10000’,
component: ‘1’,
protocol: ‘udp’,
port: ‘10000’,
ip: ‘redacted’,
foundation: ‘2’,
id: ‘e396f492e80c8a306dc3543d’,
‘rel-addr’: ‘192.168.1.19’,
priority: ‘1694498815’,
type: ‘srflx’,
network: ‘0’ } ],
xmlns: ‘urn:xmpp:jingle:transports:ice-udp:1’,
ufrag: ‘f8vq1e9esdksk’,
‘rtcp-mux’: true,
pwd: ‘3s7jul14v4g35ufnvb44bk6mlf’,
fingerprints:
[ { fingerprint:
‘C1:15:16:65:2E:24:24:E3:23:DA:13:52:EB:18:1C:17:AA:8B:73:75:04:A5:82:75:6C:3F:7D:D1:43:B8:AB:CF’,
setup: ‘actpass’,
hash: ‘sha-256’ } ] } } ],
endpoints: [ { id: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’ } ],
contents:
[ { channels:
[ { endpoint: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
‘channel-bundle-id’: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
sources: [ 67884307 ],
‘rtp-level-relay-type’: ‘translator’,
initiator: true,
id: ‘21d5776a856b6464’,
‘receive-simulcast-layer’: null,
direction: ‘sendrecv’,
‘last-n’: -1 } ],
name: ‘audio’ },
{ sctpconnections:
[ { endpoint: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
‘channel-bundle-id’: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
port: 5000,
initiator: true,
id: ‘403666e2569fd1b9’ } ],
name: ‘data’ } ],
id: ‘69c3350b16137b2f’ } -
Generate SDP for the client
[ ‘m=audio 1 RTP/SAVPF 111\r\n’,
‘c=IN IP4 0.0.0.0\r\n’,
‘a=rtpmap:111 opus/48000/2\r\n’,
‘a=fmtp:111 minptime=10; useinbandfec=1\r\n’,
‘a=rtcp:1 IN IP4 0.0.0.0\r\n’,
‘a=rtcp-fb:111 transport-cc\r\n’,
‘a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n’,
‘a=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\n’,
‘a=mid:audio\r\n’,
‘a=sendrecv\r\n’,
‘a=ice-ufrag:f8vq1e9esdksk\r\n’,
‘a=ice-pwd:3s7jul14v4g35ufnvb44bk6mlf\r\n’,
‘a=setup:actpass\r\n’,
‘a=fingerprint:sha-256 C1:15:16:65:2E:24:24:E3:23:DA:13:52:EB:18:1C:17:AA:8B:73:75:04:A5:82:75:6C:3F:7D:D1:43:B8:AB:CF\r\n’,
‘a=candidate:1 1 udp 2130706431 192.168.1.19 10000 typ host generation 0\r\n’,
‘a=candidate:2 1 udp 1694498815 redacted 10000 typ srflx raddr 192.168.1.19 rport 10000 generation 0\r\n’,
‘a=ssrc:67884307 cname:mixed\r\n’,
‘a=ssrc:67884307 label:mixedlabelaudio0\r\n’,
‘a=ssrc:67884307 msid:mixedmslabel mixedlabelaudio0\r\n’,
‘a=ssrc:67884307 mslabel:mixedmslabel\r\n’,
‘a=rtcp-mux\r\n’ ] -
Receive SDP answer from the client
v=0\r\n
o=- 7102330483378968268 2 IN IP4 127.0.0.1\r\n
s=-\r\n
t=0 0\r\n
a=group:BUNDLE audio\r\n
a=msid-semantic: WMS stream\r\n
m=audio 9 RTP/SAVPF 111\r\n
c=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\n
a=ice-ufrag:OZWF\r\n
a=ice-pwd:qKe357dUyMThPKmbzSk5Kxmh\r\n
a=ice-options:trickle renomination\r\n
a=fingerprint:sha-256 8B:30:6C:3D:EC:09:61:52:01:16:79:53:84:BA:51:75:E4:37:2E:5D:CE:3C:B2:78:C7:BA:6C:53:95:7B:25:C1\r\n
a=setup:active\r\na=mid:audio\r\n
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n
a=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\n
a=sendrecv\r\n
a=rtcp-mux\r\n
a=rtpmap:111 opus/48000/2\r\n
a=rtcp-fb:111 transport-cc\r\n
a=fmtp:111 minptime=10;useinbandfec=1\r\n
a=ssrc:549893782 cname:fyax0yXZ3mX9OySH\r\n
a=ssrc:549893782 msid:stream audio0\r\n
a=ssrc:549893782 mslabel:stream\r\n
a=ssrc:549893782 label:audio0\r\n’ -
Patch the conference based on the SDP answer
[axios] Starting Request to http://192.168.1.19:8080/colibri/conferences/69c3350b16137b2f { id: ‘69c3350b16137b2f’,
contents:
[ { name: ‘audio’,
channels:
[ { id: ‘21d5776a856b6464’,
initiator: true,
ssrcs: [ 776747062 ],
endpoint: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
‘channel-bundle-id’: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
‘payload-types’:
[ { id: 111,
name: ‘opus’,
clockrate: ‘48000’,
channels: ‘2’,
parameters: { minptime: 10, useinbandfec: 1 } } ],
‘rtp-hdrexts’:
[ { id: 1, uri: ‘urn:ietf:params:rtp-hdrext:ssrc-audio-level’ },
{ id: 5,
uri:
‘http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01’ } ] } ] } ] }
[axios] Response: { ‘channel-bundles’:
[ { id: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
transport:
{ candidates:
[ { generation: ‘0’,
component: ‘1’,
protocol: ‘udp’,
port: ‘10000’,
ip: ‘192.168.1.19’,
foundation: ‘1’,
id: ‘41c51cf52e80c8a30ffffffffe6af73cb’,
priority: ‘2130706431’,
type: ‘host’,
network: ‘0’ },
{ generation: ‘0’,
‘rel-port’: ‘10000’,
component: ‘1’,
protocol: ‘udp’,
port: ‘10000’,
ip: ‘redacted’,
foundation: ‘2’,
id: ‘5050e4922e80c8a306dc3543d’,
‘rel-addr’: ‘192.168.1.19’,
priority: ‘1694498815’,
type: ‘srflx’,
network: ‘0’ } ],
xmlns: ‘urn:xmpp:jingle:transports:ice-udp:1’,
ufrag: ‘f8vq1e9esdksk’,
‘rtcp-mux’: true,
pwd: ‘3s7jul14v4g35ufnvb44bk6mlf’,
fingerprints:
[ { fingerprint:
‘C1:15:16:65:2E:24:24:E3:23:DA:13:52:EB:18:1C:17:AA:8B:73:75:04:A5:82:75:6C:3F:7D:D1:43:B8:AB:CF’,
setup: ‘actpass’,
hash: ‘sha-256’ } ] } } ],
endpoints:
[ { id: ‘f048e74d-0751-467b-b875-5bbf812e7190’ },
{ id: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’ } ],
contents:
[ { channels:
[ { endpoint: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
‘channel-bundle-id’: ‘998c4101-e8d7-418b-9951-3ec53f6dd6c6’,
sources: [ 67884307 ],
‘rtp-level-relay-type’: ‘translator’,
initiator: true,
id: ‘21d5776a856b6464’,
‘receive-simulcast-layer’: null,
direction: ‘sendrecv’,
‘last-n’: -1 } ],
name: ‘audio’ } ],
id: ‘69c3350b16137b2f’ } -
The WebRTC client sets the ICECandidate based on the SDP provided and tries to connect. I see a bunch of DTLS client hello packets going to the Videobridge on the correct port, but it eventually ends in failure. On the bridge side, I see a log saying it is shutting down the connection:
2020-05-28 22:42:29.359 INFO: [25] [confId= **2c1b7dab7032f15c** epId=c2c2cb61-065c-46ff-bfe2-ceae0c5408f3] Endpoint.shouldExpire#732: Endpoint's ICE connection has neither failed nor connected after PT2M20.722S, expiring
Any help would be appreciated