/* Encoding/Decoding routines for GSM System Information messages
 * according to 3GPP TS 44.018 Version 12.3.0 Release 12
 *
 * (C) 2017-2019 Harald Welte <laforge@gnumonks.org>
 * 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 GSM_RR_Types {

	import from General_Types all;
	import from Osmocom_Types all;
	import from GSM_Types all;
	import from RLCMAC_CSN1_Types all;
	import from MobileL3_CommonIE_Types all;

	/* Table 10.4.1 of Section 10.4 / 3GPP TS 44.018 */
	type enumerated RrMessageType {
		ADDITIONAL_ASSIGNMENT		('00111011'B),
		IMMEDIATE_ASSIGNMENT		('00111111'B),
		IMMEDIATE_ASSIGNMENT_EXTENDED	('00111001'B),
		IMMEDIATE_ASSIGNMENT_REJECT	('00111010'B),
		IMMEDIATE_PACKET_ASSIGNMENT	('01101001'B),

		CIPHERING_MODE_COMMAND		('00110101'B),
		CIPHERING_MODE_COMPLETE		('00110010'B),

		CONFIGURATION_CHANGE_COMMAND	('00110000'B),
		CONFIGURATION_CHANGE_ACK	('00110001'B),
		CONFIGURATION_CHANGE_REJECT	('00110011'B),

		ASSIGNMENT_COMMAND		('00101110'B),
		ASSIGNMENT_COMPLETE		('00101001'B),
		ASSIGNMENT_FAILURE		('00101111'B),
		HANDOVER_COMMAND		('00101011'B),
		HANDOVER_COMPLETE		('00101100'B),
		HANDOVER_FAILURE		('00101000'B),
		PHYSICAL_INFORMATION		('00101101'B),

		CHANNEL_RELEASE			('00001101'B),
		PARTIAL_RELEASE			('00001010'B),
		PARTIAL_RELEASE_COMPLETE	('00001111'B),

		PAGING_REQUEST_TYPE_1		('00100001'B),
		PAGING_REQUEST_TYPE_2		('00100010'B),
		PAGING_REQUEST_TYPE_3		('00100100'B),
		PAGING_RESPONSE			('00100111'B),
		NOTIFICATION_NCH		('00100000'B),
		NOTIFICATION_RESPOSNE		('00100110'B),

		SYSTEM_INFORMATION_TYPE_8	('00011000'B),
		SYSTEM_INFORMATION_TYPE_1	('00011001'B),
		SYSTEM_INFORMATION_TYPE_2	('00011010'B),
		SYSTEM_INFORMATION_TYPE_3	('00011011'B),
		SYSTEM_INFORMATION_TYPE_4	('00011100'B),
		SYSTEM_INFORMATION_TYPE_5	('00011101'B),
		SYSTEM_INFORMATION_TYPE_6	('00011110'B),
		SYSTEM_INFORMATION_TYPE_7	('00011111'B),
		SYSTEM_INFORMATION_TYPE_2bis	('00000010'B),
		SYSTEM_INFORMATION_TYPE_2ter	('00000011'B),
		SYSTEM_INFORMATION_TYPE_2quater	('00000111'B),
		SYSTEM_INFORMATION_TYPE_5bis	('00000101'B),
		SYSTEM_INFORMATION_TYPE_5ter	('00000110'B),
		SYSTEM_INFORMATION_TYPE_9	('00000100'B),
		SYSTEM_INFORMATION_TYPE_13	('00000000'B),

		SYSTEM_INFORMATION_TYPE_16	('00111101'B),
		SYSTEM_INFORMATION_TYPE_17	('00111110'B),

		CHANNEL_MODE_MODIFY		('00010000'B),
		RR_STATUS			('00010010'B),
		CHANNEL_MODE_MODIFY_ACKNOWLEDGE	('00010111'B),
		FREQUENCY_REDEFINITION		('00010100'B),
		MEASUREMENT_REPORT		('00010101'B),
		CLASSMARK_CHANGE		('00010110'B),
		CLASSMARK_ENQUIRY		('00010011'B),
		EXTENDED_MEASUREMENT_REPORT	('00110110'B),
		EXTENDED_MEASUREMENT_ORDER	('00110111'B),
		GPRS_SUSPENSION_REQUEST		('00110100'B),
		//MBMS_ANNOUNCEMENT		('00010110'B), duplicate?
		//SERVICE_INFORMATION		('00110110'B), duplicate?

		APPLICATION_INFORMATION		('00111000'B),

		SYSTEM_INFORMATION_TYPE_14	('00000001'B),
		SYSTEM_INFORMATION_TYPE_15	('01000011'B),
		SYSTEM_INFORMATION_TYPE_18	('01000000'B),
		SYSTEM_INFORMATION_TYPE_19	('01000001'B),
		SYSTEM_INFORMATION_TYPE_20	('01000010'B),
		SYSTEM_INFORMATION_TYPE_13alt	('01000100'B),
		SYSTEM_INFORMATION_TYPE_2n	('01000101'B),
		SYSTEM_INFORMATION_TYPE_21	('01000110'B),
		SYSTEM_INFORMATION_TYPE_22	('01000111'B),
		SYSTEM_INFORMATION_TYPE_23	('01001111'B),

		DTM_ASSIGNMENT_FAILURE		('01001000'B),
		DTM_REJECT			('01001001'B),
		DTM_REQUEST			('01001010'B),
		PACKET_ASSIGNMENT		('01001011'B),
		DTM_ASSIGNMENT_COMMAND		('01001100'B),
		DTM_INFORMATION			('01001101'B),
		PACKET_INFORMATION		('01001110'B),

		UTRAN_CLASSMARK_CHANGE		('01100000'B),
		CDMA2000_CLASSMARK_CHANGE	('01100010'B),
		INTERSYS_TO_UTRAN_HO_CMD	('01100011'B),
		INTERSYS_TO_CDMA2000_HO_CMD	('01100100'B),
		GERAN_IU_MODE_CLASSMARK_CHG	('01100101'B),
		INTERSYS_TO_EUTRAN_HO_CMD	('01100110'B)
	} with { variant "FIELDLENGTH(8)" };

	type octetstring RestOctets  with { variant "PADDING(yes), PADDING_PATTERN('00101011'B)" };
	type hexstring GsmBcdString with { variant "HEXORDER(low)" };
	type GsmBcdString BcdMccMnc with { variant "FIELDLENGTH(6)" };

	type record L2PseudoLength {
		uint6_t		l2_plen,
		BIT2		zero_one
	} with { variant "" };

	template L2PseudoLength tr_L2Pseudolength(template uint6_t len) := {
		l2_plen := len,
		zero_one := '01'B
	};

	template (value) L2PseudoLength ts_L2Pseudolength(uint6_t len) := {
		l2_plen := len,
		zero_one := '01'B
	};

	type record RrHeader {
		L2PseudoLength	l2_plen,
		uint4_t		skip_indicator,
		uint4_t		rr_protocol_discriminator,
		RrMessageType	message_type
	} with { variant "" };

	template RrHeader t_RrHeader(RrMessageType msg_type, template uint6_t len) := {
		l2_plen := tr_L2Pseudolength(len),
		skip_indicator := 0,
		rr_protocol_discriminator := 6,
		message_type := msg_type
	};

	template (value) RrHeader ts_RrHeader(RrMessageType msg_type, uint6_t len) := {
		l2_plen := ts_L2Pseudolength(len),
		skip_indicator := 0,
		rr_protocol_discriminator := 6,
		message_type := msg_type
	};


	type record RrL3Header {
		uint4_t		skip_indicator,
		uint4_t		rr_protocol_discriminator,
		RrMessageType	message_type
	} with { variant "" };

	template RrL3Header t_RrL3Header(RrMessageType msg_type) := {
		skip_indicator := 0,
		rr_protocol_discriminator := 6,
		message_type := msg_type
	}

	/* TS 44.004 7.2.1 */
	type record SacchL1Header {
		uint2_t		reserved,
		boolean		fpc,
		uint5_t		ms_power_lvl,
		uint8_t		actual_ta
	} with { variant "FIELDORDER(msb)" };

	template (value) SacchL1Header ts_SacchL1Header(uint5_t ms_power_lvl, boolean fpc, uint8_t actual_ta) := {
		reserved := 0,
		fpc := fpc,
		ms_power_lvl := ms_power_lvl,
		actual_ta := actual_ta
	};

	type record MaioHsn {
	} with { variant "" };

	/* TS 24.008 10.5.1.1 */
	type uint16_t CellIdentity;

	/* TS 24.008 10.5.1.2 */
	type uint4_t CipheringKeySeqNr (0..7);

	/* 24.008 10.5.1.3 */
	type record LocationAreaIdentification {
		BcdMccMnc	mcc_mnc,
		uint16_t	lac
	} with {
		/* Otherwise '262F45'H is encoded as '24F262'H */
		variant (mcc_mnc) "BYTEORDER(first)"
	};

	/* TS 24.008 10.5.1.4 */
	type enumerated MobileIdentityType {
		MI_TYPE_NONE	(0),
		MI_TYPE_IMSI,
		MI_TYPE_IMEI,
		MI_TYPE_IMEISV,
		MI_TYPE_TMSI,
		MI_TYPE_TMGI
	} with { variant "FIELDLENGTH(3)" };

	/* TS 24.008 10.5.1.5 */
	type record MsClassmark1 {
		BIT1		spare,
		uint2_t		rev_level,
		boolean		es_ind,
		boolean		a51,
		uint3_t		rf_pwr_cap
	} with { variant "" };

	/* TS 24.008 10.5.1.6 */
	type record MsClassmark2 {
		BIT1		spare,
		uint2_t		rev_level,
		boolean		es_ind,
		boolean		a51,
		uint3_t		rf_pwr_cap,
		BIT1		spare1,
		boolean		ps_cap,
		uint2_t		ss_screen_ind,
		boolean		sm_cap,
		boolean		vbs,
		boolean		vgcs,
		boolean		fc,
		boolean		cm3,
		BIT1		spare2,
		boolean		lcsva_cap,
		boolean		ucs2,
		boolean		solsa,
		boolean		cmsp,
		boolean		a53,
		boolean		a52
	} with { variant "" };
	type record MsClassmark2LV {
		uint8_t		len,
		MsClassmark2	cm2
	} with { variant (len) "LENGTHTO(cm2)" };


	/* 44.018 10.5.2.5 */
	type record ChannelDescription {
		RslChannelNr	chan_nr,
		uint3_t		tsc,
		boolean		h,
		uint12_t	arfcn optional,
		MaioHsn		maio_hsn optional
	} with { variant (arfcn) "PRESENCE(h = false)"
		 variant (maio_hsn) "PRESENCE(h = true)" };

	type record ChannelDescriptionTV {
		OCT1		iei,
		ChannelDescription v
	} with { variant "" };

	/* 10.5.2.21 */
	type record MobileAllocation {
		uint8_t 	len,
		bitstring	ma
	} with { variant (len) "LENGTHTO(ma)" };

	/* 10.5.2.25a */
	type record PktChDesc0Ind {
		uint6_t		maio,
		BIT1		ma_number_ind,
		BIT1		change_mark1_valid,
		BIT2		change_mark1
	} with { variant "" };
	type record PktChDesc0 {
		BIT1		hopping,
		BIT1		spare ('0'B),
		uint10_t	arfcn optional,
		PktChDesc0Ind	indirect optional
	} with {
		variant (arfcn) "PRESENCE(hopping = '0'B)"
		variant (indirect) "PRESENCE(hopping = '1'B)"
	};
	type record PktChDesc1 {
		uint6_t		maio,
		uint6_t		hsn
	} with { variant "" };
	type record PacketChannelDescription {
		uint5_t		channel_Type_spare,
		uint3_t		tn,
		uint3_t		tsc,
		BIT1		presence,
		PktChDesc0	zero optional,
		PktChDesc1	one optional
	} with {
		variant (zero)	"PRESENCE(presence = '0'B)"
		variant (one)	"PRESENCE(presence = '1'B)"
	};

	/* 10.5.2.25b */
	type record DedicatedModeOrTbf {
		BIT1	spare,
		boolean	tma,
		boolean	downlink,
		boolean tbf
	} with { variant "" };

	/* 10.5.2.26 */
	type enumerated PageMode {
		PAGE_MODE_NORMAL,
		PAGE_MODE_EXTENDED,
		PAGE_MODE_REORGANIZATION,
		PAGE_MODE_SAME_AS_BEFORE
	} with { variant "FIELDLENGTH(4)" };

	/* 10.5.2.30 */
	type record RequestReference {
		bitstring	ra length(8),
		uint5_t 	t1p,
		uint6_t 	t3,
		uint5_t		t2
	} with { variant "" };

	template RequestReference t_RequestReference(template bitstring ra, template uint5_t t1p, template uint6_t t3, template uint5_t t2) := {
		ra := ra,
		t1p := t1p,
		t3 := t3,
		t2 := t2
	}

	/* compute the expected request reference for given RA + FN */
	function f_compute_ReqRef(uint8_t ra, GsmFrameNumber fn) return RequestReference {
		var RequestReference req_ref := { ra := int2bit(ra, 8) };
		req_ref.t1p := (fn / 1326) mod 32;
		req_ref.t2 := fn mod 26;
		req_ref.t3 := fn mod 51;
		return req_ref
	}
	function tr_compute_ReqRef(template uint8_t ra, template GsmFrameNumber fn)
	return template RequestReference {
		var template RequestReference req_ref;
		if (istemplatekind(ra, "?")) {
			req_ref.ra := ?;
		} else {
			req_ref.ra := int2bit(valueof(ra), 8);
		}
		if (istemplatekind(fn, "?")) {
			req_ref.t1p := ?;
			req_ref.t2 := ?;
			req_ref.t3 := ?;
		} else {
			var GsmFrameNumber fn_v := valueof(fn);
			req_ref.t1p := (fn_v / 1326) mod 32;
			req_ref.t2 := fn_v mod 26;
			req_ref.t3 := fn_v mod 51;
		}
		return req_ref;
	}

	/* 10.5.2.40 */
	type integer TimingAdvance (0..219);

	/* 10.5.2.43 */
	type uint8_t WaitIndication;

	/* 10.5.2.76 */
	type record FeatureIndicator {
		BIT2	spare,
		boolean	cs_ir,
		boolean	ps_ir
	} with { variant "" };

	/* 24.008 10.5.5.6 */
	type record DrxParameter {
		uint8_t		split_pg_cycle_code,
		uint4_t		drx_cycle_len_coeff,
		boolean		split_on_ccch,
		uint3_t		non_drx_timer
	} with { variant "" };

	/* 24.008 10.5.5.15 */
	type record RoutingAreaIdentification {
		LocationAreaIdentification	lai,
		uint8_t				rac
	} with { variant "" };

	external function enc_RoutingAreaIdentification(RoutingAreaIdentification rai) return octetstring
	with { extension "prototype(convert)" extension "encode(RAW)" }

	/* 44.018 10.5.2.16 */
	type record IaRestOctHL {
		uint6_t		freq_par_len,
		BIT2		padding ('00'B) optional,
		uint6_t		maio optional,
		octetstring	mobile_allocation optional
	} with {
		variant (freq_par_len)	"LENGTHTO(mobile_allocation,maio,padding)"
/*
		variant (padding)	"PRESENCE(freq_par_len != 0)"
		variant (maio)		"PRESENCE(freq_par_len != 0)"
		variant (mobile_allocation) "PRESENCE(freq_par_len != 0)"
*/
	};
	type record SecondPartAssign {
		BIT1		r99, /* L / H */
		BIT1		presence optional,
		BIT5		ext_ra optional
	} with {
		variant (r99) "CSN.1 L/H"
		variant (presence) "PRESENCE(r99 = '1'B)" /* H */
		variant (ext_ra) "PRESENCE(presence = '1'B)"
	};
	type union PacketUlDlAssignUnion {
		PacketUlAssign		ul,
		PacketDlAssign		dl
	};
	type record PacketUlDlAssign {
		BIT1			ass_disc,
		PacketUlDlAssignUnion	ass
	} with {
		variant (ass) "CROSSTAG(dl, ass_disc = '1'B; ul, ass_disc = '0'B)"
	};
	type union PacketAssignUnion {
		SecondPartAssign	spa,
		PacketUlDlAssign	uldl
	};
	type record IaRestOctHH {
		/* Packet Assignment discriminator:
		 * Packet Uplink / Downlink Assignment (0)
		 * Second Part Packet Assignment (1) */
		BIT1			pa_disc,
		PacketAssignUnion	pa
	} with {
		variant (pa) "CROSSTAG(spa, pa_disc = '1'B; uldl, pa_disc = '0'B)"
	};
	type record PacketUlAssignDyn {
		uint5_t		tfi_assignment,
		BIT1		polling,
		BIT1		spare ('0'B),
		uint3_t		usf,
		BIT1		usf_granularity,
		BIT1		p0_present,
		uint4_t		p0 optional,
		BIT1		pr_mode optional,
		ChCodingCommand	ch_coding_cmd,
		BIT1		tlli_block_chan_coding,
		BIT1		alpha_present,
		uint4_t		alpha optional,
		uint5_t		gamma,
		BIT1		ta_index_present,
		uint4_t		ta_index optional,
		BIT1		tbf_starting_time_present,
		uint16_t	tbf_starting_time optional
	} with {
		variant (p0)		"PRESENCE(p0_present = '1'B)"
		variant (pr_mode)	"PRESENCE(p0_present = '1'B)"
		variant (alpha)		"PRESENCE(alpha_present = '1'B)"
		variant (ta_index)	"PRESENCE(ta_index_present = '1'B)"
		variant (tbf_starting_time)	"PRESENCE(tbf_starting_time_present = '1'B)"
	};
	type record PacketUlAssignSgl {
		BIT1		alpha_present,
		uint4_t		alpha optional,
		uint5_t		gamma,
		BIT2		padding ('01'B),
		uint16_t	tbf_starting_time
		/* TODO: P0 / PR_MODE */
	} with {
		variant (alpha)		"PRESENCE(alpha_present = '1'B)"
	};
	type record PacketUlAssign {
		BIT1			presence,
		PacketUlAssignDyn	dynamic optional,
		PacketUlAssignSgl	single optional
		/* TODO: Estended RA, PFI */
	} with {
		variant (dynamic)	"PRESENCE(presence = '1'B)"
		variant (single)	"PRESENCE(presence = '0'B)"
	};
	type record PacketDlAssG1 {
		uint5_t		tfi_assignment,
		BIT1		rlc_mode,
		BIT1		alpha_present,
		uint4_t		alpha optional,
		uint5_t		gamma,
		BIT1		polling,
		BIT1		ta_valid
	} with { variant "" };
	type record PacketDlAssign {
		GprsTlli	tlli,
		BIT1		group1_present,
		PacketDlAssG1	group1 optional,
		BIT1		ta_index_present,
		uint4_t		ta_index optional,
		BIT1		tbf_starting_time_present,
		uint16_t	tbf_starting_time optional,
		BIT1		p0_present,
		uint4_t		p0 optional,
		BIT1		pr_mode optional
		/* TODO: EGPRS window size, etc. */
	} with {
		variant (group1)	"PRESENCE(group1_present = '1'B)"
		variant (ta_index)	"PRESENCE(ta_index_present = '1'B)"
		variant (tbf_starting_time)	"PRESENCE(tbf_starting_time_present = '1'B)"
		variant (p0)		"PRESENCE(p0_present = '1'B)"
		variant (pr_mode)	"PRESENCE(p0_present = '1'B)"
	};
	type record IaRestOctLL {
		BIT1		compressed_irat_ho_info_ind
	} with {
		variant (compressed_irat_ho_info_ind) "CSN.1 L/H"
	};


	type record of AccessTechnologiesRequest
	AccessTechnologiesRequestRepetition
	with { variant "EXTENSION_BIT(reverse)" };

	type record AccessTechnologiesRequest
	{
		BIT4	accessTechnType,
		BIT1    extensionBit
	} with { variant "FIELDORDER(msb)" };

	type enumerated EgprsChCodingCommand {
		CH_CODING_MCS1		('0000'B),
		CH_CODING_MCS2		('0001'B),
		CH_CODING_MCS3		('0010'B),
		CH_CODING_MCS4		('0011'B),
		CH_CODING_MCS5		('0100'B),
		CH_CODING_MCS6		('0101'B),
		CH_CODING_MCS7		('0110'B),
		CH_CODING_MCS8		('0111'B),
		CH_CODING_MCS9		('1000'B),
		CH_CODING_MCS5_7	('1001'B),
		CH_CODING_MCS6_9	('1010'B)
	} with { variant "FIELDLENGTH(4)" };

	/* TS 44.060 Table 12.5.2.1 */
	type enumerated EgprsWindowSize {
		EGPRS_WS_64		('00000'B),
		EGPRS_WS_96		('00001'B),
		EGPRS_WS_128		('00010'B),
		EGPRS_WS_160		('00011'B),
		EGPRS_WS_192		('00100'B),
		EGPRS_WS_224		('00101'B),
		EGPRS_WS_256		('00110'B),
		EGPRS_WS_288		('00111'B),
		EGPRS_WS_320		('01000'B),
		EGPRS_WS_352		('01001'B),
		EGPRS_WS_384		('01010'B),
		EGPRS_WS_416		('01011'B),
		EGPRS_WS_448		('01100'B),
		EGPRS_WS_480		('01101'B),
		EGPRS_WS_512		('01110'B),
		EGPRS_WS_544		('01111'B),
		EGPRS_WS_576		('10000'B),
		EGPRS_WS_608		('10001'B),
		EGPRS_WS_640		('10010'B),
		EGPRS_WS_672		('10011'B),
		EGPRS_WS_704		('10100'B),
		EGPRS_WS_736		('10101'B),
		EGPRS_WS_768		('10110'B),
		EGPRS_WS_800		('10111'B),
		EGPRS_WS_832		('11000'B),
		EGPRS_WS_864		('11001'B),
		EGPRS_WS_896		('11010'B),
		EGPRS_WS_928		('11011'B),
		EGPRS_WS_960		('11100'B),
		EGPRS_WS_992		('11101'B),
		EGPRS_WS_1024		('11110'B)
	} with { variant "FIELDLENGTH(5)" };

	type record EgprsUlAssignDyn {
		uint5_t		tfi_assignment,
		BIT1		polling,
		BIT1		spare ('0'B),
		uint3_t		usf,
		BIT1		usf_granularity,
		BIT1		p0_present,
		uint4_t		p0 optional,
		BIT1		pr_mode optional,
		EgprsChCodingCommand	egprs_ch_coding_cmd,
		BIT1		tlli_block_chan_coding,
		BIT1		bep_period2_present,
		BIT4		bep_period2 optional,
		BIT1		resegment,
		EgprsWindowSize	egprs_window_size,
		BIT1		alpha_present,
		uint4_t		alpha optional,
		uint5_t		gamma,
		BIT1		ta_index_present,
		uint4_t		ta_index optional,
		BIT1		tbf_starting_time_present,
		uint16_t	tbf_starting_time optional
		/* TODO: Additions for Rel-7 */
	} with {
		variant (p0)		"PRESENCE(p0_present = '1'B)"
		variant (pr_mode)	"PRESENCE(p0_present = '1'B)"
		variant (bep_period2)	"PRESENCE(bep_period2_present = '1'B)"
		variant (alpha)		"PRESENCE(alpha_present = '1'B)"
		variant (ta_index)	"PRESENCE(ta_index_present = '1'B)"
		variant (tbf_starting_time)	"PRESENCE(tbf_starting_time_present = '1'B)"
	};
	type record EgprsUlAssignMultiblock {
		BIT1		alpha_present,
		uint4_t		alpha optional,
		uint5_t		gamma,
		uint16_t	tbf_starting_time,
		BIT2		nr_radio_blocks_allocated,
		BIT1		p0_present,
		uint4_t		p0 optional,
		BIT1		spare ('0'B) optional,
		BIT1		pr_mode optional
		/* TDO: Additions for Rel-6 */
	} with {
		variant (alpha)		"PRESENCE(alpha_present = '1'B)"
		variant (p0)		"PRESENCE(p0_present = '1'B)"
		variant (spare)		"PRESENCE(p0_present = '1'B)"
		variant (pr_mode)	"PRESENCE(p0_present = '1'B)"
	};
	/* 3GPP TS 44.018 version 13.3.2 10.5.2.16, "EGPRS Packet Uplink Assignment" */
	type record EgprsUlAss {
		BIT5 ext_ra,
		BIT1 ats_present,
		AccessTechnologiesRequestRepetition ats optional,
		BIT1			presence,
		EgprsUlAssignDyn	dynamic optional,
		EgprsUlAssignMultiblock	multiblock optional
	} with {
		variant (ats)	"PRESENCE(ats_present = '1'B)"
		variant (dynamic)	"PRESENCE(presence = '1'B)"
		variant (multiblock)	"PRESENCE(presence = '0'B)"
	};

	type octetstring MblkDlAss;	/* TODO */
	type record IaRestOctLH {
		BIT2		presence,
		EgprsUlAss	egprs_ul optional,
		MblkDlAss	multiblock_dl_ass optional
	} with {
		variant (egprs_ul) "PRESENCE(presence = '00'B)"
		variant (multiblock_dl_ass) "PRESENCE(presence = '01'B)"
	};
	type record IaRestOctets {
		BIT2		presence,
		IaRestOctLL	ll optional,
		IaRestOctLH	lh optional,
		IaRestOctHL	hl optional,
		IaRestOctHH	hh optional
	} with {
		variant (presence) "CSN.1 L/H"
		variant (ll) "PRESENCE(presence = '00'B)"
		variant (lh) "PRESENCE(presence = '01'B)"
		variant (hl) "PRESENCE(presence = '10'B)"
		variant (hh) "PRESENCE(presence = '11'B)"
		variant "PADDING(yes), PADDING_PATTERN('00101011'B)"
	};

	type record MeasurementResults {
		BIT1		ba_used,
		BIT1		dtx_used,
		uint6_t		rxlev_full_srv_cell,
		BIT1		threeg_ba_used,
		BIT1		meas_valid,
		uint6_t		rxlev_sub_srv_cell,
		BIT1		si23_ba_used,
		uint3_t		rxqual_full_srv_cell,
		uint3_t		rxqual_sub_srv_cell,
		uint3_t		no_ncell_m,
		NcellReports	ncell_reports optional
	} with { variant (no_ncell_m) "LENGTHTO(ncell_reports)"
		 variant (no_ncell_m) "UNIT(elements)"
		 variant "PADDING(yes)"
		 variant "FIELDLENGTH(16)"
	};

	type record NcellReport {
		uint6_t		rxlev,
		uint5_t		bcch_freq,
		uint6_t		bsic
	} with { variant ""};
	type record of NcellReport NcellReports;


	/* 9.1.18 */
	type record ImmediateAssignment {
		DedicatedModeOrTbf		ded_or_tbf,
		PageMode			page_mode,
		ChannelDescription		chan_desc optional,
		PacketChannelDescription	pkt_chan_desc optional,
		RequestReference		req_ref,
		TimingAdvance			timing_advance,
		MobileAllocation		mobile_allocation,
		/* TODO: starting time TLV */
		IaRestOctets			rest_octets
	} with { variant (chan_desc) "PRESENCE(ded_or_tbf.tbf = false)"
		 variant (pkt_chan_desc) "PRESENCE(ded_or_tbf.tbf = true)" };

	/* 9.1.20 */
	type record ReqRefWaitInd {
		RequestReference		req_ref,
		WaitIndication			wait_ind
	} with { variant "" };
	type record length(4) of ReqRefWaitInd ReqRefWaitInd4;
	type record ImmediateAssignmentReject {
		FeatureIndicator		feature_ind,
		PageMode			page_mode,
		ReqRefWaitInd4			payload
	} with { variant "" };

	/* 9.1.21 */
	type record MeasurementReport {
		MeasurementResults		meas_res
	} with { variant "" };

	/* 9.1.22 */
	type record PagingRequestType1 {
		ChannelNeeded12			chan_needed,
		PageMode			page_mode,
		MobileIdentityLV		mi1,
		MobileIdentityTLV		mi2 optional,
		RestOctets			rest_octets
	} with { variant "TAG(mi2, elementIdentifier = '0010111'B)" };

	/* 9.1.23 */
	type record PagingRequestType2 {
		ChannelNeeded12			chan_needed,
		PageMode			page_mode,
		GsmTmsi				mi1,
		GsmTmsi				mi2,
		MobileIdentityTLV		mi3 optional,
		RestOctets			rest_octets
	} with { variant "TAG(mi3, elementIdentifier = '0010111'B)" };

	/* 9.1.24 */
	type record length(4) of GsmTmsi GsmTmsi4;
	type record PagingRequestType3 {
		ChannelNeeded12			chan_needed,
		PageMode			page_mode,
		GsmTmsi4			mi,
		RestOctets			rest_octets
	} with { variant "" };

	type union RrUnion {
/*
		SystemInformationType1		si1,
		SystemInformationType2		si2,
		SystemInformationType2bis	si2bis,
		SystemInformationType2ter	si2ter,
		SystemInformationType3		si3,
		SystemInformationType4		si4,
		SystemInformationType5		si5,
		SystemInformationType5bis	si5bis,
		SystemInformationType5ter	si5ter,
		SystemInformationType6		si6,
*/
		ImmediateAssignment		imm_ass,
		ImmediateAssignmentReject	imm_ass_rej,
		PagingRequestType1		pag_req_1,
		PagingRequestType2		pag_req_2,
		PagingRequestType3		pag_req_3,
		octetstring			other
	} with { variant "" };

	/* Special RR Message on BCCH / CCCH Dowlink */

	type record GsmRrMessage {
		RrHeader	header,
		RrUnion		payload
	} with { variant (payload) "CROSSTAG(
/*
			      si1, header.message_type = SYSTEM_INFORMATION_TYPE_1;
			      si2, header.message_type = SYSTEM_INFORMATION_TYPE_2;
			      si2bis, header.message_type = SYSTEM_INFORMATION_TYPE_2bis;
			      si2ter, header.message_type = SYSTEM_INFORMATION_TYPE_2ter;
			      si3, header.message_type = SYSTEM_INFORMATION_TYPE_3;
			      si4, header.message_type = SYSTEM_INFORMATION_TYPE_4;
			      si5, header.message_type = SYSTEM_INFORMATION_TYPE_5;
			      si5bis, header.message_type = SYSTEM_INFORMATION_TYPE_5bis;
			      si5ter, header.message_type = SYSTEM_INFORMATION_TYPE_5ter;
			      si6, header.message_type = SYSTEM_INFORMATION_TYPE_6;
*/
				imm_ass, header.message_type = IMMEDIATE_ASSIGNMENT;
				imm_ass_rej, header.message_type = IMMEDIATE_ASSIGNMENT_REJECT;
				pag_req_1, header.message_type = PAGING_REQUEST_TYPE_1;
				pag_req_2, header.message_type = PAGING_REQUEST_TYPE_2;
				pag_req_3, header.message_type = PAGING_REQUEST_TYPE_3;
			      other, OTHERWISE;
			)"
		 /* Total message length: 184 = 23 * 8. Pad spare bits with '2B'O. */
		 variant "PADDING(184), PADDING_PATTERN('00101011'B)"
	};

	external function enc_GsmRrMessage(in GsmRrMessage msg) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	external function dec_GsmRrMessage(in octetstring stream) return GsmRrMessage
		with { extension "prototype(convert) decode(RAW)" };

	/* Normal L3 Message on Dedicated Channel */

	/* 9.1.25 Paging Response */
	type record PagingResponse {
		uint4_t			spare_half_octet,
		CipheringKeySeqNr	cksn,
		MsClassmark2LV		cm2,
		MobileIdentityLV	mi,
		uint8_t			addl_upd_par optional
	} with { variant "" };

	type union RrL3Union {
		PagingResponse	paging_response,
		MeasurementReport meas_rep,
		octetstring	other
	};

	type record GsmRrL3Message {
		RrL3Header	header,
		RrL3Union	payload
	} with { variant (payload) "CROSSTAG(
				paging_response, header.message_type = PAGING_RESPONSE;
				meas_rep, header.message_type = MEASUREMENT_REPORT;
				other, OTHERWISE;
		)" }

	external function enc_GsmRrL3Message(in GsmRrL3Message msg) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	external function dec_GsmRrL3Message(in octetstring stream) return GsmRrL3Message
		with { extension "prototype(convert) decode(RAW)" };


	template PacketDlAssign tr_PacketDlAssign(template GprsTlli tlli) := {
		tlli := tlli,
		group1_present := ?,
		group1 := *,
		ta_index_present := ?,
		ta_index := *,
		tbf_starting_time_present := ?,
		tbf_starting_time := *,
		p0_present := ?,
		p0 := *,
		pr_mode := *
	};

	template IaRestOctets tr_IaRestOctets_DLAss(template PacketDlAssign dl_ass) := {
		presence := '11'B, /* HH */
		ll := omit, lh := omit, hl := omit,
		hh := {
			pa_disc := '0'B, /* Packet Assignment (0) */
			pa := {
				uldl := {
					ass_disc := '1'B, /* Downlink Assignment (1) */
					ass := { dl := dl_ass }
				}
			}
		}
	};

	template PacketUlAssign tr_PacketUlDynAssign(template uint5_t tfi := ?,
						     template BIT1 polling := ?,
						     template uint3_t usf := ?,
						     template BIT1 usf_granularity := ?,
						     template ChCodingCommand cs := ?) := {
		presence := '1'B, /* Dynamic Block Allocation */
		dynamic := {
			tfi_assignment := tfi,
			polling := polling,
			spare := '0'B, /* Dynamic Block Allocation (mandatory after Rel-4) */
			usf := usf,
			usf_granularity := usf_granularity,
			p0_present := ?,
			p0 := *,
			pr_mode := *,
			ch_coding_cmd := cs,
			tlli_block_chan_coding := ?,
			alpha_present := ?,
			alpha := *,
			gamma := ?,
			/* TODO: add to parameters */
			ta_index_present := ?,
			ta_index := *,
			tbf_starting_time_present := ?,
			tbf_starting_time := *
		},
		single := omit
	};

	template PacketUlAssign tr_PacketUlSglAssign := {
		presence := '0'B, /* Single Block Allocation */
		dynamic := omit,
		single := {
			alpha_present := ?,
			alpha := *,
			gamma := ?,
			padding := '01'B,
			tbf_starting_time := ?
		}
	};

	template IaRestOctets tr_IaRestOctets_ULAss(template PacketUlAssign ul_ass) := {
		presence := '11'B, /* HH */
		ll := omit, lh := omit, hl := omit,
		hh := {
			pa_disc := '0'B, /* Packet Assignment (0) */
			pa := {
				uldl := {
					ass_disc := '0'B, /* Uplink Assignment (0) */
					ass := { ul := ul_ass }
				}
			}
		}
	};

	template EgprsUlAss tr_EgprsUlAssDynamic(template (present) BIT5 ext_ra := ?,
						 template EgprsUlAssignDyn dyn_ass := ?) := {
		ext_ra := ext_ra,
		ats_present := ?,
		ats := *,
		presence := '1'B,
		dynamic := dyn_ass,
		multiblock := omit
	};
	template EgprsUlAss tr_EgprsUlAssMultiblock(template (present) BIT5 ext_ra := ?,
						    template EgprsUlAssignMultiblock mb_ass := ?) := {
		ext_ra := ext_ra,
		ats_present := ?,
		ats := *,
		presence := '0'B,
		dynamic := omit,
		multiblock := mb_ass
	};

	template IaRestOctets tr_IaRestOctets_EGPRSULAss(template EgprsUlAss ul_ass) := {
		presence := '01'B, /* LH */
		ll := omit,
		lh := {
			presence := '00'B,
			egprs_ul := ul_ass,
			multiblock_dl_ass := omit
		},
		hl := omit,
		hh := omit
	};

	template (value) GsmRrMessage ts_IMM_ASS(uint8_t ra, GsmFrameNumber fn, TimingAdvance ta,
						ChannelDescription ch_desc, MobileAllocation ma) := {
		header := t_RrHeader(IMMEDIATE_ASSIGNMENT, 0),
		payload := {
			imm_ass := {
				ded_or_tbf := {
					spare := '0'B,
					tma := false,
					downlink := false,
					tbf := false
				},
				page_mode := PAGE_MODE_NORMAL,
				chan_desc := ch_desc,
				pkt_chan_desc := omit,
				req_ref := f_compute_ReqRef(ra, fn),
				timing_advance := ta,
				mobile_allocation := ma,
				rest_octets := {
					presence := '00'B, /* LL */
					ll := {
						compressed_irat_ho_info_ind := '0'B /* L */
					},
					lh := omit, hl := omit, hh := omit
				}
			}
		}
	};

	template GsmRrMessage tr_IMM_ASS(template uint8_t ra := ?, template GsmFrameNumber fn := ?,
					 template TimingAdvance ta := ?,
					 template ChannelDescription ch_desc := ?,
					 template MobileAllocation ma := ?) := {
		header := t_RrHeader(IMMEDIATE_ASSIGNMENT, ?),
		payload := {
			imm_ass := {
				ded_or_tbf := {
					spare := '0'B,
					tma := false,
					downlink := false,
					tbf := false
				},
				page_mode := PAGE_MODE_NORMAL,
				chan_desc := ch_desc,
				pkt_chan_desc := omit,
				req_ref := tr_compute_ReqRef(ra, fn),
				timing_advance := ta,
				mobile_allocation := ma,
				rest_octets := ?
			}
		}
	};

	/* TODO: implement send version of this template */
	template GsmRrMessage tr_IMM_TBF_ASS(template boolean dl := ?,
					     template uint8_t ra := ?,
					     template GsmFrameNumber fn := ?,
					     template TimingAdvance ta := ?,
					     template PacketChannelDescription ch_desc := ?,
					     template IaRestOctets rest := ?) := {
		header := t_RrHeader(IMMEDIATE_ASSIGNMENT, ?),
		payload := {
			imm_ass := {
				ded_or_tbf := {
					spare := ?,
					tma := ?,
					downlink := dl,
					tbf := true
				},
				page_mode := ?,
				chan_desc := omit,
				pkt_chan_desc := ch_desc,
				req_ref := tr_compute_ReqRef(ra, fn),
				timing_advance := ta,
				mobile_allocation := ?,
				rest_octets := rest
			}
		}
	};

	template GsmRrMessage tr_PAG_REQ1(template MobileIdentityLV mi1 := ?,
					  template MobileIdentityTLV mi2 := omit) := {
		header := t_RrHeader(PAGING_REQUEST_TYPE_1, ?),
		payload := {
			pag_req_1 := {
				chan_needed := {
					second := ?,
					first := ?
				},
				page_mode := PAGE_MODE_NORMAL,
				mi1 := mi1,
				mi2 := mi2,
				rest_octets := ?
			}
		}
	};

	template (value) GsmRrL3Message ts_MEAS_REP(boolean valid, uint6_t rxl_f, uint6_t rxl_s,
						  uint3_t rxq_f, uint3_t rxq_s,
						  template (omit) NcellReports reps) := {
		header := t_RrL3Header(MEASUREMENT_REPORT),
		payload := {
			meas_rep := {
				meas_res := {
					ba_used := '0'B,
					dtx_used := '0'B,
					rxlev_full_srv_cell := rxl_f,
					threeg_ba_used := '0'B,
					meas_valid := bool2bit(not valid),
					rxlev_sub_srv_cell := rxl_s,
					si23_ba_used := '0'B,
					rxqual_full_srv_cell := rxq_f,
					rxqual_sub_srv_cell := rxq_s,
					no_ncell_m := 0,
					ncell_reports := reps
				}
			}
		}
	};

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