On 07/17/14 12:48, Waite, Hugh wrote:
Hi,
I am using rtpengine to convert SRTP to RTP for audio and video and I am also doing this for reINVITEs.
At the moment I am using Chrome on the SRTP side and Linphone on the RTP side. So far, Linphone has been the most stable for sending and receiving VP8 video calls.
Linphone does not do ICE, but Chrome does. I need to force all traffic through rtpengine (to encrypt/decrypt) so I use the “ICE=force” flag in both directions.
I’ve put the SDP content of an on-hold scenario at the end of this email.
When Linphone puts the call on hold, it sets the connection to “c=0.0.0.0” and the direction to “a=sendonly” in the reINVITE. However, it does keep the same valid port numbers on the m= lines.
RTPEngine processes this and sends SDP to Chrome that has “c=0.0.0.0”, “a=ice-lite” and “a=inactive”. The port numbers are set to 0 (disabled/rejected)
Chrome does some other interesting stuff with that, so I am investigating.
RFC5245 (ICE) §9 is all about subsequent offer-answer exchanges. In this ‘on-hold’ scenario, I don’t believe there is any need to restart the ICE processing.
From §9.1.1.1
These rules imply that setting the IP address in the c line to
0.0.0.0 will cause an ICE restart. Consequently, ICE implementations
MUST NOT utilize this mechanism for call hold, and instead MUST use
a=inactive and a=sendonly as described in [RFC3264 http://tools.ietf.org/html/rfc3264].
In a lite implementation, I think that the “a=ice-ufrag” and “a=ice-pwd” attributes need to be included (with the same values) and also the currently selected (active) candidate §9.1.1.1 & §9.1.3.2.
RTPEngine appears to have disabled the two media streams, rather than putting them on hold. Is this a deliberate choice or the best choice given the multiple possibilities of client implementations? And can this behaviour be improved?
If the call is taken off-hold later, I would prefer not to have to do the full ICE restart, including TURN, DTLS handshakes etc. etc. if it can be avoided.
This is one of those cases where no matter what you do, it's always gonna be wrong for somebody. :)
There was a recent commit [1] which slightly changed the behaviour when putting a call on hold in this manner, I suspect your build is older than this. I'm not sure if it would fix your particular issue though.
Rtpengine could translate a null c= address into the respective attributes (and leave a valid c= address), but then you run into the problem of breaking compatibility with clients which don't support or misunderstand this type of signalling.
So yes, there's definitely room for improvement (there always is), it's just a matter of figuring out what the Right Thing[tm] to do is. :)
cheers
[1] https://github.com/sipwise/rtpengine/commit/a7784f5ca3437d1c7b58308022ef0e06...