module Iuh_CodecPort {

/* Simple Iuh Codec Port, translating between raw SCTP primitives with
 * octetstring payload towards the IPL4asp provider, and Iuh primitives
 * which carry the decoded Iuh data types as payload.
 *
 * (C) 2021 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
 * Author: Pau Espin Pedrol <pespin@sysmocom.de>
 * 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 HNBAP_PDU_Descriptions all;
	import from HNBAP_Types all;
	import from RUA_PDU_Descriptions all;
	import from RUA_Types all;
	import from Iuh_Types all;

	type record Iuh_RecvFrom {
		ConnectionId	connId,
		HostName	remName,
		PortNumber	remPort,
		HostName	locName,
		PortNumber	locPort,
		Iuh_PDU	msg
	};

	template Iuh_RecvFrom t_Iuh_RecvFrom(template Iuh_PDU msg) := {
		connId := ?,
		remName := ?,
		remPort := ?,
		locName := ?,
		locPort := ?,
		msg := msg
	}

	template Iuh_RecvFrom t_Iuh_RecvFrom_HNBAP(template HNBAP_PDU hnbap_msg := ?) := {
		connId := ?,
		remName := ?,
		remPort := ?,
		locName := ?,
		locPort := ?,
		msg := {
			hnbap := hnbap_msg
		}
	}

	template Iuh_RecvFrom t_Iuh_RecvFrom_RUA(template RUA_PDU rua_msg := ?) := {
		connId := ?,
		remName := ?,
		remPort := ?,
		locName := ?,
		locPort := ?,
		msg := {
			rua := rua_msg
		}
	}

	type record Iuh_Send {
		ConnectionId	connId,
		Iuh_PDU	msg
	};

	template Iuh_Send t_Iuh_Send_HNBAP(template ConnectionId connId, template HNBAP_PDU hnbap_msg) := {
		connId := connId,
		msg := {
			hnbap := hnbap_msg
		}
	}

	template Iuh_Send t_Iuh_Send_RUA(template ConnectionId connId, template RUA_PDU rua_msg) := {
		connId := connId,
		msg := {
			rua := rua_msg
		}
	}

	private function IPL4_to_Iuh_RecvFrom(in ASP_RecvFrom pin, out Iuh_RecvFrom pout) {
		pout.connId := pin.connId;
		pout.remName := pin.remName;
		pout.remPort := pin.remPort;
		pout.locName := pin.locName;
		pout.locPort := pin.locPort;
		select (pin.proto.sctp.sinfo_ppid) {
			case (19) {
				pout.msg.rua := dec_RUA_PDU(pin.msg);
			}
			case (20) {
				pout.msg.hnbap := dec_HNBAP_PDU(pin.msg);
			}
			case else {
				pout.msg.payload := pin.msg;
			}
		}
	} with { extension "prototype(fast)" };

	private function Iuh_to_IPL4_Send(in Iuh_Send pin, out ASP_Send pout) {
		var integer sctp_ppid;
		if (ischosen(pin.msg.rua)) {
			sctp_ppid := 19;
			pout.msg := enc_RUA_PDU(pin.msg.rua);
		} else if (ischosen(pin.msg.hnbap)) {
			sctp_ppid := 20;
			pout.msg := enc_HNBAP_PDU(pin.msg.hnbap);
		} else { /*TODO: abort?*/
			sctp_ppid := 0;
			pout.msg := pin.msg.payload;
		}
		pout.connId := pin.connId;
		pout.proto := {
			sctp := {
				sinfo_stream := omit,
				sinfo_ppid := sctp_ppid,
				remSocks := omit,
				assocId := omit
			}
		};
	} with { extension "prototype(fast)" };

	type port Iuh_CODEC_PT message {
		out	Iuh_Send;
		in	Iuh_RecvFrom,
			ASP_ConnId_ReadyToRelease,
			ASP_Event;
	} with { extension "user IPL4asp_PT
		out(Iuh_Send -> ASP_Send:function(Iuh_to_IPL4_Send))
		in(ASP_RecvFrom -> Iuh_RecvFrom: function(IPL4_to_Iuh_RecvFrom);
		   ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;
		   ASP_Event -> ASP_Event: simple)"
	}
}
