/* Osmocom PCU Interface Types, as per osmo-pcu/include/osmocom/pcu/pcuif_proto.h
 * (C) 2018-2019 Harald Welte <laforge@gnumonks.org>
 * contributions by Vadim Yanitskiy <axilirator@gmail.com>
 * 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
 */

module PCUIF_Types {

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

modulepar {
	/* PCUIF version supported by the IUT */
	PCUIF_Version mp_pcuif_version := 11;
};

const charstring PCU_SOCK_DEFAULT := "/tmp/pcu_bts";
type integer PCUIF_Version (9..11); /* supported versions */

type enumerated PCUIF_MsgType {
	PCU_IF_MSG_DATA_REQ		('00'O),
	PCU_IF_MSG_DATA_CNF		('01'O),
	PCU_IF_MSG_DATA_IND		('02'O),
	PCU_IF_MSG_SUSP_REQ		('03'O),
	PCU_IF_MSG_APP_INFO_REQ		('04'O),
	PCU_IF_MSG_RTS_REQ		('10'O),
	PCU_IF_MSG_DATA_CNF_DT		('11'O),
	PCU_IF_MSG_RACH_IND		('22'O),
	PCU_IF_MSG_INFO_IND		('32'O),
	PCU_IF_MSG_E1_CCU_IND		('33'O),
	PCU_IF_MSG_ACT_REQ		('40'O),
	PCU_IF_MSG_TIME_IND		('52'O),
	PCU_IF_MSG_INTERF_IND		('53'O),
	PCU_IF_MSG_PAG_REQ		('60'O),
	PCU_IF_MSG_TXT_IND		('70'O),
	PCU_IF_MSG_CONTAINER		('80'O),
	/* Container payload message types: */
	PCU_IF_MSG_NEIGH_ADDR_REQ	('81'O),
	PCU_IF_MSG_NEIGH_ADDR_CNF	('82'O)
} with { variant "FIELDLENGTH(8)" };

type enumerated PCUIF_Sapi {
	PCU_IF_SAPI_UNKNOWN		('00'O),
	PCU_IF_SAPI_RACH		('01'O),
	PCU_IF_SAPI_AGCH		('02'O),
	PCU_IF_SAPI_PCH			('03'O),
	PCU_IF_SAPI_BCCH		('04'O),
	PCU_IF_SAPI_PDTCH		('05'O),
	PCU_IF_SAPI_PRACH		('06'O),
	PCU_IF_SAPI_PTCCH		('07'O),
	PCU_IF_SAPI_PCH_DT		('08'O)
} with { variant "FIELDLENGTH(8)" };

type record PCUIF_Flags {
	boolean		bts_active,
	boolean		sysmo_direct_dsp,
	BIT14		spare,
	boolean		cs1,
	boolean		cs2,
	boolean		cs3,
	boolean		cs4,
	boolean		mcs1,
	boolean		mcs2,
	boolean		mcs3,
	boolean		mcs4,
	boolean		mcs5,
	boolean		mcs6,
	boolean		mcs7,
	boolean		mcs8,
	boolean		mcs9,
	BIT3		spare2
} with { variant "" };

type enumerated PCUIF_TextType {
	PCU_VERSION			(0),
	PCU_OML_ALERT			(1)
} with { variant "FIELDLENGTH(8)" };

type charstring PCUIF_Text length(128) with { variant "FIELDLENGTH(null_terminated)" };

type record PCUIF_txt_ind {
	PCUIF_TextType	txt_type,
	PCUIF_Text	text
} with { variant "" };

type record PCUIF_data {
	PCUIF_Sapi	sapi,
	uint8_t		len,
	octetstring	data length(162),
	uint32_t	fn,
	uint16_t	arfcn,
	uint8_t		trx_nr,
	uint8_t		ts_nr,
	uint8_t		block_nr,
	int8_t		rssi,
	uint16_t	ber10k,
	int16_t		ta_offs_qbits,
	int16_t		lqual_cb
} with { variant (data) "FIELDLENGTH(162), ALIGN(left)" };

type record PCUIF_data_cnf_dt {
	PCUIF_Sapi	sapi,
	OCT4		tlli,
	uint32_t	fn,
	uint16_t	arfcn,
	uint8_t		trx_nr,
	uint8_t		ts_nr,
	uint8_t		block_nr,
	int8_t		rssi,
	uint16_t	ber10k,
	int16_t		ta_offs_qbits,
	int16_t		lqual_cb
} with { variant "" };

type record PCUIF_rts_req {
	PCUIF_Sapi	sapi,
	OCT3		spare,
	uint32_t	fn,
	uint16_t	arfcn,
	uint8_t		trx_nr,
	uint8_t		ts_nr,
	uint8_t		block_nr
} with { variant "" };

type enumerated PCUIF_BurstType {
	BURST_TYPE_NONE	(0),
	BURST_TYPE_0	(1),
	BURST_TYPE_1	(2),
	BURST_TYPE_2	(3)
} with { variant "FIELDLENGTH(8)" };

type record PCUIF_rach_ind {
	PCUIF_Sapi	sapi,
	uint16_t	ra,
	int16_t		qta,
	uint32_t	fn,
	uint16_t	arfcn,
	uint8_t		is_11bit,
	PCUIF_BurstType	burst_type,
	uint8_t		trx_nr,
	uint8_t		ts_nr
} with { variant "" };

type record PCUIF_InfoTrxTs {
	uint8_t			tsc,
	uint8_t			hopping,
	uint8_t			hsn,
	uint8_t			maio,
	uint8_t			ma_bit_len,
	bitstring		ma length(64)
} with { variant (ma) "BYTEORDER(first), BITORDER(msb)" };
private type record length(8) of PCUIF_InfoTrxTs PCUIF_InfoTrxTsList;

private type record PCUIF_InfoTrx {
	uint16_t		arfcn,
	BIT8			pdch_mask,
	OCT1			spare,
	uint32_t		hLayer1,
	PCUIF_InfoTrxTsList	ts
} with { variant (pdch_mask) "BITORDER(msb)" };
type record length(8) of PCUIF_InfoTrx PCUIF_InfoTrxs;

type record PCUIF_info_ind {
	uint32_t	version,
	PCUIF_Flags	flags,
	PCUIF_InfoTrxs	trx,
	uint8_t		bsic,

	uint16_t	mcc,
	uint16_t	mnc,
	uint8_t		mnc_3_digits,
	uint16_t	lac,
	uint16_t	rac,

	uint16_t	nsei,
	record length(7) of uint8_t nse_timer,
	record length(11) of uint8_t cell_timer,

	uint16_t	cell_id,
	uint16_t	repeat_time,
	uint8_t		repeat_count,
	uint16_t	bvci,
	uint8_t		t3142,
	uint8_t		t3169,
	uint8_t		t3191,
	uint8_t		t3193_10ms,
	uint8_t		t3195,
	uint8_t		n3101,
	uint8_t		n3103,
	uint8_t		n3105,
	uint8_t		cv_countdown,
	uint16_t	dl_tbf_ext,
	uint16_t	ul_tbf_ext,
	uint8_t		initial_cs,
	uint8_t		initial_mcs,

	record length(2) of uint16_t	nsvci,
	record length(2) of uint16_t	local_port,
	record length(2) of uint16_t	remote_port,
	PCUIF_RemoteAddr		remote_addr
} with { variant "" };

type enumerated PCUIF_AddrType {
	PCUIF_ADDR_TYPE_UNSPEC		('00'O),
	PCUIF_ADDR_TYPE_IPV4		('04'O),
	PCUIF_ADDR_TYPE_IPV6		('29'O)
} with { variant "FIELDLENGTH(8)" };

type record PCUIF_RemoteAddr {
	record length(2) of PCUIF_AddrType	addr_type,
	record length(2) of octetstring		addr length(16)
} with { variant "" };

/* E1 CCU connection parameters */
type record PCUIF_e1_ccu_ind {
	/* GSM/GPRS air interface */
	uint8_t		trx_nr,
	uint8_t		ts_nr,
	/* E1 line interface */
	uint8_t		e1_nr,
	uint8_t		e1_ts,
	uint8_t		e1_ts_ss
} with { variant "" };

type record PCUIF_act_req {
	uint8_t		is_activate,
	uint8_t		trx_nr,
	uint8_t		ts_nr,
	OCT1		spare
} with { variant "" };

type record PCUIF_time_ind {
	uint32_t	fn
} with { variant "" };

type record length(8) of uint8_t PCUIF_interf;
type record PCUIF_interf_ind {
	uint8_t		trx_nr,
	OCT3		spare,
	uint32_t	fn,
	PCUIF_interf	interf
} with { variant "" };

type record PCUIF_pag_req {
	PCUIF_Sapi	sapi,
	uint8_t		chan_needed,
	OCT9		identity_lv
} with { variant "" };

type record PCUIF_app_info_req {
	uint8_t		application_type,
	uint8_t		len,
	octetstring	data
} with {
	variant (len) "LENGTHTO(data)"
}

type record PCUIF_susp_req {
	OCT4		tlli,
	OCT6		ra_id,
	uint8_t		cause
} with {
	variant (tlli) "BYTEORDER(last)"
};

type record PCUIF_neigh_addr_req {
	uint16_t	local_lac,
	uint16_t	local_ci,
	uint16_t	tgt_arfcn,
	uint8_t		tgt_bsic
} with { variant (local_lac) "BYTEORDER(last)"
	 variant (local_ci) "BYTEORDER(last)"
	 variant (tgt_arfcn) "BYTEORDER(last)" };

type record PCUIF_neigh_addr_cnf {
	PCUIF_neigh_addr_req orig_req,
	uint8_t 	error_code,
	uint16_t	mcc,
	uint16_t	mnc,
	uint8_t		mnc_3_digits,
	uint16_t	lac,
	uint8_t		rac,
	uint16_t	cell_identity
} with { variant (mcc) "BYTEORDER(last)"
	 variant (mnc) "BYTEORDER(last)"
	 variant (lac) "BYTEORDER(last)"
	 variant (cell_identity) "BYTEORDER(last)" };

type union PCUIF_ContainerMsgUnion {
	PCUIF_neigh_addr_req	neigh_addr_req,
	PCUIF_neigh_addr_cnf	neigh_addr_cnf,
	octetstring	other
} with { variant "" };

type record PCUIF_container {
	PCUIF_MsgType	msg_type,
	OCT1		spare,
	uint16_t	len, /* network byte order */
	PCUIF_ContainerMsgUnion	u
} with {
	variant (len) "BYTEORDER(last)"
	variant (len) "LENGTHTO(u)"
	variant (u) "CROSSTAG(
			neigh_addr_req,	msg_type = PCU_IF_MSG_NEIGH_ADDR_REQ;
			neigh_addr_cnf,	msg_type = PCU_IF_MSG_NEIGH_ADDR_CNF;
			other,		OTHERWISE)"
};

/* Record to send a (confirmed) IMMEDIATE ASSIGNMENT message via PCH. The record is sent by the PCU to the BTS as a
 * data request (data_req) under SAPI PCU_IF_SAPI_PCH_DT. */
type record PCUIF_pch_dt {
	OCT4		tlli,
	charstring	imsi length(17),
	octetstring	data length(23)
} with {
	variant (tlli) "BYTEORDER(last)"
	variant (imsi) "FIELDLENGTH(17)"
	variant (data) "FIELDLENGTH(23)"
};

external function enc_PCUIF_pch_dt(in PCUIF_pch_dt pdu) return octetstring
	with { extension "prototype(convert) encode(RAW)" };
external function dec_PCUIF_pch_dt(in octetstring stream) return PCUIF_pch_dt
	with { extension "prototype(convert) decode(RAW)" };

type union PCUIF_MsgUnion {
	PCUIF_data		data_req,
	PCUIF_data		data_cnf,
	PCUIF_data_cnf_dt	data_cnf_dt,
	PCUIF_data		data_ind,
	PCUIF_susp_req		susp_req,
	PCUIF_rts_req		rts_req,
	PCUIF_rach_ind		rach_ind,
	PCUIF_txt_ind		txt_ind,
	PCUIF_info_ind		info_ind,
	PCUIF_e1_ccu_ind	e1_ccu_ind,
	PCUIF_act_req		act_req,
	PCUIF_time_ind		time_ind,
	PCUIF_interf_ind	interf_ind,
	PCUIF_pag_req		pag_req,
	PCUIF_app_info_req	app_info_req,
	PCUIF_container		container
} with { variant "" };

type record PCUIF_Message {
	PCUIF_MsgType	msg_type,
	uint8_t		bts_nr,
	OCT2		spare,
	PCUIF_MsgUnion	u
} with { variant (u) "CROSSTAG(
				data_req, 	msg_type = PCU_IF_MSG_DATA_REQ;
				data_cnf,	msg_type = PCU_IF_MSG_DATA_CNF;
				data_cnf_dt,	msg_type = PCU_IF_MSG_DATA_CNF_DT;
				data_ind,	msg_type = PCU_IF_MSG_DATA_IND;
				susp_req,	msg_type = PCU_IF_MSG_SUSP_REQ;
				rts_req,	msg_type = PCU_IF_MSG_RTS_REQ;
				rach_ind,	msg_type = PCU_IF_MSG_RACH_IND;
				txt_ind,	msg_type = PCU_IF_MSG_TXT_IND;
				info_ind,	msg_type = PCU_IF_MSG_INFO_IND;
				e1_ccu_ind,	msg_type = PCU_IF_MSG_E1_CCU_IND;
				act_req,	msg_type = PCU_IF_MSG_ACT_REQ;
				time_ind,	msg_type = PCU_IF_MSG_TIME_IND;
				interf_ind,	msg_type = PCU_IF_MSG_INTERF_IND;
				pag_req,	msg_type = PCU_IF_MSG_PAG_REQ;
				app_info_req,	msg_type = PCU_IF_MSG_APP_INFO_REQ;
				container,	msg_type = PCU_IF_MSG_CONTAINER)"
	/* PCUIFv10: 1006 * 8 = 8048 bits */
	variant "PADDING(8048)"
};

external function enc_PCUIF_Message(in PCUIF_Message pdu) return octetstring
	with { extension "prototype(convert) encode(RAW)" };
external function dec_PCUIF_Message(in octetstring stream) return PCUIF_Message
	with { extension "prototype(convert) decode(RAW)" };

/* Generic template for matching messages by type and/or the BTS number */
template PCUIF_Message tr_PCUIF_MSG(template PCUIF_MsgType msg_type := ?,
				    template uint8_t bts_nr := ?) := {
	msg_type := msg_type,
	bts_nr := bts_nr,
	spare := ?,
	u := ?
}

template (value) PCUIF_Message ts_PCUIF_RTS_REQ(template (value) uint8_t bts_nr,
						template (value) uint8_t trx_nr,
						template (value) uint8_t ts_nr,
						template (value) PCUIF_Sapi sapi,
						template (value) uint32_t fn,
						template (value) uint16_t arfcn,
						template (value) uint8_t block_nr
					) := {
	msg_type := PCU_IF_MSG_RTS_REQ,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		rts_req := {
			sapi := sapi,
			spare := '000000'O,
			fn := fn,
			arfcn := arfcn,
			trx_nr := trx_nr,
			ts_nr := ts_nr,
			block_nr := block_nr
		}
	}
}
template PCUIF_Message tr_PCUIF_RTS_REQ(template uint8_t bts_nr := ?,
					template uint8_t trx_nr := ?,
					template uint8_t ts_nr := ?,
					template PCUIF_Sapi sapi := ?,
					template uint32_t fn := ?,
					template uint8_t block_nr := ?
					) := {
	msg_type := PCU_IF_MSG_RTS_REQ,
	bts_nr := bts_nr,
	spare := ?,
	u := {
		rts_req := {
			sapi := sapi,
			spare := ?,
			fn := fn,
			arfcn := ?,
			trx_nr := trx_nr,
			ts_nr := ts_nr,
			block_nr := block_nr
		}
	}
}

template (value) PCUIF_Message ts_PCUIF_TXT_IND(uint8_t bts_nr, PCUIF_TextType tt, charstring text) := {
	msg_type := PCU_IF_MSG_TXT_IND,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		txt_ind := {
			txt_type := tt,
			text := text
		}
	}
}
template PCUIF_Message tr_PCUIF_TXT_IND(template uint8_t bts_nr, template PCUIF_TextType tt,
					template charstring text := ?) := {
	msg_type := PCU_IF_MSG_TXT_IND,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		txt_ind := {
			txt_type := tt,
			text := text
		}
	}
}



template (value) PCUIF_Message ts_PCUIF_ACT_REQ(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr) := {
	msg_type := PCU_IF_MSG_ACT_REQ,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		act_req := {
			is_activate := 1,
			trx_nr := trx_nr,
			ts_nr := ts_nr,
			spare := '00'O
		}
	}
}
template PCUIF_Message tr_PCUIF_ACT_REQ(template uint8_t bts_nr, template uint8_t trx_nr,
					template uint8_t ts_nr) := {
	msg_type := PCU_IF_MSG_ACT_REQ,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		act_req := {
			is_activate := 1,
			trx_nr := trx_nr,
			ts_nr := ts_nr,
			spare := '00'O
		}
	}
}

template (value) PCUIF_Message ts_PCUIF_DEACT_REQ(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr) := {
	msg_type := PCU_IF_MSG_ACT_REQ,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		act_req := {
			is_activate := 0,
			trx_nr := trx_nr,
			ts_nr := ts_nr,
			spare := '00'O
		}
	}
}
template PCUIF_Message tr_PCUIF_DEACT_REQ(template uint8_t bts_nr, template uint8_t trx_nr,
					  template uint8_t ts_nr) := {
	msg_type := PCU_IF_MSG_ACT_REQ,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		act_req := {
			is_activate := 0,
			trx_nr := trx_nr,
			ts_nr := ts_nr,
			spare := '00'O
		}
	}
}

template (value) PCUIF_Message ts_PCUIF_DATA_IND(template (value) uint8_t bts_nr,
						 template (value) uint8_t trx_nr,
						 template (value) uint8_t ts_nr,
						 template (value) uint8_t block_nr,
						 template (value) PCUIF_Sapi sapi,
						 template (value) octetstring data,
						 template (value) uint32_t fn,
						 template (value) uint16_t arfcn,
						 template (value) int8_t rssi := -80,
						 template (value) uint16_t ber10k := 0,
						 template (value) int16_t ta_offs_qbits := 0,
						 template (value) int16_t lqual_cb := 10) := {
	msg_type := PCU_IF_MSG_DATA_IND,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		data_ind := {
			sapi := sapi,
			len := lengthof(valueof(data)),
			data := data,
			fn := fn,
			arfcn := arfcn,
			trx_nr := trx_nr,
			ts_nr := ts_nr,
			block_nr := block_nr,
			rssi := rssi,
			ber10k := ber10k,
			ta_offs_qbits := ta_offs_qbits,
			lqual_cb := lqual_cb
		}
	}
}
template PCUIF_Message tr_PCUIF_DATA_IND(template uint8_t bts_nr := ?,
					 template uint8_t trx_nr := ?,
					 template uint8_t ts_nr := ?,
					 template uint8_t block_nr := ?,
					 template PCUIF_Sapi sapi := ?,
					 template octetstring data := ?) := {
	msg_type := PCU_IF_MSG_DATA_IND,
	bts_nr := bts_nr,
	spare := ?,
	u := {
		data_ind := {
			sapi := sapi,
			len := ?,
			data := data,
			fn := ?,
			arfcn := ?,
			trx_nr := trx_nr,
			ts_nr := ts_nr,
			block_nr := block_nr,
			rssi := ?,
			ber10k := ?,
			ta_offs_qbits := ?,
			lqual_cb := ?
		}
	}
}

template PCUIF_data tr_PCUIF_DATA(template uint8_t trx_nr,
				  template uint8_t ts_nr,
				  template uint8_t block_nr := ?,
				  template uint32_t fn := ?,
				  template PCUIF_Sapi sapi := ?,
				  template octetstring data := ?) := {
	sapi := sapi,
	len := ?,
	data := data,
	fn := fn,
	arfcn := ?, /* unused in BTS */
	trx_nr := trx_nr,
	ts_nr := ts_nr,
	block_nr := block_nr,
	/* measurement parameters below unused on Tx */
	rssi := 0,
	ber10k := 0,
	ta_offs_qbits := 0,
	lqual_cb := 0

}

template (value) PCUIF_Message ts_PCUIF_DATA_REQ(uint8_t bts_nr, uint8_t trx_nr,
						 uint8_t ts_nr, uint8_t block_nr,
						 uint32_t fn, PCUIF_Sapi sapi,
						 octetstring data) := {
	msg_type := PCU_IF_MSG_DATA_REQ,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		data_req := {
			sapi := sapi,
			len := lengthof(data),
			data := data,
			fn := fn,
			arfcn := 0, /* unused in BTS */
			trx_nr := trx_nr,
			ts_nr := ts_nr,
			block_nr := block_nr,
			/* measurement parameters below unused on Tx */
			rssi := 0,
			ber10k := 0,
			ta_offs_qbits := 0,
			lqual_cb := 0
		}
	}
}
template PCUIF_Message tr_PCUIF_DATA_REQ(template uint8_t bts_nr,
					 template uint8_t trx_nr,
					 template uint8_t ts_nr,
					 template uint8_t block_nr := ?,
					 template uint32_t fn := ?,
					 template PCUIF_Sapi sapi := ?,
					 template octetstring data := ?) := {
	msg_type := PCU_IF_MSG_DATA_REQ,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		data_req := tr_PCUIF_DATA(trx_nr, ts_nr, block_nr, fn, sapi, data)
	}
}

template (value) PCUIF_Message ts_PCUIF_DATA_CNF(template (value) uint8_t bts_nr,
						 template (value) uint8_t trx_nr,
						 template (value) uint8_t ts_nr,
						 template (value) uint8_t block_nr,
						 template (value) uint32_t fn,
						 template (value) uint16_t arfcn,
						 template (value) PCUIF_Sapi sapi,
						 template (value) octetstring data) := {
	msg_type := PCU_IF_MSG_DATA_CNF,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		data_cnf := {
			sapi := sapi,
			len := 0, /* overwritten */
			data := data,
			fn := fn,
			arfcn := arfcn,
			trx_nr := trx_nr,
			ts_nr := ts_nr,
			block_nr := block_nr,
			rssi := 0,
			ber10k := 0,
			ta_offs_qbits := 0,
			lqual_cb := 0
		}
	}
}
template PCUIF_Message tr_PCUIF_DATA_CNF(template uint8_t bts_nr := ?,
					 template uint8_t trx_nr := ?,
					 template uint8_t ts_nr := ?,
					 template PCUIF_Sapi sapi := ?,
					 template octetstring data := ?) := {
	msg_type := PCU_IF_MSG_DATA_CNF,
	bts_nr := bts_nr,
	spare := ?,
	u := {
		data_cnf := {
			sapi := sapi,
			len := ?,
			data := data,
			fn := ?,
			arfcn := ?,
			trx_nr := trx_nr,
			ts_nr := ts_nr,
			block_nr := ?,
			rssi := ?,
			ber10k := ?,
			ta_offs_qbits := ?,
			lqual_cb := ?
		}
	}
}

template (value) PCUIF_Message ts_PCUIF_DATA_CNF_DT(template (value) uint8_t bts_nr,
						    template (value) uint8_t trx_nr,
						    template (value) uint8_t ts_nr,
						    template (value) uint8_t block_nr,
						    template (value) uint32_t fn,
						    template (value) uint16_t arfcn,
						    template (value) PCUIF_Sapi sapi,
						    template (value) OCT4 tlli) := {
	msg_type := PCU_IF_MSG_DATA_CNF_DT,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		data_cnf_dt := {
			sapi := sapi,
			tlli := tlli,
			fn := fn,
			arfcn := arfcn,
			trx_nr := trx_nr,
			ts_nr := ts_nr,
			block_nr := block_nr,
			rssi := 0,
			ber10k := 0,
			ta_offs_qbits := 0,
			lqual_cb := 0
		}
	}
}
template PCUIF_Message tr_PCUIF_DATA_CNF_DT(template uint8_t bts_nr := ?,
					    template uint8_t trx_nr := ?,
					    template uint8_t ts_nr := ?,
					    template PCUIF_Sapi sapi := ?,
					    template OCT4 tlli := ?) := {
	msg_type := PCU_IF_MSG_DATA_CNF_DT,
	bts_nr := bts_nr,
	spare := ?,
	u := {
		data_cnf_dt := {
			sapi := sapi,
			tlli := tlli,
			fn := ?,
			arfcn := ?,
			trx_nr := trx_nr,
			ts_nr := ts_nr,
			block_nr := ?,
			rssi := ?,
			ber10k := ?,
			ta_offs_qbits := ?,
			lqual_cb := ?
		}
	}
}

template (value) PCUIF_Message ts_PCUIF_RACH_IND(template (value) uint8_t bts_nr,
						 template (value) uint8_t trx_nr,
						 template (value) uint8_t ts_nr,
						 template (value) uint16_t ra,
						 template (value) uint8_t is_11bit,
						 template (value) PCUIF_BurstType burst_type,
						 template (value) uint32_t fn,
						 template (value) uint16_t arfcn,
						 template (value) int16_t qta := 0,
						 template (value) PCUIF_Sapi sapi := PCU_IF_SAPI_RACH
) := {
	msg_type := PCU_IF_MSG_RACH_IND,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		rach_ind := {
			sapi := sapi,
			ra := ra,
			qta := qta,
			fn := fn,
			arfcn := arfcn,
			is_11bit := is_11bit,
			burst_type := burst_type,
			trx_nr := trx_nr,
			ts_nr := ts_nr
		}
	}
}
template PCUIF_Message tr_PCUIF_RACH_IND(template uint8_t bts_nr := ?,
					 template uint8_t trx_nr := ?,
					 template uint8_t ts_nr := ?,
					 template uint16_t ra := ?,
					 template uint8_t is_11bit := ?,
					 template PCUIF_BurstType burst_type := ?,
					 template uint32_t fn := ?,
					 template PCUIF_Sapi sapi := PCU_IF_SAPI_RACH) := {
	msg_type := PCU_IF_MSG_RACH_IND,
	bts_nr := bts_nr,
	spare := ?,
	u := {
		rach_ind := {
			sapi := sapi,
			ra := ra,
			qta := ?,
			fn := fn,
			arfcn := ?,
			is_11bit := is_11bit,
			burst_type := burst_type,
			trx_nr := trx_nr,
			ts_nr := ts_nr
		}
	}
}

template (value) PCUIF_Message ts_PCUIF_PAG_REQ(template (value) uint8_t bts_nr,
						template (value) OCT9 id_lv,
						template (value) uint8_t chan_needed,
						template (value) PCUIF_Sapi sapi) := {
	msg_type := PCU_IF_MSG_PAG_REQ,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		pag_req := {
			sapi := sapi,
			chan_needed := chan_needed,
			identity_lv := id_lv
		}
	}
}
template PCUIF_Message tr_PCUIF_PAG_REQ(template uint8_t bts_nr := ?,
					 template OCT9 id_lv := ?,
					 template uint8_t chan_needed := ?,
					 template PCUIF_Sapi sapi := ?) := {
	msg_type := PCU_IF_MSG_PAG_REQ,
	bts_nr := bts_nr,
	spare := ?,
	u := {
		pag_req := {
			sapi := ?,
			chan_needed := chan_needed,
			identity_lv := id_lv
		}
	}
}

const PCUIF_Flags c_PCUIF_Flags_default := {
	bts_active := true,
	sysmo_direct_dsp := false,
	spare := '00000000000000'B,
	cs1 := true,
	cs2 := true,
	cs3 := true,
	cs4 := true,
	mcs1 := true,
	mcs2 := true,
	mcs3 := true,
	mcs4 := true,
	mcs5 := true,
	mcs6 := true,
	mcs7 := true,
	mcs8 := true,
	mcs9 := true,
	spare2 := '000'B
};

const PCUIF_Flags c_PCUIF_Flags_noMCS := {
	bts_active := true,
	sysmo_direct_dsp := false,
	spare := '00000000000000'B,
	cs1 := true,
	cs2 := true,
	cs3 := true,
	cs4 := true,
	mcs1 := false,
	mcs2 := false,
	mcs3 := false,
	mcs4 := false,
	mcs5 := false,
	mcs6 := false,
	mcs7 := false,
	mcs8 := false,
	mcs9 := false,
	spare2 := '000'B
};

function f_pcuif_ind_flags_egprs_enabled(PCUIF_Flags flags) return boolean {
	return flags.mcs1 or flags.mcs2 or flags.mcs3 or flags.mcs4 or
	       flags.mcs5 or flags.mcs6 or flags.mcs7 or flags.mcs8 or
	       flags.mcs9;
}

template (value) PCUIF_InfoTrxTs ts_PCUIF_InfoTrxTsH0(template (value) uint3_t tsc := 7) := {
	tsc := tsc,
	hopping := 0,
	hsn := 0, maio := 0,
	ma_bit_len := 0,
	ma := f_pad_bit(''B, 64, '0'B)
};
template PCUIF_InfoTrxTs tr_PCUIF_InfoTrxTsH0(template uint3_t tsc := ?) := {
	tsc := tsc,
	hopping := 0,
	hsn := ?, maio := ?,
	ma_bit_len := ?,
	ma := ?
};

template (value) PCUIF_InfoTrxTs ts_PCUIF_InfoTrxTsH1(template (value) uint3_t tsc := 7,
						      template (value) uint6_t hsn := 0,
						      template (value) uint6_t maio := 0,
						      template (value) bitstring ma := ''B) := {
	tsc := tsc,
	hopping := 1,
	hsn := hsn,
	maio := maio,
	ma_bit_len := lengthof(valueof(ma)),
	ma := f_pad_bit(valueof(ma), 64, '0'B)
};
template PCUIF_InfoTrxTs tr_PCUIF_InfoTrxTsH1(template uint3_t tsc := ?,
					      template uint6_t hsn := ?,
					      template uint6_t maio := ?,
					      template bitstring ma := ?,
					      template uint8_t ma_bit_len := ?) := {
	tsc := tsc,
	hopping := 1,
	hsn := hsn,
	maio := maio,
	ma_bit_len := ma_bit_len,
	ma := ma
};

template (value) PCUIF_InfoTrx
ts_PCUIF_InfoTrx(template (value) uint16_t arfcn := 871,
		 template (value) BIT8 pdch_mask := '00000001'B,
		 template (value) uint3_t tsc := 7) := {
	arfcn := arfcn,
	pdch_mask := pdch_mask,
	spare := '00'O,
	hLayer1 := 0,
	ts := {
		ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc),
		ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc),
		ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc),
		ts_PCUIF_InfoTrxTsH0(tsc), ts_PCUIF_InfoTrxTsH0(tsc)
	}
};

template (value) PCUIF_InfoTrxs
ts_PCUIF_InfoTrxs_def(uint16_t base_arfcn) := {
	ts_PCUIF_InfoTrx(arfcn := base_arfcn + 0),
	ts_PCUIF_InfoTrx(arfcn := base_arfcn + 1),
	ts_PCUIF_InfoTrx(arfcn := base_arfcn + 2),
	ts_PCUIF_InfoTrx(arfcn := base_arfcn + 3),
	ts_PCUIF_InfoTrx(arfcn := base_arfcn + 4),
	ts_PCUIF_InfoTrx(arfcn := base_arfcn + 5),
	ts_PCUIF_InfoTrx(arfcn := base_arfcn + 6),
	ts_PCUIF_InfoTrx(arfcn := base_arfcn + 7)
};

template (value) PCUIF_Message ts_PCUIF_INFO_IND(template (value) uint8_t bts_nr,
						 template (value) PCUIF_info_ind info_ind) := {
	msg_type := PCU_IF_MSG_INFO_IND,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		info_ind := info_ind
	}
}
template PCUIF_Message tr_PCUIF_INFO_IND(template uint8_t bts_nr := ?,
					 template PCUIF_Flags flags := ?,
					 template uint32_t version := mp_pcuif_version) := {
	msg_type := PCU_IF_MSG_INFO_IND,
	bts_nr := bts_nr,
	spare := ?,
	u := {
		info_ind := {
			version := version,
			flags := flags,
			trx := ?,
			bsic := ?,
			mcc := ?,
			mnc :=?,
			mnc_3_digits := ?,
			lac := ?,
			rac := ?,
			nsei := ?,
			nse_timer := ?,
			cell_timer := ?,
			cell_id := ?,
			repeat_time := ?,
			repeat_count := ?,
			bvci := ?,
			t3142 := ?,
			t3169 := ?,
			t3191 := ?,
			t3193_10ms := ?,
			t3195 := ?,
			n3101 := ?,
			n3103 := ?,
			n3105 := ?,
			cv_countdown := ?,
			dl_tbf_ext := ?,
			ul_tbf_ext := ?,
			initial_cs := ?,
			initial_mcs := ?,
			nsvci := ?,
			local_port := ?,
			remote_port := ?,
			remote_addr := ?
		}
	}
}

template (value) PCUIF_Message ts_PCUIF_TIME_IND(template (value) uint8_t bts_nr,
						 template (value) uint32_t fn) := {
	msg_type := PCU_IF_MSG_TIME_IND,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		time_ind := {
			fn := fn
		}
	}
}
template PCUIF_Message tr_PCUIF_TIME_IND(template uint8_t bts_nr,
					 template uint32_t fn) := {
	msg_type := PCU_IF_MSG_TIME_IND,
	bts_nr := bts_nr,
	spare := ?,
	u := {
		time_ind := {
			fn := fn
		}
	}
}

template (value) PCUIF_Message
ts_PCUIF_INTERF_IND(template (value) uint8_t bts_nr,
		    template (value) uint8_t trx_nr,
		    template (value) uint32_t fn,
		    template (value) PCUIF_interf interf) := {
	msg_type := PCU_IF_MSG_INTERF_IND,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		interf_ind := {
			trx_nr := trx_nr,
			spare := '000000'O,
			fn := fn,
			interf := interf
		}
	}
}
template PCUIF_Message
tr_PCUIF_INTERF_IND(template (present) uint8_t bts_nr := ?,
		    template (present) uint8_t trx_nr := ?,
		    template (present) uint32_t fn := ?,
		    template (present) PCUIF_interf interf := ?) := {
	msg_type := PCU_IF_MSG_INTERF_IND,
	bts_nr := bts_nr,
	spare := ?,
	u := {
		interf_ind := {
			trx_nr := trx_nr,
			spare := ?,
			fn := fn,
			interf := interf
		}
	}
}

template (value) PCUIF_Message ts_PCUIF_SUSP_REQ(template (value) uint8_t bts_nr,
						 template (value) OCT4 tlli,
						 template (value) OCT6 ra_id,
						 template (value) uint8_t cause) := {
	msg_type := PCU_IF_MSG_SUSP_REQ,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		susp_req := {
			tlli := tlli,
			ra_id := ra_id,
			cause := cause
		}
	}
}
template PCUIF_Message tr_PCUIF_SUSP_REQ(template uint8_t bts_nr,
					 template OCT4 tlli,
					 template OCT6 ra_id,
					 template uint8_t cause) := {
	msg_type := PCU_IF_MSG_SUSP_REQ,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		susp_req := {
			tlli := tlli,
			ra_id := ra_id,
			cause := cause
		}
	}
}

template (value) PCUIF_Message ts_PCUIF_APP_INFO_REQ(template (value) uint8_t bts_nr,
						     template (value) uint8_t app_type,
						     template (value) octetstring app_data) := {
	msg_type := PCU_IF_MSG_APP_INFO_REQ,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		app_info_req := {
			application_type := app_type,
			len := 0, /* overwritten */
			data := app_data
		}
	}
}
template (present) PCUIF_Message tr_PCUIF_APP_INFO_REQ(template (present) uint8_t bts_nr,
						       template (present) uint8_t app_type,
						       template (present) octetstring app_data) := {
	msg_type := PCU_IF_MSG_APP_INFO_REQ,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		app_info_req := {
			application_type := app_type,
			len := ?,
			data := app_data
		}
	}
}


template (value) PCUIF_Message ts_PCUIF_CONTAINER(template (value) uint8_t bts_nr,
						       template (value) PCUIF_container container) := {
	msg_type := PCU_IF_MSG_CONTAINER,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		container := container
	}
}
template (present) PCUIF_Message tr_PCUIF_CONTAINER(template (present) uint8_t bts_nr,
						       template (present) PCUIF_container container) := {
	msg_type := PCU_IF_MSG_CONTAINER,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		container := container
	}
}

template (value) PCUIF_container ts_PCUIF_CONT_OTHER(PCUIF_MsgType msg_type, template (value) octetstring payload) := {
	msg_type := msg_type,
	spare := '00'O,
	len := lengthof(payload),
	u := {
		other := payload
	}
}
template (present) PCUIF_container tr_PCUIF_CONT_OTHER(template (present) PCUIF_MsgType msg_type,
						       template (present) octetstring payload) := {
	msg_type := msg_type,
	spare := '00'O,
	len := ?,
	u := {
		other := payload
	}
}

template (present) PCUIF_container tr_PCUIF_CONT_NEIGH_ADDR_REQ(template (present) uint16_t local_lac := ?,
								template (present) uint16_t local_ci := ?,
								template (present) uint16_t tgt_arfcn := ?,
								template (present) uint8_t tgt_bsic := ?) := {
	msg_type := PCU_IF_MSG_NEIGH_ADDR_REQ,
	spare := '00'O,
	len := ?,
	u := {
		neigh_addr_req := {
			local_lac := local_lac,
			local_ci := local_ci,
			tgt_arfcn := tgt_arfcn,
			tgt_bsic := tgt_bsic
		}
	}
}
template (present) PCUIF_Message tr_PCUIF_NEIGH_ADDR_REQ(template (present) uint8_t bts_nr,
								template (present) uint16_t local_lac := ?,
								template (present) uint16_t local_ci := ?,
								template (present) uint16_t tgt_arfcn := ?,
								template (present) uint8_t tgt_bsic := ?) := {
	msg_type := PCU_IF_MSG_CONTAINER,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		container := tr_PCUIF_CONT_NEIGH_ADDR_REQ(local_lac, local_ci, tgt_arfcn, tgt_bsic)
	}
}

template (value) PCUIF_container ts_PCUIF_CONT_NEIGH_ADDR_CNF(template (value) PCUIF_neigh_addr_req orig_req,
							template (value) uint8_t error_code := 0,
							template (value) uint16_t mcc := 0,
							template (value) uint16_t mnc := 0,
							template (value) uint8_t mnc_3_digits := 0,
							template (value) uint16_t lac := 0,
							template (value) uint8_t rac := 0,
							template (value) uint16_t cell_identity := 0) := {
	msg_type := PCU_IF_MSG_NEIGH_ADDR_CNF,
	spare := '00'O,
	len := 0, /* overwritten */
	u := {
		neigh_addr_cnf := {
			orig_req := orig_req,
			error_code := error_code,
			mcc := mcc,
			mnc := mnc,
			mnc_3_digits := mnc_3_digits,
			lac := lac,
			rac := rac,
			cell_identity := cell_identity
		}
	}
}
template (value) PCUIF_Message ts_PCUIF_NEIGH_ADDR_CNF(template (value) uint8_t bts_nr,
							template (value) PCUIF_neigh_addr_req orig_req,
							template (value) uint8_t error_code := 0,
							template (value) uint16_t mcc := 0,
							template (value) uint16_t mnc := 0,
							template (value) uint8_t mnc_3_digits := 0,
							template (value) uint16_t lac := 0,
							template (value) uint8_t rac := 0,
							template (value) uint16_t cell_identity := 0) := {
	msg_type := PCU_IF_MSG_CONTAINER,
	bts_nr := bts_nr,
	spare := '0000'O,
	u := {
		container := ts_PCUIF_CONT_NEIGH_ADDR_CNF(orig_req, error_code, mcc, mnc, mnc_3_digits,
							  lac, rac, cell_identity)
	}
}

function f_PCUIF_PDCHMask_set(inout PCUIF_info_ind info, BIT8 pdch_mask,
			      template (present) uint8_t trx_nr := ?)
{
	for (var integer nr := 0; nr < lengthof(info.trx); nr := nr + 1) {
		if (match(nr, trx_nr)) {
			info.trx[nr].pdch_mask := pdch_mask;
		}
	}
}

function f_PCUIF_AF2addr_type(AddressFamily address_family)
return PCUIF_AddrType {
	if (address_family == AF_INET) {
		return PCUIF_ADDR_TYPE_IPV4;
	} else if (address_family == AF_INET6) {
		return PCUIF_ADDR_TYPE_IPV6;
	} else {
		return PCUIF_ADDR_TYPE_UNSPEC;
	}
}

/* TODO: second (redundant) NSVC connection is not (yet) supported */
function f_PCUIF_RemoteAddr(PCUIF_AddrType addr_type,
			    charstring addr_str)
return PCUIF_RemoteAddr {
	var PCUIF_RemoteAddr remote_addr;

	remote_addr.addr_type[0] := addr_type;
	if (addr_type == PCUIF_ADDR_TYPE_IPV4)  {
		remote_addr.addr[0] := f_inet_addr(addr_str);
	} else {
		remote_addr.addr[0] := f_inet6_addr(addr_str);
	}

	remote_addr.addr_type[1] := PCUIF_ADDR_TYPE_UNSPEC;
	remote_addr.addr[1] := f_pad_oct(''O, 16, '00'O);

	return remote_addr;
}


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