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>