<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15822">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">stp: Introduce STP_Tests*.ttcn for testing OsmoSTP<br><br>In the past, we were automatically running [large parts of] the nplab<br>M3UA and SUA test suites, but those implement only a fraction of the<br>functionality.  Particularly, they don't cover the non-standard IPA<br>behavior, and they don't cover RKM (routing key management).<br><br>Let's introduce an initial set of STP tests with this patch.  We try<br>to not duplicate nplab here, and implement bits not covered there.<br><br>Change-Id: I628a87385cac0dfe708a0d74a5088fbd5a4790cd<br>---<br>M Makefile<br>A library/M3UA_CodecPort.ttcn<br>A library/M3UA_CodecPort_CtrlFunct.ttcn<br>A library/M3UA_CodecPort_CtrlFunctDef.cc<br>A library/M3UA_Templates.ttcn<br>M library/SCCP_Templates.ttcn<br>A stp/STP_Tests.cfg<br>A stp/STP_Tests.default<br>A stp/STP_Tests.ttcn<br>A stp/STP_Tests_Common.ttcn<br>A stp/STP_Tests_IPA.ttcn<br>A stp/STP_Tests_M3UA.ttcn<br>A stp/gen_links.sh<br>A stp/osmo-stp.cfg<br>A stp/regen_makefile.sh<br>15 files changed, 2,048 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Makefile b/Makefile</span><br><span>index 99243d6..4ceacf3 100644</span><br><span>--- a/Makefile</span><br><span>+++ b/Makefile</span><br><span>@@ -13,7 +13,7 @@</span><br><span> # See the License for the specific language governing permissions and</span><br><span> # limitations under the License.</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-SUBDIRS=bsc bsc-nat bts ggsn_tests hlr mgw msc pcu remsim sccp selftest sgsn sip sysinfo</span><br><span style="color: hsl(120, 100%, 40%);">+SUBDIRS=bsc bsc-nat bts ggsn_tests hlr mgw msc pcu remsim sccp selftest sgsn sip stp sysinfo</span><br><span> </span><br><span> NPROC=$(shell nproc 2>/dev/null)</span><br><span> ifeq ($(NPROC),)</span><br><span>diff --git a/library/M3UA_CodecPort.ttcn b/library/M3UA_CodecPort.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..94d16d6</span><br><span>--- /dev/null</span><br><span>+++ b/library/M3UA_CodecPort.ttcn</span><br><span>@@ -0,0 +1,84 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module M3UA_CodecPort {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Simple M3UA Codec Port, translating between raw SCTP primitives with</span><br><span style="color: hsl(120, 100%, 40%);">+ * octetstring payload towards the IPL4asp provider, and M3UA primitives</span><br><span style="color: hsl(120, 100%, 40%);">+ * which carry the decoded M3UA data types as payload.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 by 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%);">+ import from IPL4asp_PortType all;</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 M3UA_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ type record M3UA_RecvFrom {</span><br><span style="color: hsl(120, 100%, 40%);">+           ConnectionId    connId,</span><br><span style="color: hsl(120, 100%, 40%);">+               HostName        remName,</span><br><span style="color: hsl(120, 100%, 40%);">+              PortNumber      remPort,</span><br><span style="color: hsl(120, 100%, 40%);">+              HostName        locName,</span><br><span style="color: hsl(120, 100%, 40%);">+              PortNumber      locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+              PDU_M3UA        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%);">+  template M3UA_RecvFrom t_M3UA_RecvFrom(template PDU_M3UA msg) := {</span><br><span style="color: hsl(120, 100%, 40%);">+            connId := ?,</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   type record M3UA_Send {</span><br><span style="color: hsl(120, 100%, 40%);">+               ConnectionId    connId,</span><br><span style="color: hsl(120, 100%, 40%);">+               integer         stream,</span><br><span style="color: hsl(120, 100%, 40%);">+               PDU_M3UA        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%);">+   template M3UA_Send t_M3UA_Send(template ConnectionId connId, template PDU_M3UA msg,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template (omit) integer stream := omit) := {</span><br><span style="color: hsl(120, 100%, 40%);">+          connId := connId,</span><br><span style="color: hsl(120, 100%, 40%);">+             stream := stream,</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   private function IPL4_to_M3UA_RecvFrom(in ASP_RecvFrom pin, out M3UA_RecvFrom pout) {</span><br><span style="color: hsl(120, 100%, 40%);">+         pout.connId := pin.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+            pout.remName := pin.remName;</span><br><span style="color: hsl(120, 100%, 40%);">+          pout.remPort := pin.remPort;</span><br><span style="color: hsl(120, 100%, 40%);">+          pout.locName := pin.locName;</span><br><span style="color: hsl(120, 100%, 40%);">+          pout.locPort := pin.locPort;</span><br><span style="color: hsl(120, 100%, 40%);">+          pout.msg := dec_PDU_M3UA(pin.msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    } with { extension "prototype(fast)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   private function M3UA_to_IPL4_Send(in M3UA_Send pin, out ASP_Send pout) {</span><br><span style="color: hsl(120, 100%, 40%);">+             pout.connId := pin.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+            pout.proto := {</span><br><span style="color: hsl(120, 100%, 40%);">+                       sctp := {</span><br><span style="color: hsl(120, 100%, 40%);">+                             sinfo_stream := pin.stream,</span><br><span style="color: hsl(120, 100%, 40%);">+                           sinfo_ppid := 3,</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%);">+            pout.msg := enc_PDU_M3UA(pin.msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    } with { extension "prototype(fast)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   type port M3UA_CODEC_PT message {</span><br><span style="color: hsl(120, 100%, 40%);">+             out     M3UA_Send;</span><br><span style="color: hsl(120, 100%, 40%);">+            in      M3UA_RecvFrom,</span><br><span style="color: hsl(120, 100%, 40%);">+                        ASP_ConnId_ReadyToRelease,</span><br><span style="color: hsl(120, 100%, 40%);">+                    ASP_Event;</span><br><span style="color: hsl(120, 100%, 40%);">+    } with { extension "user IPL4asp_PT</span><br><span style="color: hsl(120, 100%, 40%);">+              out(M3UA_Send -> ASP_Send:function(M3UA_to_IPL4_Send))</span><br><span style="color: hsl(120, 100%, 40%);">+             in(ASP_RecvFrom -> M3UA_RecvFrom: function(IPL4_to_M3UA_RecvFrom);</span><br><span style="color: hsl(120, 100%, 40%);">+            ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;</span><br><span style="color: hsl(120, 100%, 40%);">+            ASP_Event -> ASP_Event: simple)"</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/M3UA_CodecPort_CtrlFunct.ttcn b/library/M3UA_CodecPort_CtrlFunct.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..fc38e43</span><br><span>--- /dev/null</span><br><span>+++ b/library/M3UA_CodecPort_CtrlFunct.ttcn</span><br><span>@@ -0,0 +1,44 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module M3UA_CodecPort_CtrlFunct {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  import from M3UA_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+  import from IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_listen(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout M3UA_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in HostName locName,</span><br><span style="color: hsl(120, 100%, 40%);">+    in PortNumber locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ProtoTuple proto,</span><br><span style="color: hsl(120, 100%, 40%);">+    in OptionList options := {}</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout M3UA_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in HostName remName,</span><br><span style="color: hsl(120, 100%, 40%);">+    in PortNumber remPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    in HostName locName,</span><br><span style="color: hsl(120, 100%, 40%);">+    in PortNumber locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ConnectionId connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ProtoTuple proto,</span><br><span style="color: hsl(120, 100%, 40%);">+    in OptionList options := {}</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_close(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout M3UA_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ConnectionId id,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ProtoTuple proto := { unspecified := {} }</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_setUserData(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout M3UA_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ConnectionId id,</span><br><span style="color: hsl(120, 100%, 40%);">+    in UserData userData</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_getUserData(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout M3UA_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ConnectionId id,</span><br><span style="color: hsl(120, 100%, 40%);">+    out UserData userData</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span 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/M3UA_CodecPort_CtrlFunctDef.cc b/library/M3UA_CodecPort_CtrlFunctDef.cc</span><br><span>new file mode 100644</span><br><span>index 0000000..62533de</span><br><span>--- /dev/null</span><br><span>+++ b/library/M3UA_CodecPort_CtrlFunctDef.cc</span><br><span>@@ -0,0 +1,56 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#include "IPL4asp_PortType.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "M3UA_CodecPort.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "IPL4asp_PT.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+namespace M3UA__CodecPort__CtrlFunct {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  IPL4asp__Types::Result f__IPL4__listen(</span><br><span style="color: hsl(120, 100%, 40%);">+    M3UA__CodecPort::M3UA__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::HostName& locName,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::PortNumber& locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ProtoTuple& proto,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::OptionList& options)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return f__IPL4__PROVIDER__listen(portRef, locName, locPort, proto, options);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+  </span><br><span style="color: hsl(120, 100%, 40%);">+  IPL4asp__Types::Result f__IPL4__connect(</span><br><span style="color: hsl(120, 100%, 40%);">+    M3UA__CodecPort::M3UA__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::HostName& remName,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::PortNumber& remPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::HostName& locName,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::PortNumber& locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ConnectionId& connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ProtoTuple& proto,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::OptionList& options)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return f__IPL4__PROVIDER__connect(portRef, remName, remPort,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      locName, locPort, connId, proto, options);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  IPL4asp__Types::Result f__IPL4__close(</span><br><span style="color: hsl(120, 100%, 40%);">+    M3UA__CodecPort::M3UA__CODEC__PT& portRef, </span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ConnectionId& connId, </span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ProtoTuple& proto)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+      return f__IPL4__PROVIDER__close(portRef, connId, proto);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  IPL4asp__Types::Result f__IPL4__setUserData(</span><br><span style="color: hsl(120, 100%, 40%);">+    M3UA__CodecPort::M3UA__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ConnectionId& connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::UserData& userData)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return f__IPL4__PROVIDER__setUserData(portRef, connId, userData);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+  </span><br><span style="color: hsl(120, 100%, 40%);">+  IPL4asp__Types::Result f__IPL4__getUserData(</span><br><span style="color: hsl(120, 100%, 40%);">+    M3UA__CodecPort::M3UA__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ConnectionId& connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    IPL4asp__Types::UserData& userData)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return f__IPL4__PROVIDER__getUserData(portRef, connId, userData);</span><br><span 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/M3UA_Templates.ttcn b/library/M3UA_Templates.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..02b493c</span><br><span>--- /dev/null</span><br><span>+++ b/library/M3UA_Templates.ttcn</span><br><span>@@ -0,0 +1,771 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module M3UA_Templates {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* M3UA Templates, building on top of M3UA_Types from Ericsson.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 by 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%);">+import from M3UA_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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT1 c_M3UA_VERSION := '01'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT2 c_M3UA_ST_T_STATE_CHG := '0001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT2 c_M3UA_ST_I_RESERVED := '0001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT2 c_M3UA_ST_I_AS_INACTIVE := '0002'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT2 c_M3UA_ST_I_AS_ACTIVE := '0003'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT2 c_M3UA_ST_I_AS_PENDING := '0004'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT2 c_M3UA_ST_T_OTHER := '0002'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT2 c_M3UA_ST_I_INSUFF_RESRC := '0001'O</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT2 c_M3UA_ST_I_ALTERNATE_ASP := '0002'O</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT2 c_M3UA_ST_I_ASP_FAILUREP := '0003'O</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_aspid_or_omit(template (omit) OCT4 aspid)</span><br><span style="color: hsl(120, 100%, 40%);">+return template (omit) M3UA_ASP_Identifier {</span><br><span style="color: hsl(120, 100%, 40%);">+  var template (omit) M3UA_ASP_Identifier id;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (istemplatekind(aspid, "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%);">+              id.tag := '0011'O;</span><br><span style="color: hsl(120, 100%, 40%);">+            id.lengthInd := 8;</span><br><span style="color: hsl(120, 100%, 40%);">+            id.aSPIdentifier := aspid;</span><br><span style="color: hsl(120, 100%, 40%);">+            return id;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function tr_M3UA_asp_id(template OCT4 aspid)</span><br><span style="color: hsl(120, 100%, 40%);">+return template M3UA_ASP_Identifier {</span><br><span style="color: hsl(120, 100%, 40%);">+   var template M3UA_ASP_Identifier id := {</span><br><span style="color: hsl(120, 100%, 40%);">+              tag := '0011'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+               aSPIdentifier := aspid</span><br><span style="color: hsl(120, 100%, 40%);">+        };</span><br><span style="color: hsl(120, 100%, 40%);">+    if (istemplatekind(aspid, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+                return omit;</span><br><span style="color: hsl(120, 100%, 40%);">+  } else if (istemplatekind(aspid, "*")) {</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 id;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * ASPSM Class</span><br><span 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_M3UA ts_M3UA_ASPUP(template (omit) OCT4 aspid := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  template (omit) octetstring infostr := omit) := {</span><br><span style="color: hsl(120, 100%, 40%);">+     m3UA_ASPUP := {</span><br><span style="color: hsl(120, 100%, 40%);">+               version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0301'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        aSP_Identifier := f_aspid_or_omit(aspid),</span><br><span style="color: hsl(120, 100%, 40%);">+                     info_String := 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_M3UA tr_M3UA_ASPUP(template OCT4 aspid := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       template octetstring infostr := omit) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  m3UA_ASPUP := {</span><br><span style="color: hsl(120, 100%, 40%);">+               version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0301'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        aSP_Identifier := tr_M3UA_asp_id(aspid),</span><br><span style="color: hsl(120, 100%, 40%);">+                      info_String := *</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_ASPUP_ACK := {</span><br><span style="color: hsl(120, 100%, 40%);">+      m3UA_ASPUP_Ack := {</span><br><span style="color: hsl(120, 100%, 40%);">+           version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0304'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        info_String := 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_M3UA tr_M3UA_ASPUP_ACK := {</span><br><span style="color: hsl(120, 100%, 40%);">+      m3UA_ASPUP_Ack := {</span><br><span style="color: hsl(120, 100%, 40%);">+           version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0304'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        info_String := *</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_ASPDN := {</span><br><span style="color: hsl(120, 100%, 40%);">+  m3UA_ASPDN := {</span><br><span style="color: hsl(120, 100%, 40%);">+               version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0302'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        info_String := 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_M3UA tr_M3UA_ASPDN := {</span><br><span style="color: hsl(120, 100%, 40%);">+  m3UA_ASPDN := {</span><br><span style="color: hsl(120, 100%, 40%);">+               version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0302'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        info_String := *</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_ASPDN_ACK := {</span><br><span style="color: hsl(120, 100%, 40%);">+      m3UA_ASPUP_Ack := {</span><br><span style="color: hsl(120, 100%, 40%);">+           version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0305'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        info_String := 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_M3UA tr_M3UA_ASPDN_ACK := {</span><br><span style="color: hsl(120, 100%, 40%);">+      m3UA_ASPUP_Ack := {</span><br><span style="color: hsl(120, 100%, 40%);">+           version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0305'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        info_String := *</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) M3UA_Heartbeat_Data ts_M3UA_hb_data(template (value) octetstring hb_data) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       tag := '0009'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+        heartbeat_Data := hb_data</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) M3UA_Heartbeat_Data tr_M3UA_hb_data(template (present) octetstring hb_data) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   tag := '0009'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+       heartbeat_Data := hb_data</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_BEAT(template (omit) M3UA_Heartbeat_Data hbd := omit) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  m3UA_BEAT := {</span><br><span style="color: hsl(120, 100%, 40%);">+                version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0303'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        heartbeat_Data := hbd</span><br><span 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_M3UA tr_M3UA_BEAT(template M3UA_Heartbeat_Data hbd := *) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    m3UA_BEAT := {</span><br><span style="color: hsl(120, 100%, 40%);">+                version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0303'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        heartbeat_Data := hbd</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_BEAT_ACK(template (omit) M3UA_Heartbeat_Data hb_data)  := {</span><br><span style="color: hsl(120, 100%, 40%);">+ m3UA_BEAT_Ack := {</span><br><span style="color: hsl(120, 100%, 40%);">+            version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0306'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        heartbeat_Data := hb_data</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) PDU_M3UA tr_M3UA_BEAT_ACK(template M3UA_Heartbeat_Data hb_data := *) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    m3UA_BEAT_Ack := {</span><br><span style="color: hsl(120, 100%, 40%);">+            version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0306'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        heartbeat_Data := hb_data</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * ASPTM Class</span><br><span 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%);">+const M3UA_Traffic_Mode_Type c_M3UA_TMT_override := {</span><br><span style="color: hsl(120, 100%, 40%);">+  tag := '000B'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+       trafficModeType := int2oct(1, 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%);">+const M3UA_Traffic_Mode_Type c_M3UA_TMT_loadshare := {</span><br><span style="color: hsl(120, 100%, 40%);">+ tag := '000B'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+       trafficModeType := int2oct(2, 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%);">+const M3UA_Traffic_Mode_Type c_M3UA_TMT_broadcast := {</span><br><span style="color: hsl(120, 100%, 40%);">+ tag := '000B'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+       trafficModeType := int2oct(3, 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%);">+function ts_M3UA_routing_ctx(template (omit) octetstring rctx)</span><br><span style="color: hsl(120, 100%, 40%);">+return template (omit) M3UA_Routing_Context {</span><br><span style="color: hsl(120, 100%, 40%);">+  var template (omit) M3UA_Routing_Context id;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (istemplatekind(rctx, "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%);">+              id.tag := '0006'O;</span><br><span style="color: hsl(120, 100%, 40%);">+            id.lengthInd := 0; // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+             id.routingContext := rctx;</span><br><span style="color: hsl(120, 100%, 40%);">+            return id;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function tr_M3UA_routing_ctx(template octetstring rctx)</span><br><span style="color: hsl(120, 100%, 40%);">+return template M3UA_Routing_Context {</span><br><span style="color: hsl(120, 100%, 40%);">+       var template M3UA_Routing_Context id;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (istemplatekind(rctx, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+         return omit;</span><br><span style="color: hsl(120, 100%, 40%);">+  } else if (istemplatekind(rctx, "*")) {</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%);">+              id.tag := '0006'O;</span><br><span style="color: hsl(120, 100%, 40%);">+            id.lengthInd := ?;</span><br><span style="color: hsl(120, 100%, 40%);">+            id.routingContext := rctx;</span><br><span style="color: hsl(120, 100%, 40%);">+            return id;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_ASPAC(template (omit) M3UA_Traffic_Mode_Type tmt,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template (omit) OCT4 rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       m3UA_ASPAC := {</span><br><span style="color: hsl(120, 100%, 40%);">+               version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0401'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        traffic_Mode_Type := tmt,</span><br><span style="color: hsl(120, 100%, 40%);">+                     routing_Context := ts_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 info_String := 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_M3UA tr_M3UA_ASPAC(template M3UA_Traffic_Mode_Type tmt,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    template OCT4 rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    m3UA_ASPAC := {</span><br><span style="color: hsl(120, 100%, 40%);">+               version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0401'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        traffic_Mode_Type := tmt,</span><br><span style="color: hsl(120, 100%, 40%);">+                     routing_Context := tr_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 info_String := *</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_ASPAC_ACK(template (omit) M3UA_Traffic_Mode_Type tmt,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       template (omit) OCT4 rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       m3UA_ASPAC_Ack := {</span><br><span style="color: hsl(120, 100%, 40%);">+           version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0403'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        traffic_Mode_Type := tmt,</span><br><span style="color: hsl(120, 100%, 40%);">+                     routing_Context := ts_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 info_String := 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_M3UA tr_M3UA_ASPAC_ACK(template M3UA_Traffic_Mode_Type tmt,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            template OCT4 rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        m3UA_ASPAC_Ack := {</span><br><span style="color: hsl(120, 100%, 40%);">+           version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0403'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        traffic_Mode_Type := tmt,</span><br><span style="color: hsl(120, 100%, 40%);">+                     routing_Context := tr_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 info_String := *</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_ASPIA(template (omit) OCT4 rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       m3UA_ASPIA := {</span><br><span style="color: hsl(120, 100%, 40%);">+               version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0402'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        routing_Context := ts_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 info_String := 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_M3UA tr_M3UA_ASPIA(template OCT4 rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      m3UA_ASPIA := {</span><br><span style="color: hsl(120, 100%, 40%);">+               version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0402'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        routing_Context := tr_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 info_String := *</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_ASPIA_ACK(template (omit) OCT4 rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ m3UA_ASPIA_Ack := {</span><br><span style="color: hsl(120, 100%, 40%);">+           version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0404'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        routing_Context := ts_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 info_String := 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_M3UA tr_M3UA_ASPIA_ACK(template OCT4 rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  m3UA_ASPIA_Ack := {</span><br><span style="color: hsl(120, 100%, 40%);">+           version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0404'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        routing_Context := tr_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 info_String := *</span><br><span 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%);">+ * MGMT Class</span><br><span 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) M3UA_Error_Code ts_M3UA_err_code(template (value) OCT4 val) := {</span><br><span style="color: hsl(120, 100%, 40%);">+     tag := '000C'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+       errorCode := val</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) M3UA_Error_Code tr_M3UA_err_code(template (present) OCT4 val) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    tag := '000C'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+       errorCode := val</span><br><span 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) M3UA_Status ts_M3UA_status(template (value) OCT2 status_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     template (value) OCT2 status_info) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   tag := '000D'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+       statusType := status_type,</span><br><span style="color: hsl(120, 100%, 40%);">+    statusInfo := status_info</span><br><span 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) M3UA_Status tr_M3UA_status(template (present) OCT2 status_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          template (present) OCT2 status_info) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       tag := '000D'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+       statusType := status_type,</span><br><span style="color: hsl(120, 100%, 40%);">+    statusInfo := status_info</span><br><span 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_M3UA ts_M3UA_ERR(template (value) OCT4 err_code,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     template (omit) OCT4 rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ m3UA_ERR := {</span><br><span style="color: hsl(120, 100%, 40%);">+         version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0000'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        error_Code := ts_M3UA_err_code(err_code),</span><br><span style="color: hsl(120, 100%, 40%);">+                     routing_Context := ts_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 affected_Point_Codes := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                 network_Appearance := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                   diagnostic_information := 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_M3UA tr_M3UA_ERR(template (present) OCT4 err_code,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     template OCT4 rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        m3UA_ERR := {</span><br><span style="color: hsl(120, 100%, 40%);">+         version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0000'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        error_Code := tr_M3UA_err_code(err_code),</span><br><span style="color: hsl(120, 100%, 40%);">+                     routing_Context := tr_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 affected_Point_Codes := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                    network_Appearance := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                      diagnostic_information := *</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_NOTIFY(template (value) OCT2 status_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  template (value) OCT2 status_info,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    template (omit) OCT4 rctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    template (omit) OCT4 aspid := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template (omit) octetstring infostr := omit) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    m3UA_NOTIFY := {</span><br><span style="color: hsl(120, 100%, 40%);">+              version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0001'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        status := ts_M3UA_status(status_type, status_info),</span><br><span style="color: hsl(120, 100%, 40%);">+                   aSP_Identifier := f_aspid_or_omit(aspid),</span><br><span style="color: hsl(120, 100%, 40%);">+                     routing_Context := ts_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 info_String := 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_M3UA tr_M3UA_NOTIFY(template (present) OCT2 status_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    template (present) OCT2 status_info,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          template OCT4 rctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           template OCT4 aspid := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     template octetstring infostr := *) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    m3UA_NOTIFY := {</span><br><span style="color: hsl(120, 100%, 40%);">+              version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0001'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        status := tr_M3UA_status(status_type, status_info),</span><br><span style="color: hsl(120, 100%, 40%);">+                   aSP_Identifier := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                  routing_Context := tr_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 info_String := *</span><br><span 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%);">+ * Message Transfer Class</span><br><span 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) M3UA_Protocol_Data ts_M3UA_protocol_data(template (value) OCT4 opc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          template (value) OCT4 dpc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    template (value) OCT1 si,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     template (value) OCT1 ni,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     template (value) OCT1 mp,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     template (value) OCT1 sls,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    template (value) octetstring data) := {</span><br><span style="color: hsl(120, 100%, 40%);">+     tag := '0210'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+        oPC := opc,</span><br><span style="color: hsl(120, 100%, 40%);">+   dPC := dpc,</span><br><span style="color: hsl(120, 100%, 40%);">+   sI := si,</span><br><span style="color: hsl(120, 100%, 40%);">+     nI := ni,</span><br><span style="color: hsl(120, 100%, 40%);">+     mP := mp,</span><br><span style="color: hsl(120, 100%, 40%);">+     sLS := sls,</span><br><span style="color: hsl(120, 100%, 40%);">+   userProtocolData := data</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) M3UA_Protocol_Data tr_M3UA_protocol_data(template (present) OCT4 opc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   template (present) OCT4 dpc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          template (present) OCT1 si,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   template (present) OCT1 ni,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   template (present) OCT1 mp,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   template (present) OCT1 sls,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                          template (present) octetstring data) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   tag := '0210'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+       oPC := opc,</span><br><span style="color: hsl(120, 100%, 40%);">+   dPC := dpc,</span><br><span style="color: hsl(120, 100%, 40%);">+   sI := si,</span><br><span style="color: hsl(120, 100%, 40%);">+     nI := ni,</span><br><span style="color: hsl(120, 100%, 40%);">+     mP := mp,</span><br><span style="color: hsl(120, 100%, 40%);">+     sLS := sls,</span><br><span style="color: hsl(120, 100%, 40%);">+   userProtocolData := data</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_DATA(template (omit) OCT4 rctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template (value) M3UA_Protocol_Data data) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ m3UA_DATA := {</span><br><span style="color: hsl(120, 100%, 40%);">+                version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0101'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters :={</span><br><span style="color: hsl(120, 100%, 40%);">+                 network_Appearance := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                   routing_Context := ts_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 protocol_Data := data,</span><br><span style="color: hsl(120, 100%, 40%);">+                        correlation_ID := 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_M3UA tr_M3UA_DATA(template OCT4 rctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template (present) M3UA_Protocol_Data data) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       m3UA_DATA := {</span><br><span style="color: hsl(120, 100%, 40%);">+                version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0101'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        network_Appearance := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                      routing_Context := tr_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+                 protocol_Data := data,</span><br><span style="color: hsl(120, 100%, 40%);">+                        correlation_ID := *</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * Routing Key Management</span><br><span 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) M3UA_Local_Routing_Key_Id ts_M3UA_lrkid(template (value) OCT4 id) := {</span><br><span style="color: hsl(120, 100%, 40%);">+     tag := '020a'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+       localRkId := 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%);">+template (present) M3UA_Local_Routing_Key_Id tr_M3UA_lrkid(template (present) OCT4 id) := {</span><br><span style="color: hsl(120, 100%, 40%);">+     tag := '020a'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+       localRkId := id</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) M3UA_Routing_Key ts_M3UA_rkey(OCT4 id, OCT3 dpc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             template (omit) M3UA_Traffic_Mode_Type tmt := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           template (omit) OCT4 rctx := omit) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       tag := '0207'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+        routingKey := {</span><br><span style="color: hsl(120, 100%, 40%);">+               local_Routing_Key_Id := ts_M3UA_lrkid(id),</span><br><span style="color: hsl(120, 100%, 40%);">+            routing_Context := ts_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+         traffic_Mode_Type := tmt,</span><br><span style="color: hsl(120, 100%, 40%);">+             destination_Point_Code := {</span><br><span style="color: hsl(120, 100%, 40%);">+                   tag := '020b'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+                       pointCode := { '00'O, dpc }</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+            network_Appearance := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+           service_Indicators := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+           opc_List := 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) M3UA_Routing_Key tr_M3UA_rkey(template (present) OCT4 id, template (present) OCT3 dpc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               template M3UA_Traffic_Mode_Type tmt := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             template OCT4 rctx := *) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ tag := '0207'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+       routingKey := {</span><br><span style="color: hsl(120, 100%, 40%);">+               local_Routing_Key_Id := tr_M3UA_lrkid(id),</span><br><span style="color: hsl(120, 100%, 40%);">+            routing_Context := tr_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+         traffic_Mode_Type := tmt,</span><br><span style="color: hsl(120, 100%, 40%);">+             destination_Point_Code := {</span><br><span style="color: hsl(120, 100%, 40%);">+                   tag := '020b'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+                       pointCode := { '00'O, dpc }</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span style="color: hsl(120, 100%, 40%);">+            network_Appearance := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+           service_Indicators := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+           opc_List := 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT4 c_M3UA_REGSTS_SUCCESS := '00000000'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT4 c_M3UA_REGSTS_ERR_UNKNOWN := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT4 c_M3UA_REGSTS_ERR_INVAL_DPC := '00000002'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT4 c_M3UA_REGSTS_ERR_INVAL_NA := '00000003'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT4 c_M3UA_REGSTS_ERR_INVAL_RKEY := '00000004'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT4 c_M3UA_REGSTS_ERR_EPERM := '00000005'O;</span><br><span 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 OCT4 c_m3UA_DEREGSTS_SUCCESS := '00000000'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT4 c_m3UA_DEREGSTS_ERR_UNKNOWN := '00000001'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT4 c_m3UA_DEREGSTS_ERR_INVAL_RCTX := '00000002'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT4 c_m3UA_DEREGSTS_ERR_EPERM := '00000003'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT4 c_m3UA_DEREGSTS_ERR_NOT_REG := '00000004'O;</span><br><span style="color: hsl(120, 100%, 40%);">+const OCT4 c_m3UA_DEREGSTS_ERR_ASP_ACTIVE := '00000005'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) M3UA_Registration_Result ts_M3UA_reg_res(template (value) OCT4 id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     template (value) OCT4 status,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         template (value) OCT4 rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  tag := '0208'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+        registrationResult := {</span><br><span style="color: hsl(120, 100%, 40%);">+               local_Routing_Key_Id := ts_M3UA_lrkid(id),</span><br><span style="color: hsl(120, 100%, 40%);">+            registration_Status := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      tag := '0212'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+                       registrationStatus := status</span><br><span style="color: hsl(120, 100%, 40%);">+          },</span><br><span style="color: hsl(120, 100%, 40%);">+            routing_Context := ts_M3UA_routing_ctx(rctx)</span><br><span 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) M3UA_Registration_Result tr_M3UA_reg_res(template (present) OCT4 id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     template (present) OCT4 status,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       template (present) OCT4 rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        tag := '0208'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+       registrationResult := {</span><br><span style="color: hsl(120, 100%, 40%);">+               local_Routing_Key_Id := tr_M3UA_lrkid(id),</span><br><span style="color: hsl(120, 100%, 40%);">+            registration_Status := {</span><br><span style="color: hsl(120, 100%, 40%);">+                      tag := '0212'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+                       registrationStatus := status</span><br><span style="color: hsl(120, 100%, 40%);">+          },</span><br><span style="color: hsl(120, 100%, 40%);">+            routing_Context := tr_M3UA_routing_ctx(rctx)</span><br><span 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) M3UA_Deregistration_Result ts_M3UA_dereg_res(template (value) OCT4 rctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                           template (value) OCT4 status) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      tag := '0209'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+        deregistrationResult := {</span><br><span style="color: hsl(120, 100%, 40%);">+             routing_Context := ts_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+         deregistration_Status := {</span><br><span style="color: hsl(120, 100%, 40%);">+                    tag := '0213'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+                       deregistrationStatus := status</span><br><span 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) M3UA_Deregistration_Result tr_M3UA_dereg_res(template (present) OCT4 rctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                           template (present) OCT4 status) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  tag := '0209'O,</span><br><span style="color: hsl(120, 100%, 40%);">+       lengthInd := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+       deregistrationResult := {</span><br><span style="color: hsl(120, 100%, 40%);">+             routing_Context := tr_M3UA_routing_ctx(rctx),</span><br><span style="color: hsl(120, 100%, 40%);">+         deregistration_Status := {</span><br><span style="color: hsl(120, 100%, 40%);">+                    tag := '0213'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                       lengthInd := 8,</span><br><span style="color: hsl(120, 100%, 40%);">+                       deregistrationStatus := status</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_REG_REQ(template (value) M3UA_Routing_Keys rkeys) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    m3UA_REG_REQ := {</span><br><span style="color: hsl(120, 100%, 40%);">+             version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0901'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := rkeys</span><br><span 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_M3UA tr_M3UA_REG_REQ(template (present) M3UA_Routing_Keys rkeys) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    m3UA_REG_REQ := {</span><br><span style="color: hsl(120, 100%, 40%);">+             version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0901'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := rkeys</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_REG_RSP(template (value) M3UA_Registration_Results res) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      m3UA_REG_RSP := {</span><br><span style="color: hsl(120, 100%, 40%);">+             version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0902'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := 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%);">+template (present) PDU_M3UA tr_M3UA_REG_RSP(template (present) M3UA_Registration_Results res) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      m3UA_REG_RSP := {</span><br><span style="color: hsl(120, 100%, 40%);">+             version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0902'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := 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%);">+template (value) PDU_M3UA ts_M3UA_DEREG_REQ(template (value) M3UA_Routing_Context rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  m3UA_DEREG_REQ := {</span><br><span style="color: hsl(120, 100%, 40%);">+           version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0903'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        routing_Context := rctx</span><br><span 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_M3UA tr_M3UA_DEREG_REQ(template (present) M3UA_Routing_Context rctx) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        m3UA_DEREG_REQ := {</span><br><span style="color: hsl(120, 100%, 40%);">+           version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0903'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        routing_Context := rctx</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_M3UA ts_M3UA_DEREG_RSP(template (value) M3UA_Deregistration_Results res) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    m3UA_DEREG_RSP := {</span><br><span style="color: hsl(120, 100%, 40%);">+           version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0904'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+            messageParameters := 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%);">+template (present) PDU_M3UA tr_M3UA_DEREG_RSP(template (present) M3UA_Deregistration_Results res) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  m3UA_DEREG_RSP := {</span><br><span style="color: hsl(120, 100%, 40%);">+           version := c_M3UA_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+            reserved := '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+            messageClassAndType := '0904'O,</span><br><span style="color: hsl(120, 100%, 40%);">+               messageLength := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           messageParameters := 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>diff --git a/library/SCCP_Templates.ttcn b/library/SCCP_Templates.ttcn</span><br><span>index a5af073..7c2ffa6 100644</span><br><span>--- a/library/SCCP_Templates.ttcn</span><br><span>+++ b/library/SCCP_Templates.ttcn</span><br><span>@@ -46,4 +46,25 @@</span><br><span>  }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* construct a SCCP_PAR_Address with PC + SSN and GT */</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) SCCP_PAR_Address ts_SccpAddr_PC_GT(integer pc, octetstring sio,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             charstring sccp_srv_type, hexstring gt_addr) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ addressIndicator := {</span><br><span style="color: hsl(120, 100%, 40%);">+         pointCodeIndic := '1'B,</span><br><span style="color: hsl(120, 100%, 40%);">+               ssnIndicator := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+         globalTitleIndic := '0001'B, // NAI only</span><br><span style="color: hsl(120, 100%, 40%);">+              routingIndicator := cg_route_on_GT // route on GT</span><br><span style="color: hsl(120, 100%, 40%);">+     },</span><br><span style="color: hsl(120, 100%, 40%);">+    signPointCode := SCCP_SPC_int2bit(pc, sccp_srv_type, sio),</span><br><span style="color: hsl(120, 100%, 40%);">+    subsystemNumber := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+      globalTitle := {</span><br><span style="color: hsl(120, 100%, 40%);">+              gti0001 := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  natureOfAddress := '0000011'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                        oddeven := '0'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                      globalTitleAddress := gt_addr</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> }</span><br><span>diff --git a/stp/STP_Tests.cfg b/stp/STP_Tests.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..3ba2d13</span><br><span>--- /dev/null</span><br><span>+++ b/stp/STP_Tests.cfg</span><br><span>@@ -0,0 +1,18 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[ORDERED_INCLUDE]</span><br><span style="color: hsl(120, 100%, 40%);">+# Common configuration, shared between test suites</span><br><span style="color: hsl(120, 100%, 40%);">+"../Common.cfg"</span><br><span style="color: hsl(120, 100%, 40%);">+# testsuite specific configuration, not expected to change</span><br><span style="color: hsl(120, 100%, 40%);">+"./STP_Tests.default"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Local configuration below</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[LOGGING]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[TESTPORT_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MODULE_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MAIN_CONTROLLER]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[EXECUTE]</span><br><span style="color: hsl(120, 100%, 40%);">+STP_Tests.control</span><br><span>diff --git a/stp/STP_Tests.default b/stp/STP_Tests.default</span><br><span>new file mode 100644</span><br><span>index 0000000..6417e8c</span><br><span>--- /dev/null</span><br><span>+++ b/stp/STP_Tests.default</span><br><span>@@ -0,0 +1,20 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[LOGGING]</span><br><span style="color: hsl(120, 100%, 40%);">+FileMask := LOG_ALL | TTCN_MATCHING;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[TESTPORT_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_MODE := "client"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_HOSTNAME := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_PORTNUM := "4239"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_LOGIN_SKIPPED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_DETECT_SERVER_DISCONNECTED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_READMODE := "buffered"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_CLIENT_CLEANUP_LINEFEED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_DETECT_CONNECTION_ESTABLISHMENT_RESULT := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.PROMPT1 := "OsmoSTP> "</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MODULE_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+Osmocom_VTY_Functions.mp_prompt_prefix := "OsmoSTP";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MAIN_CONTROLLER]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[EXECUTE]</span><br><span>diff --git a/stp/STP_Tests.ttcn b/stp/STP_Tests.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..023c53d</span><br><span>--- /dev/null</span><br><span>+++ b/stp/STP_Tests.ttcn</span><br><span>@@ -0,0 +1,249 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module STP_Tests {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Osmocom STP test suite in in TTCN-3</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 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%);">+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 IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_VTY_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from M3UA_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from M3UA_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from M3UA_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from M3UA_CodecPort_CtrlFunct all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from M3UA_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MTP3asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MTP3asp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCPasp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCP_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from STP_Tests_Common all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from STP_Tests_IPA all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from STP_Tests_M3UA 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%);">+type component IPA_M3UA_CT extends RAW_M3UA_CT, IPA_CT {</span><br><span 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 OCT1 c_M3UA_SI_SCCP := '03'O;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* copy+pasted from SCCP_Emulation.ttcn, where for some reason it is marked as "runs on SCCP_CT"</span><br><span style="color: hsl(120, 100%, 40%);">+ * without depending on anything of that component */</span><br><span style="color: hsl(120, 100%, 40%);">+  function ConvertASPAddressToEncodedAddress_itu( in SCCP_PAR_Address pl_ASPAddress)</span><br><span style="color: hsl(120, 100%, 40%);">+    return SCCP_param_CPartyAddressEnc</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    var SCCP_param_CPartyAddress_itu vl_PDUAddress; //structured fit to encoding</span><br><span style="color: hsl(120, 100%, 40%);">+    var SCCP_param_CPartyAddressEnc vl_PDUAddressEncoded;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    vl_PDUAddress.addressIndicator.pointCodeIndic:=</span><br><span style="color: hsl(120, 100%, 40%);">+      pl_ASPAddress.addressIndicator.pointCodeIndic;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    vl_PDUAddress.addressIndicator.ssnIndicator:=</span><br><span style="color: hsl(120, 100%, 40%);">+      pl_ASPAddress.addressIndicator.ssnIndicator;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    vl_PDUAddress.addressIndicator.globalTitleIndic:=</span><br><span style="color: hsl(120, 100%, 40%);">+     pl_ASPAddress.addressIndicator.globalTitleIndic;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    vl_PDUAddress.addressIndicator.routingIndicator:=</span><br><span style="color: hsl(120, 100%, 40%);">+      pl_ASPAddress.addressIndicator.routingIndicator;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    vl_PDUAddress.addressIndicator.reserved:='0'B;</span><br><span style="color: hsl(120, 100%, 40%);">+    // if (ischosen(pl_ASPAddress.signPointCode) ) not used because it is mandatory field (???)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    //----signPointCode handling</span><br><span style="color: hsl(120, 100%, 40%);">+    if ( ispresent( pl_ASPAddress.signPointCode )) {</span><br><span style="color: hsl(120, 100%, 40%);">+      vl_PDUAddress.signPointCode :=</span><br><span style="color: hsl(120, 100%, 40%);">+        '00'B&pl_ASPAddress.signPointCode;</span><br><span style="color: hsl(120, 100%, 40%);">+    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+      vl_PDUAddress.signPointCode := 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%);">+    //----subsystemNumber handling</span><br><span style="color: hsl(120, 100%, 40%);">+    if ( ispresent( pl_ASPAddress.subsystemNumber ) ){</span><br><span style="color: hsl(120, 100%, 40%);">+      vl_PDUAddress.subsystemNumber := pl_ASPAddress.subsystemNumber;</span><br><span style="color: hsl(120, 100%, 40%);">+    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+      vl_PDUAddress.subsystemNumber :=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%);">+    // --- globalTitle handling--</span><br><span style="color: hsl(120, 100%, 40%);">+    if ( ispresent(pl_ASPAddress.globalTitle))</span><br><span style="color: hsl(120, 100%, 40%);">+    {//startif1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      var SCCP_ASPfield_GlobalTitle tmpGT ;</span><br><span style="color: hsl(120, 100%, 40%);">+      tmpGT := pl_ASPAddress.globalTitle;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (ischosen(tmpGT.gti0001))</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0001.natureOfAddress:=tmpGT.gti0001.natureOfAddress;</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0001.oddeven:=tmpGT.gti0001.oddeven;</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0001.globalTitleAddress:=tmpGT.gti0001.globalTitleAddress;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+      else if (ischosen(tmpGT.gti0010))</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0010.translationType:=tmpGT.gti0010.translationType;</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0010.globalTitleAddress:=tmpGT.gti0010.globalTitleAddress;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+      else if (ischosen(tmpGT.gti0011))</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0011.translationType:=tmpGT.gti0011.translationType;</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0011.encodingScheme:=tmpGT.gti0011.encodingScheme;</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0011.numberingPlan:=tmpGT.gti0011.numberingPlan;</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0011.globalTitleAddress:=tmpGT.gti0011.globalTitleAddress;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+      else if (ischosen(tmpGT.gti0100))</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0100.translationType:=tmpGT.gti0100.translationType;</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0100.encodingScheme:=tmpGT.gti0100.encodingScheme;</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0100.numberingPlan:=tmpGT.gti0100.numberingPlan;</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0100.natureOfAddress:=tmpGT.gti0100.natureOfAddress;</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0100.reserved:='0'B;</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle.gti0100.globalTitleAddress:=tmpGT.gti0100.globalTitleAddress;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+    else</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+        vl_PDUAddress.globalTitle := 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%);">+    vl_PDUAddressEncoded.addr:= enc_PDU_SCCP_Address_itu( vl_PDUAddress);</span><br><span style="color: hsl(120, 100%, 40%);">+    vl_PDUAddressEncoded.paramLength:= lengthof(vl_PDUAddressEncoded.addr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return vl_PDUAddressEncoded;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  } //ConvertASPAddressToEncodedAddress_itu</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_SCCP ts_SCCP_UDT(SCCP_PAR_Address called, SCCP_PAR_Address calling,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     template (value) octetstring data,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    template (value) BIT4 msg_hdl := '0000'B) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        unitdata := {</span><br><span style="color: hsl(120, 100%, 40%);">+         messageType := udt,</span><br><span style="color: hsl(120, 100%, 40%);">+           protClass := {'0000'B, msg_hdl},</span><br><span style="color: hsl(120, 100%, 40%);">+              pointer1 := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                pointer2 := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                pointer3 := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                calledPAddress := ConvertASPAddressToEncodedAddress_itu(called),</span><br><span style="color: hsl(120, 100%, 40%);">+              callingPAddress := ConvertASPAddressToEncodedAddress_itu(calling),</span><br><span style="color: hsl(120, 100%, 40%);">+            data := {</span><br><span style="color: hsl(120, 100%, 40%);">+                     paramLength := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                     data := data</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test routing of SCCP between an M3UA and an IPA ASP */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_m3ua_to_ipa() runs on IPA_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var OCT4 rctx_sender := int2oct(1023, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+     var OCT4 pc_sender := int2oct(23, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT4 pc_receiver := int2oct(5, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_ipa();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* send a well-formed, encoded SCCP message via M3UA */</span><br><span style="color: hsl(120, 100%, 40%);">+       var octetstring data := f_rnd_octstring(f_rnd_int(100));</span><br><span style="color: hsl(120, 100%, 40%);">+      var SCCP_PAR_Address called := valueof(ts_SccpAddr_GT('1234'H));</span><br><span style="color: hsl(120, 100%, 40%);">+      var SCCP_PAR_Address calling := valueof(ts_SccpAddr_GT('5678'H));</span><br><span style="color: hsl(120, 100%, 40%);">+     var PDU_SCCP sccp := valueof(ts_SCCP_UDT(called, calling, data));</span><br><span style="color: hsl(120, 100%, 40%);">+     var octetstring sccp_enc := enc_PDU_SCCP(sccp);</span><br><span style="color: hsl(120, 100%, 40%);">+       var template (value) M3UA_Protocol_Data tx_pd;</span><br><span style="color: hsl(120, 100%, 40%);">+        tx_pd := ts_M3UA_protocol_data(pc_sender, pc_receiver, c_M3UA_SI_SCCP, '00'O, '00'O, '00'O, sccp_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_M3UA_send(0, ts_M3UA_DATA(rctx_sender, tx_pd), 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* expect to receive it via IPA */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_IPA_exp(0, sccp_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* test routing an SCCP message from IPA ASP to M3UA ASP */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ipa_to_m3ua() runs on IPA_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var OCT4 pc_sender := int2oct(5, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+  var OCT4 rctx_receiver := int2oct(1023, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+   var OCT4 pc_receiver := int2oct(23, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init_common();</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_config2(VTY, {"cs7 instance 0", "as mahlzeit ipa"},</span><br><span style="color: hsl(120, 100%, 40%);">+               "point-code override patch-sccp disabled");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_ipa();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* send a well-formed, encoded SCCP message via IPA */</span><br><span style="color: hsl(120, 100%, 40%);">+        var octetstring data := f_rnd_octstring(f_rnd_int(100));</span><br><span style="color: hsl(120, 100%, 40%);">+      var SCCP_PAR_Address called := valueof(ts_SccpAddr_GT('1234'H));</span><br><span style="color: hsl(120, 100%, 40%);">+      var SCCP_PAR_Address calling := valueof(ts_SccpAddr_GT('5678'H));</span><br><span style="color: hsl(120, 100%, 40%);">+     var PDU_SCCP sccp := valueof(ts_SCCP_UDT(called, calling, data));</span><br><span style="color: hsl(120, 100%, 40%);">+     var octetstring sccp_enc := enc_PDU_SCCP(sccp);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_IPA_send(0, sccp_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* expect to receive it via M3UA */</span><br><span style="color: hsl(120, 100%, 40%);">+   var template (present) M3UA_Protocol_Data rx_pd;</span><br><span style="color: hsl(120, 100%, 40%);">+      rx_pd := tr_M3UA_protocol_data(pc_sender, pc_receiver, c_M3UA_SI_SCCP, '00'O, '00'O, '00'O, sccp_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+        f_M3UA_exp(0, tr_M3UA_DATA(rctx_receiver, rx_pd));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* test routing an SCCP message from IPA ASP to M3UA ASP while patching PC into SCCP addresses */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_ipa_to_m3ua_patch_sccp() runs on IPA_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var OCT4 pc_sender := int2oct(5, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+  var OCT4 rctx_receiver := int2oct(1023, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+   var OCT4 pc_receiver := int2oct(23, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init_common();</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_config2(VTY, {"cs7 instance 0", "as mahlzeit ipa"},</span><br><span style="color: hsl(120, 100%, 40%);">+                 "point-code override patch-sccp both");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_ipa();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* send a well-formed, encoded SCCP message via IPA */</span><br><span style="color: hsl(120, 100%, 40%);">+        var octetstring data := f_rnd_octstring(f_rnd_int(100));</span><br><span style="color: hsl(120, 100%, 40%);">+      var SCCP_PAR_Address called := valueof(ts_SccpAddr_GT('1234'H));</span><br><span style="color: hsl(120, 100%, 40%);">+      var SCCP_PAR_Address calling := valueof(ts_SccpAddr_GT('5678'H));</span><br><span style="color: hsl(120, 100%, 40%);">+     var PDU_SCCP sccp := valueof(ts_SCCP_UDT(called, calling, data));</span><br><span style="color: hsl(120, 100%, 40%);">+     f_IPA_send(0, enc_PDU_SCCP(sccp));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* patch point codes into addresses */</span><br><span style="color: hsl(120, 100%, 40%);">+        called := valueof(ts_SccpAddr_PC_GT(oct2int(pc_receiver), '83'O, "mtp3_itu", '1234'H));</span><br><span style="color: hsl(120, 100%, 40%);">+     calling := valueof(ts_SccpAddr_PC_GT(oct2int(pc_sender), '83'O, "mtp3_itu", '5678'H));</span><br><span style="color: hsl(120, 100%, 40%);">+      var PDU_SCCP sccp_exp := valueof(ts_SCCP_UDT(called, calling, data));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* expect to receive it via M3UA */</span><br><span style="color: hsl(120, 100%, 40%);">+   var template (present) M3UA_Protocol_Data rx_pd;</span><br><span style="color: hsl(120, 100%, 40%);">+      rx_pd := tr_M3UA_protocol_data(pc_sender, pc_receiver, c_M3UA_SI_SCCP, '00'O, '00'O, '00'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   enc_PDU_SCCP(sccp_exp));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_M3UA_exp(0, tr_M3UA_DATA(rctx_receiver, rx_pd));</span><br><span 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%);">+control {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* M3UA <-> IPA Tests */</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_m3ua_to_ipa() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_ipa_to_m3ua() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_ipa_to_m3ua_patch_sccp() );</span><br><span 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/stp/STP_Tests_Common.ttcn b/stp/STP_Tests_Common.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..aee5a88</span><br><span>--- /dev/null</span><br><span>+++ b/stp/STP_Tests_Common.ttcn</span><br><span>@@ -0,0 +1,64 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module STP_Tests_Common {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Osmocom STP test suite in in TTCN-3</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 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%);">+friend module STP_Tests;</span><br><span style="color: hsl(120, 100%, 40%);">+friend module STP_Tests_M3UA;</span><br><span style="color: hsl(120, 100%, 40%);">+friend module STP_Tests_IPA;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from TELNETasp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_VTY_Functions all;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+modulepar {</span><br><span style="color: hsl(120, 100%, 40%);">+       charstring mp_stp_ip := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+        charstring mp_local_ip := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+friend template (value) SctpTuple ts_SCTP(template (omit) integer ppid := 3,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      template (omit) integer stream := 0) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  sinfo_stream := stream,</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%);">+type component Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        port TELNETasp_PT VTY;</span><br><span style="color: hsl(120, 100%, 40%);">+        timer g_Tguard := 30.0;</span><br><span style="color: hsl(120, 100%, 40%);">+       var boolean g_test_initialized := false;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_gTguard() runs on Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] g_Tguard.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Global guard timer timed out");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_init_common() runs on Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (g_test_initialized) {</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%);">+     g_test_initialized := true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ map(self:VTY, system:VTY);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_vty_set_prompts(VTY);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(VTY, "enable");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  activate(as_gTguard());</span><br><span style="color: hsl(120, 100%, 40%);">+       g_Tguard.start;</span><br><span 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/stp/STP_Tests_IPA.ttcn b/stp/STP_Tests_IPA.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..0a36921</span><br><span>--- /dev/null</span><br><span>+++ b/stp/STP_Tests_IPA.ttcn</span><br><span>@@ -0,0 +1,142 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module STP_Tests_IPA {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Osmocom STP test suite in in TTCN-3</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 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%);">+friend module STP_Tests;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from General_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from TELNETasp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_VTY_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCPasp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCP_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from M3UA_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from M3UA_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MTP3asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MTP3asp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from STP_Tests_Common all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private const integer NR_IPA := 1;</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%);">+  integer mp_stp_ipa_port := 5000;</span><br><span style="color: hsl(120, 100%, 40%);">+      integer mp_local_ipa_port := 20000;</span><br><span 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 IPA_CT extends Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* for IPA we use the IPA_Emulation and not directly IPA_CodecPort to avoid</span><br><span style="color: hsl(120, 100%, 40%);">+    * having to re-invent IPA CCM handling here */</span><br><span style="color: hsl(120, 100%, 40%);">+       port MTP3asp_PT IPA[NR_IPA];</span><br><span style="color: hsl(120, 100%, 40%);">+  var IPA_Emulation_CT vc_IPA[NR_IPA];</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_IPA_send(integer idx, octetstring data) runs on IPA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var MTP3_Field_sio sio := { ni := '00'B, prio := '00'B, si := '0011'B };</span><br><span style="color: hsl(120, 100%, 40%);">+      IPA[idx].send(t_ASP_MTP3_TRANSFERreq(sio, 0, 0, 0, data));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_IPA_exp(integer idx, template (present) octetstring data) runs on IPA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var M3UA_RecvFrom rx;</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] IPA[idx].receive(t_ASP_MTP3_TRANSFERind(?, ?, ?, ?, data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] IPA[idx].receive {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Received unexpected data on IPA port while waiting for ", data);</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_init_ipa() runs on IPA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_common();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i := 0; i < NR_IPA; i:=i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         vc_IPA[i] := IPA_Emulation_CT.create("IPA" & int2str(i));</span><br><span style="color: hsl(120, 100%, 40%);">+               map(vc_IPA[i]:IPA_PORT, system:IPA_CODEC_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+         connect(self:IPA[i], vc_IPA[i]:MTP3_SP_PORT);</span><br><span style="color: hsl(120, 100%, 40%);">+         vc_IPA[i].start(IPA_Emulation.main_client(mp_stp_ip, mp_stp_ipa_port, mp_local_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                            mp_local_ipa_port+i));</span><br><span 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%);">+/* "accept-asp-connections pre-configured" and client from unknown source */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_unknown_client_nodynamic() runs on IPA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init_common();</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},</span><br><span style="color: hsl(120, 100%, 40%);">+               "accept-asp-connections pre-configured");</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init_ipa();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (IPA[0].checkstate("Connected")) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(fail, "Expected IPA port to be disconnected");</span><br><span style="color: hsl(120, 100%, 40%);">+   } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* switch back to default */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},</span><br><span style="color: hsl(120, 100%, 40%);">+               "accept-asp-connections dynamic-permitted");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* "accept-asp-connections pre-configured" and client from known source */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_known_client_nodynamic() runs on IPA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_common();</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},</span><br><span style="color: hsl(120, 100%, 40%);">+               "accept-asp-connections pre-configured");</span><br><span style="color: hsl(120, 100%, 40%);">+     f_vty_config2(VTY, {"cs7 instance 0"}, "asp ipa-mahlzeit0 20000 5000 ipa");</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_config2(VTY, {"cs7 instance 0", "as mahlzeit ipa"}, "asp ipa-mahlzeit0");</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_ipa();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not IPA[0].checkstate("Connected")) {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Expected IPA port to be connected");</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* switch back to default */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},</span><br><span style="color: hsl(120, 100%, 40%);">+               "accept-asp-connections dynamic-permitted");</span><br><span style="color: hsl(120, 100%, 40%);">+  f_vty_config2(VTY, {"cs7 instance 0"}, "no asp ipa-mahlzeit0");</span><br><span 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%);">+/* "accept-asp-connections dynamic-permitted" and client from unknown source */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_unknown_client_dynamic() runs on IPA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init_common();</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_ipa();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not IPA[0].checkstate("Connected")) {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Expected IPA port to be connected");</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(pass);</span><br><span 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%);">+control {</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_unknown_client_nodynamic() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_known_client_nodynamic() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_unknown_client_dynamic() );</span><br><span 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/stp/STP_Tests_M3UA.ttcn b/stp/STP_Tests_M3UA.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..29e85f9</span><br><span>--- /dev/null</span><br><span>+++ b/stp/STP_Tests_M3UA.ttcn</span><br><span>@@ -0,0 +1,451 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module STP_Tests_M3UA {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Osmocom STP test suite in in TTCN-3</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 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%);">+friend module STP_Tests;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from General_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_VTY_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from M3UA_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from M3UA_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from M3UA_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from M3UA_CodecPort_CtrlFunct all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from M3UA_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MTP3asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from MTP3asp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCPasp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from SCCP_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from STP_Tests_Common all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+modulepar {</span><br><span style="color: hsl(120, 100%, 40%);">+  integer mp_stp_m3ua_port := 2905;</span><br><span style="color: hsl(120, 100%, 40%);">+     integer mp_local_m3ua_port := 9999;</span><br><span 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 const integer NR_M3UA := 3;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type component RAW_M3UA_CT extends Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ port M3UA_CODEC_PT M3UA[NR_M3UA];</span><br><span style="color: hsl(120, 100%, 40%);">+     var integer g_m3ua_conn_id[NR_M3UA];</span><br><span 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 altstep as_m3ua_sctp() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] any from M3UA.receive(tr_SctpAssocChange) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+      [] any from M3UA.receive(tr_SctpPeerAddrChange) { 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%);">+friend function f_M3UA_send(integer idx, template (present) PDU_M3UA msg, template integer stream := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      M3UA[idx].send(t_M3UA_Send(g_m3ua_conn_id[idx], msg, stream));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_M3UA_exp(integer idx, template (present) PDU_M3UA msg) runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var M3UA_RecvFrom rx;</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] M3UA[idx].receive(t_M3UA_RecvFrom(msg)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] M3UA[idx].receive(t_M3UA_RecvFrom(?)) -> value rx {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Received unexpected M3UA[", idx, "] ", rx,</span><br><span style="color: hsl(120, 100%, 40%);">+                         "while waiting for ", msg);</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_M3UA_connect(integer i) runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var Result res;</span><br><span style="color: hsl(120, 100%, 40%);">+       res := M3UA_CodecPort_CtrlFunct.f_IPL4_connect(M3UA[i], mp_stp_ip, mp_stp_m3ua_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 mp_local_ip, mp_local_m3ua_port+i, -1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 {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 M3UA socket, check your configuration");</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%);">+     g_m3ua_conn_id[i] := res.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_init_m3ua() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_common();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    activate(as_m3ua_sctp());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i := 0; i < NR_M3UA; i:=i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                map(self:M3UA[i], system:M3UA_CODEC_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+              f_M3UA_connect(i);</span><br><span 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%);">+/* perform an outbound ASP-UP procedure */</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_M3UA_asp_up(integer idx, template (omit) OCT4 aspid := omit) runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_M3UA_send(idx, ts_M3UA_ASPUP(aspid));</span><br><span style="color: hsl(120, 100%, 40%);">+       f_M3UA_exp(idx, tr_M3UA_ASPUP_ACK);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* perform an outbound BEAT procedure */</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_M3UA_beat(integer idx, template (omit) octetstring hbd) runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (istemplatekind(hbd, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+          f_M3UA_send(idx, ts_M3UA_BEAT(omit));</span><br><span style="color: hsl(120, 100%, 40%);">+         f_M3UA_exp(idx, tr_M3UA_BEAT_ACK(omit));</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              f_M3UA_send(idx, ts_M3UA_BEAT(ts_M3UA_hb_data(hbd)));</span><br><span style="color: hsl(120, 100%, 40%);">+         f_M3UA_exp(idx, tr_M3UA_BEAT_ACK(tr_M3UA_hb_data(hbd)));</span><br><span 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%);">+/* perform an outbound ASP-ACTIVATE procedure */</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_M3UA_asp_act(integer idx, template (omit) M3UA_Traffic_Mode_Type tmt := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                             template (omit) OCT4 rctx := omit) runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_M3UA_send(idx, ts_M3UA_ASPAC(tmt, rctx));</span><br><span style="color: hsl(120, 100%, 40%);">+   f_M3UA_exp(idx, tr_M3UA_ASPAC_ACK(tmt, rctx));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* perform outbound ASP-UP and ASP-ACT, optionally expect interemittent NOTIFY */</span><br><span style="color: hsl(120, 100%, 40%);">+friend function f_M3UA_asp_up_act(integer idx, template (omit) M3UA_Traffic_Mode_Type tmt := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                               template (omit) OCT4 rctx := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+                            template (omit) OCT2 ntfy_after_up := c_M3UA_ST_I_AS_INACTIVE,</span><br><span style="color: hsl(120, 100%, 40%);">+                                template (omit) OCT2 ntfy_after_act := c_M3UA_ST_I_AS_ACTIVE)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       f_M3UA_asp_up(idx, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (not istemplatekind(ntfy_after_up, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+            f_M3UA_exp(idx, tr_M3UA_NOTIFY(c_M3UA_ST_T_STATE_CHG, ntfy_after_up, *));</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     f_M3UA_asp_act(idx, tmt, rctx);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (not istemplatekind(ntfy_after_act, "omit")) {</span><br><span style="color: hsl(120, 100%, 40%);">+           f_M3UA_exp(idx, tr_M3UA_NOTIFY(c_M3UA_ST_T_STATE_CHG, ntfy_after_act, *));</span><br><span 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%);">+/* Test the ASP-UP procedure */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_connect_asp_up() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_M3UA_asp_up(0);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_M3UA_exp(0, tr_M3UA_NOTIFY(c_M3UA_ST_T_STATE_CHG, c_M3UA_ST_I_AS_INACTIVE, *));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test the heartbeat procedure without optional heartbeat data payload */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_beat() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_M3UA_asp_up(0);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_M3UA_exp(0, tr_M3UA_NOTIFY(c_M3UA_ST_T_STATE_CHG, c_M3UA_ST_I_AS_INACTIVE, *));</span><br><span style="color: hsl(120, 100%, 40%);">+     f_M3UA_beat(0, 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%);">+/* Test the heartbeat procedure with optional heartbeat data payload */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_beat_payload() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_M3UA_asp_up(0);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_M3UA_exp(0, tr_M3UA_NOTIFY(c_M3UA_ST_T_STATE_CHG, c_M3UA_ST_I_AS_INACTIVE, *));</span><br><span style="color: hsl(120, 100%, 40%);">+     f_M3UA_beat(0, 'a1a2a3a4a5'O);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test the ASP-ACTIVATE procedure (without traffic-mode or routing ctx) */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_asp_act() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_M3UA_asp_up_act(0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test the ASP-ACTIVATE procedure with traffic-mode override */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_asp_act_override() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_M3UA_asp_up_act(0, c_M3UA_TMT_override, 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%);">+/* Test the ASP-ACTIVATE procedure with traffic-mode override */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_asp_act_loadshare() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_M3UA_asp_up_act(0, c_M3UA_TMT_loadshare, 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%);">+/* Test the ASP-ACTIVATE procedure with traffic-mode broadcast */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_asp_act_broadcast() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_M3UA_asp_up_act(0, c_M3UA_TMT_broadcast, 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%);">+/* Test if traffic is routed from idx_tx/pc_tx to idx_rx/pc_rx */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_test_traffic(integer idx_tx, template (omit) OCT4 rctx_sender, OCT4 pc_tx,</span><br><span style="color: hsl(120, 100%, 40%);">+                              integer idx_rx, template (omit) OCT4 rctx_receiver, OCT4 pc_rx,</span><br><span style="color: hsl(120, 100%, 40%);">+                               OCT1 si := '23'O, OCT1 ni := '00'O, OCT1 mp := '00'O, OCT1 sls := '00'O)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var octetstring data := f_rnd_octstring(f_rnd_int(100));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_M3UA_send(idx_tx, ts_M3UA_DATA(rctx_sender,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  ts_M3UA_protocol_data(pc_tx, pc_rx, si, ni, mp, sls, data)), 1);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_M3UA_exp(idx_rx, tr_M3UA_DATA(rctx_receiver,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        tr_M3UA_protocol_data(pc_tx, pc_rx, si, ni, mp, sls, data)));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* test "traffic-mode override" behavior */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_tmt_override() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT4 rctx_sender := int2oct(1023, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+     var OCT4 pc_sender := int2oct(23, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT4 rctx_receiver := int2oct(1042, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+   var OCT4 pc_receiver := int2oct(42, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* bring up the 'sender' side (single ASP in AS) */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_M3UA_asp_up_act(0, omit, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* activate the first 'receiver' side ASP */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_M3UA_asp_up_act(1, c_M3UA_TMT_override, rctx_receiver);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* verify traffic is routed from sender to [sole] receiver */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_test_traffic(0, rctx_sender, pc_sender, 1, rctx_receiver, pc_receiver);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* activate the second 'receiver' side ASP (no NOTIFY as AS state doesn't change) */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_M3UA_asp_up_act(2, c_M3UA_TMT_override, rctx_receiver, omit, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* we expect a NOTIFY to the *other* ASP Other/Alternat-ASP-Active */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_M3UA_exp(1, tr_M3UA_NOTIFY(c_M3UA_ST_T_OTHER, c_M3UA_ST_I_ALTERNATE_ASP, *));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* verify traffic is routed from sender to new receiver */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_test_traffic(0, rctx_sender, pc_sender, 2, rctx_receiver, pc_receiver);</span><br><span 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 altstep as_count_rx(integer idx, template (present) PDU_M3UA exp, inout integer counter)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     [] M3UA[idx].receive(t_M3UA_RecvFrom(exp)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          counter := counter + 1;</span><br><span 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%);">+/* test "traffic-mode load-share" behavior */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_tmt_loadshare() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var OCT4 rctx_sender := int2oct(1023, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+     var OCT4 pc_sender := int2oct(23, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT4 rctx_receiver := int2oct(1042, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+   var OCT4 pc_receiver := int2oct(42, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FIXME: configure the STP via VTY to set traffic-mode */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* bring up the 'sender' side (single ASP in AS) */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_M3UA_asp_up_act(0, omit, rctx_sender);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* activate the first 'receiver' side ASP */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_M3UA_asp_up(1);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_M3UA_asp_up_act(1, c_M3UA_TMT_loadshare, omit); // TODO: rctx</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* verify traffic is routed from sender to [sole] receiver */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < 10; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           f_test_traffic(0, rctx_sender, pc_sender, 1, rctx_receiver, pc_receiver);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* activate the second 'receiver' side ASP (no NOTIFY) */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_M3UA_asp_up_act(2, c_M3UA_TMT_loadshare, omit, omit, omit); // TODO: rctx</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* verify traffic is routed from sender to new receiver */</span><br><span style="color: hsl(120, 100%, 40%);">+    const integer iter_per_asp := 5;</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer num_rx[NR_M3UA] := { 0, 0, 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i := 0; i < 2*iter_per_asp; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+               var octetstring data := f_rnd_octstring(f_rnd_int(100));</span><br><span style="color: hsl(120, 100%, 40%);">+              var template (value) M3UA_Protocol_Data tx_pd;</span><br><span style="color: hsl(120, 100%, 40%);">+                var template (present) M3UA_Protocol_Data rx_pd;</span><br><span style="color: hsl(120, 100%, 40%);">+              tx_pd := ts_M3UA_protocol_data(pc_sender, pc_receiver, '23'O, '00'O, '00'O, '00'O, data);</span><br><span style="color: hsl(120, 100%, 40%);">+             rx_pd := tr_M3UA_protocol_data(pc_sender, pc_receiver, '23'O, '00'O, '00'O, '00'O, data);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_M3UA_send(0, ts_M3UA_DATA(rctx_sender, tx_pd), 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          alt {</span><br><span style="color: hsl(120, 100%, 40%);">+         [] as_count_rx(1, tr_M3UA_DATA(rctx_receiver, rx_pd), num_rx[1])</span><br><span style="color: hsl(120, 100%, 40%);">+              [] as_count_rx(2, tr_M3UA_DATA(rctx_receiver, rx_pd), num_rx[2])</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* FIXME: check for extraneous messages? */</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i := 1; i <= 2; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           if (num_rx[i] != iter_per_asp) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(fail, "Received only ", num_rx[i], " out of expected ", iter_per_asp,</span><br><span style="color: hsl(120, 100%, 40%);">+                             "M3UA DATA messages");</span><br><span 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(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* test "traffic-mode broadcast" behavior */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_tmt_broadcast() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var OCT4 rctx_sender := int2oct(1023, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+     var OCT4 pc_sender := int2oct(23, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ var OCT4 rctx_receiver := int2oct(1042, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+   var OCT4 pc_receiver := int2oct(42, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FIXME: configure the STP via VTY to set traffic-mode */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* bring up the 'sender' side (single ASP in AS) */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* activate the first 'receiver' side ASP */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_M3UA_asp_up(1);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_M3UA_asp_up_act(1, c_M3UA_TMT_broadcast, omit); // TODO: rctx</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* verify traffic is routed from sender to [sole] receiver */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < 10; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           f_test_traffic(0, rctx_sender, pc_sender, 1, rctx_receiver, pc_receiver);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* activate the second 'receiver' side ASP */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_M3UA_asp_up_act(2, c_M3UA_TMT_broadcast, omit, omit, omit); // TODO: rctx</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* verify traffic is routed from sender to new receiver */</span><br><span style="color: hsl(120, 100%, 40%);">+    for (i := 0; i < 10; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           var octetstring data := f_rnd_octstring(f_rnd_int(100));</span><br><span style="color: hsl(120, 100%, 40%);">+              var template (value) M3UA_Protocol_Data tx_pd;</span><br><span style="color: hsl(120, 100%, 40%);">+                var template (present) M3UA_Protocol_Data rx_pd;</span><br><span style="color: hsl(120, 100%, 40%);">+              tx_pd := ts_M3UA_protocol_data(pc_sender, pc_receiver, '23'O, '00'O, '00'O, '00'O, data);</span><br><span style="color: hsl(120, 100%, 40%);">+             rx_pd := tr_M3UA_protocol_data(pc_sender, pc_receiver, '23'O, '00'O, '00'O, '00'O, data);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_M3UA_send(0, ts_M3UA_DATA(rctx_sender, tx_pd), 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          /* each message must be received both on 1 and 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+           f_M3UA_exp(1, tr_M3UA_DATA(rctx_receiver, rx_pd));</span><br><span style="color: hsl(120, 100%, 40%);">+            f_M3UA_exp(2, tr_M3UA_DATA(rctx_receiver, rx_pd));</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     setverdict(pass);</span><br><span 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_M3UA_rkm_register(OCT4 id, OCT3 dpc, OCT4 rctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 template (present) OCT4 exp_status := c_M3UA_REGSTS_SUCCESS)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_M3UA_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     f_M3UA_send(0, ts_M3UA_REG_REQ({ts_M3UA_rkey(id:=id, dpc:=dpc, rctx:=rctx)}));</span><br><span style="color: hsl(120, 100%, 40%);">+        f_M3UA_exp(0, tr_M3UA_REG_RSP({tr_M3UA_reg_res(id:=id, status:=exp_status, rctx:=rctx)}));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Send RKM registration; expect -EPERM as RCTX doesn't match config and dynamic not permitted */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_rkm_reg_static_notpermitted() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_M3UA_send(0, ts_M3UA_REG_REQ({ts_M3UA_rkey(id:='00000099'O, dpc:='aabbcc'O)}));</span><br><span style="color: hsl(120, 100%, 40%);">+     f_M3UA_exp(0, tr_M3UA_REG_RSP({tr_M3UA_reg_res(id:='00000099'O, status:=c_M3UA_REGSTS_ERR_EPERM,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     rctx:=?)}));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Send RKM registration; expect OK as RCTX does match config */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_rkm_reg_static_permitted() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var OCT3 dpc := int2oct(23, 3); // must match config</span><br><span style="color: hsl(120, 100%, 40%);">+  var OCT4 rctx := int2oct(1023, 4);  // must match config</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_M3UA_send(0, ts_M3UA_REG_REQ({ts_M3UA_rkey(id:='10000099'O, dpc:=dpc, rctx:=rctx)}));</span><br><span style="color: hsl(120, 100%, 40%);">+       f_M3UA_exp(0, tr_M3UA_REG_RSP({tr_M3UA_reg_res(id:='10000099'O, status:=c_M3UA_REGSTS_SUCCESS,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       rctx:=rctx)}));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Send RKM registration; expect OK as dynamic not permitted */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_rkm_reg_dynamic_permitted() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init_common();</span><br><span style="color: hsl(120, 100%, 40%);">+      f_vty_config2(VTY, {"cs7 instance 0"}, "xua rkm routing-key-allocation dynamic-permitted");</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_M3UA_send(0, ts_M3UA_REG_REQ({ts_M3UA_rkey(id:='20000099'O, dpc:='aabbcc'O)}));</span><br><span style="color: hsl(120, 100%, 40%);">+     f_M3UA_exp(0, tr_M3UA_REG_RSP({tr_M3UA_reg_res(id:='20000099'O, status:=c_M3UA_REGSTS_SUCCESS,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       rctx:=?)}));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_vty_config2(VTY, {"cs7 instance 0"}, "xua rkm routing-key-allocation static-only");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* try to de-register a routing key that was never registered -> error */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_rkm_unreg_never_registered() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_M3UA_send(0, ts_M3UA_DEREG_REQ(ts_M3UA_routing_ctx(int2oct(1023,4))));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_M3UA_exp(0, tr_M3UA_DEREG_RSP({tr_M3UA_dereg_res(?,c_m3UA_DEREGSTS_ERR_NOT_REG)}));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* try to de-register a routing key that is invalid (non-existant) -> error */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_rkm_unreg_invalid() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_M3UA_send(0, ts_M3UA_DEREG_REQ(ts_M3UA_routing_ctx(int2oct(1234,4))));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_M3UA_exp(0, tr_M3UA_DEREG_RSP({tr_M3UA_dereg_res(?,c_m3UA_DEREGSTS_ERR_INVAL_RCTX)}));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* try to de-register a routing key that was registered -> OK*/</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_rkm_unreg_registered() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_M3UA_send(0, ts_M3UA_DEREG_REQ(ts_M3UA_routing_ctx(int2oct(1023,4))));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_M3UA_exp(0, tr_M3UA_DEREG_RSP({tr_M3UA_dereg_res(?,c_m3UA_DEREGSTS_SUCCESS)}));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* try to de-register a routing key for an active ASP -> ERROR */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_rkm_unreg_active() runs on RAW_M3UA_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var OCT3 dpc := int2oct(23, 3); // must match config</span><br><span style="color: hsl(120, 100%, 40%);">+  var OCT4 rctx := int2oct(1023, 4);  // must match config</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init_m3ua();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* first register the routing key */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_M3UA_rkm_register(id:='30000099'O, dpc:=dpc, rctx:=rctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* then activate the ASP */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_M3UA_asp_up_act(0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* then try to de-regsiter */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_M3UA_send(0, ts_M3UA_DEREG_REQ(ts_M3UA_routing_ctx(rctx)));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_M3UA_exp(0, tr_M3UA_DEREG_RSP({tr_M3UA_dereg_res(?,c_m3UA_DEREGSTS_ERR_ASP_ACTIVE)}));</span><br><span style="color: hsl(120, 100%, 40%);">+      /* FIXME: we now may have changed the state on the STP side! */</span><br><span 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%);">+control {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* M3UA Tests */</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_connect_asp_up() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_beat() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_beat_payload() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_asp_act() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_asp_act_override() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_asp_act_loadshare() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_asp_act_broadcast() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_tmt_override() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_tmt_loadshare() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_tmt_broadcast() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* M3UA RKM tests */</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_rkm_reg_static_notpermitted() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_rkm_reg_static_permitted() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_rkm_reg_dynamic_permitted() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_rkm_unreg_never_registered() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_rkm_unreg_invalid() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_rkm_unreg_registered() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_rkm_unreg_active() );</span><br><span style="color: hsl(120, 100%, 40%);">+     /* TODO: test RKM with unsupported routing keys: NA, SI, OPC */</span><br><span style="color: hsl(120, 100%, 40%);">+       /* TODO: register/unregister multiple routing contexts in one message; including mixed</span><br><span style="color: hsl(120, 100%, 40%);">+                 success/failure situations */</span><br><span 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/stp/gen_links.sh b/stp/gen_links.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..aaf3421</span><br><span>--- /dev/null</span><br><span>+++ b/stp/gen_links.sh</span><br><span>@@ -0,0 +1,57 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/bash</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+BASEDIR=../deps</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+. ../gen_links.sh.inc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.Libraries.TCCUsefulFunctions/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="TCCInterface_Functions.ttcn TCCConversion_Functions.ttcn TCCConversion.cc TCCInterface.cc TCCInterface_ip.h"</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+=" TCCEncoding_Functions.ttcn TCCEncoding.cc " # GSM 7-bit coding</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.Common_Components.Socket-API/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Socket_API_Definitions.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Required by MGCP and IPA</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.IPL4asp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="IPL4asp_Functions.ttcn  IPL4asp_PT.cc  IPL4asp_PT.hh IPL4asp_PortType.ttcn  IPL4asp_Types.ttcn  IPL4asp_discovery.cc IPL4asp_protocol_L234.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# required by M3UA_Emulation</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolModules.M3UA/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="M3UA_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# required by M3UA_Emulation</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.SCTPasp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="SCTPasp_PT.cc  SCTPasp_PT.hh  SCTPasp_PortType.ttcn  SCTPasp_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# required by M3UA Emulation</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.MTP3asp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="MTP3asp_PortType.ttcn  MTP3asp_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# required by SCCP Emulation</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolEmulations.M3UA/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="M3UA_Emulation.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.ProtocolEmulations.SCCP/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="SCCP_Emulation.ttcn  SCCP_EncDec.cc  SCCP_Mapping.ttcnpp  SCCP_Types.ttcn  SCCPasp_Types.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.TELNETasp/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="TELNETasp_PT.cc  TELNETasp_PT.hh  TELNETasp_PortType.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=../library</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="IPA_Types.ttcn IPA_Emulation.ttcnpp IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="SCCP_Templates.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="M3UA_Templates.ttcn M3UA_CodecPort.ttcn M3UA_CodecPort_CtrlFunct.ttcn M3UA_CodecPort_CtrlFunctDef.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ignore_pp_results</span><br><span>diff --git a/stp/osmo-stp.cfg b/stp/osmo-stp.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..d5eccba</span><br><span>--- /dev/null</span><br><span>+++ b/stp/osmo-stp.cfg</span><br><span>@@ -0,0 +1,63 @@</span><br><span style="color: hsl(120, 100%, 40%);">+!</span><br><span style="color: hsl(120, 100%, 40%);">+! OsmoSTP (1.1.0.2-3884) configuration saved from vty</span><br><span style="color: hsl(120, 100%, 40%);">+!!</span><br><span style="color: hsl(120, 100%, 40%);">+!</span><br><span style="color: hsl(120, 100%, 40%);">+log stderr</span><br><span style="color: hsl(120, 100%, 40%);">+ logging filter all 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging color 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print category-hex 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print category 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging timestamp 0</span><br><span style="color: hsl(120, 100%, 40%);">+ logging print file 1</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lglobal notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level llapd notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level linp notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lmux notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lmi notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lmib notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lsms notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lctrl notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lgtp notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lstats notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lgsup notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level loap notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lss7 debug</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lsccp debug</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lsua debug</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lm3ua debug</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lmgcp notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level ljibuf notice</span><br><span style="color: hsl(120, 100%, 40%);">+ logging level lrspro notice</span><br><span style="color: hsl(120, 100%, 40%);">+!</span><br><span style="color: hsl(120, 100%, 40%);">+stats interval 5</span><br><span style="color: hsl(120, 100%, 40%);">+!</span><br><span style="color: hsl(120, 100%, 40%);">+line vty</span><br><span style="color: hsl(120, 100%, 40%);">+ no login</span><br><span style="color: hsl(120, 100%, 40%);">+!</span><br><span style="color: hsl(120, 100%, 40%);">+cs7 instance 0</span><br><span style="color: hsl(120, 100%, 40%);">+ point-code format 24</span><br><span style="color: hsl(120, 100%, 40%);">+ asp asp-sender 9999 2905 m3ua</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+ asp asp-receiver0 10000 2905 m3ua</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+ asp asp-receiver1 10001 2905 m3ua</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+ as as-sender m3ua</span><br><span style="color: hsl(120, 100%, 40%);">+  asp asp-sender</span><br><span style="color: hsl(120, 100%, 40%);">+  routing-key 1023 23</span><br><span style="color: hsl(120, 100%, 40%);">+ as as-receiver m3ua</span><br><span style="color: hsl(120, 100%, 40%);">+  asp asp-receiver0</span><br><span style="color: hsl(120, 100%, 40%);">+  routing-key 1042 42</span><br><span style="color: hsl(120, 100%, 40%);">+ as mahlzeit ipa</span><br><span style="color: hsl(120, 100%, 40%);">+  routing-key 0 5</span><br><span style="color: hsl(120, 100%, 40%);">+  point-code override dpc 23</span><br><span style="color: hsl(120, 100%, 40%);">+ route-table system</span><br><span style="color: hsl(120, 100%, 40%);">+  update route 23 16777215 linkset as-sender</span><br><span style="color: hsl(120, 100%, 40%);">+  update route 42 16777215 linkset as-receiver</span><br><span style="color: hsl(120, 100%, 40%);">+ listen m3ua 2905</span><br><span style="color: hsl(120, 100%, 40%);">+  accept-asp-connections dynamic-permitted</span><br><span style="color: hsl(120, 100%, 40%);">+ listen ipa 5000</span><br><span style="color: hsl(120, 100%, 40%);">+  accept-asp-connections dynamic-permitted</span><br><span>diff --git a/stp/regen_makefile.sh b/stp/regen_makefile.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..be96829</span><br><span>--- /dev/null</span><br><span>+++ b/stp/regen_makefile.sh</span><br><span>@@ -0,0 +1,7 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/sh</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="*.ttcn *.ttcnpp SCCP_EncDec.cc SCTPasp_PT.cc TCCConversion.cc  TCCInterface.cc IPL4asp_PT.cc IPL4asp_discovery.cc IPA_CodecPort_CtrlFunctDef.cc TELNETasp_PT.cc Native_FunctionDefs.cc TCCEncoding.cc M3UA_CodecPort_CtrlFunctDef.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+export CPPFLAGS_TTCN3="-DIPA_EMULATION_CTRL -DIPA_EMULATION_SCCP -DUSE_MTP3_DISTRIBUTOR"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+../regen-makefile.sh STP_Tests.ttcn $FILES</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15822">change 15822</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/+/15822"/><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: I628a87385cac0dfe708a0d74a5088fbd5a4790cd </div>
<div style="display:none"> Gerrit-Change-Number: 15822 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>