Module: sems Branch: master Commit: 5c062aa71e931ca69c56fdb52f1c86b07b181025 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=5c062aa71e931ca69c56fdb52f1c86b07b181025
Author: Stefan Sayer <[email protected]> Committer: Stefan Sayer <[email protected]> Date: Tue Jan 31 21:17:49 2012 +0100 added configurable transparency for seqno/ssrc in RTP relay Conflicts: apps/sbc/SBCCallProfile.h core/AmB2BSession.h core/AmRtpStream.cpp --- apps/sbc/SBC.cpp | 6 ++++++ apps/sbc/SBCCallProfile.cpp | 10 ++++++++++ apps/sbc/SBCCallProfile.h | 8 ++++++-- apps/sbc/etc/symmetricrtp.sbcprofile.conf | 4 ++++ apps/sbc/etc/transparent.sbcprofile.conf | 4 ++++ core/AmB2BSession.cpp | 13 +++++++++++++ core/AmB2BSession.h | 7 ++++++- core/AmRtpStream.cpp | 24 +++++++++++++++++++++--- core/AmRtpStream.h | 9 +++++++++ 9 files changed, 79 insertions(+), 6 deletions(-) diff --git a/apps/sbc/SBC.cpp b/apps/sbc/SBC.cpp index 279ae87..7c35501 100644 --- a/apps/sbc/SBC.cpp +++ b/apps/sbc/SBC.cpp @@ -805,6 +805,9 @@ void SBCDialog::onInvite(const AmSipRequest& req) } } + setRtpRelayTransparentSeqno(call_profile.rtprelay_transparent_seqno); + setRtpRelayTransparentSSRC(call_profile.rtprelay_transparent_ssrc); + enableRtpRelay(req); } @@ -1536,6 +1539,9 @@ void SBCDialog::createCalleeSession() if(rtprelay_interface >= 0) callee_session->setRtpRelayInterface(rtprelay_interface); + callee_session->setRtpRelayTransparentSeqno(call_profile.rtprelay_transparent_seqno); + callee_session->setRtpRelayTransparentSSRC(call_profile.rtprelay_transparent_ssrc); + other_id = AmSession::getNewId(); callee_dlg.local_tag = other_id; diff --git a/apps/sbc/SBCCallProfile.cpp b/apps/sbc/SBCCallProfile.cpp index 5eca611..e05752d 100644 --- a/apps/sbc/SBCCallProfile.cpp +++ b/apps/sbc/SBCCallProfile.cpp @@ -270,6 +270,11 @@ bool SBCCallProfile::readFromConfiguration(const string& name, rtprelay_interface = cfg.getParameter("rtprelay_interface"); aleg_rtprelay_interface = cfg.getParameter("aleg_rtprelay_interface"); + rtprelay_transparent_seqno = + cfg.getParameter("rtprelay_transparent_seqno", "yes") == "yes"; + rtprelay_transparent_ssrc = + cfg.getParameter("rtprelay_transparent_ssrc", "yes") == "yes"; + outbound_interface = cfg.getParameter("outbound_interface"); md5hash = "<unknown>"; @@ -326,6 +331,11 @@ bool SBCCallProfile::readFromConfiguration(const string& name, if (!rtprelay_interface.empty()) { INFO("SBC: RTP Relay interface B leg '%s'\n", rtprelay_interface.c_str()); } + + INFO("SBC: RTP Relay %s seqno\n", + rtprelay_transparent_seqno?"transparent":"opaque"); + INFO("SBC: RTP Relay %s SSRC\n", + rtprelay_transparent_ssrc?"transparent":"opaque"); } INFO("SBC: SST on A leg enabled: '%s'\n", sst_aleg_enabled.empty() ? diff --git a/apps/sbc/SBCCallProfile.h b/apps/sbc/SBCCallProfile.h index 70fc8c2..3a720ec 100644 --- a/apps/sbc/SBCCallProfile.h +++ b/apps/sbc/SBCCallProfile.h @@ -110,6 +110,8 @@ struct SBCCallProfile bool rtprelay_enabled; string force_symmetric_rtp; bool msgflags_symmetric_rtp; + bool rtprelay_transparent_seqno; + bool rtprelay_transparent_ssrc; string rtprelay_interface; string aleg_rtprelay_interface; @@ -124,8 +126,10 @@ struct SBCCallProfile sdpfilter_enabled(false), sdpfilter(Transparent), auth_enabled(false), - rtprelay_enabled(false) - + next_hop_port_i(0), + rtprelay_enabled(false), + rtprelay_transparent_seqno(true), + rtprelay_transparent_ssrc(true) { } ~SBCCallProfile() diff --git a/apps/sbc/etc/symmetricrtp.sbcprofile.conf b/apps/sbc/etc/symmetricrtp.sbcprofile.conf index 8fb3996..082498a 100644 --- a/apps/sbc/etc/symmetricrtp.sbcprofile.conf +++ b/apps/sbc/etc/symmetricrtp.sbcprofile.conf @@ -16,6 +16,10 @@ enable_rtprelay=yes rtprelay_force_symmetric_rtp=yes # use symmetric RTP indication from P-MsgFlags flag 2 #rtprelay_msgflags_symmetric_rtp=yes +# use transparent RTP seqno? [yes] +#rtprelay_transparent_seqno=no +# use transparent RTP SSRC? [yes] +#rtprelay_transparent_ssrc=no # RTP interface to use for A leg #aleg_rtprelay_interface=intern diff --git a/apps/sbc/etc/transparent.sbcprofile.conf b/apps/sbc/etc/transparent.sbcprofile.conf index ff3e76b..4a055c0 100644 --- a/apps/sbc/etc/transparent.sbcprofile.conf +++ b/apps/sbc/etc/transparent.sbcprofile.conf @@ -36,6 +36,10 @@ #aleg_rtprelay_interface=intern # RTP interface to use for B leg #rtprelay_interface=default +# use transparent RTP seqno? [yes] +#rtprelay_transparent_seqno=no +# use transparent RTP SSRC? [yes] +#rtprelay_transparent_ssrc=no ## filters: #header_filter=blacklist diff --git a/core/AmB2BSession.cpp b/core/AmB2BSession.cpp index e64c00f..79a115f 100644 --- a/core/AmB2BSession.cpp +++ b/core/AmB2BSession.cpp @@ -45,6 +45,7 @@ AmB2BSession::AmB2BSession() rtp_relay_force_symmetric_rtp(false), relay_rtp_interface(-1), relay_rtp_streams(NULL), relay_rtp_streams_cnt(0), + rtp_relay_transparent_seqno(true), rtp_relay_transparent_ssrc(true), est_invite_cseq(0),est_invite_other_cseq(0) { memset(other_stream_fds,0,sizeof(int)*MAX_RELAY_STREAMS); @@ -332,6 +333,8 @@ void AmB2BSession::updateRelayStreams(const string& content_type, const string& DBG("using relay interface %i (relay_rtp_interface=%i)\n", used_relay_interface, relay_rtp_interface); relay_rtp_streams[i] = new AmRtpStream(NULL, used_relay_interface); + relay_rtp_streams[i]->setRtpRelayTransparentSeqno(rtp_relay_transparent_seqno); + relay_rtp_streams[i]->setRtpRelayTransparentSSRC(rtp_relay_transparent_ssrc); } DBG("Created %u RTP relay streams\n", relay_rtp_streams_cnt); } @@ -882,6 +885,8 @@ void AmB2BSession::setupRelayStreams(AmB2BSession* other_session) { // create relay stream on set interface, else dlg interface relay_rtp_streams[i] = new AmRtpStream(NULL, relay_rtp_interface<0 ? dlg.getOutboundIf() : relay_rtp_interface); + relay_rtp_streams[i]->setRtpRelayTransparentSeqno(rtp_relay_transparent_seqno); + relay_rtp_streams[i]->setRtpRelayTransparentSSRC(rtp_relay_transparent_ssrc); } } @@ -901,6 +906,14 @@ void AmB2BSession::setRtpRelayInterface(int relay_interface) { rtp_interface = relay_interface; } +void AmB2BSession::setRtpRelayTransparentSeqno(bool transparent) { + rtp_relay_transparent_seqno = transparent; +} + +void AmB2BSession::setRtpRelayTransparentSSRC(bool transparent) { + rtp_relay_transparent_ssrc = transparent; +} + void AmB2BSession::clearRtpReceiverRelay() { for (unsigned int i=0; i<relay_rtp_streams_cnt; i++) { // clear the other call's RTP relay streams from RTP receiver diff --git a/core/AmB2BSession.h b/core/AmB2BSession.h index 505c18c..0f648e7 100644 --- a/core/AmB2BSession.h +++ b/core/AmB2BSession.h @@ -232,7 +232,10 @@ class AmB2BSession: public AmSession bool rtp_relay_enabled; /** force symmetric RTP */ bool rtp_relay_force_symmetric_rtp; - + /** transparent seqno for RTP relay */ + bool rtp_relay_transparent_seqno; + /** transparent SSRC for RTP relay */ + bool rtp_relay_transparent_ssrc; /** RTP streams which receive from our side and are used for relaying RTP from the other side */ @@ -269,6 +272,8 @@ class AmB2BSession: public AmSession bool getRtpRelayEnabled() const { return rtp_relay_enabled; } bool getRtpRelayForceSymmetricRtp() const { return rtp_relay_force_symmetric_rtp; } void setRtpRelayInterface(int relay_interface); + void setRtpRelayTransparentSeqno(bool transparent); + void setRtpRelayTransparentSSRC(bool transparent); }; class AmB2BCalleeSession; diff --git a/core/AmRtpStream.cpp b/core/AmRtpStream.cpp index 22e85b9..75dc2aa 100644 --- a/core/AmRtpStream.cpp +++ b/core/AmRtpStream.cpp @@ -347,7 +347,9 @@ AmRtpStream::AmRtpStream(AmSession* _s, int _if) monitor_rtp_timeout(true), relay_stream(NULL), relay_enabled(false), - sdp_media_index(-1) + sdp_media_index(-1), + relay_transparent_ssrc(true), + relay_transparent_seqno(true) { #ifdef SUPPORT_IPV6 @@ -818,8 +820,10 @@ void AmRtpStream::relay(AmRtpPacket* p) { return; rtp_hdr_t* hdr = (rtp_hdr_t*)p->getBuffer(); - hdr->seq = htons(sequence++); - hdr->ssrc = htonl(l_ssrc); + if (!relay_transparent_seqno) + hdr->seq = htons(sequence++); + if (!relay_transparent_ssrc) + hdr->ssrc = htonl(l_ssrc); p->setAddr(&r_saddr); if(p->send(l_sd) < 0){ @@ -850,13 +854,27 @@ void AmRtpStream::setRelayStream(AmRtpStream* stream) { } void AmRtpStream::enableRtpRelay() { + DBG("enabled RTP relay for RTP stream instance [%p]\n", this); relay_enabled = true; } void AmRtpStream::disableRtpRelay() { + DBG("disabled RTP relay for RTP stream instance [%p]\n", this); relay_enabled = false; } +void AmRtpStream::setRtpRelayTransparentSeqno(bool transparent) { + DBG("%sabled RTP relay transparent seqno for RTP stream instance [%p]\n", + transparent ? "en":"dis", this); + relay_transparent_seqno = transparent; +} + +void AmRtpStream::setRtpRelayTransparentSSRC(bool transparent) { + DBG("%sabled RTP relay transparent SSRC for RTP stream instance [%p]\n", + transparent ? "en":"dis", this); + relay_transparent_ssrc = transparent; +} + PacketMem::PacketMem() { memset(used, 0, sizeof(used)); diff --git a/core/AmRtpStream.h b/core/AmRtpStream.h index 4c7950d..7bcfb56 100644 --- a/core/AmRtpStream.h +++ b/core/AmRtpStream.h @@ -212,6 +212,10 @@ protected: NOTE: This may only be accessed in initialization or by the AmRtpReceiver thread while relaying! */ AmRtpStream* relay_stream; + /** control transparency for RTP seqno in RTP relay mode */ + bool relay_transparent_seqno; + /** control transparency for RTP ssrc in RTP relay mode */ + bool relay_transparent_ssrc; /** Session owning this stream */ AmSession* session; @@ -388,6 +392,11 @@ public: /** disable RTP relaying through relay stream */ void disableRtpRelay(); + /** enable or disable transparent RTP seqno for relay */ + void setRtpRelayTransparentSeqno(bool transparent); + + /** enable or disable transparent SSRC seqno for relay */ + void setRtpRelayTransparentSSRC(bool transparent); }; #endif _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
