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 (0) {
				/* FIXME: lower layers report sinfo_ppid=0: */
				if  (match(pin.msg, '000100380000070003000C02404F736D6F484E6F64654200080001000009000300F110000B0004000000100006000200020007000103000A00020004'O)) {
					pout.msg.hnbap := dec_HNBAP_PDU(pin.msg);
				} else {
					pout.msg.rua := dec_RUA_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)"
	}
}
