<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/23878">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Initial test suite for osmo-pcap-client<br><br>Change-Id: If4a1072e75cb64f785d660e4c828c0f521d84b16<br>---<br>M Makefile<br>A library/OPCAP_Adapter.ttcn<br>A library/OPCAP_CodecPort.ttcn<br>A library/OPCAP_CodecPort_CtrlFunct.ttcn<br>A library/OPCAP_CodecPort_CtrlFunctdef.cc<br>A library/OPCAP_Templates.ttcn<br>A library/OPCAP_Types.ttcn<br>A pcap-client/OPCAP_CLIENT_Tests.cfg<br>A pcap-client/OPCAP_CLIENT_Tests.default<br>A pcap-client/OPCAP_CLIENT_Tests.ttcn<br>A pcap-client/gen_links.sh<br>A pcap-client/osmo-pcap-client.cfg<br>12 files changed, 714 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/78/23878/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Makefile b/Makefile</span><br><span>index 81540ba..0567081 100644</span><br><span>--- a/Makefile</span><br><span>+++ b/Makefile</span><br><span>@@ -28,6 +28,7 @@</span><br><span>      mme \</span><br><span>        msc \</span><br><span>        ns \</span><br><span style="color: hsl(120, 100%, 40%);">+  pcap-client \</span><br><span>        pcu \</span><br><span>        pgw \</span><br><span>        remsim \</span><br><span>diff --git a/library/OPCAP_Adapter.ttcn b/library/OPCAP_Adapter.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..8bcc3fd</span><br><span>--- /dev/null</span><br><span>+++ b/library/OPCAP_Adapter.ttcn</span><br><span>@@ -0,0 +1,105 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module OPCAP_Adapter {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* OPCAP Adapter layer, sitting on top of OPCAP_CodecPort.</span><br><span style="color: hsl(120, 100%, 40%);">+ * test suites can 'inherit' in order to have a OPCAP 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) 2021 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 Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from General_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from OPCAP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from OPCAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from OPCAP_CodecPort all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from OPCAP_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%);">+const integer NUM_OPCAP := 3;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type component OPCAP_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      /* down-facing port to OPCAP Codec port */</span><br><span style="color: hsl(120, 100%, 40%);">+    port OPCAP_CODEC_PT OPCAP[NUM_OPCAP];</span><br><span style="color: hsl(120, 100%, 40%);">+ var IPL4asp_Types.ConnectionId g_opcap_conn_id[NUM_OPCAP] := { -1, -1, -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%);">+private function f_set_tcp_segmentation(integer idx) runs on OPCAP_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: 2, size of length: 2, delta: 4, multiplier: 1, big-endian */</span><br><span style="color: hsl(120, 100%, 40%);">+       OPCAP_CodecPort_CtrlFunct.f_IPL4_setGetMsgLen(OPCAP[idx], g_opcap_conn_id[idx], vl_f, {2, 2, 4, 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, IPL4asp_Types.PortNumber remote_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                   charstring local_host, IPL4asp_Types.PortNumber local_port, integer idx := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on OPCAP_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:OPCAP[idx], system:OPCAP);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (g_opcap_conn_id[idx] != -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             OPCAP_CodecPort_CtrlFunct.f_IPL4_close(OPCAP[idx], g_opcap_conn_id[idx], {tcp := {}});</span><br><span style="color: hsl(120, 100%, 40%);">+                g_opcap_conn_id[idx] := -1;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     res := OPCAP_CodecPort_CtrlFunct.f_IPL4_connect(OPCAP[idx], remote_host, remote_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 local_host, local_port, 0, { 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 OPCAP port, check your configuration ",</span><br><span style="color: hsl(120, 100%, 40%);">+                      "{remote ", remote_host, ":", remote_port, " local ", local_host, ":", local_port, "}");</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_opcap_conn_id[idx] := res.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_set_tcp_segmentation(idx);</span><br><span 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 to use to bind to a local port as IPA server, accepting remote clients */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_bind(charstring local_host, IPL4asp_Types.PortNumber local_port, integer idx := 0)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on OPCAP_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:OPCAP[idx], system:OPCAP);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (g_opcap_conn_id[idx] != -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             OPCAP_CodecPort_CtrlFunct.f_IPL4_close(OPCAP[idx], g_opcap_conn_id[idx], {tcp := {}});</span><br><span style="color: hsl(120, 100%, 40%);">+                g_opcap_conn_id[idx] := -1;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     res := OPCAP_CodecPort_CtrlFunct.f_IPL4_listen(OPCAP[idx], local_host, local_port, { 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 bind to OPCAP port, check your configuration ",</span><br><span style="color: hsl(120, 100%, 40%);">+                    "{local ", local_host, ":", local_port, "}");</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_opcap_conn_id[idx] := res.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_set_tcp_segmentation(idx);</span><br><span 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_wait_client_connect(integer idx) runs on OPCAP_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var IPL4asp_Types.PortEvent rx_event;</span><br><span style="color: hsl(120, 100%, 40%);">+ OPCAP[idx].receive(IPL4asp_Types.PortEvent:{connOpened:=?}) -> value rx_event {</span><br><span style="color: hsl(120, 100%, 40%);">+            log("Connection from ", rx_event.connOpened.remName, ":", rx_event.connOpened.remPort);</span><br><span style="color: hsl(120, 100%, 40%);">+           /* we want to store the client's connId, not the 'bind socket' one */</span><br><span style="color: hsl(120, 100%, 40%);">+             g_opcap_conn_id[idx] := rx_event.connOpened.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+function f_disconnect(integer idx) runs on OPCAP_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ OPCAP_CodecPort_CtrlFunct.f_IPL4_close(OPCAP[idx], g_opcap_conn_id[idx], {tcp := {}});</span><br><span style="color: hsl(120, 100%, 40%);">+        OPCAP[idx].clear;</span><br><span 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_opcap_send(template (value) OPCAP_PDU pdu, integer idx := 0) runs on OPCAP_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   OPCAP[idx].send(ts_OPCAP_Send(g_opcap_conn_id[idx], 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_opcap_exp(template OPCAP_PDU exp, integer idx := 0) runs on OPCAP_Adapter_CT return OPCAP_PDU {</span><br><span style="color: hsl(120, 100%, 40%);">+   var OPCAP_RecvFrom rf;</span><br><span style="color: hsl(120, 100%, 40%);">+        OPCAP[idx].receive(tr_OPCAP_Recv(g_opcap_conn_id[idx], 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/OPCAP_CodecPort.ttcn b/library/OPCAP_CodecPort.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..f2d215d</span><br><span>--- /dev/null</span><br><span>+++ b/library/OPCAP_CodecPort.ttcn</span><br><span>@@ -0,0 +1,64 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module OPCAP_CodecPort {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Simple OPCAP Codec Port, translating between raw TCP octetstring payload</span><br><span style="color: hsl(120, 100%, 40%);">+ * towards the IPL4asp port provider, and OPCAP primitives</span><br><span style="color: hsl(120, 100%, 40%);">+ * which carry the decoded OPCAP data types as payload.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 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 OPCAP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record OPCAP_RecvFrom {</span><br><span style="color: hsl(120, 100%, 40%);">+       ConnectionId    connId,</span><br><span style="color: hsl(120, 100%, 40%);">+       OPCAP_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 OPCAP_Send {</span><br><span style="color: hsl(120, 100%, 40%);">+    ConnectionId    connId,</span><br><span style="color: hsl(120, 100%, 40%);">+       OPCAP_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) OPCAP_Send ts_OPCAP_Send(ConnectionId conn_id, template (value) OPCAP_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 OPCAP_RecvFrom tr_OPCAP_Recv(template ConnectionId conn_id, template OPCAP_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_OPCAP_RecvFrom(in ASP_RecvFrom pin, out OPCAP_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_OPCAP_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 OPCAP_to_IPL4_Send(in OPCAP_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_OPCAP_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 OPCAP_CODEC_PT message {</span><br><span style="color: hsl(120, 100%, 40%);">+   out     OPCAP_Send;</span><br><span style="color: hsl(120, 100%, 40%);">+   in      OPCAP_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(OPCAP_Send -> ASP_Send: function(OPCAP_to_IPL4_Send))</span><br><span style="color: hsl(120, 100%, 40%);">+  in(ASP_RecvFrom -> OPCAP_RecvFrom: function(IPL4_to_OPCAP_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/OPCAP_CodecPort_CtrlFunct.ttcn b/library/OPCAP_CodecPort_CtrlFunct.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..99a5fe7</span><br><span>--- /dev/null</span><br><span>+++ b/library/OPCAP_CodecPort_CtrlFunct.ttcn</span><br><span>@@ -0,0 +1,52 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module OPCAP_CodecPort_CtrlFunct {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  import from OPCAP_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 OPCAP_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 OPCAP_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 OPCAP_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 OPCAP_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 OPCAP_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 OPCAP_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/OPCAP_CodecPort_CtrlFunctdef.cc b/library/OPCAP_CodecPort_CtrlFunctdef.cc</span><br><span>new file mode 100644</span><br><span>index 0000000..b19138a</span><br><span>--- /dev/null</span><br><span>+++ b/library/OPCAP_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 "OPCAP_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 OPCAP__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%);">+    OPCAP__CodecPort::OPCAP__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%);">+    OPCAP__CodecPort::OPCAP__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%);">+    OPCAP__CodecPort::OPCAP__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%);">+    OPCAP__CodecPort::OPCAP__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%);">+    OPCAP__CodecPort::OPCAP__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%);">+    OPCAP__CodecPort::OPCAP__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/OPCAP_Templates.ttcn b/library/OPCAP_Templates.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..0a1c884</span><br><span>--- /dev/null</span><br><span>+++ b/library/OPCAP_Templates.ttcn</span><br><span>@@ -0,0 +1,54 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module OPCAP_Templates {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* OPCAP_Templates, defining TTCN-3 templates for the osmo-pcap protocol.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * OPCAP is a non-standard protocol used between osmo-pcap-client and osmo-pcap-server.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 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 General_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from OPCAP_Types 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%);">+template (present) OPCAP_PDU tr_OPCAP_FILE_HDR(template (present) uint32_t linktype := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+       msg_type := PKT_LINK_HDR,</span><br><span style="color: hsl(120, 100%, 40%);">+     spare := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+   len := 24,</span><br><span style="color: hsl(120, 100%, 40%);">+    u := {</span><br><span style="color: hsl(120, 100%, 40%);">+                file := {</span><br><span style="color: hsl(120, 100%, 40%);">+                     magic := PCAP_MAGIC,</span><br><span style="color: hsl(120, 100%, 40%);">+                  version_major := PCAP_VERSION_MAJOR,</span><br><span style="color: hsl(120, 100%, 40%);">+                  version_minor := PCAP_VERSION_MINOR,</span><br><span style="color: hsl(120, 100%, 40%);">+                  thiszone := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                        sigfigs := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                 snaplen := 9000,</span><br><span style="color: hsl(120, 100%, 40%);">+                      linktype := linktype</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span 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) OPCAP_PDU tr_OPCAP_PKT(template (present) octetstring payload,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       template (present) uint32_t caplen := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      template (present) uint32_t len := ?) := {</span><br><span style="color: hsl(120, 100%, 40%);">+  msg_type := PKT_LINK_DATA,</span><br><span style="color: hsl(120, 100%, 40%);">+    spare := ?,</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%);">+                packet := {</span><br><span style="color: hsl(120, 100%, 40%);">+                   ts_sec := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                  ts_usec := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                 caplen := caplen,</span><br><span style="color: hsl(120, 100%, 40%);">+                     len := len,</span><br><span style="color: hsl(120, 100%, 40%);">+                   payload := payload</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(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/OPCAP_Types.ttcn b/library/OPCAP_Types.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..d244fef</span><br><span>--- /dev/null</span><br><span>+++ b/library/OPCAP_Types.ttcn</span><br><span>@@ -0,0 +1,78 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module OPCAP_Types {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* OPCAP_Types, defining abstract TTCN-3 data types for the osmo-pcap protocol.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * OPCAP is a non-standard protocol used between osmo-pcap-client and osmo-pcap-server.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 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 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 OpcapMsgType {</span><br><span style="color: hsl(120, 100%, 40%);">+        PKT_LINK_HDR    (0),</span><br><span style="color: hsl(120, 100%, 40%);">+  PKT_LINK_DATA   (1)</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 record OPCAP_PDU {</span><br><span style="color: hsl(120, 100%, 40%);">+        OpcapMsgType msg_type,</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t spare,</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t len,</span><br><span style="color: hsl(120, 100%, 40%);">+ OpcapBodyUnion 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 (len) "BYTEORDER(last)"</span><br><span style="color: hsl(120, 100%, 40%);">+     variant (u) "CROSSTAG(</span><br><span style="color: hsl(120, 100%, 40%);">+           file,   msg_type = PKT_LINK_HDR;</span><br><span style="color: hsl(120, 100%, 40%);">+              packet, msg_type = PKT_LINK_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%);">+type union OpcapBodyUnion {</span><br><span style="color: hsl(120, 100%, 40%);">+    PcapFileHeader file,</span><br><span style="color: hsl(120, 100%, 40%);">+  OpcapPacket packet</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* header in front of a PKT_LINK_DATA */</span><br><span style="color: hsl(120, 100%, 40%);">+type record OpcapPacket {</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t ts_sec,</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t ts_usec,</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t caplen,</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t len,</span><br><span style="color: hsl(120, 100%, 40%);">+ octetstring payload</span><br><span style="color: hsl(120, 100%, 40%);">+} with {</span><br><span style="color: hsl(120, 100%, 40%);">+ variant (caplen) "LENGTHTO(payload)"</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* below definitions are from pcap/pcap.h */</span><br><span style="color: hsl(120, 100%, 40%);">+const uint16_t PCAP_VERSION_MAJOR := 2;</span><br><span style="color: hsl(120, 100%, 40%);">+const uint16_t PCAP_VERSION_MINOR := 4;</span><br><span style="color: hsl(120, 100%, 40%);">+const uint32_t PCAP_MAGIC := 2712847316; //0xA1B2C3D4;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record PcapFileHeader {</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t magic,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t version_major,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t version_minor,</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t thiszone,</span><br><span style="color: hsl(120, 100%, 40%);">+    uint32_t sigfigs,</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t snaplen,</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t linktype</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* below definitions are from pcap/dlt.h */</span><br><span style="color: hsl(120, 100%, 40%);">+const uint32_t DLT_LINUX_SLL := 113;</span><br><span style="color: hsl(120, 100%, 40%);">+const uint32_t DLT_EN10MB := 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%);">+external function enc_OPCAP_PDU(in OPCAP_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_OPCAP_PDU(in octetstring msg) return OPCAP_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%);">+} with { encode "RAW"; variant "FIELDORDER(msb)"; variant "BYTEORDER(first)" };</span><br><span>diff --git a/pcap-client/OPCAP_CLIENT_Tests.cfg b/pcap-client/OPCAP_CLIENT_Tests.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..3476c2f</span><br><span>--- /dev/null</span><br><span>+++ b/pcap-client/OPCAP_CLIENT_Tests.cfg</span><br><span>@@ -0,0 +1,18 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[ORDERED_INCLUDE]</span><br><span style="color: hsl(120, 100%, 40%);">+# Common configuration, shared between test suites</span><br><span style="color: hsl(120, 100%, 40%);">+"../Common.cfg"</span><br><span style="color: hsl(120, 100%, 40%);">+# testsuite specific configuration, not expected to change</span><br><span style="color: hsl(120, 100%, 40%);">+"./OPCAP_CLIENT_Tests.default"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Local configuration below</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[LOGGING]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[TESTPORT_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MODULE_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MAIN_CONTROLLER]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[EXECUTE]</span><br><span style="color: hsl(120, 100%, 40%);">+OPCAP_CLIENT_Tests.control</span><br><span>diff --git a/pcap-client/OPCAP_CLIENT_Tests.default b/pcap-client/OPCAP_CLIENT_Tests.default</span><br><span>new file mode 100644</span><br><span>index 0000000..2b1677b</span><br><span>--- /dev/null</span><br><span>+++ b/pcap-client/OPCAP_CLIENT_Tests.default</span><br><span>@@ -0,0 +1,19 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[LOGGING]</span><br><span style="color: hsl(120, 100%, 40%);">+mtc.FileMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING | DEBUG_ENCDEC;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[TESTPORT_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_MODE := "client"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_HOSTNAME := "127.0.0.1"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_PORTNUM := "4237"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_LOGIN_SKIPPED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_DETECT_SERVER_DISCONNECTED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_READMODE := "buffered"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_CLIENT_CLEANUP_LINEFEED := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.CTRL_DETECT_CONNECTION_ESTABLISHMENT_RESULT := "yes"</span><br><span style="color: hsl(120, 100%, 40%);">+*.VTY.PROMPT1 := "OsmoPCAPClient> "</span><br><span style="color: hsl(120, 100%, 40%);">+*.TCP.noDelay := "yes" // turn off nagle</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[MODULE_PARAMETERS]</span><br><span style="color: hsl(120, 100%, 40%);">+Osmocom_VTY_Functions.mp_prompt_prefix := "OsmoPCAPClient"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[EXECUTE]</span><br><span>diff --git a/pcap-client/OPCAP_CLIENT_Tests.ttcn b/pcap-client/OPCAP_CLIENT_Tests.ttcn</span><br><span>new file mode 100644</span><br><span>index 0000000..5f59caf</span><br><span>--- /dev/null</span><br><span>+++ b/pcap-client/OPCAP_CLIENT_Tests.ttcn</span><br><span>@@ -0,0 +1,212 @@</span><br><span style="color: hsl(120, 100%, 40%);">+module OPCAP_CLIENT_Tests {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from OPCAP_Adapter all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from OPCAP_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from OPCAP_Templates all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPL4asp_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from IPL4asp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Osmocom_VTY_Functions all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from TELNETasp_PortType all;</span><br><span style="color: hsl(120, 100%, 40%);">+import from Socket_API_Definitions all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+type record IpPort {</span><br><span style="color: hsl(120, 100%, 40%);">+    charstring ip,</span><br><span style="color: hsl(120, 100%, 40%);">+        integer udp_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%);">+modulepar {</span><br><span style="color: hsl(120, 100%, 40%);">+   /* local IP address listening for OPCAP connections */</span><br><span style="color: hsl(120, 100%, 40%);">+        charstring mp_local_opcap_ip := "127.0.0.1";</span><br><span style="color: hsl(120, 100%, 40%);">+        /* local TCP base port for inbound OPCAP connections */</span><br><span style="color: hsl(120, 100%, 40%);">+       integer mp_local_opcap_port := 5000;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* IP + port for simulating user traffic */</span><br><span style="color: hsl(120, 100%, 40%);">+   IpPort mp_traffic_a := { "127.0.0.23", 44423 };</span><br><span style="color: hsl(120, 100%, 40%);">+     IpPort mp_traffic_b := { "127.0.0.42", 44442 };</span><br><span 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 OPCAP_Adapter_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    timer g_Tguard := 30.0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     port TELNETasp_PT VTY;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* port to generate IP traffic that may or may not be captured */</span><br><span style="color: hsl(120, 100%, 40%);">+     port IPL4asp_PT IP;</span><br><span style="color: hsl(120, 100%, 40%);">+   var integer g_traffic_conn_id[2];</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private altstep as_Tguard() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+[] g_Tguard.timeout {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "global guard timeout");</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%);">+/* initialize one of the OPCAP servers, wait for client to connect */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_init_one_srv(integer idx, template (present) uint32_t linktype) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+   /* start guard timer */</span><br><span style="color: hsl(120, 100%, 40%);">+       activate(as_Tguard());</span><br><span style="color: hsl(120, 100%, 40%);">+        g_Tguard.start;</span><br><span style="color: hsl(120, 100%, 40%);">+       log("Waiting for client-", idx, " connection...");</span><br><span style="color: hsl(120, 100%, 40%);">+        /* wait for connection */</span><br><span style="color: hsl(120, 100%, 40%);">+     f_bind(mp_local_opcap_ip, mp_local_opcap_port+idx, idx);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_wait_client_connect(idx);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* wait for file header */</span><br><span style="color: hsl(120, 100%, 40%);">+    f_opcap_exp(tr_OPCAP_FILE_HDR(linktype), idx);</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* global initialization */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_init() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      map(self:VTY, system:VTY);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_vty_set_prompts(VTY);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_vty_transceive(VTY, "enable");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  map(self:IP, system:IP);</span><br><span style="color: hsl(120, 100%, 40%);">+      var IPL4asp_Types.Result res</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* 0 -> 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+       res := f_IPL4_connect(IP, mp_traffic_b.ip, mp_traffic_b.udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                           mp_traffic_a.ip, mp_traffic_a.udp_port, -1, { udp:={} });</span><br><span style="color: hsl(120, 100%, 40%);">+       g_traffic_conn_id[0] := res.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 1 -> 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+       res := f_IPL4_connect(IP, mp_traffic_a.ip, mp_traffic_a.udp_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                           mp_traffic_b.ip, mp_traffic_b.udp_port, -1, { udp:={} });</span><br><span style="color: hsl(120, 100%, 40%);">+       g_traffic_conn_id[1] := res.connId;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* generate user traffic from A -> B */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_trafic_pkt_ab(octetstring payload) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ IP.send(ASP_Send:{g_traffic_conn_id[0], omit, payload})</span><br><span style="color: hsl(120, 100%, 40%);">+       IP.receive(ASP_RecvFrom:{g_traffic_conn_id[1], ?, ?, ?, ?, { udp:={} }, ?, payload});</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* generate user traffic from B -> A */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_trafic_pkt_ba(octetstring payload) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       IP.send(ASP_Send:{g_traffic_conn_id[1], omit, payload})</span><br><span style="color: hsl(120, 100%, 40%);">+       IP.receive(ASP_RecvFrom:{g_traffic_conn_id[0], ?, ?, ?, ?, { udp:={} }, ?, payload});</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* expect a specified UDP payload on the OPCAP connection 'idx' */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_opcap_exp_udp(octetstring udp_payload, integer idx) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+      var octetstring rx_tail;</span><br><span style="color: hsl(120, 100%, 40%);">+      var integer udp_payload_len, rx_pdu_len;</span><br><span style="color: hsl(120, 100%, 40%);">+      var OPCAP_PDU rx_pdu;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       udp_payload_len := lengthof(udp_payload);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* sadly I couldn't figure out how to create an octetstring template</span><br><span style="color: hsl(120, 100%, 40%);">+       * for 'match an octetstring ending in 'udp_payload' */</span><br><span style="color: hsl(120, 100%, 40%);">+   rx_pdu := f_opcap_exp(tr_OPCAP_PKT(?), idx);</span><br><span style="color: hsl(120, 100%, 40%);">+  rx_pdu_len := lengthof(rx_pdu.u.packet.payload);</span><br><span style="color: hsl(120, 100%, 40%);">+      rx_tail := substr(rx_pdu.u.packet.payload, rx_pdu_len - udp_payload_len, udp_payload_len);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (rx_tail != udp_payload) {</span><br><span style="color: hsl(120, 100%, 40%);">+         log("captured UDP payload: ", rx_tail, " but expected: ", udp_payload);</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(fail);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* create an additional pcap-store-connection via the VTY */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_vty_create_addl_connection(integer idx) runs on test_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   f_vty_config3(VTY, { "client", "pcap-store-connectio second-" & int2str(idx) },</span><br><span style="color: hsl(120, 100%, 40%);">+                       { "server ip " & mp_local_opcap_ip,</span><br><span style="color: hsl(120, 100%, 40%);">+                       "server port " & int2str(mp_local_opcap_port + idx),</span><br><span style="color: hsl(120, 100%, 40%);">+                    "connect" }</span><br><span style="color: hsl(120, 100%, 40%);">+                       );</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* wait for inbound client connection and reception of link header */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_connect_rx_hdr() runs on test_CT</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%);">+     f_init_one_srv(0, ?);</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%);">+/* check if client connection is re-started after a close */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_reconnect(integer idx := 0) runs on test_CT</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%);">+     f_init_one_srv(idx, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+       f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       log("Disconnecting client-", idx);</span><br><span style="color: hsl(120, 100%, 40%);">+  f_disconnect(idx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_wait_client_connect(idx);</span><br><span style="color: hsl(120, 100%, 40%);">+   f_opcap_exp(tr_OPCAP_FILE_HDR(?), idx);</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%);">+/* capture a packet that's within the filter */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_capture() runs on test_CT</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%);">+     f_init_one_srv(0, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+             var octetstring udp_payload;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* we assume 1400 is low enough to avoid IP fragmentation */</span><br><span style="color: hsl(120, 100%, 40%);">+          udp_payload := f_rnd_octstring(f_rnd_int(1400));</span><br><span style="color: hsl(120, 100%, 40%);">+              f_trafic_pkt_ab(udp_payload);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               f_opcap_exp_udp(udp_payload, 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%);">+/* wait for inbound client connections and reception of link header */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_multi_connect_rx_hdr() runs on test_CT</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%);">+     f_init_one_srv(0, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_vty_create_addl_connection(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_one_srv(1, ?);</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%);">+/* ensure a packet that's within the filter is sent to secondary clients */</span><br><span style="color: hsl(120, 100%, 40%);">+testcase TC_multi_capture() runs on test_CT</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%);">+     f_init_one_srv(0, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_vty_create_addl_connection(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      f_init_one_srv(1, ?);</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+             var octetstring udp_payload;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* we assume 1400 is low enough to avoid IP fragmentation */</span><br><span style="color: hsl(120, 100%, 40%);">+          udp_payload := f_rnd_octstring(f_rnd_int(1400));</span><br><span style="color: hsl(120, 100%, 40%);">+              f_trafic_pkt_ab(udp_payload);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* expect packet to arrive on both simulated servers */</span><br><span style="color: hsl(120, 100%, 40%);">+               f_opcap_exp_udp(udp_payload, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+              f_opcap_exp_udp(udp_payload, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* TODO: ensure a packet outside the filter is dropped */</span><br><span style="color: hsl(120, 100%, 40%);">+/* TODO: capture of truncated packet */</span><br><span style="color: hsl(120, 100%, 40%);">+/* TODO: stall the receive window */</span><br><span style="color: hsl(120, 100%, 40%);">+/* TODO: different link type (ethernet, not SLL) */</span><br><span 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_rx_hdr() );</span><br><span style="color: hsl(120, 100%, 40%);">+       execute( TC_reconnect() );</span><br><span style="color: hsl(120, 100%, 40%);">+    execute( TC_capture() );</span><br><span style="color: hsl(120, 100%, 40%);">+      execute( TC_multi_connect_rx_hdr() );</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_multi_capture() );</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(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/pcap-client/gen_links.sh b/pcap-client/gen_links.sh</span><br><span>new file mode 100755</span><br><span>index 0000000..e459959</span><br><span>--- /dev/null</span><br><span>+++ b/pcap-client/gen_links.sh</span><br><span>@@ -0,0 +1,31 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/bin/bash</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+BASEDIR=../deps</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+. ../gen_links.sh.inc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.Libraries.TCCUsefulFunctions/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="TCCInterface_Functions.ttcn TCCConversion_Functions.ttcn TCCConversion.cc TCCInterface.cc TCCInterface_ip.h"</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+=" TCCEncoding_Functions.ttcn TCCEncoding.cc " # GSM 7-bit coding</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DIR=$BASEDIR/titan.TestPorts.Common_Components.Socket-API/src</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Socket_API_Definitions.ttcn"</span><br><span style="color: hsl(120, 100%, 40%);">+gen_links $DIR $FILES</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+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=../library</span><br><span style="color: hsl(120, 100%, 40%);">+FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn Native_Functions.ttcn Native_FunctionDefs.cc "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="Osmocom_VTY_Functions.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="OPCAP_Types.ttcn OPCAP_Templates.ttcn "</span><br><span style="color: hsl(120, 100%, 40%);">+FILES+="OPCAP_CodecPort.ttcn OPCAP_CodecPort_CtrlFunct.ttcn OPCAP_CodecPort_CtrlFunctdef.cc OPCAP_Adapter.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%);">+ignore_pp_results</span><br><span>diff --git a/pcap-client/osmo-pcap-client.cfg b/pcap-client/osmo-pcap-client.cfg</span><br><span>new file mode 100644</span><br><span>index 0000000..89f1801</span><br><span>--- /dev/null</span><br><span>+++ b/pcap-client/osmo-pcap-client.cfg</span><br><span>@@ -0,0 +1,14 @@</span><br><span style="color: hsl(120, 100%, 40%);">+!</span><br><span style="color: hsl(120, 100%, 40%);">+! OsmoPCAPClient (UNKNOWN-dirty) configuration saved from vty</span><br><span style="color: hsl(120, 100%, 40%);">+!!</span><br><span style="color: hsl(120, 100%, 40%);">+!</span><br><span style="color: hsl(120, 100%, 40%);">+!</span><br><span style="color: hsl(120, 100%, 40%);">+line vty</span><br><span style="color: hsl(120, 100%, 40%);">+ no login</span><br><span style="color: hsl(120, 100%, 40%);">+!</span><br><span style="color: hsl(120, 100%, 40%);">+client</span><br><span style="color: hsl(120, 100%, 40%);">+ pcap device lo</span><br><span style="color: hsl(120, 100%, 40%);">+ pcap filter udp port 44423</span><br><span style="color: hsl(120, 100%, 40%);">+ pcap detect-loop 0</span><br><span style="color: hsl(120, 100%, 40%);">+ server ip 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+ server port 5000</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/23878">change 23878</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/+/23878"/><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: If4a1072e75cb64f785d660e4c828c0f521d84b16 </div>
<div style="display:none"> Gerrit-Change-Number: 23878 </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>