/* GPRS RLC/MAC Control Messages as per 3GPP TS 44.060 manually transcribed from the CSN.1 syntax, as no CSN.1
 * tool for Eclipse TITAN could be found.  Implements only the minimum necessary messages for Osmocom teseting
 * purposes.
 * (C) 2017 by Harald Welte <laforge@gnumonks.org> */
module RLCMAC_CSN1_Types {
	import from General_Types all;
	import from Osmocom_Types all;
	import from GSM_Types all;

	/* TS 44.060 11.2.0.1 */
	type enumerated RlcmacDlCtrlMsgType {
		PACKET_ACCESS_REJECT		('100001'B),
		PACKET_CELL_CHANGE_ORDER	('000001'B),
		PACKET_DL_ASSIGNMENT		('000010'B),
		PACKET_MEASUREMENT_ORDER	('000011'B),
		PACKET_PAGING_REQUEST		('100010'B),
		PACKET_PDCH_RELEASE		('100011'B),
		PACKET_POLLING_REQUEST		('000100'B),
		/* TODO */
		PACKET_TBF_RELEASE		('001000'B),
		PACKET_UL_ACK_NACK		('001001'B),
		PACKET_UL_ASSIGNMENT		('001010'B),
		PACKET_DL_DUMMY_CTRL		('100101'B)
	} with { variant "FIELDLENGTH(6)" };

	/* TS 44.060 11.2.0.2 */
	type enumerated RlcmacUlCtrlMsgType {
		PACKET_CELL_CHANGE_FEATURE	('000000'B),
		PACKET_CONTROL_ACK		('000001'B),
		PACKET_DL_ACK_NACK		('000010'B),
		PACKET_UL_DUMMY_CTRL		('000011'B),
		PACKET_MEASUREMENT_REPORT	('000100'B),
		PACKET_ENH_MEASUREMENT_REPORT	('001010'B),
		PACKET_RESOURCE_REQUEST		('000101'B),
		PACKET_MOBILE_TBF_STATUS	('000110'B),
		PACKET_PSI_STATUS		('000111'B),
		PACKET_EGPRS_DL_ACK_NACK	('001000'B),
		PACKET_PAUSE			('001001'B),
		ADDITIONAL_MS_RA_CAPABILITIES	('001011'B),
		PACKET_CELL_CANGE_NOTIFICATION	('001100'B),
		PACKET_SI_STATUS		('001101'B),
		PACKET_CS_REQUEST		('001110'B),
		MBMS_SERVICE_REQUEST		('001111'B),
		MBMS_DL_ACK_NACK		('010000'B)
	} with { variant "FIELDLENGTH(6)" };

	type record NullGlobalTfi {
		BIT1			presence ('0'B),
		GlobalTfi		global_tfi
	} with { variant "" };

	type record TenTlli {
		BIT2			presence ('10'B),
		GprsTlli		tlli
	} with { variant ""
		variant (tlli) "BYTEORDER(first)"
	};

	type union GlobalTfiOrTlli {
		NullGlobalTfi		global_tfi,
		TenTlli			tlli
	};

	/* 11.2.7 Packet Downlink Assignment */
	type record PacketDlAssignment {
		PageMode		page_mode,
		BIT1			pres1,
		PersistenceLevels	persistence_levels optional,
		GlobalTfiOrTlli		tfi_or_tlli
		/* TODO */
	} with {
		variant (persistence_levels) "PRESENCE(pres1 = '1'B)"
	};

	/* 11.2.29 Packet Uplink Assignment */
	type record O_Gtfi {
		BIT1			presence ('0'B),
		GlobalTfi		global_tfi
	} with { variant "" };
	type record IO_Tlli {
		BIT2			presence ('10'B),
		GprsTlli		tlli
	} with { variant ""
		variant (tlli) "BYTEORDER(first)"
	};
	type record IIO_Tqi {
		BIT3			presence ('110'B),
		PacketRequestReference	pkt_req_ref
	} with { variant "" };
	type union PktUlAssUnion {
		O_Gtfi			global_tfi,
		IO_Tlli			tlli,
		IIO_Tqi			tqi
	} with {
		variant "TAG(global_tfi, presence = '0'B;
			     tlli, presence = '10'B;
			     tqi, presence = '110'B)"
	};
	type record DynamicAllocation {
		BIT1			extd_dyn_alloc,
		BIT1			p0_present,
		uint4_t			p0 optional,
		BIT1			pr_mode optional,
		BIT1			usf_granularity,
		BIT1			ul_tfi_ass_present,
		uint5_t			ul_tfi_assignment optional,
		BIT1			reserved ('0'B),
		BIT1			tbf_starting_time_present,
		StartingFnDesc		tbf_starting_time optional,
		TsAllocationUnion	ts_allocation
	} with {
		variant (p0)		"PRESENCE(p0_present = '1'B)"
		variant (pr_mode)	"PRESENCE(p0_present = '1'B)"
		variant (ul_tfi_assignment) "PRESENCE(ul_tfi_ass_present = '1'B)"
		variant (tbf_starting_time) "PRESENCE(tbf_starting_time_present = '1'B)"
	};
	type record TsAllocationTs {
		BIT1			presence,
		uint3_t			usf_tn optional
	} with {
		variant (usf_tn) "PRESENCE(presence = '1'B)"
	};
	type record length(8) of TsAllocationTs TsAllocationTsArr;
	type record TnGamma {
		BIT1			presence,
		uint3_t			usf_tn optional,
		uint5_t			gamma_tn optional
	} with {
		variant (usf_tn)	"PRESENCE(presence = '1'B)"
		variant (gamma_tn)	"PRESENCE(presence = '1'B)"
	};
	type record length(8) of TnGamma TnGamma8;
	type record TsAllocationPwr {
		uint4_t			alpha,
		TnGamma			tn_gamma
	} with { variant "" };
	type record TsAllocationUnion {
		BIT1			presence,
		TsAllocationTsArr	ts optional,
		TsAllocationPwr	ts_with_pwr optional
	} with {
		variant (ts)		"PRESENCE(presence = '0'B)"
		variant (ts_with_pwr)	"PRESENCE(presence = '1'B)"
	};
	type record SingleBlockAllocation {
		uint3_t			timeslot_nr,
		BIT1			alpha_present,
		uint4_t			alpha optional,
		uint5_t			gamma_tn,
		BIT1			p0_present,
		uint4_t			p0 optional,
		BIT1			reserved ('0'B) optional,
		BIT1			pr_mode optional,
		StartingFnDesc		tbf_starting_time
	} with {
		variant (alpha)		"PRESENCE(alpha_present = '1'B)"
		variant (p0)		"PRESENCE(p0_present = '1'B)"
		variant (reserved)	"PRESENCE(p0_present = '1'B)"
		variant (pr_mode)	"PRESENCE(p0_present = '1'B)"
	};
	type record PktUlAssGprs {
		ChCodingCommand		ch_coding_cmd,
		BIT1			tlli_block_chan_coding,
		PacketTimingAdvance	pkt_ta,
		BIT1			freq_par_present,
		FrequencyParameters	freq_par optional,
		BIT2			alloc_present,
		DynamicAllocation	dyn_block_alloc optional,
		SingleBlockAllocation	sgl_block_alloc optional
	} with {
		variant (freq_par) "PRESENCE(freq_par_present = '1'B)"
		variant (dyn_block_alloc) "PRESENCE(alloc_present = '01'B)"
		variant (sgl_block_alloc) "PRESENCE(alloc_present = '10'B)"
	};
	type record PacketUlAssignment {
		PageMode		page_mode,
		BIT1			persistence_levels_present,
		PersistenceLevels	persistence_levels optional,
		PktUlAssUnion		identity,
		BIT1			is_egprs,	/* msg escape */
		PktUlAssGprs		gprs optional
	} with {
		variant (persistence_levels) "PRESENCE(persistence_levels_present = '1'B)"
		variant (gprs) "PRESENCE(is_egprs = '0'B)"
	};

	/* 11.2.10 Packet Paging Request */
	type record MobileIdentityLV {
		uint4_t			len,
		octetstring		mobile_id
	} with { variant (len) "LENGTHTO(mobile_id)" };
	type record PageInfoPs {
		BIT1			presence ('0'B),
		BIT1			ptmsi_or_mobile_id,
		GsmTmsi			ptmsi optional,
		MobileIdentityLV	mobile_identity optional
	} with {
		variant (ptmsi) "PRESENCE(ptmsi_or_mobile_id = '0'B)"
		variant (mobile_identity) "PRESENCE(ptmsi_or_mobile_id = '1'B)"
	};
	type record PageInfoCs {
		BIT1			presence ('1'B),
		BIT1			tmsi_or_mobile_id,
		GsmTmsi			tmsi optional,
		MobileIdentityLV	mobile_identity optional,
		ChannelNeeded		chan_needed,
		BIT1			emlpp_prio_present,
		uint3_t			emlpp_prio optional
	} with {
		variant (tmsi) "PRESENCE(tmsi_or_mobile_id = '0'B)"
		variant (mobile_identity) "PRESENCE(tmsi_or_mobile_id = '1'B)"
		variant (emlpp_prio) "PRESENCE(emlpp_prio_present = '1'B)"
	};
	type union PageInfo {
		PageInfoPs		ps,
		PageInfoCs		cs
	};
	type record PacketPagingReq {
		PageMode		page_mode,
		BIT1			persistence_levels_present,
		PersistenceLevels	persistence_levels optional,
		BIT1			nln_present,
		uint2_t			nln optional
		/* TODO: Repeated PageInfo */
	} with {
		variant (persistence_levels) "PRESENCE(persistence_levels_present = '1'B)"
		variant (nln) "PRESENCE(nln_present = '1'B)"
	};

	/* 11.2.28 Uplink Ack/Nack */
	type enumerated ChCodingCommand {
		CH_CODING_CS1		('00'B),
		CH_CODING_CS2		('01'B),
		CH_CODING_CS3		('10'B),
		CH_CODING_CS4		('11'B)
	} with { variant "FIELDLENGTH(2)" };
	type record UlAckNackGprs {
		ChCodingCommand		ch_coding_cmd,
		AckNackDescription	ack_nack_desc,
		BIT1			cont_res_tlli_present,
		GprsTlli		cont_res_tlli optional,
		BIT1			pkt_ta_present,
		PacketTimingAdvance	pkt_ta optional,
		BIT1			pwr_ctrl_present,
		PowerControlParameters	pwr_ctrl optional
		/* TODO: Extension Bits, Rel5 ,... */
	} with {
		variant (cont_res_tlli)	"PRESENCE(cont_res_tlli_present = '1'B)"
		variant (pkt_ta)	"PRESENCE(pkt_ta_present = '1'B)"
		variant (pwr_ctrl)	"PRESENCE(pwr_ctrl_present = '1'B)"
		variant (cont_res_tlli) "BYTEORDER(first)"
	};
	type record PacketUlAckNack {
		PageMode		page_mode,
		BIT2			msg_excape ('00'B),
		uint5_t			uplink_tfi,
		BIT1			is_egprs ('0'B),	/* msg escape */
		UlAckNackGprs		gprs optional
		/* TODO: EGPRS */
	} with { variant (gprs) "PRESENCE(is_egprs = '0'B)" };

	/* 11.2.8 Packet Downlink Dummy Control Block */
	type record PacketDlDummy {
		PageMode		page_mode,
		BIT1			persistence_levels_present,
		PersistenceLevels	persistence_levels optional
	} with {
		variant (persistence_levels) "PRESENCE(persistence_levels_present = '1'B)"
	};

	/* 11.2.0.1 */
	type union RlcmacDlCtrlUnion {
		PacketDlAssignment	dl_assignment,
		PacketUlAssignment	ul_assignment,
		PacketPagingReq		paging,
		PacketUlAckNack		ul_ack_nack,
		PacketDlDummy		dl_dummy,
		octetstring		other
	} with { variant "" };

	type record RlcmacDlCtrlMsg {
		RlcmacDlCtrlMsgType	msg_type,
		RlcmacDlCtrlUnion	u
	} with {
		variant (u) "CROSSTAG(dl_assignment,	msg_type = PACKET_DL_ASSIGNMENT;
				      ul_assignment,	msg_type = PACKET_UL_ASSIGNMENT;
				      paging,		msg_type = PACKET_PAGING_REQUEST;
				      ul_ack_nack,	msg_type = PACKET_UL_ACK_NACK;
				      dl_dummy,		msg_type = PACKET_DL_DUMMY_CTRL;
				      other,		OTHERWISE
			)"
	};

	external function enc_RlcmacDlCtrlMsg(in RlcmacDlCtrlMsg si) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	external function dec_RlcmacDlCtrlMsg(in octetstring stream) return RlcmacDlCtrlMsg
		with { extension "prototype(convert) decode(RAW)" };


	/* 11.2.6 Packet Downlikn Ack/Nack */
	type record ILevel {
		BIT1	presence,
		uint4_t	i_level optional
	} with { variant (i_level) "PRESENCE(presence = '1'B)" };
	type record length(8) of ILevel ILevels;
	type record ChannelQualityReport {
		uint6_t			c_value,
		uint3_t			rxqual,
		uint6_t			sign_var,
		ILevels			i_levels
	} with { variant "" };
	type record PacketDlAckNack {
		uint5_t			dl_tfi,
		AckNackDescription	ack_nack_desc,
		BIT1			chreq_desc_presence,
		ChannelReqDescription	chreq_desc optional,
		ChannelQualityReport	ch_qual_rep
	} with { variant "" };

	/* 11.2.2 Packet Control Acknowledgement */
	type enumerated CtrlAck {
		MS_RCVD_TWO_RLC_SAME_RTI_DIFF_RBSN_NEW_TFI	('00'B),
		MS_RCVD_RBSN1_NO_RBSN0				('01'B),
		MS_RCVD_RBSN0_NO_RBSN1				('10'B),
		MS_RCVD_TWO_RLC_SAME_RTI_DIFF_RBSN		('11'B)
	} with { variant "FIELDLENGTH(2)" };
	type record PacketCtrlAck {
		GprsTlli		tlli,
		CtrlAck			ctrl_ack
		/* TODO: Rel5 additions */
	} with { variant ""
		variant (tlli) "BYTEORDER(first)"
	};

	/* 1.2.8b Packet Uplink Dummy Control Block */
	type record PacketUlDummy {
		GprsTlli		tlli
	} with { variant ""
		variant (tlli) "BYTEORDER(first)"
	};

	/* 11.2.0.2 */
	type union RlcmacUlCtrlUnion {
		PacketCtrlAck		ctrl_ack,
		PacketDlAckNack		dl_ack_nack,
		PacketUlDummy		ul_dummy,
		octetstring		other
	} with { variant "" };

	type record RlcmacUlCtrlMsg {
		RlcmacUlCtrlMsgType	msg_type,
		RlcmacUlCtrlUnion	u
	} with {
		variant (u) "CROSSTAG(ctrl_ack,		msg_type = PACKET_CONTROL_ACK;
				      dl_ack_nack,	msg_type = PACKET_DL_ACK_NACK;
				      ul_dummy,		msg_type = PACKET_UL_DUMMY_CTRL;
				      other,		OTHERWISE
			)"
	};

	external function enc_RlcmacUlCtrlMsg(in RlcmacUlCtrlMsg si) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	external function dec_RlcmacUlCtrlMsg(in octetstring stream) return RlcmacUlCtrlMsg
		with { extension "prototype(convert) decode(RAW)" };

	type bitstring ReceivedBlockBitmap length(64) with { variant "BYTEORDER(last)" };

	/* 12.3 Ack/Nack Description */
	type record AckNackDescription {
		BIT1			final_ack,
		uint7_t			starting_seq_nr,
		ReceivedBlockBitmap	receive_block_bitmap
	} with { variant "" };

	/* 12.7 Channel Request Description */
	type enumerated RlcMode {
		RLC_MODE_ACKNOWLEDGED	(0),
		RLC_MODE_UNACKNOWLEDGED	(1)
	} with { variant "FIELDLENGTH(1)" };
	type enumerated LlcPduType {
		LLC_PDU_IS_SACK_OR_ACK	(0),
		LLC_PDU_IS_NOT_SACK_OR_ACK (1)
	} with { variant "FIELDLENGTH(1)" };
	type record ChannelReqDescription {
		uint4_t			peak_tput_class,
		uint2_t			priority,
		RlcMode			rlc_mode,
		LlcPduType		llc_pdu_type,
		uint16_t		RlcOctetCount
	} with { variant "" };

	/* 12.8 Frequency Parameters */
	type record FreqIndirect {
		uint6_t			maio,
		uint4_t			ma_number,
		BIT1			change_mark1_present,
		uint2_t			change_mark1 optional,
		BIT1			change_mark2_present,
		uint2_t			change_mark2 optional
	} with {
		variant (change_mark1) "PRESENCE(change_mark1_present = '1'B)"
		variant (change_mark2) "PRESENCE(change_mark2_present = '1'B)"
	};
	type record FreqDirect1 {
		uint6_t			maio,
		GprsMobileAllication	mobile_allocation
	}
	type record FreqDirect2 {
		uint6_t			maio,
		uint6_t			hsn,
		uint4_t			ma_freq_len,
		octetstring		m1_freq_list
	} with {
		/* FIXME: this can not be expressed in TTCN-3 ?!? */
		//variant (ma_freq_len) "LENGTHTO(m1_freq_list)+3"
		variant (ma_freq_len) "LENGTHTO(m1_freq_list)"
	};
	type record FrequencyParameters {
		uint3_t			tsc,
		BIT2			presence,
		uint10_t		arfcn optional,
		FreqIndirect		indirect optional,
		FreqDirect1		direct1 optional,
		FreqDirect2		direct2 optional
	} with {
		variant (arfcn) "PRESENCE(presence = '00'B)"
		variant (indirect) "PRESENCE(presence = '01'B)"
		variant (direct1) "PRESENCE(presence = '10'B)"
		variant (direct2) "PRESENCE(presence = '11'B)"
	};

	/* 12.10 Global TFI */
	type record GlobalTfi {
		boolean			is_dl_tfi,
		uint5_t			tfi
	} with { variant (is_dl_tfi) "FIELDLENGTH(1)" };

	/* 12.10a GPRS Mobile Allocation */
	type record RflNumberList {
		uint4_t			rfl_number,
		BIT1			presence,
		RflNumberList		rfl_number_list optional
	} with {
		variant (rfl_number_list) "PRESENCE(presence = '1'B)"
	};
	type record GprsMobileAllication {
		uint6_t			hsn,
		BIT1			rfl_number_list_present,
		RflNumberList		rfl_number_list optional,
		BIT1			ma_present,
		uint6_t			ma_length optional,
		bitstring		ma_bitmap optional
		/* TODO: ARFCN index list */
	} with {
		variant (rfl_number_list) "PRESENCE(rfl_number_list_present = '1'B)"
		variant (ma_length) "PRESENCE(ma_present = '0'B)"
		variant (ma_bitmap) "PRESENCE(ma_present = '0'B)"
		/* FIXME: this can not be expressed in TTCN-3 ?!? */
		//variant (ma_length) "LENGTHTO(ma_bitmap)+1"
		variant (ma_length) "LENGTHTO(ma_bitmap)"
	}

	/* 12.11 Packet Request Reference */
	type record PacketRequestReference {
		uint11_t		ra_info,
		uint16_t		frame_nr
	} with { variant "" };

	/* 12.12 Packet Timing Advance */
	type record PacketTimingAdvance {
		BIT1		val_present,
		uint6_t		val optional,
		BIT1		idx_present,
		uint4_t		idx optional,
		uint3_t		timeslot_nr optional
	} with {
		variant (val) "PRESENCE(val_present = '1'B)"
		variant (idx) "PRESENCE(idx_present = '1'B)"
		variant (timeslot_nr) "PRESENCE(idx_present = '1'B)"
	};

	/* 12.13 Power Control Parameters */
	type record ZeroOneGamma {
		BIT1		gamma_present,
		uint5_t		gamma
	} with {
		variant (gamma) "PRESENCE (gamma_present = '1'B)"
	};
	type record length(8) of ZeroOneGamma ZeroOneGammas;
	type record PowerControlParameters {
		uint4_t		alpha,
		ZeroOneGammas	gamma
	} with { variant "" };

	/* 12.14 Persistence Level */
	type record length(4) of uint4_t PersistenceLevels;

	/* 12.20 Page Mode */
	type enumerated PageMode {
		PAGE_MODE_NORMAL	('00'B),
		PAGE_MODE_EXTENDED	('01'B),
		PAGE_MODE_REORG		('10'B),
		PAGE_MODE_SAME		('11'B)
	} with { variant "FIELDLENGTH(2)" };

	/* 12.21 Starting Frame Number */
	type record StartingFnDesc {
		BIT1		presence,
		uint16_t	absolute_starting_time optional,
		uint13_t	relative_k optional
	} with {
		variant (absolute_starting_time) "PRESENCE(presence = '0'B)"
		variant (relative_k) "PRESENCE(presence = '1'B)"
	};

	template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_CTRL_ACK(GprsTlli tlli,
						CtrlAck ack := MS_RCVD_TWO_RLC_SAME_RTI_DIFF_RBSN) := {
		msg_type := PACKET_CONTROL_ACK,
		u := {
			ctrl_ack := {
				tlli := tlli,
				ctrl_ack := ack
			}
		}
	}


} with { encode "RAW"; variant "FIELDORDER(msb)" variant "BYTEORDER(last)" };
