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.
Regards,
Hugh
This is what Linphone sent to rtpengine to put the call on hold.
v=0
o=447707319033 2969 189 IN IP4 10.X.X.X
s=Talk
c=IN IP4 0.0.0.0
t=0 0
m=audio 7078 RTP/AVP 124 111 110 0 8 101
a=rtpmap:124 opus/48000
a=fmtp:124 useinbandfec=1; usedtx=1
a=rtpmap:111 speex/16000
a=fmtp:111 vbr=on
a=rtpmap:110 speex/8000
a=fmtp:110 vbr=on
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendonly
m=video 9078 RTP/AVP 103
a=rtpmap:103 VP8/90000
a=sendonly
This is what rtpengine sent to Chrome
v=0
o=447707319033 2969 189 IN IP4 10.X.X.X
s=Talk
c=IN IP4 0.0.0.0
t=0 0
a=ice-lite
m=audio 0 RTP/SAVPF 124 111 110 0 8 101
a=rtpmap:124 opus/48000
a=fmtp:124 useinbandfec=1; usedtx=1
a=rtpmap:111 speex/16000
a=fmtp:111 vbr=on
a=rtpmap:110 speex/8000
a=fmtp:110 vbr=on
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=inactive
m=video 0 RTP/SAVPF 103
a=rtpmap:103 VP8/90000
a=inactive
This is what Chrome sent back - note the ICE syntax errors!
v=0
o=- 5839956538493318716 3 IN IP4 127.0.0.1
s=-
t=0 0
a=msid-semantic: WMS FS1XDFSCVuztEO87Lm7NEzuFX2EVnOYDP8VS
m=audio 0 RTP/SAVPF 0 8 101
c=IN IP4 0.0.0.0
a=rtcp:1 IN IP4 0.0.0.0
a=ice-ufrag:
a=ice-pwd:
a=mid:audio
a=inactive
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=ssrc:1220950669 cname:txfWFsmZxl5fElCV
a=ssrc:1220950669 msid:FS1XDFSCVuztEO87Lm7NEzuFX2EVnOYDP8VS 6bcb6a56-c38d-474a-9e1b-372dc4206754
a=ssrc:1220950669 mslabel:FS1XDFSCVuztEO87Lm7NEzuFX2EVnOYDP8VS
a=ssrc:1220950669 label:6bcb6a56-c38d-474a-9e1b-372dc4206754
m=video 0 RTP/SAVPF 103
c=IN IP4 0.0.0.0
a=rtcp:1 IN IP4 0.0.0.0
a=ice-ufrag:
a=ice-pwd:
a=mid:video
a=inactive
a=rtpmap:103 VP8/90000
a=ssrc:2854598716 cname:txfWFsmZxl5fElCV
a=ssrc:2854598716 msid:FS1XDFSCVuztEO87Lm7NEzuFX2EVnOYDP8VS 2f5be791-cf7a-48cf-ac4b-8c060f606f78
a=ssrc:2854598716 mslabel:FS1XDFSCVuztEO87Lm7NEzuFX2EVnOYDP8VS
a=ssrc:2854598716 label:2f5be791-cf7a-48cf-ac4b-8c060f606f78
And this was sent back to Linphone. Linphone didn't like it and cleared the call down.
v=0
o=- 7461781248465050568 3 IN IP4 127.0.0.1
s=-
t=0 0
a=msid-semantic: WMS iOUm0bgDPsb5B2riIq3JB1X3xkpkPhPgSRFc
a=ice-lite
m=audio 0 RTP/AVP 0 8 101
c=IN IP4 0.0.0.0
a=mid:audio
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=ssrc:974659196 cname:YOhAbnOYADFFMGYH
a=ssrc:974659196 msid:iOUm0bgDPsb5B2riIq3JB1X3xkpkPhPgSRFc ad66954d-2fad-4f30-9169-684b95f33abc
a=ssrc:974659196 mslabel:iOUm0bgDPsb5B2riIq3JB1X3xkpkPhPgSRFc
a=ssrc:974659196 label:ad66954d-2fad-4f30-9169-684b95f33abc
a=inactive
m=video 0 RTP/AVP 103
c=IN IP4 0.0.0.0
a=mid:video
a=rtpmap:103 VP8/90000
a=ssrc:2605136941 cname:YOhAbnOYADFFMGYH
a=ssrc:2605136941 msid:iOUm0bgDPsb5B2riIq3JB1X3xkpkPhPgSRFc c759c13f-b992-402c-bf57-00046d1a1008
a=ssrc:2605136941 mslabel:iOUm0bgDPsb5B2riIq3JB1X3xkpkPhPgSRFc
a=ssrc:2605136941 label:c759c13f-b992-402c-bf57-00046d1a1008
a=inactive
________________________________
This e-mail and any attachment is for authorised use by the intended recipient(s) only. It may contain proprietary material, confidential information and/or be subject to legal privilege. It should not be copied, disclosed to, retained or used by, any other party. If you are not an intended recipient then please promptly delete this e-mail and any attachment and all copies and inform the sender. Thank you for understanding.
Hi list,
While going through mod_init's and finding things like
rtpp_table_name.len = strlen(rtpp_table_name.s);
I became curious if using of deprecated STR_PARAM in new modules is done on
purpose. Why not using PARAM_STR for string module parameters?
Quote from sr_module.h:
#define PARAM_STRING (1U<<0) /**< String (char *) parameter type */
#define PARAM_STR (1U<<2) /**< struct str parameter type */
#define STR_PARAM PARAM_STRING
P.S.: That's not only about curiosity but to avoid any bugs in my kamailio
extensions.
--
Best regards,
Alekzander Spiridonov
Hi,
I wonder if it's possible to recover UDP connections after a crash on
Kamailio/rtpengine so we can survive a reload or a segfault in any of them.
Since UDP isn't connection oriented, opening the sockets in the same order
the original mapping were made, there's no reason to think it shouldn't
work, but what about TLS/WS connections for SIP signalling? these two look
unrecoverable.
Putting TLS/WS aside for a moment, what about DTLS connections for
RTP/RTCP? This also looks quite challenging/impossible considering that
rtpengine generates a new cert/key after each load.
I'm interested in contributing a patch/module to make this possible, but I
don't know all of the constraints that may exist, especially from SDES/DTLS
point of view. Maybe Richard Fuchs can point me to the right direction.
Thanks,
--
Carlos
http://caruizdiaz.comhttp://ngvoice.com
+52 55 3048 3303