<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/26373">View Change</a></p><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>8 files changed, 444 insertions(+), 36 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/73/26373/1</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..8743fcf 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,44 @@</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%);">+  pt.send(t_SD_HNBLLIF(hnbllif_conn_id, ts_HNBLLIF_CTL_HELLO_IND(HNBLLIF_Types.mp_hnbllif_version)));</span><br><span style="color: hsl(120, 100%, 40%);">+   T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] as_hnbllif_hello_cnf(pt, hnbllif_conn_id, last_hello_cnf, 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_IND");</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 +115,54 @@</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, template (present) HNBLLIF_Version 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(HNBLLIF_Types.mp_hnbllif_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_sd(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_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..1039102 100644</span><br><span>--- a/hnodeb/HNB_Tests.ttcn</span><br><span>+++ b/hnodeb/HNB_Tests.ttcn</span><br><span>@@ -42,6 +42,10 @@</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 +53,17 @@</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> 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 +93,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 +107,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 +115,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 +128,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 +139,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 +166,30 @@</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  LLSK.receive(f_llsk_sd(tr_HNBLLIF_IUH_CONFIGURE_REQ(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>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..fed6c69</span><br><span>--- /dev/null</span><br><span>+++ b/library/HNBLLIF_CodecPort.ttcn</span><br><span>@@ -0,0 +1,90 @@</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%);">+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..9b7fbb6</span><br><span>--- /dev/null</span><br><span>+++ b/library/HNBLLIF_Templates.ttcn</span><br><span>@@ -0,0 +1,96 @@</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_IND(template (value) 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_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%);">+                                                      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) 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%);">+                                                      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_REQ(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_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%);">+                                                      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%);">+} 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..9a3ee1b</span><br><span>--- /dev/null</span><br><span>+++ b/library/HNBLLIF_Types.ttcn</span><br><span>@@ -0,0 +1,150 @@</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  ('00000000'O)</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "FIELDLENGTH(32)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_CTL_hello_ind {</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%);">+  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_ind   ind,</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( ind,    op = HNBLL_IF_OP_INDICATION;</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      ('00000000'O)</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "FIELDLENGTH(32)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_IUH_configure_req {</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_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%);">+</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( 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%);">+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%);">+    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%);">+                            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               ('0000'O),</span><br><span style="color: hsl(120, 100%, 40%);">+    HNBLL_IF_SAPI_IUH               ('0001'O)//,</span><br><span style="color: hsl(120, 100%, 40%);">+  //HNBLL_IF_SAPI_GTP             ('0002'O),</span><br><span style="color: hsl(120, 100%, 40%);">+    //HNBLL_IF_SAPI_AUDIO           ('0003'O),</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "FIELDLENGTH(32)" };</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     ('00000000'O),</span><br><span style="color: hsl(120, 100%, 40%);">+        HNBLL_IF_OP_RESPONSE    ('00000001'O),</span><br><span style="color: hsl(120, 100%, 40%);">+        HNBLL_IF_OP_INDICATION  ('00000002'O),</span><br><span style="color: hsl(120, 100%, 40%);">+        HNBLL_IF_OP_CONFIRM     ('00000003'O)</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "FIELDLENGTH(32)" };</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(</span><br><span style="color: hsl(120, 100%, 40%);">+                             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></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: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>