/* Encoding/Decoding routines for GSM System Information messages
 * according to 3GPP TS 44.018 Version 12.3.0 Release 12 */

/* (C) 2017 by Harald Welte <laforge@gnumonks.org> */

module GSM_SystemInformation {

	import from General_Types all;
	import from GSM_Types all;
	import from Osmocom_Types all;

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

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

	type octetstring RestOctets  with { variant "PADDING(yes), PADDING_PATTERN('00101011'B)" };

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

	type union ArfcnOrMaio {
		uint12_t	arfcn,
		MaioHsn		maio_hsn
	} with { variant "" };

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

	template SystemInformationHeader t_SiHeader(RrMessageType msg_type, uint6_t len) := {
		l2_plen := t_L2Pseudolength(len),
		rr_protocol_discriminator := 6,
		message_type := msg_type
	};

	external function enc_SystemInformationHeader(in SystemInformationHeader si) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	external function dec_SystemInformationHeader(in octetstring stream) return SystemInformationHeader
		with { extension "prototype(convert) decode(RAW)" };

	type hexstring GsmBcdString with { variant "HEXORDER(low)" };
	type GsmBcdString BcdMccMnc with { variant "FIELDLENGTH(6)" };

	/* 24.008 10.5.1.1 */
	type uint16_t CellIdentity;

	/* 24.008 10.5.1.3 */
	type record LocationAreaIdentification {
		BcdMccMnc	mcc_mnc,
		uint16_t	lac
	} with { variant "" };

	/* 44.018 10.5.2.1b */
	type octetstring CellChannelDescription with { variant "FIELDLENGTH(16)" };

	/* 44.018 10.5.2.3 */
	type record CellOptions {
		boolean		dn_ind,
		boolean		pwrc,
		BIT2		dtx,
		BIT4		radio_link_timeout
	} with { variant "" };

	/* 44.018 10.5.2.3a */
	type record CellOptionsSacch {
		BIT1		dtx_ext,
		boolean		pwrc,
		BIT2		dtx,
		BIT4		radio_link_timeout
	} with { variant "" };

	/* 44.018 10.5.2.4 */
	type record CellSelectionParameters {
		uint3_t		cell_resel_hyst,
		uint5_t		ms_txpwr_max_cch,
		boolean		acs,
		boolean		neci,
		uint6_t		rxlev_access_min
	} with { variant "" };

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

	/* 44.018 10.5.2.11 */
	type record ControlChannelDescription {
		boolean		mscrr,
		boolean		att,
		uint3_t		bs_ag_blks_res,
		uint3_t		ccch_conf,
		boolean		si22ind,
		uint2_t		cbq3,
		BIT2		spare,
		uint3_t		bs_pa_mfrms,
		uint8_t		t3212
	} with { variant "" };

	/* 44.018 10.5.2.21 */
	type record MobileAllocation {
		OCT1		iei,
		uint8_t		len,
		bitstring	ma
	} with { variant "" };

	/* 44.018 10.5.2.22 */
	type octetstring NeighbourCellDescription with { variant "FIELDLENGTH(16)" };

	/* 44.018 10.5.2.22a */
	type octetstring NeighbourCellDescription2 with { variant "FIELDLENGTH(16)" };

	type bitstring AccessControlClass with { variant "FIELDLENGTH(16), BYTEORDER(last)" };

	/* 44.018 10.5.2.29 */
	type record RachControlParameters {
		BIT2		max_retrans,
		BIT4		tx_integer,
		boolean		cell_barr_access,
		boolean		re,
		AccessControlClass ac
	} with { variant (ac) "FIELDLENGTH(16)" };

	/* 44.018 10.5.2.32 */
	type RestOctets Si1RestOctets with { variant "FIELDLENGTH(1)" };
	type RestOctets Si3RestOctets with { variant "FIELDLENGTH(4)" };

	/* 44.018 9.1.31 */
	type record SystemInformationType1 {
		//SystemInformationHeader	header,
		CellChannelDescription	cell_chan_desc,
		RachControlParameters	rach_control,
		Si1RestOctets		rest_octets
	} with { variant "" };

	/* 44.018 9.1.32 */
	type record SystemInformationType2 {
		//SystemInformationHeader	header,
		NeighbourCellDescription bcch_freq_list,
		BIT8			ncc_permitted,
		RachControlParameters	rach_control
	} with { variant "" };

	/* 44.018 9.1.33 */
	type record SystemInformationType2bis {
		//SystemInformationHeader		header,
		NeighbourCellDescription	extd_bcch_freq_list,
		RachControlParameters		rach_control,
		OCT1				rest_octets
	} with { variant "" };

	/* 44.018 9.1.34 */
	type record SystemInformationType2ter {
		//SystemInformationHeader		header,
		NeighbourCellDescription2	extd_bcch_freq_list,
		OCT4				rest_octets
	} with { variant "" };

	/* 44.018 9.1.35 */
	type record SystemInformationType3 {
		//SystemInformationHeader		header,
		CellIdentity			cell_id,
		LocationAreaIdentification	lai,
		ControlChannelDescription	ctrl_chan_desc,
		CellOptions			cell_options,
		CellSelectionParameters		cell_sel_par,
		RachControlParameters		rach_control,
		Si3RestOctets			rest_octets
	} with { variant "" };

	/* 44.018 9.1.36 */
	type record SystemInformationType4 {
		//SystemInformationHeader		header,
		LocationAreaIdentification	lai,
		CellSelectionParameters		cell_sel_par,
		RachControlParameters		rach_control,
		ChannelDescription		cbch_chan_desc optional,
		MobileAllocation		cbch_mobile_alloc optional,
		RestOctets			rest_octets
	} with { variant "TAG(cbch_chan_desc, iei = '64'O; cbch_mobile_alloc, iei = '72'O)" };

	/* 44.018 9.1.37 */
	type record SystemInformationType5 {
		SystemInformationHeader		header,
		NeighbourCellDescription	bcch_freq_list
	} with { variant "" };

	/* 44.018 9.1.38 */
	type record SystemInformationType5bis {
		//SystemInformationHeader		header,
		NeighbourCellDescription	extd_bcch_freq_list
	} with { variant "" };

	/* 44.018 9.1.39 */
	type record SystemInformationType5ter {
		//SystemInformationHeader		header,
		NeighbourCellDescription2	extd_bcch_freq_list
	} with { variant "" };

	/* 44.018 9.1.40 */
	type record SystemInformationType6 {
		//SystemInformationHeader		header,
		CellIdentity			cell_id,
		LocationAreaIdentification	lai,
		CellOptionsSacch		cell_options,
		BIT8				ncc_permitted,
		OCT7				rest_octets
	} with { variant "" };

	type union SystemInformationUnion {
		SystemInformationType1		si1,
		SystemInformationType2		si2,
		SystemInformationType2bis	si2bis,
		SystemInformationType2ter	si2ter,
		SystemInformationType3		si3,
		SystemInformationType4		si4,
		SystemInformationType5		si5,
		SystemInformationType5bis	si5bis,
		SystemInformationType5ter	si5ter,
		SystemInformationType6		si6
	} with { variant "" };

	type record SystemInformation {
		SystemInformationHeader		header,
		SystemInformationUnion		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;
			)" };

	external function enc_SystemInformation(in SystemInformation si) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	external function dec_SystemInformation(in octetstring stream) return SystemInformation
		with { extension "prototype(convert) decode(RAW)" };

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