<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/26445">View Change</a></p><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, 342 insertions(+), 7 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/45/26445/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 3ee79f0..7dec5d0 100644</span><br><span>--- a/hnodeb/HNBGW_ConnectionHandler.ttcn</span><br><span>+++ b/hnodeb/HNBGW_ConnectionHandler.ttcn</span><br><span>@@ -31,8 +31,14 @@</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 GTPC_Types 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>@@ -40,6 +46,8 @@</span><br><span>         port HNBLLIF_CODEC_PT LLSK;</span><br><span>  var integer g_llsk_conn_id;</span><br><span> </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>       var TestHdlrParams g_pars;</span><br><span> </span><br><span>       var boolean g_vty_initialized := false;</span><br><span>@@ -54,11 +62,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>@@ -69,7 +74,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>@@ -129,6 +157,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, template (present) HNBLLIF_Version exp_version := ?) {</span><br><span>diff --git a/hnodeb/HNB_Tests.ttcn b/hnodeb/HNB_Tests.ttcn</span><br><span>index 07da8c8..9883a4b 100644</span><br><span>--- a/hnodeb/HNB_Tests.ttcn</span><br><span>+++ b/hnodeb/HNB_Tests.ttcn</span><br><span>@@ -48,6 +48,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>@@ -321,12 +325,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_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 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_IND(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_REQ(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_IND(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_IND(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_REQ(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_IND(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_IND(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 a2673c0..025f65f 100644</span><br><span>--- a/library/HNBLLIF_Templates.ttcn</span><br><span>+++ b/library/HNBLLIF_Templates.ttcn</span><br><span>@@ -320,4 +320,129 @@</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%);">+ * 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_IND(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_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%);">+                                                     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_IND(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_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%);">+                                                     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_REQ(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_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%);">+                                                     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_IND(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_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%);">+                                                     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 8b0c08f..664d34c 100644</span><br><span>--- a/library/HNBLLIF_Types.ttcn</span><br><span>+++ b/library/HNBLLIF_Types.ttcn</span><br><span>@@ -328,6 +328,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_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 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_ind ind,</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( 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%);">+/* CONN_RELEASE */</span><br><span style="color: hsl(120, 100%, 40%);">+type record HNBLLIF_GTP_conn_release_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 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_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_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( 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_DATA */</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 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_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 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>@@ -343,7 +443,7 @@</span><br><span> type enumerated HNBLLIF_Sapi {</span><br><span>   HNBLL_IF_SAPI_CTL               ('00000000'O),</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> </span><br><span>@@ -357,6 +457,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>@@ -366,6 +467,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: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>