<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>