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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">hnodeb: Add initial infra to emulate HNB LL socket iface<br><br>Change-Id: Ia864a672643a0e42f5afea6fd901e621478c87c0<br>---<br>M hnodeb/HNBGW_ConnectionHandler.ttcn<br>M hnodeb/HNB_Tests.default<br>M hnodeb/HNB_Tests.ttcn<br>M hnodeb/gen_links.sh<br>M hnodeb/regen_makefile.sh<br>A library/HNBLLIF_CodecPort.ttcn<br>A library/HNBLLIF_Templates.ttcn<br>A library/HNBLLIF_Types.ttcn<br>M library/Iuh_CodecPort.ttcn<br>9 files changed, 820 insertions(+), 37 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/hnodeb/HNBGW_ConnectionHandler.ttcn b/hnodeb/HNBGW_ConnectionHandler.ttcn</span><br><span>index 071e3e8..554c35f 100644</span><br><span>--- a/hnodeb/HNBGW_ConnectionHandler.ttcn</span><br><span>+++ b/hnodeb/HNBGW_ConnectionHandler.ttcn</span><br><span>@@ -27,11 +27,19 @@</span><br><span> </span><br><span> import from Iuh_Emulation all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBLLIF_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBLLIF_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBLLIF_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* this component represents a single Iuh connection at the HNBGW. */</span><br><span> type component HNBGW_ConnHdlr extends StatsD_ConnHdlr {</span><br><span>    port TELNETasp_PT HNBVTY;</span><br><span>    port HNBAP_PT HNBAP;</span><br><span>         port RUA_PT RUA;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* HNBLLIF Interface of HNodeB */</span><br><span style="color: hsl(120, 100%, 40%);">+     port HNBLLIF_CODEC_PT LLSK;</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer g_llsk_conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        var TestHdlrParams g_pars;</span><br><span> </span><br><span>       var boolean g_vty_initialized := false;</span><br><span>@@ -47,12 +55,11 @@</span><br><span> }</span><br><span> </span><br><span> /* initialize all parameters */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_HNBGW_ConnHdlr_init(TestHdlrParams pars) runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-   var integer i := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+function f_HNBGW_ConnHdlr_init(charstring id, TestHdlrParams pars) runs on HNBGW_ConnHdlr {</span><br><span>     var Iuh_Emulation_CT vc_Iuh;</span><br><span> </span><br><span>     g_pars := valueof(pars);</span><br><span style="color: hsl(0, 100%, 40%);">-        vc_Iuh := Iuh_Emulation_CT.create("HNBGW" & int2str(i));</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_Iuh := Iuh_Emulation_CT.create(id & "-HNBGW");</span><br><span>      connect(self:HNBAP, vc_Iuh:HNBAP);</span><br><span>   connect(self:RUA, vc_Iuh:RUA);</span><br><span> </span><br><span>@@ -61,18 +68,51 @@</span><br><span>     iuh_pars.remote_sctp_port := -1;</span><br><span>     iuh_pars.local_ip := g_pars.hnbgw_addr;</span><br><span>      iuh_pars.local_sctp_port  := g_pars.hnbgw_port;</span><br><span style="color: hsl(0, 100%, 40%);">- vc_Iuh.start(Iuh_Emulation.main(iuh_pars, "Iuh" & int2str(i)));</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_Iuh.start(Iuh_Emulation.main(iuh_pars, id & "-Iuh"));</span><br><span> </span><br><span>   f_HNBGW_ConnHdlr_init_vty();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Connect to HNB on LLSK and do HELLO ping-pong  */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_start_hnbllif(LLSK, id & "-LLSK", g_pars.hnbllif_sk_path,  g_llsk_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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_start_hnbllif(HNBLLIF_CODEC_PT pt, charstring id, charstring hnbllif_sk_path, out integer hnbllif_conn_id) {</span><br><span style="color: hsl(120, 100%, 40%);">+   timer T := 2.0;</span><br><span style="color: hsl(120, 100%, 40%);">+       var HNBLLIF_send_data sd;</span><br><span style="color: hsl(120, 100%, 40%);">+     var HNBLLIF_Message last_hello_cnf;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (hnbllif_sk_path == "") {</span><br><span style="color: hsl(120, 100%, 40%);">+                hnbllif_conn_id := -1;</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%);">+     hnbllif_conn_id := f_hnbllif_connect(pt, hnbllif_sk_path);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      pt.send(t_SD_HNBLLIF(hnbllif_conn_id, ts_HNBLLIF_CTL_HELLO_REQ(HNBLL_IF_SAPI_CTL, HNBLLIF_Types.mp_hnbllif_version)));</span><br><span style="color: hsl(120, 100%, 40%);">+        alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] as_hnbllif_hello_cnf(pt, hnbllif_conn_id, last_hello_cnf, HNBLL_IF_SAPI_CTL, HNBLLIF_Types.mp_hnbllif_version);</span><br><span style="color: hsl(120, 100%, 40%);">+    [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for HNBLLIF HELLO.REQ SAPI=CTL");</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     pt.send(t_SD_HNBLLIF(hnbllif_conn_id, ts_HNBLLIF_CTL_HELLO_REQ(HNBLL_IF_SAPI_IUH, 0)));</span><br><span style="color: hsl(120, 100%, 40%);">+       alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] as_hnbllif_hello_cnf(pt, hnbllif_conn_id, last_hello_cnf, HNBLL_IF_SAPI_IUH, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for HNBLLIF HELLO.REQ SAPI=IUH");</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> }</span><br><span> </span><br><span> type record TestHdlrParams {</span><br><span style="color: hsl(120, 100%, 40%);">+    charstring hnbllif_sk_path, /* "" means don't connect */</span><br><span>       charstring hnbgw_addr,</span><br><span>       charstring hnodeb_addr,</span><br><span>      integer hnbgw_port,</span><br><span>  uint16_t rnc_id,</span><br><span>     charstring hNB_Identity_Info,</span><br><span style="color: hsl(0, 100%, 40%);">-   OCT3 plmnid,</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t mcc,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t mnc,</span><br><span>        uint32_t cell_identity,</span><br><span>      uint16_t lac,</span><br><span>        uint8_t rac,</span><br><span>@@ -82,23 +122,61 @@</span><br><span> /* Note: Do not use valueof() to get a value of this template, use</span><br><span>  * f_gen_test_hdlr_pars() instead in order to get a configuration. */</span><br><span> template (value) TestHdlrParams t_def_TestHdlrPars := {</span><br><span style="color: hsl(120, 100%, 40%);">+ hnbllif_sk_path := HNBLL_SOCK_DEFAULT,</span><br><span>       hnbgw_addr := "127.0.0.1",</span><br><span>         hnodeb_addr := "127.0.0.1",</span><br><span>        hnbgw_port := 29169,</span><br><span>         rnc_id := 23,</span><br><span>        hNB_Identity_Info := "OsmoHNodeB",</span><br><span style="color: hsl(0, 100%, 40%);">-    plmnid := '00F110'O,</span><br><span style="color: hsl(120, 100%, 40%);">+  mcc := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+     mnc := 1,</span><br><span>    cell_identity := 1,</span><br><span>  lac := 2,</span><br><span>    rac := 3,</span><br><span>    sac := 4</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* HNBLLIF socket may at any time receive a new INFO.ind */</span><br><span style="color: hsl(120, 100%, 40%);">+altstep as_hnbllif_hello_cnf(HNBLLIF_CODEC_PT pt, integer hnbllif_conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                            out HNBLLIF_Message last_hello_cnf,</span><br><span style="color: hsl(120, 100%, 40%);">+                           template (present) HNBLLIF_Sapi exp_sapi := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                template (present) uint16_t exp_version := ?) {</span><br><span style="color: hsl(120, 100%, 40%);">+       var HNBLLIF_send_data sd;</span><br><span style="color: hsl(120, 100%, 40%);">+     [] pt.receive(t_SD_HNBLLIF(hnbllif_conn_id, tr_HNBLLIF_CTL_HELLO_CNF(exp_sapi, exp_version))) -> value sd {</span><br><span style="color: hsl(120, 100%, 40%);">+                last_hello_cnf := sd.data;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] pt.receive(t_SD_HNBLLIF(hnbllif_conn_id, tr_HNBLLIF_CTL_HELLO_CNF(?))) -> value sd {</span><br><span style="color: hsl(120, 100%, 40%);">+            Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Invalid API_VERSION received");</span><br><span 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_llsk_rx(template (present) HNBLLIF_Message exp_tmpl) runs on HNBGW_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+return template (present) HNBLLIF_send_data {</span><br><span style="color: hsl(120, 100%, 40%);">+ return t_SD_HNBLLIF(g_llsk_conn_id, exp_tmpl);</span><br><span 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_llsk_tx(template (value) HNBLLIF_Message tx_msg) runs on HNBGW_ConnHdlr</span><br><span style="color: hsl(120, 100%, 40%);">+return template (value) HNBLLIF_send_data {</span><br><span style="color: hsl(120, 100%, 40%);">+  return ts_SD_HNBLLIF(g_llsk_conn_id, tx_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_enc_mcc_mnc(uint16_t mcc_uint, uint16_t mnc_uint) return OCT3 {</span><br><span style="color: hsl(120, 100%, 40%);">+        var hexstring mnc;</span><br><span style="color: hsl(120, 100%, 40%);">+    var hexstring mcc := int2hex(mcc_uint, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (mnc_uint < 100) {</span><br><span style="color: hsl(120, 100%, 40%);">+              mnc := int2hex(mnc_uint, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+          return hex2oct(mcc[1] & mcc[0] & 'F'H & mcc[2] & mnc[1] & mnc[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              mnc := int2hex(mnc_uint, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+          return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> function f_handle_hnbap_hnb_register_req()</span><br><span> runs on HNBGW_ConnHdlr {</span><br><span>   HNBAP.receive(tr_HNBAP_HNBRegisterRequest(char2oct(g_pars.hNB_Identity_Info),</span><br><span style="color: hsl(0, 100%, 40%);">-                                             g_pars.plmnid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                f_enc_mcc_mnc(g_pars.mcc, g_pars.mnc),</span><br><span>                                               int2bit(g_pars.cell_identity, 28),</span><br><span>                                                   int2oct(g_pars.lac, 2),</span><br><span>                                              int2oct(g_pars.rac, 1),</span><br><span>diff --git a/hnodeb/HNB_Tests.default b/hnodeb/HNB_Tests.default</span><br><span>index a06dcc6..c385b9a 100644</span><br><span>--- a/hnodeb/HNB_Tests.default</span><br><span>+++ b/hnodeb/HNB_Tests.default</span><br><span>@@ -20,6 +20,7 @@</span><br><span> *.STATSVTY.CTRL_CLIENT_CLEANUP_LINEFEED := "yes"</span><br><span> *.STATSVTY.CTRL_DETECT_CONNECTION_ESTABLISHMENT_RESULT := "yes"</span><br><span> *.STATSVTY.PROMPT1 := "OsmoHNodeB> "</span><br><span style="color: hsl(120, 100%, 40%);">+*.LLSK.socket_type := "SEQPACKET"</span><br><span> </span><br><span> [MODULE_PARAMETERS]</span><br><span> Osmocom_VTY_Functions.mp_prompt_prefix := "OsmoHNodeB";</span><br><span>diff --git a/hnodeb/HNB_Tests.ttcn b/hnodeb/HNB_Tests.ttcn</span><br><span>index 7a668dd..59dd1ee 100644</span><br><span>--- a/hnodeb/HNB_Tests.ttcn</span><br><span>+++ b/hnodeb/HNB_Tests.ttcn</span><br><span>@@ -38,10 +38,16 @@</span><br><span> import from TELNETasp_PortType all;</span><br><span> </span><br><span> import from HNBAP_Templates 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> </span><br><span> import from HNBGW_ConnectionHandler all;</span><br><span> import from Iuh_Emulation all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBLLIF_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBLLIF_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HNBLLIF_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> modulepar {</span><br><span>       /* IP address at which the HNodeB can be reached */</span><br><span>  charstring mp_hnodeb_ip := "127.0.0.1";</span><br><span>@@ -49,11 +55,23 @@</span><br><span>      /* IP address at which the test binds */</span><br><span>     charstring mp_hnbgw_iuh_ip := "127.0.0.1";</span><br><span>         integer mp_hnbgw_iuh_port := 29169;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ charstring mp_hnbllif_sk_path := HNBLL_SOCK_DEFAULT;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+const hexstring ranap_cm_service_req := '001340400000060003400100000f40060000f11028b6003a40080000f110ffffffff0010400e0d052411035758a605f44e9d4aef004f400300001c0056400500f1100017'H;</span><br><span style="color: hsl(120, 100%, 40%);">+const hexstring ranap_auth_req := '00144032000002001040262505120217dc146aeac56cb5ff6d5fb51f47f19220108ca5a6d0c8110000b9e9272498872764003b400100'H;</span><br><span style="color: hsl(120, 100%, 40%);">+const hexstring ranap_auth_resp := '001440140000010010400d0c0554ccbdd0302104002f3ae4'H;</span><br><span style="color: hsl(120, 100%, 40%);">+const hexstring ranap_paging := '000e401e0000030003400100001740095000010100000000f10040400500b6cf4773'H;</span><br><span style="color: hsl(120, 100%, 40%);">+const hexstring iu_release_compl := '20010003000000'H;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type component test_CT extends CTRL_Adapter_CT {</span><br><span>     port TELNETasp_PT HNBVTY;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* HNBLLIF Interface of HNodeB */</span><br><span style="color: hsl(120, 100%, 40%);">+     port HNBLLIF_CODEC_PT LLSK;</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer g_llsk_conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        /* global test case guard timer (actual timeout value is set in f_init()) */</span><br><span>         timer T_guard := 30.0;</span><br><span> }</span><br><span>@@ -83,6 +101,12 @@</span><br><span>    f_vty_set_prompts(HNBVTY);</span><br><span>   f_vty_transceive(HNBVTY, "enable");</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_init_hnbllif() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     map(self:LLSK, system:LLSK);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_start_hnbllif(LLSK, testcasename(), mp_hnbllif_sk_path, g_llsk_conn_id);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* global initialization function */</span><br><span> function f_init(float guard_timeout := 30.0) runs on test_CT {</span><br><span>    var integer bssap_idx;</span><br><span>@@ -91,8 +115,6 @@</span><br><span>  activate(as_Tguard());</span><br><span> </span><br><span>   f_init_vty("VirtHNBGW");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* TODO: Wait for Iuh connection to be established */</span><br><span> }</span><br><span> </span><br><span> friend function f_shutdown_helper() runs on test_CT {</span><br><span>@@ -101,9 +123,10 @@</span><br><span>       mtc.stop;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-friend function f_gen_test_hdlr_pars() return TestHdlrParams {</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_gen_test_hdlr_pars() runs on test_CT return TestHdlrParams {</span><br><span> </span><br><span>        var TestHdlrParams pars := valueof(t_def_TestHdlrPars);</span><br><span style="color: hsl(120, 100%, 40%);">+       pars.hnbllif_sk_path := mp_hnbllif_sk_path;</span><br><span>  pars.hnodeb_addr := mp_hnodeb_ip;</span><br><span>    pars.hnbgw_addr := mp_hnbgw_iuh_ip;</span><br><span>  pars.hnbgw_port := mp_hnbgw_iuh_port;</span><br><span>@@ -113,27 +136,10 @@</span><br><span> type function void_fn(charstring id) runs on HNBGW_ConnHdlr;</span><br><span> </span><br><span> /* helper function to create and connect a HNBGW_ConnHdlr component */</span><br><span style="color: hsl(0, 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(0, 100%, 40%);">-   /*connect(vc_conn:RAN, g_bssap[bssap_idx].vc_RAN:PROC);</span><br><span style="color: hsl(0, 100%, 40%);">- connect(vc_conn:MGCP_PROC, vc_MGCP:MGCP_PROC);</span><br><span style="color: hsl(0, 100%, 40%);">-  connect(vc_conn:RSL, bts[0].rsl.vc_RSL:CLIENT_PT);</span><br><span style="color: hsl(0, 100%, 40%);">-      connect(vc_conn:RSL_PROC, bts[0].rsl.vc_RSL:RSL_PROC);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (isvalue(bts[1])) {</span><br><span style="color: hsl(0, 100%, 40%);">-          connect(vc_conn:RSL1, bts[1].rsl.vc_RSL:CLIENT_PT);</span><br><span style="color: hsl(0, 100%, 40%);">-             connect(vc_conn:RSL1_PROC, bts[1].rsl.vc_RSL:RSL_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_connect_handler(inout HNBGW_ConnHdlr vc_conn, TestHdlrParams pars) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      if (pars.hnbllif_sk_path != "") {</span><br><span style="color: hsl(120, 100%, 40%);">+           map(vc_conn:LLSK, system:LLSK);</span><br><span>      }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (isvalue(bts[2])) {</span><br><span style="color: hsl(0, 100%, 40%);">-          connect(vc_conn:RSL2, bts[2].rsl.vc_RSL:CLIENT_PT);</span><br><span style="color: hsl(0, 100%, 40%);">-             connect(vc_conn:RSL2_PROC, bts[2].rsl.vc_RSL:RSL_PROC);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       connect(vc_conn:BSSAP, g_bssap[bssap_idx].vc_RAN:CLIENT);</span><br><span style="color: hsl(0, 100%, 40%);">-       if (mp_enable_lcs_tests) {</span><br><span style="color: hsl(0, 100%, 40%);">-              connect(vc_conn:BSSAP_LE, g_bssap_le.vc_BSSAP_LE:CLIENT);</span><br><span style="color: hsl(0, 100%, 40%);">-               connect(vc_conn:BSSAP_LE_PROC, g_bssap_le.vc_BSSAP_LE:PROC);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);</span><br><span style="color: hsl(0, 100%, 40%);">-     connect(vc_conn:MGCP_MULTI, vc_MGCP:MGCP_CLIENT_MULTI);</span><br><span style="color: hsl(0, 100%, 40%);">- connect(vc_conn:STATSD_PROC, vc_STATSD:STATSD_PROC);*/</span><br><span> }</span><br><span> </span><br><span> function f_start_handler_create(TestHdlrParams pars)</span><br><span>@@ -141,7 +147,7 @@</span><br><span>        var charstring id := testcasename();</span><br><span>         var HNBGW_ConnHdlr vc_conn;</span><br><span>  vc_conn := HNBGW_ConnHdlr.create(id);</span><br><span style="color: hsl(0, 100%, 40%);">-   f_connect_handler(vc_conn);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_connect_handler(vc_conn, pars);</span><br><span>    return vc_conn;</span><br><span> }</span><br><span> </span><br><span>@@ -168,27 +174,29 @@</span><br><span> /* first function inside ConnHdlr component; sets g_pars + starts function */</span><br><span> private function f_handler_init(void_fn fn, charstring id, TestHdlrParams pars)</span><br><span> runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(0, 100%, 40%);">-        f_HNBGW_ConnHdlr_init(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_HNBGW_ConnHdlr_init(id, pars);</span><br><span>     HNBAP.receive(IUHEM_Event:{up_down:=IUHEM_EVENT_UP}); /* Wait for HNB to connect to us */</span><br><span>    fn.apply(id);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_tc_hnb_register_request(charstring id) runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_hnb_register_request_accept(charstring id) runs on HNBGW_ConnHdlr {</span><br><span>  f_handle_hnbap_hnb_register_req();</span><br><span style="color: hsl(120, 100%, 40%);">+    LLSK.receive(f_llsk_rx(tr_HNBLLIF_IUH_CONFIGURE_IND(g_pars.mcc, g_pars.mnc, g_pars.cell_identity,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               g_pars.lac, g_pars.rac, g_pars.sac, g_pars.rnc_id)));</span><br><span>      f_sleep(1.0);</span><br><span> }</span><br><span> testcase TC_hnb_register_request_accept() runs on test_CT {</span><br><span>    var HNBGW_ConnHdlr vc_conn;</span><br><span> </span><br><span>      f_init();</span><br><span style="color: hsl(0, 100%, 40%);">-       vc_conn := f_start_handler(refers(f_tc_hnb_register_request));</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_conn := f_start_handler(refers(f_tc_hnb_register_request_accept));</span><br><span>        vc_conn.done;</span><br><span>        f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span> private function f_tc_hnb_register_reject(charstring id) runs on HNBGW_ConnHdlr {</span><br><span>   HNBAP.receive(tr_HNBAP_HNBRegisterRequest(char2oct(g_pars.hNB_Identity_Info),</span><br><span style="color: hsl(0, 100%, 40%);">-                                             g_pars.plmnid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                f_enc_mcc_mnc(g_pars.mcc, g_pars.mnc),</span><br><span>                                               int2bit(g_pars.cell_identity, 28),</span><br><span>                                                   int2oct(g_pars.lac, 2),</span><br><span>                                              int2oct(g_pars.rac, 1),</span><br><span>@@ -206,9 +214,74 @@</span><br><span>     f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_mo_conn(charstring id) runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+  const integer context_id := 30;</span><br><span style="color: hsl(120, 100%, 40%);">+       const bitstring context_id_bstr := '000000000000000000011110'B; /* encoded context_id */</span><br><span style="color: hsl(120, 100%, 40%);">+      const Establishment_Cause est_cause := normal_call;</span><br><span style="color: hsl(120, 100%, 40%);">+   f_handle_hnbap_hnb_register_req();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  LLSK.receive(f_llsk_rx(tr_HNBLLIF_IUH_CONFIGURE_IND(g_pars.mcc, g_pars.mnc, g_pars.cell_identity,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               g_pars.lac, g_pars.rac, g_pars.sac, g_pars.rnc_id)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Now an UE attempts CM Service Request: */</span><br><span style="color: hsl(120, 100%, 40%);">+  LLSK.send(f_llsk_tx(ts_HNBLLIF_IUH_CONN_ESTABLISH_REQ(context_id, 1, enum2int(est_cause), hex2oct(ranap_cm_service_req))));</span><br><span style="color: hsl(120, 100%, 40%);">+   /* The related RUA Connect + RANAP message is received on Iuh: */</span><br><span style="color: hsl(120, 100%, 40%);">+     RUA.receive(tr_RUA_Connect(ps_domain, context_id_bstr, est_cause, hex2oct(ranap_cm_service_req)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Now HNBGW answers with RUA-DirectTransfer(RANAP-AuthenticationRequest) */</span><br><span style="color: hsl(120, 100%, 40%);">+  RUA.send(ts_RUA_DirectTransfer(ps_domain, context_id_bstr, hex2oct(ranap_auth_req)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Now on LLSK first the Conn establishment is confirmed and then we receive data */</span><br><span style="color: hsl(120, 100%, 40%);">+  LLSK.receive(f_llsk_rx(tr_HNBLLIF_IUH_CONN_ESTABLISH_CNF(context_id, 1, 0)));</span><br><span style="color: hsl(120, 100%, 40%);">+ LLSK.receive(f_llsk_rx(tr_HNBLLIF_IUH_CONN_DATA_IND(context_id, 1, hex2oct(ranap_auth_req))));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* UE answers with RANAPAuthenticationResponse: */</span><br><span style="color: hsl(120, 100%, 40%);">+    LLSK.send(f_llsk_tx(ts_HNBLLIF_IUH_CONN_DATA_REQ(context_id, 1, hex2oct(ranap_auth_resp))));</span><br><span style="color: hsl(120, 100%, 40%);">+  RUA.receive(tr_RUA_DirectTransfer(ps_domain, context_id_bstr, hex2oct(ranap_auth_resp)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* UE sends Iu Release Complete to release the conn */</span><br><span style="color: hsl(120, 100%, 40%);">+        LLSK.send(f_llsk_tx(ts_HNBLLIF_IUH_CONN_RELEASE_REQ(context_id, 1, 0, 0, hex2oct(iu_release_compl))));</span><br><span style="color: hsl(120, 100%, 40%);">+        RUA.receive(tr_RUA_Disconnect(ps_domain, context_id_bstr, ts_RUA_Cause(normal), hex2oct(iu_release_compl)));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_mo_conn() 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_mo_conn));</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_tc_paging(charstring id) runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+     const integer context_id := 30;</span><br><span style="color: hsl(120, 100%, 40%);">+       const bitstring context_id_bstr := '000000000000000000011110'B; /* encoded context_id */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_handle_hnbap_hnb_register_req();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  LLSK.receive(f_llsk_rx(tr_HNBLLIF_IUH_CONFIGURE_IND(g_pars.mcc, g_pars.mnc, g_pars.cell_identity,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               g_pars.lac, g_pars.rac, g_pars.sac, g_pars.rnc_id)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* HNBGW sends RUA-ConnectionlessTransfer(RANAP-Paging) */</span><br><span style="color: hsl(120, 100%, 40%);">+    RUA.send(ts_RUA_ConnectionlessTransfer(hex2oct(ranap_paging)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     LLSK.receive(f_llsk_rx(tr_HNBLLIF_IUH_UNITDATA_IND(hex2oct(ranap_paging))));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Here it would continue with UE-side answers with RUA-Connect(RANAP-PagingResponse) */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_paging() 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_paging));</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> control {</span><br><span>       execute( TC_hnb_register_request_accept() );</span><br><span>         execute( TC_hnb_register_request_reject() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_mo_conn() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_paging() );</span><br><span> }</span><br><span> </span><br><span> }</span><br><span>diff --git a/hnodeb/gen_links.sh b/hnodeb/gen_links.sh</span><br><span>index ba946e8..6ddb4c0 100755</span><br><span>--- a/hnodeb/gen_links.sh</span><br><span>+++ b/hnodeb/gen_links.sh</span><br><span>@@ -27,6 +27,10 @@</span><br><span> FILES="SCTPasp_PT.cc  SCTPasp_PT.hh  SCTPasp_PortType.ttcn  SCTPasp_Types.ttcn"</span><br><span> gen_links $DIR $FILES</span><br><span> </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> DIR=$BASEDIR/titan.ProtocolModules.SDP/src</span><br><span> 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> SDP_parser.y lex.SDP_parse_.c"</span><br><span>@@ -51,7 +55,8 @@</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span> DIR=../library</span><br><span style="color: hsl(0, 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="HNBLLIF_Types.ttcn HNBLLIF_Templates.ttcn HNBLLIF_CodecPort.ttcn "</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> 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> FILES+="StatsD_Types.ttcn StatsD_CodecPort.ttcn StatsD_CodecPort_CtrlFunct.ttcn StatsD_CodecPort_CtrlFunctdef.cc StatsD_Checker.ttcn "</span><br><span> </span><br><span>diff --git a/hnodeb/regen_makefile.sh b/hnodeb/regen_makefile.sh</span><br><span>index 9ebfaf2..2d13504 100755</span><br><span>--- a/hnodeb/regen_makefile.sh</span><br><span>+++ b/hnodeb/regen_makefile.sh</span><br><span>@@ -24,6 +24,7 @@</span><br><span>        TELNETasp_PT.cc</span><br><span>      HNBAP_EncDec.cc</span><br><span>      RUA_EncDec.cc</span><br><span style="color: hsl(120, 100%, 40%);">+ UD_PT.cc</span><br><span> "</span><br><span> </span><br><span> export CPPFLAGS_TTCN3="</span><br><span>diff --git a/library/HNBLLIF_CodecPort.ttcn b/library/HNBLLIF_CodecPort.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..00f53fc</span><br><span>--- /dev/null</span><br><span>+++ b/library/HNBLLIF_CodecPort.ttcn</span><br><span>@@ -0,0 +1,95 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* OsmoHNodeB Lower Layer Socket Interface codec port in TTCN-3</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%);">+ * Author: Pau Espin Pedrol <pespin@sysmocom.de></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 HNBLLIF_CodecPort {</span><br><span style="color: hsl(120, 100%, 40%);">+</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 HNBLLIF_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from UD_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from UD_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_send_data {</span><br><span style="color: hsl(120, 100%, 40%);">+   HNBLLIF_Message data,</span><br><span style="color: hsl(120, 100%, 40%);">+ integer         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 HNBLLIF_to_UD(in HNBLLIF_send_data pin, out UD_send_data pout) {</span><br><span style="color: hsl(120, 100%, 40%);">+   pout.id := pin.id;</span><br><span style="color: hsl(120, 100%, 40%);">+    pout.data := enc_HNBLLIF_Message(pin.data);</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 UD_to_HNBLLIF(in UD_send_data pin, out HNBLLIF_send_data pout) {</span><br><span style="color: hsl(120, 100%, 40%);">+   pout.id := pin.id;</span><br><span style="color: hsl(120, 100%, 40%);">+    pout.data := dec_HNBLLIF_Message(pin.data);</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 HNBLLIF_CODEC_PT message {</span><br><span style="color: hsl(120, 100%, 40%);">+        out     UD_close, UD_listen, UD_shutdown, UD_connect, HNBLLIF_send_data;</span><br><span style="color: hsl(120, 100%, 40%);">+      in      UD_listen_result, UD_connect_result, UD_connected, HNBLLIF_send_data;</span><br><span style="color: hsl(120, 100%, 40%);">+} with { extension "user UD_PT</span><br><span style="color: hsl(120, 100%, 40%);">+    out (</span><br><span style="color: hsl(120, 100%, 40%);">+         UD_close -> UD_close:simple;</span><br><span style="color: hsl(120, 100%, 40%);">+               UD_listen -> UD_listen:simple;</span><br><span style="color: hsl(120, 100%, 40%);">+             UD_shutdown -> UD_shutdown:simple;</span><br><span style="color: hsl(120, 100%, 40%);">+         UD_connect -> UD_connect:simple;</span><br><span style="color: hsl(120, 100%, 40%);">+           HNBLLIF_send_data -> UD_send_data: function(HNBLLIF_to_UD)</span><br><span style="color: hsl(120, 100%, 40%);">+         )</span><br><span style="color: hsl(120, 100%, 40%);">+     in (</span><br><span style="color: hsl(120, 100%, 40%);">+          UD_listen_result -> UD_listen_result:simple;</span><br><span style="color: hsl(120, 100%, 40%);">+               UD_connect_result -> UD_connect_result:simple;</span><br><span style="color: hsl(120, 100%, 40%);">+             UD_send_data -> HNBLLIF_send_data: function(UD_to_HNBLLIF);</span><br><span style="color: hsl(120, 100%, 40%);">+                UD_connected -> UD_connected:simple</span><br><span 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 HNBLLIF_send_data t_SD_HNBLLIF(integer id, template HNBLLIF_Message pdu) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ data := pdu,</span><br><span style="color: hsl(120, 100%, 40%);">+  id := id</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) HNBLLIF_send_data ts_SD_HNBLLIF(integer id, template (value) HNBLLIF_Message pdu) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  data := pdu,</span><br><span style="color: hsl(120, 100%, 40%);">+  id := id</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_hnbllif_connect(HNBLLIF_CODEC_PT pt, charstring sock) return integer {</span><br><span style="color: hsl(120, 100%, 40%);">+      var UD_connect_result res;</span><br><span style="color: hsl(120, 100%, 40%);">+    timer T := 5.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      pt.send(UD_connect:{sock, -1});</span><br><span style="color: hsl(120, 100%, 40%);">+       alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] pt.receive(UD_connect_result:?) -> value res {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (ispresent(res.result) and ispresent(res.result.result_code) and</span><br><span style="color: hsl(120, 100%, 40%);">+               res.result.result_code == ERROR) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (ispresent(res.result.err)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              setverdict(fail, "Error connecting to HNBLL socket ", sock, ": ", res.result.err);</span><br><span style="color: hsl(120, 100%, 40%);">+                        } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              setverdict(fail, "Error connecting to HNBLL socket ", sock);</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span style="color: hsl(120, 100%, 40%);">+                     mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      return res.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%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout connecting to HNBLL socket ", sock);</span><br><span style="color: hsl(120, 100%, 40%);">+              mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return -23;</span><br><span 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_hnbllif_close(HNBLLIF_CODEC_PT pt, integer id)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        pt.send(UD_close:{id := 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>diff --git a/library/HNBLLIF_Templates.ttcn b/library/HNBLLIF_Templates.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..f330fdf</span><br><span>--- /dev/null</span><br><span>+++ b/library/HNBLLIF_Templates.ttcn</span><br><span>@@ -0,0 +1,251 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Osmocom HNBLL Interface Templates, as per osmo-hnodeb/include/osmocom/hnodeb/hnb_prim.h</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%);">+ * Author: Pau Espin Pedrol <pespin@sysmocom.de></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 HNBLLIF_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%);">+import from HNBLLIF_Types 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%);">+ * CTL SAPI</span><br><span style="color: hsl(120, 100%, 40%);">+ **********************/</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) HNBLLIF_Message ts_HNBLLIF_CTL_HELLO_REQ(template (value) HNBLLIF_Sapi sapi,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     template (value) uint16_t api_version) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ sapi := HNBLL_IF_SAPI_CTL,</span><br><span style="color: hsl(120, 100%, 40%);">+    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                ctl := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      prim := HNBLL_IF_CTL_MSG_HELLO,</span><br><span style="color: hsl(120, 100%, 40%);">+                       u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                hello := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    op := HNBLL_IF_OP_REQUEST,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                req := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      sapi := sapi,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 api_version := api_version</span><br><span 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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) HNBLLIF_Message tr_HNBLLIF_CTL_HELLO_CNF(template (present) HNBLLIF_Sapi sapi := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                            template (present) uint32_t api_version := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        sapi := HNBLL_IF_SAPI_CTL,</span><br><span style="color: hsl(120, 100%, 40%);">+    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                ctl := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      prim := HNBLL_IF_CTL_MSG_HELLO,</span><br><span style="color: hsl(120, 100%, 40%);">+                       u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                hello := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                    op := HNBLL_IF_OP_CONFIRM,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                cnf := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      sapi := sapi,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 api_version := api_version</span><br><span 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 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%);">+ * IUH SAPI</span><br><span style="color: hsl(120, 100%, 40%);">+ **********************/</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) HNBLLIF_Message tr_HNBLLIF_IUH_CONFIGURE_IND(template (present) uint16_t mcc := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                             template (present) uint16_t mnc := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         template (present) uint16_t cell_identity := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               template (present) uint16_t lac := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         template (present) uint8_t rac := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          template (present) uint16_t sac := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         template (present) uint16_t rnc_id := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ sapi := HNBLL_IF_SAPI_IUH,</span><br><span style="color: hsl(120, 100%, 40%);">+    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                iuh := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      prim := HNBLL_IF_IUH_MSG_CONFIGURE,</span><br><span style="color: hsl(120, 100%, 40%);">+                   u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                configure := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        op := HNBLL_IF_OP_INDICATION,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                ind := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      mcc := mcc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   mnc := mnc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   cell_identity := cell_identity,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       lac := lac,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   rac := rac,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   reserved := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        sac := sac,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   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%);">+                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) HNBLLIF_Message ts_HNBLLIF_IUH_CONN_ESTABLISH_REQ(template (value) uint32_t context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              template (value) uint8_t domain,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              template (value) uint8_t est_cause,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                           template (value) octetstring data) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       sapi := HNBLL_IF_SAPI_IUH,</span><br><span style="color: hsl(120, 100%, 40%);">+    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                iuh := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      prim := HNBLL_IF_IUH_MSG_CONN_ESTABLISH,</span><br><span style="color: hsl(120, 100%, 40%);">+                      u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                conn_establish := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   op := HNBLL_IF_OP_REQUEST,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                req := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      context_id := context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     domain := domain,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     est_cause := est_cause,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       reserved := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        data_len := lengthof(data),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   data := data</span><br><span style="color: hsl(120, 100%, 40%);">+                                          }</span><br><span style="color: hsl(120, 100%, 40%);">+                                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) HNBLLIF_Message tr_HNBLLIF_IUH_CONN_ESTABLISH_CNF(template (present) uint32_t context_id := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                             template (present) uint8_t domain := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               template (present) uint8_t est_cause := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       sapi := HNBLL_IF_SAPI_IUH,</span><br><span style="color: hsl(120, 100%, 40%);">+    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                iuh := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      prim := HNBLL_IF_IUH_MSG_CONN_ESTABLISH,</span><br><span style="color: hsl(120, 100%, 40%);">+                      u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                conn_establish := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                   op := HNBLL_IF_OP_CONFIRM,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                cnf := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      context_id := context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     domain := domain,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     est_cause := est_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%);">+                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) HNBLLIF_Message ts_HNBLLIF_IUH_CONN_RELEASE_REQ(template (value) uint32_t context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              template (value) uint8_t domain,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              template (value) uint8_t cause_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          template (value) uint8_t cause,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       template (value) octetstring data) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ sapi := HNBLL_IF_SAPI_IUH,</span><br><span style="color: hsl(120, 100%, 40%);">+    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                iuh := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      prim := HNBLL_IF_IUH_MSG_CONN_RELEASE,</span><br><span style="color: hsl(120, 100%, 40%);">+                        u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                conn_release := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     op := HNBLL_IF_OP_REQUEST,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                req := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      context_id := context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     domain := domain,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     spare1 := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  cause_type := cause_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     cause := cause,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       data_len := lengthof(data),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   data := data</span><br><span style="color: hsl(120, 100%, 40%);">+                                          }</span><br><span style="color: hsl(120, 100%, 40%);">+                                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) HNBLLIF_Message tr_HNBLLIF_IUH_CONN_DATA_IND(template (present) uint32_t context_id := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          template (present) uint8_t domain := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               template (present) octetstring data := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        sapi := HNBLL_IF_SAPI_IUH,</span><br><span style="color: hsl(120, 100%, 40%);">+    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                iuh := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      prim := HNBLL_IF_IUH_MSG_CONN_DATA,</span><br><span style="color: hsl(120, 100%, 40%);">+                   u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                conn_data := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        op := HNBLL_IF_OP_INDICATION,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                ind := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      context_id := context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     domain := domain,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     spare1 := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  spare2 := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  data_len := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        data := data</span><br><span style="color: hsl(120, 100%, 40%);">+                                          }</span><br><span style="color: hsl(120, 100%, 40%);">+                                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) HNBLLIF_Message ts_HNBLLIF_IUH_CONN_DATA_REQ(template (value) uint32_t context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         template (value) uint8_t domain,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              template (value) octetstring data) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ sapi := HNBLL_IF_SAPI_IUH,</span><br><span style="color: hsl(120, 100%, 40%);">+    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                iuh := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      prim := HNBLL_IF_IUH_MSG_CONN_DATA,</span><br><span style="color: hsl(120, 100%, 40%);">+                   u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                conn_data := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                        op := HNBLL_IF_OP_REQUEST,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                req := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      context_id := context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     domain := domain,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     spare1 := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  spare2 := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  data_len := lengthof(data),</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   data := data</span><br><span style="color: hsl(120, 100%, 40%);">+                                          }</span><br><span style="color: hsl(120, 100%, 40%);">+                                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) HNBLLIF_Message tr_HNBLLIF_IUH_UNITDATA_IND(template (present) octetstring data := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ sapi := HNBLL_IF_SAPI_IUH,</span><br><span style="color: hsl(120, 100%, 40%);">+    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                iuh := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      prim := HNBLL_IF_IUH_MSG_UNITDATA,</span><br><span style="color: hsl(120, 100%, 40%);">+                    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                unitdata := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 op := HNBLL_IF_OP_INDICATION,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                ind := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      data_len := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        data := data</span><br><span style="color: hsl(120, 100%, 40%);">+                                          }</span><br><span style="color: hsl(120, 100%, 40%);">+                                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                             }</span><br><span style="color: hsl(120, 100%, 40%);">+                     }</span><br><span 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%);">+} with { encode "RAW" variant "BYTEORDER(first)" };</span><br><span>diff --git a/library/HNBLLIF_Types.ttcn b/library/HNBLLIF_Types.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..f9c8cc5</span><br><span>--- /dev/null</span><br><span>+++ b/library/HNBLLIF_Types.ttcn</span><br><span>@@ -0,0 +1,275 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Osmocom HNBLL Interface Types, as per osmo-hnodeb/include/osmocom/hnodeb/hnb_prim.h</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%);">+ * Author: Pau Espin Pedrol <pespin@sysmocom.de></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 HNBLLIF_Types {</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%);">+import from Native_Functions 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%);">+    /* HNBLLIF version supported by the IUT */</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLLIF_Version mp_hnbllif_version := 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%);">+const charstring HNBLL_SOCK_DEFAULT := "/tmp/hnb_prim_sock";</span><br><span style="color: hsl(120, 100%, 40%);">+type integer HNBLLIF_Version (0); /* supported versions */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/**********************</span><br><span style="color: hsl(120, 100%, 40%);">+ * CTL SAPI</span><br><span 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 enumerated HNBLLIF_CTL_MsgType {</span><br><span style="color: hsl(120, 100%, 40%);">+       HNBLL_IF_CTL_MSG_HELLO  ('0000'O)</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "FIELDLENGTH(16)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_CTL_hello_req {</span><br><span style="color: hsl(120, 100%, 40%);">+     HNBLLIF_Sapi    sapi,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t        api_version</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_CTL_hello_cnf {</span><br><span style="color: hsl(120, 100%, 40%);">+  HNBLLIF_Sapi    sapi,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t        api_version</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type union HNBLLIF_CTL_PrimOpUnion_hello {</span><br><span style="color: hsl(120, 100%, 40%);">+   HNBLLIF_CTL_hello_req   req,</span><br><span style="color: hsl(120, 100%, 40%);">+  HNBLLIF_CTL_hello_cnf   cnf,</span><br><span style="color: hsl(120, 100%, 40%);">+  octetstring             other</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_CTL_PrimOp_hello  {</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLLIF_Operation       op,</span><br><span style="color: hsl(120, 100%, 40%);">+   HNBLLIF_CTL_PrimOpUnion_hello   u</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (u) "CROSSTAG( req,    op = HNBLL_IF_OP_REQUEST;</span><br><span style="color: hsl(120, 100%, 40%);">+                             cnf,    op = HNBLL_IF_OP_CONFIRM;</span><br><span style="color: hsl(120, 100%, 40%);">+                             other,  OTHERWISE)"</span><br><span 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 union HNBLLIF_CTL_PrimUnion {</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLLIF_CTL_PrimOp_hello        hello,</span><br><span style="color: hsl(120, 100%, 40%);">+        octetstring             other</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_CTL_PrimHdr  {</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_CTL_MsgType     prim,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_CTL_PrimUnion   u</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (u) "CROSSTAG( hello,  prim = HNBLL_IF_CTL_MSG_HELLO;</span><br><span style="color: hsl(120, 100%, 40%);">+                                other,  OTHERWISE)"</span><br><span 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%);">+ * IUH SAPI</span><br><span style="color: hsl(120, 100%, 40%);">+ **********************/</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated HNBLLIF_IUH_MsgType {</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLL_IF_IUH_MSG_CONFIGURE      ('0000'O),</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLL_IF_IUH_MSG_CONN_ESTABLISH ('0001'O),</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLL_IF_IUH_MSG_CONN_RELEASE   ('0002'O),</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLL_IF_IUH_MSG_CONN_DATA      ('0003'O),</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLL_IF_IUH_MSG_UNITDATA       ('0004'O)</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "FIELDLENGTH(16)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* CONFIGURE */</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_configure_ind {</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t mcc,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t mnc,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_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 reserved,</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t sac,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t rnc_id</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type union HNBLLIF_IUH_PrimOpUnion_configure {</span><br><span style="color: hsl(120, 100%, 40%);">+   HNBLLIF_IUH_configure_ind ind,</span><br><span style="color: hsl(120, 100%, 40%);">+        octetstring             other</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_PrimOp_configure  {</span><br><span style="color: hsl(120, 100%, 40%);">+        HNBLLIF_Operation       op,</span><br><span style="color: hsl(120, 100%, 40%);">+   HNBLLIF_IUH_PrimOpUnion_configure       u</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (u) "CROSSTAG( ind,    op = HNBLL_IF_OP_INDICATION;</span><br><span style="color: hsl(120, 100%, 40%);">+                          other,  OTHERWISE)"</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* CONN_ESTABLISH */</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_conn_establish_req {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint32_t context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t domain,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t est_cause,</span><br><span style="color: hsl(120, 100%, 40%);">+    uint16_t reserved, //uint16_t nas_node_selector_bitlen;</span><br><span style="color: hsl(120, 100%, 40%);">+       //uint8_t nas_node_selector[128]; /* TODO: check whether we can decrease this buffer size */</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t data_len,</span><br><span style="color: hsl(120, 100%, 40%);">+    octetstring data /* RANAP message */</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (data_len) "LENGTHTO (data)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_conn_establish_cnf {</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t domain,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t est_cause</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type union HNBLLIF_IUH_PrimOpUnion_conn_establish {</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLLIF_IUH_conn_establish_req req,</span><br><span style="color: hsl(120, 100%, 40%);">+   HNBLLIF_IUH_conn_establish_cnf cnf,</span><br><span style="color: hsl(120, 100%, 40%);">+   octetstring             other</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_PrimOp_conn_establish  {</span><br><span style="color: hsl(120, 100%, 40%);">+     HNBLLIF_Operation       op,</span><br><span style="color: hsl(120, 100%, 40%);">+   HNBLLIF_IUH_PrimOpUnion_conn_establish  u</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (u) "CROSSTAG( req,    op = HNBLL_IF_OP_REQUEST;</span><br><span style="color: hsl(120, 100%, 40%);">+                             cnf,    op = HNBLL_IF_OP_CONFIRM;</span><br><span style="color: hsl(120, 100%, 40%);">+                             other,  OTHERWISE)"</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* CONN_RELEASE */</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_conn_release_req {</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t domain,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t spare1,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t cause_type,</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t cause,</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t data_len,</span><br><span style="color: hsl(120, 100%, 40%);">+    octetstring data /* RANAP message */</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (data_len) "LENGTHTO (data)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type union HNBLLIF_IUH_PrimOpUnion_conn_release {</span><br><span style="color: hsl(120, 100%, 40%);">+       HNBLLIF_IUH_conn_release_req req,</span><br><span style="color: hsl(120, 100%, 40%);">+     octetstring             other</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_PrimOp_conn_release  {</span><br><span style="color: hsl(120, 100%, 40%);">+       HNBLLIF_Operation       op,</span><br><span style="color: hsl(120, 100%, 40%);">+   HNBLLIF_IUH_PrimOpUnion_conn_release    u</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (u) "CROSSTAG( req,    op = HNBLL_IF_OP_REQUEST;</span><br><span style="color: hsl(120, 100%, 40%);">+                             other,  OTHERWISE)"</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* CONN_DATA */</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_conn_data_ind {</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t domain,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t spare1,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t spare2,</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t data_len,</span><br><span style="color: hsl(120, 100%, 40%);">+    octetstring data /* RANAP message */</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (data_len) "LENGTHTO (data)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_conn_data_req {</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t domain,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t spare1,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t spare2,</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t data_len,</span><br><span style="color: hsl(120, 100%, 40%);">+    octetstring data /* RANAP message */</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (data_len) "LENGTHTO (data)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type union HNBLLIF_IUH_PrimOpUnion_conn_data {</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLLIF_IUH_conn_data_req req,</span><br><span style="color: hsl(120, 100%, 40%);">+        HNBLLIF_IUH_conn_data_ind ind,</span><br><span style="color: hsl(120, 100%, 40%);">+        octetstring             other</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_PrimOp_conn_data  {</span><br><span style="color: hsl(120, 100%, 40%);">+  HNBLLIF_Operation       op,</span><br><span style="color: hsl(120, 100%, 40%);">+   HNBLLIF_IUH_PrimOpUnion_conn_data       u</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (u) "CROSSTAG( req,    op = HNBLL_IF_OP_REQUEST;</span><br><span style="color: hsl(120, 100%, 40%);">+                             ind,    op = HNBLL_IF_OP_INDICATION;</span><br><span style="color: hsl(120, 100%, 40%);">+                          other,  OTHERWISE)"</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* UNITDATA */</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_unitdata_ind {</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t data_len,</span><br><span style="color: hsl(120, 100%, 40%);">+    octetstring data /* RANAP message */</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (data_len) "LENGTHTO (data)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_unitdata_req {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint32_t data_len,</span><br><span style="color: hsl(120, 100%, 40%);">+    octetstring data /* RANAP message */</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (data_len) "LENGTHTO (data)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type union HNBLLIF_IUH_PrimOpUnion_unitdata {</span><br><span style="color: hsl(120, 100%, 40%);">+     HNBLLIF_IUH_unitdata_req req,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_IUH_unitdata_ind ind,</span><br><span style="color: hsl(120, 100%, 40%);">+ octetstring             other</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_PrimOp_unitdata  {</span><br><span style="color: hsl(120, 100%, 40%);">+   HNBLLIF_Operation       op,</span><br><span style="color: hsl(120, 100%, 40%);">+   HNBLLIF_IUH_PrimOpUnion_unitdata        u</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (u) "CROSSTAG( req,    op = HNBLL_IF_OP_REQUEST;</span><br><span style="color: hsl(120, 100%, 40%);">+                             ind,    op = HNBLL_IF_OP_INDICATION;</span><br><span style="color: hsl(120, 100%, 40%);">+                          other,  OTHERWISE)"</span><br><span 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 union HNBLLIF_IUH_PrimUnion {</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLLIF_IUH_PrimOp_configure            configure,</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLLIF_IUH_PrimOp_conn_establish       conn_establish,</span><br><span style="color: hsl(120, 100%, 40%);">+       HNBLLIF_IUH_PrimOp_conn_release         conn_release,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_IUH_PrimOp_conn_data            conn_data,</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLLIF_IUH_PrimOp_unitdata             unitdata,</span><br><span style="color: hsl(120, 100%, 40%);">+     octetstring             other</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_PrimHdr  {</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_IUH_MsgType     prim,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_IUH_PrimUnion   u</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (u) "CROSSTAG( configure,      prim = HNBLL_IF_IUH_MSG_CONFIGURE;</span><br><span style="color: hsl(120, 100%, 40%);">+                            conn_establish, prim = HNBLL_IF_IUH_MSG_CONN_ESTABLISH;</span><br><span style="color: hsl(120, 100%, 40%);">+                               conn_release,   prim = HNBLL_IF_IUH_MSG_CONN_RELEASE;</span><br><span style="color: hsl(120, 100%, 40%);">+                         conn_data,      prim = HNBLL_IF_IUH_MSG_CONN_DATA;</span><br><span style="color: hsl(120, 100%, 40%);">+                            unitdata,       prim = HNBLL_IF_IUH_MSG_UNITDATA;</span><br><span style="color: hsl(120, 100%, 40%);">+                             other,  OTHERWISE)"</span><br><span 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%);">+* General</span><br><span style="color: hsl(120, 100%, 40%);">+**********************/</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated HNBLLIF_Sapi {</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLL_IF_SAPI_CTL               (-1),</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLL_IF_SAPI_IUH               ('00000001'O)//,</span><br><span style="color: hsl(120, 100%, 40%);">+      //HNBLL_IF_SAPI_GTP             ('00000002'O),</span><br><span style="color: hsl(120, 100%, 40%);">+        //HNBLL_IF_SAPI_AUDIO           ('00000003'O),</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "FIELDLENGTH(32)"</span><br><span style="color: hsl(120, 100%, 40%);">+   variant "COMP(2scompl)"</span><br><span 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 enumerated HNBLLIF_Operation {</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLL_IF_OP_REQUEST     ('0000'O),</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLL_IF_OP_RESPONSE    ('0001'O),</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLL_IF_OP_INDICATION  ('0002'O),</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLL_IF_OP_CONFIRM     ('0003'O)</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "FIELDLENGTH(16)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type union HNBLLIF_SapiUnion {</span><br><span style="color: hsl(120, 100%, 40%);">+  HNBLLIF_CTL_PrimHdr             ctl,</span><br><span style="color: hsl(120, 100%, 40%);">+  HNBLLIF_IUH_PrimHdr             iuh,</span><br><span style="color: hsl(120, 100%, 40%);">+  octetstring                     other</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_Message {</span><br><span style="color: hsl(120, 100%, 40%);">+      HNBLLIF_Sapi sapi,</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLLIF_SapiUnion u</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (u) "CROSSTAG( ctl,          sapi = HNBLL_IF_SAPI_CTL;</span><br><span style="color: hsl(120, 100%, 40%);">+                             iuh,            sapi = HNBLL_IF_SAPI_IUH;</span><br><span style="color: hsl(120, 100%, 40%);">+                             other,  OTHERWISE)"</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+external function enc_HNBLLIF_Message(in HNBLLIF_Message pdu) return octetstring</span><br><span style="color: hsl(120, 100%, 40%);">+      with { extension "prototype(convert) encode(RAW)" };</span><br><span style="color: hsl(120, 100%, 40%);">+external function dec_HNBLLIF_Message(in octetstring stream) return HNBLLIF_Message</span><br><span style="color: hsl(120, 100%, 40%);">+   with { extension "prototype(convert) decode(RAW)" };</span><br><span 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 { encode "RAW" variant "BYTEORDER(first)" };</span><br><span>diff --git a/library/Iuh_CodecPort.ttcn b/library/Iuh_CodecPort.ttcn</span><br><span>index 569a27f..6bedc0b 100644</span><br><span>--- a/library/Iuh_CodecPort.ttcn</span><br><span>+++ b/library/Iuh_CodecPort.ttcn</span><br><span>@@ -96,7 +96,11 @@</span><br><span>                        }</span><br><span>                    case (0) {</span><br><span>                           /* FIXME: lower layers report sinfo_ppid=0: */</span><br><span style="color: hsl(0, 100%, 40%);">-                          pout.msg.hnbap := dec_HNBAP_PDU(pin.msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                             if  (match(pin.msg, '000100380000070003000C02404F736D6F484E6F64654200080001000009000300F110000B0004000000100006000200020007000103000A00020004'O)) {</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%);">+                             } else {</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>                    }</span><br><span>                    case else {</span><br><span>                          pout.msg.payload := pin.msg;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/26373">change 26373</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/+/26373"/><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: Ia864a672643a0e42f5afea6fd901e621478c87c0 </div>
<div style="display:none"> Gerrit-Change-Number: 26373 </div>
<div style="display:none"> Gerrit-PatchSet: 9 </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: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>