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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Initial TTCN-3 test suite for osmo-remsim<br><br>This adds shared infrastructure and initial test suites for<br>osmo-remsim-{server,client,bankd}.<br><br>Change-Id: I00034d3a991f0f881cfd8ff0bfc4557113daf830<br>---<br>M Makefile<br>M deps/Makefile<br>A remsim/REMSIM_Tests.cfg<br>A remsim/REMSIM_Tests.default<br>A remsim/REMSIM_Tests.ttcn<br>A remsim/RSPRO.asn<br>A remsim/RSPRO_EncDec.cc<br>A remsim/RSPRO_Server.ttcn<br>A remsim/RSPRO_Types.ttcn<br>A remsim/RSRES.ttcn<br>A remsim/RemsimBankd_Tests.ttcn<br>A remsim/RemsimClient_Tests.ttcn<br>A remsim/RemsimServer_Tests.ttcn<br>A remsim/gen_links.sh<br>A remsim/regen_makefile.sh<br>15 files changed, 2,252 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 2c8e951..99243d6 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 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 sysinfo</span><br><span> </span><br><span> NPROC=$(shell nproc 2>/dev/null)</span><br><span> ifeq ($(NPROC),)</span><br><span>diff --git a/deps/Makefile b/deps/Makefile</span><br><span>index ed265c0..ec31e59 100644</span><br><span>--- a/deps/Makefile</span><br><span>+++ b/deps/Makefile</span><br><span>@@ -22,6 +22,7 @@</span><br><span>                       titan.ProtocolModules.ICMP \</span><br><span>                         titan.ProtocolModules.ICMPv6 \</span><br><span>                       titan.ProtocolModules.IP \</span><br><span style="color: hsl(120, 100%, 40%);">+                    titan.ProtocolModules.JSON_v07_2006 \</span><br><span>                        titan.ProtocolModules.L2TP \</span><br><span>                         titan.ProtocolModules.M3UA \</span><br><span>                         titan.ProtocolModules.SMPP \</span><br><span>@@ -30,6 +31,8 @@</span><br><span>                     titan.ProtocolModules.RTP \</span><br><span>                  titan.ProtocolModules.DIAMETER_ProtocolModule_Generator \</span><br><span>                    titan.TestPorts.Common_Components.Socket-API \</span><br><span style="color: hsl(120, 100%, 40%);">+                        titan.TestPorts.Common_Components.Abstract_Socket \</span><br><span style="color: hsl(120, 100%, 40%);">+                   titan.TestPorts.HTTPmsg \</span><br><span>                    titan.TestPorts.IPL4asp \</span><br><span>                    titan.TestPorts.LANL2asp \</span><br><span>                   titan.TestPorts.PCAPasp \</span><br><span>@@ -84,6 +87,7 @@</span><br><span> titan.ProtocolModules.ICMPv6_commit=           R.2.A</span><br><span> titan.ProtocolModules.IP_commit=               R.10.B-1-g99d0ec9</span><br><span> titan.ProtocolModules.ISUP_Q.762_commit=   R.8.A</span><br><span style="color: hsl(120, 100%, 40%);">+titan.ProtocolModules.JSON_v07_2006_commit=      R.1.A</span><br><span> titan.ProtocolModules.L2TP_commit=             R.2.A</span><br><span> titan.ProtocolModules.LLC_v7.1.0_commit=       2a3c09fbf7bae22f802aa88689800f38a1f3732d</span><br><span> titan.ProtocolModules.MAP_commit=           R.2.A-1-g79c6a3d</span><br><span>@@ -104,7 +108,9 @@</span><br><span> titan.ProtocolModules.TCP_commit=             R.3.A</span><br><span> titan.ProtocolModules.UDP_commit=              R.4.A</span><br><span> titan.TestPorts.Common_Components.Socket-API_commit=   R.6.A</span><br><span style="color: hsl(120, 100%, 40%);">+titan.TestPorts.Common_Components.Abstract_Socket_commit=        R.9.B</span><br><span> titan.TestPorts.GPIO_commit=                   R.3.A</span><br><span style="color: hsl(120, 100%, 40%);">+titan.TestPorts.HTTPmsg_commit=                  R.9.B</span><br><span> titan.TestPorts.IPL4asp_commit=                        R.29.A</span><br><span> titan.TestPorts.LANL2asp_commit=              R.8.B</span><br><span> titan.TestPorts.MTP3asp_commit=                        1cecdad6f3641a5f19b3833703bff6e5005eff11</span><br><span>diff --git a/remsim/REMSIM_Tests.cfg b/remsim/REMSIM_Tests.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..b2dd9b2</span><br><span>--- /dev/null</span><br><span>+++ b/remsim/REMSIM_Tests.cfg</span><br><span>@@ -0,0 +1,10 @@</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%);">+"./REMSIM_Tests.default"</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%);">+RemsimServer_Tests.control</span><br><span style="color: hsl(120, 100%, 40%);">+#RemsimBankd_Tests.control</span><br><span style="color: hsl(120, 100%, 40%);">+#RemsimClient_Tests.control</span><br><span>diff --git a/remsim/REMSIM_Tests.default b/remsim/REMSIM_Tests.default</span><br><span>new file mode 100644</span><br><span>index 0000000..7a41555</span><br><span>--- /dev/null</span><br><span>+++ b/remsim/REMSIM_Tests.default</span><br><span>@@ -0,0 +1,3 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[TESTPORT_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+system.HTTP.http_debugging := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+system.HTTP.use_notification_ASPs := "no"</span><br><span>diff --git a/remsim/REMSIM_Tests.ttcn b/remsim/REMSIM_Tests.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..ee2d450</span><br><span>--- /dev/null</span><br><span>+++ b/remsim/REMSIM_Tests.ttcn</span><br><span>@@ -0,0 +1,247 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module REMSIM_Tests {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Implementation of RSPRO Client in TTCN-3.</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_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSPRO all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSPRO_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_Types all;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+modulepar {</span><br><span style="color: hsl(120, 100%, 40%);">+ charstring mp_bankd_ip := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+      integer mp_bankd_port := 9999;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      charstring mp_server_ip := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+     integer mp_server_port := 9998;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     integer mp_rsres_port := 9997;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const integer NUM_CLIENT := 3;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record RSPRO_Client {</span><br><span style="color: hsl(120, 100%, 40%);">+     IPA_Emulation_CT        vc_IPA,</span><br><span style="color: hsl(120, 100%, 40%);">+       IPA_CCM_Parameters      ccm_pars,</span><br><span style="color: hsl(120, 100%, 40%);">+     charstring              id,</span><br><span style="color: hsl(120, 100%, 40%);">+   ComponentIdentity       rspro_id,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   ClientSlot              rspro_client_slot optional,</span><br><span style="color: hsl(120, 100%, 40%);">+   BankId                  rspro_bank_id optional,</span><br><span style="color: hsl(120, 100%, 40%);">+       SlotNumber              rspro_bank_nslots optional</span><br><span 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 rspro_client_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var RSPRO_Client        rspro[NUM_CLIENT];</span><br><span style="color: hsl(120, 100%, 40%);">+    port IPA_RSPRO_PT       RSPRO[NUM_CLIENT];</span><br><span 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_ignore_id_ack(integer i := 0) runs on rspro_client_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  [] RSPRO[i].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_ID_ACK}) { 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%);">+function f_rspro_init(inout RSPRO_Client clnt, charstring dst_host, integer dst_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                ComponentIdentity rspro_id, integer i)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_client_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      timer T := 4.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     clnt.id := "RSPRO" & int2str(i);</span><br><span style="color: hsl(120, 100%, 40%);">+        clnt.vc_IPA := IPA_Emulation_CT.create(clnt.id);</span><br><span style="color: hsl(120, 100%, 40%);">+      clnt.ccm_pars := c_IPA_default_ccm_pars;</span><br><span style="color: hsl(120, 100%, 40%);">+      clnt.ccm_pars.name := "Osmocom TTCN-3 RSPRO client simulator";</span><br><span style="color: hsl(120, 100%, 40%);">+      clnt.rspro_id := rspro_id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* leave it up to the caller to set those */</span><br><span style="color: hsl(120, 100%, 40%);">+  clnt.rspro_client_slot := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+       clnt.rspro_bank_id := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+   clnt.rspro_bank_nslots := omit;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     map(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+       connect(clnt.vc_IPA:IPA_RSPRO_PORT, self:RSPRO[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ clnt.vc_IPA.start(IPA_Emulation.main_client(dst_host, dst_port, "", 10000+i, clnt.ccm_pars));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSPRO[i].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_UP}) { }</span><br><span style="color: hsl(120, 100%, 40%);">+  [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for ASP_IPA_EVENT_UP");</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%);">+     T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSPRO[i].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_ID_ACK}) { }</span><br><span style="color: hsl(120, 100%, 40%);">+      [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for ASP_IPA_EVENT_ID_ACK");</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%);">+ activate(as_ignore_id_ack(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%);">+function f_rspro_fini(inout RSPRO_Client clnt, integer i)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_client_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     clnt.vc_IPA.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     disconnect(clnt.vc_IPA:IPA_RSPRO_PORT, self:RSPRO[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+        unmap(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rspro_exp(template RsproPDU exp, integer i := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_client_CT return RsproPDU</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     var RsproPDU pdu;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   timer T := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+      T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSPRO[i].receive(exp) -> value pdu {</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%);">+     [] RSPRO[i].receive(RsproPDU:?) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Received unexpected RPSRO", pdu);</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%);">+     [] RSPRO[i].receive {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Received unexpected != RPSRO");</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%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for ", exp);</span><br><span style="color: hsl(120, 100%, 40%);">+              mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return pdu;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rspro_exp_disconnect(integer i := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_client_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  timer T := 10.0;</span><br><span style="color: hsl(120, 100%, 40%);">+      T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSPRO[i].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_DOWN}) {</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%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout expecting disconnect");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rspro_connect_client(integer i, template ResultCode exp_res := ok) runs on rspro_client_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    select (rspro[i].rspro_id.type_) {</span><br><span style="color: hsl(120, 100%, 40%);">+    case (remsimClient) {</span><br><span style="color: hsl(120, 100%, 40%);">+         RSPRO[i].send(ts_RSPRO_ConnectClientReq(rspro[i].rspro_id, rspro[i].rspro_client_slot));</span><br><span style="color: hsl(120, 100%, 40%);">+              f_rspro_exp(tr_RSPRO_ConnectClientRes(?, exp_res), i);</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     case (remsimBankd) {</span><br><span style="color: hsl(120, 100%, 40%);">+          var template IpAddress ip := ts_IPv4(mp_bankd_ip);</span><br><span style="color: hsl(120, 100%, 40%);">+            RSPRO[i].send(ts_RSPRO_ConnectBankReq(rspro[i].rspro_id, rspro[i].rspro_bank_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    rspro[i].rspro_bank_nslots,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   ts_IpPort(ip, mp_bankd_port)));</span><br><span style="color: hsl(120, 100%, 40%);">+         f_rspro_exp(tr_RSPRO_ConnectBankRes(?, exp_res), i);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+     case else {</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail, "Unsupported type ", rspro[i].rspro_id.type_);</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%);">+function f_rspro_connect_clients() runs on rspro_client_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</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%);">+      for (i := 0; i < NUM_CLIENT; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           select (rspro[i].rspro_id.type_) {</span><br><span style="color: hsl(120, 100%, 40%);">+            case (remsimClient) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 RSPRO[i].send(ts_RSPRO_ConnectClientReq(rspro[i].rspro_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                            rspro[i].rspro_client_slot));</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (remsimBankd) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  var template IpAddress ip := ts_IPv4(mp_bankd_ip);</span><br><span style="color: hsl(120, 100%, 40%);">+                    RSPRO[i].send(ts_RSPRO_ConnectBankReq(rspro[i].rspro_id, rspro[i].rspro_bank_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                            rspro[i].rspro_bank_nslots,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                           ts_IpPort(ip, mp_bankd_port)));</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i := 0; i < NUM_CLIENT; i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           select (rspro[i].rspro_id.type_) {</span><br><span style="color: hsl(120, 100%, 40%);">+            case (remsimClient) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 f_rspro_exp(tr_RSPRO_ConnectClientRes(?, ResultCode:ok), i);</span><br><span style="color: hsl(120, 100%, 40%);">+                  }</span><br><span style="color: hsl(120, 100%, 40%);">+             case (remsimBankd) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  f_rspro_exp(tr_RSPRO_ConnectBankRes(?, ResultCode:ok), 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%);">+/* transceive a TPDU from modem to card (and back) */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rspro_xceive_mdm2card(integer idx, BankSlot bs, template (value) octetstring data,</span><br><span style="color: hsl(120, 100%, 40%);">+                           template (value) TpduFlags flags) runs on rspro_client_CT return octetstring {</span><br><span style="color: hsl(120, 100%, 40%);">+       var RsproPDU rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      RSPRO[idx].send(ts_RSPRO_TpduModemToCard(rspro[idx].rspro_client_slot, bs, flags, data));</span><br><span style="color: hsl(120, 100%, 40%);">+     rx := f_rspro_exp(tr_RSPRO_TpduCardToModem(bs, rspro[idx].rspro_client_slot, ?, ?));</span><br><span style="color: hsl(120, 100%, 40%);">+  return rx.msg.tpduCardToModem.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%);">+/* handle an incoming CreateMapping + ACK it */</span><br><span style="color: hsl(120, 100%, 40%);">+altstep as_rspro_create_mapping(integer i, template ClientSlot cslot := ?, template BankSlot bslot := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                           template ResultCode res := ok)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_client_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var RsproPDU rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      [] RSPRO[i].receive(tr_RSPRO_CreateMappingReq(cslot, bslot)) -> value rx {</span><br><span style="color: hsl(120, 100%, 40%);">+         RSPRO[i].send(ts_RSPRO_CreateMappingRes(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%);">+/* handle an incoming RemoveMapping + ACK it */</span><br><span style="color: hsl(120, 100%, 40%);">+altstep as_rspro_remove_mapping(integer i, template ClientSlot cslot := ?, template BankSlot bslot := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                             template ResultCode res := ok)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_client_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var RsproPDU rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      [] RSPRO[i].receive(tr_RSPRO_RemoveMappingReq(cslot, bslot)) -> value rx {</span><br><span style="color: hsl(120, 100%, 40%);">+         RSPRO[i].send(ts_RSPRO_RemoveMappingRes(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%);">+altstep as_rspro_cfg_client_id(integer i, template ClientSlot cslot := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                             template (value) ResultCode res := ok)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_client_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var RsproPDU rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      [] RSPRO[i].receive(tr_RSPRO_ConfigClientIdReq(cslot)) -> value rx {</span><br><span style="color: hsl(120, 100%, 40%);">+               RSPRO[i].send(ts_RSPRO_ConfigClientIdRes(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%);">+altstep as_rspro_cfg_client_bank(integer i, template BankSlot bslot := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                              template IpPort ip_port := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                template (value) ResultCode res := ok)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_client_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var RsproPDU rx;</span><br><span style="color: hsl(120, 100%, 40%);">+      [] RSPRO[i].receive(tr_RSPRO_ConfigClientBankReq(bslot, ip_port)) -> value rx {</span><br><span style="color: hsl(120, 100%, 40%);">+            RSPRO[i].send(ts_RSPRO_ConfigClientBankRes(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/remsim/RSPRO.asn b/remsim/RSPRO.asn</span><br><span>new file mode 100644</span><br><span>index 0000000..aaafb96</span><br><span>--- /dev/null</span><br><span>+++ b/remsim/RSPRO.asn</span><br><span>@@ -0,0 +1,349 @@</span><br><span style="color: hsl(120, 100%, 40%);">+----------------------------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+-- RSPRO - Remote SIM Protocol, part of Osmocom Remote SIM Suite</span><br><span style="color: hsl(120, 100%, 40%);">+-- (C) 2018 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%);">+-- SPDX-License-Identifier: GPL-2.0+</span><br><span style="color: hsl(120, 100%, 40%);">+--</span><br><span style="color: hsl(120, 100%, 40%);">+-- This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+-- it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+-- the Free Software Foundation; either version 2 of the License, 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%);">+-- This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+-- but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+-- GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+--</span><br><span style="color: hsl(120, 100%, 40%);">+-- You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+-- with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+-- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span style="color: hsl(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%);">+RSPRO {} DEFINITIONS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+IMPLICIT TAGS</span><br><span style="color: hsl(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%);">+BEGIN</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+EXPORTS</span><br><span style="color: hsl(120, 100%, 40%);">+     RsproPDU</span><br><span style="color: hsl(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%);">+-- Elementary Data Types</span><br><span style="color: hsl(120, 100%, 40%);">+----------------------------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+-- Some random ID the requestor can chose and which the client echos back in a response.</span><br><span style="color: hsl(120, 100%, 40%);">+-- This allows multiple outstanding commands in flight and matching of responses to requests.</span><br><span style="color: hsl(120, 100%, 40%);">+OperationTag ::= INTEGER(0..2147483647)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+-- Unique identifier of a given SIM bank</span><br><span style="color: hsl(120, 100%, 40%);">+BankId ::= INTEGER(0..1023)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+-- Unique identifier of a given client (modem)</span><br><span style="color: hsl(120, 100%, 40%);">+ClientId ::= INTEGER(0..1023)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ComponentType ::= ENUMERATED {</span><br><span style="color: hsl(120, 100%, 40%);">+       -- client: Modems / Phones</span><br><span style="color: hsl(120, 100%, 40%);">+    remsimClient                    (0),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- server: Coordination</span><br><span style="color: hsl(120, 100%, 40%);">+       remsimServer                    (1),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- bank daemon: SIM cards</span><br><span style="color: hsl(120, 100%, 40%);">+     remsimBankd                     (2)</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+ComponentName ::= IA5String (SIZE (1..32))</span><br><span style="color: hsl(120, 100%, 40%);">+ComponentIdentity ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+  type            ComponentType,</span><br><span style="color: hsl(120, 100%, 40%);">+        name            ComponentName,</span><br><span style="color: hsl(120, 100%, 40%);">+        software        [0] ComponentName,</span><br><span style="color: hsl(120, 100%, 40%);">+    swVersion       [1] ComponentName,</span><br><span style="color: hsl(120, 100%, 40%);">+    hwManufacturer  [2] ComponentName OPTIONAL,</span><br><span style="color: hsl(120, 100%, 40%);">+   hwModel         [3] ComponentName OPTIONAL,</span><br><span style="color: hsl(120, 100%, 40%);">+   hwSerialNr      [4] ComponentName OPTIONAL,</span><br><span style="color: hsl(120, 100%, 40%);">+   hwVersion       [5] ComponentName OPTIONAL,</span><br><span style="color: hsl(120, 100%, 40%);">+   fwVersion       [6] ComponentName OPTIONAL,</span><br><span style="color: hsl(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%);">+-- IP address / port details</span><br><span style="color: hsl(120, 100%, 40%);">+Ipv4Address ::= OCTET STRING (SIZE (4))</span><br><span style="color: hsl(120, 100%, 40%);">+Ipv6Address ::= OCTET STRING (SIZE (16))</span><br><span style="color: hsl(120, 100%, 40%);">+IpAddress ::= CHOICE {</span><br><span style="color: hsl(120, 100%, 40%);">+     ipv4    [0] Ipv4Address,</span><br><span style="color: hsl(120, 100%, 40%);">+      ipv6    [1] Ipv6Address</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+PortNumber ::= INTEGER (0..65535)</span><br><span style="color: hsl(120, 100%, 40%);">+IpPort ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+  ip      IpAddress,</span><br><span style="color: hsl(120, 100%, 40%);">+    port    PortNumber</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+-- Result of a given operation</span><br><span style="color: hsl(120, 100%, 40%);">+ResultCode ::= ENUMERATED {</span><br><span style="color: hsl(120, 100%, 40%);">+  ok                              (0),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- client / bank / slot ID not accepted</span><br><span style="color: hsl(120, 100%, 40%);">+       illegalClientId                 (1),</span><br><span style="color: hsl(120, 100%, 40%);">+  illegalBankId                   (2),</span><br><span style="color: hsl(120, 100%, 40%);">+  illegalSlotId                   (3),</span><br><span style="color: hsl(120, 100%, 40%);">+  unsupportedProtocolVersion      (4),</span><br><span style="color: hsl(120, 100%, 40%);">+  unknownSlotmap                  (5),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        -- no card is present in given slot</span><br><span style="color: hsl(120, 100%, 40%);">+   cardNotPresent                  (100),</span><br><span style="color: hsl(120, 100%, 40%);">+        -- card is present but unresponsive in given slot</span><br><span style="color: hsl(120, 100%, 40%);">+     cardUnresponsive                (101),</span><br><span style="color: hsl(120, 100%, 40%);">+        -- unrecoverable transmission errors detected</span><br><span style="color: hsl(120, 100%, 40%);">+ cardTransmissionError           (102),</span><br><span style="color: hsl(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%);">+ErrorCode ::= ENUMERATED {</span><br><span style="color: hsl(120, 100%, 40%);">+  -- Bankd or Server has received connection form unknown client (no mapping)</span><br><span style="color: hsl(120, 100%, 40%);">+   unknownClientConnected          (1),</span><br><span style="color: hsl(120, 100%, 40%);">+  -- unexpected disconnect (typically bankd reports client disconnect)</span><br><span style="color: hsl(120, 100%, 40%);">+  unexpectedDisconnect            (2),</span><br><span style="color: hsl(120, 100%, 40%);">+  unexpectedProtocolVersion       (3),</span><br><span style="color: hsl(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%);">+ErrorString ::= IA5String (SIZE (1..255))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ErrorSeverity ::= ENUMERATED {</span><br><span style="color: hsl(120, 100%, 40%);">+ minor                           (1),</span><br><span style="color: hsl(120, 100%, 40%);">+  major                           (2),</span><br><span style="color: hsl(120, 100%, 40%);">+  fatal                           (3),</span><br><span style="color: hsl(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%);">+-- Slot number within a SIM bank or a client.</span><br><span style="color: hsl(120, 100%, 40%);">+SlotNumber ::= INTEGER(0..1023)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+-- Slot identity on client (modem) side</span><br><span style="color: hsl(120, 100%, 40%);">+ClientSlot ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+        clientId        ClientId,</span><br><span style="color: hsl(120, 100%, 40%);">+     slotNr          SlotNumber,</span><br><span style="color: hsl(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%);">+-- Slot identity on SIM bank side</span><br><span style="color: hsl(120, 100%, 40%);">+BankSlot ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+  bankId          BankId,</span><br><span style="color: hsl(120, 100%, 40%);">+       slotNr          SlotNumber,</span><br><span style="color: hsl(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%);">+ATR ::= OCTET STRING (SIZE (1..55))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+-- flags related to a TPDU in either of the two directions</span><br><span style="color: hsl(120, 100%, 40%);">+TpduFlags ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+ -- indicates a TPDU header is present in this message</span><br><span style="color: hsl(120, 100%, 40%);">+ tpduHeaderPresent       BOOLEAN,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- indicates last part of transmission in this direction</span><br><span style="color: hsl(120, 100%, 40%);">+      finalPart               BOOLEAN,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- indicates a PB is present and we should continue with TX</span><br><span style="color: hsl(120, 100%, 40%);">+   procByteContinueTx      BOOLEAN,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- indicates a PB is present and we should continue with RX</span><br><span style="color: hsl(120, 100%, 40%);">+   procByteContinueRx      BOOLEAN,</span><br><span style="color: hsl(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%);">+--- physical state of a given slot</span><br><span style="color: hsl(120, 100%, 40%);">+SlotPhysStatus ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+   -- is RST activated by the modem?</span><br><span style="color: hsl(120, 100%, 40%);">+     resetActive     [0] BOOLEAN,</span><br><span style="color: hsl(120, 100%, 40%);">+  -- is VCC applied by the modem?</span><br><span style="color: hsl(120, 100%, 40%);">+       vccPresent      [1] BOOLEAN OPTIONAL,</span><br><span style="color: hsl(120, 100%, 40%);">+ -- is CLK applied by the modem?</span><br><span style="color: hsl(120, 100%, 40%);">+       clkActive       [2] BOOLEAN OPTIONAL, -- not all hardware supports this</span><br><span style="color: hsl(120, 100%, 40%);">+       -- is card presence signalled to the modem?</span><br><span style="color: hsl(120, 100%, 40%);">+   cardPresent     [3] BOOLEAN OPTIONAL,</span><br><span style="color: hsl(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%);">+-- 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+-- BANKD->SERVER: SIM Bank connects to central server</span><br><span style="color: hsl(120, 100%, 40%);">+ConnectBankReq ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+    -- identity of the bank that is connecting to the server</span><br><span style="color: hsl(120, 100%, 40%);">+      identity        ComponentIdentity,</span><br><span style="color: hsl(120, 100%, 40%);">+    -- bank number, pre-configured on bank side</span><br><span style="color: hsl(120, 100%, 40%);">+   bankId          BankId,</span><br><span style="color: hsl(120, 100%, 40%);">+       numberOfSlots   SlotNumber,</span><br><span style="color: hsl(120, 100%, 40%);">+   -- IP/Port to which this bankd has bound and is listening for clients</span><br><span style="color: hsl(120, 100%, 40%);">+ bound           IpPort OPTIONAL,</span><br><span style="color: hsl(120, 100%, 40%);">+      ...</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+ConnectBankRes ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+ -- identity of the server to which the bank is connecting</span><br><span style="color: hsl(120, 100%, 40%);">+     identity        ComponentIdentity,</span><br><span style="color: hsl(120, 100%, 40%);">+    result          ResultCode,</span><br><span style="color: hsl(120, 100%, 40%);">+   ...</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+-- CLIENT->SERVER or CLIENT->BANKD</span><br><span style="color: hsl(120, 100%, 40%);">+ConnectClientReq ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+   -- identity of the client that is connecting to the server/bankd</span><br><span style="color: hsl(120, 100%, 40%);">+      identity        ComponentIdentity,</span><br><span style="color: hsl(120, 100%, 40%);">+    clientSlot      ClientSlot OPTIONAL, -- mandatory for CL->BANKD; CL->SERVER: old identity, if any</span><br><span style="color: hsl(120, 100%, 40%);">+       ...</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+ConnectClientRes ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+       -- identity of the bankd/server to which the client is connecting</span><br><span style="color: hsl(120, 100%, 40%);">+     identity        ComponentIdentity,</span><br><span style="color: hsl(120, 100%, 40%);">+    result          ResultCode,</span><br><span style="color: hsl(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%);">+-- SERVER->BANKD: create a mapping between a given Bank:Slot <-> Client:Slot</span><br><span style="color: hsl(120, 100%, 40%);">+CreateMappingReq ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+      client          ClientSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+   bank            BankSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+     ...</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+CreateMappingRes ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+       result          ResultCode,</span><br><span style="color: hsl(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%);">+-- SERVER->BANKD: remove a mapping between a given Bank:Slot <-> Client:Slot</span><br><span style="color: hsl(120, 100%, 40%);">+RemoveMappingReq ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+      client          ClientSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+   bank            BankSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+     ...</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+RemoveMappingRes ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+       result          ResultCode,</span><br><span style="color: hsl(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%);">+-- SERVER->CLIENT: set Client ID</span><br><span style="color: hsl(120, 100%, 40%);">+ConfigClientIdReq ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+       -- server-allocated assignment of a client ID</span><br><span style="color: hsl(120, 100%, 40%);">+ clientSlot      ClientSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+   ...</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+ConfigClientIdRes ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+      result          ResultCode,</span><br><span style="color: hsl(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%);">+-- SERVER->CLIENT: set BankId/Slot and IP/Port</span><br><span style="color: hsl(120, 100%, 40%);">+ConfigClientBankReq ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+       -- server-allocated assignment of a client ID</span><br><span style="color: hsl(120, 100%, 40%);">+ bankSlot        BankSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+     -- bank to which the client shall connect</span><br><span style="color: hsl(120, 100%, 40%);">+     bankd           IpPort,</span><br><span style="color: hsl(120, 100%, 40%);">+       ...</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+ConfigClientBankRes ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+    result          ResultCode,</span><br><span style="color: hsl(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%);">+-- BANKD->CLIENT: configure the ATR which the card emulator (client) shall send to the modem</span><br><span style="color: hsl(120, 100%, 40%);">+SetAtrReq ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+ slot            ClientSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+   atr             ATR,</span><br><span style="color: hsl(120, 100%, 40%);">+  ...</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+SetAtrRes ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+      result          ResultCode,</span><br><span style="color: hsl(120, 100%, 40%);">+   ...</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+-- CLIENT->BANKD: TPDU in Modem -> Card direction</span><br><span style="color: hsl(120, 100%, 40%);">+TpduModemToCard ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+     -- we include fully-qualified bank and client slots for easier debugging</span><br><span style="color: hsl(120, 100%, 40%);">+      fromClientSlot  ClientSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+   toBankSlot      BankSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+     flags           TpduFlags,</span><br><span style="color: hsl(120, 100%, 40%);">+    data            OCTET 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%);">+-- BANKD->CLIENT: TPDU in Card -> Modem direction</span><br><span style="color: hsl(120, 100%, 40%);">+TpduCardToModem ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+     -- we include fully-qualified bank and client slots for easier debugging</span><br><span style="color: hsl(120, 100%, 40%);">+      fromBankSlot    BankSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+     toClientSlot    ClientSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+   flags           TpduFlags,</span><br><span style="color: hsl(120, 100%, 40%);">+    data            OCTET 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%);">+-- CLIENT->BANKD: indciation about the current status of a client (modem side)</span><br><span style="color: hsl(120, 100%, 40%);">+ClientSlotStatusInd ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+       fromClientSlot  ClientSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+   toBankSlot      BankSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+     slotPhysStatus  SlotPhysStatus,</span><br><span style="color: hsl(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%);">+-- BANKD->CLIENT: indciation about the current status of a bank (modem side)</span><br><span style="color: hsl(120, 100%, 40%);">+BankSlotStatusInd ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+   fromBankSlot    BankSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+     toClientSlot    ClientSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+   slotPhysStatus  SlotPhysStatus,</span><br><span style="color: hsl(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%);">+-- *->SERVER: indication about some kind of error</span><br><span style="color: hsl(120, 100%, 40%);">+ErrorInd ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+       -- whoever is detecting + sending us the error</span><br><span style="color: hsl(120, 100%, 40%);">+        sender          ComponentType,</span><br><span style="color: hsl(120, 100%, 40%);">+        severity        ErrorSeverity,</span><br><span style="color: hsl(120, 100%, 40%);">+        code            ErrorCode,</span><br><span style="color: hsl(120, 100%, 40%);">+    -- any bank-side slot that's affected</span><br><span style="color: hsl(120, 100%, 40%);">+     bankSlot        [0] BankSlot OPTIONAL,</span><br><span style="color: hsl(120, 100%, 40%);">+        -- any client-side slot that's affected</span><br><span style="color: hsl(120, 100%, 40%);">+   clientSlot      [1] ClientSlot OPTIONAL,</span><br><span style="color: hsl(120, 100%, 40%);">+      -- any additional textual information</span><br><span style="color: hsl(120, 100%, 40%);">+ errorString     [2] ErrorString OPTIONAL,</span><br><span style="color: hsl(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%);">+-- PDU</span><br><span style="color: hsl(120, 100%, 40%);">+----------------------------------------------------------------------</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+RsproPDUchoice ::= CHOICE {</span><br><span style="color: hsl(120, 100%, 40%);">+     -- configuration + management</span><br><span style="color: hsl(120, 100%, 40%);">+ connectBankReq          [0]     ConnectBankReq,</span><br><span style="color: hsl(120, 100%, 40%);">+       connectBankRes          [1]     ConnectBankRes,</span><br><span style="color: hsl(120, 100%, 40%);">+       connectClientReq        [2]     ConnectClientReq,</span><br><span style="color: hsl(120, 100%, 40%);">+     connectClientRes        [3]     ConnectClientRes,</span><br><span style="color: hsl(120, 100%, 40%);">+     createMappingReq        [4]     CreateMappingReq,</span><br><span style="color: hsl(120, 100%, 40%);">+     createMappingRes        [5]     CreateMappingRes,</span><br><span style="color: hsl(120, 100%, 40%);">+     removeMappingReq        [6]     RemoveMappingReq,</span><br><span style="color: hsl(120, 100%, 40%);">+     removeMappingRes        [7]     RemoveMappingRes,</span><br><span style="color: hsl(120, 100%, 40%);">+     configClientIdReq       [8]     ConfigClientIdReq,</span><br><span style="color: hsl(120, 100%, 40%);">+    configClientIdRes       [9]     ConfigClientIdRes,</span><br><span style="color: hsl(120, 100%, 40%);">+    configClientBankReq     [17]    ConfigClientBankReq,</span><br><span style="color: hsl(120, 100%, 40%);">+  configClientBankRes     [18]    ConfigClientBankRes,</span><br><span style="color: hsl(120, 100%, 40%);">+  errorInd                [16]    ErrorInd,</span><br><span style="color: hsl(120, 100%, 40%);">+     -- APDUs etc.</span><br><span style="color: hsl(120, 100%, 40%);">+ setAtrReq               [10]    SetAtrReq,</span><br><span style="color: hsl(120, 100%, 40%);">+    setAtrRes               [11]    SetAtrRes,</span><br><span style="color: hsl(120, 100%, 40%);">+    tpduModemToCard         [12]    TpduModemToCard,</span><br><span style="color: hsl(120, 100%, 40%);">+      tpduCardToModem         [13]    TpduCardToModem,</span><br><span style="color: hsl(120, 100%, 40%);">+      clientSlotStatusInd     [14]    ClientSlotStatusInd,</span><br><span style="color: hsl(120, 100%, 40%);">+  bankSlotStatusInd       [15]    BankSlotStatusInd,</span><br><span style="color: hsl(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%);">+RsproPDU ::= SEQUENCE {</span><br><span style="color: hsl(120, 100%, 40%);">+     version         [0] INTEGER(0..32),</span><br><span style="color: hsl(120, 100%, 40%);">+   tag             [1] OperationTag,</span><br><span style="color: hsl(120, 100%, 40%);">+     msg             [2] RsproPDUchoice</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+END</span><br><span>diff --git a/remsim/RSPRO_EncDec.cc b/remsim/RSPRO_EncDec.cc</span><br><span>new file mode 100644</span><br><span>index 0000000..a1f898e</span><br><span>--- /dev/null</span><br><span>+++ b/remsim/RSPRO_EncDec.cc</span><br><span>@@ -0,0 +1,26 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#include "RSPRO.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+namespace RSPRO__Types {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+using namespace RSPRO;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+TTCN_Module RSPRO__EncDec("RSPRO_EncDec", __DATE__, __TIME__);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OCTETSTRING enc__RsproPDU(const RsproPDU& pdu) {</span><br><span style="color: hsl(120, 100%, 40%);">+        TTCN_Buffer buf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    buf.clear();</span><br><span style="color: hsl(120, 100%, 40%);">+  pdu.encode(RsproPDU_descr_, buf, TTCN_EncDec::CT_BER, BER_ENCODE_DER);</span><br><span style="color: hsl(120, 100%, 40%);">+        return OCTETSTRING(buf.get_len(), buf.get_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%);">+RsproPDU dec__RsproPDU(const OCTETSTRING &stream) {</span><br><span style="color: hsl(120, 100%, 40%);">+      TTCN_Buffer buf;</span><br><span style="color: hsl(120, 100%, 40%);">+      RsproPDU pdu;</span><br><span style="color: hsl(120, 100%, 40%);">+ buf.put_os(stream);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ pdu.decode(RsproPDU_descr_, buf, TTCN_EncDec::CT_BER, BER_ACCEPT_ALL);</span><br><span style="color: hsl(120, 100%, 40%);">+        return pdu;</span><br><span style="color: hsl(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/remsim/RSPRO_Server.ttcn b/remsim/RSPRO_Server.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..977e7c6</span><br><span>--- /dev/null</span><br><span>+++ b/remsim/RSPRO_Server.ttcn</span><br><span>@@ -0,0 +1,174 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module RSPRO_Server {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Utility functions implementing an RSRPO server.</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%);">+</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 RSPRO all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSPRO_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_Types all;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record RSPRO_Server {</span><br><span style="color: hsl(120, 100%, 40%);">+ IPA_Emulation_CT        vc_IPA,</span><br><span style="color: hsl(120, 100%, 40%);">+       IPA_CCM_Parameters      ccm_pars,</span><br><span style="color: hsl(120, 100%, 40%);">+     charstring              id,</span><br><span style="color: hsl(120, 100%, 40%);">+   ComponentIdentity       rspro_id//,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ //ClientSlot            rspro_client_slot optional,</span><br><span style="color: hsl(120, 100%, 40%);">+   //BankId                        rspro_bank_id optional,</span><br><span style="color: hsl(120, 100%, 40%);">+       //SlotNumber            rspro_bank_nslots optional</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const integer NUM_SERVER := 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type component rspro_server_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var RSPRO_Server        g_rspro_srv[NUM_SERVER];</span><br><span style="color: hsl(120, 100%, 40%);">+      port IPA_RSPRO_PT       RSPRO_SRV[NUM_SERVER];</span><br><span style="color: hsl(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%);">+altstep as_ignore_id_ack(integer i) runs on rspro_server_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSPRO_SRV[i].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_ID_ACK}) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rspro_srv_exp_connect(integer i)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_server_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  timer T := 20.0;</span><br><span style="color: hsl(120, 100%, 40%);">+      T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSPRO_SRV[i].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_UP}) { }</span><br><span style="color: hsl(120, 100%, 40%);">+      [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for ASP_IPA_EVENT_UP");</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%);">+function f_rspro_srv_init(integer i, charstring bind_host, integer bind_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                   ComponentIdentity rspro_id, boolean exp_connect := true)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_server_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        g_rspro_srv[i].id := "RSPRO_SRV" & int2str(i);</span><br><span style="color: hsl(120, 100%, 40%);">+  g_rspro_srv[i].vc_IPA := IPA_Emulation_CT.create(g_rspro_srv[i].id);</span><br><span style="color: hsl(120, 100%, 40%);">+  g_rspro_srv[i].ccm_pars := c_IPA_default_ccm_pars;</span><br><span style="color: hsl(120, 100%, 40%);">+    g_rspro_srv[i].ccm_pars.name := "Osmocom TTCN-3 RSPRO server simulator";</span><br><span style="color: hsl(120, 100%, 40%);">+    g_rspro_srv[i].rspro_id := rspro_id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        map(g_rspro_srv[i].vc_IPA:IPA_PORT, system:IPA_CODEC_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+     connect(g_rspro_srv[i].vc_IPA:IPA_RSPRO_PORT, self:RSPRO_SRV[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   g_rspro_srv[i].vc_IPA.start(IPA_Emulation.main_server(bind_host, bind_port));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       activate(as_ignore_id_ack(i));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (exp_connect) {</span><br><span style="color: hsl(120, 100%, 40%);">+            f_rspro_srv_exp_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%);">+function f_rspro_srv_fini(integer i)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_server_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      g_rspro_srv[i].vc_IPA.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+   disconnect(g_rspro_srv[i].vc_IPA:IPA_RSPRO_PORT, self:RSPRO_SRV[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+  unmap(g_rspro_srv[i].vc_IPA:IPA_PORT, system:IPA_CODEC_PT);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rspro_srv_restart(integer i, charstring bind_host, integer bind_port)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_server_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      g_rspro_srv[i].vc_IPA.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+   g_rspro_srv[i].vc_IPA.start(IPA_Emulation.main_server(bind_host, bind_port));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rspro_srv_exp(template RsproPDU exp, integer i := 0, float tout := 10.0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_server_CT return RsproPDU</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ var RsproPDU pdu;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   timer T := tout;</span><br><span style="color: hsl(120, 100%, 40%);">+      T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSPRO_SRV[i].receive(exp) -> value pdu {</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%);">+     [] RSPRO_SRV[i].receive(RsproPDU:?) -> value pdu {</span><br><span style="color: hsl(120, 100%, 40%);">+         setverdict(fail, "Received unexpected RPSRO", pdu, " instead of ", exp);</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%);">+     [] as_ignore_id_ack(i) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+    [] RSPRO_SRV[i].receive {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Received unexpected != RPSRO");</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%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for ", exp);</span><br><span style="color: hsl(120, 100%, 40%);">+              mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return pdu;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rspro_srv_create_slotmap(ClientSlot cslot, BankSlot bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template ResultCode exp_res := ok, integer i := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_server_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    RSPRO_SRV[i].send(ts_RSPRO_CreateMappingReq(cslot, bslot));</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rspro_srv_exp(tr_RSPRO_CreateMappingRes(exp_res), 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%);">+function f_rspro_srv_remove_slotmap(ClientSlot cslot, BankSlot bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                               template ResultCode exp_res := ok, integer i := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_server_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    RSPRO_SRV[i].send(ts_RSPRO_RemoveMappingReq(cslot, bslot));</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rspro_srv_exp(tr_RSPRO_RemoveMappingRes(exp_res), 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%);">+function f_rspro_config_client_bank(template (value) BankSlot bank_slot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    template (value) IpPort bank_iport,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template ResultCode exp_res := ok, integer i := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_server_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     RSPRO_SRV[i].send(ts_RSPRO_ConfigClientBankReq(bank_slot, bank_iport));</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rspro_srv_exp(tr_RSPRO_ConfigClientBankRes(exp_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%);">+altstep as_connectBankReq(template ComponentIdentity comp_id := tr_CompId(remsimBankd, ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                       "remsim-bankd", ?),</span><br><span style="color: hsl(120, 100%, 40%);">+                         template BankId bid := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                     template SlotNumber nslots := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                      ResultCode res := ok, integer i := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_server_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    [] RSPRO_SRV[i].receive(tr_RSPRO_ConnectBankReq(comp_id, bid, nslots)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              RSPRO_SRV[i].send(ts_RSPRO_ConnectBankRes(g_rspro_srv[i].rspro_id, 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%);">+altstep as_connectClientReq(template ComponentIdentity comp_id := tr_CompId(remsimClient, ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                    "remsim-client", ?),</span><br><span style="color: hsl(120, 100%, 40%);">+                        template ClientSlot cslot := *,</span><br><span style="color: hsl(120, 100%, 40%);">+                       ResultCode res := ok, integer i := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on rspro_server_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    [] RSPRO_SRV[i].receive(tr_RSPRO_ConnectClientReq(comp_id, cslot)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          RSPRO_SRV[i].send(ts_RSPRO_ConnectClientRes(g_rspro_srv[i].rspro_id, 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/remsim/RSPRO_Types.ttcn b/remsim/RSPRO_Types.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..1eb84bd</span><br><span>--- /dev/null</span><br><span>+++ b/remsim/RSPRO_Types.ttcn</span><br><span>@@ -0,0 +1,375 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module RSPRO_Types {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Templates and utility functions for the RSPRO protocol.</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 RSPRO all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Native_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template ResultCode tr_Status_ok_or_nocard := (ok, cardNotPresent);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+external function dec_RsproPDU(in octetstring stream) return RsproPDU;</span><br><span style="color: hsl(120, 100%, 40%);">+external function enc_RsproPDU(in RsproPDU pdu) return octetstring;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type integer RsproVersion (0..32);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) BankSlot ts_BankSlot(template (value) BankId bid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                template (value) SlotNumber slot) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  bankId := bid,</span><br><span style="color: hsl(120, 100%, 40%);">+        slotNr := slot</span><br><span 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) ClientSlot ts_ClientSlot(template (value) ClientId cid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template (value) SlotNumber slot) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      clientId := cid,</span><br><span style="color: hsl(120, 100%, 40%);">+      slotNr := slot</span><br><span 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) ComponentIdentity ts_CompId(template (value) ComponentType ctype,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            template (value) ComponentName name,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          template (value) ComponentName sw := "TTCN3",</span><br><span style="color: hsl(120, 100%, 40%);">+                                       template (value) ComponentName sw_version := "0.1") := {</span><br><span style="color: hsl(120, 100%, 40%);">+       type_ := ctype,</span><br><span style="color: hsl(120, 100%, 40%);">+       name := name,</span><br><span style="color: hsl(120, 100%, 40%);">+ software := sw,</span><br><span style="color: hsl(120, 100%, 40%);">+       swVersion := sw_version,</span><br><span style="color: hsl(120, 100%, 40%);">+      hwManufacturer := "sysmocom",</span><br><span style="color: hsl(120, 100%, 40%);">+       hwModel := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+      hwSerialNr := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+   hwVersion := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+    fwVersion := omit</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template ComponentIdentity tr_CompId(template ComponentType ctype,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template ComponentName name,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  template ComponentName sw := "TTCN3",</span><br><span style="color: hsl(120, 100%, 40%);">+                               template ComponentName sw_version := "0.1") := {</span><br><span style="color: hsl(120, 100%, 40%);">+       type_ := ctype,</span><br><span style="color: hsl(120, 100%, 40%);">+       name := name,</span><br><span style="color: hsl(120, 100%, 40%);">+ software := sw,</span><br><span style="color: hsl(120, 100%, 40%);">+       swVersion := sw_version,</span><br><span style="color: hsl(120, 100%, 40%);">+      hwManufacturer := *,</span><br><span style="color: hsl(120, 100%, 40%);">+  hwModel := *,</span><br><span style="color: hsl(120, 100%, 40%);">+ hwSerialNr := *,</span><br><span style="color: hsl(120, 100%, 40%);">+      hwVersion := *,</span><br><span style="color: hsl(120, 100%, 40%);">+       fwVersion := *</span><br><span 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) IpPort ts_IpPort(template (value) IpAddress ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                           template (value) PortNumber port_nr) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   ip := ip,</span><br><span style="color: hsl(120, 100%, 40%);">+     port_ := port_nr</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template IpPort tr_IpPort(template IpAddress ip, template PortNumber port_nr) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       ip := ip,</span><br><span style="color: hsl(120, 100%, 40%);">+     port_ := port_nr</span><br><span 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) IpAddress ts_IPv4(charstring ip_str) := {</span><br><span style="color: hsl(120, 100%, 40%);">+     ipv4 := f_inet_addr(ip_str)</span><br><span style="color: hsl(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) RsproPDU ts_RSPRO(template (value) RsproPDUchoice msg,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  template (value) RsproVersion version := 2,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template (value) OperationTag tag := 0) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       version := version,</span><br><span style="color: hsl(120, 100%, 40%);">+   tag := tag,</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%);">+template RsproPDU tr_RSPRO(template RsproPDUchoice msg,</span><br><span style="color: hsl(120, 100%, 40%);">+                         template RsproVersion version := 2,</span><br><span style="color: hsl(120, 100%, 40%);">+                           template OperationTag tag := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       version := version,</span><br><span style="color: hsl(120, 100%, 40%);">+   tag := tag,</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) RsproPDU ts_RSPRO_ConnectClientReq(template (value) ComponentIdentity id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             template (omit) ClientSlot clslot) :=</span><br><span style="color: hsl(120, 100%, 40%);">+     ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     connectClientReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         identity := id,</span><br><span style="color: hsl(120, 100%, 40%);">+                               clientSlot := clslot</span><br><span 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 RsproPDU tr_RSPRO_ConnectClientReq(template ComponentIdentity id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           template ClientSlot clslot) :=</span><br><span style="color: hsl(120, 100%, 40%);">+    tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     connectClientReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         identity := id,</span><br><span style="color: hsl(120, 100%, 40%);">+                               clientSlot := clslot</span><br><span style="color: hsl(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) RsproPDU ts_RSPRO_ConnectClientRes(template (value) ComponentIdentity id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               template (value) ResultCode res) := </span><br><span style="color: hsl(120, 100%, 40%);">+      ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     connectClientRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         identity := id,</span><br><span style="color: hsl(120, 100%, 40%);">+                               result := 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 RsproPDU tr_RSPRO_ConnectClientRes(template ComponentIdentity id := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      template ResultCode res := ?) := </span><br><span style="color: hsl(120, 100%, 40%);">+ tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     connectClientRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         identity := id,</span><br><span style="color: hsl(120, 100%, 40%);">+                               result := 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) RsproPDU ts_RSPRO_ConnectBankReq(template (value) ComponentIdentity id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 template (value) BankId bid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  template (value) SlotNumber nslots,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           template (omit) IpPort bound) :=</span><br><span style="color: hsl(120, 100%, 40%);">+    ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     connectBankReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                           identity := id,</span><br><span style="color: hsl(120, 100%, 40%);">+                               bankId := bid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                numberOfSlots := nslots,</span><br><span style="color: hsl(120, 100%, 40%);">+                              bound := bound</span><br><span 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 RsproPDU tr_RSPRO_ConnectBankReq(template ComponentIdentity id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template BankId bid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          template SlotNumber nslots,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   template IpPort bound := *) :=</span><br><span style="color: hsl(120, 100%, 40%);">+      tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     connectBankReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                           identity := id,</span><br><span style="color: hsl(120, 100%, 40%);">+                               bankId := bid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                numberOfSlots := nslots,</span><br><span style="color: hsl(120, 100%, 40%);">+                              bound := *</span><br><span style="color: hsl(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) RsproPDU ts_RSPRO_ConnectBankRes(template (value) ComponentIdentity id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               template (value) ResultCode res) := </span><br><span style="color: hsl(120, 100%, 40%);">+        ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     connectBankRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                           identity := id,</span><br><span style="color: hsl(120, 100%, 40%);">+                               result := 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 RsproPDU tr_RSPRO_ConnectBankRes(template ComponentIdentity id := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      template ResultCode res := ?) := </span><br><span style="color: hsl(120, 100%, 40%);">+   tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     connectBankRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                           identity := id,</span><br><span style="color: hsl(120, 100%, 40%);">+                               result := 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%);">+template (value) RsproPDU ts_RSPRO_SetAtrReq(template (value) ClientSlot clslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          template (value) ATR atr) :=</span><br><span style="color: hsl(120, 100%, 40%);">+     ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     setAtrReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                slot := clslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                               atr := atr</span><br><span 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 RsproPDU tr_RSPRO_SetAtrReq(template ClientSlot clslot := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 template ATR atr := ?) :=</span><br><span style="color: hsl(120, 100%, 40%);">+        tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     setAtrReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                slot := clslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                               atr := atr</span><br><span style="color: hsl(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) RsproPDU ts_RSPRO_SetAtrRes(template (value) ResultCode res) :=</span><br><span style="color: hsl(120, 100%, 40%);">+       ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     setAtrRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                result := 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 RsproPDU tr_RSPRO_SetAtrRes(template ResultCode res := ?) :=</span><br><span style="color: hsl(120, 100%, 40%);">+    tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     setAtrRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                result := 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) RsproPDU ts_RSPRO_TpduModemToCard(template (value) ClientSlot from_clslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               template (value) BankSlot to_bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   template (value) TpduFlags flags,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             template (value) octetstring data) :=</span><br><span style="color: hsl(120, 100%, 40%);">+      ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     tpduModemToCard := {</span><br><span style="color: hsl(120, 100%, 40%);">+                          fromClientSlot := from_clslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                toBankSlot := to_bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                               flags := flags,</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%);">+template RsproPDU tr_RSPRO_TpduModemToCard(template ClientSlot from_clslot := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    template BankSlot to_bslot := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      template TpduFlags flags := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        template octetstring data := ?) :=</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     tpduModemToCard := {</span><br><span style="color: hsl(120, 100%, 40%);">+                          fromClientSlot := from_clslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                toBankSlot := to_bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                               flags := flags,</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%);">+template (value) RsproPDU ts_RSPRO_TpduCardToModem(template (value) BankSlot from_bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  template (value) ClientSlot to_clslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                template (value) TpduFlags flags,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             template (value) octetstring data) :=</span><br><span style="color: hsl(120, 100%, 40%);">+      ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     tpduCardToModem := {</span><br><span style="color: hsl(120, 100%, 40%);">+                          fromBankSlot := from_bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                           toClientSlot := to_clslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                            flags := flags,</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%);">+template RsproPDU tr_RSPRO_TpduCardToModem(template BankSlot from_bslot := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       template ClientSlot to_clslot := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           template TpduFlags flags := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        template octetstring data := ?) :=</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     tpduCardToModem := {</span><br><span style="color: hsl(120, 100%, 40%);">+                          fromBankSlot := from_bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                           toClientSlot := to_clslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                            flags := flags,</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%);">+template (value) RsproPDU ts_RSPRO_CreateMappingReq(template (value) ClientSlot cslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             template (value) BankSlot bslot) :=</span><br><span style="color: hsl(120, 100%, 40%);">+       ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     createMappingReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         client := cslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                              bank := bslot</span><br><span 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 RsproPDU tr_RSPRO_CreateMappingReq(template ClientSlot cslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       template BankSlot bslot) :=</span><br><span style="color: hsl(120, 100%, 40%);">+       tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     createMappingReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         client := cslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                              bank := bslot</span><br><span style="color: hsl(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) RsproPDU ts_RSPRO_CreateMappingRes(template (value) ResultCode res) :=</span><br><span style="color: hsl(120, 100%, 40%);">+        ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     createMappingRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         result := 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 RsproPDU tr_RSPRO_CreateMappingRes(template ResultCode res) :=</span><br><span style="color: hsl(120, 100%, 40%);">+  tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     createMappingRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         result := 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) RsproPDU ts_RSPRO_RemoveMappingReq(template (value) ClientSlot cslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             template (value) BankSlot bslot) :=</span><br><span style="color: hsl(120, 100%, 40%);">+       ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     removeMappingReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         client := cslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                              bank := bslot</span><br><span 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 RsproPDU tr_RSPRO_RemoveMappingReq(template ClientSlot cslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       template BankSlot bslot) :=</span><br><span style="color: hsl(120, 100%, 40%);">+       tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     removeMappingReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         client := cslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                              bank := bslot</span><br><span style="color: hsl(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) RsproPDU ts_RSPRO_RemoveMappingRes(template (value) ResultCode res) :=</span><br><span style="color: hsl(120, 100%, 40%);">+        ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     removeMappingRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         result := 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 RsproPDU tr_RSPRO_RemoveMappingRes(template ResultCode res) :=</span><br><span style="color: hsl(120, 100%, 40%);">+  tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     removeMappingRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                         result := 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%);">+template (value) RsproPDU ts_RSPRO_ConfigClientIdReq(template (value) ClientSlot cslot) :=</span><br><span style="color: hsl(120, 100%, 40%);">+   ts_RSPRO(RsproPDUchoice: {</span><br><span style="color: hsl(120, 100%, 40%);">+                    configClientIdReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                clientSlot := cslot</span><br><span 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 RsproPDU tr_RSPRO_ConfigClientIdReq(template ClientSlot cslot) :=</span><br><span style="color: hsl(120, 100%, 40%);">+       tr_RSPRO(RsproPDUchoice: {</span><br><span style="color: hsl(120, 100%, 40%);">+                    configClientIdReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                clientSlot := cslot</span><br><span style="color: hsl(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) RsproPDU ts_RSPRO_ConfigClientIdRes(template (value) ResultCode res) :=</span><br><span style="color: hsl(120, 100%, 40%);">+       ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     configClientIdRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                result := 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 RsproPDU tr_RSPRO_ConfigClientIdRes(template ResultCode res) :=</span><br><span style="color: hsl(120, 100%, 40%);">+ tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     configClientIdRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                result := 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) RsproPDU ts_RSPRO_ConfigClientBankReq(template (value) BankSlot bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                        template (value) IpPort ip_port) :=</span><br><span style="color: hsl(120, 100%, 40%);">+   ts_RSPRO(RsproPDUchoice: {</span><br><span style="color: hsl(120, 100%, 40%);">+                    configClientBankReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                              bankSlot := bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                            bankd := ip_port</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             });</span><br><span style="color: hsl(120, 100%, 40%);">+template RsproPDU tr_RSPRO_ConfigClientBankReq(template BankSlot bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          template IpPort ip_port) :=</span><br><span style="color: hsl(120, 100%, 40%);">+   tr_RSPRO(RsproPDUchoice: {</span><br><span style="color: hsl(120, 100%, 40%);">+                    configClientBankReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+                              bankSlot := bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                            bankd := ip_port</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+             });</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) RsproPDU ts_RSPRO_ConfigClientBankRes(template (value) ResultCode res) :=</span><br><span style="color: hsl(120, 100%, 40%);">+     ts_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     configClientBankRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                              result := 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 RsproPDU tr_RSPRO_ConfigClientBankRes(template ResultCode res) :=</span><br><span style="color: hsl(120, 100%, 40%);">+       tr_RSPRO(RsproPDUchoice:{</span><br><span style="color: hsl(120, 100%, 40%);">+                     configClientBankRes := {</span><br><span style="color: hsl(120, 100%, 40%);">+                              result := res</span><br><span style="color: hsl(120, 100%, 40%);">+                 }</span><br><span style="color: hsl(120, 100%, 40%);">+             });</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/remsim/RSRES.ttcn b/remsim/RSRES.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..a988b66</span><br><span>--- /dev/null</span><br><span>+++ b/remsim/RSRES.ttcn</span><br><span>@@ -0,0 +1,110 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module RSRES {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Implementation of the REmote Sim RESt (RSRES) JSON data types in TTCN-3.</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSPRO all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* resembles "enum remsim_server_client_fsm_state" */</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated ConnectionState {</span><br><span style="color: hsl(120, 100%, 40%);">+       INIT,</span><br><span style="color: hsl(120, 100%, 40%);">+ ESTABLISHED,</span><br><span style="color: hsl(120, 100%, 40%);">+  CONNECTED_CLIENT,</span><br><span style="color: hsl(120, 100%, 40%);">+     CONNECTED_BANKD</span><br><span 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 JsBank {</span><br><span style="color: hsl(120, 100%, 40%);">+   charstring              peer,</span><br><span style="color: hsl(120, 100%, 40%);">+ ConnectionState         state,</span><br><span style="color: hsl(120, 100%, 40%);">+        ComponentIdentity       component_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ BankId                  bankId,</span><br><span style="color: hsl(120, 100%, 40%);">+       SlotNumber              numberOfSlots</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+type record of JsBank JsBanks;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template JsBank tr_JsBank(template ConnectionState state,</span><br><span style="color: hsl(120, 100%, 40%);">+                          template ComponentIdentity comp_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                   template BankId bank_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                      template SlotNumber num_of_slots) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      peer := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+    state := state,</span><br><span style="color: hsl(120, 100%, 40%);">+       component_id := comp_id,</span><br><span style="color: hsl(120, 100%, 40%);">+      bankId := bank_id,</span><br><span style="color: hsl(120, 100%, 40%);">+    numberOfSlots := num_of_slots</span><br><span 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 JsClient {</span><br><span style="color: hsl(120, 100%, 40%);">+    charstring              peer,</span><br><span style="color: hsl(120, 100%, 40%);">+ ConnectionState         state,</span><br><span style="color: hsl(120, 100%, 40%);">+        ComponentIdentity       component_id</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+type record of JsClient JsClients;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template JsClient tr_JsClient(template ConnectionState state,</span><br><span style="color: hsl(120, 100%, 40%);">+                   template ComponentIdentity comp_id) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    peer := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+    state := state,</span><br><span style="color: hsl(120, 100%, 40%);">+       component_id := comp_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%);">+/* resembles "enum slot_mapping_state" */</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated SlotmapState {</span><br><span style="color: hsl(120, 100%, 40%);">+     NEW,</span><br><span style="color: hsl(120, 100%, 40%);">+  UNACKNOWLEDGED,</span><br><span style="color: hsl(120, 100%, 40%);">+       ACTIVE,</span><br><span style="color: hsl(120, 100%, 40%);">+       DELETE_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+   DELETING</span><br><span 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 JsSlotmap {</span><br><span style="color: hsl(120, 100%, 40%);">+       BankSlot                bank,</span><br><span style="color: hsl(120, 100%, 40%);">+ ClientSlot              client,</span><br><span style="color: hsl(120, 100%, 40%);">+       SlotmapState            state optional</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+type record of JsSlotmap JsSlotmaps;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) JsSlotmap ts_JsSlotmap(template (value) BankSlot bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  template (value) ClientSlot cslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    template (omit) SlotmapState state := omit) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      bank := bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+        client := cslot,</span><br><span style="color: hsl(120, 100%, 40%);">+      state := state</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template JsSlotmap tr_JsSlotmap(template BankSlot bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                           template ClientSlot cslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                            template SlotmapState state := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        bank := bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+        client := cslot,</span><br><span style="color: hsl(120, 100%, 40%);">+      state := state</span><br><span style="color: hsl(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%);">+/* root JSON type expressing what remsim-server can return */</span><br><span style="color: hsl(120, 100%, 40%);">+type record JsRoot {</span><br><span style="color: hsl(120, 100%, 40%);">+  JsClients               clients optional,</span><br><span style="color: hsl(120, 100%, 40%);">+     JsBanks                 banks optional,</span><br><span style="color: hsl(120, 100%, 40%);">+       JsSlotmaps              slotmaps optional</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+external function f_enc_JsRoot(in JsRoot inp) return octetstring</span><br><span style="color: hsl(120, 100%, 40%);">+     with { extension "prototype(convert) encode(JSON)" }</span><br><span style="color: hsl(120, 100%, 40%);">+external function f_dec_JsRoot(in octetstring inp) return JsRoot</span><br><span style="color: hsl(120, 100%, 40%);">+      with { extension "prototype(convert) decode(JSON)" }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+external function f_enc_JsSlotmap(in JsSlotmap inp) return octetstring</span><br><span style="color: hsl(120, 100%, 40%);">+      with { extension "prototype(convert) encode(JSON)" }</span><br><span style="color: hsl(120, 100%, 40%);">+external function f_dec_JsSlotmap(in octetstring inp) return JsSlotmap</span><br><span style="color: hsl(120, 100%, 40%);">+        with { extension "prototype(convert) decode(JSON)" }</span><br><span style="color: hsl(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%);">+} with { encode "JSON" }</span><br><span>diff --git a/remsim/RemsimBankd_Tests.ttcn b/remsim/RemsimBankd_Tests.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..bbdea6d</span><br><span>--- /dev/null</span><br><span>+++ b/remsim/RemsimBankd_Tests.ttcn</span><br><span>@@ -0,0 +1,298 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module RemsimBankd_Tests {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Integration Tests for osmo-remsim-bankd</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%);">+ * This test suite tests osmo-remsim-bankd by attaching to the external interfaces</span><br><span style="color: hsl(120, 100%, 40%);">+ * such as RSPRO for simulated clients + server.</span><br><span 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 Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPA_Emulation all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Misc_Helpers all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSPRO all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSRES all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSPRO_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSPRO_Server all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from REMSIM_Tests 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_bank_id := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+      integer mp_num_slots := 8;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* We implement a RSPRO server to simulate the remsim-server and a</span><br><span style="color: hsl(120, 100%, 40%);">+   RSPRO client to simulate a remsim-client connecting to bankd */</span><br><span style="color: hsl(120, 100%, 40%);">+type component bankd_test_CT extends rspro_server_CT, rspro_client_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%);">+private function f_init(boolean start_client := false) runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var ComponentIdentity srv_comp_id := valueof(ts_CompId(remsimServer, "ttcn-server"));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_srv_init(0, mp_server_ip, mp_server_port, srv_comp_id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (start_client) {</span><br><span style="color: hsl(120, 100%, 40%);">+           f_init_client(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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_init_client(integer i := 0) runs on rspro_client_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var ComponentIdentity clnt_comp_id := valueof(ts_CompId(remsimClient, "ttcn-client"));</span><br><span style="color: hsl(120, 100%, 40%);">+      f_rspro_init(rspro[0], mp_bankd_ip, mp_bankd_port, clnt_comp_id, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  rspro[0].rspro_client_slot := { clientId := 23+i, slotNr := 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Test if the bankd disconnects the TCP/IPA session if we don't respond to connectBankReq */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_connectBankReq_timeout() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    timer T := 20.0;</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rspro_srv_exp(tr_RSPRO_ConnectBankReq(?, ?, ?));</span><br><span style="color: hsl(120, 100%, 40%);">+    T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSPRO_SRV[0].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_DOWN}) {</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%);">+     [] RSPRO_SRV[0].receive { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+   [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for disconnect");</span><br><span style="color: hsl(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 an inbound connection from bankd to simulated server */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_connectBankReq() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);</span><br><span style="color: hsl(120, 100%, 40%);">+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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%);">+/* attempt to create a mapping */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_createMapping() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);</span><br><span style="color: hsl(120, 100%, 40%);">+ var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+     var ClientSlot cs := { clientId := 23, slotNr := 42 };</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rspro_srv_create_slotmap(cs, bs);</span><br><span style="color: hsl(120, 100%, 40%);">+   Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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%);">+/* attempt to create a mapping for a slot that already has a mapping */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_createMapping_busySlot() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);</span><br><span style="color: hsl(120, 100%, 40%);">+ var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+     var ClientSlot cs := { clientId := 23, slotNr := 42 };</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rspro_srv_create_slotmap(cs, bs);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rspro_srv_create_slotmap(cs, bs, exp_res := illegalSlotId);</span><br><span style="color: hsl(120, 100%, 40%);">+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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%);">+/* attempt to create a mapping for an out-of-range slot number */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_createMapping_invalidSlot() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);</span><br><span style="color: hsl(120, 100%, 40%);">+ var BankSlot bs := { bankId := mp_bank_id, slotNr := 200 };</span><br><span style="color: hsl(120, 100%, 40%);">+   var ClientSlot cs := { clientId := 23, slotNr := 42 };</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rspro_srv_create_slotmap(cs, bs, exp_res := illegalSlotId);</span><br><span style="color: hsl(120, 100%, 40%);">+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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%);">+/* attempt to create a mapping for an invalid bankID */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_createMapping_invalidBank() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);</span><br><span style="color: hsl(120, 100%, 40%);">+ var BankSlot bs := { bankId := 200, slotNr := 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+    var ClientSlot cs := { clientId := 23, slotNr := 42 };</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rspro_srv_create_slotmap(cs, bs, exp_res := illegalBankId);</span><br><span style="color: hsl(120, 100%, 40%);">+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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%);">+/* attempt to remove a non-existant mapping */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_removeMapping_unknownMap() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);</span><br><span style="color: hsl(120, 100%, 40%);">+ var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+     var ClientSlot cs := { clientId := 23, slotNr := 42 };</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rspro_srv_remove_slotmap(cs, bs, exp_res := unknownSlotmap);</span><br><span style="color: hsl(120, 100%, 40%);">+        Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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%);">+/* add and then remove a mapping, expect both to be successful */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_removeMapping() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);</span><br><span style="color: hsl(120, 100%, 40%);">+ var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+     var ClientSlot cs := { clientId := 23, slotNr := 42 };</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rspro_srv_create_slotmap(cs, bs);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rspro_srv_remove_slotmap(cs, bs);</span><br><span style="color: hsl(120, 100%, 40%);">+   Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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%);">+/* connect from client to bankd without specifying a clientId */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_clientConnect_missingSlot() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+     RSPRO[0].send(ts_RSPRO_ConnectClientReq(rspro[0].rspro_id, omit));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rspro_exp(tr_RSPRO_ConnectClientRes(?, ResultCode:illegalClientId), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_exp_disconnect(0);</span><br><span style="color: hsl(120, 100%, 40%);">+    Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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%);">+/* connect from client to bankd using a clientId for which bankd has no map */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_clientConnect_unknown() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_connect_client(0, tr_Status_ok_or_nocard);</span><br><span style="color: hsl(120, 100%, 40%);">+    Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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%);">+/* connect from client to bankd using a clientSlot for which bankd has no map */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* first connect client, then later add matching mapping from server */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_clientConnect_createMapping() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_connect_client(0, tr_Status_ok_or_nocard);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(10.0);</span><br><span style="color: hsl(120, 100%, 40%);">+        Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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%);">+/* first add mapping, then connect matching client */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_createMapping_clientConnect() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  /* FIXME: this would only be done in f_init_client(), but we need it before */</span><br><span style="color: hsl(120, 100%, 40%);">+        rspro[0].rspro_client_slot := { clientId := 23+0, slotNr := 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_connect_client(0, tr_Status_ok_or_nocard);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: how to determine that bank correctly mapped us */</span><br><span style="color: hsl(120, 100%, 40%);">+   Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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%);">+/* add mapping, connect matching client, disconnect + reconnect */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_createMapping_clientReconnect() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: this would only be done in f_init_client(), but we need it before */</span><br><span style="color: hsl(120, 100%, 40%);">+        rspro[0].rspro_client_slot := { clientId := 23+0, slotNr := 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_connect_client(0, tr_Status_ok_or_nocard);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* TODO: works only with empty slot, as setAtrReq isn't handled */</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME: how to determine that bank correctly mapped us */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(5.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rspro_fini(rspro[0], 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_init_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_connect_client(0, tr_Status_ok_or_nocard);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: how to determine that bank correctly mapped us */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(5.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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%);">+/* remove mapping while client is connected */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_removeMapping_connected() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   f_init_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_connect_client(0, tr_Status_ok_or_nocard);</span><br><span style="color: hsl(120, 100%, 40%);">+    /* TODO: works only with empty slot, as setAtrReq isn't handled */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* FIXME: how to determine that bank correctly mapped us */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(5.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rspro_srv_remove_slotmap(rspro[0].rspro_client_slot, bs);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rspro_exp_disconnect(0);</span><br><span style="color: hsl(120, 100%, 40%);">+    Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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%);">+/* first add mapping, then connect matching client and exchange some TPDUs */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_createMapping_exchangeTPDU() runs on bankd_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* FIXME: this would only be done in f_init_client(), but we need it before */</span><br><span style="color: hsl(120, 100%, 40%);">+        rspro[0].rspro_client_slot := { clientId := 23+0, slotNr := 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_connect_client(0, ok);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME: how to determine that bank correctly mapped us */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rspro_exp(tr_RSPRO_SetAtrReq(rspro[0].rspro_client_slot, ?));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     var TpduFlags f := {tpduHeaderPresent:=true, finalPart:=true, procByteContinueTx:=false,</span><br><span style="color: hsl(120, 100%, 40%);">+                          procByteContinueRx:=false};</span><br><span style="color: hsl(120, 100%, 40%);">+       for (var integer i := 0; i < 10; i:=i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         f_rspro_xceive_mdm2card(0, bs, 'A0A40000023F00'O, f);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 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_connectBankReq_timeout() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_connectBankReq() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_createMapping() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_createMapping_busySlot() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_createMapping_invalidSlot() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_createMapping_invalidBank() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_removeMapping_unknownMap() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_removeMapping() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_clientConnect_missingSlot() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_clientConnect_unknown() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_clientConnect_createMapping() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_createMapping_clientConnect() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_createMapping_clientReconnect() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_removeMapping_connected() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_createMapping_exchangeTPDU() );</span><br><span style="color: hsl(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>diff --git a/remsim/RemsimClient_Tests.ttcn b/remsim/RemsimClient_Tests.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..d5520ab</span><br><span>--- /dev/null</span><br><span>+++ b/remsim/RemsimClient_Tests.ttcn</span><br><span>@@ -0,0 +1,118 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module RemsimClient_Tests {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Integration Tests for osmo-remsim-client</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%);">+ * This test suite tests osmo-remsim-client by attaching to the external interfaces.</span><br><span 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 Osmocom_Types all;</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 RSPRO all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSPRO_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSPRO_Server all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from REMSIM_Tests all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type component client_test_CT extends rspro_server_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var ComponentIdentity g_srv_comp_id, g_bankd_comp_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%);">+private function f_init() runs on client_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       g_srv_comp_id := valueof(ts_CompId(remsimServer, "ttcn-server"));</span><br><span style="color: hsl(120, 100%, 40%);">+   g_bankd_comp_id := valueof(ts_CompId(remsimBankd, "ttcn-bankd"));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rspro_srv_init(0, mp_server_ip, mp_server_port, g_srv_comp_id);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_srv_init(1, mp_bankd_ip, mp_bankd_port, g_bankd_comp_id, exp_connect := 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* ConnectClientReq from client to remsim-server */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_srv_connectClient() runs on client_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectClientReq();</span><br><span style="color: hsl(120, 100%, 40%);">+        setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(1.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%);">+/* ConnectClientReq from client to remsim-server */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_srv_connectClient_reject() runs on client_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectClientReq(res := illegalClientId);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* expect disconnect by client */</span><br><span style="color: hsl(120, 100%, 40%);">+     RSPRO_SRV[0].receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_DOWN));</span><br><span style="color: hsl(120, 100%, 40%);">+   setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(1.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%);">+/* ConnectClientReq from client to remsim-server */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_srv_connectClient_configClientBank() runs on client_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var BankSlot bslot := { 1, 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectClientReq();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rspro_config_client_bank(bslot, ts_IpPort(ts_IPv4(mp_bankd_ip), mp_bankd_port));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rspro_srv_exp_connect(1);</span><br><span style="color: hsl(120, 100%, 40%);">+   as_connectClientReq(i := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+  setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_sleep(1.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 if client re-connects to server after connection is lost */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_srv_reconnect() runs on client_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var BankSlot bslot := { 1, 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectClientReq();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* disconnect the client from server and expect re-establish + re-connect */</span><br><span style="color: hsl(120, 100%, 40%);">+  f_rspro_srv_fini(0);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_rspro_srv_init(0, mp_server_ip, mp_server_port, g_srv_comp_id, exp_connect := true);</span><br><span style="color: hsl(120, 100%, 40%);">+        as_connectClientReq(i := 0);</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%);">+     f_sleep(1.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 if client re-connects to bank after connection is lost */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_bank_reconnect() runs on client_test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var BankSlot bslot := { 1, 0 };</span><br><span style="color: hsl(120, 100%, 40%);">+       f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+     as_connectClientReq();</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rspro_config_client_bank(bslot, ts_IpPort(ts_IPv4(mp_bankd_ip), mp_bankd_port));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rspro_srv_exp_connect(1);</span><br><span style="color: hsl(120, 100%, 40%);">+   as_connectClientReq(i := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* disconnect the client from bankd and expect re-establish + re-connect */</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rspro_srv_fini(1);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_rspro_srv_init(1, mp_bankd_ip, mp_bankd_port, g_bankd_comp_id, exp_connect := true);</span><br><span style="color: hsl(120, 100%, 40%);">+        as_connectClientReq(i := 1);</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%);">+     f_sleep(1.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%);">+/* TODO:</span><br><span style="color: hsl(120, 100%, 40%);">+   * send a configClientBankIpReq and change the bank of an active client</span><br><span style="color: hsl(120, 100%, 40%);">+   * send a configClientBankSlotReq and chagne the bank slot of an active client</span><br><span style="color: hsl(120, 100%, 40%);">+   * test keepalive mechanism: do we get IPA PING?</span><br><span style="color: hsl(120, 100%, 40%);">+   * test keepalive mechanism: do we see disconnect+reconnect if we don't respond to IPA PING?</span><br><span style="color: hsl(120, 100%, 40%);">+   * test actual APDU transfers</span><br><span style="color: hsl(120, 100%, 40%);">+   * test messages in invalid state, e.g. APDUs before we're connected to a bank</span><br><span style="color: hsl(120, 100%, 40%);">+   * test messages on server connection which are only permitted on bankd connection</span><br><span 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_srv_connectClient() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_srv_connectClient_reject() );</span><br><span style="color: hsl(120, 100%, 40%);">+     execute( TC_srv_connectClient_configClientBank() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_srv_reconnect() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_bank_reconnect() );</span><br><span style="color: hsl(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/remsim/RemsimServer_Tests.ttcn b/remsim/RemsimServer_Tests.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..f0589ef</span><br><span>--- /dev/null</span><br><span>+++ b/remsim/RemsimServer_Tests.ttcn</span><br><span>@@ -0,0 +1,485 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module RemsimServer_Tests {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Integration Tests for osmo-remsim-server</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%);">+ * This test suite tests osmo-remsim-server by attaching to the external interfaces</span><br><span style="color: hsl(120, 100%, 40%);">+ * such as RSPRO for simulated clients + bankds and RSRES (REST backend interface).</span><br><span 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 Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSPRO all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSRES all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from RSPRO_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from REMSIM_Tests 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 HTTPmsg_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from HTTPmsg_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from JSON_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type component http_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ port HTTPmsg_PT HTTP;</span><br><span style="color: hsl(120, 100%, 40%);">+ var charstring g_http_host;</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer g_http_port;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_http_init(charstring host, integer http_port) runs on http_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    map(self:HTTP, system:HTTP);</span><br><span style="color: hsl(120, 100%, 40%);">+  g_http_host := host;</span><br><span style="color: hsl(120, 100%, 40%);">+  g_http_port := http_port;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) Connect ts_HTTP_Connect(template (value) charstring hostname,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         template (value) integer http_port := 80,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     template (value) boolean use_ssl := false) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      hostname := hostname,</span><br><span style="color: hsl(120, 100%, 40%);">+ portnumber := http_port,</span><br><span style="color: hsl(120, 100%, 40%);">+      use_ssl := use_ssl</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) Close ts_HTTP_Close := { client_id := omit };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) HeaderLines ts_HTTP_Header(charstring body) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    { header_name := "Content-Type", header_value := "application/json" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { header_name := "Content-Length", header_value := int2str(lengthof(body)) }</span><br><span 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) HTTPMessage ts_HTTP_Req(charstring url,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  charstring method := "GET",</span><br><span style="color: hsl(120, 100%, 40%);">+                                         charstring body := "",</span><br><span style="color: hsl(120, 100%, 40%);">+                                      integer v_maj := 1, integer v_min := 1) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ request := {</span><br><span style="color: hsl(120, 100%, 40%);">+          client_id := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+            method := method,</span><br><span style="color: hsl(120, 100%, 40%);">+             uri := url,</span><br><span style="color: hsl(120, 100%, 40%);">+           version_major := v_maj,</span><br><span style="color: hsl(120, 100%, 40%);">+               version_minor := v_min,</span><br><span style="color: hsl(120, 100%, 40%);">+               header := ts_HTTP_Header(body),</span><br><span style="color: hsl(120, 100%, 40%);">+               body := body</span><br><span style="color: hsl(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 HTTPMessage tr_HTTP_Resp(template integer sts := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+     response := {</span><br><span style="color: hsl(120, 100%, 40%);">+         client_id := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+               version_major := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           version_minor := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+           statuscode := sts,</span><br><span style="color: hsl(120, 100%, 40%);">+            statustext := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+              header := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+          body := ?</span><br><span style="color: hsl(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 HTTPMessage tr_HTTP_Resp2xx := tr_HTTP_Resp((200..299));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* run a HTTP request and return the response */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_http_transact(charstring url, charstring method := "GET",</span><br><span style="color: hsl(120, 100%, 40%);">+                         charstring body := "", template HTTPMessage exp := tr_HTTP_Resp2xx)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on http_CT return HTTPMessage {</span><br><span style="color: hsl(120, 100%, 40%);">+  var HTTPMessage resp;</span><br><span style="color: hsl(120, 100%, 40%);">+ timer T := 2.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     HTTP.send(ts_HTTP_Connect(g_http_host, g_http_port));</span><br><span style="color: hsl(120, 100%, 40%);">+ //HTTP.receive(Connect_result:?);</span><br><span style="color: hsl(120, 100%, 40%);">+     HTTP.send(ts_HTTP_Req(url, method, body));</span><br><span style="color: hsl(120, 100%, 40%);">+    T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] HTTP.receive(exp) -> value resp {</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%);">+     [] HTTP.receive(tr_HTTP_Resp) -> value resp {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Unexpected HTTP response ", resp);</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for HTTP response");</span><br><span style="color: hsl(120, 100%, 40%);">+              self.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%);">+     HTTP.send(ts_HTTP_Close);</span><br><span style="color: hsl(120, 100%, 40%);">+     return resp;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* run a HTTP GET on specified URL expecting json in RSRES format as response */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rsres_get(charstring url, template integer exp_sts := 200)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on http_CT return JsRoot {</span><br><span style="color: hsl(120, 100%, 40%);">+   var HTTPMessage http_resp;</span><br><span style="color: hsl(120, 100%, 40%);">+    http_resp := f_http_transact(url, exp := tr_HTTP_Resp(exp_sts));</span><br><span style="color: hsl(120, 100%, 40%);">+      return f_dec_JsRoot(char2oct(http_resp.response.body));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* run a HTTP PUT to add a new slotmap to the remsim-server */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rsres_post_slotmap(JsSlotmap slotmap, template integer exp_sts := 201)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on http_CT return HTTPResponse {</span><br><span style="color: hsl(120, 100%, 40%);">+        var charstring body := oct2char(f_enc_JsSlotmap(slotmap));</span><br><span style="color: hsl(120, 100%, 40%);">+    var HTTPMessage http_resp;</span><br><span style="color: hsl(120, 100%, 40%);">+    http_resp := f_http_transact(url := "/api/backend/v1/slotmaps", method := "POST",</span><br><span style="color: hsl(120, 100%, 40%);">+                              body := body, exp := tr_HTTP_Resp(exp_sts))</span><br><span style="color: hsl(120, 100%, 40%);">+      return http_resp.response;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* run a HTTP PUT to add a new slotmap to the remsim-server */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rsres_post_reset(template integer exp_sts := 200)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on http_CT return HTTPResponse {</span><br><span style="color: hsl(120, 100%, 40%);">+  var HTTPMessage http_resp;</span><br><span style="color: hsl(120, 100%, 40%);">+    http_resp := f_http_transact(url := "/api/backend/v1/global-reset", method := "POST",</span><br><span style="color: hsl(120, 100%, 40%);">+                                  body := "", exp := tr_HTTP_Resp(exp_sts))</span><br><span style="color: hsl(120, 100%, 40%);">+      return http_resp.response;</span><br><span style="color: hsl(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%);">+/* run a HTTP DELETE to remove a slotmap from te remsim-server */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rsres_delete_slotmap(BankSlot bs, template integer exp_sts := 200)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on http_CT return HTTPResponse {</span><br><span style="color: hsl(120, 100%, 40%);">+    var HTTPMessage http_resp;</span><br><span style="color: hsl(120, 100%, 40%);">+    var integer slotmap_id := bs.bankId * 65536 + bs.slotNr;</span><br><span style="color: hsl(120, 100%, 40%);">+      http_resp := f_http_transact(url := "/api/backend/v1/slotmaps/" & int2str(slotmap_id),</span><br><span style="color: hsl(120, 100%, 40%);">+                               method := "DELETE", exp := tr_HTTP_Resp(exp_sts));</span><br><span style="color: hsl(120, 100%, 40%);">+     return http_resp.response;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rsres_init() runs on http_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_http_init(mp_server_ip, mp_rsres_port);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rsres_post_reset();</span><br><span 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 extends rspro_client_CT, http_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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_connect_and_nothing() runs on rspro_client_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var ComponentIdentity rspro_id := valueof(ts_CompId(remsimClient, "foobar"));</span><br><span style="color: hsl(120, 100%, 40%);">+       timer T := 20.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    T.start;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* expect that we're disconnected if we never send a ConnectClientReq */</span><br><span style="color: hsl(120, 100%, 40%);">+  alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSPRO[0].receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_ID_ACK)) { repeat; }</span><br><span style="color: hsl(120, 100%, 40%);">+       [] RSPRO[0].receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_DOWN)) {</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%);">+     [] T.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Timeout waiting for disconnect");</span><br><span style="color: hsl(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%);">+testcase TC_connect_client() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var ComponentIdentity rspro_id := valueof(ts_CompId(remsimClient, "foobar"));</span><br><span style="color: hsl(120, 100%, 40%);">+       var JsRoot js;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_rsres_init();</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    rspro[0].rspro_client_slot := valueof(ts_ClientSlot(3,4));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  js := f_rsres_get("/api/backend/v1/clients");</span><br><span style="color: hsl(120, 100%, 40%);">+       if (not match(js.clients, JsClients:{})) {</span><br><span style="color: hsl(120, 100%, 40%);">+            setverdict(fail, "Initial state not empty");</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%);">+     f_rspro_connect_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+    js := f_rsres_get("/api/backend/v1/clients");</span><br><span style="color: hsl(120, 100%, 40%);">+       if (not match(js.clients[0], tr_JsClient(CONNECTED_CLIENT, rspro[0].rspro_id))) {</span><br><span style="color: hsl(120, 100%, 40%);">+             setverdict(fail, "Non-matching JSON response");</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%);">+     //as_rspro_cfg_client_id(0, cslot);</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%);">+testcase TC_connect_bank() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var ComponentIdentity rspro_id := valueof(ts_CompId(remsimBankd, "foobar"));</span><br><span style="color: hsl(120, 100%, 40%);">+        var JsRoot js;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      f_rsres_init();</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    rspro[0].rspro_bank_id := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  rspro[0].rspro_bank_nslots := 8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    js := f_rsres_get("/api/backend/v1/banks");</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not match(js.banks, JsBanks:{})) {</span><br><span style="color: hsl(120, 100%, 40%);">+                setverdict(fail, "Initial state not empty");</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%);">+     f_rspro_connect_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+    js := f_rsres_get("/api/backend/v1/banks");</span><br><span style="color: hsl(120, 100%, 40%);">+ if (not match(js.banks[0], tr_JsBank(CONNECTED_BANKD, rspro[0].rspro_id, rspro[0].rspro_bank_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           rspro[0].rspro_bank_nslots))) {</span><br><span style="color: hsl(120, 100%, 40%);">+          setverdict(fail, "Non-matching JSON response");</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%);">+     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%);">+function f_ensure_slotmaps(template JsSlotmaps maps)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on http_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var JsRoot js;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* check that it is actually added */</span><br><span style="color: hsl(120, 100%, 40%);">+ js := f_rsres_get("/api/backend/v1/slotmaps");</span><br><span style="color: hsl(120, 100%, 40%);">+      if (match(js.slotmaps, maps)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Unexpected slotmaps: ", js);</span><br><span style="color: hsl(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%);">+/* verify that exactly only one slotmap exists (the specified one) */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ensure_slotmap_exists_only(template ClientSlot cslot, template BankSlot bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      template SlotmapState state := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on http_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_ensure_slotmaps({ tr_JsSlotmap(bslot, cslot, state) } );</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* verify that exactly only one slotmap exists (possibly among others) */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_ensure_slotmap_exists(template ClientSlot cslot, template BankSlot bslot,</span><br><span style="color: hsl(120, 100%, 40%);">+                               template SlotmapState state := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on http_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ensure_slotmaps({ *, tr_JsSlotmap(bslot, cslot, state), * } );</span><br><span style="color: hsl(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 adding a single slotmap */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_slotmap_add() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      f_rsres_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     var JsSlotmap sm := valueof(ts_JsSlotmap(ts_BankSlot(1,2), ts_ClientSlot(3,4)));</span><br><span style="color: hsl(120, 100%, 40%);">+      var HTTPResponse res := f_rsres_post_slotmap(sm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* check that it is actually added */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ensure_slotmap_exists_only(sm.client, sm.bank, NEW);</span><br><span 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 adding a slotmap and then connecting a client + bankd */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_slotmap_add_conn_cl_b() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Simulate one client */</span><br><span style="color: hsl(120, 100%, 40%);">+     var ComponentIdentity rspro_id := valueof(ts_CompId(remsimClient, testcasename()));</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    rspro[0].rspro_client_slot := valueof(ts_ClientSlot(3,4));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Simulate one bankd */</span><br><span style="color: hsl(120, 100%, 40%);">+      var BankSlot bslot := valueof(ts_BankSlot(1,2));</span><br><span style="color: hsl(120, 100%, 40%);">+      var ComponentIdentity rspro_bank_id := valueof(ts_CompId(remsimBankd, testcasename()));</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rspro_init(rspro[1], mp_server_ip, mp_server_port, rspro_bank_id, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       rspro[1].rspro_bank_id := bslot.bankId;</span><br><span style="color: hsl(120, 100%, 40%);">+       rspro[1].rspro_bank_nslots := 8</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rsres_init();</span><br><span style="color: hsl(120, 100%, 40%);">+       var JsSlotmap sm := valueof(ts_JsSlotmap(bslot, rspro[0].rspro_client_slot));</span><br><span style="color: hsl(120, 100%, 40%);">+ var HTTPResponse res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* 1) Create a new slotmap via HTTP */</span><br><span style="color: hsl(120, 100%, 40%);">+        res := f_rsres_post_slotmap(sm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* 2) verify that the slotmap exists and is NEW */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ensure_slotmap_exists_only(sm.client, sm.bank, NEW);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* 3) connect a client for that slotmap */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rspro_connect_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* 4) connect a bankd for that slotmap */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_connect_client(1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* 5) verify that the slotmap exists and is UNACKNOWLEDGED */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ensure_slotmap_exists_only(sm.client, sm.bank, UNACKNOWLEDGED);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* 6) expect bankd to receive that mapping */</span><br><span style="color: hsl(120, 100%, 40%);">+ as_rspro_create_mapping(1, sm.client, sm.bank);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* 7) verify that the slotmap exists and is ACTIVE */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ensure_slotmap_exists_only(sm.client, sm.bank, ACTIVE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* 8) expect the client to be configured with bankd side settings */</span><br><span style="color: hsl(120, 100%, 40%);">+  as_rspro_cfg_client_bank(0, bslot, ?);</span><br><span 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 connecting a client and later adding a slotmap for it */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_conn_cl_b_slotmap_add() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Simulate one client */</span><br><span style="color: hsl(120, 100%, 40%);">+     var ComponentIdentity rspro_id := valueof(ts_CompId(remsimClient, testcasename()));</span><br><span style="color: hsl(120, 100%, 40%);">+   f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    rspro[0].rspro_client_slot := valueof(ts_ClientSlot(3,4));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Simulate one bankd */</span><br><span style="color: hsl(120, 100%, 40%);">+      var BankSlot bslot := valueof(ts_BankSlot(1,2));</span><br><span style="color: hsl(120, 100%, 40%);">+      var ComponentIdentity rspro_bank_id := valueof(ts_CompId(remsimBankd, testcasename()));</span><br><span style="color: hsl(120, 100%, 40%);">+       f_rspro_init(rspro[1], mp_server_ip, mp_server_port, rspro_bank_id, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       rspro[1].rspro_bank_id := bslot.bankId;</span><br><span style="color: hsl(120, 100%, 40%);">+       rspro[1].rspro_bank_nslots := 8</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rsres_init();</span><br><span style="color: hsl(120, 100%, 40%);">+       var JsSlotmap sm := valueof(ts_JsSlotmap(bslot, rspro[0].rspro_client_slot));</span><br><span style="color: hsl(120, 100%, 40%);">+ var HTTPResponse res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* 1) connect a client for that slotmap */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rspro_connect_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* 2) Create a new slotmap via HTTP */</span><br><span style="color: hsl(120, 100%, 40%);">+        res := f_rsres_post_slotmap(sm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* 3) verify that the slotmap exists and is NEW */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ensure_slotmap_exists_only(sm.client, sm.bank, NEW);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* 4) connect a bankd for that slotmap */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_rspro_connect_client(1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* 5) verify that the slotmap exists and is UNACKNOWLEDGED */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ensure_slotmap_exists_only(sm.client, sm.bank, UNACKNOWLEDGED);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* 6) expect bankd to receive that mapping */</span><br><span style="color: hsl(120, 100%, 40%);">+ as_rspro_create_mapping(1, sm.client, sm.bank);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* 7) verify that the slotmap exists and is ACTIVE */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ensure_slotmap_exists_only(sm.client, sm.bank, ACTIVE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* 8) expect the client to be configured with bankd IP/port */</span><br><span style="color: hsl(120, 100%, 40%);">+        as_rspro_cfg_client_bank(0, bslot, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* simple delete of a 'NEW' slotmap */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_slotmap_del_new() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  f_rsres_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     var JsSlotmap sm := valueof(ts_JsSlotmap(ts_BankSlot(1,2), ts_ClientSlot(3,4)));</span><br><span style="color: hsl(120, 100%, 40%);">+      var HTTPResponse res := f_rsres_post_slotmap(sm);</span><br><span style="color: hsl(120, 100%, 40%);">+     log(res);</span><br><span style="color: hsl(120, 100%, 40%);">+     res := f_rsres_delete_slotmap(sm.bank);</span><br><span style="color: hsl(120, 100%, 40%);">+       log(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%);">+/* simple delete of a 'UNACKNOWLEDGED' slotmap */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_slotmap_del_unack() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+  var ComponentIdentity rspro_id := valueof(ts_CompId(remsimBankd, testcasename()));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    rspro[0].rspro_bank_id := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  rspro[0].rspro_bank_nslots := 8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rsres_init();</span><br><span style="color: hsl(120, 100%, 40%);">+       var JsSlotmap sm := valueof(ts_JsSlotmap(ts_BankSlot(1,2), ts_ClientSlot(3,4)));</span><br><span style="color: hsl(120, 100%, 40%);">+      var HTTPResponse res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Create a new slotmap via HTTP */</span><br><span style="color: hsl(120, 100%, 40%);">+   res := f_rsres_post_slotmap(sm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* verify that the slotmap exists and is NEW */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_ensure_slotmap_exists_only(sm.client, sm.bank, NEW);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* connect a bankd for that slotmap */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rspro_connect_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* expect the slotmap to be pushed to bank but don't ACK it */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rspro_exp(tr_RSPRO_CreateMappingReq(sm.client, sm.bank));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* verify that the slotmap exists and is UNACKNOWLEDGED */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ensure_slotmap_exists_only(sm.client, sm.bank, UNACKNOWLEDGED);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* delete the slotmap via REST */</span><br><span style="color: hsl(120, 100%, 40%);">+     res := f_rsres_delete_slotmap(sm.bank);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* verify the slotmap is gone */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_ensure_slotmaps({});</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* simple delete of a 'ACTIVE' slotmap */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_slotmap_del_active() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    var ComponentIdentity rspro_id := valueof(ts_CompId(remsimBankd, testcasename()));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    rspro[0].rspro_bank_id := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  rspro[0].rspro_bank_nslots := 8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rsres_init();</span><br><span style="color: hsl(120, 100%, 40%);">+       var JsSlotmap sm := valueof(ts_JsSlotmap(ts_BankSlot(1,2), ts_ClientSlot(3,4)));</span><br><span style="color: hsl(120, 100%, 40%);">+      var HTTPResponse res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Create a new slotmap via HTTP */</span><br><span style="color: hsl(120, 100%, 40%);">+   res := f_rsres_post_slotmap(sm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* verify that the slotmap exists and is NEW */</span><br><span style="color: hsl(120, 100%, 40%);">+       f_ensure_slotmap_exists_only(sm.client, sm.bank, NEW);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* connect a bankd for that slotmap */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rspro_connect_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* expect the slotmap to be pushed to bank and ACK it */</span><br><span style="color: hsl(120, 100%, 40%);">+      as_rspro_create_mapping(0, sm.client, sm.bank);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* verify that the slotmap exists and is ACTIVE */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ensure_slotmap_exists_only(sm.client, sm.bank, ACTIVE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* delete the slotmap via REST */</span><br><span style="color: hsl(120, 100%, 40%);">+     res := f_rsres_delete_slotmap(sm.bank);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* verify the slotmap is gone from REST interface immediately */</span><br><span style="color: hsl(120, 100%, 40%);">+      f_ensure_slotmaps({});</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* verify the slotmap is removed from bankd */</span><br><span style="color: hsl(120, 100%, 40%);">+        as_rspro_remove_mapping(0, sm.client, sm.bank);</span><br><span style="color: hsl(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%);">+/* Add a slotmap to a currently active bank */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_slotmap_add_active_bank() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var ComponentIdentity rspro_id := valueof(ts_CompId(remsimBankd, testcasename()));</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    rspro[0].rspro_bank_id := 1;</span><br><span style="color: hsl(120, 100%, 40%);">+  rspro[0].rspro_bank_nslots := 8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    f_rsres_init();</span><br><span style="color: hsl(120, 100%, 40%);">+       var JsSlotmap sm := valueof(ts_JsSlotmap(ts_BankSlot(1,2), ts_ClientSlot(3,4)));</span><br><span style="color: hsl(120, 100%, 40%);">+      var HTTPResponse res;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* connect a bankd for that slotmap */</span><br><span style="color: hsl(120, 100%, 40%);">+        f_rspro_connect_client(0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Create a new slotmap via HTTP */</span><br><span style="color: hsl(120, 100%, 40%);">+   res := f_rsres_post_slotmap(sm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* expect the slotmap to be pushed to bank and ACK it */</span><br><span style="color: hsl(120, 100%, 40%);">+      as_rspro_create_mapping(0, sm.client, sm.bank);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* verify that the slotmap exists and is ACTIVE */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ensure_slotmap_exists_only(sm.client, sm.bank, ACTIVE);</span><br><span style="color: hsl(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%);">+/* TODO</span><br><span style="color: hsl(120, 100%, 40%);">+ * - add slotmap, then connect matching client (see if slotmap is sent; check slotmap state)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - connect client w/slotmap; delete slotmap via REST (see if it is deleted)</span><br><span style="color: hsl(120, 100%, 40%);">+ *   - don't acknowledge delete from client, disconnect client (see if slotmap is deleted)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - delete non-existing slotmap via REST</span><br><span style="color: hsl(120, 100%, 40%);">+ * - create slotmap with integers out of range via REST</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ * - connect from unknown client (name not known, no clientId provisioned?</span><br><span style="color: hsl(120, 100%, 40%);">+ * - add client name/ID mappings from REST API?</span><br><span style="color: hsl(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_connect_and_nothing() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_connect_client() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_connect_bank() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_slotmap_add() );</span><br><span style="color: hsl(120, 100%, 40%);">+  execute( TC_slotmap_add_conn_cl_b() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_conn_cl_b_slotmap_add() );</span><br><span style="color: hsl(120, 100%, 40%);">+        execute( TC_slotmap_del_new() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_slotmap_del_unack() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_slotmap_del_active() );</span><br><span style="color: hsl(120, 100%, 40%);">+   execute( TC_slotmap_add_active_bank() );</span><br><span style="color: hsl(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/remsim/gen_links.sh b/remsim/gen_links.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..7c234ec</span><br><span>--- /dev/null</span><br><span>+++ b/remsim/gen_links.sh</span><br><span>@@ -0,0 +1,43 @@</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%);">+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%);">+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%);">+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=$BASEDIR/titan.TestPorts.Common_Components.Abstract_Socket/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Abstract_Socket.cc Abstract_Socket.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%);">+DIR=$BASEDIR/titan.TestPorts.HTTPmsg/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="HTTPmsg_MessageLen.ttcn HTTPmsg_MessageLen_Function.cc HTTPmsg_PT.cc HTTPmsg_PT.hh HTTPmsg_PortType.ttcn HTTPmsg_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.ProtocolModules.JSON_v07_2006/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="JSON_EncDec.cc JSON_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%);">+</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 Osmocom_VTY_Functions.ttcn Osmocom_Types.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp IPA_CodecPort.ttcn " #RSL_Types.ttcn RSL_Emulation.ttcn "</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+="Native_Functions.ttcn Native_FunctionDefs.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/remsim/regen_makefile.sh b/remsim/regen_makefile.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..e398360</span><br><span>--- /dev/null</span><br><span>+++ b/remsim/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 *.asn IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc TELNETasp_PT.cc Native_FunctionDefs.cc RSPRO_EncDec.cc Abstract_Socket.cc HTTPmsg_PT.cc HTTPmsg_MessageLen_Function.cc JSON_EncDec.cc"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSPRO -DIPA_EMULATION_CTRL"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+../regen-makefile.sh REMSIM_Tests.ttcn $FILES</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/15509">change 15509</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/+/15509"/><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: I00034d3a991f0f881cfd8ff0bfc4557113daf830 </div>
<div style="display:none"> Gerrit-Change-Number: 15509 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>