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