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)"
	}
}
