<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/24411">View Change</a></p><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_mode_modify_to_vamos()<br>TC_chan_act_to_vamos()<br>TC_assign_to_secondary_lchan()<br>TC_vamos_multiplex_tch_f_tch_f()<br><br>Change-Id: I2c504099163a30ea102cbd26d3615ca2e5ce1e64<br>---<br>A bsc/BSC_Tests_VAMOS.ttcn<br>1 file changed, 1,435 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/11/24411/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><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..ac95827</span><br><span>--- /dev/null</span><br><span>+++ b/bsc/BSC_Tests_VAMOS.ttcn</span><br><span>@@ -0,0 +1,1435 @@</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) 2017-2018 by Harald Welte <laforge@gnumonks.org></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 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%);">+/* per-BTS state which we keep */</span><br><span style="color: hsl(120, 100%, 40%);">+type record BTS_State {</span><br><span style="color: hsl(120, 100%, 40%);">+       /* component reference to the IPA_Client component used for RSL */</span><br><span style="color: hsl(120, 100%, 40%);">+    IPA_Client rsl</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%);">+/* Set of all System Information received during one RSL port's startup.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Note that some System Information may be sent on RSL, but lacking actual SI data, to indicate that the BTS should not</span><br><span style="color: hsl(120, 100%, 40%);">+ * broadcast that SI type. That will be reflected as 'omit' here.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+type record SystemInformationConfig {</span><br><span style="color: hsl(120, 100%, 40%);">+    SystemInformationType1 si1 optional,</span><br><span style="color: hsl(120, 100%, 40%);">+  SystemInformationType2 si2 optional,</span><br><span style="color: hsl(120, 100%, 40%);">+  SystemInformationType2bis si2bis optional,</span><br><span style="color: hsl(120, 100%, 40%);">+    SystemInformationType2ter si2ter optional,</span><br><span style="color: hsl(120, 100%, 40%);">+    SI2quaterRestOctetsList si2quater optional,</span><br><span style="color: hsl(120, 100%, 40%);">+   SystemInformationType3 si3 optional,</span><br><span style="color: hsl(120, 100%, 40%);">+  SystemInformationType4 si4 optional,</span><br><span style="color: hsl(120, 100%, 40%);">+  SystemInformationType13 si13 optional,</span><br><span style="color: hsl(120, 100%, 40%);">+        SystemInformationType5 si5 optional,</span><br><span style="color: hsl(120, 100%, 40%);">+  SystemInformationType5bis si5bis optional,</span><br><span style="color: hsl(120, 100%, 40%);">+    SystemInformationType5ter si5ter optional,</span><br><span style="color: hsl(120, 100%, 40%);">+    SystemInformationType6 si6 optional</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%);">+const SystemInformationConfig SystemInformationConfig_omit := {</span><br><span style="color: hsl(120, 100%, 40%);">+    si1 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+  si2 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+  si2bis := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+       si2ter := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+       si2quater := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+    si3 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+  si4 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+  si13 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ si5 := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+  si5bis := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+       si5ter := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+       si6 := 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%);">+/* tr_EUTRAN_CellDesc with defaults used in BSC_Tests_VAMOS.ttcn */</span><br><span style="color: hsl(120, 100%, 40%);">+template EUTRAN_CellDesc tr_EUTRAN_CellDesc_default(template (present) uint16_t e_arfcn := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             template uint3_t meas_bw := 3)</span><br><span style="color: hsl(120, 100%, 40%);">+:= tr_EUTRAN_CellDesc(e_arfcn := e_arfcn,</span><br><span style="color: hsl(120, 100%, 40%);">+               meas_bw_presence := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                     meas_bw := meas_bw);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* tr_EUTRAN_NeighbourCells with defaults used in BSC_Tests_VAMOS.ttcn */</span><br><span style="color: hsl(120, 100%, 40%);">+template EUTRAN_NeighbourCells tr_EUTRAN_NeighbourCells_default(template (present) EUTRAN_CellDescs cell_desc_list := { tr_EUTRAN_CellDesc_default },</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                template uint3_t prio := 3,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                           template (present) uint5_t thresh_high := 20,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         template uint5_t thresh_low := 10,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                            template uint5_t qrxlevmin := 22)</span><br><span style="color: hsl(120, 100%, 40%);">+:= tr_EUTRAN_NeighbourCells(</span><br><span style="color: hsl(120, 100%, 40%);">+       cell_desc_list := cell_desc_list,</span><br><span style="color: hsl(120, 100%, 40%);">+     prio_presence := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+        prio := prio,</span><br><span style="color: hsl(120, 100%, 40%);">+ thresh_high := thresh_high,</span><br><span style="color: hsl(120, 100%, 40%);">+   thresh_low_presence := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+  thresh_low := thresh_low,</span><br><span style="color: hsl(120, 100%, 40%);">+     qrxlevmin_presence := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+   qrxlevmin := qrxlevmin);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template SystemInformationConfig SystemInformationConfig_default := {</span><br><span style="color: hsl(120, 100%, 40%);">+     si1 := {</span><br><span style="color: hsl(120, 100%, 40%);">+          cell_chan_desc := '8FB38000000000000000000000000000'O,</span><br><span style="color: hsl(120, 100%, 40%);">+        rach_control := {</span><br><span style="color: hsl(120, 100%, 40%);">+         max_retrans := RACH_MAX_RETRANS_7,</span><br><span style="color: hsl(120, 100%, 40%);">+            tx_integer := '1001'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                cell_barr_access := false,</span><br><span style="color: hsl(120, 100%, 40%);">+            re_not_allowed := true,</span><br><span style="color: hsl(120, 100%, 40%);">+               acc := '0000010000000000'B</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+            rest_octets := ?</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    si2 := {</span><br><span style="color: hsl(120, 100%, 40%);">+          bcch_freq_list := '00000000000000000000000000000000'O,</span><br><span style="color: hsl(120, 100%, 40%);">+        ncc_permitted := '11111111'B,</span><br><span style="color: hsl(120, 100%, 40%);">+         rach_control := {</span><br><span style="color: hsl(120, 100%, 40%);">+         max_retrans := RACH_MAX_RETRANS_7,</span><br><span style="color: hsl(120, 100%, 40%);">+            tx_integer := '1001'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                cell_barr_access := false,</span><br><span style="color: hsl(120, 100%, 40%);">+            re_not_allowed := true,</span><br><span style="color: hsl(120, 100%, 40%);">+               acc := '0000010000000000'B</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%);">+    si2bis := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+       si2ter := {</span><br><span style="color: hsl(120, 100%, 40%);">+       extd_bcch_freq_list := '8E320000000000000000000000000800'O,</span><br><span style="color: hsl(120, 100%, 40%);">+           rest_octets := ?</span><br><span style="color: hsl(120, 100%, 40%);">+  },</span><br><span style="color: hsl(120, 100%, 40%);">+    si2quater := {</span><br><span style="color: hsl(120, 100%, 40%);">+                tr_SI2quaterRestOctets_EUTRAN( repeated_neigh_cells := { tr_EUTRAN_NeighbourCells_default } )</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+    si3 := {</span><br><span style="color: hsl(120, 100%, 40%);">+          cell_id := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+         lai := {</span><br><span style="color: hsl(120, 100%, 40%);">+          mcc_mnc := '001F01'H,</span><br><span style="color: hsl(120, 100%, 40%);">+         lac := 1</span><br><span style="color: hsl(120, 100%, 40%);">+          },</span><br><span style="color: hsl(120, 100%, 40%);">+            ctrl_chan_desc := {</span><br><span style="color: hsl(120, 100%, 40%);">+               msc_r99 := true,</span><br><span style="color: hsl(120, 100%, 40%);">+              att := true,</span><br><span style="color: hsl(120, 100%, 40%);">+          bs_ag_blks_res := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+          ccch_conf := CCHAN_DESC_1CCCH_COMBINED,</span><br><span style="color: hsl(120, 100%, 40%);">+               si22ind := false,</span><br><span style="color: hsl(120, 100%, 40%);">+             cbq3 := CBQ3_IU_MODE_NOT_SUPPORTED,</span><br><span style="color: hsl(120, 100%, 40%);">+           spare := '00'B,</span><br><span style="color: hsl(120, 100%, 40%);">+               bs_pa_mfrms := 3,</span><br><span style="color: hsl(120, 100%, 40%);">+             t3212 := 30</span><br><span style="color: hsl(120, 100%, 40%);">+       },</span><br><span style="color: hsl(120, 100%, 40%);">+            cell_options := {</span><br><span style="color: hsl(120, 100%, 40%);">+         dn_ind := false,</span><br><span style="color: hsl(120, 100%, 40%);">+              pwrc := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                dtx := MS_SHALL_USE_UL_DTX,</span><br><span style="color: hsl(120, 100%, 40%);">+           radio_link_tout_div4 := 7</span><br><span style="color: hsl(120, 100%, 40%);">+         },</span><br><span style="color: hsl(120, 100%, 40%);">+            cell_sel_par := {</span><br><span style="color: hsl(120, 100%, 40%);">+         cell_resel_hyst_2dB := 2,</span><br><span style="color: hsl(120, 100%, 40%);">+             ms_txpwr_max_cch := 7,</span><br><span style="color: hsl(120, 100%, 40%);">+                acs := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+          neci := true,</span><br><span style="color: hsl(120, 100%, 40%);">+         rxlev_access_min := 0</span><br><span style="color: hsl(120, 100%, 40%);">+     },</span><br><span style="color: hsl(120, 100%, 40%);">+            rach_control := {</span><br><span style="color: hsl(120, 100%, 40%);">+         max_retrans := RACH_MAX_RETRANS_7,</span><br><span style="color: hsl(120, 100%, 40%);">+            tx_integer := '1001'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                cell_barr_access := false,</span><br><span style="color: hsl(120, 100%, 40%);">+            re_not_allowed := true,</span><br><span style="color: hsl(120, 100%, 40%);">+               acc := '0000010000000000'B</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+            rest_octets := {</span><br><span style="color: hsl(120, 100%, 40%);">+          sel_params := {</span><br><span style="color: hsl(120, 100%, 40%);">+                   presence := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+             params := omit</span><br><span style="color: hsl(120, 100%, 40%);">+            },</span><br><span style="color: hsl(120, 100%, 40%);">+            pwr_offset := {</span><br><span style="color: hsl(120, 100%, 40%);">+                   presence := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+             offset := omit</span><br><span style="color: hsl(120, 100%, 40%);">+            },</span><br><span style="color: hsl(120, 100%, 40%);">+            si_2ter_ind := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+          early_cm_ind := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+         sched_where := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  presence := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+             where := omit</span><br><span style="color: hsl(120, 100%, 40%);">+             },</span><br><span style="color: hsl(120, 100%, 40%);">+            gprs_ind := {</span><br><span style="color: hsl(120, 100%, 40%);">+             presence := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+             ind := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  ra_colour := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                       si13_pos := '0'B</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%);">+            umts_early_cm_ind := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+            si2_quater_ind := {</span><br><span style="color: hsl(120, 100%, 40%);">+               presence := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+             ind := '0'B</span><br><span style="color: hsl(120, 100%, 40%);">+               },</span><br><span style="color: hsl(120, 100%, 40%);">+            iu_mode_ind := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+          si21_ind := {</span><br><span style="color: hsl(120, 100%, 40%);">+             presence := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+             pos := 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%);">+    si4 := {</span><br><span style="color: hsl(120, 100%, 40%);">+          lai := {</span><br><span style="color: hsl(120, 100%, 40%);">+          mcc_mnc := '001F01'H,</span><br><span style="color: hsl(120, 100%, 40%);">+         lac := 1</span><br><span style="color: hsl(120, 100%, 40%);">+          },</span><br><span style="color: hsl(120, 100%, 40%);">+            cell_sel_par := {</span><br><span style="color: hsl(120, 100%, 40%);">+         cell_resel_hyst_2dB := 2,</span><br><span style="color: hsl(120, 100%, 40%);">+             ms_txpwr_max_cch := 7,</span><br><span style="color: hsl(120, 100%, 40%);">+                acs := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+          neci := true,</span><br><span style="color: hsl(120, 100%, 40%);">+         rxlev_access_min := 0</span><br><span style="color: hsl(120, 100%, 40%);">+     },</span><br><span style="color: hsl(120, 100%, 40%);">+            rach_control := {</span><br><span style="color: hsl(120, 100%, 40%);">+         max_retrans := RACH_MAX_RETRANS_7,</span><br><span style="color: hsl(120, 100%, 40%);">+            tx_integer := '1001'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                cell_barr_access := false,</span><br><span style="color: hsl(120, 100%, 40%);">+            re_not_allowed := true,</span><br><span style="color: hsl(120, 100%, 40%);">+               acc := '0000010000000000'B</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+            cbch_chan_desc := {</span><br><span style="color: hsl(120, 100%, 40%);">+               iei := '64'O,</span><br><span style="color: hsl(120, 100%, 40%);">+         v := {</span><br><span style="color: hsl(120, 100%, 40%);">+                    chan_nr := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        sdcch4 := {</span><br><span style="color: hsl(120, 100%, 40%);">+                       tag := '001'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                        sub_chan := 2</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%);">+                    tn := 0</span><br><span style="color: hsl(120, 100%, 40%);">+                   },</span><br><span style="color: hsl(120, 100%, 40%);">+                    tsc := 2,</span><br><span style="color: hsl(120, 100%, 40%);">+             h := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                   arfcn := 871,</span><br><span style="color: hsl(120, 100%, 40%);">+                 maio_hsn := 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%);">+            cbch_mobile_alloc := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+            rest_octets := {</span><br><span style="color: hsl(120, 100%, 40%);">+          sel_params := {</span><br><span style="color: hsl(120, 100%, 40%);">+                   presence := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+             params := omit</span><br><span style="color: hsl(120, 100%, 40%);">+            },</span><br><span style="color: hsl(120, 100%, 40%);">+            pwr_offset := {</span><br><span style="color: hsl(120, 100%, 40%);">+                   presence := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+             offset := omit</span><br><span style="color: hsl(120, 100%, 40%);">+            },</span><br><span style="color: hsl(120, 100%, 40%);">+            gprs_ind := {</span><br><span style="color: hsl(120, 100%, 40%);">+             presence := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+             ind := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  ra_colour := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                       si13_pos := '0'B</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%);">+            s_presence := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+           s := 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%);">+    si13 := {</span><br><span style="color: hsl(120, 100%, 40%);">+             rest_octets := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      presence := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                     bcch_change_mark := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                        si_change_field := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                   presence2 := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                    si13_change_mark := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                     gprs_ma := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                      zero := '0'B, /* PBCCH not present in cell */</span><br><span style="color: hsl(120, 100%, 40%);">+                 rac := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                     spgc_ccch_sup := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                        priority_access_thr := '110'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                        network_control_order := '00'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                       gprs_cell_opts := {</span><br><span style="color: hsl(120, 100%, 40%);">+                           nmo := '01'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                         t3168 := '011'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                              t3192 := '010'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                              drx_timer_max := '011'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                              access_burst_type := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                            control_ack_type := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                             bs_cv_max := 15,</span><br><span style="color: hsl(120, 100%, 40%);">+                              pan_presence := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                         pan_dec  := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                pan_inc  := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                pan_max  := '111'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                           ext_info_presence := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                               ext_info_length := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                         ext_info := *</span><br><span style="color: hsl(120, 100%, 40%);">+                 },</span><br><span style="color: hsl(120, 100%, 40%);">+                    gprs_pwr_ctrl_params := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             alpha := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                           t_avg_w := '10000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                          t_avg_t := '10000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                          pc_meas_chan := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                         n_avg_i := '1000'B</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%);">+    si5 := {</span><br><span style="color: hsl(120, 100%, 40%);">+          bcch_freq_list := '10000000000000000000000000000000'O</span><br><span style="color: hsl(120, 100%, 40%);">+     },</span><br><span style="color: hsl(120, 100%, 40%);">+    si5bis := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+       si5ter := {</span><br><span style="color: hsl(120, 100%, 40%);">+       extd_bcch_freq_list := '9E050020000000000000000000000000'O</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+    si6 := {</span><br><span style="color: hsl(120, 100%, 40%);">+          cell_id := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+         lai := {</span><br><span style="color: hsl(120, 100%, 40%);">+          mcc_mnc := '001F01'H,</span><br><span style="color: hsl(120, 100%, 40%);">+         lac := 1</span><br><span style="color: hsl(120, 100%, 40%);">+          },</span><br><span style="color: hsl(120, 100%, 40%);">+            cell_options := {</span><br><span style="color: hsl(120, 100%, 40%);">+         dtx_ext := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+              pwrc := false,</span><br><span style="color: hsl(120, 100%, 40%);">+                dtx := '01'B,</span><br><span style="color: hsl(120, 100%, 40%);">+         radio_link_timeout := '0111'B</span><br><span style="color: hsl(120, 100%, 40%);">+     },</span><br><span style="color: hsl(120, 100%, 40%);">+            ncc_permitted := '11111111'B,</span><br><span style="color: hsl(120, 100%, 40%);">+         rest_octets := ?</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%);">+/* List of all the System Information received on all RSL ports */</span><br><span style="color: hsl(120, 100%, 40%);">+type record of SystemInformationConfig SystemInformationConfig_list;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_sysinfo_dec_raw(inout SystemInformationConfig si, RSL_Message rsl)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   var RSL_IE_Body sysinfo_type_ie;</span><br><span style="color: hsl(120, 100%, 40%);">+      var RSL_IE_SysinfoType si_type;</span><br><span style="color: hsl(120, 100%, 40%);">+       var octetstring data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (f_rsl_find_ie(rsl, RSL_IE_SYSINFO_TYPE, sysinfo_type_ie) == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Cannot find RSL_IE_SYSINFO_TYPE");</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%);">+     si_type := sysinfo_type_ie.sysinfo_type;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (rsl.msg_type == RSL_MT_BCCH_INFO) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var RSL_IE_Body bcch_ie;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (f_rsl_find_ie(rsl, RSL_IE_FULL_BCCH_INFO, bcch_ie)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     data := bcch_ie.other.payload;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (rsl.msg_type == RSL_MT_SACCH_FILL) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var RSL_IE_Body l3_ie;</span><br><span style="color: hsl(120, 100%, 40%);">+                if (f_rsl_find_ie(rsl, RSL_IE_L3_INFO, l3_ie)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      data := l3_ie.l3_info.payload;</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%);">+              setverdict(fail, "Don't understand this System Information message");</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 boolean handled := false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rsl.msg_type == RSL_MT_BCCH_INFO) {</span><br><span style="color: hsl(120, 100%, 40%);">+               handled := true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (si_type == RSL_SYSTEM_INFO_1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (not isbound(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si1 := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+                       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si1 := dec_SystemInformation(data).payload.si1;</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (si_type == RSL_SYSTEM_INFO_2) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (not isbound(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si2 := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+                       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si2 := dec_SystemInformation(data).payload.si2;</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (si_type == RSL_SYSTEM_INFO_2bis) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (not isbound(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si2bis := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+                    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si2bis := dec_SystemInformation(data).payload.si2bis;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (si_type == RSL_SYSTEM_INFO_2ter) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (not isbound(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si2ter := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+                    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si2ter := dec_SystemInformation(data).payload.si2ter;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (si_type == RSL_SYSTEM_INFO_2quater) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (not isbound(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si2quater := {};</span><br><span style="color: hsl(120, 100%, 40%);">+                   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              var SystemInformationType2quater decoded := dec_SystemInformation(data).payload.si2quater;</span><br><span style="color: hsl(120, 100%, 40%);">+                            /* this is a *record* of SI2quaterRestOctets! (multiplexed) */</span><br><span style="color: hsl(120, 100%, 40%);">+                                si.si2quater[decoded.rest_octets.si2quater_index] := decoded.rest_octets;</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (si_type == RSL_SYSTEM_INFO_3) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (not isbound(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si3 := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+                       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si3 := dec_SystemInformation(data).payload.si3;</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (si_type == RSL_SYSTEM_INFO_4) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (not isbound(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si4 := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+                       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si4 := dec_SystemInformation(data).payload.si4;</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (si_type == RSL_SYSTEM_INFO_13) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (not isbound(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si13 := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+                      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si13 := dec_SystemInformation(data).payload.si13;</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%);">+                      handled := false;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if (rsl.msg_type == RSL_MT_SACCH_FILL) {</span><br><span style="color: hsl(120, 100%, 40%);">+               handled := true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (si_type == RSL_SYSTEM_INFO_5) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (not isbound(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si5 := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+                       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si5 := dec_SystemInformation(data).payload.si5;</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (si_type == RSL_SYSTEM_INFO_5bis) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (not isbound(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si5bis := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+                    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si5bis := dec_SystemInformation(data).payload.si5bis;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (si_type == RSL_SYSTEM_INFO_5ter) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (not isbound(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si5ter := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+                    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si5ter := dec_SystemInformation(data).payload.si5ter;</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             } else if (si_type == RSL_SYSTEM_INFO_6) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (not isbound(data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si6 := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+                       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              si.si6 := dec_SystemInformation(data).payload.si6;</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%);">+                      handled := false;</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%);">+   if (not handled) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Unexpected SI type in ", rsl.msg_type, " message: ", si_type);</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%);">+type component test_CT extends CTRL_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Array of per-BTS state */</span><br><span style="color: hsl(120, 100%, 40%);">+  var BTS_State bts[NUM_BTS];</span><br><span style="color: hsl(120, 100%, 40%);">+   /* RSL common Channel Port (for RSL_Emulation) */</span><br><span style="color: hsl(120, 100%, 40%);">+     port RSL_CCHAN_PT RSL_CCHAN[NUM_BTS];</span><br><span style="color: hsl(120, 100%, 40%);">+ /* array of per-BTS RSL test ports */</span><br><span style="color: hsl(120, 100%, 40%);">+ port IPA_RSL_PT IPA_RSL[NUM_BTS];</span><br><span style="color: hsl(120, 100%, 40%);">+     port IPA_CODEC_PT IPA; /* Required for compilation of TC_rsl_unknown_unit_id() */</span><br><span style="color: hsl(120, 100%, 40%);">+     /* CTRL muxed over IPA in SCCPlite conn BSC<->MSC (or BSC-NAT) */</span><br><span style="color: hsl(120, 100%, 40%);">+       port IPA_CTRL_PT SCCPLITE_IPA_CTRL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var MGCP_Emulation_CT vc_MGCP;</span><br><span style="color: hsl(120, 100%, 40%);">+        port TELNETasp_PT BSCVTY;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* StatsD */</span><br><span style="color: hsl(120, 100%, 40%);">+  var StatsD_Checker_CT vc_STATSD;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var RAN_Adapter g_bssap[NUM_MSC];</span><br><span style="color: hsl(120, 100%, 40%);">+     var BSSAP_LE_Adapter g_bssap_le;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* for old legacy-tests only */</span><br><span style="color: hsl(120, 100%, 40%);">+       port BSSAP_CODEC_PT BSSAP;</span><br><span style="color: hsl(120, 100%, 40%);">+    port BSSAP_LE_CODEC_PT BSSAP_LE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* are we initialized yet */</span><br><span style="color: hsl(120, 100%, 40%);">+  var boolean g_initialized := false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Osmux is enabled through VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+    var boolean g_osmux_enabled := false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /*Configure T(tias) over VTY, seconds */</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer g_bsc_sccp_timer_ias :=  7 * 60;</span><br><span style="color: hsl(120, 100%, 40%);">+  /*Configure T(tiar) over VTY, seconds */</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer g_bsc_sccp_timer_iar := 15 * 60;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* global test case guard timer (actual timeout value is set in f_init()) */</span><br><span style="color: hsl(120, 100%, 40%);">+  timer T_guard := 30.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var CounterNameValsList g_ctr_msc;</span><br><span style="color: hsl(120, 100%, 40%);">+    var CounterNameValsList g_ctr_bsc;</span><br><span style="color: hsl(120, 100%, 40%);">+    var CounterNameValsList g_ctr_bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* System Information bytes as received during RSL startup, for each RSL[idx]. */</span><br><span style="color: hsl(120, 100%, 40%);">+     var SystemInformationConfig_list g_system_information := {};</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%);">+modulepar {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* IP address at which the BSC can be reached */</span><br><span style="color: hsl(120, 100%, 40%);">+      charstring mp_bsc_ip := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+        /* port number to which to establish the IPA OML connections */</span><br><span style="color: hsl(120, 100%, 40%);">+       integer mp_bsc_oml_port := 3002;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* port number to which to establish the IPA RSL connections */</span><br><span style="color: hsl(120, 100%, 40%);">+       integer mp_bsc_rsl_port := 3003;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* port number to which to establish the IPA CTRL connection */</span><br><span style="color: hsl(120, 100%, 40%);">+       integer mp_bsc_ctrl_port := 4249;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* port number to which to listen for STATSD metrics */</span><br><span style="color: hsl(120, 100%, 40%);">+       integer mp_bsc_statsd_port := 8125;</span><br><span style="color: hsl(120, 100%, 40%);">+   /* IP address at which the test binds */</span><br><span style="color: hsl(120, 100%, 40%);">+      charstring mp_test_ip := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     RAN_Configurations mp_bssap_cfg := {</span><br><span style="color: hsl(120, 100%, 40%);">+          {</span><br><span style="color: hsl(120, 100%, 40%);">+                     transport := BSSAP_TRANSPORT_AoIP,</span><br><span style="color: hsl(120, 100%, 40%);">+                    sccp_service_type := "mtp3_itu",</span><br><span style="color: hsl(120, 100%, 40%);">+                    sctp_addr := { 23905, "127.0.0.1", 2905, "127.0.0.1" },</span><br><span style="color: hsl(120, 100%, 40%);">+                   own_pc := 185,  /* 0.23.1 first MSC emulation */</span><br><span style="color: hsl(120, 100%, 40%);">+                      own_ssn := 254,</span><br><span style="color: hsl(120, 100%, 40%);">+                       peer_pc := 187, /* 0.23.3 osmo-bsc */</span><br><span style="color: hsl(120, 100%, 40%);">+                 peer_ssn := 254,</span><br><span style="color: hsl(120, 100%, 40%);">+                      sio := '83'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                 rctx := 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%);">+                     transport := BSSAP_TRANSPORT_AoIP,</span><br><span style="color: hsl(120, 100%, 40%);">+                    sccp_service_type := "mtp3_itu",</span><br><span style="color: hsl(120, 100%, 40%);">+                    sctp_addr := { 23906, "127.0.0.1", 2905, "127.0.0.1" },</span><br><span style="color: hsl(120, 100%, 40%);">+                   own_pc := 2,    /* 0.0.2 second MSC emulation */</span><br><span style="color: hsl(120, 100%, 40%);">+                      own_ssn := 254,</span><br><span style="color: hsl(120, 100%, 40%);">+                       peer_pc := 187, /* 0.23.3 osmo-bsc */</span><br><span style="color: hsl(120, 100%, 40%);">+                 peer_ssn := 254,</span><br><span style="color: hsl(120, 100%, 40%);">+                      sio := '83'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                 rctx := 2</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%);">+                     transport := BSSAP_TRANSPORT_AoIP,</span><br><span style="color: hsl(120, 100%, 40%);">+                    sccp_service_type := "mtp3_itu",</span><br><span style="color: hsl(120, 100%, 40%);">+                    sctp_addr := { 23907, "127.0.0.1", 2905, "127.0.0.1" },</span><br><span style="color: hsl(120, 100%, 40%);">+                   own_pc := 3,    /* 0.0.3 third MSC emulation */</span><br><span style="color: hsl(120, 100%, 40%);">+                       own_ssn := 254,</span><br><span style="color: hsl(120, 100%, 40%);">+                       peer_pc := 187, /* 0.23.3 osmo-bsc */</span><br><span style="color: hsl(120, 100%, 40%);">+                 peer_ssn := 254,</span><br><span style="color: hsl(120, 100%, 40%);">+                      sio := '83'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                 rctx := 3</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%);">+  BSSAP_LE_Configuration mp_bssap_le_cfg := {</span><br><span style="color: hsl(120, 100%, 40%);">+           sccp_service_type := "mtp3_itu",</span><br><span style="color: hsl(120, 100%, 40%);">+            sctp_addr := { 23908, "127.0.0.1", 2905, "127.0.0.1" },</span><br><span style="color: hsl(120, 100%, 40%);">+           own_pc := 190,  /* 0.23.6 SMLC emulation */</span><br><span style="color: hsl(120, 100%, 40%);">+           own_ssn := 252, /* SMLC side SSN */</span><br><span style="color: hsl(120, 100%, 40%);">+           peer_pc := 187, /* 0.23.3 osmo-bsc */</span><br><span style="color: hsl(120, 100%, 40%);">+         peer_ssn := 250, /* BSC side SSN */</span><br><span style="color: hsl(120, 100%, 40%);">+           sio := '83'O,</span><br><span style="color: hsl(120, 100%, 40%);">+         rctx := 6</span><br><span style="color: hsl(120, 100%, 40%);">+     };</span><br><span style="color: hsl(120, 100%, 40%);">+    boolean mp_enable_lcs_tests := true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Whether to enable osmux tests. Can be dropped completely and enable</span><br><span style="color: hsl(120, 100%, 40%);">+           unconditionally once new version of osmo-bsc is released (current</span><br><span style="color: hsl(120, 100%, 40%);">+     version: 1.4.1) */</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean mp_enable_osmux_test := true;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Value set in osmo-bsc.cfg "ms max power" */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t mp_exp_ms_power_level := 7;</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_shutdown_helper() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      all component.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+   setverdict(pass);</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%);">+private function f_legacy_bssap_reset(integer bssap_idx := 0) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var BSSAP_N_UNITDATA_ind ud_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+      var boolean reset_received := false;</span><br><span style="color: hsl(120, 100%, 40%);">+  timer T := 5.0;</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP.send(ts_BSSAP_UNITDATA_req(g_bssap[bssap_idx].sccp_addr_peer, g_bssap[bssap_idx].sccp_addr_own,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  ts_BSSMAP_Reset(0, g_osmux_enabled)));</span><br><span style="color: hsl(120, 100%, 40%);">+       T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(g_bssap[bssap_idx].sccp_addr_own, g_bssap[bssap_idx].sccp_addr_peer,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          tr_BSSMAP_ResetAck(g_osmux_enabled))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                log("BSSMAP: Received RESET-ACK in response to RESET, we're ready to go!");</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset(g_osmux_enabled))) -> value ud_ind {</span><br><span style="color: hsl(120, 100%, 40%);">+          log("BSSMAP: Respoding to inbound RESET with RESET-ACK");</span><br><span style="color: hsl(120, 100%, 40%);">+           BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,</span><br><span style="color: hsl(120, 100%, 40%);">+                    ts_BSSMAP_ResetAck(g_osmux_enabled)));</span><br><span style="color: hsl(120, 100%, 40%);">+             reset_received := true;</span><br><span style="color: hsl(120, 100%, 40%);">+               repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] BSSAP.receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+  [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                        log("BSSMAP: Timeout waiting for RESET-ACK after sending RESET");</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* If we received a RESET after ours was sent, it</span><br><span style="color: hsl(120, 100%, 40%);">+                        may be a race condition where the other peer beacame</span><br><span style="color: hsl(120, 100%, 40%);">+                          available after we sent it, but we are in a desired</span><br><span style="color: hsl(120, 100%, 40%);">+                           state anyway, so go forward. */</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (not reset_received) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             setverdict(fail);</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%);">+type record IPA_Client {</span><br><span style="color: hsl(120, 100%, 40%);">+      /* IPA Emulation component reference */</span><br><span style="color: hsl(120, 100%, 40%);">+       IPA_Emulation_CT vc_IPA,</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Unit-ID and other CCM parameters to use for IPA client emulation */</span><br><span style="color: hsl(120, 100%, 40%);">+        IPA_CCM_Parameters ccm_pars,</span><br><span style="color: hsl(120, 100%, 40%);">+  /* String identifier for this IPA Client */</span><br><span style="color: hsl(120, 100%, 40%);">+   charstring id,</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Associated RSL Emulation Component (if any). Only used in "Handler mode" */</span><br><span style="color: hsl(120, 100%, 40%);">+      RSL_Emulation_CT vc_RSL optional</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%);">+/*! Start the IPA/RSL related bits for one IPA_Client.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param clnt IPA_Client for which to establish</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param bsc_host IP address / hostname of the BSC</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param bsc_port TCP port number of the BSC</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param i number identifying this BTS</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param handler_mode Start an RSL_Emulation_CT component (true) or not (false) */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ipa_rsl_start(inout IPA_Client clnt, charstring bsc_host, PortNumber bsc_port, integer i,</span><br><span style="color: hsl(120, 100%, 40%);">+                   boolean handler_mode := false)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    timer T := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    clnt.id := "IPA" & int2str(i) & "-RSL";</span><br><span style="color: hsl(120, 100%, 40%);">+   clnt.vc_IPA := IPA_Emulation_CT.create(clnt.id & "-IPA");</span><br><span style="color: hsl(120, 100%, 40%);">+       clnt.ccm_pars := c_IPA_default_ccm_pars;</span><br><span style="color: hsl(120, 100%, 40%);">+      clnt.ccm_pars.name := "Osmocom TTCN-3 BTS Simulator";</span><br><span style="color: hsl(120, 100%, 40%);">+       clnt.ccm_pars.unit_id := int2str(1234+i) & "/0/0";</span><br><span style="color: hsl(120, 100%, 40%);">+      if (handler_mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+           clnt.vc_RSL := RSL_Emulation_CT.create(clnt.id & "-RSL");</span><br><span style="color: hsl(120, 100%, 40%);">+               connect(clnt.vc_RSL:CCHAN_PT, self:RSL_CCHAN[i]);</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%);">+   map(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (handler_mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+           connect(clnt.vc_IPA:IPA_RSL_PORT, clnt.vc_RSL:IPA_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+        } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              connect(clnt.vc_IPA:IPA_RSL_PORT, self:IPA_RSL[i]);</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%);">+   clnt.vc_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", 10000+i, clnt.ccm_pars));</span><br><span style="color: hsl(120, 100%, 40%);">+       if (handler_mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+           clnt.vc_RSL.start(RSL_Emulation.main());</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</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%);">+   /* wait for IPA RSL link to connect and send ID ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+        T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] IPA_RSL[i].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_ID_ACK)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          T.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+               IPA_RSL[i].send(ts_ASP_RSL_UD(ts_RSL_PAGING_LOAD_IND(23)));</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] IPA_RSL[i].receive(ASP_IPA_Event:?) { repeat }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] IPA_RSL[i].receive { repeat }</span><br><span style="color: hsl(120, 100%, 40%);">+      [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout RSL waiting for ASP_IPA_EVENT_ID_ACK");</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ipa_rsl_stop(inout IPA_Client clnt) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      if (not isbound(clnt) or not isbound(clnt.vc_IPA)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     clnt.vc_IPA.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     if (isbound(clnt.vc_RSL)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           clnt.vc_RSL.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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Wait for the OML connection to be brought up by the external osmo-bts-omldummy */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_wait_oml(integer bts_nr, charstring status, float secs_max) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        timer T := secs_max;</span><br><span style="color: hsl(120, 100%, 40%);">+  T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      while (true) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (f_ctrl_get_bts(IPA_CTRL, bts_nr, "oml-connection-state") == status) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   T.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* the 'degraded' state exists from OML connection time, and we have to wait</span><br><span style="color: hsl(120, 100%, 40%);">+                   * until all MO's are initialized */</span><br><span style="color: hsl(120, 100%, 40%);">+                      T.start(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+                 T.timeout;</span><br><span style="color: hsl(120, 100%, 40%);">+                    return;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             f_sleep(0.1);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (not T.running) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  setverdict(fail, "Timeout waiting for BTS" & int2str(bts_nr) & " oml-connection-state ", status);</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* global altstep for global guard timer; also takes care of responding RESET witH RESET-ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+altstep as_Tguard() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var BSSAP_N_UNITDATA_ind ud_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+      [] T_guard.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                  setverdict(fail, "Timeout of T_guard");</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%);">+     /* always respond with RESET ACK to RESET */</span><br><span style="color: hsl(120, 100%, 40%);">+  [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset(g_osmux_enabled))) -> value ud_ind {</span><br><span style="color: hsl(120, 100%, 40%);">+          BSSAP.send(ts_BSSAP_UNITDATA_req(ud_ind.callingAddress, ud_ind.calledAddress,</span><br><span style="color: hsl(120, 100%, 40%);">+                    ts_BSSMAP_ResetAck(g_osmux_enabled)));</span><br><span style="color: hsl(120, 100%, 40%);">+             repeat;</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%);">+altstep no_bssmap_reset() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   [] BSSAP.receive(tr_BSSAP_UNITDATA_ind(?, ?, tr_BSSMAP_Reset(g_osmux_enabled))) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "unexpected BSSMAP Reset");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_init_mgcp(charstring id) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ id := id & "-MGCP";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var MGCPOps ops := {</span><br><span style="color: hsl(120, 100%, 40%);">+          create_cb := refers(MGCP_Emulation.ExpectedCreateCallback),</span><br><span style="color: hsl(120, 100%, 40%);">+           unitdata_cb := refers(MGCP_Emulation.DummyUnitdataCallback)</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span style="color: hsl(120, 100%, 40%);">+    var MGCP_conn_parameters mgcp_pars := {</span><br><span style="color: hsl(120, 100%, 40%);">+               callagent_ip := mp_bsc_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+            callagent_udp_port := -1,</span><br><span style="color: hsl(120, 100%, 40%);">+             mgw_ip := mp_test_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+         mgw_udp_port := 2427,</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Enable it for SCCPlite, since we have 2 MGCP sockets towards MGW (UDP one +</span><br><span style="color: hsl(120, 100%, 40%);">+                   the on  with MGCP over IPA forwarded from MSC one) */</span><br><span style="color: hsl(120, 100%, 40%);">+              multi_conn_mode := (mp_bssap_cfg[0].transport == BSSAP_TRANSPORT_SCCPlite_SERVER)</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%);">+  vc_MGCP := MGCP_Emulation_CT.create(id);</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_MGCP.start(MGCP_Emulation.main(ops, mgcp_pars, id));</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%);">+/* Enable or disable (current default) Osmux. When enabling, BSSMAP Reset</span><br><span style="color: hsl(120, 100%, 40%);">+ * contains extra IE (OsmuxSupport) and osmo-bsc will handle AssignReq with</span><br><span style="color: hsl(120, 100%, 40%);">+ * OsmuxCID IE.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_vty_allow_osmux(boolean allow) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_enter_cfg_msc(BSCVTY, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (allow) {</span><br><span style="color: hsl(120, 100%, 40%);">+          f_vty_transceive(BSCVTY, "osmux on");</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_vty_transceive(BSCVTY, "osmux off");</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_transceive(BSCVTY, "exit");</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_transceive(BSCVTY, "exit");</span><br><span style="color: hsl(120, 100%, 40%);">+   g_osmux_enabled := allow;</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%);">+type record of charstring Commands;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_cs7_inst_0_cfg(TELNETasp_PT pt, Commands cmds := {})</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_enter_cfg_cs7_inst(pt, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+      for (var integer i := 0; i < sizeof(cmds); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             f_vty_transceive(pt, cmds[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_transceive(pt, "end");</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%);">+function f_init_vty(charstring id := "foo") runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  if (BSCVTY.checkstate("Mapped")) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* skip initialization if already executed once */</span><br><span style="color: hsl(120, 100%, 40%);">+            return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     map(self:BSCVTY, system:BSCVTY);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_set_prompts(BSCVTY);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_vty_transceive(BSCVTY, "enable");</span><br><span style="color: hsl(120, 100%, 40%);">+ f_cs7_inst_0_cfg(BSCVTY, {"sccp-timer ias " & int2str(g_bsc_sccp_timer_ias),</span><br><span style="color: hsl(120, 100%, 40%);">+                      "sccp-timer iar " & int2str(g_bsc_sccp_timer_iar)});</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_logp(TELNETasp_PT pt, charstring log_msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    // log on TTCN3 log output</span><br><span style="color: hsl(120, 100%, 40%);">+    log(log_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ // log in stderr log</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_transceive(pt, "logp lglobal notice TTCN3 f_logp(): " & log_msg);</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_sysinfo_seen(integer rsl_idx, RSL_Message rsl) runs on test_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      if (rsl_idx >= lengthof(g_system_information)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           g_system_information[rsl_idx] := SystemInformationConfig_omit</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sysinfo_dec_raw(g_system_information[rsl_idx], rsl);</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%);">+altstep as_catch_RSL_sysinfo(integer rsl_idx) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var ASP_RSL_Unitdata rx_rsl_ud;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* For handler_mode := false, receiving the RSL bootstrap messages directly on IPA_RSL */</span><br><span style="color: hsl(120, 100%, 40%);">+     [] IPA_RSL[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_NO_BCCH_INFO)) -> value rx_rsl_ud {</span><br><span style="color: hsl(120, 100%, 40%);">+               f_sysinfo_seen(rsl_idx, rx_rsl_ud.rsl);</span><br><span style="color: hsl(120, 100%, 40%);">+               repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] IPA_RSL[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_BCCH_INFO)) -> value rx_rsl_ud {</span><br><span style="color: hsl(120, 100%, 40%);">+          f_sysinfo_seen(rsl_idx, rx_rsl_ud.rsl);</span><br><span style="color: hsl(120, 100%, 40%);">+               repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] IPA_RSL[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_NO_SACCH_FILL)) -> value rx_rsl_ud {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_sysinfo_seen(rsl_idx, rx_rsl_ud.rsl);</span><br><span style="color: hsl(120, 100%, 40%);">+               repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] IPA_RSL[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_SACCH_FILL)) -> value rx_rsl_ud {</span><br><span style="color: hsl(120, 100%, 40%);">+         f_sysinfo_seen(rsl_idx, rx_rsl_ud.rsl);</span><br><span style="color: hsl(120, 100%, 40%);">+               repeat;</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%);">+   /* For handler_mode := true, receiving the RSL bootstrap messages via RSL_Emulation  */</span><br><span style="color: hsl(120, 100%, 40%);">+       [] RSL_CCHAN[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_NO_BCCH_INFO)) -> value rx_rsl_ud {</span><br><span style="color: hsl(120, 100%, 40%);">+             f_sysinfo_seen(rsl_idx, rx_rsl_ud.rsl);</span><br><span style="color: hsl(120, 100%, 40%);">+               repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL_CCHAN[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_BCCH_INFO)) -> value rx_rsl_ud {</span><br><span style="color: hsl(120, 100%, 40%);">+                f_sysinfo_seen(rsl_idx, rx_rsl_ud.rsl);</span><br><span style="color: hsl(120, 100%, 40%);">+               repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL_CCHAN[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_NO_SACCH_FILL)) -> value rx_rsl_ud {</span><br><span style="color: hsl(120, 100%, 40%);">+            f_sysinfo_seen(rsl_idx, rx_rsl_ud.rsl);</span><br><span style="color: hsl(120, 100%, 40%);">+               repeat;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] RSL_CCHAN[rsl_idx].receive(tr_ASP_RSL_UD(tr_RSL_SACCH_FILL)) -> value rx_rsl_ud {</span><br><span style="color: hsl(120, 100%, 40%);">+               f_sysinfo_seen(rsl_idx, rx_rsl_ud.rsl);</span><br><span style="color: hsl(120, 100%, 40%);">+               repeat;</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%);">+/* TODO: use BooleanList from COMMON/src/General_Types.ttcn */</span><br><span style="color: hsl(120, 100%, 40%);">+private type record of boolean my_BooleanList;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_vty_msc_allow_attach(TELNETasp_PT pt, my_BooleanList allow_attach_list)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       var charstring config := f_vty_transceive_ret(pt, "show running-config");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (var integer msc_nr := 0; msc_nr < sizeof(allow_attach_list); msc_nr := msc_nr+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (f_strstr(config, "\nmsc " & int2str(msc_nr) & "\n") < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* There is no 'msc N' for this msc_nr in the running config, so don't create an empty msc by</span><br><span style="color: hsl(120, 100%, 40%);">+                      * stepping into that config node. */</span><br><span style="color: hsl(120, 100%, 40%);">+                 log("msc ", msc_nr, " is not configured, skipping");</span><br><span style="color: hsl(120, 100%, 40%);">+                      continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             f_vty_enter_cfg_msc(pt, msc_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (allow_attach_list[msc_nr]) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* strict := false: ignore if osmo-bsc does not support this config option (latest build) */</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_vty_transceive(pt, "allow-attach", strict := false);</span><br><span style="color: hsl(120, 100%, 40%);">+              } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      f_vty_transceive(pt, "no allow-attach", strict := false);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+             f_vty_transceive(pt, "exit");</span><br><span style="color: hsl(120, 100%, 40%);">+               f_vty_transceive(pt, "exit");</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%);">+/* global initialization function</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param nr_bts Number of BTSs we should start/bring up</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param handler_mode Start an RSL_Emulation_CT component (true) or not (false).</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param nr_msc Number of virtual MSCs to bring up to connect to osmo-bsc.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_init(integer nr_bts := NUM_BTS, boolean handler_mode := false, boolean allow_osmux := false,</span><br><span style="color: hsl(120, 100%, 40%);">+             integer nr_msc := 1, float guard_timeout := 30.0) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer bssap_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (g_initialized) {</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     g_initialized := true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      T_guard.start(guard_timeout);</span><br><span style="color: hsl(120, 100%, 40%);">+ activate(as_Tguard());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_vty("VirtMSC");</span><br><span style="color: hsl(120, 100%, 40%);">+      if (mp_enable_osmux_test) {</span><br><span style="color: hsl(120, 100%, 40%);">+           f_vty_allow_osmux(allow_osmux);</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 my_BooleanList allow_attach := { false, false, false };</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init_statsd("VirtMSC", vc_STATSD, mp_test_ip, mp_bsc_statsd_port);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (bssap_idx := 0; bssap_idx < nr_msc; bssap_idx := bssap_idx+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               allow_attach[bssap_idx] := true;</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Call a function of our 'parent component' RAN_Adapter_CT to start the</span><br><span style="color: hsl(120, 100%, 40%);">+               * MSC-side BSSAP emulation */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (handler_mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   var RanOps ranops := MSC_RanOps;</span><br><span style="color: hsl(120, 100%, 40%);">+                      ranops.use_osmux := g_osmux_enabled;</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_ran_adapter_init(g_bssap[bssap_idx], mp_bssap_cfg[bssap_idx], "VirtMSC", ranops);</span><br><span style="color: hsl(120, 100%, 40%);">+                 connect(self:SCCPLITE_IPA_CTRL, g_bssap[bssap_idx].vc_RAN:CTRL_CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+                       f_ran_adapter_start(g_bssap[bssap_idx]);</span><br><span style="color: hsl(120, 100%, 40%);">+              } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      f_ran_adapter_init(g_bssap[bssap_idx], mp_bssap_cfg[bssap_idx], "VirtMSC", omit);</span><br><span style="color: hsl(120, 100%, 40%);">+                   connect(self:BSSAP, g_bssap[bssap_idx].vc_SCCP:SCCP_SP_PORT);</span><br><span style="color: hsl(120, 100%, 40%);">+                 f_ran_adapter_start(g_bssap[bssap_idx]);</span><br><span style="color: hsl(120, 100%, 40%);">+                      f_legacy_bssap_reset();</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%);">+   if (mp_enable_lcs_tests) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (handler_mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   f_bssap_le_adapter_init(g_bssap_le, mp_bssap_le_cfg, "VirtSMLC", SMLC_BssapLeOps);</span><br><span style="color: hsl(120, 100%, 40%);">+          } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      f_bssap_le_adapter_init(g_bssap_le, mp_bssap_le_cfg, "VirtSMLC", omit);</span><br><span style="color: hsl(120, 100%, 40%);">+                     connect(self:BSSAP_LE, g_bssap_le.vc_SCCP:SCCP_SP_PORT);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             f_bssap_le_adapter_start(g_bssap_le);</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%);">+   /* start the test with exactly all enabled MSCs allowed to attach */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_msc_allow_attach(BSCVTY, allow_attach);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_ipa_ctrl_start_client(mp_bsc_ip, mp_bsc_ctrl_port);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init_mgcp("VirtMSC");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < nr_bts; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           f_init_bts(i, handler_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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_init_bts(integer bts_idx := 0, boolean handler_mode := false)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   /* wait until osmo-bts-omldummy has respawned */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_wait_oml(bts_idx, "degraded", 5.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* start RSL connection */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ipa_rsl_start(bts[bts_idx].rsl, mp_bsc_ip, mp_bsc_rsl_port, bts_idx, handler_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* wait until BSC tells us "connected" */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_wait_oml(bts_idx, "connected", 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%);">+/* expect to receive a RSL message matching a specified template on a given BTS / stream */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_exp_ipa_rx(integer bts_nr, template (present) RSL_Message t_rx, float t_secs := 2.0, IpaStreamId sid := IPAC_PROTO_RSL_TRX0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT return RSL_Message {</span><br><span style="color: hsl(120, 100%, 40%);">+     var ASP_RSL_Unitdata rx_rsl_ud;</span><br><span style="color: hsl(120, 100%, 40%);">+       timer T := t_secs;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(t_rx, sid)) -> value rx_rsl_ud {</span><br><span style="color: hsl(120, 100%, 40%);">+          T.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] IPA_RSL[bts_nr].receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+        [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout expecting ", t_rx);</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 rx_rsl_ud.rsl;</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%);">+/* transmit RSL on a given BTS/stream */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ipa_tx(integer bts_nr, template (value) RSL_Message t_tx, IpaStreamId sid := IPAC_PROTO_RSL_TRX0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ IPA_RSL[bts_nr].send(ts_ASP_RSL_UD(t_tx, sid));</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_gen_test_hdlr_pars(integer bssap_idx := 0) return TestHdlrParams {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var TestHdlrParams pars := valueof(t_def_TestHdlrPars);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (mp_bssap_cfg[bssap_idx].transport == BSSAP_TRANSPORT_AoIP) {</span><br><span style="color: hsl(120, 100%, 40%);">+              pars.aoip := true;</span><br><span style="color: hsl(120, 100%, 40%);">+    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              pars.aoip := false;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     pars.exp_ms_power_level := mp_exp_ms_power_level;</span><br><span style="color: hsl(120, 100%, 40%);">+     pars.mscpool.bssap_idx := bssap_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return pars;</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%);">+type function void_fn(charstring id) runs on MSC_ConnHdlr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* create and connect a MSC_ConnHdlr component */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_connect_handler(inout MSC_ConnHdlr vc_conn, integer bssap_idx := 0) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  connect(vc_conn:RAN, g_bssap[bssap_idx].vc_RAN:PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(vc_conn:MGCP_PROC, vc_MGCP:MGCP_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+        connect(vc_conn:RSL, bts[0].rsl.vc_RSL:CLIENT_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+    connect(vc_conn:RSL_PROC, bts[0].rsl.vc_RSL:RSL_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (isvalue(bts[1])) {</span><br><span style="color: hsl(120, 100%, 40%);">+                connect(vc_conn:RSL1, bts[1].rsl.vc_RSL:CLIENT_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+           connect(vc_conn:RSL1_PROC, bts[1].rsl.vc_RSL:RSL_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (isvalue(bts[2])) {</span><br><span style="color: hsl(120, 100%, 40%);">+                connect(vc_conn:RSL2, bts[2].rsl.vc_RSL:CLIENT_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+           connect(vc_conn:RSL2_PROC, bts[2].rsl.vc_RSL:RSL_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     connect(vc_conn:BSSAP, g_bssap[bssap_idx].vc_RAN:CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (mp_enable_lcs_tests) {</span><br><span style="color: hsl(120, 100%, 40%);">+            connect(vc_conn:BSSAP_LE, g_bssap_le.vc_BSSAP_LE:CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+             connect(vc_conn:BSSAP_LE_PROC, g_bssap_le.vc_BSSAP_LE:PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+   connect(vc_conn:MGCP_MULTI, vc_MGCP:MGCP_CLIENT_MULTI);</span><br><span style="color: hsl(120, 100%, 40%);">+       connect(vc_conn:STATSD_PROC, vc_STATSD:STATSD_PROC);</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 function inside ConnHdlr component; sets g_pars + starts function */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_handler_init(void_fn fn, charstring id, template (omit) TestHdlrParams pars := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (isvalue(pars)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          g_pars := valueof(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     fn.apply(id);</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%);">+function f_start_handler(void_fn fn, template (omit) TestHdlrParams pars := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT return MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  var charstring id := testcasename();</span><br><span style="color: hsl(120, 100%, 40%);">+  var MSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     var integer bssap_idx := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (isvalue(pars)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          bssap_idx := valueof(pars).mscpool.bssap_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := MSC_ConnHdlr.create(id);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_connect_handler(vc_conn, bssap_idx);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Emit a marker to appear in the SUT's own logging output */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_logp(BSCVTY, testcasename() & "() start");</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn.start(f_handler_init(fn, id, pars));</span><br><span style="color: hsl(120, 100%, 40%);">+  return vc_conn;</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%);">+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_vty_transceive(BSCVTY, "show lchan summary");</span><br><span style="color: hsl(120, 100%, 40%);">+     var charstring lchan_info := f_vty_transceive_ret(BSCVTY, "show lchan 0 0 1 0");</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 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%);">+</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%);">+/* generate an assignment request for either AoIP or SCCPlite */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_gen_ass_req(boolean osmux_enabled := false, integer bssap_idx := 0, charstring aoip_tla := "1.2.3.4") return PDU_BSSAP {</span><br><span style="color: hsl(120, 100%, 40%);">+    var PDU_BSSAP ass_cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+        var BSSMAP_IE_Osmo_OsmuxCID osmux_cid := valueof(ts_OsmuxCID(0));</span><br><span style="color: hsl(120, 100%, 40%);">+     if (mp_bssap_cfg[bssap_idx].transport == BSSAP_TRANSPORT_AoIP) {</span><br><span style="color: hsl(120, 100%, 40%);">+              var BSSMAP_IE_AoIP_TransportLayerAddress tla :=</span><br><span style="color: hsl(120, 100%, 40%);">+                       valueof(f_ts_BSSMAP_IE_AoIP_TLA(aoip_tla, 2342));</span><br><span style="color: hsl(120, 100%, 40%);">+             if (osmux_enabled) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla, osmux_cid));</span><br><span style="color: hsl(120, 100%, 40%);">+            } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));</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%);">+              var BSSMAP_IE_CircuitIdentityCode cic := valueof(ts_BSSMAP_IE_CIC(0,1));</span><br><span style="color: hsl(120, 100%, 40%);">+              ass_cmd := valueof(ts_BSSMAP_AssignmentReq(cic, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     return ass_cmd;</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%);">+/* generate an assignment complete template for either AoIP or SCCPlite */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_gen_exp_compl(boolean expect_osmux := false, integer bssap_idx := 0) return template PDU_BSSAP {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template PDU_BSSAP exp_compl;</span><br><span style="color: hsl(120, 100%, 40%);">+     var BSSMAP_IE_Osmo_OsmuxCID osmux_cid := valueof(ts_OsmuxCID(0));</span><br><span style="color: hsl(120, 100%, 40%);">+     if (mp_bssap_cfg[bssap_idx].transport == BSSAP_TRANSPORT_AoIP) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (expect_osmux) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?, osmux_cid);</span><br><span style="color: hsl(120, 100%, 40%);">+                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?, omit);</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%);">+              /* CIC is optional "*" as the MSC allocated it */</span><br><span style="color: hsl(120, 100%, 40%);">+           exp_compl := tr_BSSMAP_AssignmentComplete(*, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     return exp_compl;</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%);">+/* determine BSSMAP_IE_ChannelType from *first* element of BSSMAP_FIELD_CodecElement */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_BSSMAP_chtype_from_codec(BSSMAP_FIELD_CodecElement a_elem)</span><br><span style="color: hsl(120, 100%, 40%);">+return BSSMAP_IE_ChannelType {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME: actually look at all elements of BSSMAP_IE_SpeechCodecList */</span><br><span style="color: hsl(120, 100%, 40%);">+       var BSSMAP_IE_ChannelType ret := valueof(ts_BSSMAP_IE_ChannelType);</span><br><span style="color: hsl(120, 100%, 40%);">+   select (a_elem.codecType) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case (GSM_FR) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ret.channelRateAndType := ChRate_TCHF;</span><br><span style="color: hsl(120, 100%, 40%);">+                ret.speechId_DataIndicator := Spdi_TCHF_FR;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     case (GSM_HR) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ret.channelRateAndType := ChRate_TCHH;</span><br><span style="color: hsl(120, 100%, 40%);">+                ret.speechId_DataIndicator := Spdi_TCHH_HR;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     case (GSM_EFR) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ret.channelRateAndType := ChRate_TCHF;</span><br><span style="color: hsl(120, 100%, 40%);">+                ret.speechId_DataIndicator := Spdi_TCHF_EFR;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     case (FR_AMR) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ret.channelRateAndType := ChRate_TCHF;</span><br><span style="color: hsl(120, 100%, 40%);">+                ret.speechId_DataIndicator := Spdi_TCHF_AMR;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     case (HR_AMR) {</span><br><span style="color: hsl(120, 100%, 40%);">+               ret.channelRateAndType := ChRate_TCHH;</span><br><span style="color: hsl(120, 100%, 40%);">+                ret.speechId_DataIndicator := Spdi_TCHH_AMR;</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 codec ", a_elem);</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 ret;</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%);">+      /* Expecting TCH/F in timeslot 1 to be active. Let's make sure. */</span><br><span style="color: hsl(120, 100%, 40%);">+        var charstring lchan_info := f_vty_transceive_ret(BSCVTY, "show lchan 0 0 1 0");</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 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_transceive(BSCVTY, "vamos modify lchan 0 0 1 0 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%);">+        log("Rx L3 from net: ", l3);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not ischosen(l3.msgs.rrm.channelModeModify)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Expected channelModeModify message");</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), 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(g_chan_nr, ?)) -> value rsl;</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%);">+   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%);">+ lchan_info := f_vty_transceive_ret(BSCVTY, "show lchan 0 0 1 0");</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 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%);">+}</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%);">+testcase TC_mode_modify_to_vamos() 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%);">+private function f_est_and_reassign_to_secondary_lchan(integer reassign_to_tn := -1) runs on MSC_ConnHdlr {</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%);">+      f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       var RslChannelNr new_chan_nr := g_chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+    if (reassign_to_tn < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          reassign_to_tn := g_chan_nr.tn + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     new_chan_nr.tn := reassign_to_tn;</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%);">+   /* 128 is the TEI for trx 0's VAMOS shadow */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rslem_register(128, new_chan_nr, RSL_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+ log("f_rslem_register(128, 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 0"</span><br><span style="color: hsl(120, 100%, 40%);">+                   & " reassign-to trx 0 timeslot " & int2str(new_chan_nr.tn) & " vamos-sub-slot 0 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%);">+           log("Rx L3 from net: ", l3);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (ischosen(l3.msgs.rrm.assignmentCommand)) {</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%);">+                      var RSL_Message chan_act := f_rslem_get_last_act(RSL_PROC, 128, new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+                 log("VAMOS secondary chan act was ", chan_act);</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%);">+                      Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Unexpected L3 received", l3));</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%);">+            }</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%);">+   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%);">+     f_sleep(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_assign_to_secondary_lchan(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     f_est_and_reassign_to_secondary_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%);">+testcase TC_assign_to_secondary_lchan() 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), 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%);">+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%);">+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(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%);">+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%);">+control {</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_mode_modify_to_vamos() );</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_assign_to_secondary_lchan() );</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</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: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>