<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17867">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
laforge: Looks good to me, approved
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add GTPv2_Emulation component<br><br>Change-Id: If73aa453e44ebf28032c60d207feb03e8061dc0c<br>---<br>M deps/Makefile<br>A library/GTPv2_Emulation.ttcn<br>M library/GTPv2_Templates.ttcn<br>M library/General_Types.ttcn<br>M library/Osmocom_Types.ttcn<br>5 files changed, 1,338 insertions(+), 11 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/deps/Makefile b/deps/Makefile</span><br><span>index 65958ae..977beba 100644</span><br><span>--- a/deps/Makefile</span><br><span>+++ b/deps/Makefile</span><br><span>@@ -59,7 +59,7 @@</span><br><span> titan.ProtocolModules.NAS_EPS_15.2.0.1 \</span><br><span> titan.ProtocolModules.NS_v7.3.0 \</span><br><span> titan.ProtocolModules.SGsAP_13.2.0 \</span><br><span style="color: hsl(0, 100%, 40%);">- titan.ProtocolModules.SNDCP_v7.0.0 \</span><br><span style="color: hsl(120, 100%, 40%);">+ titan.ProtocolModules.SNDCP_v7.0.0</span><br><span> </span><br><span> OSMOGITHUB_REPOS= titan.TestPorts.SCTPasp \</span><br><span> titan.TestPorts.MTP3asp \</span><br><span>@@ -69,7 +69,8 @@</span><br><span> </span><br><span> OSMOGIT_REPOS= titan.ProtocolModules.MAP \</span><br><span> titan.ProtocolModules.BSSMAP \</span><br><span style="color: hsl(0, 100%, 40%);">- titan.TestPorts.USB</span><br><span style="color: hsl(120, 100%, 40%);">+ titan.TestPorts.USB \</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo-uecups</span><br><span> </span><br><span> ALL_REPOS=$(ECLIPSEGITHUB_REPOS) $(ECLIPSEGIT2_REPOS) $(OSMOGITHUB_REPOS) $(OSMOGIT_REPOS)</span><br><span> </span><br><span>@@ -125,6 +126,7 @@</span><br><span> titan.TestPorts.UDPasp_commit= c20d77a34f288dd70dd4aaa30e520778876e9336</span><br><span> titan.TestPorts.UNIX_DOMAIN_SOCKETasp_commit= R.2.A-8-g7ec4fe0</span><br><span> titan.TestPorts.USB_commit= master</span><br><span style="color: hsl(120, 100%, 40%);">+osmo-uecups_commit= master</span><br><span> </span><br><span> all: $(foreach dir,$(ALL_REPOS),$(dir)/update)</span><br><span> clean: $(foreach dir,$(ALL_REPOS),$(dir)/clean)</span><br><span>diff --git a/library/GTPv2_Emulation.ttcn b/library/GTPv2_Emulation.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..8074269</span><br><span>--- /dev/null</span><br><span>+++ b/library/GTPv2_Emulation.ttcn</span><br><span>@@ -0,0 +1,606 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* GTPv2 Emulation in TTCN-3</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018-2020 Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * All rights reserved.</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 GTPv2_Emulation {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPL4asp_Types all;</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 GTPv2_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GTPv2_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GTPv2_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from GTPv2_CodecPort_CtrlFunct all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from UECUPS_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from UECUPS_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from UECUPS_CodecPort_CtrlFunct 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%);">+ * Main Emulation Component</span><br><span style="color: hsl(120, 100%, 40%);">+ ***********************************************************************/</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%);">+ charstring mp_uecups_host := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+ integer mp_uecups_port := UECUPS_SCTP_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%);">+const integer GTP2C_PORT := 2123;</span><br><span style="color: hsl(120, 100%, 40%);">+const integer GTP1U_PORT := 2152;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record Gtp2EmulationCfg {</span><br><span style="color: hsl(120, 100%, 40%);">+ HostName gtpc_bind_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+ IPL4asp_Types.PortNumber gtpc_bind_port,</span><br><span style="color: hsl(120, 100%, 40%);">+ HostName gtpc_remote_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+ IPL4asp_Types.PortNumber gtpc_remote_port,</span><br><span style="color: hsl(120, 100%, 40%);">+ //HostName gtpu_bind_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+ //PortNumber gtpu_bind_port,</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean sgw_role,</span><br><span style="color: hsl(120, 100%, 40%);">+ boolean use_gtpu_daemon</span><br><span 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 component GTPv2_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Communication with underlying GTP CodecPort */</span><br><span style="color: hsl(120, 100%, 40%);">+ port GTPv2C_PT GTP2C;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Control port to GTP-U Daemon */</span><br><span style="color: hsl(120, 100%, 40%);">+ port UECUPS_CODEC_PT UECUPS;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Communication with Clients */</span><br><span style="color: hsl(120, 100%, 40%);">+ port GTP2EM_PT TEID0;</span><br><span style="color: hsl(120, 100%, 40%);">+ port GTP2EM_PT CLIENT;</span><br><span style="color: hsl(120, 100%, 40%);">+ port GTP2EM_PROC_PT CLIENT_PROC;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Configuration by the user */</span><br><span style="color: hsl(120, 100%, 40%);">+ var Gtp2EmulationCfg g_gtp2_cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* State */</span><br><span style="color: hsl(120, 100%, 40%);">+ var GtpPeer g_peer;</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer g_gtp2c_id;</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT1 g_restart_ctr;</span><br><span style="color: hsl(120, 100%, 40%);">+ var uint16_t g_c_seq_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+ var TidTableRec TidTable[256];</span><br><span style="color: hsl(120, 100%, 40%);">+ var SeqTableRec SeqTable[256];</span><br><span style="color: hsl(120, 100%, 40%);">+ var ImsiTableRec ImsiTable[256];</span><br><span style="color: hsl(120, 100%, 40%);">+ var PidTableRec PidTable[256];</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer g_uecups_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%);">+/* local TEID <-> ConnHdlr mapping */</span><br><span style="color: hsl(120, 100%, 40%);">+type record TidTableRec {</span><br><span style="color: hsl(120, 100%, 40%);">+ OCT4 teid,</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2_ConnHdlr vc_conn</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* local SeqNr <-> ConnHdlr mapping (until a response is received */</span><br><span style="color: hsl(120, 100%, 40%);">+type record SeqTableRec {</span><br><span style="color: hsl(120, 100%, 40%);">+ OCT3 seq,</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2_ConnHdlr vc_conn</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* IMSI <-> ConnHdlr mapping */</span><br><span style="color: hsl(120, 100%, 40%);">+type record ImsiTableRec {</span><br><span style="color: hsl(120, 100%, 40%);">+ hexstring imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2_ConnHdlr vc_conn</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* pid <-> ConnHdlr mapping (for UECUPS process termination indication) */</span><br><span style="color: hsl(120, 100%, 40%);">+type record PidTableRec {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* process ID of the running process */</span><br><span style="color: hsl(120, 100%, 40%);">+ integer pid,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* component that started it */</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2_ConnHdlr vc_conn</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_comp_by_teid(OCT4 teid) runs on GTPv2_Emulation_CT return GTP2_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < sizeof(TidTable); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isbound(TidTable[i].teid) and TidTable[i].teid == teid) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return TidTable[i].vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "No Component for TEID ", teid);</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%);">+private function f_seq_known(OCT3 seq) runs on GTPv2_Emulation_CT return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < sizeof(SeqTable); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isbound(SeqTable[i].seq) and SeqTable[i].seq == seq) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return true;</span><br><span 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 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%);">+private function f_comp_by_seq(OCT3 seq) runs on GTPv2_Emulation_CT return GTP2_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < sizeof(SeqTable); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isbound(SeqTable[i].seq) and SeqTable[i].seq == seq) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return SeqTable[i].vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "No Component for SEQ ", seq);</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%);">+private function f_comp_by_imsi(hexstring imsi) runs on GTPv2_Emulation_CT return GTP2_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < sizeof(ImsiTable); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isbound(ImsiTable[i].imsi) and ImsiTable[i].imsi == imsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return ImsiTable[i].vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "No Component for IMSI ", imsi);</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%);">+private function f_comp_by_pid(integer pid) runs on GTPv2_Emulation_CT return GTP2_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < sizeof(PidTable); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isbound(PidTable[i].pid) and PidTable[i].pid == pid) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* fixme: remove */</span><br><span style="color: hsl(120, 100%, 40%);">+ return PidTable[i].vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "No Component for PID ", pid);</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%);">+private function f_tid_tbl_add(OCT4 teid, GTP2_ConnHdlr vc_conn) runs on GTPv2_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < sizeof(TidTable); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not isbound(TidTable[i].teid)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TidTable[i].teid := teid;</span><br><span style="color: hsl(120, 100%, 40%);">+ TidTable[i].vc_conn := vc_conn;</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%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ testcase.stop("No Space in TidTable for ", teid);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_seq_tbl_add(OCT3 seq, GTP2_ConnHdlr vc_conn) runs on GTPv2_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < sizeof(SeqTable); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not isbound(SeqTable[i].seq)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ SeqTable[i].seq := seq;</span><br><span style="color: hsl(120, 100%, 40%);">+ SeqTable[i].vc_conn := vc_conn;</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%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ testcase.stop("No Space in SeqTable for ", seq);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_seq_tbl_del(OCT3 seq) runs on GTPv2_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < sizeof(SeqTable); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isbound(SeqTable[i].seq) and SeqTable[i].seq == seq) {</span><br><span style="color: hsl(120, 100%, 40%);">+ SeqTable[i] := {</span><br><span style="color: hsl(120, 100%, 40%);">+ seq := -,</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := null</span><br><span 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%);">+private function f_imsi_tbl_add(hexstring imsi, GTP2_ConnHdlr vc_conn) runs on GTPv2_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < sizeof(ImsiTable); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not isbound(ImsiTable[i].imsi)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ImsiTable[i].imsi := imsi;</span><br><span style="color: hsl(120, 100%, 40%);">+ ImsiTable[i].vc_conn := vc_conn;</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%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ testcase.stop("No Space in IMSI Table for ", imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_pid_tbl_add(integer pid, GTP2_ConnHdlr vc_conn) runs on GTPv2_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < sizeof(PidTable); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not isbound(PidTable[i].pid)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ PidTable[i].pid := pid;</span><br><span style="color: hsl(120, 100%, 40%);">+ PidTable[i].vc_conn := vc_conn;</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%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ testcase.stop("No Space in PID Table for ", pid);</span><br><span 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%);">+/* allocate an unused local teid */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_alloc_teid() runs on GTPv2_Emulation_CT return OCT4 {</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT4 teid;</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i, j;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < 100; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ teid := f_rnd_octstring(4);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (j := 0; j < sizeof(TidTable); j := j+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isbound(TidTable) and TidTable[i].teid == teid) {</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* we iterated over all entries and found no match: great! */</span><br><span style="color: hsl(120, 100%, 40%);">+ return teid;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ testcase.stop("Cannot find unused TEID after ", i, " attempts");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* obtain the IMSI from a GTPv2C PDU, if there is any IMSI contained. The way how the TITAN</span><br><span style="color: hsl(120, 100%, 40%);">+ * GTPv2 decoders are structured (explict IE members rather than a list/set of generic IE structures)</span><br><span style="color: hsl(120, 100%, 40%);">+ * doesn't make this easy, but requires lots of boilerplate code. Oh well.. */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_gtp2c_extract_imsi(PDU_GTPCv2 gtp) return template (omit) hexstring {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ischosen(gtp.gtpcv2_pdu.createSessionRequest)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.createSessionRequest.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.createSessionRequest.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.downlinkDataNotification)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.downlinkDataNotification.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.downlinkDataNotification.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.downlinkDataNotificationAcknowledgement)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.downlinkDataNotificationAcknowledgement.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.downlinkDataNotificationAcknowledgement.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.downlinkDataNotificationFailureIndication)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.downlinkDataNotificationFailureIndication.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.downlinkDataNotificationFailureIndication.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.createIndirectDataForwardingTunnelRequest)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.createIndirectDataForwardingTunnelRequest.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.createIndirectDataForwardingTunnelRequest.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.stopPagingIndication)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.stopPagingIndication.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.stopPagingIndication.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.forwardRelocationRequest)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.forwardRelocationRequest.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.forwardRelocationRequest.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.contextRequest)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.contextRequest.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.contextRequest.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.identificationResponse)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.identificationResponse.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.identificationResponse.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.changeNotificationRequest)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.changeNotificationRequest)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.changeNotificationRequest.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.changeNotificationResponse)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.changeNotificationResponse.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.changeNotificationResponse.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.relocationCancelRequest)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.relocationCancelRequest.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.relocationCancelRequest.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.uE_RegistrationQueryRequest)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.uE_RegistrationQueryRequest.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.uE_RegistrationQueryRequest.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.uE_RegistrationQueryResponse)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.uE_RegistrationQueryResponse.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.uE_RegistrationQueryResponse.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.suspendNotification)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.suspendNotification.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.suspendNotification.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.resumeNotification)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.resumeNotification.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.resumeNotification.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.cSPagingIndication)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.cSPagingIndication.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.cSPagingIndication.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.pGW_DownlinkTriggeringNotification)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.pGW_DownlinkTriggeringNotification.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.pGW_DownlinkTriggeringNotification.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.pGW_DownlinkTriggeringAcknowledge)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.pGW_DownlinkTriggeringAcknowledge.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.pGW_DownlinkTriggeringAcknowledge.iMSI.iMSI_Value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ischosen(gtp.gtpcv2_pdu.traceSessionActivation)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ispresent(gtp.gtpcv2_pdu.traceSessionActivation.iMSI)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return gtp.gtpcv2_pdu.traceSessionActivation.iMSI.iMSI_Value;</span><br><span 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 omit;</span><br><span 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 template (value) SctpTuple ts_SCTP(template (omit) integer ppid := omit) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ sinfo_stream := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ sinfo_ppid := ppid,</span><br><span style="color: hsl(120, 100%, 40%);">+ remSocks := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ assocId := omit</span><br><span 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 tr_UECUPS_RecvFrom_R(template PDU_UECUPS msg)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on GTPv2_Emulation_CT return template UECUPS_RecvFrom {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template UECUPS_RecvFrom mrf := {</span><br><span style="color: hsl(120, 100%, 40%);">+ connId := g_uecups_conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ remName := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ remPort := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ locName := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ locPort := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ msg := msg</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return mrf;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private template PortEvent tr_SctpAssocChange := {</span><br><span style="color: hsl(120, 100%, 40%);">+ sctpEvent := {</span><br><span style="color: hsl(120, 100%, 40%);">+ sctpAssocChange := ?</span><br><span 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 template PortEvent tr_SctpPeerAddrChange := {</span><br><span style="color: hsl(120, 100%, 40%);">+ sctpEvent := {</span><br><span style="color: hsl(120, 100%, 40%);">+ sctpPeerAddrChange := ?</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_uecups_xceive(template (value) PDU_UECUPS tx,</span><br><span style="color: hsl(120, 100%, 40%);">+ template PDU_UECUPS rx_t := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on GTPv2_Emulation_CT return PDU_UECUPS {</span><br><span style="color: hsl(120, 100%, 40%);">+ timer T := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+ var UECUPS_RecvFrom mrf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ UECUPS.send(t_UECUPS_Send(g_uecups_conn_id, tx));</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] UECUPS.receive(tr_UECUPS_RecvFrom_R(rx_t)) -> value mrf { }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] UECUPS.receive(tr_SctpAssocChange) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] UECUPS.receive(tr_SctpPeerAddrChange) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Timeout waiting for ", rx_t);</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 mrf.msg;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_init(Gtp2EmulationCfg cfg) runs on GTPv2_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var Result res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ map(self:GTP2C, system:GTP2C);</span><br><span style="color: hsl(120, 100%, 40%);">+ res := GTPv2_CodecPort_CtrlFunct.f_IPL4_listen(GTP2C, cfg.gtpc_bind_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+ cfg.gtpc_bind_port, {udp:={}});</span><br><span style="color: hsl(120, 100%, 40%);">+ g_gtp2c_id := res.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ g_restart_ctr := f_rnd_octstring(1);</span><br><span style="color: hsl(120, 100%, 40%);">+ g_c_seq_nr := f_rnd_int(65535);</span><br><span style="color: hsl(120, 100%, 40%);">+ g_gtp2_cfg := cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+ g_peer := {</span><br><span style="color: hsl(120, 100%, 40%);">+ connId := g_gtp2c_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ remName := g_gtp2_cfg.gtpc_remote_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+ remPort := g_gtp2_cfg.gtpc_remote_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%);">+ if (g_gtp2_cfg.use_gtpu_daemon) {</span><br><span style="color: hsl(120, 100%, 40%);">+ map(self:UECUPS, system:UECUPS);</span><br><span style="color: hsl(120, 100%, 40%);">+ res := UECUPS_CodecPort_CtrlFunct.f_IPL4_connect(UECUPS, mp_uecups_host, mp_uecups_port, "", -1, -1, { sctp := valueof(ts_SCTP) });</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not ispresent(res.connId)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Could not connect UECUPS socket, check your configuration");</span><br><span style="color: hsl(120, 100%, 40%);">+ testcase.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ g_uecups_conn_id := res.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* clear all tunnel state in the daemon at start */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_uecups_xceive({reset_all_state := {}}, {reset_all_state_res:=?});</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* make sure we always pass incoming UECUPS indications whenever receiving fom the UECUPS port */</span><br><span style="color: hsl(120, 100%, 40%);">+ activate(as_uecups_ind());</span><br><span 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 altstep as_uecups_ind() runs on GTPv2_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+var UECUPS_RecvFrom rx;</span><br><span style="color: hsl(120, 100%, 40%);">+var GTP2_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+/* handle incoming program_term_ind; dispatch to whatever component started the process */</span><br><span style="color: hsl(120, 100%, 40%);">+[] UECUPS.receive(tr_UECUPS_RecvFrom_R({program_term_ind:=?})) -> value rx {</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_comp_by_pid(rx.msg.program_term_ind.pid);</span><br><span style="color: hsl(120, 100%, 40%);">+ CLIENT.send(rx.msg.program_term_ind) to vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: remove from table */</span><br><span style="color: hsl(120, 100%, 40%);">+ repeat;</span><br><span 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 main(Gtp2EmulationCfg cfg) runs on GTPv2_Emulation_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var Gtp2cUnitdata g2c_ud;</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_GTPCv2 g2c;</span><br><span style="color: hsl(120, 100%, 40%);">+ var GTP2_ConnHdlr vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ var hexstring imsi;</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT4 teid;</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_UECUPS rx_uecups;</span><br><span style="color: hsl(120, 100%, 40%);">+ var UECUPS_CreateTun gtc;</span><br><span style="color: hsl(120, 100%, 40%);">+ var UECUPS_DestroyTun gtd;</span><br><span style="color: hsl(120, 100%, 40%);">+ var UECUPS_StartProgram sprog;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init(cfg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ while (true) {</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* route inbound GTP2-C based on TEID, SEQ or IMSI */</span><br><span style="color: hsl(120, 100%, 40%);">+ [] GTP2C.receive(Gtp2cUnitdata:?) -> value g2c_ud {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template hexstring imsi_t := f_gtp2c_extract_imsi(g2c_ud.gtpc);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not ispresent(g2c_ud.gtpc.tEID) or g2c_ud.gtpc.tEID == int2oct(0, 4)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* if this is a response, route by SEQ */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match(g2c_ud.gtpc, tr_PDU_GTP2C_msgtypes(gtp2_responses))</span><br><span style="color: hsl(120, 100%, 40%);">+ and f_seq_known(g2c_ud.gtpc.sequenceNumber)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_comp_by_seq(g2c_ud.gtpc.sequenceNumber);</span><br><span style="color: hsl(120, 100%, 40%);">+ CLIENT.send(g2c_ud.gtpc) to vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ TEID0.send(g2c_ud.gtpc);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ispresent(g2c_ud.gtpc.tEID) and g2c_ud.gtpc.tEID != int2oct(0, 4)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_comp_by_teid(g2c_ud.gtpc.tEID);</span><br><span style="color: hsl(120, 100%, 40%);">+ CLIENT.send(g2c_ud.gtpc) to vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (isvalue(imsi_t)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn := f_comp_by_imsi(valueof(imsi_t));</span><br><span style="color: hsl(120, 100%, 40%);">+ CLIENT.send(g2c_ud.gtpc) to vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Send to all clients */</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < sizeof(TidTable); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isbound(TidTable[i].teid) and TidTable[i].teid == teid) {</span><br><span style="color: hsl(120, 100%, 40%);">+ CLIENT.send(g2c_ud.gtpc) to TidTable[i].vc_conn;</span><br><span 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%);">+ /* remove sequence number if response was received */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match(g2c_ud.gtpc, tr_PDU_GTP2C_msgtypes(gtp2_responses))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_seq_tbl_del(g2c_ud.gtpc.sequenceNumber);</span><br><span 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%);">+ [] TEID0.receive(PDU_GTPCv2:?) -> value g2c sender vc_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* patch in the next sequence number */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: do this only for outbound requests */</span><br><span style="color: hsl(120, 100%, 40%);">+ g2c.sequenceNumber := int2oct(g_c_seq_nr, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+ g_c_seq_nr := g_c_seq_nr + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* build Gtp2cUnitdata */</span><br><span style="color: hsl(120, 100%, 40%);">+ g2c_ud := { peer := g_peer, gtpc := g2c };</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2C.send(g2c_ud);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match(g2c, tr_PDU_GTP2C_msgtypes(gtp2_requests))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_seq_tbl_add(g2c.sequenceNumber, vc_conn);</span><br><span 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%);">+ [] CLIENT.receive(PDU_GTPCv2:?) -> value g2c sender vc_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* patch in the next sequence number */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: do this only for outbound requests */</span><br><span style="color: hsl(120, 100%, 40%);">+ g2c.sequenceNumber := int2oct(g_c_seq_nr, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+ g_c_seq_nr := g_c_seq_nr + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* build Gtp2cUnitdata */</span><br><span style="color: hsl(120, 100%, 40%);">+ g2c_ud := { peer := g_peer, gtpc := g2c };</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2C.send(g2c_ud);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (match(g2c, tr_PDU_GTP2C_msgtypes(gtp2_requests))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_seq_tbl_add(g2c.sequenceNumber, vc_conn);</span><br><span 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%);">+ [] CLIENT_PROC.getcall(GTP2EM_register_imsi:{?}) -> param(imsi) sender vc_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_imsi_tbl_add(imsi, vc_conn);</span><br><span style="color: hsl(120, 100%, 40%);">+ CLIENT_PROC.reply(GTP2EM_register_imsi:{imsi}) to vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ [] CLIENT_PROC.getcall(GTP2EM_register_teid:{?}) -> param(teid) sender vc_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_tid_tbl_add(teid, vc_conn);</span><br><span style="color: hsl(120, 100%, 40%);">+ CLIENT_PROC.reply(GTP2EM_register_teid:{teid}) to vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] CLIENT_PROC.getcall(GTP2EM_allocate_teid:{}) -> sender vc_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT4 t := f_alloc_teid();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_tid_tbl_add(t, vc_conn);</span><br><span style="color: hsl(120, 100%, 40%);">+ CLIENT_PROC.reply(GTP2EM_allocate_teid:{} value t) to vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] CLIENT_PROC.getcall(GTP2EM_create_tunnel:{?}) -> param(gtc) sender vc_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+ rx_uecups := f_uecups_xceive({create_tun := gtc}, {create_tun_res:={result:=OK}});</span><br><span style="color: hsl(120, 100%, 40%);">+ CLIENT_PROC.reply(GTP2EM_create_tunnel:{gtc}) to vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] CLIENT_PROC.getcall(GTP2EM_destroy_tunnel:{?}) -> param(gtd) sender vc_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+ rx_uecups := f_uecups_xceive({destroy_tun := gtd}, {destroy_tun_res:={result:=OK}});</span><br><span style="color: hsl(120, 100%, 40%);">+ CLIENT_PROC.reply(GTP2EM_destroy_tunnel:{gtd}) to vc_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] CLIENT_PROC.getcall(GTP2EM_start_program:{?}) -> param(sprog) sender vc_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+ rx_uecups := f_uecups_xceive({start_program := sprog}, {start_program_res:=?});</span><br><span style="color: hsl(120, 100%, 40%);">+ /* if successful: store (pid, vc_conn) tuple so we can route program_term_ind */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rx_uecups.start_program_res.result == OK) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_pid_tbl_add(rx_uecups.start_program_res.pid, vc_conn);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ CLIENT_PROC.reply(GTP2EM_start_program:{sprog} value rx_uecups.start_program_res) to vc_conn;</span><br><span 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%);">+ * Interaction between Main and Client Components</span><br><span style="color: hsl(120, 100%, 40%);">+ ***********************************************************************/</span><br><span style="color: hsl(120, 100%, 40%);">+type port GTP2EM_PT message {</span><br><span style="color: hsl(120, 100%, 40%);">+ inout PDU_GTPCv2, UECUPS_ProgramTermInd;</span><br><span style="color: hsl(120, 100%, 40%);">+} with { extension "internal" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+signature GTP2EM_register_imsi(hexstring imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+signature GTP2EM_register_teid(OCT4 teid);</span><br><span style="color: hsl(120, 100%, 40%);">+signature GTP2EM_allocate_teid() return OCT4;</span><br><span style="color: hsl(120, 100%, 40%);">+signature GTP2EM_create_tunnel(UECUPS_CreateTun gtc);</span><br><span style="color: hsl(120, 100%, 40%);">+signature GTP2EM_destroy_tunnel(UECUPS_DestroyTun gtd);</span><br><span style="color: hsl(120, 100%, 40%);">+signature GTP2EM_start_program(UECUPS_StartProgram sprog) return UECUPS_StartProgramRes;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type port GTP2EM_PROC_PT procedure {</span><br><span style="color: hsl(120, 100%, 40%);">+ inout GTP2EM_register_imsi, GTP2EM_register_teid, GTP2EM_allocate_teid,</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2EM_create_tunnel, GTP2EM_destroy_tunnel, GTP2EM_start_program;</span><br><span style="color: hsl(120, 100%, 40%);">+} with { extension "internal" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * Client Component</span><br><span 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 component GTP2_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ port GTP2EM_PT GTP2;</span><br><span style="color: hsl(120, 100%, 40%);">+ port GTP2EM_PROC_PT GTP2_PROC;</span><br><span 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_gtp2_register_imsi(hexstring imsi) runs on GTP2_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2_PROC.call(GTP2EM_register_imsi:{imsi}) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] GTP2_PROC.getreply(GTP2EM_register_imsi:{imsi});</span><br><span 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_gtp2_register_teid(OCT4 teid) runs on GTP2_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2_PROC.call(GTP2EM_register_teid:{teid}) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] GTP2_PROC.getreply(GTP2EM_register_teid:{teid});</span><br><span 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_gtp2_allocate_teid() runs on GTP2_ConnHdlr return OCT4 {</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT4 t;</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2_PROC.call(GTP2EM_allocate_teid:{}) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] GTP2_PROC.getreply(GTP2EM_allocate_teid:{}) -> value t {</span><br><span style="color: hsl(120, 100%, 40%);">+ return t;</span><br><span 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%);">+function f_gtp2_create_tunnel(template (value) UECUPS_CreateTun gtc)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on GTP2_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2_PROC.call(GTP2EM_create_tunnel:{valueof(gtc)}) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] GTP2_PROC.getreply(GTP2EM_create_tunnel:{gtc});</span><br><span 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_gtp2_destroy_tunnel(template (value) UECUPS_DestroyTun gtd)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on GTP2_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2_PROC.call(GTP2EM_destroy_tunnel:{valueof(gtd)}) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] GTP2_PROC.getreply(GTP2EM_destroy_tunnel:{gtd});</span><br><span 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_gtp2_start_program(template (value) UECUPS_StartProgram sprog)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on GTP2_ConnHdlr return UECUPS_StartProgramRes {</span><br><span style="color: hsl(120, 100%, 40%);">+ var UECUPS_StartProgramRes res;</span><br><span style="color: hsl(120, 100%, 40%);">+ GTP2_PROC.call(GTP2EM_start_program:{valueof(sprog)}) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] GTP2_PROC.getreply(GTP2EM_start_program:{sprog}) -> value res;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return res;</span><br><span 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>diff --git a/library/GTPv2_Templates.ttcn b/library/GTPv2_Templates.ttcn</span><br><span>index 23b0053..3d69017 100644</span><br><span>--- a/library/GTPv2_Templates.ttcn</span><br><span>+++ b/library/GTPv2_Templates.ttcn</span><br><span>@@ -30,6 +30,7 @@</span><br><span> }</span><br><span> </span><br><span> template (present) PDU_GTPCv2 tr_PDU_GTP2C(template OCT4 teid := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) OCT3 seq := ?,</span><br><span> template (present) GTPCv2_PDUs pdus := ?,</span><br><span> template PDU_GTPCv2 piggyback := omit) := {</span><br><span> spare := '000'B,</span><br><span>@@ -39,12 +40,78 @@</span><br><span> messageType := ?,</span><br><span> lengthf := ?,</span><br><span> tEID := teid,</span><br><span style="color: hsl(0, 100%, 40%);">- sequenceNumber := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ sequenceNumber := seq,</span><br><span> spare3 := '00'O,</span><br><span> gtpcv2_pdu := pdus,</span><br><span> piggybackPDU_GTPCv2 := piggyback</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template (present) OCT1 gtp2_requests := (</span><br><span style="color: hsl(120, 100%, 40%);">+ '01'O, // echoRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '20'O, // createSessionRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '5F'O, // createBearerRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '22'O, // modifyBearerRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '24'O, // deleteSessionRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '63'O, // deleteBearerRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ 'A8'O, // deleteIndirectDataForwardingTunnelRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '61'O, // updateBearerRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '42'O, // deleteBearerCommand</span><br><span style="color: hsl(120, 100%, 40%);">+ 'A6'O, // createIndirectDataForwardingTunnelRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ 'AA'O, // releaseAccessBearersRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ 'B3'O, // modifyAccessBearersRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '85'O, // forwardRelocationRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '82'O, // contextRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '80'O, // identificationRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '26'O, // changeNotificationRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '8B'O, // relocationCancelRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ 'A0'O, // createForwardingTunnelRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '65'O, // deletePDN_ConnectionSetRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ 'C8'O, // updatePDN_ConnectionSetRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ '9E'O, // uE_RegistrationQueryRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ 'E7'O, // mBMSSessionStartRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ 'E9'O, // mBMSSessionUpdateRequest</span><br><span style="color: hsl(120, 100%, 40%);">+ 'EB'O // mBMSSessionStopRequest</span><br><span style="color: hsl(120, 100%, 40%);">+);</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) OCT1 gtp2_responses := (</span><br><span style="color: hsl(120, 100%, 40%);">+ '02'O, // echoResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '21'O, // createSessionResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '60'O, // createBearerResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '23'O, // modifyBearerResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '25'O, // deleteSessionResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '64'O, // deleteBearerResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ 'A9'O, // deleteIndirectDataForwardingTunnelResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '62'O, // updateBearerResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '43'O, // deleteBearerFailureIndication</span><br><span style="color: hsl(120, 100%, 40%);">+ 'A7'O, // createIndirectDataForwardingTunnelResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ 'AB'O, // releaseAccessBearersResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ 'B4'O, // modifyAccessBearersResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '86'O, // forwardRelocationResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '83'O, // contextResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '81'O, // identificationResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '27'O, // changeNotificationResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '8C'O, // relocationCancelResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ 'A1'O, // createForwardingTunnelResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '66'O, // deletePDN_ConnectionSetResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ 'C9'O, // updatePDN_ConnectionSetResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ '9F'O, // uE_RegistrationQueryResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ 'E8'O, // mBMSSessionStartResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ 'EA'O, // mBMSSessionUpdateResponse</span><br><span style="color: hsl(120, 100%, 40%);">+ 'EC'O // mBMSSessionStopResponse</span><br><span 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) PDU_GTPCv2 tr_PDU_GTP2C_msgtypes(template (present) OCT1 types) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ t_Bit := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ p_Bit := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ version := '010'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ messageType := types,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthf := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ tEID := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ sequenceNumber := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare3 := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ gtpcv2_pdu := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ piggybackPDU_GTPCv2 := *</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span> </span><br><span> /* 8.3 */</span><br><span> template (value) IMSI ts_GTP2C_Imsi(template (value) hexstring imsi) := {</span><br><span>@@ -62,6 +129,23 @@</span><br><span> iMSI_Value := imsi</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template (present) MSISDN ts_GTP2C_msisdn(template (present) hexstring msisdn) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '4C'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ mSISDN_Value := msisdn</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+private function fs_GTP2C_msisdn(template (omit) hexstring msisdn) return</span><br><span style="color: hsl(120, 100%, 40%);">+template (omit) MSISDN {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (istemplatekind(msisdn, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return omit;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ return ts_GTP2C_msisdn(msisdn);</span><br><span 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> /* 8.4-1 */</span><br><span> /*</span><br><span> type enumerated GTP2C_Cause {</span><br><span>@@ -109,6 +193,25 @@</span><br><span> instanceOfOffendingIE := *,</span><br><span> spare3 := *</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+private function fs_GTP2C_Cause(template (omit) OCT1 cause, template (value) BIT1 cs) return</span><br><span style="color: hsl(120, 100%, 40%);">+template (omit) Cause {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (istemplatekind(cause, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return omit;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ return ts_GTP2C_Cause(cause, cs);</span><br><span 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 fr_GTP2C_Cause(template OCT1 cause) return</span><br><span style="color: hsl(120, 100%, 40%);">+template Cause {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (istemplatekind(cause, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return omit;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (istemplatekind(cause, "*")) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return *;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ return tr_GTP2C_Cause(cause);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> /* 8.5 */</span><br><span> template (value) AccessPointName ts_GTP2C_APN(template (value) octetstring apn) := {</span><br><span>@@ -126,6 +229,41 @@</span><br><span> aPN_Value := apn</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* 8.7 */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) AggregateMaximumBitRate</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_Ambr(integer ambr_ul, integer ambr_dl) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '48'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ aPN_AMBR_for_uplink := int2oct(ambr_ul, 4),</span><br><span style="color: hsl(120, 100%, 40%);">+ aPN_AMBR_for_downlink := int2oct(ambr_dl, 4)</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* 8.8 */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) EPS_BearerID</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_EpsBearerId(template (value) uint4_t bid) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '49'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ ePS_Bearer_ID_Value := bid,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare2 := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalOctets := omit</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) EPS_BearerID</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_EpsBearerId(template (present) uint4_t bid) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '49'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := ?, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ ePS_Bearer_ID_Value := bid,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare2 := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalOctets := *</span><br><span 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> /* 8.14 */</span><br><span> template (value) PDN_AddressAllocation</span><br><span> ts_GTP2C_PdnAddrAlloc(template (value) BIT3 pdn_type,</span><br><span>@@ -156,6 +294,31 @@</span><br><span> tr_GTP2C_PdnAddrAlloc_v4(template (present) OCT4 addr) :=</span><br><span> ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:=addr});</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* 8.15 */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) Bearer_QoS</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_BearerQos(template (value) OCT1 qci,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint40_t max_br_ul, uint40_t max_br_dl,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint40_t g_br_ul, uint40_t g_br_dl,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) BIT4 prio_lvl := '1001'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) BIT1 pe_vuln := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) BIT1 pe_capa := '0'B) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '50'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ pVI := pe_vuln,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare2 := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ pL := prio_lvl,</span><br><span style="color: hsl(120, 100%, 40%);">+ pCI := pe_capa,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare3 := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ labelQCI := qci,</span><br><span style="color: hsl(120, 100%, 40%);">+ maxBitrateUplink := int2oct(max_br_ul, 5),</span><br><span style="color: hsl(120, 100%, 40%);">+ maxBitrateDownLink := int2oct(max_br_dl, 5),</span><br><span style="color: hsl(120, 100%, 40%);">+ guaranteedBitrateUplink := int2oct(g_br_ul, 5),</span><br><span style="color: hsl(120, 100%, 40%);">+ guaranteedBitrateDownLink := int2oct(g_br_dl, 5),</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalOctets := omit</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* 8.17 */</span><br><span> template (value) RAT_Type ts_GTP2C_RatType(template (value) integer rat) := {</span><br><span> elementIdentifier := '53'O,</span><br><span>@@ -174,6 +337,66 @@</span><br><span> additionalOctets := *</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* 8.21 */</span><br><span style="color: hsl(120, 100%, 40%);">+function ts_GTP2C_UserLocInfo(template (omit) CGI cgi := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (omit) SAI sai := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (omit) RAI rai := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (omit) TAI tai := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (omit) ECGI ecgi := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (omit) LAI lai := omit)</span><br><span style="color: hsl(120, 100%, 40%);">+return template (value) UserLocationInfo {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template (value) UserLocationInfo uli;</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.elementIdentifier := '56'O;</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.lengthIndicator := 0; // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.instance := '0000'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.spare := '0000'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.spare2 := '00'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.additionalOctets := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (istemplatekind(cgi, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.cGI_Flag := '0'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.cGI_Flag := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.cGI := cgi;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (istemplatekind(sai, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.sAI_Flag := '0'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.sAI_Flag := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.sAI := sai;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (istemplatekind(rai, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.rAI_Flag := '0'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.rAI_Flag := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.rAI := rai</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (istemplatekind(tai, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.tAI_Flag := '0'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.tAI_Flag := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.tAI := tai</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (istemplatekind(ecgi, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.eCGI_Flag := '0'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.eCGI_Flag := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.eCGI := ecgi;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (istemplatekind(lai, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.lAI_Flag := '0'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.lAI_Flag := '1'B;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ uli.lAI := lai</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return uli;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /* 8.22 */</span><br><span> private function f_bit4oct(template (omit) octetstring os) return BIT1</span><br><span>@@ -184,16 +407,59 @@</span><br><span> return '1'B;</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated FteidInterface {</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S1U_eNodeB_GTPU (0),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S1U_SGW_GTPU (1),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S12_RNC_GTPU (2),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S12_SGW_GTPU (3),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S5S8_SGW_GTPU (4),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S5S8_PGW_GTPU (5),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S5S8_SGW_GTPC (6),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S5S8_PGW_GTPC (7),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S5S8_SGW_PMIPv6 (8),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S5S8_PGW_PMIPv6 (9),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S11_MME_GTPC (10),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S11S4_SGW_GTPC (11),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S10ND26_MME_GTPC (12),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S3_MME_GTPC (13),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S3_SGSN_GTPC (14),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S4_SGSN_GTPU (15),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S4_SGW_GTPU (16),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S16_SGSN_GTPC (18),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_eNB_GTPU_DL_DATA_FW (19),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_eNB_GTPU_UL_DATA_FW (20),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_RNC_GTPU_DATA_FW (21),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_SGSN_GTPU_DATA_FW (22),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_SGWUPF_GTPU_DL_DATA_FW (23),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_Sm_MMBS_GW_GTPC (24),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_Sn_MMBS_GW_GTPC (25),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_Sm_MME_GTPC (26),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_Sn_MME_GTPC (27),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_SGW_GTPU_UL_DATA_FW (28),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_Sn_SGSN_GTPU (29),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S2b_ePDG_GTPC (30),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S2bU_ePDG_GTPU (31),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S2b_PGW_GTPC (32),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S2bU_PGW_GTPU (33),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S2a_TWAN_GTPU (34),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S2a_TWAN_GTPC (35),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S2a_PGW_GTPC (36),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S2a_PGW_GTPU (37),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S11_MME_GTPU (38),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_S11_SGW_GTPU (39),</span><br><span style="color: hsl(120, 100%, 40%);">+ FTEID_IF_N26_AMF_GTPC (40)</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span> template (value) FullyQualifiedTEID</span><br><span style="color: hsl(0, 100%, 40%);">-ts_GTP2C_FTEID(integer if_type, OCT4 teid, template (omit) OCT4 v4_addr := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_FTEID(FteidInterface if_type, OCT4 teid, uint4_t instance := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (omit) OCT4 v4_addr := omit,</span><br><span> template (omit) OCT16 v6_addr := omit) := {</span><br><span> elementIdentifier := '57'O,</span><br><span> lengthIndicator := 0, /* overwritten */</span><br><span style="color: hsl(0, 100%, 40%);">- instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := int2bit(instance, 4),</span><br><span> spare := '0000'B,</span><br><span style="color: hsl(0, 100%, 40%);">- interfaceType := if_type,</span><br><span style="color: hsl(0, 100%, 40%);">- v6_Flag := f_bit4oct(v4_addr),</span><br><span style="color: hsl(0, 100%, 40%);">- v4_Flag := f_bit4oct(v6_addr),</span><br><span style="color: hsl(120, 100%, 40%);">+ interfaceType := enum2int(if_type),</span><br><span style="color: hsl(120, 100%, 40%);">+ v6_Flag := f_bit4oct(v6_addr),</span><br><span style="color: hsl(120, 100%, 40%);">+ v4_Flag := f_bit4oct(v4_addr),</span><br><span> tEID_GRE_Key := teid,</span><br><span> iPv4_Address := v4_addr,</span><br><span> iPv6_Address := v6_addr,</span><br><span>@@ -201,11 +467,12 @@</span><br><span> }</span><br><span> template (present) FullyQualifiedTEID</span><br><span> tr_GTP2C_FTEID(template (present) integer if_type, template (present) OCT4 teid,</span><br><span style="color: hsl(120, 100%, 40%);">+ template BIT4 instance := ?,</span><br><span> template OCT4 v4_addr := omit,</span><br><span> template OCT16 v6_addr := omit) := {</span><br><span> elementIdentifier := '57'O,</span><br><span> lengthIndicator := ?,</span><br><span style="color: hsl(0, 100%, 40%);">- instance := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := instance,</span><br><span> spare := '0000'B,</span><br><span> interfaceType := if_type,</span><br><span> v6_Flag := ?,</span><br><span>@@ -216,6 +483,134 @@</span><br><span> additionalOctets := omit</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* 8.28 */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) BearerContextGrouped</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_BcGrouped(template (value) BearerContextIEs ies) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '5D'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ bearerContextIEs := ies</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) BearerContextGrouped</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_BcGrouped(template (present) BearerContextIEs ies) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '5D'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := ?, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ bearerContextIEs := ies</span><br><span 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%);">+/* 8.30 */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) ChargingCharacteristics</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_ChargingCaracteristics(template (value) OCT2 cc) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '5F'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ chargingCharacteristicsValue := cc,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalOctets := omit</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) ChargingCharacteristics</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_ChargingCaracteristics(template (present) OCT2 cc) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '5F'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := ?, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ chargingCharacteristicsValue := cc,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalOctets := omit</span><br><span 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%);">+/* 8.34 */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDN_Type</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_PdnType(template (value) BIT3 pdn_type) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '63'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ pDN_TypeValue := pdn_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare2 := '00000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalOctets := omit</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) PDN_Type</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_PdnType(template (present) BIT3 pdn_type) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '63'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ pDN_TypeValue := pdn_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare2 := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalOctets := *</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* 8.35 */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) ProcedureTransactionID</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_ProcTransId(template (value) integer pti) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '64'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ pTI_Value := pti,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalOctets := omit</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) ProcedureTransactionID</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_ProcTransId(template (present) integer pti) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '64'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ instance :=?,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ pTI_Value := pti,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalOctets := *</span><br><span 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%);">+/* 8.57 */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) APN_Restriction</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_ApnRestriction(template (value) integer val) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '7F'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ restrictionTypeValue := val,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalOctets := omit</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) APN_Restriction</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_ApnRestriction(template (present) integer val) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '7F'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ restrictionTypeValue := val,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalOctets := *</span><br><span 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%);">+/* 8.58 */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) SelectionMode</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_SelectionMode(template (value) integer mode) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '80'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := 0, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ selectionModeValue := mode,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare2 := '000000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalOctets := omit</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) SelectionMode</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_SelectionMode(template (present) integer mode) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '80'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ selectionModeValue := mode,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare2 := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalOctets := *</span><br><span 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> </span><br><span> </span><br><span> template (value) PDU_GTPCv2 ts_PDU_GTP2C(template (omit) OCT4 teid, template (value) OCT3 seq,</span><br><span>@@ -236,8 +631,117 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_GTPCv2</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_EchoReq(template (value) integer rec_val) :=</span><br><span style="color: hsl(120, 100%, 40%);">+ts_PDU_GTP2C(omit, '000000'O, '01'O, {</span><br><span style="color: hsl(120, 100%, 40%);">+ echoRequest := {</span><br><span style="color: hsl(120, 100%, 40%);">+ recovery := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '03'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ recoveryValue := rec_val</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ sendingNodeFeatures := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ privateExtension := omit</span><br><span style="color: hsl(120, 100%, 40%);">+ }});</span><br><span> template (present) PDU_GTPCv2</span><br><span style="color: hsl(0, 100%, 40%);">-tr_GTP2C_CreateSessionReq(template (present) hexstring imsi) := tr_PDU_GTP2C('00000000'O, {</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_EchoReq(template (present) OCT3 seq := ?) :=</span><br><span style="color: hsl(120, 100%, 40%);">+tr_PDU_GTP2C(omit, seq, { echoRequest := ? }, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_GTPCv2</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_EchoResp(template (value) integer rec_val) :=</span><br><span style="color: hsl(120, 100%, 40%);">+ts_PDU_GTP2C(omit, '000000'O, '02'O, {</span><br><span style="color: hsl(120, 100%, 40%);">+ echoRequest := {</span><br><span style="color: hsl(120, 100%, 40%);">+ recovery := {</span><br><span style="color: hsl(120, 100%, 40%);">+ elementIdentifier := '03'O,</span><br><span style="color: hsl(120, 100%, 40%);">+ lengthIndicator := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ instance := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ recoveryValue := rec_val</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ sendingNodeFeatures := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ privateExtension := omit</span><br><span style="color: hsl(120, 100%, 40%);">+ }});</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) PDU_GTPCv2</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_EchoResp(template (present) OCT3 seq := ?) :=</span><br><span style="color: hsl(120, 100%, 40%);">+tr_PDU_GTP2C(omit, seq, { echoResponse := ? }, omit);</span><br><span 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) PDU_GTPCv2</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_CreateSessionReq(template (value) hexstring imsi, template (omit) hexstring msisdn,</span><br><span style="color: hsl(120, 100%, 40%);">+ integer rat_type, template (value) FullyQualifiedTEID sender_fteid,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) octetstring apn, template (value) BIT3 pdn_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (omit) FullyQualifiedTEID_List teid_list,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) OCT2 chg_car, template (value) uint4_t bearer_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) Bearer_QoS qos := ts_GTP2C_BearerQos('09'O, 0,0,0,0)) :=</span><br><span style="color: hsl(120, 100%, 40%);">+ts_PDU_GTP2C('00000000'O, '000000'O, '20'O, {</span><br><span style="color: hsl(120, 100%, 40%);">+ createSessionRequest := {</span><br><span style="color: hsl(120, 100%, 40%);">+ iMSI := ts_GTP2C_Imsi(imsi),</span><br><span style="color: hsl(120, 100%, 40%);">+ mSISDN := fs_GTP2C_msisdn(msisdn),</span><br><span style="color: hsl(120, 100%, 40%);">+ mEI := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ userLocationInfo := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ servingNetwork := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ rAT_Type := ts_GTP2C_RatType(rat_type),</span><br><span style="color: hsl(120, 100%, 40%);">+ indication := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ fullyQualifiedTEID := { sender_fteid },</span><br><span style="color: hsl(120, 100%, 40%);">+ accessPointName := ts_GTP2C_APN(apn),</span><br><span style="color: hsl(120, 100%, 40%);">+ selectionMode := ts_GTP2C_SelectionMode(0),</span><br><span style="color: hsl(120, 100%, 40%);">+ pDN_Type := ts_GTP2C_PdnType(pdn_type),</span><br><span style="color: hsl(120, 100%, 40%);">+ pDN_AddressAllocation := ts_GTP2C_PdnAddrAlloc('001'B, {iPv4_Address:='00000000'O}),</span><br><span style="color: hsl(120, 100%, 40%);">+ maxAPN_Restriction := ts_GTP2C_ApnRestriction(0),</span><br><span style="color: hsl(120, 100%, 40%);">+ ambr := ts_GTP2C_Ambr(102400, 102400),</span><br><span style="color: hsl(120, 100%, 40%);">+ linkedEPS_Bearer_ID := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ trustedWLANModeIndication := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ protocolConfigOptions := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ bearerContextGrouped := {</span><br><span style="color: hsl(120, 100%, 40%);">+ ts_GTP2C_BcGrouped({</span><br><span style="color: hsl(120, 100%, 40%);">+ ePS_Bearer_ID := ts_GTP2C_EpsBearerId(bearer_id),</span><br><span style="color: hsl(120, 100%, 40%);">+ cause := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ ePS_Bearer_TFT := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ fullyQualifiedTEID := teid_list,</span><br><span style="color: hsl(120, 100%, 40%);">+ bearerLevel_QoS := qos,</span><br><span style="color: hsl(120, 100%, 40%);">+ chargingID := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ bearerFlags := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ transactionIdentifier := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ protocolConfigOptions := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ rAN_NASCause := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalProtocolConfigOptions := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ extendedProtocolConfigOptions := omit</span><br><span style="color: hsl(120, 100%, 40%);">+ })</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ traceInformation := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ recovery := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ csid := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ uE_TimeZone := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ user_CSG_Information := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ chargingCharacteristics := ts_GTP2C_ChargingCaracteristics(chg_car),</span><br><span style="color: hsl(120, 100%, 40%);">+ lDN := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ signallingPriorityIndication := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ iP_Addr := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ portNumber := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ aPCO := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ trustedWLANAccessNetworkIdentifier := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ cNOperatorSelectionEntity := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ presenceReportingAreaInformation := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ overloadControlInformationGrouped := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ originationTimeStamp := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ maximumWaitTime := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ wLANLocationTimestamp := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ nBIFOMContainer := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ remoteUEContextGrouped := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ nodeIdentifier := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ extendedProtocolConfigOptions := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ servingPLMNRateControl := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ counter := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ privateExtension := omit</span><br><span 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) PDU_GTPCv2</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_CreateSessionReq(template (present) hexstring imsi) :=</span><br><span style="color: hsl(120, 100%, 40%);">+tr_PDU_GTP2C('00000000'O, ?, {</span><br><span> createSessionRequest := {</span><br><span> iMSI := tr_GTP2C_Imsi(imsi),</span><br><span> mSISDN := *,</span><br><span>@@ -287,7 +791,7 @@</span><br><span> template (value) PDU_GTPCv2</span><br><span> ts_GTP2C_CreateSessionResp(template (value) FullyQualifiedTEID_List fteids,</span><br><span> template (value) PDN_AddressAllocation addr) :=</span><br><span style="color: hsl(0, 100%, 40%);">-ts_PDU_GTP2C('00000000'O, '000000'O, '20'O, {</span><br><span style="color: hsl(120, 100%, 40%);">+ts_PDU_GTP2C('00000000'O, '000000'O, '21'O, {</span><br><span> createSessionResponse := {</span><br><span> cause := ts_GTP2C_Cause(int2oct(16, 1), '0'B),</span><br><span> changeReportingAction := omit,</span><br><span>@@ -317,6 +821,219 @@</span><br><span> extendedProtocolConfigOptions := omit,</span><br><span> privateExtension := omit</span><br><span> }});</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) PDU_GTPCv2</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_CreateSessionResp(template (present) OCT4 d_teid := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) OCT3 seq := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) OCT1 cause := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template FullyQualifiedTEID_List fteids := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ template PDN_AddressAllocation addr := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ template BearerContextGrouped_List bctxg := *) :=</span><br><span style="color: hsl(120, 100%, 40%);">+tr_PDU_GTP2C(d_teid, seq, {</span><br><span style="color: hsl(120, 100%, 40%);">+ createSessionResponse := {</span><br><span style="color: hsl(120, 100%, 40%);">+ cause := tr_GTP2C_Cause(cause),</span><br><span style="color: hsl(120, 100%, 40%);">+ changeReportingAction := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ cSG_InformationReportingAction := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ heNBInformationReporting := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ fullyQualifiedTEID := fteids,</span><br><span style="color: hsl(120, 100%, 40%);">+ pDN_AddressAllocation := addr,</span><br><span style="color: hsl(120, 100%, 40%);">+ aPN_Restriction := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ ambr := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ linkedEPS_Bearer_ID := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ protocolConfigOptions := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ bearerContextGrouped := bctxg,</span><br><span style="color: hsl(120, 100%, 40%);">+ recovery := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ chargingGatewayName := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ chargingGatewayAddress := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ csid := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ lDN := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ pGW_Back_OffTime := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ aPCO := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ trustedWLANIPv4Parameters := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ indicationFlags := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ presenceReportingAreaAction := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ loadControlInformationGrouped := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ overloadControlInformationGrouped := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ nBIFOMContainer := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ pDNConnectionChargingID := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ extendedProtocolConfigOptions := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ privateExtension := *</span><br><span 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) PDU_GTPCv2</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_DeleteSessionReq(template (value) OCT4 d_teid,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (omit) OCT1 cause := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) FullyQualifiedTEID sender_fteid,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (omit) FullyQualifiedTEID_List teid_list := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) uint4_t bearer_id) :=</span><br><span style="color: hsl(120, 100%, 40%);">+ts_PDU_GTP2C(d_teid, '000000'O, '24'O, {</span><br><span style="color: hsl(120, 100%, 40%);">+ deleteSessionRequest := {</span><br><span style="color: hsl(120, 100%, 40%);">+ cause := fs_GTP2C_Cause(cause, '0'B),</span><br><span style="color: hsl(120, 100%, 40%);">+ linkedEPS_Bearer_ID := ts_GTP2C_EpsBearerId(bearer_id),</span><br><span style="color: hsl(120, 100%, 40%);">+ uLI := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ indicationFlags := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ protocolConfigOptions := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ originatingNode := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ fullyQualifiedTEID := sender_fteid,</span><br><span style="color: hsl(120, 100%, 40%);">+ uE_TimeZone := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ uLITimestamp := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ rANNASReleaseCause := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ trustedWLANAccessNetworkIdentifier := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ tWANIdentifierTimestamp := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ overloadControlInformationGrouped := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ uELocalIP_Addr := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ portNumber := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ extendedProtocolConfigOptions := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ privateExtension := omit</span><br><span style="color: hsl(120, 100%, 40%);">+ }});</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) PDU_GTPCv2</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_DeleteSessionReq(template (present) OCT4 d_teid,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) OCT3 seq := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (omit) OCT1 cause,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) FullyQualifiedTEID sender_fteid,</span><br><span style="color: hsl(120, 100%, 40%);">+ template FullyQualifiedTEID_List teid_list,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) uint4_t bearer_id) :=</span><br><span style="color: hsl(120, 100%, 40%);">+tr_PDU_GTP2C(d_teid, seq, {</span><br><span style="color: hsl(120, 100%, 40%);">+ deleteSessionRequest := {</span><br><span style="color: hsl(120, 100%, 40%);">+ cause := fr_GTP2C_Cause(cause),</span><br><span style="color: hsl(120, 100%, 40%);">+ linkedEPS_Bearer_ID := tr_GTP2C_EpsBearerId(bearer_id),</span><br><span style="color: hsl(120, 100%, 40%);">+ uLI := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ indicationFlags := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ protocolConfigOptions := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ originatingNode := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ fullyQualifiedTEID := sender_fteid,</span><br><span style="color: hsl(120, 100%, 40%);">+ uE_TimeZone := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ uLITimestamp := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ rANNASReleaseCause := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ trustedWLANAccessNetworkIdentifier := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ tWANIdentifierTimestamp := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ overloadControlInformationGrouped := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ uELocalIP_Addr := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ portNumber := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ extendedProtocolConfigOptions := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ privateExtension := *</span><br><span 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) PDU_GTPCv2</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_DeleteSessionResp(template (value) OCT4 d_teid,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) OCT3 seq,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) OCT1 cause) :=</span><br><span style="color: hsl(120, 100%, 40%);">+ts_PDU_GTP2C(d_teid, '000000'O, '25'O, {</span><br><span style="color: hsl(120, 100%, 40%);">+ deleteSessionResponse := {</span><br><span style="color: hsl(120, 100%, 40%);">+ cause := ts_GTP2C_Cause(cause, '0'B),</span><br><span style="color: hsl(120, 100%, 40%);">+ recovery := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ protocolConfigOptions := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ indicationFlags := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ loadControlInformationGrouped := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ overloadControlInformationGrouped := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ extendedProtocolConfigOptions := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ privateExtension := omit</span><br><span 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) PDU_GTPCv2</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_DeleteSessionResp(template (present) OCT4 d_teid,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) OCT3 seq := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) OCT1 cause := ?</span><br><span style="color: hsl(120, 100%, 40%);">+ ) :=</span><br><span style="color: hsl(120, 100%, 40%);">+tr_PDU_GTP2C(d_teid, seq, {</span><br><span style="color: hsl(120, 100%, 40%);">+ deleteSessionResponse := {</span><br><span style="color: hsl(120, 100%, 40%);">+ cause := tr_GTP2C_Cause(cause),</span><br><span style="color: hsl(120, 100%, 40%);">+ recovery := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ protocolConfigOptions := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ indicationFlags := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ loadControlInformationGrouped := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ overloadControlInformationGrouped := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ extendedProtocolConfigOptions := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ privateExtension := *</span><br><span 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) PDU_GTPCv2</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_CreateBearerReq(template (value) OCT4 d_teid,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) integer proc_trans_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) uint4_t linked_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) uint4_t bearer_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (omit) FullyQualifiedTEID_List teid_list,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) Bearer_QoS qos := ts_GTP2C_BearerQos('09'O, 0,0,0,0)) :=</span><br><span style="color: hsl(120, 100%, 40%);">+ts_PDU_GTP2C(d_teid, '000000'O, '5F'O, {</span><br><span style="color: hsl(120, 100%, 40%);">+ createBearerRequest := {</span><br><span style="color: hsl(120, 100%, 40%);">+ procedureTransactionID := ts_GTP2C_ProcTransId(proc_trans_id),</span><br><span style="color: hsl(120, 100%, 40%);">+ linkedEPS_BearerID := ts_GTP2C_EpsBearerId(linked_id),</span><br><span style="color: hsl(120, 100%, 40%);">+ protocolConfigOptions := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ bearerContextGrouped := {</span><br><span style="color: hsl(120, 100%, 40%);">+ ts_GTP2C_BcGrouped({</span><br><span style="color: hsl(120, 100%, 40%);">+ ePS_Bearer_ID := ts_GTP2C_EpsBearerId(bearer_id),</span><br><span style="color: hsl(120, 100%, 40%);">+ cause := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ ePS_Bearer_TFT := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ fullyQualifiedTEID := teid_list,</span><br><span style="color: hsl(120, 100%, 40%);">+ bearerLevel_QoS := qos,</span><br><span style="color: hsl(120, 100%, 40%);">+ chargingID := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ bearerFlags := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ transactionIdentifier := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ protocolConfigOptions := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ rAN_NASCause := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ additionalProtocolConfigOptions := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ extendedProtocolConfigOptions := omit</span><br><span style="color: hsl(120, 100%, 40%);">+ })</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ csid := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ changeReportingAction := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ cSG_InformationReportingAction := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ heNBInformationReporting := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ presenceReportingAreaAction := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ indicationFlags := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ loadControlInformationGrouped := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ overloadControlInformationGrouped := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ nBIFOMContainer := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ privateExtension := omit</span><br><span 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) PDU_GTPCv2</span><br><span style="color: hsl(120, 100%, 40%);">+ts_GTP2C_DeleteBearerReq(template (value) OCT4 d_teid,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) integer proc_trans_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) uint4_t bearer_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (value) OCT1 cause) :=</span><br><span style="color: hsl(120, 100%, 40%);">+ts_PDU_GTP2C(d_teid, '000000'O, '63'O, {</span><br><span style="color: hsl(120, 100%, 40%);">+ deleteBearerRequest := {</span><br><span style="color: hsl(120, 100%, 40%);">+ epsBearerIdentity := { ts_GTP2C_EpsBearerId(bearer_id) },</span><br><span style="color: hsl(120, 100%, 40%);">+ bearerContextGrouped := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ procedureTransactionID := ts_GTP2C_ProcTransId(proc_trans_id),</span><br><span style="color: hsl(120, 100%, 40%);">+ protocolConfigOptions := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ csid := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ cause := ts_GTP2C_Cause(cause, '0'B),</span><br><span style="color: hsl(120, 100%, 40%);">+ indicationFlags := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ loadControlInformationGrouped := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ overloadControlInformationGrouped := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ nBIFOMContainer := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ extendedProtocolConfigOptions := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ privateExtension := omit</span><br><span 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) PDU_GTPCv2</span><br><span style="color: hsl(120, 100%, 40%);">+tr_GTP2C_DeleteBearerResp(template (present) OCT4 d_teid,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) OCT3 seq := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+ template (present) OCT1 cause := ?) :=</span><br><span style="color: hsl(120, 100%, 40%);">+tr_PDU_GTP2C(d_teid, seq, {</span><br><span style="color: hsl(120, 100%, 40%);">+ deleteBearerResponse := {</span><br><span style="color: hsl(120, 100%, 40%);">+ cause := tr_GTP2C_Cause(cause),</span><br><span style="color: hsl(120, 100%, 40%);">+ linkedBearerIdentity := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ bearerContextGrouped := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ recovery := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ csid := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ protocolConfigOptions := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ uE_TimeZone := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ uLI := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ uLITimestamp := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ trustedWLANAccessNetworkIdentifier := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ tWANIdentifierTimestamp := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ overloadControlInformationGrouped := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ iP_Addr := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ portNumber := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ nBIFOMContainer := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ privateExtension := *</span><br><span style="color: hsl(120, 100%, 40%);">+ }});</span><br><span> </span><br><span> </span><br><span> </span><br><span>diff --git a/library/General_Types.ttcn b/library/General_Types.ttcn</span><br><span>index da396b7..40f0770 100644</span><br><span>--- a/library/General_Types.ttcn</span><br><span>+++ b/library/General_Types.ttcn</span><br><span>@@ -147,6 +147,7 @@</span><br><span> type octetstring OCT3_14n length(3..14) with { variant "" };</span><br><span> type octetstring OCT3_17n length(3..17) with { variant "" };</span><br><span> type octetstring OCT4_8n length(4..8) with { variant "" };</span><br><span style="color: hsl(120, 100%, 40%);">+ type octetstring OCT4_16n length(4..16) with { variant "" };</span><br><span> </span><br><span> </span><br><span> //****************************************************</span><br><span>diff --git a/library/Osmocom_Types.ttcn b/library/Osmocom_Types.ttcn</span><br><span>index 2e71123..3b2ca17 100644</span><br><span>--- a/library/Osmocom_Types.ttcn</span><br><span>+++ b/library/Osmocom_Types.ttcn</span><br><span>@@ -34,6 +34,7 @@</span><br><span> type integer uint13_t (0..8191) with { variant "unsigned 13 bit" };</span><br><span> type integer uint14_t (0..16383) with { variant "unsigned 14 bit" };</span><br><span> type integer uint15_t (0..32767) with { variant "unsigned 15 bit" };</span><br><span style="color: hsl(120, 100%, 40%);">+ type integer uint40_t (0..1099511627776) with { variant "unsigned 40 bit" };</span><br><span> </span><br><span> </span><br><span> const uint16_t c_UINT16_MAX := 65535;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17867">change 17867</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/+/17867"/><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: If73aa453e44ebf28032c60d207feb03e8061dc0c </div>
<div style="display:none"> Gerrit-Change-Number: 17867 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>