dexter has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17285 )


Change subject: bts: Add RTP payload testing to performance tests
......................................................................

bts: Add RTP payload testing to performance tests

Add negotiation of RTP Ports for both directions and integrate RTP
emulation to simulate actual traffic.

Change-Id: I21a610533d5be2e1647cc6a72423e056b39d1217
Related: OS#4365
---
M bts/BTS_Tests.ttcn
M bts/BTS_Tests_perf.ttcn
A bts/RTP_CodecPort_CtrlFunct.ttcn
A bts/RTP_CodecPort_CtrlFunctDef.cc
M bts/gen_links.sh
M bts/regen_makefile.sh
6 files changed, 222 insertions(+), 6 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks 
refs/changes/85/17285/1

diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index 46c9647..61232d4 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -63,6 +63,10 @@
 import from TELNETasp_PortType all;
 import from BTS_Tests_LAPDm all;

+import from RTP_CodecPort all;
+import from RTP_CodecPort_CtrlFunct all;
+import from RTP_Emulation all;
+
 friend module BTS_Tests_SMSCB;
 friend module BTS_Tests_virtphy;
 friend module BTS_Tests_LAPDm;
@@ -157,6 +161,14 @@
        var ChannelNrs g_AllChanTypes;
 }

+private function f_rtpem_init(inout RTP_Emulation_CT comp_ref, integer i)
+runs on ConnHdlr {
+       comp_ref := RTP_Emulation_CT.create("RTPEM" & int2str(i));
+       map(comp_ref:RTP, system:RTP);
+       map(comp_ref:RTCP, system:RTCP);
+       comp_ref.start(RTP_Emulation.f_main());
+}
+
 /* an individual call / channel */
 type component ConnHdlr extends RSL_DchanHdlr, lapdm_test_CT {
        port L1CTL_PT L1CTL;
@@ -174,6 +186,10 @@

        /* PCU Interface of BTS */
        port PCUIF_CODEC_PT PCU;
+
+       /* RTP channels for audio payload testing */
+       var RTP_Emulation_CT vc_RTPEM[14];
+       port RTPEM_CTRL_PT RTPEM[14];
 }

 function f_init_rsl(charstring id) runs on test_CT {
@@ -518,6 +534,13 @@

        f_rslem_register(0, pars.chan_nr);

+       /* Setup RTP emulation so that it is available if needed by the
+        * the testcase. */
+       for (var integer i := 0; i < sizeof(vc_RTPEM); i := i+1) {
+               f_rtpem_init(vc_RTPEM[i], i);
+               connect(vc_RTPEM[i]:CTRL, self:RTPEM[i]);
+       }
+
        /* call the user-supplied test case function */
        fn.apply(id);
 }
diff --git a/bts/BTS_Tests_perf.ttcn b/bts/BTS_Tests_perf.ttcn
index 1e70bc8..29d0ae1 100644
--- a/bts/BTS_Tests_perf.ttcn
+++ b/bts/BTS_Tests_perf.ttcn
@@ -32,14 +32,61 @@

 import from BTS_Tests all;

+import from RTP_CodecPort all;
+import from RTP_CodecPort_CtrlFunct all;
+import from RTP_Emulation all;
+
+import from IPL4asp_Types all;
+import from IPL4asp_Functions all;
+
 /***********************************************************************
  * Performance tests. Expect osmo-bts to be configured with all TRX as TCH/H.
  ***********************************************************************/

 modulepar {
        float mp_wait_time := 10.0;
+       charstring mp_rtpem_ip := "127.0.0.2";
 }

+/* Convert an IP address from its 32-Bit integer representation into a string
+ * representation */
+function f_uin32t2ip(uint32_t uint32t) return charstring
+{
+       var integer octet_1;
+       var integer octet_2;
+       var integer octet_3;
+       var integer octet_4;
+
+       octet_1 := uint32t / 16777216;
+       octet_2 := (uint32t - octet_1 * 16777216) / 65536;
+       octet_3 := (uint32t - octet_1 * 16777216 - octet_2 * 65536) / 255;
+       octet_4 := (uint32t - octet_1 * 16777216 - octet_2 * 65536 - octet_3 * 
255);
+
+       return int2str(octet_1) & "." & int2str(octet_2) & "." & 
int2str(octet_3) & "." & int2str(octet_4);
+}
+
+/* Convert an IP address from its string representation into a 32-Bit integer
+ * representation */
+function f_ip2uint32t(charstring ip) return uint32_t
+{
+       var integer octet_1;
+       var integer octet_2;
+       var integer octet_3;
+       var integer octet_4;
+       var ro_integer segAddr := {};
+       var uint32_t addr;
+
+       segAddr := f_splitIpAddress(ip);
+
+       octet_1 := segAddr[0];
+       octet_2 := segAddr[1];
+       octet_3 := segAddr[2];
+       octet_4 := segAddr[3];
+
+       addr := octet_1 * 16777216 + octet_2 * 65536 + octet_3 * 255 + octet_4;
+
+       return addr;
+}

 /* This test requires BTS with 1 TRX to be configured with following 
timeslots: TS[0]=CCCH+SDCCH4, TS[1..7]: TCH/H
  * One can simply take the osmo-bsc.cfg in the same dir and change TS1..7, 
that's all needed.
@@ -49,6 +96,11 @@
  * on with full load.
  */
 function f_TC_highchanload_tchh(charstring id) runs on ConnHdlr {
+       var RSL_Message rx;
+       var uint32_t bts_rtp_ip;
+       var uint16_t bts_rtp_port;
+       var uint16_t bts_ipa_conn_id;
+       var RtpemConfig rtp_cfg := c_RtpemDefaultCfg;
        var ChannelNrs chan_nr := { /* TS 1..7: TCH/H */
                valueof(ts_RslChanNr_Lm(1,0)), valueof(ts_RslChanNr_Lm(1,1)),
                valueof(ts_RslChanNr_Lm(2,0)), valueof(ts_RslChanNr_Lm(2,1)),
@@ -58,25 +110,61 @@
                valueof(ts_RslChanNr_Lm(6,0)), valueof(ts_RslChanNr_Lm(6,1)),
                valueof(ts_RslChanNr_Lm(7,0)), valueof(ts_RslChanNr_Lm(7,1))
                };
+       var integer channels := sizeof(chan_nr);

        log("Started");
-       for (var integer i := 0; i < sizeof(chan_nr); i := i+1) {
+       for (var integer i := 0; i < channels; i := i+1) {
                log("Registering ", chan_nr[i]);
                f_rslem_register(0, chan_nr[i]);
        }
        log("Registered");
-       for (var integer i := 0; i < sizeof(chan_nr); i := i+1) {
+       for (var integer i := 0; i < channels; i := i+1) {
+               /* Activate channel */
                f_rsl_transceive(ts_RSL_CHAN_ACT(chan_nr[i],
-                                ts_RSL_ChanMode(RSL_CHRT_TCH_H, 
RSL_CMOD_SP_GSM3 /* AMR*/)),
+                                ts_RSL_ChanMode(RSL_CHRT_TCH_H, 
RSL_CMOD_SP_GSM1 /* AMR*/)),
                                 tr_RSL_CHAN_ACT_ACK(chan_nr[i]),
                                 log2str("RSL CHAN ACT [", i, "]"));
+
+
+               /* Negotiate RTP RX (BTS) port for activated channel */
+               rx := f_rsl_transceive_ret(ts_RSL_IPA_CRCX(chan_nr[i]),
+                                          tr_RSL_IPA_CRCX_ACK(chan_nr[i], *, 
*, *),
+                                          log2str("RSL IPA CRCX [", i, "]"));
+               bts_ipa_conn_id := rx.ies[1].body.ipa_conn_id;
+               bts_rtp_ip := rx.ies[2].body.ipa_local_ip;
+               bts_rtp_port := rx.ies[3].body.ipa_local_port;
+
+
+               /* Netotiate RTP TX (BTS) port for activated channel */
+               f_rsl_transceive(ts_RSL_IPA_MDCX(chan_nr[i], bts_ipa_conn_id, 
f_ip2uint32t(mp_rtpem_ip), bts_rtp_port, 23),
+                                tr_RSL_IPA_MDCX_ACK(chan_nr[i], *, *, *, *),
+                                log2str("RSL IPA MDCX [", i, "]"));
+
+
+               /* Start local RTP emulation (transmit packets to BTS, receive
+                * packets from BTS) */
+               f_rtpem_bind(RTPEM[i], mp_rtpem_ip, bts_rtp_port);
+               rtp_cfg.tx_payload_type := 23;
+               f_rtpem_configure(RTPEM[0], rtp_cfg);
+               f_rtpem_connect(RTPEM[i], f_uin32t2ip(bts_rtp_ip), 
bts_rtp_port);
+               f_rtpem_mode(RTPEM[i], RTPEM_MODE_BIDIR);
+
        }
        log("Activated, now waiting ", mp_wait_time, " seconds");
 
        f_sleep(mp_wait_time);
        log("sleep done, deactivating");

-       for (var integer i := 0; i < sizeof(chan_nr); i := i+1) {
+       /* Tear down channels and RTP traffic */
+       for (var integer i := 0; i < channels; i := i+1) {
+
+               /* Remove RTP traffic and wait some time before removing the
+                * the channel to make sure all remaining packets reach
+                * their destination */
+               f_rtpem_mode(RTPEM[i], RTPEM_MODE_NONE);
+               f_sleep(1.0);
+
+               /* Remove channels */
                f_rsl_transceive(ts_RSL_RF_CHAN_REL(chan_nr[i]),
                                 tr_RSL_RF_CHAN_REL_ACK(chan_nr[i]),
                                 log2str("RF CHAN REL [", i, "]"),
diff --git a/bts/RTP_CodecPort_CtrlFunct.ttcn b/bts/RTP_CodecPort_CtrlFunct.ttcn
new file mode 100644
index 0000000..9f6cad2
--- /dev/null
+++ b/bts/RTP_CodecPort_CtrlFunct.ttcn
@@ -0,0 +1,44 @@
+module RTP_CodecPort_CtrlFunct {
+
+  import from RTP_CodecPort all;
+  import from IPL4asp_Types all;
+
+  external function f_IPL4_listen(
+    inout RTP_CODEC_PT portRef,
+    in HostName locName,
+    in PortNumber locPort,
+    in ProtoTuple proto,
+    in OptionList options := {}
+  ) return Result;
+
+  external function f_IPL4_connect(
+    inout RTP_CODEC_PT portRef,
+    in HostName remName,
+    in PortNumber remPort,
+    in HostName locName,
+    in PortNumber locPort,
+    in ConnectionId connId,
+    in ProtoTuple proto,
+    in OptionList options := {}
+  ) return Result;
+
+  external function f_IPL4_close(
+    inout RTP_CODEC_PT portRef,
+    in ConnectionId id,
+    in ProtoTuple proto := { unspecified := {} }
+  ) return Result;
+
+  external function f_IPL4_setUserData(
+    inout RTP_CODEC_PT portRef,
+    in ConnectionId id,
+    in UserData userData
+  ) return Result;
+
+  external function f_IPL4_getUserData(
+    inout RTP_CODEC_PT portRef,
+    in ConnectionId id,
+    out UserData userData
+  ) return Result;
+
+}
+
diff --git a/bts/RTP_CodecPort_CtrlFunctDef.cc 
b/bts/RTP_CodecPort_CtrlFunctDef.cc
new file mode 100644
index 0000000..ce8e176
--- /dev/null
+++ b/bts/RTP_CodecPort_CtrlFunctDef.cc
@@ -0,0 +1,56 @@
+#include "IPL4asp_PortType.hh"
+#include "RTP_CodecPort.hh"
+#include "IPL4asp_PT.hh"
+
+namespace RTP__CodecPort__CtrlFunct {
+
+  IPL4asp__Types::Result f__IPL4__listen(
+    RTP__CodecPort::RTP__CODEC__PT& portRef,
+    const IPL4asp__Types::HostName& locName,
+    const IPL4asp__Types::PortNumber& locPort,
+    const IPL4asp__Types::ProtoTuple& proto,
+    const IPL4asp__Types::OptionList& options)
+  {
+    return f__IPL4__PROVIDER__listen(portRef, locName, locPort, proto, 
options);
+  }
+
+  IPL4asp__Types::Result f__IPL4__connect(
+    RTP__CodecPort::RTP__CODEC__PT& portRef,
+    const IPL4asp__Types::HostName& remName,
+    const IPL4asp__Types::PortNumber& remPort,
+    const IPL4asp__Types::HostName& locName,
+    const IPL4asp__Types::PortNumber& locPort,
+    const IPL4asp__Types::ConnectionId& connId,
+    const IPL4asp__Types::ProtoTuple& proto,
+    const IPL4asp__Types::OptionList& options)
+  {
+    return f__IPL4__PROVIDER__connect(portRef, remName, remPort,
+                                      locName, locPort, connId, proto, 
options);
+  }
+
+  IPL4asp__Types::Result f__IPL4__close(
+    RTP__CodecPort::RTP__CODEC__PT& portRef,
+    const IPL4asp__Types::ConnectionId& connId,
+    const IPL4asp__Types::ProtoTuple& proto)
+  {
+      return f__IPL4__PROVIDER__close(portRef, connId, proto);
+  }
+
+  IPL4asp__Types::Result f__IPL4__setUserData(
+    RTP__CodecPort::RTP__CODEC__PT& portRef,
+    const IPL4asp__Types::ConnectionId& connId,
+    const IPL4asp__Types::UserData& userData)
+  {
+    return f__IPL4__PROVIDER__setUserData(portRef, connId, userData);
+  }
+
+  IPL4asp__Types::Result f__IPL4__getUserData(
+    RTP__CodecPort::RTP__CODEC__PT& portRef,
+    const IPL4asp__Types::ConnectionId& connId,
+    IPL4asp__Types::UserData& userData)
+  {
+    return f__IPL4__PROVIDER__getUserData(portRef, connId, userData);
+  }
+
+}
+
diff --git a/bts/gen_links.sh b/bts/gen_links.sh
index aafe231..0eda78a 100755
--- a/bts/gen_links.sh
+++ b/bts/gen_links.sh
@@ -28,6 +28,10 @@
 FILES="MobileL3_CC_Types.ttcn MobileL3_CommonIE_Types.ttcn 
MobileL3_GMM_SM_Types.ttcn MobileL3_MM_Types.ttcn MobileL3_RRM_Types.ttcn 
MobileL3_SMS_Types.ttcn MobileL3_SS_Types.ttcn MobileL3_Types.ttcn"
 gen_links $DIR $FILES

+DIR=$BASEDIR/titan.ProtocolModules.RTP/src
+FILES="RTP_EncDec.cc RTP_Types.ttcn"
+gen_links $DIR $FILES
+
 DIR=$BASEDIR/titan.TestPorts.TELNETasp/src
 FILES="TELNETasp_PT.cc  TELNETasp_PT.hh  TELNETasp_PortType.ttcn"
 gen_links $DIR $FILES
@@ -42,7 +46,8 @@
 FILES+="Native_Functions.ttcn Native_FunctionDefs.cc "
 FILES+="TRXC_Types.ttcn TRXC_CodecPort.ttcn TRXC_CodecPort_CtrlFunct.ttcn 
TRXC_CodecPort_CtrlFunctDef.cc "
 FILES+="PCUIF_Types.ttcn PCUIF_CodecPort.ttcn "
-FILES+="IPA_Testing.ttcn"
+FILES+="IPA_Testing.ttcn "
+FILES+="RTP_CodecPort.ttcn RTP_Emulation.ttcn IuUP_Types.ttcn 
IuUP_Emulation.ttcn IuUP_EncDec.cc"
 gen_links $DIR $FILES

 ignore_pp_results
diff --git a/bts/regen_makefile.sh b/bts/regen_makefile.sh
index 9f1bf1d..f5b6fbb 100755
--- a/bts/regen_makefile.sh
+++ b/bts/regen_makefile.sh
@@ -1,6 +1,6 @@
 #!/bin/sh

-FILES="*.ttcn *.ttcnpp IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc 
IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc UD_PT.cc RLCMAC_EncDec.cc 
Native_FunctionDefs.cc TRXC_CodecPort_CtrlFunctDef.cc 
L1CTL_PortType_CtrlFunctDef.cc TELNETasp_PT.cc"
+FILES="*.ttcn *.ttcnpp IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc 
IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc UD_PT.cc RLCMAC_EncDec.cc 
Native_FunctionDefs.cc TRXC_CodecPort_CtrlFunctDef.cc 
L1CTL_PortType_CtrlFunctDef.cc TELNETasp_PT.cc RTP_EncDec.cc 
RTP_CodecPort_CtrlFunctDef.cc IuUP_EncDec.cc "

 export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL -DIPA_EMULATION_OML 
-DIPA_EMULATION_CTRL"


--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17285
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I21a610533d5be2e1647cc6a72423e056b39d1217
Gerrit-Change-Number: 17285
Gerrit-PatchSet: 1
Gerrit-Owner: dexter <[email protected]>
Gerrit-MessageType: newchange

Reply via email to