Standalone Videobridge Help

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

  1. Create the conference:

    [axios] Starting Request to http://192.168.1.19:8080/colibri/conferences {}
    [axios] Response: { id: ‘69c3350b16137b2f’ }

  2. 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’ }

  3. 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’ ]

  4. 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’

  5. 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’ }

  6. 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