/* 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 := 10;
};

const charstring PCU_SOCK_DEFAULT := "/tmp/pcu_bts";
type integer PCUIF_Version (9..10); /* 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_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_AGCH_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 "" };

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


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