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

Reply via email to