Change in osmo-ttcn3-hacks[master]: bts: Add RTP payload testing to performance tests

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

dexter gerrit-no-reply at lists.osmocom.org
Thu Feb 27 10:13:36 UTC 2020


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 <pmaier at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200227/f578dee3/attachment.htm>


More information about the gerrit-log mailing list