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.orgdexter 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>