/* Osmocom HNBLL Interface Types, as per osmo-hnodeb/include/osmocom/hnodeb/hnb_prim.h
 * (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
 * All rights reserved.
 * Author: Pau Espin Pedrol <pespin@sysmocom.de>
 *
 * 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
 */

module HNBLLIF_Types {

import from General_Types all;
import from Osmocom_Types all;
import from Native_Functions all;

modulepar {
	/* HNBLLIF version supported by the IUT */
	HNBLLIF_Version mp_hnbllif_version := 0;
};

const charstring HNBLL_SOCK_DEFAULT := "/tmp/hnb_prim_sock";
type integer HNBLLIF_Version (0); /* supported versions */

/**********************
 * CTL SAPI
 **********************/


type enumerated HNBLLIF_CTL_MsgType {
	HNBLL_IF_CTL_MSG_HELLO	('0000'O)
} with { variant "FIELDLENGTH(16)" };

type record HNBLLIF_CTL_hello_req {
	HNBLLIF_Sapi	sapi,
	uint16_t	api_version
} with { variant "" };

type record HNBLLIF_CTL_hello_cnf {
	HNBLLIF_Sapi	sapi,
	uint16_t	api_version
} with { variant "" };

type union HNBLLIF_CTL_PrimOpUnion_hello {
	HNBLLIF_CTL_hello_req	req,
	HNBLLIF_CTL_hello_cnf	cnf,
	octetstring		other
} with { variant "" };

type record HNBLLIF_CTL_PrimOp_hello  {
	HNBLLIF_Operation	op,
	HNBLLIF_CTL_PrimOpUnion_hello	u
} with { variant (u) "CROSSTAG( req, 	op = HNBLL_IF_OP_REQUEST;
				cnf, 	op = HNBLL_IF_OP_CONFIRM;
				other,	OTHERWISE)"
};

type union HNBLLIF_CTL_PrimUnion {
	HNBLLIF_CTL_PrimOp_hello	hello,
	octetstring		other
} with { variant "" };

type record HNBLLIF_CTL_PrimHdr  {
	HNBLLIF_CTL_MsgType	prim,
	HNBLLIF_CTL_PrimUnion	u
} with { variant (u) "CROSSTAG( hello, 	prim = HNBLL_IF_CTL_MSG_HELLO;
				other,	OTHERWISE)"
};

/**********************
 * IUH SAPI
 **********************/
type enumerated HNBLLIF_IUH_MsgType {
	HNBLL_IF_IUH_MSG_CONFIGURE	('0000'O),
	HNBLL_IF_IUH_MSG_CONN_ESTABLISH	('0001'O),
	HNBLL_IF_IUH_MSG_CONN_RELEASE	('0002'O),
	HNBLL_IF_IUH_MSG_CONN_DATA	('0003'O),
	HNBLL_IF_IUH_MSG_UNITDATA	('0004'O)
} with { variant "FIELDLENGTH(16)" };

/* CONFIGURE */
type record HNBLLIF_IUH_configure_ind {
	uint16_t mcc,
	uint16_t mnc,
	uint16_t cell_identity,
	uint16_t lac,
	uint8_t rac,
	uint8_t reserved,
	uint16_t sac,
	uint16_t rnc_id
} with { variant "" };

type union HNBLLIF_IUH_PrimOpUnion_configure {
	HNBLLIF_IUH_configure_ind ind,
	octetstring		other
} with { variant "" };

type record HNBLLIF_IUH_PrimOp_configure  {
	HNBLLIF_Operation	op,
	HNBLLIF_IUH_PrimOpUnion_configure	u
} with { variant (u) "CROSSTAG( ind, 	op = HNBLL_IF_OP_INDICATION;
				other,	OTHERWISE)"
};

/* CONN_ESTABLISH */
type record HNBLLIF_IUH_conn_establish_req {
	uint32_t context_id,
	uint8_t domain,
	uint8_t est_cause,
	uint16_t reserved, //uint16_t nas_node_selector_bitlen;
	//uint8_t nas_node_selector[128]; /* TODO: check whether we can decrease this buffer size */
	uint32_t data_len,
	octetstring data /* RANAP message */
} with { variant (data_len) "LENGTHTO (data)" };

type record HNBLLIF_IUH_conn_establish_cnf {
	uint32_t context_id,
	uint8_t domain,
	uint8_t est_cause
} with { variant "" };

type union HNBLLIF_IUH_PrimOpUnion_conn_establish {
	HNBLLIF_IUH_conn_establish_req req,
	HNBLLIF_IUH_conn_establish_cnf cnf,
	octetstring		other
} with { variant "" };
type record HNBLLIF_IUH_PrimOp_conn_establish  {
	HNBLLIF_Operation	op,
	HNBLLIF_IUH_PrimOpUnion_conn_establish	u
} with { variant (u) "CROSSTAG( req, 	op = HNBLL_IF_OP_REQUEST;
				cnf, 	op = HNBLL_IF_OP_CONFIRM;
				other,	OTHERWISE)"
};

/* CONN_RELEASE */
type record HNBLLIF_IUH_conn_release_req {
	uint32_t context_id,
	uint8_t domain,
	uint8_t spare1,
	uint8_t cause_type,
	uint8_t cause,
	uint32_t data_len,
	octetstring data /* RANAP message */
} with { variant (data_len) "LENGTHTO (data)" };


type union HNBLLIF_IUH_PrimOpUnion_conn_release {
	HNBLLIF_IUH_conn_release_req req,
	octetstring		other
} with { variant "" };
type record HNBLLIF_IUH_PrimOp_conn_release  {
	HNBLLIF_Operation	op,
	HNBLLIF_IUH_PrimOpUnion_conn_release	u
} with { variant (u) "CROSSTAG( req, 	op = HNBLL_IF_OP_REQUEST;
				other,	OTHERWISE)"
};

/* CONN_DATA */
type record HNBLLIF_IUH_conn_data_ind {
	uint32_t context_id,
	uint8_t domain,
	uint8_t spare1,
	uint16_t spare2,
	uint32_t data_len,
	octetstring data /* RANAP message */
} with { variant (data_len) "LENGTHTO (data)" };

type record HNBLLIF_IUH_conn_data_req {
	uint32_t context_id,
	uint8_t domain,
	uint8_t spare1,
	uint16_t spare2,
	uint32_t data_len,
	octetstring data /* RANAP message */
} with { variant (data_len) "LENGTHTO (data)" };

type union HNBLLIF_IUH_PrimOpUnion_conn_data {
	HNBLLIF_IUH_conn_data_req req,
	HNBLLIF_IUH_conn_data_ind ind,
	octetstring		other
} with { variant "" };
type record HNBLLIF_IUH_PrimOp_conn_data  {
	HNBLLIF_Operation	op,
	HNBLLIF_IUH_PrimOpUnion_conn_data	u
} with { variant (u) "CROSSTAG( req, 	op = HNBLL_IF_OP_REQUEST;
				ind, 	op = HNBLL_IF_OP_INDICATION;
				other,	OTHERWISE)"
};

/* UNITDATA */
type record HNBLLIF_IUH_unitdata_ind {
	uint32_t data_len,
	octetstring data /* RANAP message */
} with { variant (data_len) "LENGTHTO (data)" };

type record HNBLLIF_IUH_unitdata_req {
	uint32_t data_len,
	octetstring data /* RANAP message */
} with { variant (data_len) "LENGTHTO (data)" };

type union HNBLLIF_IUH_PrimOpUnion_unitdata {
	HNBLLIF_IUH_unitdata_req req,
	HNBLLIF_IUH_unitdata_ind ind,
	octetstring		other
} with { variant "" };
type record HNBLLIF_IUH_PrimOp_unitdata  {
	HNBLLIF_Operation	op,
	HNBLLIF_IUH_PrimOpUnion_unitdata	u
} with { variant (u) "CROSSTAG( req, 	op = HNBLL_IF_OP_REQUEST;
				ind, 	op = HNBLL_IF_OP_INDICATION;
				other,	OTHERWISE)"
};

type union HNBLLIF_IUH_PrimUnion {
	HNBLLIF_IUH_PrimOp_configure		configure,
	HNBLLIF_IUH_PrimOp_conn_establish	conn_establish,
	HNBLLIF_IUH_PrimOp_conn_release		conn_release,
	HNBLLIF_IUH_PrimOp_conn_data		conn_data,
	HNBLLIF_IUH_PrimOp_unitdata		unitdata,
	octetstring		other
} with { variant "" };

type record HNBLLIF_IUH_PrimHdr  {
	HNBLLIF_IUH_MsgType	prim,
	HNBLLIF_IUH_PrimUnion	u
} with { variant (u) "CROSSTAG( configure, 	prim = HNBLL_IF_IUH_MSG_CONFIGURE;
				conn_establish,	prim = HNBLL_IF_IUH_MSG_CONN_ESTABLISH;
				conn_release,	prim = HNBLL_IF_IUH_MSG_CONN_RELEASE;
				conn_data,	prim = HNBLL_IF_IUH_MSG_CONN_DATA;
				unitdata,	prim = HNBLL_IF_IUH_MSG_UNITDATA;
				other,	OTHERWISE)"
};

/**********************
 * AUDIO SAPI
 **********************/
type enumerated HNBLLIF_AUDIO_MsgType {
	HNBLL_IF_AUDIO_MSG_CONN_ESTABLISH	('0000'O),
	HNBLL_IF_AUDIO_MSG_CONN_RELEASE		('0001'O),
	HNBLL_IF_AUDIO_MSG_CONN_DATA		('0002'O)
} with { variant "FIELDLENGTH(16)" };

/* CONN_ESTABLISH */
type record HNBLLIF_AUDIO_conn_establish_req {
	uint32_t context_id,
	uint16_t remote_rtp_port,
	uint8_t reserved,
	HNBLLIF_AddrType remote_rtp_address_type,
	HNBLLIF_Addr remote_addr
} with { variant "" };

type record HNBLLIF_AUDIO_conn_establish_cnf {
	uint32_t context_id,
	uint16_t local_rtp_port,
	uint8_t error_code,
	HNBLLIF_AddrType local_rtp_address_type,
	HNBLLIF_Addr local_addr
} with { variant "" };

type union HNBLLIF_AUDIO_PrimOpUnion_conn_establish {
	HNBLLIF_AUDIO_conn_establish_req req,
	HNBLLIF_AUDIO_conn_establish_cnf cnf,
	octetstring		other
} with { variant "" };
type record HNBLLIF_AUDIO_PrimOp_conn_establish  {
	HNBLLIF_Operation	op,
	HNBLLIF_AUDIO_PrimOpUnion_conn_establish	u
} with { variant (u) "CROSSTAG( req, 	op = HNBLL_IF_OP_REQUEST;
				cnf, 	op = HNBLL_IF_OP_CONFIRM;
				other,	OTHERWISE)"
};

/* CONN_RELEASE */
type record HNBLLIF_AUDIO_conn_release_req {
	uint32_t context_id
} with { variant "" };


type union HNBLLIF_AUDIO_PrimOpUnion_conn_release {
	HNBLLIF_AUDIO_conn_release_req req,
	octetstring		other
} with { variant "" };
type record HNBLLIF_AUDIO_PrimOp_conn_release  {
	HNBLLIF_Operation	op,
	HNBLLIF_AUDIO_PrimOpUnion_conn_release	u
} with { variant (u) "CROSSTAG( req, 	op = HNBLL_IF_OP_REQUEST;
				other,	OTHERWISE)"
};

/* CONN_DATA */
type record HNBLLIF_AUDIO_conn_data_ind {
	uint32_t context_id,
	uint32_t data_len,
	octetstring data /* RANAP message */
} with { variant (data_len) "LENGTHTO (data)" };

type record HNBLLIF_AUDIO_conn_data_req {
	uint32_t context_id,
	uint32_t data_len,
	octetstring data /* RANAP message */
} with { variant (data_len) "LENGTHTO (data)" };

type union HNBLLIF_AUDIO_PrimOpUnion_conn_data {
	HNBLLIF_AUDIO_conn_data_req req,
	HNBLLIF_AUDIO_conn_data_ind ind,
	octetstring		other
} with { variant "" };
type record HNBLLIF_AUDIO_PrimOp_conn_data  {
	HNBLLIF_Operation	op,
	HNBLLIF_AUDIO_PrimOpUnion_conn_data	u
} with { variant (u) "CROSSTAG( req, 	op = HNBLL_IF_OP_REQUEST;
				ind, 	op = HNBLL_IF_OP_INDICATION;
				other,	OTHERWISE)"
};

type union HNBLLIF_AUDIO_PrimUnion {
	HNBLLIF_AUDIO_PrimOp_conn_establish	conn_establish,
	HNBLLIF_AUDIO_PrimOp_conn_release	conn_release,
	HNBLLIF_AUDIO_PrimOp_conn_data		conn_data,
	octetstring		other
} with { variant "" };

type record HNBLLIF_AUDIO_PrimHdr  {
	HNBLLIF_AUDIO_MsgType	prim,
	HNBLLIF_AUDIO_PrimUnion	u
} with { variant (u) "CROSSTAG( conn_establish,	prim = HNBLL_IF_AUDIO_MSG_CONN_ESTABLISH;
				conn_release,	prim = HNBLL_IF_AUDIO_MSG_CONN_RELEASE;
				conn_data,	prim = HNBLL_IF_AUDIO_MSG_CONN_DATA;
				other,	OTHERWISE)"
};


/**********************
* General
**********************/

type enumerated HNBLLIF_AddrType {
	HNBLL_IF_ADDR_TYPE_UNSPEC	('00'O),
	HNBLL_IF_ADDR_TYPE_IPV4		('01'O),
	HNBLL_IF_ADDR_TYPE_IPV6		('02'O)
} with { variant "FIELDLENGTH(8)" };
type octetstring HNBLLIF_Addr length(16);

type enumerated HNBLLIF_Sapi {
	HNBLL_IF_SAPI_CTL		(-1),
	HNBLL_IF_SAPI_IUH		('00000001'O),
	//HNBLL_IF_SAPI_GTP		('00000002'O),
	HNBLL_IF_SAPI_AUDIO		('00000003'O)
} with { variant "FIELDLENGTH(32)"
	 variant "COMP(2scompl)"
};

type enumerated HNBLLIF_Operation {
	HNBLL_IF_OP_REQUEST	('0000'O),
	HNBLL_IF_OP_RESPONSE	('0001'O),
	HNBLL_IF_OP_INDICATION	('0002'O),
	HNBLL_IF_OP_CONFIRM	('0003'O)
} with { variant "FIELDLENGTH(16)" };

type union HNBLLIF_SapiUnion {
	HNBLLIF_CTL_PrimHdr		ctl,
	HNBLLIF_IUH_PrimHdr		iuh,
	HNBLLIF_AUDIO_PrimHdr		audio,
	octetstring			other
} with { variant "" };

type record HNBLLIF_Message {
	HNBLLIF_Sapi sapi,
	HNBLLIF_SapiUnion u
} with { variant (u) "CROSSTAG( ctl, 		sapi = HNBLL_IF_SAPI_CTL;
				iuh, 		sapi = HNBLL_IF_SAPI_IUH;
				audio, 		sapi = HNBLL_IF_SAPI_AUDIO;
				other,	OTHERWISE)"
};

external function enc_HNBLLIF_Message(in HNBLLIF_Message pdu) return octetstring
	with { extension "prototype(convert) encode(RAW)" };
external function dec_HNBLLIF_Message(in octetstring stream) return HNBLLIF_Message
	with { extension "prototype(convert) decode(RAW)" };

function f_HNBLLIF_AF2addr_type(AddressFamily address_family)
return HNBLLIF_AddrType {
	if (address_family == AF_INET) {
		return HNBLL_IF_ADDR_TYPE_IPV4;
	} else if (address_family == AF_INET6) {
		return HNBLL_IF_ADDR_TYPE_IPV6;
	} else {
		return HNBLL_IF_ADDR_TYPE_UNSPEC;
	}
}

function f_HNBLLIF_Addr(HNBLLIF_AddrType addr_type, charstring addr_str)
return HNBLLIF_Addr {
	var HNBLLIF_Addr addr;

	if (addr_type == HNBLL_IF_ADDR_TYPE_IPV4)  {
		addr := f_inet_addr(addr_str);
	} else {
		addr := f_inet6_addr(addr_str);
	}

	return addr;
}


} with { encode "RAW" variant "BYTEORDER(first)" };
