/* 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)"
};


/**********************
* General
**********************/
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,
	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;
				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)" };


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