<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/16175">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">VPCD protocol support (for vsmartcard.git PCD/PICC code)<br><br>vsmartcard.git contains an implementation of a virtual card reader<br>(vpcd) which registers with PC/SC (such as pcsc-lite).  It simply<br>binds to a TCP port and waits for a TCP client to connect to it,<br>implementing APDU transfer over TCP.<br><br>This code implements the related protocol as a TTCN-3 test port<br>for Eclipse TITAN, which will enable us to implement a 'virtual smart<br>card' in TTCN-3 tets cases, primarily for testing remsim-bankd at<br>this point.<br><br>Change-Id: Iac37dd231a0f2e1efd484887bca1a9d672b446bb<br>---<br>A library/VPCD_Adapter.ttcn<br>A library/VPCD_CodecPort.ttcn<br>A library/VPCD_CodecPort_CtrlFunct.ttcn<br>A library/VPCD_CodecPort_CtrlFunctDef.cc<br>A library/VPCD_Types.ttcn<br>5 files changed, 330 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/75/16175/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/VPCD_Adapter.ttcn b/library/VPCD_Adapter.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..289be06</span><br><span>--- /dev/null</span><br><span>+++ b/library/VPCD_Adapter.ttcn</span><br><span>@@ -0,0 +1,73 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module VPCD_Adapter {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* VPCD Adapter layer, sitting on top of VPCD_CodecPort.</span><br><span style="color: hsl(120, 100%, 40%);">+ * test suites can 'inherit' in order to have a VPCD connection to the IUT which they're testing</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018-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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from VPCD_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from VPCD_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from VPCD_CodecPort_CtrlFunct all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPL4asp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Socket_API_Definitions 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_vpcd_port := 35963;</span><br><span style="color: hsl(120, 100%, 40%);">+        charstring mp_vpcd_host := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type component VPCD_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      port VPCD_CODEC_PT VPCD;</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer g_vpcd_conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_set_tcp_segmentation() runs on VPCD_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Set function for dissecting the binary stream into packets */</span><br><span style="color: hsl(120, 100%, 40%);">+      var f_IPL4_getMsgLen vl_f := refers(f_IPL4_fixedMsgLen);</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Offset: 0, size of length: 2, delta: 0, multiplier: 1, big-endian: 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+    VPCD_CodecPort_CtrlFunct.f_IPL4_setGetMsgLen(VPCD, g_vpcd_conn_id, vl_f, {0, 2, 2, 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%);">+function f_connect(charstring remote_host := mp_vpcd_host, integer remote_port := mp_vpcd_port)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on VPCD_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   var IPL4asp_Types.Result res;</span><br><span style="color: hsl(120, 100%, 40%);">+ map(self:VPCD, system:VPCD);</span><br><span style="color: hsl(120, 100%, 40%);">+  res := VPCD_CodecPort_CtrlFunct.f_IPL4_connect(VPCD, remote_host, remote_port, "", 0, 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    { tcp := {} });</span><br><span style="color: hsl(120, 100%, 40%);">+       if (not ispresent(res.connId)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(fail, "Could not connect to VPCD at ", remote_host, ":", remote_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                          ", check your configuration");</span><br><span style="color: hsl(120, 100%, 40%);">+              mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     g_vpcd_conn_id := res.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_set_tcp_segmentation();</span><br><span 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_bind(charstring local_host, IPL4asp_Types.PortNumber local_port)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on VPCD_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        var IPL4asp_Types.Result res;</span><br><span style="color: hsl(120, 100%, 40%);">+ map(self:VPCD, system:VPCD);</span><br><span style="color: hsl(120, 100%, 40%);">+  res := VPCD_CodecPort_CtrlFunct.f_IPL4_listen(VPCD, local_host, local_port, { tcp:={} });</span><br><span style="color: hsl(120, 100%, 40%);">+     g_vpcd_conn_id := res.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+ f_set_tcp_segmentation();</span><br><span 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_vpcd_send(template (value) VPCD_PDU pdu) runs on VPCD_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ VPCD.send(ts_VPCD_Send(g_vpcd_conn_id, 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_vpcd_exp(template VPCD_PDU exp) runs on VPCD_Adapter_CT return VPCD_PDU {</span><br><span style="color: hsl(120, 100%, 40%);">+      var VPCD_RecvFrom rf;</span><br><span style="color: hsl(120, 100%, 40%);">+ VPCD.receive(tr_VPCD_Recv(g_vpcd_conn_id, exp)) -> value rf;</span><br><span style="color: hsl(120, 100%, 40%);">+       return rf.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%);">+}</span><br><span>diff --git a/library/VPCD_CodecPort.ttcn b/library/VPCD_CodecPort.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..a9ae97f</span><br><span>--- /dev/null</span><br><span>+++ b/library/VPCD_CodecPort.ttcn</span><br><span>@@ -0,0 +1,64 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module VPCD_CodecPort {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Simple VPCD Codec Port, translating between raw TCP octetstring payload</span><br><span style="color: hsl(120, 100%, 40%);">+ * towards the IPL4asp port provider, and VPCD primitives</span><br><span style="color: hsl(120, 100%, 40%);">+ * which carry the decoded VPCD data types as payload.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</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%);">+ * 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPL4asp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from VPCD_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record VPCD_RecvFrom {</span><br><span style="color: hsl(120, 100%, 40%);">+        ConnectionId    connId,</span><br><span style="color: hsl(120, 100%, 40%);">+       VPCD_PDU        msg</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record VPCD_Send {</span><br><span style="color: hsl(120, 100%, 40%);">+     ConnectionId    connId,</span><br><span style="color: hsl(120, 100%, 40%);">+       VPCD_PDU        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 (value) VPCD_Send ts_VPCD_Send(ConnectionId conn_id, template (value) VPCD_PDU msg) := {</span><br><span style="color: hsl(120, 100%, 40%);">+   connId := conn_id,</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 VPCD_RecvFrom tr_VPCD_Recv(template ConnectionId conn_id, template VPCD_PDU msg) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       connId := conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+    msg := msg</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function IPL4_to_VPCD_RecvFrom(in ASP_RecvFrom pin, out VPCD_RecvFrom pout) {</span><br><span style="color: hsl(120, 100%, 40%);">+        pout.connId := pin.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+    pout.msg := dec_VPCD_PDU(pin.msg);</span><br><span style="color: hsl(120, 100%, 40%);">+} with { extension "prototype(fast)" }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function VPCD_to_IPL4_Send(in VPCD_Send pin, out ASP_Send pout) {</span><br><span style="color: hsl(120, 100%, 40%);">+     pout.connId := pin.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+    pout.proto := { tcp := {} };</span><br><span style="color: hsl(120, 100%, 40%);">+  pout.msg := enc_VPCD_PDU(pin.msg);</span><br><span style="color: hsl(120, 100%, 40%);">+} with { extension "prototype(fast)" }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type port VPCD_CODEC_PT message {</span><br><span style="color: hsl(120, 100%, 40%);">+     out     VPCD_Send;</span><br><span style="color: hsl(120, 100%, 40%);">+    in      VPCD_RecvFrom,</span><br><span style="color: hsl(120, 100%, 40%);">+                ASP_ConnId_ReadyToRelease,</span><br><span style="color: hsl(120, 100%, 40%);">+            ASP_Event;</span><br><span style="color: hsl(120, 100%, 40%);">+} with { extension "user IPL4asp_PT</span><br><span style="color: hsl(120, 100%, 40%);">+  out(VPCD_Send -> ASP_Send: function(VPCD_to_IPL4_Send))</span><br><span style="color: hsl(120, 100%, 40%);">+    in(ASP_RecvFrom -> VPCD_RecvFrom: function(IPL4_to_VPCD_RecvFrom);</span><br><span style="color: hsl(120, 100%, 40%);">+    ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;</span><br><span style="color: hsl(120, 100%, 40%);">+    ASP_Event -> ASP_Event: simple)"</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/library/VPCD_CodecPort_CtrlFunct.ttcn b/library/VPCD_CodecPort_CtrlFunct.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..62b79c5</span><br><span>--- /dev/null</span><br><span>+++ b/library/VPCD_CodecPort_CtrlFunct.ttcn</span><br><span>@@ -0,0 +1,52 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module VPCD_CodecPort_CtrlFunct {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  import from VPCD_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+  import from IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_listen(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout VPCD_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in HostName locName,</span><br><span style="color: hsl(120, 100%, 40%);">+    in PortNumber locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ProtoTuple proto,</span><br><span style="color: hsl(120, 100%, 40%);">+    in OptionList options := {}</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_connect(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout VPCD_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in HostName remName,</span><br><span style="color: hsl(120, 100%, 40%);">+    in PortNumber remPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    in HostName locName,</span><br><span style="color: hsl(120, 100%, 40%);">+    in PortNumber locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ConnectionId connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ProtoTuple proto,</span><br><span style="color: hsl(120, 100%, 40%);">+    in OptionList options := {}</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_close(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout VPCD_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ConnectionId id,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ProtoTuple proto := { unspecified := {} }</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_setUserData(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout VPCD_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ConnectionId id,</span><br><span style="color: hsl(120, 100%, 40%);">+    in UserData userData</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_getUserData(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout VPCD_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ConnectionId id,</span><br><span style="color: hsl(120, 100%, 40%);">+    out UserData userData</span><br><span style="color: hsl(120, 100%, 40%);">+  ) return Result;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  external function f_IPL4_setGetMsgLen(</span><br><span style="color: hsl(120, 100%, 40%);">+    inout VPCD_CODEC_PT portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ConnectionId id,</span><br><span style="color: hsl(120, 100%, 40%);">+    inout f_IPL4_getMsgLen f,</span><br><span style="color: hsl(120, 100%, 40%);">+    in ro_integer msgLenArgs</span><br><span style="color: hsl(120, 100%, 40%);">+  );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/library/VPCD_CodecPort_CtrlFunctDef.cc b/library/VPCD_CodecPort_CtrlFunctDef.cc</span><br><span>new file mode 100644</span><br><span>index 0000000..74c1176</span><br><span>--- /dev/null</span><br><span>+++ b/library/VPCD_CodecPort_CtrlFunctDef.cc</span><br><span>@@ -0,0 +1,66 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#include "IPL4asp_PortType.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "VPCD_CodecPort.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "IPL4asp_PT.hh"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+namespace VPCD__CodecPort__CtrlFunct {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  IPL4asp__Types::Result f__IPL4__listen(</span><br><span style="color: hsl(120, 100%, 40%);">+    VPCD__CodecPort::VPCD__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::HostName& locName,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::PortNumber& locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ProtoTuple& proto,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::OptionList& options)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return f__IPL4__PROVIDER__listen(portRef, locName, locPort, proto, options);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+  </span><br><span style="color: hsl(120, 100%, 40%);">+  IPL4asp__Types::Result f__IPL4__connect(</span><br><span style="color: hsl(120, 100%, 40%);">+    VPCD__CodecPort::VPCD__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::HostName& remName,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::PortNumber& remPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::HostName& locName,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::PortNumber& locPort,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ConnectionId& connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ProtoTuple& proto,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::OptionList& options)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return f__IPL4__PROVIDER__connect(portRef, remName, remPort,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      locName, locPort, connId, proto, options);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  IPL4asp__Types::Result f__IPL4__close(</span><br><span style="color: hsl(120, 100%, 40%);">+    VPCD__CodecPort::VPCD__CODEC__PT& portRef, </span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ConnectionId& connId, </span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ProtoTuple& proto)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+      return f__IPL4__PROVIDER__close(portRef, connId, proto);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  IPL4asp__Types::Result f__IPL4__setUserData(</span><br><span style="color: hsl(120, 100%, 40%);">+    VPCD__CodecPort::VPCD__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ConnectionId& connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::UserData& userData)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return f__IPL4__PROVIDER__setUserData(portRef, connId, userData);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+  </span><br><span style="color: hsl(120, 100%, 40%);">+  IPL4asp__Types::Result f__IPL4__getUserData(</span><br><span style="color: hsl(120, 100%, 40%);">+    VPCD__CodecPort::VPCD__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ConnectionId& connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    IPL4asp__Types::UserData& userData)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return f__IPL4__PROVIDER__getUserData(portRef, connId, userData);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  void f__IPL4__setGetMsgLen(</span><br><span style="color: hsl(120, 100%, 40%);">+    VPCD__CodecPort::VPCD__CODEC__PT& portRef,</span><br><span style="color: hsl(120, 100%, 40%);">+    const IPL4asp__Types::ConnectionId& connId,</span><br><span style="color: hsl(120, 100%, 40%);">+    Socket__API__Definitions::f__getMsgLen& f,</span><br><span style="color: hsl(120, 100%, 40%);">+    const Socket__API__Definitions::ro__integer& msgLenArgs)</span><br><span style="color: hsl(120, 100%, 40%);">+  {</span><br><span style="color: hsl(120, 100%, 40%);">+    return f__IPL4__PROVIDER__setGetMsgLen(portRef, connId, f, msgLenArgs);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/library/VPCD_Types.ttcn b/library/VPCD_Types.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..5caa0be</span><br><span>--- /dev/null</span><br><span>+++ b/library/VPCD_Types.ttcn</span><br><span>@@ -0,0 +1,75 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module VPCD_Types {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* VPCD/VPICC Types, implementing the protocol used by vpcd/vpicc of</span><br><span style="color: hsl(120, 100%, 40%);">+ * vsmartcard.git by Frank Morgner.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from General_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type enumerated VPCD_CtrlCmd {</span><br><span style="color: hsl(120, 100%, 40%);">+        VPCD_CTRL_OFF   (0),</span><br><span style="color: hsl(120, 100%, 40%);">+  VPCD_CTRL_ON    (1),</span><br><span style="color: hsl(120, 100%, 40%);">+  VPCD_CTRL_RESET (2),</span><br><span style="color: hsl(120, 100%, 40%);">+  VPCD_CTRL_ATR   (4)</span><br><span style="color: hsl(120, 100%, 40%);">+} with { variant "FIELDLENGTH(8)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type union VPCD_MsgUnion {</span><br><span style="color: hsl(120, 100%, 40%);">+     VPCD_CtrlCmd    ctrl,</span><br><span style="color: hsl(120, 100%, 40%);">+ octetstring     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%);">+type record VPCD_PDU {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint16_t        len,</span><br><span style="color: hsl(120, 100%, 40%);">+  VPCD_MsgUnion   u</span><br><span style="color: hsl(120, 100%, 40%);">+} with {</span><br><span style="color: hsl(120, 100%, 40%);">+   variant (len) "LENGTHTO(u)"</span><br><span style="color: hsl(120, 100%, 40%);">+ variant (u) "CROSSTAG(</span><br><span style="color: hsl(120, 100%, 40%);">+                   ctrl,   len = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                      data,   OTHERWISE)"</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) VPCD_PDU ts_VPCD_CTRL(template (value) VPCD_CtrlCmd cmd) := {</span><br><span style="color: hsl(120, 100%, 40%);">+      len := 0, // overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+      u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                ctrl := cmd</span><br><span 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) VPCD_PDU ts_VPCD_CTRL_OFF := ts_VPCD_CTRL(VPCD_CTRL_OFF);</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) VPCD_PDU ts_VPCD_CTRL_ON := ts_VPCD_CTRL(VPCD_CTRL_ON);</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) VPCD_PDU ts_VPCD_CTRL_RESET := ts_VPCD_CTRL(VPCD_CTRL_RESET);</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) VPCD_PDU ts_VPCD_CTRL_ATR := ts_VPCD_CTRL(VPCD_CTRL_ATR);</span><br><span style="color: hsl(120, 100%, 40%);">+template (value) VPCD_PDU ts_VPCD_DATA(template (value) octetstring data) := {</span><br><span style="color: hsl(120, 100%, 40%);">+        len := 0, //overwritten</span><br><span style="color: hsl(120, 100%, 40%);">+       u := {</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 (present) VPCD_PDU tr_VPCD_CTRL(template (present) VPCD_CtrlCmd cmd) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    len := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+     u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                ctrl := cmd</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) VPCD_PDU tr_VPCD_CTRL_OFF := tr_VPCD_CTRL(VPCD_CTRL_OFF);</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) VPCD_PDU tr_VPCD_CTRL_ON := tr_VPCD_CTRL(VPCD_CTRL_ON);</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) VPCD_PDU tr_VPCD_CTRL_RESET := tr_VPCD_CTRL(VPCD_CTRL_RESET);</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) VPCD_PDU tr_VPCD_CTRL_ATR := tr_VPCD_CTRL(VPCD_CTRL_ATR);</span><br><span style="color: hsl(120, 100%, 40%);">+template (present) VPCD_PDU tr_VPCD_DATA(template (present) octetstring data) := {</span><br><span style="color: hsl(120, 100%, 40%);">+    len := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+     u := {</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%);">+external function enc_VPCD_PDU(in VPCD_PDU msg) return octetstring</span><br><span style="color: hsl(120, 100%, 40%);">+    with { extension "prototype(convert) encode(RAW)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+external function dec_VPCD_PDU(in octetstring msg) return VPCD_PDU</span><br><span style="color: hsl(120, 100%, 40%);">+  with { extension "prototype(convert) decode(RAW)" };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span 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 "RAW" };</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/16175">change 16175</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/+/16175"/><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: Iac37dd231a0f2e1efd484887bca1a9d672b446bb </div>
<div style="display:none"> Gerrit-Change-Number: 16175 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>