<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/17867">View Change</a></p><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,197 insertions(+), 11 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/67/17867/1</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..4930d52</span><br><span>--- /dev/null</span><br><span>+++ b/library/GTPv2_Emulation.ttcn</span><br><span>@@ -0,0 +1,531 @@</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_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 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%);">+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%);">+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%);">+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_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_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 IMSI or TEID */</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%);">+                   TEID0.send(g2c_ud.gtpc) to vc_conn;</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%);">+</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%);">+           }</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%);">+           }</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});</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});</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);</span><br><span 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..af3b84b 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,7 +40,7 @@</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>@@ -62,6 +63,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 +127,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 +163,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 +228,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 +271,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 +341,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 +401,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 +417,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 +565,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 +725,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 +755,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: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>