<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/26445">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 gtp SAPI<br><br>Change-Id: Ie4de00641089abbd03273ce5a2d9325659ac7d42<br>---<br>M hnodeb/HNBGW_ConnectionHandler.ttcn<br>M hnodeb/HNB_Tests.ttcn<br>M hnodeb/gen_links.sh<br>M hnodeb/regen_makefile.sh<br>M library/HNBLLIF_Templates.ttcn<br>M library/HNBLLIF_Types.ttcn<br>6 files changed, 352 insertions(+), 7 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 3c4bc6f..b069a11 100644</span><br><span>--- a/hnodeb/HNBGW_ConnectionHandler.ttcn</span><br><span>+++ b/hnodeb/HNBGW_ConnectionHandler.ttcn</span><br><span>@@ -34,8 +34,13 @@</span><br><span> import from HNBLLIF_Types all;</span><br><span> import from HNBLLIF_Templates all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import from GTP_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GTP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GTP_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GTPU_Types 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 style="color: hsl(0, 100%, 40%);">-type component HNBGW_ConnHdlr extends StatsD_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+type component HNBGW_ConnHdlr extends StatsD_ConnHdlr, GTP_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>@@ -46,6 +51,10 @@</span><br><span> var RTP_Emulation_CT vc_RTPEM;</span><br><span> port RTPEM_CTRL_PT RTPEM_CTRL;</span><br><span> port RTPEM_DATA_PT RTPEM_DATA;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var GTP_Emulation_CT vc_GTP;</span><br><span style="color: hsl(120, 100%, 40%);">+</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>@@ -60,11 +69,8 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* initialize all parameters */</span><br><span style="color: hsl(0, 100%, 40%);">-function f_HNBGW_ConnHdlr_init(charstring id, TestHdlrParams pars) runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_HNBGW_ConnHdlr_init_iuh(charstring id) runs on HNBGW_ConnHdlr {</span><br><span> var Iuh_Emulation_CT vc_Iuh;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- g_pars := valueof(pars);</span><br><span> 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>@@ -75,7 +81,30 @@</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> vc_Iuh.start(Iuh_Emulation.main(iuh_pars, id & "-Iuh"));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_HNBGW_ConnHdlr_init_gtp(charstring id) runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ id := id & "-GTP";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var GtpEmulationCfg gtp_cfg := {</span><br><span style="color: hsl(120, 100%, 40%);">+ gtpc_bind_ip := g_pars.hnbgw_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+ gtpc_bind_port := GTP1C_PORT,</span><br><span style="color: hsl(120, 100%, 40%);">+ gtpu_bind_ip := g_pars.hnbgw_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+ gtpu_bind_port := GTP1U_PORT,</span><br><span style="color: hsl(120, 100%, 40%);">+ sgsn_role := false</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_GTP := GTP_Emulation_CT.create(id);</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(self:GTP, vc_GTP:CLIENT);</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(self:GTP_PROC, vc_GTP:CLIENT_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_GTP.start(GTP_Emulation.main(gtp_cfg));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* initialize all parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_HNBGW_ConnHdlr_init(charstring id, TestHdlrParams pars) runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ g_pars := valueof(pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_HNBGW_ConnHdlr_init_iuh(id);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_HNBGW_ConnHdlr_init_gtp(id);</span><br><span> f_HNBGW_ConnHdlr_init_vty();</span><br><span> </span><br><span> /* Connect to HNB on LLSK and do HELLO ping-pong */</span><br><span>@@ -115,6 +144,13 @@</span><br><span> Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for HNBLLIF HELLO.REQ SAPI=AUDIO");</span><br><span> }</span><br><span> }</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_GTP, 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_GTP, 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=GTP");</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>@@ -151,6 +187,17 @@</span><br><span> sac := 4</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template (value) GtpPeer ts_GtpPeerU(charstring ip) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ connId := 1,</span><br><span style="color: hsl(120, 100%, 40%);">+ remName := ip,</span><br><span style="color: hsl(120, 100%, 40%);">+ remPort := GTP1U_PORT</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_gtpu_send(uint32_t tei, octetstring payload) runs on HNBGW_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var GtpPeer peer := valueof(ts_GtpPeerU(g_pars.hnodeb_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, int2oct(tei, 4), payload));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* HNBLLIF socket may at any time receive a new INFO.ind */</span><br><span> altstep as_hnbllif_hello_cnf(HNBLLIF_CODEC_PT pt, integer hnbllif_conn_id,</span><br><span> out HNBLLIF_Message last_hello_cnf,</span><br><span>diff --git a/hnodeb/HNB_Tests.ttcn b/hnodeb/HNB_Tests.ttcn</span><br><span>index 05cd2bf..ca42e5c 100644</span><br><span>--- a/hnodeb/HNB_Tests.ttcn</span><br><span>+++ b/hnodeb/HNB_Tests.ttcn</span><br><span>@@ -52,6 +52,10 @@</span><br><span> import from HNBLLIF_Types all;</span><br><span> import from HNBLLIF_Templates all;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+import from GTPU_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GTP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GTP_Emulation 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>@@ -359,12 +363,70 @@</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_ps_mo_gtp_ping_pong(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%);">+ var uint32_t remote_tei := 8888;</span><br><span style="color: hsl(120, 100%, 40%);">+ var uint32_t local_tei;</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring gtp_payload := f_rnd_octstring(40);</span><br><span style="color: hsl(120, 100%, 40%);">+ var HNBLLIF_send_data sd;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_gtp_register_teid(int2oct(remote_tei, 4));</span><br><span style="color: hsl(120, 100%, 40%);">+</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-RabASsReq) */</span><br><span style="color: hsl(120, 100%, 40%);">+ RUA.send(ts_RUA_DirectTransfer(ps_domain, context_id_bstr, hex2oct(ranap_rab_ass_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_rab_ass_req))));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Now LLSK provides the remote TransportLayerAddress from RabAssReq and asks SUT to provide a local address: */</span><br><span style="color: hsl(120, 100%, 40%);">+ LLSK.send(f_llsk_tx(ts_HNBLLIF_GTP_CONN_ESTABLISH_REQ(context_id, remote_tei, HNBLL_IF_ADDR_TYPE_IPV4,</span><br><span style="color: hsl(120, 100%, 40%);">+ f_HNBLLIF_Addr(HNBLL_IF_ADDR_TYPE_IPV4, g_pars.hnbgw_addr))));</span><br><span style="color: hsl(120, 100%, 40%);">+ LLSK.receive(f_llsk_rx(tr_HNBLLIF_GTP_CONN_ESTABLISH_CNF(context_id, ?, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLL_IF_ADDR_TYPE_IPV4, ?))) -> value sd;</span><br><span style="color: hsl(120, 100%, 40%);">+ local_tei := sd.data.u.gtp.u.conn_establish.u.cnf.local_tei;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Forward GTP data in both directions */</span><br><span style="color: hsl(120, 100%, 40%);">+ LLSK.send(f_llsk_tx(ts_HNBLLIF_GTP_CONN_DATA_REQ(context_id, remote_tei, gtp_payload)));</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP.receive(tr_GTPU_GPDU(ts_GtpPeerU(g_pars.hnodeb_addr), int2oct(remote_tei, 4), gtp_payload));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_gtpu_send(local_tei, gtp_payload);</span><br><span style="color: hsl(120, 100%, 40%);">+ LLSK.receive(f_llsk_rx(tr_HNBLLIF_GTP_CONN_DATA_IND(context_id, local_tei, gtp_payload)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Done, release GTP conn */</span><br><span style="color: hsl(120, 100%, 40%);">+ LLSK.send(f_llsk_tx(ts_HNBLLIF_GTP_CONN_RELEASE_REQ(context_id, remote_tei)));</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_ps_mo_gtp_ping_pong() 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_ps_mo_gtp_ping_pong));</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> execute( TC_mo_conn() );</span><br><span> execute( TC_paging() );</span><br><span> execute( TC_cs_mo_call() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_ps_mo_gtp_ping_pong() );</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 6ddb4c0..84495e9 100755</span><br><span>--- a/hnodeb/gen_links.sh</span><br><span>+++ b/hnodeb/gen_links.sh</span><br><span>@@ -44,6 +44,10 @@</span><br><span> FILES="TELNETasp_PT.cc TELNETasp_PT.hh TELNETasp_PortType.ttcn"</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.GTP_v13.5.0/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="GTPC_EncDec.cc GTPC_Types.ttcn GTPU_EncDec.cc GTPU_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=../library/hnbap</span><br><span> FILES="HNBAP_CommonDataTypes.asn HNBAP_Constants.asn HNBAP_Containers.asn HNBAP_IEs.asn HNBAP_PDU_Contents.asn HNBAP_PDU_Descriptions.asn "</span><br><span> FILES+="HNBAP_EncDec.cc HNBAP_Types.ttcn HNBAP_Templates.ttcn "</span><br><span>@@ -59,7 +63,7 @@</span><br><span> 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 style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="GTP_CodecPort.ttcn GTP_CodecPort_CtrlFunct.ttcn GTP_CodecPort_CtrlFunctDef.cc GTP_Emulation.ttcn GTP_Templates.ttcn IPCP_Types.ttcn GSM_Types.ttcn "</span><br><span> gen_links $DIR $FILES</span><br><span> </span><br><span> ignore_pp_results</span><br><span>diff --git a/hnodeb/regen_makefile.sh b/hnodeb/regen_makefile.sh</span><br><span>index 2d13504..10f5c21 100755</span><br><span>--- a/hnodeb/regen_makefile.sh</span><br><span>+++ b/hnodeb/regen_makefile.sh</span><br><span>@@ -25,6 +25,9 @@</span><br><span> HNBAP_EncDec.cc</span><br><span> RUA_EncDec.cc</span><br><span> UD_PT.cc</span><br><span style="color: hsl(120, 100%, 40%);">+ GTPC_EncDec.cc</span><br><span style="color: hsl(120, 100%, 40%);">+ GTPU_EncDec.cc</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP_CodecPort_CtrlFunctDef.cc</span><br><span> "</span><br><span> </span><br><span> export CPPFLAGS_TTCN3="</span><br><span>diff --git a/library/HNBLLIF_Templates.ttcn b/library/HNBLLIF_Templates.ttcn</span><br><span>index 3fa49b7..78cf89a 100644</span><br><span>--- a/library/HNBLLIF_Templates.ttcn</span><br><span>+++ b/library/HNBLLIF_Templates.ttcn</span><br><span>@@ -367,4 +367,131 @@</span><br><span> }</span><br><span> }</span><br><span> }</span><br><span 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%);">+ * GTP 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_GTP_CONN_ESTABLISH_REQ(template (value) uint32_t context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) uint32_t remote_tei,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) HNBLLIF_AddrType remote_gtpu_address_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) HNBLLIF_Addr remote_gtpu_addr) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ sapi := HNBLL_IF_SAPI_GTP,</span><br><span style="color: hsl(120, 100%, 40%);">+ u := {</span><br><span style="color: hsl(120, 100%, 40%);">+ gtp := {</span><br><span style="color: hsl(120, 100%, 40%);">+ prim := HNBLL_IF_GTP_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%);">+ remote_tei := remote_tei,</span><br><span style="color: hsl(120, 100%, 40%);">+ reserved := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ remote_gtpu_address_type := remote_gtpu_address_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ remote_gtpu_addr := remote_gtpu_addr</span><br><span 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_GTP_CONN_ESTABLISH_CNF(template (present) uint32_t context_id := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) uint32_t local_tei := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) uint8_t error_code := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) HNBLLIF_AddrType local_gtpu_address_type := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) HNBLLIF_Addr local_gtpu_addr := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ sapi := HNBLL_IF_SAPI_GTP,</span><br><span style="color: hsl(120, 100%, 40%);">+ u := {</span><br><span style="color: hsl(120, 100%, 40%);">+ gtp := {</span><br><span style="color: hsl(120, 100%, 40%);">+ prim := HNBLL_IF_GTP_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%);">+ local_tei := local_tei,</span><br><span style="color: hsl(120, 100%, 40%);">+ error_code := error_code,</span><br><span style="color: hsl(120, 100%, 40%);">+ local_gtpu_address_type := local_gtpu_address_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ local_gtpu_addr := local_gtpu_addr</span><br><span 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_GTP_CONN_RELEASE_REQ(template (value) uint32_t context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) uint32_t remote_tei) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ sapi := HNBLL_IF_SAPI_GTP,</span><br><span style="color: hsl(120, 100%, 40%);">+ u := {</span><br><span style="color: hsl(120, 100%, 40%);">+ gtp := {</span><br><span style="color: hsl(120, 100%, 40%);">+ prim := HNBLL_IF_GTP_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%);">+ remote_tei := remote_tei</span><br><span 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_GTP_CONN_DATA_IND(template (present) uint32_t context_id := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) uint32_t local_tei := ?,</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_GTP,</span><br><span style="color: hsl(120, 100%, 40%);">+ u := {</span><br><span style="color: hsl(120, 100%, 40%);">+ gtp := {</span><br><span style="color: hsl(120, 100%, 40%);">+ prim := HNBLL_IF_GTP_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%);">+ local_tei := local_tei,</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_GTP_CONN_DATA_REQ(template (value) uint32_t context_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) uint32_t remote_tei,</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_GTP,</span><br><span style="color: hsl(120, 100%, 40%);">+ u := {</span><br><span style="color: hsl(120, 100%, 40%);">+ gtp := {</span><br><span style="color: hsl(120, 100%, 40%);">+ prim := HNBLL_IF_GTP_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%);">+ remote_tei := remote_tei,</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> } with { encode "RAW" variant "BYTEORDER(first)" };</span><br><span>diff --git a/library/HNBLLIF_Types.ttcn b/library/HNBLLIF_Types.ttcn</span><br><span>index befd7bb..95f91fc 100644</span><br><span>--- a/library/HNBLLIF_Types.ttcn</span><br><span>+++ b/library/HNBLLIF_Types.ttcn</span><br><span>@@ -330,6 +330,106 @@</span><br><span> other, OTHERWISE)"</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/**********************</span><br><span style="color: hsl(120, 100%, 40%);">+ * GTP SAPI</span><br><span style="color: hsl(120, 100%, 40%);">+ **********************/</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated HNBLLIF_GTP_MsgType {</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLL_IF_GTP_MSG_CONN_ESTABLISH ('0000'O),</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLL_IF_GTP_MSG_CONN_RELEASE ('0001'O),</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLL_IF_GTP_MSG_CONN_DATA ('0002'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%);">+/* CONN_ESTABLISH */</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_GTP_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%);">+ uint32_t remote_tei,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t reserved,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_AddrType remote_gtpu_address_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_Addr remote_gtpu_addr</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_GTP_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%);">+ uint32_t local_tei,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t error_code,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_AddrType local_gtpu_address_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_Addr local_gtpu_addr</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_GTP_PrimOpUnion_conn_establish {</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_GTP_conn_establish_req req,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_GTP_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_GTP_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_GTP_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_GTP_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%);">+ uint32_t remote_tei</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_GTP_PrimOpUnion_conn_release {</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_GTP_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_GTP_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_GTP_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_GTP_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%);">+ uint32_t remote_tei,</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_GTP_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%);">+ uint32_t local_tei,</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_GTP_PrimOpUnion_conn_data {</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_GTP_conn_data_req req,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_GTP_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_GTP_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_GTP_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%);">+type union HNBLLIF_GTP_PrimUnion {</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_GTP_PrimOp_conn_establish conn_establish,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_GTP_PrimOp_conn_release conn_release,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_GTP_PrimOp_conn_data conn_data,</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_GTP_PrimHdr {</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_GTP_MsgType prim,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_GTP_PrimUnion u</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant (u) "CROSSTAG( conn_establish, prim = HNBLL_IF_GTP_MSG_CONN_ESTABLISH;</span><br><span style="color: hsl(120, 100%, 40%);">+ conn_release, prim = HNBLL_IF_GTP_MSG_CONN_RELEASE;</span><br><span style="color: hsl(120, 100%, 40%);">+ conn_data, prim = HNBLL_IF_GTP_MSG_CONN_DATA;</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> </span><br><span> /**********************</span><br><span> * General</span><br><span>@@ -345,7 +445,7 @@</span><br><span> type enumerated HNBLLIF_Sapi {</span><br><span> HNBLL_IF_SAPI_CTL (-1),</span><br><span> HNBLL_IF_SAPI_IUH ('00000001'O),</span><br><span style="color: hsl(0, 100%, 40%);">- //HNBLL_IF_SAPI_GTP ('00000002'O),</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLL_IF_SAPI_GTP ('00000002'O),</span><br><span> HNBLL_IF_SAPI_AUDIO ('00000003'O)</span><br><span> } with { variant "FIELDLENGTH(32)"</span><br><span> variant "COMP(2scompl)"</span><br><span>@@ -361,6 +461,7 @@</span><br><span> type union HNBLLIF_SapiUnion {</span><br><span> HNBLLIF_CTL_PrimHdr ctl,</span><br><span> HNBLLIF_IUH_PrimHdr iuh,</span><br><span style="color: hsl(120, 100%, 40%);">+ HNBLLIF_GTP_PrimHdr gtp,</span><br><span> HNBLLIF_AUDIO_PrimHdr audio,</span><br><span> octetstring other</span><br><span> } with { variant "" };</span><br><span>@@ -370,6 +471,7 @@</span><br><span> HNBLLIF_SapiUnion u</span><br><span> } with { variant (u) "CROSSTAG( ctl, sapi = HNBLL_IF_SAPI_CTL;</span><br><span> iuh, sapi = HNBLL_IF_SAPI_IUH;</span><br><span style="color: hsl(120, 100%, 40%);">+ gtp, sapi = HNBLL_IF_SAPI_GTP;</span><br><span> audio, sapi = HNBLL_IF_SAPI_AUDIO;</span><br><span> other, OTHERWISE)"</span><br><span> };</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/26445">change 26445</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/+/26445"/><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: Ie4de00641089abbd03273ce5a2d9325659ac7d42 </div>
<div style="display:none"> Gerrit-Change-Number: 26445 </div>
<div style="display:none"> Gerrit-PatchSet: 7 </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>