Extend IPA_Emulation with support for CTRL
diff --git a/library/Osmocom_CTRL_Types.ttcn b/library/Osmocom_CTRL_Types.ttcn
new file mode 100644
index 0000000..db5012c
--- /dev/null
+++ b/library/Osmocom_CTRL_Types.ttcn
@@ -0,0 +1,69 @@
+module Osmocom_CTRL_Types {
+
+type charstring CtrlVerb ("GET", "SET") with {
+	/* see https://www.eclipse.org/forums/index.php/t/1088893/ on why this
+	 * match expression is needed here */
+	variant "TEXT_CODING(,convert=upper_case,'((GET)|(SET)|(TRAP))',case_insensitive)"
+};
+
+type charstring CtrlReplyToken ("REPLY") with {
+	variant "TEXT_CODING(,convert=upper_case,'(REPLY)',case_insensitive)"
+};
+
+type charstring CtrlId	(pattern "\d#(1,9)");
+type charstring CtrlVariable (pattern "[^, \{\}\[\]\(\)<>\|~\\\^`'\"\?=;/\+\*&%$\#!]*");
+type charstring CtrlValue (pattern "[^ ]");
+type charstring CtrlReason;
+
+
+type record CtrlCommand {
+	CtrlVerb	verb,
+	CtrlId		id,
+	CtrlVariable	variable,
+	CtrlValue	val optional	/* only for SET */
+} with {
+	variant "SEPARATOR(' ',)"
+};
+
+type record CtrlResponse {
+	CtrlVerb	verb,
+	CtrlReplyToken	repl,
+	CtrlId		id,
+	CtrlVariable	variable,
+	CtrlValue	val
+} with {
+	variant "TEXT_CODING(,,'* REPLY *',case_insensitive)"
+	variant "SEPARATOR(' ',)"
+};
+
+type record CtrlError {
+	CtrlId		id,
+	CtrlReason	reason
+} with {
+	variant "BEGIN('ERROR ',,case_insensitive)"
+	variant "SEPARATOR(' ',)"
+};
+
+type record CtrlTrap {
+	CtrlVariable	variable,
+	CtrlValue	val
+} with {
+	variant "BEGIN('TRAP ',,case_insensitive)"
+	variant "SEPARATOR(' ',)"
+};
+
+type union CtrlMessage {
+	CtrlCommand	cmd,
+	CtrlResponse	resp,
+	CtrlError	err,
+	CtrlTrap	trap
+};
+
+external function enc_CtrlMessage(in CtrlMessage id) return charstring
+	with { extension "prototype(convert) encode(TEXT)"};
+
+external function dec_CtrlMessage(in charstring id) return CtrlMessage
+	with { extension "prototype(convert) decode(TEXT)"};
+
+
+} with { encode "TEXT" }