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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">smlc: implement initial LCS tests for OsmoSMLC<br><br>Change-Id: Ic16b8bdb2d66dcf706bfd09ab15d9f56499dd982<br>---<br>M Makefile<br>A smlc/BSC_ConnectionHandler.ttcn<br>A smlc/SMLC_Tests.cfg<br>A smlc/SMLC_Tests.default<br>A smlc/SMLC_Tests.ttcn<br>A smlc/expected-results.xml<br>A smlc/gen_links.sh<br>A smlc/osmo-smlc.cfg<br>A smlc/osmo-stp.cfg<br>A smlc/regen_makefile.sh<br>10 files changed, 797 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Makefile b/Makefile</span><br><span>index 03e7a70..b1a7e61 100644</span><br><span>--- a/Makefile</span><br><span>+++ b/Makefile</span><br><span>@@ -14,7 +14,7 @@</span><br><span> # limitations under the License.</span><br><span> </span><br><span> SUBDIRS=bsc bsc-nat bts ccid ggsn_tests hlr mgw mme msc pcu pgw remsim sccp selftest sgsn \</span><br><span style="color: hsl(0, 100%, 40%);">-        simtrace sip stp sysinfo</span><br><span style="color: hsl(120, 100%, 40%);">+      simtrace sip stp sysinfo smlc</span><br><span> </span><br><span> NPROC=$(shell nproc 2>/dev/null)</span><br><span> ifeq ($(NPROC),)</span><br><span>diff --git a/smlc/BSC_ConnectionHandler.ttcn b/smlc/BSC_ConnectionHandler.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..bd787c7</span><br><span>--- /dev/null</span><br><span>+++ b/smlc/BSC_ConnectionHandler.ttcn</span><br><span>@@ -0,0 +1,95 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module BSC_ConnectionHandler {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* BSC Connection Handler of SMLC Tests in TTCN-3</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2020 sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Released under the terms of GNU General Public License, Version 2 or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0-or-later</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</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 SCCPasp_Types all;</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 BSSAP_CodecPort all;</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 BSSMAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from BSSAP_LE_Emulation 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 BSSMAP_LE_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from TELNETasp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_VTY_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* this component represents a single subscriber connection at the SMLC. */</span><br><span style="color: hsl(120, 100%, 40%);">+type component BSC_ConnHdlr extends BSSAP_LE_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+      /* SCCP Connecction Identifier for the underlying SCCP connection */</span><br><span style="color: hsl(120, 100%, 40%);">+  var integer g_sccp_conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ port TELNETasp_PT SMLCVTY;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  var TestHdlrParams g_pars;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  var charstring host_bsc := "127.0.0.4";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   var boolean g_vty_initialized := 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%);">+function f_BscConnHdlr_init_vty() runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (not g_vty_initialized) {</span><br><span style="color: hsl(120, 100%, 40%);">+          map(self:SMLCVTY, system:SMLCVTY);</span><br><span style="color: hsl(120, 100%, 40%);">+            f_vty_set_prompts(SMLCVTY);</span><br><span style="color: hsl(120, 100%, 40%);">+           f_vty_transceive(SMLCVTY, "enable");</span><br><span style="color: hsl(120, 100%, 40%);">+                g_vty_initialized := true;</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%);">+/* initialize all parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_BscConnHdlr_init() runs on BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_BscConnHdlr_init_vty();</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%);">+/* Callback function from general BSSAP_LE_Emulation whenever a connectionless</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSSAP_LE message arrives.  Can return a PDU_BSSAP_LE that should be sent in return */</span><br><span style="color: hsl(120, 100%, 40%);">+private function BSSAP_LE_UnitdataCallback(PDU_BSSAP_LE bssap)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on BSSAP_LE_Emulation_CT return template PDU_BSSAP_LE {</span><br><span style="color: hsl(120, 100%, 40%);">+        var template PDU_BSSAP_LE resp := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* answer all RESET with a RESET ACK */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (match(bssap, tr_BSSMAP_LE_Reset)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               resp := ts_BSSMAP_LE_ResetAck;</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 resp;</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 BssapLeOps BSC_BssapLeOps := {</span><br><span style="color: hsl(120, 100%, 40%);">+       create_cb := refers(BSSAP_LE_Emulation.ExpectedCreateCallback),</span><br><span style="color: hsl(120, 100%, 40%);">+       unitdata_cb := refers(BSSAP_LE_UnitdataCallback),</span><br><span style="color: hsl(120, 100%, 40%);">+     decode_dtap := false,</span><br><span style="color: hsl(120, 100%, 40%);">+ role_ms := false,</span><br><span style="color: hsl(120, 100%, 40%);">+     sccp_addr_local := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+      sccp_addr_peer := omit</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+type record TestHdlrParams {</span><br><span style="color: hsl(120, 100%, 40%);">+       hexstring imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+       integer bssap_le_idx,</span><br><span style="color: hsl(120, 100%, 40%);">+ SCCP_PAR_Address sccp_addr_bsc optional,</span><br><span style="color: hsl(120, 100%, 40%);">+      SCCP_PAR_Address sccp_addr_smlc 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%);">+/* Note: Do not use valueof() to get a value of this template, use</span><br><span style="color: hsl(120, 100%, 40%);">+ * f_gen_test_hdlr_pars() instead in order to get a configuration that is</span><br><span style="color: hsl(120, 100%, 40%);">+ * matched to the current test situation (aoip vs. sccplite) */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) TestHdlrParams t_def_TestHdlrPars := {</span><br><span style="color: hsl(120, 100%, 40%);">+       imsi := '001019876543210'H,</span><br><span style="color: hsl(120, 100%, 40%);">+   bssap_le_idx := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+    sccp_addr_bsc := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+        sccp_addr_smlc := 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>diff --git a/smlc/SMLC_Tests.cfg b/smlc/SMLC_Tests.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..cc9fd6e</span><br><span>--- /dev/null</span><br><span>+++ b/smlc/SMLC_Tests.cfg</span><br><span>@@ -0,0 +1,18 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[ORDERED_INCLUDE]</span><br><span style="color: hsl(120, 100%, 40%);">+# Common configuration, shared between test suites</span><br><span style="color: hsl(120, 100%, 40%);">+"../Common.cfg"</span><br><span style="color: hsl(120, 100%, 40%);">+# testsuite specific configuration, not expected to change</span><br><span style="color: hsl(120, 100%, 40%);">+"./SMLC_Tests.default"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Local configuration below</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[LOGGING]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[TESTPORT_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MODULE_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MAIN_CONTROLLER]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[EXECUTE]</span><br><span style="color: hsl(120, 100%, 40%);">+SMLC_Tests.control</span><br><span>diff --git a/smlc/SMLC_Tests.default b/smlc/SMLC_Tests.default</span><br><span>new file mode 100644</span><br><span>index 0000000..485d215</span><br><span>--- /dev/null</span><br><span>+++ b/smlc/SMLC_Tests.default</span><br><span>@@ -0,0 +1,19 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[LOGGING]</span><br><span style="color: hsl(120, 100%, 40%);">+"VirtBSC-SCCP".FileMask := ERROR | WARNING | PARALLEL | VERDICTOP;</span><br><span style="color: hsl(120, 100%, 40%);">+mtc.FileMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING | DEBUG_ENCDEC;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[TESTPORT_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+*.SMLCVTY.CTRL_MODE := "client"</span><br><span style="color: hsl(120, 100%, 40%);">+*.SMLCVTY.CTRL_HOSTNAME := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+*.SMLCVTY.CTRL_PORTNUM := "4271"</span><br><span style="color: hsl(120, 100%, 40%);">+*.SMLCVTY.CTRL_LOGIN_SKIPPED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.SMLCVTY.CTRL_DETECT_SERVER_DISCONNECTED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.SMLCVTY.CTRL_READMODE := "buffered"</span><br><span style="color: hsl(120, 100%, 40%);">+*.SMLCVTY.CTRL_CLIENT_CLEANUP_LINEFEED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.SMLCVTY.CTRL_DETECT_CONNECTION_ESTABLISHMENT_RESULT := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.SMLCVTY.PROMPT1 := "OsmoSMLC> "</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MODULE_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+Osmocom_VTY_Functions.mp_prompt_prefix := "OsmoSMLC";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[EXECUTE]</span><br><span>diff --git a/smlc/SMLC_Tests.ttcn b/smlc/SMLC_Tests.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..e42ed22</span><br><span>--- /dev/null</span><br><span>+++ b/smlc/SMLC_Tests.ttcn</span><br><span>@@ -0,0 +1,503 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module SMLC_Tests {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Integration Tests for OsmoSMLC</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2020 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Released under the terms of GNU General Public License, Version 2 or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0-or-later</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This test suite tests OsmoSMLC 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%);">+</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 BSSAP_LE_Emulation 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%);">+import from BSSLAP_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 BSSMAP_Templates 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 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 SCCP_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 BSC_ConnectionHandler all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const integer NUM_BSC := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Default list of counters for 'smlc' */</span><br><span style="color: hsl(120, 100%, 40%);">+const CounterNameVals counternames_bsc := {</span><br><span style="color: hsl(120, 100%, 40%);">+ { "foo:bar", 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%);">+type component test_CT extends CTRL_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var BSSAP_LE_Adapter g_bssap_le[NUM_BSC];</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%);">+    port TELNETasp_PT SMLCVTY;</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%);">+ /*Configure T(tias) over VTY, seconds */</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer g_smlc_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_smlc_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_smlc;</span><br><span style="color: hsl(120, 100%, 40%);">+   var CounterNameValsList g_ctr_bsc;</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 of BSSAP_LE_Configuration BSSAP_LE_Configurations;</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 SMLC can be reached */</span><br><span style="color: hsl(120, 100%, 40%);">+     charstring mp_smlc_ip := "127.0.0.1";</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_smlc_ctrl_port := 4272;</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%);">+     BSSAP_LE_Configurations mp_bssap_le_cfg := {</span><br><span style="color: hsl(120, 100%, 40%);">+          {</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 := 187,  /* 0.23.3 first BSC emulation */</span><br><span style="color: hsl(120, 100%, 40%);">+                      own_ssn := 250, /* BSC side SSN */</span><br><span style="color: hsl(120, 100%, 40%);">+                    peer_pc := 190, /* 0.23.6 osmo-smlc */</span><br><span style="color: hsl(120, 100%, 40%);">+                        peer_ssn := 252,        /* SMLC side SSN */</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%);">+}</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_le_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%);">+       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%);">+/* Convenience functions for rate counters using g_ctr_bsc. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_ctrs_smlc_init(integer bscs_count := NUM_BSC, CounterNameVals counternames := counternames_bsc) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     g_ctr_bsc := f_counter_name_vals_get_n(IPA_CTRL, "bsc", bscs_count, counternames);</span><br><span style="color: hsl(120, 100%, 40%);">+  log("initial msc rate counters: ", g_ctr_bsc);</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_ctrs_smlc_add(integer msc_nr, charstring countername, integer val := 1) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_counter_name_vals_list_add(g_ctr_bsc, msc_nr, countername, val);</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_ctrs_smlc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_do_thing(on_msc := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_do_thing(on_msc := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_do_other(on_msc := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_ctrs_smlc_add(0, "thing", 2);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_ctrs_smlc_add(1, "other");</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_ctrs_smlc_verify();</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_ctrs_smlc_verify() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        log("verifying msc rate counters: ", g_ctr_bsc);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_counter_name_vals_expect_n(IPA_CTRL, "bsc", g_ctr_bsc);</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%);">+/* convenience: f_ctrs_smlc_add() and f_ctrs_smlc_verify() in one call.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_ctrs_smlc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_do_thing(on_msc := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_do_thing(on_msc := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_do_thing(on_msc := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_ctrs_smlc_expect(0, "thing", 3);</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_ctrs_smlc_expect(integer msc_nr, charstring countername, integer val := 1) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrs_smlc_add(msc_nr, countername, val);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ctrs_smlc_verify();</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%);">+/* global altstep for global guard timer */</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%);">+    [] 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%);">+}</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%);">+/* 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_bsc := NUM_BSC, float guard_timeout := 30.0) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer bssap_le_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("VirtBSC");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for (bssap_le_idx := 0; bssap_le_idx < nr_bsc; bssap_le_idx := bssap_le_idx+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           f_bssap_le_adapter_init(g_bssap_le[bssap_le_idx], mp_bssap_le_cfg[bssap_le_idx], "VirtBSC", BSC_BssapLeOps);</span><br><span style="color: hsl(120, 100%, 40%);">+                f_bssap_le_adapter_start(g_bssap_le[bssap_le_idx]);</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_vty(charstring id := "foo") runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (SMLCVTY.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:SMLCVTY, system:SMLCVTY);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_vty_set_prompts(SMLCVTY);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_transceive(SMLCVTY, "enable");</span><br><span style="color: hsl(120, 100%, 40%);">+        f_cs7_inst_0_cfg(SMLCVTY, {"sccp-timer ias " & int2str(g_smlc_sccp_timer_ias),</span><br><span style="color: hsl(120, 100%, 40%);">+                    "sccp-timer iar " & int2str(g_smlc_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%);">+type function void_fn(charstring id) runs on BSC_ConnHdlr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_connect_handler(inout BSC_ConnHdlr vc_conn, integer bssap_le_idx := 0) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(vc_conn:BSSAP_LE, g_bssap_le[bssap_le_idx].vc_BSSAP_LE:CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+       connect(vc_conn:BSSAP_LE_PROC, g_bssap_le[bssap_le_idx].vc_BSSAP_LE: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%);">+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 BSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     var charstring id := testcasename();</span><br><span style="color: hsl(120, 100%, 40%);">+  var BSC_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+     var integer bssap_le_idx := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        if (isvalue(pars)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          bssap_le_idx := valueof(pars).bssap_le_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     vc_conn := BSC_ConnHdlr.create(id);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_connect_handler(vc_conn, bssap_le_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(SMLCVTY, 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%);">+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 BSC_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%);">+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%);">+template (value) PDU_BSSAP_LE ts_BSSMAP_LE_BSSLAP(template (value) BSSLAP_PDU bsslap)</span><br><span style="color: hsl(120, 100%, 40%);">+    := ts_BSSMAP_LE_ConnInfo(BSSMAP_LE_PROT_BSSLAP, data := enc_BSSLAP_PDU(valueof(bsslap)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template PDU_BSSAP_LE tr_BSSMAP_LE_BSSLAP(template BSSLAP_PDU bsslap)</span><br><span style="color: hsl(120, 100%, 40%);">+    := tr_BSSMAP_LE_ConnInfo(BSSMAP_LE_PROT_BSSLAP, data := enc_BSSLAP_PDU(valueof(bsslap)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* BSC sends Perform Location Request that already contains a TA Layer 3 BSSLAP APDU */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_smlc_location_request_with_ta_l3(charstring id) runs on BSC_ConnHdlr {</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_BscConnHdlr_init();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_bssap_le_register_imsi(g_pars.imsi, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var uint16_t cell_id := 42;</span><br><span style="color: hsl(120, 100%, 40%);">+   var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(23, cell_id));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc,</span><br><span style="color: hsl(120, 100%, 40%);">+                       valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   enc_BSSLAP_PDU(valueof(ts_BSSLAP_TA_Layer3(23)))))));</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* SMLC got the TA from the BSC, now responds with geo information data. */</span><br><span style="color: hsl(120, 100%, 40%);">+   /* TODO: implement GAD coding in ttcn */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Expecting geo:</span><br><span style="color: hsl(120, 100%, 40%);">+      * 0001 .... = Location estimate: Ellipsoid point with uncertainty Circle (1)</span><br><span style="color: hsl(120, 100%, 40%);">+  * 0... .... = Sign of latitude: North (0)</span><br><span style="color: hsl(120, 100%, 40%);">+     * .010 0001 0000 1001 1100 1001 = Degrees of latitude: 2165193 (23.23000 degrees)</span><br><span style="color: hsl(120, 100%, 40%);">+     * 0001 1110 0010 1010 0101 0011 = Degrees of longitude: 1976915 (42.42000 degrees)</span><br><span style="color: hsl(120, 100%, 40%);">+    * .100 1010 = Uncertainty code: 74 (11552.7 m)</span><br><span style="color: hsl(120, 100%, 40%);">+        * [Location OSM URI: https://www.openstreetmap.org/?mlat=23.23000&mlon=42.42000&zoom=12]</span><br><span style="color: hsl(120, 100%, 40%);">+      */</span><br><span style="color: hsl(120, 100%, 40%);">+   var octetstring geo := '102109C91E2A534A'O;</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocResp(geo, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_smlc_location_request_with_ta_l3() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var BSC_ConnHdlr vc_conn;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init();</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.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+    pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn := f_start_handler(refers(f_tc_smlc_location_request_with_ta_l3), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_conn.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%);">+/* BSC sends Perform Location Request without BSSLAP APDU, SMLC needs to request TA */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_smlc_location_request_without_ta_l3(charstring id) runs on BSC_ConnHdlr {</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_BscConnHdlr_init();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_bssap_le_register_imsi(g_pars.imsi, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var uint16_t cell_id := 42;</span><br><span style="color: hsl(120, 100%, 40%);">+   var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(23, cell_id));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc,</span><br><span style="color: hsl(120, 100%, 40%);">+                       valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi))));</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* SMLC wants to ask the TA from the SMLC explicitly in a BSSLAP TA Request message */</span><br><span style="color: hsl(120, 100%, 40%);">+        BSSAP_LE.receive(tr_BSSMAP_LE_BSSLAP(tr_BSSLAP_TA_Req));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* BSC figures out the TA and sends it back to the SMLC */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_TA_Resp(cell_id, 23)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* SMLC got the TA from the BSC, now responds with geo information data. */</span><br><span style="color: hsl(120, 100%, 40%);">+   /* TODO: implement GAD coding in ttcn */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Expecting geo:</span><br><span style="color: hsl(120, 100%, 40%);">+      * 0001 .... = Location estimate: Ellipsoid point with uncertainty Circle (1)</span><br><span style="color: hsl(120, 100%, 40%);">+  * 0... .... = Sign of latitude: North (0)</span><br><span style="color: hsl(120, 100%, 40%);">+     * .010 0001 0000 1001 1100 1001 = Degrees of latitude: 2165193 (23.23000 degrees)</span><br><span style="color: hsl(120, 100%, 40%);">+     * 0001 1110 0010 1010 0101 0011 = Degrees of longitude: 1976915 (42.42000 degrees)</span><br><span style="color: hsl(120, 100%, 40%);">+    * .100 1010 = Uncertainty code: 74 (11552.7 m)</span><br><span style="color: hsl(120, 100%, 40%);">+        * [Location OSM URI: https://www.openstreetmap.org/?mlat=23.23000&mlon=42.42000&zoom=12]</span><br><span style="color: hsl(120, 100%, 40%);">+      */</span><br><span style="color: hsl(120, 100%, 40%);">+   var octetstring geo := '102109C91E2A534A'O;</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocResp(geo, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_smlc_location_request_without_ta_l3() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var BSC_ConnHdlr vc_conn;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(1);</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.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+    pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn := f_start_handler(refers(f_tc_smlc_location_request_without_ta_l3), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn.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%);">+/* BSC sends Perform Location Request, halfway the BSC indicates handover via BSSLAP Reset */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_smlc_location_request_bsslap_reset(charstring id) runs on BSC_ConnHdlr {</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_BscConnHdlr_init();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_bssap_le_register_imsi(g_pars.imsi, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var uint16_t cell_id := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+    var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(1, cell_id));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc,</span><br><span style="color: hsl(120, 100%, 40%);">+                       valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi))));</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* SMLC wants to ask the TA from the SMLC explicitly in a BSSLAP TA Request message */</span><br><span style="color: hsl(120, 100%, 40%);">+        BSSAP_LE.receive(tr_BSSMAP_LE_BSSLAP(tr_BSSLAP_TA_Req));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* BSC reports a Handover via a BSSLAP Reset */</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_Reset(17, 42,</span><br><span style="color: hsl(120, 100%, 40%);">+             valueof(ts_BSSLAP_IE_ChanDesc),</span><br><span style="color: hsl(120, 100%, 40%);">+               BSSLAP_CAUSE_INTRA_BSS_HO)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* SMLC got the TA from the BSC via BSSLAP Reset, now responds with geo information data. */</span><br><span style="color: hsl(120, 100%, 40%);">+  /* TODO: implement GAD coding in ttcn */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Expecting geo:</span><br><span style="color: hsl(120, 100%, 40%);">+      * 0001 .... = Location estimate: Ellipsoid point with uncertainty Circle (1)</span><br><span style="color: hsl(120, 100%, 40%);">+  * 0... .... = Sign of latitude: North (0)</span><br><span style="color: hsl(120, 100%, 40%);">+     * .000 1011 0011 1000 1011 0100 = Degrees of latitude: 735412 (7.89012 degrees)</span><br><span style="color: hsl(120, 100%, 40%);">+       * 0000 0110 0101 0100 0110 1011 = Degrees of longitude: 414827 (8.90122 degrees)</span><br><span style="color: hsl(120, 100%, 40%);">+      * .101 0001 = Uncertainty code: 81 (22522.4 m)</span><br><span style="color: hsl(120, 100%, 40%);">+        * [Location OSM URI: https://www.openstreetmap.org/?mlat=7.89012&mlon=8.90122&zoom=12]</span><br><span style="color: hsl(120, 100%, 40%);">+        */</span><br><span style="color: hsl(120, 100%, 40%);">+   var octetstring geo := '100B38B406546B51'O;</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocResp(geo, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_smlc_location_request_bsslap_reset() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var BSC_ConnHdlr vc_conn;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(1);</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.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+    pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn := f_start_handler(refers(f_tc_smlc_location_request_bsslap_reset), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn.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%);">+/* BSC sends Perform Location Request, halfway the BSC aborts the request because of inter-BSC HO */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_smlc_location_request_abort(charstring id) runs on BSC_ConnHdlr {</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_BscConnHdlr_init();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_bssap_le_register_imsi(g_pars.imsi, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var uint16_t cell_id := 42;</span><br><span style="color: hsl(120, 100%, 40%);">+   var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(23, cell_id));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc,</span><br><span style="color: hsl(120, 100%, 40%);">+                       valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi))));</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* SMLC wants to ask the TA from the SMLC explicitly in a BSSLAP TA Request message */</span><br><span style="color: hsl(120, 100%, 40%);">+        BSSAP_LE.receive(tr_BSSMAP_LE_BSSLAP(tr_BSSLAP_TA_Req));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* BSC aborts */</span><br><span style="color: hsl(120, 100%, 40%);">+      BSSAP_LE.send(ts_BSSMAP_LE_PerfLocAbort(BSSMAP_LE_LCS_CAUSE_INTER_BSC_HO));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP_LE bssap_le;</span><br><span style="color: hsl(120, 100%, 40%);">+    timer nothing := 7.0;</span><br><span style="color: hsl(120, 100%, 40%);">+ nothing.start;</span><br><span style="color: hsl(120, 100%, 40%);">+        alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         [] BSSAP_LE.receive(tr_BSSAP_LE_BSSMAP) -> value(bssap_le) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       log("unexpected bssap_le: ", bssap_le);</span><br><span style="color: hsl(120, 100%, 40%);">+                     setverdict(fail, "No more messages expected from SMLC");</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%);">+             [] nothing.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                  setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</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%);">+   f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_smlc_location_request_abort() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var BSC_ConnHdlr vc_conn;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(1);</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.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+    pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn := f_start_handler(refers(f_tc_smlc_location_request_abort), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn.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%);">+/* BSC sends Perform Location Request, SMLC asks for TA, halfway the BSC aborts the TA request */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_smlc_location_request_bsslap_abort(charstring id) runs on BSC_ConnHdlr {</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_BscConnHdlr_init();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_bssap_le_register_imsi(g_pars.imsi, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        var uint16_t cell_id := 42;</span><br><span style="color: hsl(120, 100%, 40%);">+   var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(23, cell_id));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc,</span><br><span style="color: hsl(120, 100%, 40%);">+                       valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi))));</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* SMLC wants to ask the TA from the SMLC explicitly in a BSSLAP TA Request message */</span><br><span style="color: hsl(120, 100%, 40%);">+        BSSAP_LE.receive(tr_BSSMAP_LE_BSSLAP(tr_BSSLAP_TA_Req));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* BSC aborts the TA Request */</span><br><span style="color: hsl(120, 100%, 40%);">+       BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_Abort(BSSLAP_CAUSE_SUPERV_TIMER_EXPIRED)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Expect response without location, just an LCS Cause indicating abort */</span><br><span style="color: hsl(120, 100%, 40%);">+    BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocResp(omit, BSSMAP_LE_LCS_CAUSE_REQUEST_ABORTED));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_smlc_location_request_bsslap_abort() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var BSC_ConnHdlr vc_conn;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init(1);</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.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own;</span><br><span style="color: hsl(120, 100%, 40%);">+    pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn := f_start_handler(refers(f_tc_smlc_location_request_bsslap_abort), pars);</span><br><span style="color: hsl(120, 100%, 40%);">+    vc_conn.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%);">+control {</span><br><span style="color: hsl(120, 100%, 40%);">+if (true) {</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_smlc_location_request_without_ta_l3() );</span><br><span style="color: hsl(120, 100%, 40%);">+} else {</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_smlc_location_request_with_ta_l3() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_smlc_location_request_without_ta_l3() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_smlc_location_request_bsslap_reset() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_smlc_location_request_bsslap_abort() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_smlc_location_request_abort() );</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>diff --git a/smlc/expected-results.xml b/smlc/expected-results.xml</span><br><span>new file mode 100644</span><br><span>index 0000000..9034822</span><br><span>--- /dev/null</span><br><span>+++ b/smlc/expected-results.xml</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+<?xml version="1.0"?></span><br><span style="color: hsl(120, 100%, 40%);">+<testsuite name='BSC_Tests' tests='209' failures='3' errors='0' skipped='1' inconc='0' time='MASKED'></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='SMLC_Tests' name='TC_smlc_location_request_for_idle_ms' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+</testsuite></span><br><span>diff --git a/smlc/gen_links.sh b/smlc/gen_links.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..092b963</span><br><span>--- /dev/null</span><br><span>+++ b/smlc/gen_links.sh</span><br><span>@@ -0,0 +1,75 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/bash</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+BASEDIR=../deps</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+. ../gen_links.sh.inc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#DIR=$BASEDIR/titan.TestPorts.UNIX_DOMAIN_SOCKETasp/src</span><br><span style="color: hsl(120, 100%, 40%);">+#FILES="UD_PT.cc  UD_PT.hh  UD_PortType.ttcn  UD_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+#gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.Libraries.TCCUsefulFunctions/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="TCCInterface_Functions.ttcn TCCConversion_Functions.ttcn TCCConversion.cc TCCInterface.cc TCCInterface_ip.h SDP_EncDec.cc"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.Common_Components.Socket-API/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Socket_API_Definitions.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Required by MGCP and IPA</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.IPL4asp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="IPL4asp_Functions.ttcn  IPL4asp_PT.cc  IPL4asp_PT.hh IPL4asp_PortType.ttcn  IPL4asp_Types.ttcn  IPL4asp_discovery.cc IPL4asp_protocol_L234.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# required by M3UA_Emulation</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.M3UA/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="M3UA_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# required by M3UA_Emulation</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.SCTPasp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="SCTPasp_PT.cc  SCTPasp_PT.hh  SCTPasp_PortType.ttcn  SCTPasp_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# required by SCCP Emulation</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolEmulations.M3UA/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="M3UA_Emulation.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# required by SCCP Emulation</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.MTP3asp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="MTP3asp_PortType.ttcn  MTP3asp_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolEmulations.SCCP/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="SCCP_Emulation.ttcn  SCCP_Mapping.ttcnpp  SCCP_Types.ttcn  SCCPasp_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.BSSMAP/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="BSSAP_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.MobileL3_v13.4.0/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="MobileL3_CC_Types.ttcn MobileL3_CommonIE_Types.ttcn MobileL3_GMM_SM_Types.ttcn MobileL3_MM_Types.ttcn MobileL3_RRM_Types.ttcn MobileL3_SMS_Types.ttcn MobileL3_SS_Types.ttcn MobileL3_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.SDP/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="SDP_EncDec.cc SDP_Types.ttcn SDP_parse_.tab.c SDP_parse_.tab.h SDP_parse_parser.h SDP_parser.l</span><br><span style="color: hsl(120, 100%, 40%);">+SDP_parser.y lex.SDP_parse_.c"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.RTP/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="RTP_EncDec.cc RTP_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.TELNETasp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="TELNETasp_PT.cc  TELNETasp_PT.hh  TELNETasp_PortType.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=../library</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp L3_Templates.ttcn BSSMAP_Templates.ttcn BSSAP_LE_Types.ttcn RAN_Emulation.ttcnpp RLCMAC_CSN1_Templates.ttcn RLCMAC_CSN1_Types.ttcn GSM_RR_Types.ttcn RSL_Types.ttcn RSL_Emulation.ttcn MGCP_Emulation.ttcn MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_CodecPort_CtrlFunctDef.cc BSSAP_CodecPort.ttcn RAN_Adapter.ttcnpp Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunct.ttcn RTP_CodecPort_CtrlFunctDef.cc RTP_Emulation.ttcn IuUP_Types.ttcn IuUP_EncDec.cc IuUP_Emulation.ttcn SCCP_Templates.ttcn IPA_Testing.ttcn GSM_SystemInformation.ttcn GSM_RestOctets.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="BSSAP_LE_CodecPort.ttcn BSSAP_LE_Emulation.ttcn BSSAP_LE_Adapter.ttcn BSSLAP_Types.ttcn BSSMAP_LE_Templates.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ignore_pp_results</span><br><span>diff --git a/smlc/osmo-smlc.cfg b/smlc/osmo-smlc.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..3bba0b3</span><br><span>--- /dev/null</span><br><span>+++ b/smlc/osmo-smlc.cfg</span><br><span>@@ -0,0 +1,28 @@</span><br><span style="color: hsl(120, 100%, 40%);">+log gsmtap 172.18.23.203</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level set-all debug</span><br><span style="color: hsl(120, 100%, 40%);">+ logging filter all 1</span><br><span style="color: hsl(120, 100%, 40%);">+log stderr</span><br><span style="color: hsl(120, 100%, 40%);">+ logging filter all 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging color 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print level 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print category 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print category-hex 0</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print extended-timestamp 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print file basename last</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level set-all debug</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+line vty</span><br><span style="color: hsl(120, 100%, 40%);">+ no login</span><br><span style="color: hsl(120, 100%, 40%);">+ bind 0.0.0.0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+cs7 instance 0</span><br><span style="color: hsl(120, 100%, 40%);">+ asp asp-clnt-msc-0 2905 2905 m3ua</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip 172.18.23.20</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip fd02:db8:23::20</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip 172.18.23.200</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip fd02:db8:23::200</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+cells</span><br><span style="color: hsl(120, 100%, 40%);">+ lac-ci 23 42 lat 23.23 lon 42.42</span><br><span style="color: hsl(120, 100%, 40%);">+ cgi 001 02 3 4 lat 5.678 lon 6.789</span><br><span style="color: hsl(120, 100%, 40%);">+ cgi 001 02 1 17 lat 7.890123 lon 8.90123</span><br><span>diff --git a/smlc/osmo-stp.cfg b/smlc/osmo-stp.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..dad1f2d</span><br><span>--- /dev/null</span><br><span>+++ b/smlc/osmo-stp.cfg</span><br><span>@@ -0,0 +1,45 @@</span><br><span style="color: hsl(120, 100%, 40%);">+!</span><br><span style="color: hsl(120, 100%, 40%);">+! OsmoSTP (0.8.1) configuration saved from vty</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%);">+log stderr</span><br><span style="color: hsl(120, 100%, 40%);">+ logging filter all 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging color 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print category 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging timestamp 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print extended-timestamp 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level all everything</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lglobal notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level llapd notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level linp notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lmux notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lmi notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lmib notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lsms notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lctrl notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lgtp notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lstats notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lgsup notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level loap notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lss7 debug</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lsccp debug</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lsua debug</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lm3ua debug</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lmgcp notice</span><br><span style="color: hsl(120, 100%, 40%);">+!</span><br><span style="color: hsl(120, 100%, 40%);">+line vty</span><br><span style="color: hsl(120, 100%, 40%);">+ no login</span><br><span style="color: hsl(120, 100%, 40%);">+!</span><br><span style="color: hsl(120, 100%, 40%);">+cs7 instance 0</span><br><span style="color: hsl(120, 100%, 40%);">+ xua rkm routing-key-allocation dynamic-permitted</span><br><span style="color: hsl(120, 100%, 40%);">+ asp virt-bsc0-0 23905 2905 m3ua</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+ as virt-bsc0 m3ua</span><br><span style="color: hsl(120, 100%, 40%);">+  asp virt-bsc0-0</span><br><span style="color: hsl(120, 100%, 40%);">+  routing-key 1 0.23.3</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ route-table system</span><br><span style="color: hsl(120, 100%, 40%);">+  update route 0.23.3 7.255.7 linkset virt-bsc0</span><br><span style="color: hsl(120, 100%, 40%);">+ listen m3ua 2905</span><br><span style="color: hsl(120, 100%, 40%);">+  accept-asp-connections dynamic-permitted</span><br><span>diff --git a/smlc/regen_makefile.sh b/smlc/regen_makefile.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..d8b8642</span><br><span>--- /dev/null</span><br><span>+++ b/smlc/regen_makefile.sh</span><br><span>@@ -0,0 +1,9 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+MAIN=SMLC_Tests.ttcn</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="*.ttcn *.ttcnpp IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc SCTPasp_PT.cc RTP_EncDec.cc SDP_EncDec.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc IuUP_EncDec.cc Native_FunctionDefs.cc TELNETasp_PT.cc *.c"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL -DIPA_EMULATION_MGCP -DIPA_EMULATION_CTRL -DIPA_EMULATION_SCCP -DRAN_EMULATION_BSSAP -DRAN_EMULATION_MGCP -DRAN_EMULATION_CTRL -DUSE_MTP3_DISTRIBUTOR"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+../regen-makefile.sh $MAIN $FILES</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/20374">change 20374</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/+/20374"/><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: Ic16b8bdb2d66dcf706bfd09ab15d9f56499dd982 </div>
<div style="display:none"> Gerrit-Change-Number: 20374 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-CC: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>