<p>neels <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/24411">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add bsc/BSC_Tests_VAMOS.ttcn<br><br>BSC_Tests_VAMOS.ttcn is separate from BSC_Tests.ttcn in order to<br>instruct osmo-bts-omldummy to pass BTS_FEAT_VAMOS == true in the OML BTS<br>attributes.<br><br>Add tests:<br>TC_chan_act_to_vamos()<br>TC_mode_modify_to_vamos_fr()<br>TC_mode_modify_to_vamos_hr()<br>TC_assign_to_secondary_lchan_fr()<br>TC_assign_to_secondary_lchan_hr()<br>TC_vamos_multiplex_tch_f_tch_f()<br>TC_vamos_multiplex_tch_h_tch_h_tch_h_tch_h()<br><br>Change-Id: I2c504099163a30ea102cbd26d3615ca2e5ce1e64<br>---<br>M bsc/BSC_Tests.ttcn<br>A bsc/BSC_Tests_VAMOS.ttcn<br>M library/L3_Templates.ttcn<br>M library/RSL_Types.ttcn<br>4 files changed, 859 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn</span><br><span>index 2b3703f..41deea1 100644</span><br><span>--- a/bsc/BSC_Tests.ttcn</span><br><span>+++ b/bsc/BSC_Tests.ttcn</span><br><span>@@ -20,6 +20,8 @@</span><br><span>  * level testing.</span><br><span>  */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+friend module BSC_Tests_VAMOS;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> import from Misc_Helpers all;</span><br><span> import from General_Types all;</span><br><span> import from Osmocom_Types all;</span><br><span>@@ -673,7 +675,7 @@</span><br><span>     uint8_t mp_exp_ms_power_level := 7;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_gen_test_hdlr_pars(integer bssap_idx := 0) return TestHdlrParams {</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_gen_test_hdlr_pars(integer bssap_idx := 0) return TestHdlrParams {</span><br><span> </span><br><span>  var TestHdlrParams pars := valueof(t_def_TestHdlrPars);</span><br><span>      if (mp_bssap_cfg[bssap_idx].transport == BSSAP_TRANSPORT_AoIP) {</span><br><span>@@ -799,7 +801,7 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_shutdown_helper() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_shutdown_helper() runs on test_CT {</span><br><span>     all component.stop;</span><br><span>  setverdict(pass);</span><br><span>    mtc.stop;</span><br><span>@@ -1001,7 +1003,7 @@</span><br><span>                      "sccp-timer iar " & int2str(g_bsc_sccp_timer_iar)});</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_logp(TELNETasp_PT pt, charstring log_msg)</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_logp(TELNETasp_PT pt, charstring log_msg)</span><br><span> {</span><br><span>  // log on TTCN3 log output</span><br><span>   log(log_msg);</span><br><span>@@ -6602,7 +6604,7 @@</span><br><span>        }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_perform_clear(RSL_DCHAN_PT rsl, template PDU_ML3_NW_MS exp_rr_rel_tmpl := tr_RRM_RR_RELEASE)</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_perform_clear(RSL_DCHAN_PT rsl, template PDU_ML3_NW_MS exp_rr_rel_tmpl := tr_RRM_RR_RELEASE)</span><br><span> runs on MSC_ConnHdlr {</span><br><span>  f_logp(BSCVTY, "MSC instructs BSC to clear channel");</span><br><span>      BSSAP.send(ts_BSSMAP_ClearCommand(0));</span><br><span>diff --git a/bsc/BSC_Tests_VAMOS.ttcn b/bsc/BSC_Tests_VAMOS.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..bf487cf</span><br><span>--- /dev/null</span><br><span>+++ b/bsc/BSC_Tests_VAMOS.ttcn</span><br><span>@@ -0,0 +1,738 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module BSC_Tests_VAMOS {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Integration Tests for OsmoBSC</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Released under the terms of GNU General Public License, Version 2 or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0-or-later</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This test suite tests OsmoBSC while emulating both multiple BTS + MS as</span><br><span style="color: hsl(120, 100%, 40%);">+ * well as the MSC. See README for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * There are test cases that run in so-called 'handler mode' and test cases</span><br><span style="color: hsl(120, 100%, 40%);">+ * that run directly on top of the BSSAP and RSL CodecPorts.  The "handler mode"</span><br><span style="color: hsl(120, 100%, 40%);">+ * tests abstract the multiplexing/demultiplexing of multiple SCCP connections</span><br><span style="color: hsl(120, 100%, 40%);">+ * and/or RSL channels and are hence suitable for higher-level test cases, while</span><br><span style="color: hsl(120, 100%, 40%);">+ * the "raw" tests directly on top of the CodecPorts are more suitable for lower-</span><br><span style="color: hsl(120, 100%, 40%);">+ * level testing.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSC_Tests all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from Misc_Helpers all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from General_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GSM_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSAP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RAN_Adapter all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSAP_LE_Adapter all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSAP_LE_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSAP_LE_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSLAP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSAP_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSMAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_Testing all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSL_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSL_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MGCP_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MGCP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MGCP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MGCP_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_CTRL_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_CTRL_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_CTRL_Adapter all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from StatsD_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from StatsD_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from StatsD_CodecPort_CtrlFunct all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from StatsD_Checker all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_VTY_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from TELNETasp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from MobileL3_CommonIE_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MobileL3_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MobileL3_RRM_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from L3_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GSM_RR_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSMAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSMAP_LE_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCPasp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from GSM_SystemInformation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GSM_RestOctets all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from TCCConversion_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from RAN_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MSC_ConnectionHandler all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from Native_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const integer NUM_BTS := 3;</span><br><span style="color: hsl(120, 100%, 40%);">+const integer NUM_MSC := 3;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rsl_chan_nr_to_subslot(RslChannelNr chan_nr)</span><br><span style="color: hsl(120, 100%, 40%);">+return integer</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  var integer subslot;</span><br><span style="color: hsl(120, 100%, 40%);">+  select (chan_nr) {</span><br><span style="color: hsl(120, 100%, 40%);">+            case (t_RslChanNr_Bm(?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* TCH/F, always subslot 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+                 subslot := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (t_RslChanNr_Lm(?, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* TCH/H */</span><br><span style="color: hsl(120, 100%, 40%);">+                   subslot := chan_nr.u.lm.sub_chan;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (t_RslChanNr_Osmo_VAMOS_Bm(?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* TCH/F, always subslot 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+                 subslot := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (t_RslChanNr_Osmo_VAMOS_Lm(?, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* TCH/H */</span><br><span style="color: hsl(120, 100%, 40%);">+                   subslot := chan_nr.u.lm.sub_chan;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             case else {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "unsupported RslChannelNr type in f_rsl_chan_nr_to_subslot()");</span><br><span style="color: hsl(120, 100%, 40%);">+                    mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return subslot;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rsl_chan_nr_to_rsl_cbits(RslChannelNr chan_nr)</span><br><span style="color: hsl(120, 100%, 40%);">+return BIT5</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       var BIT5 rsl_cbits;</span><br><span style="color: hsl(120, 100%, 40%);">+   select (chan_nr) {</span><br><span style="color: hsl(120, 100%, 40%);">+            case (t_RslChanNr_Bm(?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    rsl_cbits := '00001'B;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (t_RslChanNr_Lm(?, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 rsl_cbits := int2bit(2 + chan_nr.u.lm.sub_chan, 5); /* '0001x'B */</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (t_RslChanNr_Osmo_VAMOS_Bm(?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 rsl_cbits := '11101'B;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (t_RslChanNr_Osmo_VAMOS_Lm(?, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      rsl_cbits := int2bit(30 + chan_nr.u.lm.sub_chan, 5); /* '1111x'B */</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+             case else {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "unsupported RslChannelNr type in f_rsl_chan_nr_to_rsl_cbits()");</span><br><span style="color: hsl(120, 100%, 40%);">+                  mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return rsl_cbits;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rsl_chan_nr_to_rr_cbits(RslChannelNr chan_nr)</span><br><span style="color: hsl(120, 100%, 40%);">+return BIT5</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      var BIT5 rr_cbits;</span><br><span style="color: hsl(120, 100%, 40%);">+    select (chan_nr) {</span><br><span style="color: hsl(120, 100%, 40%);">+            case (t_RslChanNr_Bm(?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    rr_cbits := '00001'B;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (t_RslChanNr_Lm(?, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 rr_cbits := int2bit(2 + chan_nr.u.lm.sub_chan, 5); /* '0001x'B */</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (t_RslChanNr_Osmo_VAMOS_Bm(?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 rr_cbits := '00001'B;</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* In RR, there must *not* be Osmocom specific cbits */</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (t_RslChanNr_Osmo_VAMOS_Lm(?, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      rr_cbits := int2bit(2 + chan_nr.u.lm.sub_chan, 5); /* '0001x'B */</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* In RR, there must *not* be Osmocom specific cbits */</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             case else {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "unsupported RslChannelNr type in f_rsl_chan_nr_to_rr_cbits()");</span><br><span style="color: hsl(120, 100%, 40%);">+                   mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return rr_cbits;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rsl_chan_nr_to_chrt(RslChannelNr chan_nr, boolean vamos)</span><br><span style="color: hsl(120, 100%, 40%);">+return RSL_ChanRateType</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        var boolean fr;</span><br><span style="color: hsl(120, 100%, 40%);">+       select (chan_nr) {</span><br><span style="color: hsl(120, 100%, 40%);">+            case (t_RslChanNr_Bm(?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    fr := true;</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (t_RslChanNr_Lm(?, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         fr := false;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (t_RslChanNr_Osmo_VAMOS_Bm(?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 fr := true;</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (t_RslChanNr_Osmo_VAMOS_Lm(?, ?)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              fr := false;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             case else {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "unsupported RslChannelNr type in f_rsl_chan_nr_to_chrt()");</span><br><span style="color: hsl(120, 100%, 40%);">+                       mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (fr) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (vamos) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  return RSL_CHRT_OSMO_TCH_F_VAMOS;</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      return RSL_CHRT_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (vamos) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  return RSL_CHRT_OSMO_TCH_H_VAMOS;</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      return RSL_CHRT_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_lchan_str(integer bts_nr, integer trx_nr, RslChannelNr chan_nr)</span><br><span style="color: hsl(120, 100%, 40%);">+return charstring</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer subslot := f_rsl_chan_nr_to_subslot(chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+     return "lchan " & int2str(bts_nr) & " " & int2str(trx_nr) & " " & int2str(chan_nr.tn) & " " & int2str(subslot);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_long_lchan_str(integer bts_nr, integer trx_nr, RslChannelNr chan_nr)</span><br><span style="color: hsl(120, 100%, 40%);">+return charstring</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer subslot := f_rsl_chan_nr_to_subslot(chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+     return "bts " & int2str(bts_nr) & " trx " & int2str(trx_nr) & " timeslot " & int2str(chan_nr.tn) & " sub-slot " & int2str(subslot);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_lchan_ensure_established(TELNETasp_PT vty, integer bts_nr, integer trx_nr, RslChannelNr chan_nr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  var charstring lchan_str := f_lchan_str(bts_nr, trx_nr, chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+     var charstring lchan_info := f_vty_transceive_ret(vty, "show " & lchan_str);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (f_strstr(lchan_info, "State: ESTABLISHED") < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            log("'show lchan' replied: ", lchan_info);</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(fail, "lchan " & lchan_str & " is not in state ESTABLISHED");</span><br><span style="color: hsl(120, 100%, 40%);">+          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Activate a primary lchan in VAMOS speech mode */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_chan_act_to_vamos() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_vty();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_logp(BSCVTY, "TC_chan_act_to_vamos");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(1, false);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(BSCVTY, "bts 0 trx 0 timeslot 1 sub-slot 0 activate-vamos fr");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  var RSL_Message rsl;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var RSL_IE_Body chan_mode_ie;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (f_rsl_find_ie(rsl, RSL_IE_CHAN_MODE, chan_mode_ie) == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Cannot find RSL_IE_CHAN_MODE");</span><br><span style="color: hsl(120, 100%, 40%);">+           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (chan_mode_ie.chan_mode.ch_rate_type != RSL_CHRT_OSMO_TCH_F_VAMOS) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "expected chan_mode.ch_rate_type == RSL_CHRT_OSMO_TCH_F_VAMOS");</span><br><span style="color: hsl(120, 100%, 40%);">+           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var RSL_IE_Body osmo_tsc_ie;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (f_rsl_find_ie(rsl, RSL_IE_OSMO_TRAINING_SEQUENCE, osmo_tsc_ie) == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Cannot find RSL_IE_OSMO_TRAINING_SEQUENCE");</span><br><span style="color: hsl(120, 100%, 40%);">+              mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var RslChannelNr chan_nr := rsl.ies[0].body.chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+  f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 23+10));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_lchan_ensure_established(BSCVTY, 0, 0, chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_shutdown_helper();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* verify that DTAP passes through both ways with the right cbits */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_verify_dtap() runs on MSC_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     var octetstring l3_data := '00010203040506'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP rx_bssap_dtap;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* MS to NW */</span><br><span style="color: hsl(120, 100%, 40%);">+        RSL.send(ts_RSL_DATA_IND(g_chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3_data));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSAP_DTAP) -> value rx_bssap_dtap;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (not match(rx_bssap_dtap.pdu.dtap, l3_data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "unexpected L3 data");</span><br><span style="color: hsl(120, 100%, 40%);">+             mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* NW to MS */</span><br><span style="color: hsl(120, 100%, 40%);">+        l3_data := '0800dcba9876543210'O;</span><br><span style="color: hsl(120, 100%, 40%);">+     BSSAP.send(ts_BSSAP_DTAP(l3_data, '00'O));</span><br><span style="color: hsl(120, 100%, 40%);">+    RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, tr_RslLinkID_DCCH(0), l3_data));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_est_lchan_and_mode_modify_to_vamos() runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        var PDU_BSSAP ass_cmd := f_gen_ass_req(g_pars.use_osmux);</span><br><span style="color: hsl(120, 100%, 40%);">+     var template PDU_BSSAP exp_compl := f_gen_exp_compl(g_pars.use_osmux);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* puzzle together the ASSIGNMENT REQ for given codec[s] */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (mp_bssap_cfg[0].transport == BSSAP_TRANSPORT_AoIP) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ass_cmd.pdu.bssmap.assignmentRequest.codecList := g_pars.ass_codec_list;</span><br><span style="color: hsl(120, 100%, 40%);">+              exp_compl.pdu.bssmap.assignmentComplete.speechCodec.codecElements[0] :=</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               g_pars.ass_codec_list.codecElements[0];</span><br><span style="color: hsl(120, 100%, 40%);">+               if (isvalue(g_pars.expect_mr_s0_s7)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        exp_compl.pdu.bssmap.assignmentComplete.speechCodec.codecElements[0].s0_7 :=</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          g_pars.expect_mr_s0_s7;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     ass_cmd.pdu.bssmap.assignmentRequest.channelType :=</span><br><span style="color: hsl(120, 100%, 40%);">+                           f_BSSMAP_chtype_from_codec(g_pars.ass_codec_list.codecElements[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+   log("expecting ASS COMPL like this: ", exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_lchan_ensure_established(BSCVTY, 0, 0, g_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var charstring current_long_lchan_str := f_long_lchan_str(0, 0, g_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_transceive(BSCVTY, current_long_lchan_str & " modify vamos tsc 2 3");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var RSL_Message rsl_rr;</span><br><span style="color: hsl(120, 100%, 40%);">+       RSL.receive(tr_RSL_DATA_REQ(g_chan_nr)) -> value rsl_rr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_ML3_NW_MS l3 := dec_PDU_ML3_NW_MS(rsl_rr.ies[2].body.l3_info.payload);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer current_subslot := f_rsl_chan_nr_to_subslot(g_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ template PDU_ML3_NW_MS expect_rr_modify := tr_RRM_ModeModify(</span><br><span style="color: hsl(120, 100%, 40%);">+         tr_ChannelDescription2_V(timeslotNumber := int2bit(g_chan_nr.tn, 3)),</span><br><span style="color: hsl(120, 100%, 40%);">+         tr_ChannelMode_V(mode := 'C1'O /* 1 1 0 0 0 0 0 1 speech full rate or half rate version 1 in VAMOS mode (3GPP TS 44.018) */),</span><br><span style="color: hsl(120, 100%, 40%);">+         extendedTSCSet := tr_ExtendedTSCSet_TV(cSDomainTSCSet := '01'B));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (not match(l3, expect_rr_modify)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                log("expected: ", expect_rr_modify);</span><br><span style="color: hsl(120, 100%, 40%);">+                log("got: ", l3);</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "RR channelModeModify message is not as expected");</span><br><span style="color: hsl(120, 100%, 40%);">+                mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rsl_reply(ts_RRM_ModeModifyAck(l3.msgs.rrm.channelModeModify.channelDescription,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     l3.msgs.rrm.channelModeModify.channelMode,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    l3.msgs.rrm.channelModeModify.extendedTSCSet), rsl_rr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var RSL_Message rsl;</span><br><span style="color: hsl(120, 100%, 40%);">+  RSL.receive(tr_RSL_MODE_MODIFY_REQ_with_OSMO_TSC(g_chan_nr, tr_RSL_ChanMode(f_rsl_chan_nr_to_chrt(g_chan_nr, true), RSL_CMOD_SP_GSM1),</span><br><span style="color: hsl(120, 100%, 40%);">+                            tsc_set := 1, /* 1 means TSC Set 2 (range 1-4 in spec tables and naming, 0-3 on the wire) */</span><br><span style="color: hsl(120, 100%, 40%);">+                          tsc := 3));</span><br><span style="color: hsl(120, 100%, 40%);">+       RSL.send(ts_RSL_MODE_MODIFY_ACK(g_chan_nr));</span><br><span style="color: hsl(120, 100%, 40%);">+  f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_lchan_ensure_established(BSCVTY, 0, 0, g_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_verify_dtap();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_mode_modify_to_vamos(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       f_est_lchan_and_mode_modify_to_vamos();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Modify a primary lchan into VAMOS speech mode */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mode_modify_to_vamos_fr() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       pars.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_start_handler(refers(f_TC_mode_modify_to_vamos), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+  vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown_helper();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Modify a primary lchan into VAMOS speech mode */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mode_modify_to_vamos_hr() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       pars.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR}));</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_start_handler(refers(f_TC_mode_modify_to_vamos), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+  vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown_helper();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Establish a primary lchan, and then do a re-assignment to a VAMOS shadow lchan. */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_reassign_secondary_to_primary_lchan(RslChannelNr new_chan_nr) runs on MSC_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    var integer current_subslot := f_rsl_chan_nr_to_subslot(g_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer new_subslot := f_rsl_chan_nr_to_subslot(new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+     var BIT5 new_rr_cbits := f_rsl_chan_nr_to_rr_cbits(new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    activate(as_Media_mgw());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rslem_register(0, new_chan_nr, RSL_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+   log("f_rslem_register(0, new_chan_nr = ", new_chan_nr, ")");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_vty_transceive(BSCVTY, "bts 0 trx 0 timeslot " & int2str(g_chan_nr.tn) & " vamos-sub-slot " & int2str(current_subslot)</span><br><span style="color: hsl(120, 100%, 40%);">+                       & " reassign-to trx 0 timeslot " & int2str(new_chan_nr.tn) & " sub-slot " & int2str(new_subslot));</span><br><span style="color: hsl(120, 100%, 40%);">+       /* RSL CHAN ACT is ACKed by RSL emulation */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var RSL_Message rsl;</span><br><span style="color: hsl(120, 100%, 40%);">+  var RSL_IE_Body ie;</span><br><span style="color: hsl(120, 100%, 40%);">+   var boolean b_unused;</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr)) -> value rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+          var PDU_ML3_NW_MS l3 := dec_PDU_ML3_NW_MS(rsl.ies[2].body.l3_info.payload);</span><br><span style="color: hsl(120, 100%, 40%);">+           var template PDU_ML3_NW_MS expect_rr_assignment := tr_RR_AssignmentCommand(</span><br><span style="color: hsl(120, 100%, 40%);">+                   desc := tr_ChannelDescription2_V(timeslotNumber := int2bit(new_chan_nr.tn, 3),</span><br><span style="color: hsl(120, 100%, 40%);">+                                        channelTypeandTDMAOffset := new_rr_cbits),</span><br><span style="color: hsl(120, 100%, 40%);">+                    mode := tr_ChannelMode_TV(mode := '01'O</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 /* 0 0 0 0 0 0 0 1 speech full rate or half rate version 1 (3GPP TS 44.018) */),</span><br><span style="color: hsl(120, 100%, 40%);">+                    extendedTSCSet := omit);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (not match(l3, expect_rr_assignment)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    log("expected: ", expect_rr_assignment);</span><br><span style="color: hsl(120, 100%, 40%);">+                    log("got: ", l3);</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "RR assignmentCommand message is not as expected");</span><br><span style="color: hsl(120, 100%, 40%);">+                        mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           var PDU_ML3_MS_NW l3_tx := valueof(ts_RRM_AssignmentComplete('00'O));</span><br><span style="color: hsl(120, 100%, 40%);">+         RSL.send(ts_RSL_EST_IND(new_chan_nr, valueof(ts_RslLinkID_DCCH(0)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                   enc_PDU_ML3_MS_NW(l3_tx)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL.receive(tr_RSL_IPA_CRCX(new_chan_nr)) -> value rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+                var uint7_t rtp_pt := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (f_rsl_find_ie(rsl, RSL_IE_IPAC_RTP_PAYLOAD, ie)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        rtp_pt := ie.ipa_rtp_pt;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             RSL.send(ts_RSL_IPA_CRCX_ACK(new_chan_nr, 123,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                oct2int(f_inet_addr("1.2.3.4")),</span><br><span style="color: hsl(120, 100%, 40%);">+                                            4321,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         rtp_pt));</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL.receive(tr_RSL_IPA_MDCX(new_chan_nr, ?)) -> value rsl{</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Extract conn_id, ip, port, rtp_pt2 from request + use in response */</span><br><span style="color: hsl(120, 100%, 40%);">+               b_unused := f_rsl_find_ie(rsl, RSL_IE_IPAC_CONN_ID, ie);</span><br><span style="color: hsl(120, 100%, 40%);">+              var uint16_t conn_id := ie.ipa_conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+               /* mandatory */</span><br><span style="color: hsl(120, 100%, 40%);">+               b_unused := f_rsl_find_ie(rsl, RSL_IE_IPAC_REMOTE_IP, ie);</span><br><span style="color: hsl(120, 100%, 40%);">+            var HostPort peer;</span><br><span style="color: hsl(120, 100%, 40%);">+            peer.host := f_inet_ntoa(int2oct(ie.ipa_remote_ip, 4));</span><br><span style="color: hsl(120, 100%, 40%);">+               b_unused := f_rsl_find_ie(rsl, RSL_IE_IPAC_REMOTE_PORT, ie);</span><br><span style="color: hsl(120, 100%, 40%);">+          peer.port_nr := ie.ipa_remote_port;</span><br><span style="color: hsl(120, 100%, 40%);">+           var uint7_t rtp_pt := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+              /* optional */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (f_rsl_find_ie(rsl, RSL_IE_IPAC_RTP_PAYLOAD, ie)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        rtp_pt := ie.ipa_rtp_pt;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             RSL.send(ts_RSL_IPA_MDCX_ACK(new_chan_nr, conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            oct2int(f_inet_addr(peer.host)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                              peer.port_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         rtp_pt));</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL.receive(tr_RSL_DEACT_SACCH(g_chan_nr)) {}</span><br><span style="color: hsl(120, 100%, 40%);">+      [] RSL.receive(tr_RSL_RF_CHAN_REL(g_chan_nr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /*</span><br><span style="color: hsl(120, 100%, 40%);">+            RSL.send(ts_ASP_RSL_UD(ts_RSL_RF_CHAN_REL_ACK(g_chan_nr),</span><br><span style="color: hsl(120, 100%, 40%);">+                                    IPAC_PROTO_RSL_TRX0));</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+            f_rslem_unregister(0, g_chan_nr, RSL_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+           g_chan_nr := new_chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* (There must be no RSL_MT_REL_REQ on the old lchan.) */</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_vty_transceive(BSCVTY, "show lchan summary");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_verify_dtap();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_est_and_reassign_to_secondary_lchan(RslChannelNr new_chan_nr) runs on MSC_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer new_subslot := f_rsl_chan_nr_to_subslot(new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+     var BIT5 new_rr_cbits := f_rsl_chan_nr_to_rr_cbits(new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var PDU_BSSAP ass_cmd := f_gen_ass_req();</span><br><span style="color: hsl(120, 100%, 40%);">+     var template PDU_BSSAP exp_compl := f_gen_exp_compl();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* puzzle together the ASSIGNMENT REQ for given codec[s] */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (mp_bssap_cfg[0].transport == BSSAP_TRANSPORT_AoIP) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ass_cmd.pdu.bssmap.assignmentRequest.codecList := g_pars.ass_codec_list;</span><br><span style="color: hsl(120, 100%, 40%);">+              exp_compl.pdu.bssmap.assignmentComplete.speechCodec.codecElements[0] :=</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               g_pars.ass_codec_list.codecElements[0];</span><br><span style="color: hsl(120, 100%, 40%);">+               if (isvalue(g_pars.expect_mr_s0_s7)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        exp_compl.pdu.bssmap.assignmentComplete.speechCodec.codecElements[0].s0_7 :=</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          g_pars.expect_mr_s0_s7;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     ass_cmd.pdu.bssmap.assignmentRequest.channelType :=</span><br><span style="color: hsl(120, 100%, 40%);">+                           f_BSSMAP_chtype_from_codec(g_pars.ass_codec_list.codecElements[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+   log("expecting ASS COMPL like this: ", exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer current_subslot := f_rsl_chan_nr_to_subslot(g_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       activate(as_Media_mgw());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rslem_register(0, new_chan_nr, RSL_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+   log("f_rslem_register(0, new_chan_nr = ", new_chan_nr, ")");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_vty_transceive(BSCVTY, "bts 0 trx 0 timeslot " & int2str(g_chan_nr.tn) & " sub-slot " & int2str(current_subslot)</span><br><span style="color: hsl(120, 100%, 40%);">+                     & " reassign-to trx 0 timeslot " & int2str(new_chan_nr.tn) & " vamos-sub-slot " & int2str(new_subslot) & " tsc 4 2");</span><br><span style="color: hsl(120, 100%, 40%);">+      /* RSL CHAN ACT is ACKed by RSL emulation */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var RSL_Message rsl;</span><br><span style="color: hsl(120, 100%, 40%);">+  var RSL_IE_Body ie;</span><br><span style="color: hsl(120, 100%, 40%);">+   var boolean b_unused;</span><br><span style="color: hsl(120, 100%, 40%);">+ interleave {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr)) -> value rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+          var PDU_ML3_NW_MS l3 := dec_PDU_ML3_NW_MS(rsl.ies[2].body.l3_info.payload);</span><br><span style="color: hsl(120, 100%, 40%);">+           var template PDU_ML3_NW_MS expect_rr_assignment := tr_RR_AssignmentCommand(</span><br><span style="color: hsl(120, 100%, 40%);">+                   desc := tr_ChannelDescription2_V(timeslotNumber := int2bit(new_chan_nr.tn, 3),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         channelTypeandTDMAOffset := new_rr_cbits),</span><br><span style="color: hsl(120, 100%, 40%);">+                   mode := tr_ChannelMode_TV(mode := 'C1'O</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 /* 1 1 0 0 0 0 0 1 speech full rate or half rate version 1 in VAMOS mode (3GPP TS 44.018) */),</span><br><span style="color: hsl(120, 100%, 40%);">+                      extendedTSCSet := tr_ExtendedTSCSet_TV(cSDomainTSCSet := '11'B</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               /* 3 means TSC Set 4 (range 1-4 in spec tables and naming, 0-3 on the wire) */));</span><br><span style="color: hsl(120, 100%, 40%);">+              if (not match(l3, expect_rr_assignment)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    log("expected: ", expect_rr_assignment);</span><br><span style="color: hsl(120, 100%, 40%);">+                    log("got: ", l3);</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "RR assignmentCommand message is not as expected");</span><br><span style="color: hsl(120, 100%, 40%);">+                        mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           var PDU_ML3_MS_NW l3_tx := valueof(ts_RRM_AssignmentComplete('00'O));</span><br><span style="color: hsl(120, 100%, 40%);">+         RSL.send(ts_RSL_EST_IND(new_chan_nr, valueof(ts_RslLinkID_DCCH(0)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                   enc_PDU_ML3_MS_NW(l3_tx)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL.receive(tr_RSL_IPA_CRCX(new_chan_nr)) -> value rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+                var uint7_t rtp_pt := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (f_rsl_find_ie(rsl, RSL_IE_IPAC_RTP_PAYLOAD, ie)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        rtp_pt := ie.ipa_rtp_pt;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             RSL.send(ts_RSL_IPA_CRCX_ACK(new_chan_nr, 123,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                oct2int(f_inet_addr("1.2.3.4")),</span><br><span style="color: hsl(120, 100%, 40%);">+                                            4321,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         rtp_pt));</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL.receive(tr_RSL_IPA_MDCX(new_chan_nr, ?)) -> value rsl{</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Extract conn_id, ip, port, rtp_pt2 from request + use in response */</span><br><span style="color: hsl(120, 100%, 40%);">+               b_unused := f_rsl_find_ie(rsl, RSL_IE_IPAC_CONN_ID, ie);</span><br><span style="color: hsl(120, 100%, 40%);">+              var uint16_t conn_id := ie.ipa_conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+               /* mandatory */</span><br><span style="color: hsl(120, 100%, 40%);">+               b_unused := f_rsl_find_ie(rsl, RSL_IE_IPAC_REMOTE_IP, ie);</span><br><span style="color: hsl(120, 100%, 40%);">+            var HostPort peer;</span><br><span style="color: hsl(120, 100%, 40%);">+            peer.host := f_inet_ntoa(int2oct(ie.ipa_remote_ip, 4));</span><br><span style="color: hsl(120, 100%, 40%);">+               b_unused := f_rsl_find_ie(rsl, RSL_IE_IPAC_REMOTE_PORT, ie);</span><br><span style="color: hsl(120, 100%, 40%);">+          peer.port_nr := ie.ipa_remote_port;</span><br><span style="color: hsl(120, 100%, 40%);">+           var uint7_t rtp_pt := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+              /* optional */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (f_rsl_find_ie(rsl, RSL_IE_IPAC_RTP_PAYLOAD, ie)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        rtp_pt := ie.ipa_rtp_pt;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             RSL.send(ts_RSL_IPA_MDCX_ACK(new_chan_nr, conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            oct2int(f_inet_addr(peer.host)),</span><br><span style="color: hsl(120, 100%, 40%);">+                                              peer.port_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         rtp_pt));</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL.receive(tr_RSL_DEACT_SACCH(g_chan_nr)) {}</span><br><span style="color: hsl(120, 100%, 40%);">+      [] RSL.receive(tr_RSL_RF_CHAN_REL(g_chan_nr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /*</span><br><span style="color: hsl(120, 100%, 40%);">+            RSL.send(ts_ASP_RSL_UD(ts_RSL_RF_CHAN_REL_ACK(g_chan_nr),</span><br><span style="color: hsl(120, 100%, 40%);">+                                    IPAC_PROTO_RSL_TRX0));</span><br><span style="color: hsl(120, 100%, 40%);">+         */</span><br><span style="color: hsl(120, 100%, 40%);">+            f_rslem_unregister(0, g_chan_nr, RSL_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+           g_chan_nr := new_chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* (There must be no RSL_MT_REL_REQ on the old lchan.) */</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_vty_transceive(BSCVTY, "show lchan summary");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_verify_dtap();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Establish a primary lchan, and then do a re-assignment to a VAMOS shadow lchan.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Also re-assign back to a primary lchan. */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_assign_to_secondary_lchan_fr(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_est_and_reassign_to_secondary_lchan(valueof(t_RslChanNr_Osmo_VAMOS_Bm(2)));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_reassign_secondary_to_primary_lchan(valueof(t_RslChanNr_Bm(3)));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_perform_clear(RSL);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Establish a primary lchan, and then do a re-assignment to a VAMOS shadow lchan. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_assign_to_secondary_lchan_fr() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       pars.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_start_handler(refers(f_TC_assign_to_secondary_lchan_fr), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+  vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown_helper();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Establish a primary lchan, and then do a re-assignment to a VAMOS shadow lchan.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Also re-assign back to a primary lchan. */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_assign_to_secondary_lchan_hr(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        f_est_and_reassign_to_secondary_lchan(valueof(t_RslChanNr_Osmo_VAMOS_Lm(6, 0)));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_reassign_secondary_to_primary_lchan(valueof(t_RslChanNr_Lm(6, 1)));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear(RSL);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Establish a primary lchan, and then do a re-assignment to a VAMOS shadow lchan. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_assign_to_secondary_lchan_hr() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+    var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init(1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       pars.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR}));</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_start_handler(refers(f_TC_assign_to_secondary_lchan_hr), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+  vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown_helper();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* First, primary lchan of TC_vamos_multiplex_tch_f_tch_f() */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_vamos_multiplex_tch_f_tch_f1(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_est_lchan_and_mode_modify_to_vamos();</span><br><span style="color: hsl(120, 100%, 40%);">+       f_logp(BSCVTY, "f_est_lchan_and_mode_modify_to_vamos done");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Second, VAMOS shadow lchan of TC_vamos_multiplex_tch_f_tch_f() */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_vamos_multiplex_tch_f_tch_f2(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_est_and_reassign_to_secondary_lchan(valueof(t_RslChanNr_Osmo_VAMOS_Bm(1)));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Establish a primary lchan and modify it to VAMOS speech mode. Then establish</span><br><span style="color: hsl(120, 100%, 40%);">+ * another primary lchan, and re-assign it to the VAMOS secondary lchan of the</span><br><span style="color: hsl(120, 100%, 40%);">+ * first primary lchan. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_vamos_multiplex_tch_f_tch_f() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var TestHdlrParams pars1 := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+   var MSC_ConnHdlr vc_conn1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  var TestHdlrParams pars2 := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+   var MSC_ConnHdlr vc_conn2;</span><br><span style="color: hsl(120, 100%, 40%);">+    pars2.imsi := '001014234234234'H;</span><br><span style="color: hsl(120, 100%, 40%);">+     pars2.media_nr := 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init(1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       pars1.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));</span><br><span style="color: hsl(120, 100%, 40%);">+        pars2.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn1 := f_start_handler(refers(f_TC_vamos_multiplex_tch_f_tch_f1), pars1);</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn2 := f_start_handler(refers(f_TC_vamos_multiplex_tch_f_tch_f2), pars2);</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_shutdown_helper();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* First, primary lchan of TC_vamos_multiplex_tch_h_tch_h_tch_h_tch_h() */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_vamos_multiplex_tch_h_tch_h1(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       f_est_lchan_and_mode_modify_to_vamos();</span><br><span style="color: hsl(120, 100%, 40%);">+       f_logp(BSCVTY, "f_est_lchan_and_mode_modify_to_vamos done");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Second, VAMOS shadow lchan of TC_vamos_multiplex_tch_h_tch_h_tch_h_tch_h() */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_vamos_multiplex_tch_h_tch_h2(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       f_est_and_reassign_to_secondary_lchan(valueof(t_RslChanNr_Osmo_VAMOS_Lm(5, 0)));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_TC_vamos_multiplex_tch_h_tch_h4(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+       f_est_and_reassign_to_secondary_lchan(valueof(t_RslChanNr_Osmo_VAMOS_Lm(5, 1)));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Establish a primary lchan and modify it to VAMOS speech mode. Then establish</span><br><span style="color: hsl(120, 100%, 40%);">+ * another primary lchan, and re-assign it to the VAMOS secondary lchan of the</span><br><span style="color: hsl(120, 100%, 40%);">+ * first primary lchan. */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_vamos_multiplex_tch_h_tch_h_tch_h_tch_h() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var TestHdlrParams pars1 := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+   var MSC_ConnHdlr vc_conn1;</span><br><span style="color: hsl(120, 100%, 40%);">+    pars1.imsi := '001011111111111'H;</span><br><span style="color: hsl(120, 100%, 40%);">+     pars1.media_nr := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var TestHdlrParams pars2 := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+   var MSC_ConnHdlr vc_conn2;</span><br><span style="color: hsl(120, 100%, 40%);">+    pars2.imsi := '001012222222222'H;</span><br><span style="color: hsl(120, 100%, 40%);">+     pars2.media_nr := 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var TestHdlrParams pars3 := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+   var MSC_ConnHdlr vc_conn3;</span><br><span style="color: hsl(120, 100%, 40%);">+    pars3.imsi := '001013333333333'H;</span><br><span style="color: hsl(120, 100%, 40%);">+     pars3.media_nr := 3;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var TestHdlrParams pars4 := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+   var MSC_ConnHdlr vc_conn4;</span><br><span style="color: hsl(120, 100%, 40%);">+    pars4.imsi := '001014444444444'H;</span><br><span style="color: hsl(120, 100%, 40%);">+     pars4.media_nr := 4;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init(1, true);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       pars1.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR}));</span><br><span style="color: hsl(120, 100%, 40%);">+        pars2.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR}));</span><br><span style="color: hsl(120, 100%, 40%);">+        pars3.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR}));</span><br><span style="color: hsl(120, 100%, 40%);">+        pars4.ass_codec_list := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR}));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn1 := f_start_handler(refers(f_TC_vamos_multiplex_tch_h_tch_h1), pars1);</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn2 := f_start_handler(refers(f_TC_vamos_multiplex_tch_h_tch_h2), pars2);</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Also fill up the second subslot of the TCH/H timeslot */</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn3 := f_start_handler(refers(f_TC_vamos_multiplex_tch_h_tch_h1), pars3);</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn3.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn4 := f_start_handler(refers(f_TC_vamos_multiplex_tch_h_tch_h4), pars4);</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn4.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_shutdown_helper();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+control {</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_chan_act_to_vamos() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_mode_modify_to_vamos_fr() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_mode_modify_to_vamos_hr() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_assign_to_secondary_lchan_fr() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_assign_to_secondary_lchan_hr() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_vamos_multiplex_tch_f_tch_f() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_vamos_multiplex_tch_h_tch_h_tch_h_tch_h() );</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn</span><br><span>index 5d688de..53731c0 100644</span><br><span>--- a/library/L3_Templates.ttcn</span><br><span>+++ b/library/L3_Templates.ttcn</span><br><span>@@ -530,7 +530,51 @@</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-template (value) PDU_ML3_MS_NW ts_RRM_ModeModifyAck(ChannelDescription2_V desc, ChannelMode_V mode) := {</span><br><span style="color: hsl(120, 100%, 40%);">+template ChannelDescription2_V tr_ChannelDescription2_V(template BIT3 timeslotNumber := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        template BIT5 channelTypeandTDMAOffset := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+     timeslotNumber := timeslotNumber,</span><br><span style="color: hsl(120, 100%, 40%);">+     channelTypeandTDMAOffset := channelTypeandTDMAOffset,</span><br><span style="color: hsl(120, 100%, 40%);">+ octet3 := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+  octet4 := ?</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template ChannelMode_V tr_ChannelMode_V(template OCT1 mode) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    mode := mode</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template ExtendedTSCSet_TV tr_ExtendedTSCSet_TV(template BIT2 cSDomainTSCSet := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    elementIdentifier := '6D'O,</span><br><span style="color: hsl(120, 100%, 40%);">+   cSDomainTSCSet := cSDomainTSCSet,</span><br><span style="color: hsl(120, 100%, 40%);">+     secondPSDomainTSCAssigned := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+       primaryPSDomainTSCSet := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+   secondaryPSDomainTSCSet := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ secondaryPSDomainTSCValue := ?</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+     </span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_ML3_NW_MS tr_RRM_ModeModify(template ChannelDescription2_V desc := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template ChannelMode_V mode := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     template ExtendedTSCSet_TV extendedTSCSet) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      discriminator := '0110'B,</span><br><span style="color: hsl(120, 100%, 40%);">+     tiOrSkip := {</span><br><span style="color: hsl(120, 100%, 40%);">+         skipIndicator := '0000'B</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+    msgs := {</span><br><span style="color: hsl(120, 100%, 40%);">+             rrm := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      channelModeModify := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                messageType := '00010000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                           channelDescription := desc,</span><br><span style="color: hsl(120, 100%, 40%);">+                           channelMode := mode,</span><br><span style="color: hsl(120, 100%, 40%);">+                          vGCS_TargetModeIndication := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                            multiRateConfiguration := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                               vGCS_Ciphering_Parameters := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                            extendedTSCSet := extendedTSCSet</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_ML3_MS_NW ts_RRM_ModeModifyAck(ChannelDescription2_V desc, ChannelMode_V mode,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               template (omit) ExtendedTSCSet_TV extendedTSCSet := omit) := {</span><br><span>   discriminator := '0000'B, /* overwritten */</span><br><span>  tiOrSkip := {</span><br><span>                skipIndicator := '0000'B</span><br><span>@@ -541,7 +585,7 @@</span><br><span>                               messageType := '00010111'B,</span><br><span>                          channelDescription := desc,</span><br><span>                          channelMode := mode,</span><br><span style="color: hsl(0, 100%, 40%);">-                            extendedTSCSet := omit</span><br><span style="color: hsl(120, 100%, 40%);">+                                extendedTSCSet := extendedTSCSet</span><br><span>                     }</span><br><span>            }</span><br><span>    }</span><br><span>@@ -584,6 +628,57 @@</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template ChannelMode_TV tr_ChannelMode_TV(template OCT1 mode) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        elementIdentifier := '63'O,</span><br><span style="color: hsl(120, 100%, 40%);">+   mode := mode</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) PDU_ML3_NW_MS tr_RR_AssignmentCommand(</span><br><span style="color: hsl(120, 100%, 40%);">+          template ChannelDescription2_V desc := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+             template ChannelMode_TV mode := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+            template ExtendedTSCSet_TV extendedTSCSet := omit</span><br><span style="color: hsl(120, 100%, 40%);">+) := {</span><br><span style="color: hsl(120, 100%, 40%);">+     discriminator := '0110'B,</span><br><span style="color: hsl(120, 100%, 40%);">+     tiOrSkip := {</span><br><span style="color: hsl(120, 100%, 40%);">+         skipIndicator := '0000'B</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+    msgs := {</span><br><span style="color: hsl(120, 100%, 40%);">+             rrm := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      assignmentCommand := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                messageType := '00101110'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                           descrOf1stChAfterTime := desc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                PowerCommand := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                            frequencyList_at := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                             cellChannelDescr := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                             descrMultislotAllocation := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                             modeOf1stChannel := mode,</span><br><span style="color: hsl(120, 100%, 40%);">+                             channelSet2 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                          channelSet3 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                          channelSet4 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                          channelSet5 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                          channelSet6 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                          channelSet7 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                          channelSet8 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                          descrOf2ndChAfterTime := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                                modeOf2ndChannel := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                             mobileAllocation_at := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                          startingTime := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                         frequencyList_bt := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                             descrOf1stCh_bt := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                              descrOf2ndCh_bt := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                              frequencyChannelSequence := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                             mobileAllocation_bt := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                          cipherModeSetting := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                            vGCS_TargetModeIndication := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                            multiRateConfiguration := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                               vGCS_Ciphering_Parameters := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                            extendedTSCSet_afterTime := extendedTSCSet,</span><br><span style="color: hsl(120, 100%, 40%);">+                           extendedTSCSet_beforeTime := omit</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> template (value) PDU_ML3_MS_NW ts_RRM_AssignmentComplete(OCT1 cause) := {</span><br><span>  discriminator := '0000'B, /* overwritten */</span><br><span>  tiOrSkip := {</span><br><span>diff --git a/library/RSL_Types.ttcn b/library/RSL_Types.ttcn</span><br><span>index 16ce506..10284b8 100644</span><br><span>--- a/library/RSL_Types.ttcn</span><br><span>+++ b/library/RSL_Types.ttcn</span><br><span>@@ -1515,6 +1515,24 @@</span><br><span>                  *</span><br><span>            }</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   template RSL_Message tr_RSL_MODE_MODIFY_REQ_with_OSMO_TSC(template RslChannelNr chan_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                template RSL_IE_ChannelMode mode,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                             template uint8_t tsc_set := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                template uint8_t tsc := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+             msg_disc := tr_RSL_MsgDisc(RSL_MDISC_DCHAN, false),</span><br><span style="color: hsl(120, 100%, 40%);">+           msg_type := RSL_MT_MODE_MODIFY_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+           ies := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  tr_RSL_IE(RSL_IE_Body:{chan_nr := chan_nr}),</span><br><span style="color: hsl(120, 100%, 40%);">+                  tr_RSL_IE(RSL_IE_Body:{chan_mode := mode}),</span><br><span style="color: hsl(120, 100%, 40%);">+                   tr_RSL_IE(RSL_IE_Body:{osmo_training_sequence := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        len := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     tsc_set := tsc_set,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   tsc := tsc</span><br><span style="color: hsl(120, 100%, 40%);">+                                              }</span><br><span style="color: hsl(120, 100%, 40%);">+                                     })</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+     };</span><br><span>   </span><br><span>     /* 8.4.10 BTS -> BSC */</span><br><span>   template (value) RSL_Message ts_RSL_MODE_MODIFY_ACK(template (value) RslChannelNr chan_nr) := {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/24411">change 24411</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/24411"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I2c504099163a30ea102cbd26d3615ca2e5ce1e64 </div>
<div style="display:none"> Gerrit-Change-Number: 24411 </div>
<div style="display:none"> Gerrit-PatchSet: 15 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>