module MGCP_CodecPort {

/* Simple MGCP Codec Port, translating between raw UDP primitives with
 * octetstring payload towards the IPL4asp provider, and MGCP primitives
 * which carry the decoded MGCP data types as payload.
 *
 * (C) 2017 by Harald Welte <laforge@gnumonks.org>
 * contributions by sysmocom - s.f.m.c. GmbH
 * 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 MGCP_Types all;

	type record MGCP_RecvFrom {
		ConnectionId	connId,
		HostName	remName,
		PortNumber	remPort,
		HostName	locName,
		PortNumber	locPort,
		MgcpMessage	msg
	};

	template MGCP_RecvFrom t_MGCP_RecvFrom(template MgcpMessage msg) := {
		connId := ?,
		remName := ?,
		remPort := ?,
		locName := ?,
		locPort := ?,
		msg := msg
	}

	type record MGCP_Send {
		ConnectionId	connId,
		MgcpMessage	msg
	}

	type record MGCP_SendTo {
		ConnectionId	connId,
		HostName	remName,
		PortNumber	remPort,
		MgcpMessage	msg
	};

	template MGCP_Send t_MGCP_Send(template ConnectionId connId, template MgcpMessage msg) := {
		connId := connId,
		msg := msg
	}

	template MGCP_SendTo t_MGCP_SendTo(template ConnectionId connId, HostName remName,
					 PortNumber remPort,template MgcpMessage msg) := {
		connId := connId,
		remName := remName,
		remPort := remPort,
		msg := msg
	}

	template MGCP_SendTo t_MGCP_SendToMrf(MGCP_RecvFrom mrf,template MgcpMessage msg) := {
		connId := mrf.connId,
		remName := mrf.remName,
		remPort := mrf.remPort,
		msg := msg
	}

	private function IPL4_to_MGCP_RecvFrom(in ASP_RecvFrom pin, out MGCP_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_MgcpMessage(oct2char(pin.msg));
	} with { extension "prototype(fast)" };

	private function MGCP_to_IPL4_Send(in MGCP_Send pin, out ASP_Send pout) {
		pout.connId := pin.connId;
		pout.proto := { udp := {} };
		pout.msg := char2oct(enc_MgcpMessage(pin.msg));
	} with { extension "prototype(fast)" };

	private function MGCP_to_IPL4_SendTo(in MGCP_SendTo pin, out ASP_SendTo out_ud) {
		out_ud.connId := pin.connId;
		out_ud.remName := pin.remName;
		out_ud.remPort := pin.remPort;
		out_ud.proto := { udp := {} };
		out_ud.msg := char2oct(enc_MgcpMessage(pin.msg));
	} with { extension "prototype(fast)" };

	type port MGCP_CODEC_PT message {
		out	MGCP_Send,
			MGCP_SendTo;
		in	MGCP_RecvFrom,
			ASP_ConnId_ReadyToRelease,
			ASP_Event;
	} with { extension "user IPL4asp_PT
		out(MGCP_Send -> ASP_Send:function(MGCP_to_IPL4_Send);
		    MGCP_SendTo -> ASP_SendTo: function(MGCP_to_IPL4_SendTo))
		in(ASP_RecvFrom -> MGCP_RecvFrom: function(IPL4_to_MGCP_RecvFrom);
		   ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;
		   ASP_Event -> ASP_Event: simple)"
	}
}
