stp: Introduce STP_Tests*.ttcn for testing OsmoSTP

In the past, we were automatically running [large parts of] the nplab
M3UA and SUA test suites, but those implement only a fraction of the
functionality.  Particularly, they don't cover the non-standard IPA
behavior, and they don't cover RKM (routing key management).

Let's introduce an initial set of STP tests with this patch.  We try
to not duplicate nplab here, and implement bits not covered there.

Change-Id: I628a87385cac0dfe708a0d74a5088fbd5a4790cd
diff --git a/library/M3UA_CodecPort.ttcn b/library/M3UA_CodecPort.ttcn
new file mode 100644
index 0000000..94d16d6
--- /dev/null
+++ b/library/M3UA_CodecPort.ttcn
@@ -0,0 +1,84 @@
+module M3UA_CodecPort {
+
+/* Simple M3UA Codec Port, translating between raw SCTP primitives with
+ * octetstring payload towards the IPL4asp provider, and M3UA primitives
+ * which carry the decoded M3UA data types as payload.
+ *
+ * (C) 2019 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+	import from IPL4asp_PortType all;
+	import from IPL4asp_Types all;
+	import from M3UA_Types all;
+
+	type record M3UA_RecvFrom {
+		ConnectionId	connId,
+		HostName	remName,
+		PortNumber	remPort,
+		HostName	locName,
+		PortNumber	locPort,
+		PDU_M3UA	msg
+	};
+
+	template M3UA_RecvFrom t_M3UA_RecvFrom(template PDU_M3UA msg) := {
+		connId := ?,
+		remName := ?,
+		remPort := ?,
+		locName := ?,
+		locPort := ?,
+		msg := msg
+	}
+
+	type record M3UA_Send {
+		ConnectionId	connId,
+		integer		stream,
+		PDU_M3UA	msg
+	}
+
+	template M3UA_Send t_M3UA_Send(template ConnectionId connId, template PDU_M3UA msg,
+					template (omit) integer stream := omit) := {
+		connId := connId,
+		stream := stream,
+		msg := msg
+	}
+
+	private function IPL4_to_M3UA_RecvFrom(in ASP_RecvFrom pin, out M3UA_RecvFrom pout) {
+		pout.connId := pin.connId;
+		pout.remName := pin.remName;
+		pout.remPort := pin.remPort;
+		pout.locName := pin.locName;
+		pout.locPort := pin.locPort;
+		pout.msg := dec_PDU_M3UA(pin.msg);
+	} with { extension "prototype(fast)" };
+
+	private function M3UA_to_IPL4_Send(in M3UA_Send pin, out ASP_Send pout) {
+		pout.connId := pin.connId;
+		pout.proto := {
+			sctp := {
+				sinfo_stream := pin.stream,
+				sinfo_ppid := 3,
+				remSocks := omit,
+				assocId := omit
+			}
+		};
+		pout.msg := enc_PDU_M3UA(pin.msg);
+	} with { extension "prototype(fast)" };
+
+	type port M3UA_CODEC_PT message {
+		out	M3UA_Send;
+		in	M3UA_RecvFrom,
+			ASP_ConnId_ReadyToRelease,
+			ASP_Event;
+	} with { extension "user IPL4asp_PT
+		out(M3UA_Send -> ASP_Send:function(M3UA_to_IPL4_Send))
+		in(ASP_RecvFrom -> M3UA_RecvFrom: function(IPL4_to_M3UA_RecvFrom);
+		   ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;
+		   ASP_Event -> ASP_Event: simple)"
+	}
+}