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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">hnb: Introduce HNB_Tests testsuite<br><br>A new Iuh CodecPort + Emulation is introduced to (de)mux RANAP and RUA<br>in the same SCTP socket.<br>The Iuh_CodecPort.ttcn file has currently a hack to be able to test<br>HNBAP, since titan seem to be reporting sinfo_ppid=0 when in fact it<br>received sinfo_ppid=20 (HNBAP).<br><br>A couple tests are added to validate HNBAP HNBRegister Request  + Accept<br>or Reject. In current osmo-hnodeb state, both tests pass if run<br>separately, but fail if run sequentially since osmo-hnodeb still doesn't<br>re-connect properly after first test finishes and connection is dropped.<br><br>Related: SYS#5516<br>Change-Id: I7227917148e98a2c777f4b05d8d2eca6e9c121b7<br>---<br>M Makefile<br>A hnodeb/HNBGW_ConnectionHandler.ttcn<br>A hnodeb/HNB_Tests.cfg<br>A hnodeb/HNB_Tests.default<br>A hnodeb/HNB_Tests.ttcn<br>A hnodeb/README.md<br>A hnodeb/README.txt<br>A hnodeb/expected-results.xml<br>A hnodeb/gen_links.sh<br>A hnodeb/osmo-hnodeb.cfg<br>A hnodeb/regen_makefile.sh<br>A library/Iuh_CodecPort.ttcn<br>A library/Iuh_CodecPort_CtrlFunct.ttcn<br>A library/Iuh_CodecPort_CtrlFunctDef.cc<br>A library/Iuh_Emulation.ttcn<br>A library/Iuh_Types.ttcn<br>A library/hnbap/HNBAP_Templates.ttcn<br>A library/rua/RUA_Templates.ttcn<br>18 files changed, 1,196 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Makefile b/Makefile</span><br><span>index 0567081..f05ab48 100644</span><br><span>--- a/Makefile</span><br><span>+++ b/Makefile</span><br><span>@@ -24,6 +24,7 @@</span><br><span>         gbproxy \</span><br><span>    ggsn_tests \</span><br><span>         hlr \</span><br><span style="color: hsl(120, 100%, 40%);">+ hnodeb \</span><br><span>     mgw \</span><br><span>        mme \</span><br><span>        msc \</span><br><span>diff --git a/hnodeb/HNBGW_ConnectionHandler.ttcn b/hnodeb/HNBGW_ConnectionHandler.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..071e3e8</span><br><span>--- /dev/null</span><br><span>+++ b/hnodeb/HNBGW_ConnectionHandler.ttcn</span><br><span>@@ -0,0 +1,112 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module HNBGW_ConnectionHandler {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* HNBGW Connection Handler of HNB_Tests in TTCN-3</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom - s.m.f.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 IPL4asp_Types all;</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%);">+import from SDP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</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 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%);">+import from HNBAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from Iuh_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* this component represents a single Iuh connection at the HNBGW. */</span><br><span style="color: hsl(120, 100%, 40%);">+type component HNBGW_ConnHdlr extends StatsD_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     port TELNETasp_PT HNBVTY;</span><br><span style="color: hsl(120, 100%, 40%);">+     port HNBAP_PT HNBAP;</span><br><span style="color: hsl(120, 100%, 40%);">+  port RUA_PT RUA;</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 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_HNBGW_ConnHdlr_init_vty() runs on HNBGW_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:HNBVTY, system:HNBVTY);</span><br><span style="color: hsl(120, 100%, 40%);">+              f_vty_set_prompts(HNBVTY);</span><br><span style="color: hsl(120, 100%, 40%);">+            f_vty_transceive(HNBVTY, "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_HNBGW_ConnHdlr_init(TestHdlrParams pars) runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   var Iuh_Emulation_CT vc_Iuh;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        g_pars := valueof(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+      vc_Iuh := Iuh_Emulation_CT.create("HNBGW" & int2str(i));</span><br><span style="color: hsl(120, 100%, 40%);">+        connect(self:HNBAP, vc_Iuh:HNBAP);</span><br><span style="color: hsl(120, 100%, 40%);">+    connect(self:RUA, vc_Iuh:RUA);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var Iuh_conn_parameters iuh_pars;</span><br><span style="color: hsl(120, 100%, 40%);">+     iuh_pars.remote_ip := g_pars.hnodeb_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+     iuh_pars.remote_sctp_port := -1;</span><br><span style="color: hsl(120, 100%, 40%);">+      iuh_pars.local_ip := g_pars.hnbgw_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+       iuh_pars.local_sctp_port  := g_pars.hnbgw_port;</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_Iuh.start(Iuh_Emulation.main(iuh_pars, "Iuh" & int2str(i)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_HNBGW_ConnHdlr_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%);">+type record TestHdlrParams {</span><br><span style="color: hsl(120, 100%, 40%);">+       charstring hnbgw_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+        charstring hnodeb_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+       integer hnbgw_port,</span><br><span style="color: hsl(120, 100%, 40%);">+   uint16_t rnc_id,</span><br><span style="color: hsl(120, 100%, 40%);">+      charstring hNB_Identity_Info,</span><br><span style="color: hsl(120, 100%, 40%);">+ OCT3 plmnid,</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t cell_identity,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t lac,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t rac,</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t sac</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. */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) TestHdlrParams t_def_TestHdlrPars := {</span><br><span style="color: hsl(120, 100%, 40%);">+ hnbgw_addr := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+  hnodeb_addr := "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+ hnbgw_port := 29169,</span><br><span style="color: hsl(120, 100%, 40%);">+  rnc_id := 23,</span><br><span style="color: hsl(120, 100%, 40%);">+ hNB_Identity_Info := "OsmoHNodeB",</span><br><span style="color: hsl(120, 100%, 40%);">+  plmnid := '00F110'O,</span><br><span style="color: hsl(120, 100%, 40%);">+  cell_identity := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+   lac := 2,</span><br><span style="color: hsl(120, 100%, 40%);">+     rac := 3,</span><br><span style="color: hsl(120, 100%, 40%);">+     sac := 4</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_handle_hnbap_hnb_register_req()</span><br><span style="color: hsl(120, 100%, 40%);">+runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBAP.receive(tr_HNBAP_HNBRegisterRequest(char2oct(g_pars.hNB_Identity_Info),</span><br><span style="color: hsl(120, 100%, 40%);">+                                           g_pars.plmnid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                int2bit(g_pars.cell_identity, 28),</span><br><span style="color: hsl(120, 100%, 40%);">+                                            int2oct(g_pars.lac, 2),</span><br><span style="color: hsl(120, 100%, 40%);">+                                               int2oct(g_pars.rac, 1),</span><br><span style="color: hsl(120, 100%, 40%);">+                                               int2oct(g_pars.sac, 2)</span><br><span style="color: hsl(120, 100%, 40%);">+                                               ));</span><br><span style="color: hsl(120, 100%, 40%);">+  HNBAP.send(ts_HNBAP_HNBRegisterAccept(g_pars.rnc_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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/hnodeb/HNB_Tests.cfg b/hnodeb/HNB_Tests.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..38d9cc7</span><br><span>--- /dev/null</span><br><span>+++ b/hnodeb/HNB_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%);">+"./HNB_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%);">+HNB_Tests.control</span><br><span>diff --git a/hnodeb/HNB_Tests.default b/hnodeb/HNB_Tests.default</span><br><span>new file mode 100644</span><br><span>index 0000000..a06dcc6</span><br><span>--- /dev/null</span><br><span>+++ b/hnodeb/HNB_Tests.default</span><br><span>@@ -0,0 +1,27 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[LOGGING]</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%);">+*.HNBVTY.CTRL_MODE := "client"</span><br><span style="color: hsl(120, 100%, 40%);">+*.HNBVTY.CTRL_HOSTNAME := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+*.HNBVTY.CTRL_PORTNUM := "4273"</span><br><span style="color: hsl(120, 100%, 40%);">+*.HNBVTY.CTRL_LOGIN_SKIPPED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.HNBVTY.CTRL_DETECT_SERVER_DISCONNECTED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.HNBVTY.CTRL_READMODE := "buffered"</span><br><span style="color: hsl(120, 100%, 40%);">+*.HNBVTY.CTRL_CLIENT_CLEANUP_LINEFEED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.HNBVTY.CTRL_DETECT_CONNECTION_ESTABLISHMENT_RESULT := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.HNBVTY.PROMPT1 := "OsmoHNodeB> "</span><br><span style="color: hsl(120, 100%, 40%);">+*.STATSVTY.CTRL_MODE := "client"</span><br><span style="color: hsl(120, 100%, 40%);">+*.STATSVTY.CTRL_HOSTNAME := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+*.STATSVTY.CTRL_PORTNUM := "4274"</span><br><span style="color: hsl(120, 100%, 40%);">+*.STATSVTY.CTRL_LOGIN_SKIPPED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.STATSVTY.CTRL_DETECT_SERVER_DISCONNECTED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.STATSVTY.CTRL_READMODE := "buffered"</span><br><span style="color: hsl(120, 100%, 40%);">+*.STATSVTY.CTRL_CLIENT_CLEANUP_LINEFEED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.STATSVTY.CTRL_DETECT_CONNECTION_ESTABLISHMENT_RESULT := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.STATSVTY.PROMPT1 := "OsmoHNodeB> "</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 := "OsmoHNodeB";</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/hnodeb/HNB_Tests.ttcn b/hnodeb/HNB_Tests.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..7a668dd</span><br><span>--- /dev/null</span><br><span>+++ b/hnodeb/HNB_Tests.ttcn</span><br><span>@@ -0,0 +1,214 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module HNB_Tests {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Integration Tests for OsmoHNodeB</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All rights reserved.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Released under the terms of GNU General Public License, Version 2 or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * SPDX-License-Identifier: GPL-2.0-or-later</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This test suite tests OsmoHNodB while emulating both multiple UE as</span><br><span style="color: hsl(120, 100%, 40%);">+ * well as the HNBGW. 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 IPL4asp_Types 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 HNBAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBGW_ConnectionHandler all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Iuh_Emulation all;</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 HNodeB can be reached */</span><br><span style="color: hsl(120, 100%, 40%);">+   charstring mp_hnodeb_ip := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+</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_hnbgw_iuh_ip := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+  integer mp_hnbgw_iuh_port := 29169;</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%);">+    port TELNETasp_PT HNBVTY;</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%);">+</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%);">+friend 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%);">+function f_init_vty(charstring id := "foo") runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (HNBVTY.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:HNBVTY, system:HNBVTY);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_set_prompts(HNBVTY);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_vty_transceive(HNBVTY, "enable");</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%);">+function f_init(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%);">+      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("VirtHNBGW");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* TODO: Wait for Iuh connection to be established */</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%);">+friend 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%);">+friend function f_gen_test_hdlr_pars() 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%);">+       pars.hnodeb_addr := mp_hnodeb_ip;</span><br><span style="color: hsl(120, 100%, 40%);">+     pars.hnbgw_addr := mp_hnbgw_iuh_ip;</span><br><span style="color: hsl(120, 100%, 40%);">+   pars.hnbgw_port := mp_hnbgw_iuh_port;</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 HNBGW_ConnHdlr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* helper function to create and connect a HNBGW_ConnHdlr component */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_connect_handler(inout HNBGW_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%);">+function f_start_handler_create(TestHdlrParams pars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT return HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    var charstring id := testcasename();</span><br><span style="color: hsl(120, 100%, 40%);">+  var HNBGW_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+   vc_conn := HNBGW_ConnHdlr.create(id);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_connect_handler(vc_conn);</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%);">+function f_start_handler_run(HNBGW_ConnHdlr vc_conn, void_fn fn, TestHdlrParams pars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT return HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  var charstring id := testcasename();</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(HNBVTY, id & "() 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%);">+function f_start_handler(void_fn fn, template (omit) TestHdlrParams pars_tmpl := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT return HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var TestHdlrParams pars;</span><br><span style="color: hsl(120, 100%, 40%);">+      if (isvalue(pars)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          pars := valueof(pars_tmpl);</span><br><span style="color: hsl(120, 100%, 40%);">+   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              pars := valueof(f_gen_test_hdlr_pars());</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     return f_start_handler_run(f_start_handler_create(pars), fn, 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%);">+/* 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, TestHdlrParams pars)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_HNBGW_ConnHdlr_init(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+  HNBAP.receive(IUHEM_Event:{up_down:=IUHEM_EVENT_UP}); /* Wait for HNB to connect to us */</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%);">+private function f_tc_hnb_register_request(charstring id) runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+        f_handle_hnbap_hnb_register_req();</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%);">+testcase TC_hnb_register_request_accept() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var HNBGW_ConnHdlr vc_conn;</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%);">+     vc_conn := f_start_handler(refers(f_tc_hnb_register_request));</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_hnb_register_reject(charstring id) runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  HNBAP.receive(tr_HNBAP_HNBRegisterRequest(char2oct(g_pars.hNB_Identity_Info),</span><br><span style="color: hsl(120, 100%, 40%);">+                                           g_pars.plmnid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                int2bit(g_pars.cell_identity, 28),</span><br><span style="color: hsl(120, 100%, 40%);">+                                            int2oct(g_pars.lac, 2),</span><br><span style="color: hsl(120, 100%, 40%);">+                                               int2oct(g_pars.rac, 1),</span><br><span style="color: hsl(120, 100%, 40%);">+                                               int2oct(g_pars.sac, 2)</span><br><span style="color: hsl(120, 100%, 40%);">+                                               ));</span><br><span style="color: hsl(120, 100%, 40%);">+  HNBAP.send(ts_HNBAP_HNBRegisterReject(ts_HnbapCause(overload)));</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%);">+testcase TC_hnb_register_request_reject() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var HNBGW_ConnHdlr vc_conn;</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%);">+     vc_conn := f_start_handler(refers(f_tc_hnb_register_reject));</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%);">+control {</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_hnb_register_request_accept() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_hnb_register_request_reject() );</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/hnodeb/README.md b/hnodeb/README.md</span><br><span>new file mode 100644</span><br><span>index 0000000..3b3fa9f</span><br><span>--- /dev/null</span><br><span>+++ b/hnodeb/README.md</span><br><span>@@ -0,0 +1,30 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# HNB_Tests.ttcn</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+* external interfaces</span><br><span style="color: hsl(120, 100%, 40%);">+    * Iuh side (emulates HNBGW-side)</span><br><span style="color: hsl(120, 100%, 40%);">+        * SCTP/HNBAP</span><br><span style="color: hsl(120, 100%, 40%);">+        * SCTP/RUA/RANAP</span><br><span style="color: hsl(120, 100%, 40%);">+    * RTP side: emulates MGW</span><br><span style="color: hsl(120, 100%, 40%);">+    * GTP-U side: emulates GGSN</span><br><span style="color: hsl(120, 100%, 40%);">+    * UE side</span><br><span style="color: hsl(120, 100%, 40%);">+    * VTY</span><br><span style="color: hsl(120, 100%, 40%);">+    * CTRL</span><br><span style="color: hsl(120, 100%, 40%);">+    * StatsD</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+{% dot hnb_tests.svg</span><br><span style="color: hsl(120, 100%, 40%);">+digraph G {</span><br><span style="color: hsl(120, 100%, 40%);">+  graph [label="HNB_Tests", labelloc=t, fontsize=30];</span><br><span style="color: hsl(120, 100%, 40%);">+  rankdir=LR;</span><br><span style="color: hsl(120, 100%, 40%);">+  { rank=same; ATS; HNB; };</span><br><span style="color: hsl(120, 100%, 40%);">+  HNB [label="IUT\nosmo-bsc",shape="box"];</span><br><span style="color: hsl(120, 100%, 40%);">+  ATS [label="ATS\nHNB_Tests.ttcn"];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  HNB <- ATS [label="Uu (or some intermediate lower layer)"];</span><br><span style="color: hsl(120, 100%, 40%);">+  HNB -> ATS [label="Iuh"];</span><br><span style="color: hsl(120, 100%, 40%);">+  HNB -> ATS [label="RTP"];</span><br><span style="color: hsl(120, 100%, 40%);">+  HNB -> ATS [label="GTP-U"];</span><br><span style="color: hsl(120, 100%, 40%);">+  HNB <- ATS [label="CTRL"];</span><br><span style="color: hsl(120, 100%, 40%);">+  HNB <- ATS [label="VTY"];</span><br><span style="color: hsl(120, 100%, 40%);">+  HNB -> ATS [label="StatsD"];</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+%}</span><br><span>diff --git a/hnodeb/README.txt b/hnodeb/README.txt</span><br><span>new file mode 100644</span><br><span>index 0000000..1cf81ee</span><br><span>--- /dev/null</span><br><span>+++ b/hnodeb/README.txt</span><br><span>@@ -0,0 +1,32 @@</span><br><span style="color: hsl(120, 100%, 40%);">+Integration Tests for OsmoHnodeB</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%);">+This test suite tests OsmoHNodeB while emulating both multiple UE as</span><br><span style="color: hsl(120, 100%, 40%);">+well as the HNBGW.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The included jenkins.sh script, together with the Dockerfiles from</span><br><span style="color: hsl(120, 100%, 40%);">+http://git.osmocom.org/docker-playground/ can be used to run both the</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-hnodeb-under-test as well as the extenal entities and the tester.</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%);">+Further Test Ideas</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%);">+This is a random list of things about things possible to test.</span><br><span style="color: hsl(120, 100%, 40%);">+Asterisks '*' are TODO, while 'x' means already implemented.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+= exhaustion of resources</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+= paging</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+= assignment</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+= hand-over</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+= erroneous channel release</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+= misc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+= counters</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+= VTY based/corresponding tests</span><br><span>diff --git a/hnodeb/expected-results.xml b/hnodeb/expected-results.xml</span><br><span>new file mode 100644</span><br><span>index 0000000..39cea9f</span><br><span>--- /dev/null</span><br><span>+++ b/hnodeb/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='HNB_Tests' tests='0' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</testsuite></span><br><span>diff --git a/hnodeb/gen_links.sh b/hnodeb/gen_links.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..ba946e8</span><br><span>--- /dev/null</span><br><span>+++ b/hnodeb/gen_links.sh</span><br><span>@@ -0,0 +1,60 @@</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"</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+=" TCCEncoding_Functions.ttcn TCCEncoding.cc " # GSM 7-bit coding</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.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%);">+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/hnbap</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="HNBAP_CommonDataTypes.asn HNBAP_Constants.asn HNBAP_Containers.asn HNBAP_IEs.asn HNBAP_PDU_Contents.asn HNBAP_PDU_Descriptions.asn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="HNBAP_EncDec.cc  HNBAP_Types.ttcn  HNBAP_Templates.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/rua</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="RUA_CommonDataTypes.asn RUA_Constants.asn RUA_Containers.asn RUA_IEs.asn RUA_PDU_Contents.asn RUA_PDU_Descriptions.asn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="RUA_EncDec.cc  RUA_Types.ttcn  RUA_Templates.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="Iuh_Types.ttcn Iuh_CodecPort.ttcn Iuh_CodecPort_CtrlFunctDef.cc Iuh_CodecPort_CtrlFunct.ttcn Iuh_Emulation.ttcn DNS_Helpers.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="Misc_Helpers.ttcn General_Types.ttcn Osmocom_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 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 "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="StatsD_Types.ttcn StatsD_CodecPort.ttcn StatsD_CodecPort_CtrlFunct.ttcn StatsD_CodecPort_CtrlFunctdef.cc StatsD_Checker.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/hnodeb/osmo-hnodeb.cfg b/hnodeb/osmo-hnodeb.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..3ccd4b4</span><br><span>--- /dev/null</span><br><span>+++ b/hnodeb/osmo-hnodeb.cfg</span><br><span>@@ -0,0 +1,19 @@</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-hex 0</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print category 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 print file basename</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level set-all debug</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%);">+hnodeb</span><br><span style="color: hsl(120, 100%, 40%);">+ cell_identity 1</span><br><span style="color: hsl(120, 100%, 40%);">+ location_area_code 2</span><br><span style="color: hsl(120, 100%, 40%);">+ routing_area_code 3</span><br><span style="color: hsl(120, 100%, 40%);">+ service_area_code 4</span><br><span style="color: hsl(120, 100%, 40%);">+ iuh</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>diff --git a/hnodeb/regen_makefile.sh b/hnodeb/regen_makefile.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..9ebfaf2</span><br><span>--- /dev/null</span><br><span>+++ b/hnodeb/regen_makefile.sh</span><br><span>@@ -0,0 +1,35 @@</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%);">+NAME=HNB_Tests</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="</span><br><span style="color: hsl(120, 100%, 40%);">+       *.asn</span><br><span style="color: hsl(120, 100%, 40%);">+ *.c</span><br><span style="color: hsl(120, 100%, 40%);">+   *.ttcn</span><br><span style="color: hsl(120, 100%, 40%);">+        *.ttcnpp</span><br><span style="color: hsl(120, 100%, 40%);">+      IPA_CodecPort_CtrlFunctDef.cc</span><br><span style="color: hsl(120, 100%, 40%);">+ IPL4asp_PT.cc</span><br><span style="color: hsl(120, 100%, 40%);">+ IPL4asp_discovery.cc</span><br><span style="color: hsl(120, 100%, 40%);">+  IuUP_EncDec.cc</span><br><span style="color: hsl(120, 100%, 40%);">+        Iuh_CodecPort_CtrlFunctDef.cc</span><br><span style="color: hsl(120, 100%, 40%);">+ Native_FunctionDefs.cc</span><br><span style="color: hsl(120, 100%, 40%);">+        RTP_CodecPort_CtrlFunctDef.cc</span><br><span style="color: hsl(120, 100%, 40%);">+ RTP_EncDec.cc</span><br><span style="color: hsl(120, 100%, 40%);">+ SCTPasp_PT.cc</span><br><span style="color: hsl(120, 100%, 40%);">+ SDP_EncDec.cc</span><br><span style="color: hsl(120, 100%, 40%);">+ StatsD_CodecPort_CtrlFunctdef.cc</span><br><span style="color: hsl(120, 100%, 40%);">+      TCCConversion.cc</span><br><span style="color: hsl(120, 100%, 40%);">+      TCCEncoding.cc</span><br><span style="color: hsl(120, 100%, 40%);">+        TCCInterface.cc</span><br><span style="color: hsl(120, 100%, 40%);">+       TELNETasp_PT.cc</span><br><span style="color: hsl(120, 100%, 40%);">+       HNBAP_EncDec.cc</span><br><span style="color: hsl(120, 100%, 40%);">+       RUA_EncDec.cc</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%);">+export CPPFLAGS_TTCN3="</span><br><span style="color: hsl(120, 100%, 40%);">+ -DIPA_EMULATION_CTRL</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%);">+../regen-makefile.sh -e $NAME $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+sed -i -e 's/^LINUX_LIBS = -lxml2 -lsctp/LINUX_LIBS = -lxml2 -lsctp -lfftranscode/' Makefile</span><br><span>diff --git a/library/Iuh_CodecPort.ttcn b/library/Iuh_CodecPort.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..569a27f</span><br><span>--- /dev/null</span><br><span>+++ b/library/Iuh_CodecPort.ttcn</span><br><span>@@ -0,0 +1,141 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module Iuh_CodecPort {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Simple Iuh Codec Port, translating between raw SCTP primitives with</span><br><span style="color: hsl(120, 100%, 40%);">+ * octetstring payload towards the IPL4asp provider, and Iuh primitives</span><br><span style="color: hsl(120, 100%, 40%);">+ * which carry the decoded Iuh data types as payload.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Pau Espin Pedrol <pespin@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 IPL4asp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+     import from IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+        import from HNBAP_PDU_Descriptions all;</span><br><span style="color: hsl(120, 100%, 40%);">+       import from HNBAP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+  import from RUA_PDU_Descriptions all;</span><br><span style="color: hsl(120, 100%, 40%);">+ import from RUA_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+    import from Iuh_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  type record Iuh_RecvFrom {</span><br><span style="color: hsl(120, 100%, 40%);">+            ConnectionId    connId,</span><br><span style="color: hsl(120, 100%, 40%);">+               HostName        remName,</span><br><span style="color: hsl(120, 100%, 40%);">+              PortNumber      remPort,</span><br><span style="color: hsl(120, 100%, 40%);">+              HostName        locName,</span><br><span style="color: hsl(120, 100%, 40%);">+              PortNumber      locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+              Iuh_PDU 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%);">+  template Iuh_RecvFrom t_Iuh_RecvFrom(template Iuh_PDU msg) := {</span><br><span style="color: hsl(120, 100%, 40%);">+               connId := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+          remName := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         remPort := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         locName := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         locPort := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         msg := 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%);">+   template Iuh_RecvFrom t_Iuh_RecvFrom_HNBAP(template HNBAP_PDU hnbap_msg := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+            connId := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+          remName := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         remPort := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         locName := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         locPort := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         msg := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      hnbap := hnbap_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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   template Iuh_RecvFrom t_Iuh_RecvFrom_RUA(template RUA_PDU rua_msg := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+          connId := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+          remName := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         remPort := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         locName := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         locPort := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         msg := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      rua := rua_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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   type record Iuh_Send {</span><br><span style="color: hsl(120, 100%, 40%);">+                ConnectionId    connId,</span><br><span style="color: hsl(120, 100%, 40%);">+               Iuh_PDU 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%);">+  template Iuh_Send t_Iuh_Send_HNBAP(template ConnectionId connId, template HNBAP_PDU hnbap_msg) := {</span><br><span style="color: hsl(120, 100%, 40%);">+           connId := connId,</span><br><span style="color: hsl(120, 100%, 40%);">+             msg := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      hnbap := hnbap_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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   template Iuh_Send t_Iuh_Send_RUA(template ConnectionId connId, template RUA_PDU rua_msg) := {</span><br><span style="color: hsl(120, 100%, 40%);">+         connId := connId,</span><br><span style="color: hsl(120, 100%, 40%);">+             msg := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      rua := rua_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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   private function IPL4_to_Iuh_RecvFrom(in ASP_RecvFrom pin, out Iuh_RecvFrom pout) {</span><br><span style="color: hsl(120, 100%, 40%);">+           pout.connId := pin.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+            pout.remName := pin.remName;</span><br><span style="color: hsl(120, 100%, 40%);">+          pout.remPort := pin.remPort;</span><br><span style="color: hsl(120, 100%, 40%);">+          pout.locName := pin.locName;</span><br><span style="color: hsl(120, 100%, 40%);">+          pout.locPort := pin.locPort;</span><br><span style="color: hsl(120, 100%, 40%);">+          select (pin.proto.sctp.sinfo_ppid) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  case (19) {</span><br><span style="color: hsl(120, 100%, 40%);">+                           pout.msg.rua := dec_RUA_PDU(pin.msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+                     case (20) {</span><br><span style="color: hsl(120, 100%, 40%);">+                           pout.msg.hnbap := dec_HNBAP_PDU(pin.msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                     case (0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            /* FIXME: lower layers report sinfo_ppid=0: */</span><br><span style="color: hsl(120, 100%, 40%);">+                                pout.msg.hnbap := dec_HNBAP_PDU(pin.msg);</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%);">+                           pout.msg.payload := pin.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%);">+     } with { extension "prototype(fast)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   private function Iuh_to_IPL4_Send(in Iuh_Send pin, out ASP_Send pout) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var integer sctp_ppid;</span><br><span style="color: hsl(120, 100%, 40%);">+                if (ischosen(pin.msg.rua)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  sctp_ppid := 19;</span><br><span style="color: hsl(120, 100%, 40%);">+                      pout.msg := enc_RUA_PDU(pin.msg.rua);</span><br><span style="color: hsl(120, 100%, 40%);">+         } else if (ischosen(pin.msg.hnbap)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 sctp_ppid := 20;</span><br><span style="color: hsl(120, 100%, 40%);">+                      pout.msg := enc_HNBAP_PDU(pin.msg.hnbap);</span><br><span style="color: hsl(120, 100%, 40%);">+             } else { /*TODO: abort?*/</span><br><span style="color: hsl(120, 100%, 40%);">+                     sctp_ppid := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                       pout.msg := pin.msg.payload;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             pout.connId := pin.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+            pout.proto := {</span><br><span style="color: hsl(120, 100%, 40%);">+                       sctp := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             sinfo_stream := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                         sinfo_ppid := sctp_ppid,</span><br><span style="color: hsl(120, 100%, 40%);">+                              remSocks := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                             assocId := 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%);">+    } with { extension "prototype(fast)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   type port Iuh_CODEC_PT message {</span><br><span style="color: hsl(120, 100%, 40%);">+              out     Iuh_Send;</span><br><span style="color: hsl(120, 100%, 40%);">+             in      Iuh_RecvFrom,</span><br><span style="color: hsl(120, 100%, 40%);">+                 ASP_ConnId_ReadyToRelease,</span><br><span style="color: hsl(120, 100%, 40%);">+                    ASP_Event;</span><br><span style="color: hsl(120, 100%, 40%);">+    } with { extension "user IPL4asp_PT</span><br><span style="color: hsl(120, 100%, 40%);">+              out(Iuh_Send -> ASP_Send:function(Iuh_to_IPL4_Send))</span><br><span style="color: hsl(120, 100%, 40%);">+               in(ASP_RecvFrom -> Iuh_RecvFrom: function(IPL4_to_Iuh_RecvFrom);</span><br><span style="color: hsl(120, 100%, 40%);">+              ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;</span><br><span style="color: hsl(120, 100%, 40%);">+            ASP_Event -> ASP_Event: simple)"</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/library/Iuh_CodecPort_CtrlFunct.ttcn b/library/Iuh_CodecPort_CtrlFunct.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..c0c7003</span><br><span>--- /dev/null</span><br><span>+++ b/library/Iuh_CodecPort_CtrlFunct.ttcn</span><br><span>@@ -0,0 +1,43 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module Iuh_CodecPort_CtrlFunct {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  import from Iuh_CodecPort 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%);">+  external function f_IPL4_listen(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout Iuh_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in HostName locName,</span><br><span style="color: hsl(120, 100%, 40%);">+    in PortNumber locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ProtoTuple proto,</span><br><span style="color: hsl(120, 100%, 40%);">+    in OptionList options := {}</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout Iuh_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in HostName remName,</span><br><span style="color: hsl(120, 100%, 40%);">+    in PortNumber remPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    in HostName locName,</span><br><span style="color: hsl(120, 100%, 40%);">+    in PortNumber locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ConnectionId connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ProtoTuple proto,</span><br><span style="color: hsl(120, 100%, 40%);">+    in OptionList options := {}</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_close(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout Iuh_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ConnectionId id,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ProtoTuple proto := { unspecified := {} }</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_setUserData(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout Iuh_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ConnectionId id,</span><br><span style="color: hsl(120, 100%, 40%);">+    in UserData userData</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_getUserData(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout Iuh_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ConnectionId id,</span><br><span style="color: hsl(120, 100%, 40%);">+    out UserData userData</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/library/Iuh_CodecPort_CtrlFunctDef.cc b/library/Iuh_CodecPort_CtrlFunctDef.cc</span><br><span>new file mode 100644</span><br><span>index 0000000..2f08dec</span><br><span>--- /dev/null</span><br><span>+++ b/library/Iuh_CodecPort_CtrlFunctDef.cc</span><br><span>@@ -0,0 +1,55 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#include "IPL4asp_PortType.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "Iuh_CodecPort.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "IPL4asp_PT.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+namespace Iuh__CodecPort__CtrlFunct {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  IPL4asp__Types::Result f__IPL4__listen(</span><br><span style="color: hsl(120, 100%, 40%);">+    Iuh__CodecPort::Iuh__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::HostName& locName,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::PortNumber& locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ProtoTuple& proto,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::OptionList& options)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return f__IPL4__PROVIDER__listen(portRef, locName, locPort, proto, options);</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%);">+  IPL4asp__Types::Result f__IPL4__connect(</span><br><span style="color: hsl(120, 100%, 40%);">+    Iuh__CodecPort::Iuh__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::HostName& remName,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::PortNumber& remPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::HostName& locName,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::PortNumber& locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ConnectionId& connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ProtoTuple& proto,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::OptionList& options)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return f__IPL4__PROVIDER__connect(portRef, remName, remPort,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      locName, locPort, connId, proto, options);</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%);">+  IPL4asp__Types::Result f__IPL4__close(</span><br><span style="color: hsl(120, 100%, 40%);">+    Iuh__CodecPort::Iuh__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ConnectionId& connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ProtoTuple& proto)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+      return f__IPL4__PROVIDER__close(portRef, connId, proto);</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%);">+  IPL4asp__Types::Result f__IPL4__setUserData(</span><br><span style="color: hsl(120, 100%, 40%);">+    Iuh__CodecPort::Iuh__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ConnectionId& connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::UserData& userData)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return f__IPL4__PROVIDER__setUserData(portRef, connId, userData);</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%);">+  IPL4asp__Types::Result f__IPL4__getUserData(</span><br><span style="color: hsl(120, 100%, 40%);">+    Iuh__CodecPort::Iuh__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ConnectionId& connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    IPL4asp__Types::UserData& userData)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return f__IPL4__PROVIDER__getUserData(portRef, connId, userData);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/library/Iuh_Emulation.ttcn b/library/Iuh_Emulation.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..75a95ba</span><br><span>--- /dev/null</span><br><span>+++ b/library/Iuh_Emulation.ttcn</span><br><span>@@ -0,0 +1,212 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module Iuh_Emulation {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Iuh Emulation, runs on top of Iuh_CodecPort.  It multiplexes/demultiplexes</span><br><span style="color: hsl(120, 100%, 40%);">+ * HNBAP and RUA.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * The Iuh_Emulation.main() function processes Iuh primitives from the Iuh</span><br><span style="color: hsl(120, 100%, 40%);">+ * socket via the Iuh_CodecPort, and dispatches them to HNBAP/RUA ports.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Pau Espin Pedrol <pespin@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 Iuh_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Iuh_CodecPort_CtrlFunct all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBAP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBAP_Constants all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBAP_PDU_Contents all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBAP_PDU_Descriptions all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBAP_IEs all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_Constants all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_PDU_Contents all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_PDU_Descriptions all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_IEs all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Iuh_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</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 Misc_Helpers 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 IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from DNS_Helpers all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated IUHEM_EventUpDown {</span><br><span style="color: hsl(120, 100%, 40%);">+   IUHEM_EVENT_DOWN,</span><br><span style="color: hsl(120, 100%, 40%);">+     IUHEM_EVENT_UP</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%);">+/* an event indicating us whether or not a connection is physically up or down. */</span><br><span style="color: hsl(120, 100%, 40%);">+type union IUHEM_Event {</span><br><span style="color: hsl(120, 100%, 40%);">+     IUHEM_EventUpDown       up_down</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 port HNBAP_PT message {</span><br><span style="color: hsl(120, 100%, 40%);">+    inout HNBAP_PDU, IUHEM_Event;</span><br><span style="color: hsl(120, 100%, 40%);">+} with { extension "internal" };</span><br><span style="color: hsl(120, 100%, 40%);">+type port RUA_PT message {</span><br><span style="color: hsl(120, 100%, 40%);">+ inout RUA_PDU, IUHEM_Event;</span><br><span style="color: hsl(120, 100%, 40%);">+} with { extension "internal" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type component Iuh_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Port facing to the SCTP SUT */</span><br><span style="color: hsl(120, 100%, 40%);">+     port Iuh_CODEC_PT Iuh;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Port facing to user upper side stack: */</span><br><span style="color: hsl(120, 100%, 40%);">+   port HNBAP_PT HNBAP;</span><br><span style="color: hsl(120, 100%, 40%);">+  port RUA_PT RUA;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var Iuh_conn_parameters g_pars;</span><br><span style="color: hsl(120, 100%, 40%);">+       var charstring g_Iuh_id;</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer g_self_conn_id := -1;</span><br><span style="color: hsl(120, 100%, 40%);">+     var IPL4asp_Types.ConnectionId g_last_conn_id := -1; /* server only */</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 Iuh_conn_parameters {</span><br><span style="color: hsl(120, 100%, 40%);">+        HostName remote_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+   PortNumber remote_sctp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+  HostName local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+    PortNumber local_sctp_port</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 tr_Iuh_RecvFrom_R(template Iuh_PDU msg)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on Iuh_Emulation_CT return template Iuh_RecvFrom {</span><br><span style="color: hsl(120, 100%, 40%);">+    var template Iuh_RecvFrom mrf := {</span><br><span style="color: hsl(120, 100%, 40%);">+            connId := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+          remName := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         remPort := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         locName := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         locPort := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+         msg := msg</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     return mrf;</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 template (value) SctpTuple ts_SCTP(template (omit) integer ppid := omit) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       sinfo_stream := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ sinfo_ppid := ppid,</span><br><span style="color: hsl(120, 100%, 40%);">+   remSocks := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+     assocId := 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%);">+private template PortEvent tr_SctpAssocChange := {</span><br><span style="color: hsl(120, 100%, 40%);">+     sctpEvent := {</span><br><span style="color: hsl(120, 100%, 40%);">+                sctpAssocChange := ?</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 template PortEvent tr_SctpPeerAddrChange := {</span><br><span style="color: hsl(120, 100%, 40%);">+   sctpEvent := {</span><br><span style="color: hsl(120, 100%, 40%);">+                sctpPeerAddrChange := ?</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 emu_is_server() runs on Iuh_Emulation_CT return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+    return g_pars.remote_sctp_port == -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%);">+/* Resolve TCP/IP connection identifier depending on server/client mode */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_iuh_conn_id() runs on Iuh_Emulation_CT</span><br><span style="color: hsl(120, 100%, 40%);">+return IPL4asp_Types.ConnectionId {</span><br><span style="color: hsl(120, 100%, 40%);">+ var IPL4asp_Types.ConnectionId conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (not emu_is_server()) {</span><br><span style="color: hsl(120, 100%, 40%);">+            conn_id := g_self_conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              conn_id := g_last_conn_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%);">+   if (conn_id == -1) { /* Just to be sure */</span><br><span style="color: hsl(120, 100%, 40%);">+            f_shutdown(__FILE__, __LINE__, fail, "Connection is not established");</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 conn_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 main(Iuh_conn_parameters p, charstring id) runs on Iuh_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var Result res;</span><br><span style="color: hsl(120, 100%, 40%);">+       g_pars := p;</span><br><span style="color: hsl(120, 100%, 40%);">+  g_Iuh_id := id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     map(self:Iuh, system:Iuh_CODEC_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (emu_is_server()) {</span><br><span style="color: hsl(120, 100%, 40%);">+                res := Iuh_CodecPort_CtrlFunct.f_IPL4_listen(Iuh, p.local_ip, p.local_sctp_port, { sctp := valueof(ts_SCTP) });</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              res := Iuh_CodecPort_CtrlFunct.f_IPL4_connect(Iuh, p.remote_ip, p.remote_sctp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                           p.local_ip, p.local_sctp_port, -1, { sctp := valueof(ts_SCTP) });</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (not ispresent(res.connId)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_shutdown(__FILE__, __LINE__, fail, "Could not connect Iuh socket, check your configuration");</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     g_self_conn_id := res.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* notify user about SCTP establishment */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (p.remote_sctp_port != -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               HNBAP.send(IUHEM_Event:{up_down:=IUHEM_EVENT_UP});</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%);">+   while (true) {</span><br><span style="color: hsl(120, 100%, 40%);">+                var Iuh_RecvFrom mrf;</span><br><span style="color: hsl(120, 100%, 40%);">+         var HNBAP_PDU hnbap_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+              var RUA_PDU rua_msg;</span><br><span style="color: hsl(120, 100%, 40%);">+          var ASP_Event asp_evt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         /* HNBAP from client: pass on transparently */</span><br><span style="color: hsl(120, 100%, 40%);">+                [] HNBAP.receive(HNBAP_PDU:?) -> value hnbap_msg {</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* Pass message through */</span><br><span style="color: hsl(120, 100%, 40%);">+                    Iuh.send(t_Iuh_Send_HNBAP(f_iuh_conn_id(), hnbap_msg));</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* RUA from client: pass on transparently */</span><br><span style="color: hsl(120, 100%, 40%);">+          [] RUA.receive(RUA_PDU:?) -> value rua_msg {</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* Pass message through */</span><br><span style="color: hsl(120, 100%, 40%);">+                    Iuh.send(t_Iuh_Send_RUA(f_iuh_conn_id(), rua_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%);">+           /* Iuh received from peer (HNBGW or HnodeB) */</span><br><span style="color: hsl(120, 100%, 40%);">+                [] Iuh.receive(tr_Iuh_RecvFrom_R(?)) -> value mrf {</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (not match(mrf.connId, f_iuh_conn_id())) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         f_shutdown(__FILE__, __LINE__, fail, log2str("Received message from unexpected conn_id!", mrf));</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 (match(mrf, t_Iuh_RecvFrom_HNBAP(?))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            HNBAP.send(mrf.msg.hnbap);</span><br><span style="color: hsl(120, 100%, 40%);">+                    } else if (match(mrf, t_Iuh_RecvFrom_RUA(?))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               RUA.send(mrf.msg.rua);</span><br><span style="color: hsl(120, 100%, 40%);">+                        } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              /* TODO: special handling, as it contains multiple HNB connection ids */</span><br><span style="color: hsl(120, 100%, 40%);">+                              f_shutdown(__FILE__, __LINE__, fail, log2str("UNEXPECTED MESSAGE RECEIVED!", mrf));</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%);">+             [] Iuh.receive(tr_SctpAssocChange) { }</span><br><span style="color: hsl(120, 100%, 40%);">+                [] Iuh.receive(tr_SctpPeerAddrChange)  { }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* server only */</span><br><span style="color: hsl(120, 100%, 40%);">+             [] Iuh.receive(ASP_Event:{connOpened:=?}) -> value asp_evt {</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (not emu_is_server()) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            f_shutdown(__FILE__, __LINE__, fail, log2str("Unexpected event receiver in client mode", asp_evt));</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+                     g_last_conn_id := asp_evt.connOpened.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+                  log("Established a new Iuh connection (conn_id=", g_last_conn_id, ")");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                 HNBAP.send(IUHEM_Event:{up_down:=IUHEM_EVENT_UP}); /* TODO: send g_last_conn_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%);">+           [] Iuh.receive(ASP_Event:{connClosed:=?}) -> value asp_evt {</span><br><span style="color: hsl(120, 100%, 40%);">+                       log("Iuh: Closed");</span><br><span style="color: hsl(120, 100%, 40%);">+                 g_self_conn_id := -1;</span><br><span style="color: hsl(120, 100%, 40%);">+                 HNBAP.send(IUHEM_Event:{up_down:=IUHEM_EVENT_DOWN});  /* TODO: send asp_evt.connClosed.connId */</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (not emu_is_server()) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            self.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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/library/Iuh_Types.ttcn b/library/Iuh_Types.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..17f9c5f</span><br><span>--- /dev/null</span><br><span>+++ b/library/Iuh_Types.ttcn</span><br><span>@@ -0,0 +1,36 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Osmocom Iuh Interface Types</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Pau Espin Pedrol <pespin@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%);">+ /* Iuh Codec Port Types</span><br><span style="color: hsl(120, 100%, 40%);">+  *</span><br><span style="color: hsl(120, 100%, 40%);">+  * (C) 2019 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+module Iuh_Types {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBAP_PDU_Descriptions all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBAP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_PDU_Descriptions all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type union Iuh_PDU {</span><br><span style="color: hsl(120, 100%, 40%);">+     HNBAP_PDU       hnbap,</span><br><span style="color: hsl(120, 100%, 40%);">+        RUA_PDU         rua,</span><br><span style="color: hsl(120, 100%, 40%);">+  octetstring     payload</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/library/hnbap/HNBAP_Templates.ttcn b/library/hnbap/HNBAP_Templates.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..44704f8</span><br><span>--- /dev/null</span><br><span>+++ b/library/hnbap/HNBAP_Templates.ttcn</span><br><span>@@ -0,0 +1,135 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* HNBAP Templates in TTCN-3</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 Pau Espin Pedrol <pespin@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%);">+module HNBAP_Templates {</span><br><span style="color: hsl(120, 100%, 40%);">+</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 HNBAP_IEs all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBAP_CommonDataTypes all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBAP_Constants all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBAP_Containers all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBAP_PDU_Contents all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBAP_PDU_Descriptions all;</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%);">+ * 3GPP TS 25.469</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) Cause ts_HnbapCause(template (value) CauseRadioNetwork c) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    radioNetwork := c</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%);">+/* 9.1.3 HNB REGISTER REQUEST */</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) HNBAP_PDU</span><br><span style="color: hsl(120, 100%, 40%);">+tr_HNBAP_HNBRegisterRequest(template (present) octetstring hNB_Identity_Info := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+             template (present) OCT3 plmnid := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+          template (present) BIT28 cell_identity := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+          template (present) OCT2 lac := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+             template (present) OCT1 rac := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+             template (present) OCT2 sac := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       initiatingMessage := {</span><br><span style="color: hsl(120, 100%, 40%);">+                procedureCode := id_HNBRegister,</span><br><span style="color: hsl(120, 100%, 40%);">+              criticality := reject,</span><br><span style="color: hsl(120, 100%, 40%);">+                value_ := {</span><br><span style="color: hsl(120, 100%, 40%);">+                   hNBRegisterRequest := {</span><br><span style="color: hsl(120, 100%, 40%);">+                               protocolIEs := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      {</span><br><span style="color: hsl(120, 100%, 40%);">+                                             id := HNBAP_Constants.id_HNB_Identity,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                criticality := reject,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                value_ := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   hNB_Identity := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                             hNB_Identity_Info := hNB_Identity_Info,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               iE_Extensions := 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%);">+                                          id := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              criticality := reject,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                value_ := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   hNB_Location_Information := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 macroCoverageInfo := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                    geographicalCoordinates := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      iE_Extensions := 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%);">+                                          id := 9,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              criticality := reject,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                value_ := { pLMNidentity := plmnid }</span><br><span style="color: hsl(120, 100%, 40%);">+                                  }, {</span><br><span style="color: hsl(120, 100%, 40%);">+                                          id := 11,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             criticality := reject,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                value_ := { cellIdentity := cell_identity }</span><br><span style="color: hsl(120, 100%, 40%);">+                                   }, {</span><br><span style="color: hsl(120, 100%, 40%);">+                                          id := 6,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              criticality := reject,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                value_ := { lAC := lac }</span><br><span style="color: hsl(120, 100%, 40%);">+                                      }, {</span><br><span style="color: hsl(120, 100%, 40%);">+                                          id := 7,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              criticality := reject,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                value_ := { rAC := rac }</span><br><span style="color: hsl(120, 100%, 40%);">+                                      }, {</span><br><span style="color: hsl(120, 100%, 40%);">+                                          id := 10,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             criticality := reject,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                value_ := { sAC := sac }</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%);">+                            protocolExtensions := omit</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* 9.1.4 HNB REGISTER ACCEPT */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) HNBAP_PDU</span><br><span style="color: hsl(120, 100%, 40%);">+ts_HNBAP_HNBRegisterAccept(template (value) uint16_t rnc_id) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      successfulOutcome := {</span><br><span style="color: hsl(120, 100%, 40%);">+                procedureCode := id_HNBRegister,</span><br><span style="color: hsl(120, 100%, 40%);">+              criticality := reject,</span><br><span style="color: hsl(120, 100%, 40%);">+                value_ := {</span><br><span style="color: hsl(120, 100%, 40%);">+                   hNBRegisterAccept := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                protocolIEs := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      {</span><br><span style="color: hsl(120, 100%, 40%);">+                                             id := HNBAP_Constants.id_RNC_ID,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              criticality := reject,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                value_ := { RNC_ID := rnc_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%);">+                            protocolExtensions := omit /* TODO: Mux Port Number (optional) 9.2.29 */</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%);">+/* 9.1.5 HNB REGISTER REJECT */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) HNBAP_PDU</span><br><span style="color: hsl(120, 100%, 40%);">+ts_HNBAP_HNBRegisterReject(template (value) Cause cause) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    unsuccessfulOutcome := {</span><br><span style="color: hsl(120, 100%, 40%);">+              procedureCode := id_HNBRegister,</span><br><span style="color: hsl(120, 100%, 40%);">+              criticality := reject,</span><br><span style="color: hsl(120, 100%, 40%);">+                value_ := {</span><br><span style="color: hsl(120, 100%, 40%);">+                   HNBRegisterReject := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                protocolIEs := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      {</span><br><span style="color: hsl(120, 100%, 40%);">+                                             id := HNBAP_Constants.id_Cause,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               criticality := ignore,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                value_ := { Cause := cause }</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%);">+                            protocolExtensions := omit /* TODO: CriticalityDiagnostics, BackoffTimer */</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%);">+}</span><br><span>diff --git a/library/rua/RUA_Templates.ttcn b/library/rua/RUA_Templates.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..b7387bf</span><br><span>--- /dev/null</span><br><span>+++ b/library/rua/RUA_Templates.ttcn</span><br><span>@@ -0,0 +1,22 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* RUA Templates in TTCN-3</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 Pau Espin Pedrol <pespin@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%);">+module RUA_Templates {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_IEs all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_CommonDataTypes all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_Constants all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_Containers all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_PDU_Contents all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RUA_PDU_Descriptions all;</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: Add RUA Templates here */</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/+/26336">change 26336</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/+/26336"/><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: I7227917148e98a2c777f4b05d8d2eca6e9c121b7 </div>
<div style="display:none"> Gerrit-Change-Number: 26336 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@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-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>