/* 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_Types {

	import from General_Types all;
	import from Osmocom_Types all;

	type integer GsmArfcn (0..1023);
	type integer UmtsArfcn (0..16383);
	type integer UmtsScramblingCode (0..511);
	const integer GsmMaxFrameNumber := 26*51*2048;
	type integer GsmFrameNumber (0..GsmMaxFrameNumber);
	type integer GsmRxLev (0..63);
	type integer GsmTsc (0..7) with { variant "FIELDLENGTH(8)" };
	type uint32_t GsmTmsi;
	type OCT4 GprsTlli;
	type hexstring GsmMcc length(3);
	type hexstring GsmMnc length(2 .. 3);
	type uint16_t GsmLac;
	type uint16_t GsmCellId;

	type enumerated GprsCodingScheme {
		CS1, CS2, CS3, CS4
	};

	function f_gprs_blocksize(GprsCodingScheme cs) return integer {
		select (cs) {
		case (CS1) { return 22 }
		case (CS2) { return 32 }
		case (CS3) { return 38 }
		case (CS3) { return 52 }
		case else {
			setverdict(fail, "Invalid GPRS CS ", cs);
			mtc.stop;
			return -1;
			}
		}
	}

	/* 10.5.2.8 */
	type enumerated ChannelNeeded {
		CHAN_NEED_ANY	(0),
		CHAN_NEED_SDCCH	(1),
		CHAN_NEED_TCH_F	(2),
		CHAN_NEED_TCH_H	(3)
	} with { variant "FIELDLENGTH(2)" };
	type record ChannelNeeded12 {
		ChannelNeeded	second,
		ChannelNeeded	first
	} with { variant "" };


	/* TS 48.058 9.3.1 Channel Number IE */
	type enumerated RslChanNr0 {
		RSL_CHAN_NR_INVALID	('00000'B),
		RSL_CHAN_NR_Bm_ACCH	('00001'B),
		RSL_CHAN_NR_BCCH	('10000'B),
		RSL_CHAN_NR_RACH	('10001'B),
		RSL_CHAN_NR_PCH_AGCH	('10010'B),
		RSL_CHAN_NR_OSMO_PDCH	('11000'B),
		RSL_CHAN_NR_OSMO_CBCH	('11001'B)
	} with { variant "FIELDLENGTH(5)" variant "FIELDORDER(msb)" };

	type record RslChanNr2 {
		BIT4		tag ('0001'B),
		uint1_t		sub_chan
	} with { variant "FIELDLENGTH(5)" variant "FIELDORDER(msb)" };

	type record RslChanNr4 {
		BIT3		tag ('001'B),
		uint2_t		sub_chan
	} with { variant "FIELDLENGTH(5)" variant "FIELDORDER(msb)" };

	type record RslChanNr8 {
		BIT2		tag ('01'B),
		uint3_t		sub_chan
	} with { variant "FIELDLENGTH(5)" variant "FIELDORDER(msb)" };

	type union RslChanNrU {
		RslChanNr0	ch0,
		RslChanNr2	lm,
		RslChanNr4	sdcch4,
		RslChanNr8	sdcch8
	} with {
		variant "TAG(lm, tag = '0001'B;
			     sdcch4, tag = '001'B;
			     sdcch8, tag = '01'B;
			     ch0, OTHERWISE)"
		variant "FIELDLENGTH(5)"
		variant "FIELDORDER(msb)"
	};

	type record RslChannelNr {
		RslChanNrU	u,
		uint3_t		tn
	} with { variant "FIELDLENGTH(8)" variant "FIELDORDER(msb)" };

	template RslChannelNr t_RslChanNr0(template uint3_t tn, template RslChanNr0 cht) := {
		u := { ch0 := cht },
		tn := tn
	}

	template RslChannelNr t_RslChanNr_RACH(template uint3_t tn) := t_RslChanNr0(tn, RSL_CHAN_NR_RACH);
	template RslChannelNr t_RslChanNr_BCCH(template uint3_t tn) := t_RslChanNr0(tn, RSL_CHAN_NR_BCCH);
	template RslChannelNr t_RslChanNr_PCH_AGCH(template uint3_t tn) := t_RslChanNr0(tn, RSL_CHAN_NR_PCH_AGCH);
	template RslChannelNr t_RslChanNr_Bm(template uint3_t tn) := t_RslChanNr0(tn, RSL_CHAN_NR_Bm_ACCH);
	template RslChannelNr t_RslChanNr_PDCH(template uint3_t tn) := t_RslChanNr0(tn, RSL_CHAN_NR_OSMO_PDCH);
	template RslChannelNr t_RslChanNr_CBCH(template uint3_t tn) := t_RslChanNr0(tn, RSL_CHAN_NR_OSMO_CBCH);
	template RslChannelNr t_RslChanNr_Lm(template uint3_t tn, template uint1_t sub_slot) := {
		u := { lm := { tag := '0001'B, sub_chan := sub_slot } },
		tn := tn
	}
	template RslChannelNr t_RslChanNr_SDCCH4(template uint3_t tn, template uint2_t sub_slot) := {
		u := { sdcch4 := { tag := '001'B, sub_chan := sub_slot } },
		tn := tn
	}
	template RslChannelNr t_RslChanNr_SDCCH8(template uint3_t tn, template uint3_t sub_slot) := {
		u := { sdcch8 := { tag := '01'B, sub_chan := sub_slot } },
		tn := tn
	}

	template (value) RslChannelNr ts_RslChanNr0(uint3_t tn, RslChanNr0 cht) := {
		u := { ch0 := cht },
		tn := tn
	}
	template (value) RslChannelNr ts_RslChanNr_RACH(uint3_t tn) := ts_RslChanNr0(tn, RSL_CHAN_NR_RACH);
	template (value) RslChannelNr ts_RslChanNr_BCCH(uint3_t tn) := ts_RslChanNr0(tn, RSL_CHAN_NR_BCCH);
	template (value) RslChannelNr ts_RslChanNr_PCH_AGCH(uint3_t tn) := ts_RslChanNr0(tn, RSL_CHAN_NR_PCH_AGCH);
	template (value) RslChannelNr ts_RslChanNr_Bm(uint3_t tn) := ts_RslChanNr0(tn, RSL_CHAN_NR_Bm_ACCH);
	template (value) RslChannelNr ts_RslChanNr_PDCH(uint3_t tn) := ts_RslChanNr0(tn, RSL_CHAN_NR_OSMO_PDCH);
	template (value) RslChannelNr ts_RslChanNr_CBCH(uint3_t tn) := ts_RslChanNr0(tn, RSL_CHAN_NR_OSMO_CBCH);
	template (value) RslChannelNr ts_RslChanNr_Lm(uint3_t tn, uint1_t sub_slot) := {
		u := { lm := { tag := '0001'B, sub_chan := sub_slot } },
		tn := tn
	}
	template (value) RslChannelNr ts_RslChanNr_SDCCH4(uint3_t tn, uint2_t sub_slot) := {
		u := { sdcch4 := { tag := '001'B, sub_chan := sub_slot } },
		tn := tn
	}
	template (value) RslChannelNr ts_RslChanNr_SDCCH8(uint3_t tn, uint3_t sub_slot) := {
		u := { sdcch8 := { tag := '01'B, sub_chan := sub_slot } },
		tn := tn
	}

	/* TS 48.058 9.3.2 Link ID */
	type enumerated RslLinkIdC {
		FACCH_SDCCH	(0),
		SACCH		(1)
	} with { variant "FIELDLENGTH(2)" };

	type enumerated RslSapi0Prio {
		SAPI0_PRIO_NORMAL	(0),
		SAPI0_PRIO_HIGH		(1),
		SAPI0_PRIO_LOW		(2)
	} with { variant "FIELDLENGTH(2)" };

	type uint3_t GsmSapi;

	type record RslLinkId {
		RslLinkIdC	c,
		boolean		na,
		RslSapi0Prio	prio,
		GsmSapi		sapi
	} with { variant "" };

	template RslLinkId tr_RslLinkId := {
		c := ?,
		na := ?,
		prio := ?,
		sapi := ?
	};

	template RslLinkId tr_RslLinkID_DCCH(template GsmSapi sapi) modifies tr_RslLinkId := {
		c := FACCH_SDCCH,
		na := false,
		sapi := sapi
	};

	template RslLinkId tr_RslLinkID_SACCH(template GsmSapi sapi) modifies tr_RslLinkId := {
		c := SACCH,
		na := false,
		sapi := sapi
	};

	template (value) RslLinkId ts_RslLinkID_DCCH(GsmSapi sapi) := {
		c := FACCH_SDCCH,
		na := false,
		prio := SAPI0_PRIO_NORMAL,
		sapi := sapi
	};

	template (value) RslLinkId ts_RslLinkID_SACCH(GsmSapi sapi) := {
		c := SACCH,
		na := false,
		prio := SAPI0_PRIO_NORMAL,
		sapi := sapi
	};

	function f_hex_is_odd_length(hexstring digits) return bitstring {
		if (lengthof(digits) rem 2 == 1) {
			return '1'B;
		} else {
			return '0'B;
		}
	}


/* TS 04.12 Section 3.3.1 Block type */
type record CBCH_BlockType {
	BIT1	spare,
	BIT2	lpd,
	boolean last_block,
	uint4_t	seq_nr
};
template (value) CBCH_BlockType ts_CBCH_BlockType(template (value) uint4_t seq_nr, template (value) boolean last_block) := {
	spare := '0'B,
	lpd := '01'B,
	last_block := last_block,
	seq_nr := seq_nr
};
template CBCH_BlockType tr_CBCH_BlockType(template uint4_t seq_nr := ?, template boolean last_block := ?) := {
	spare := '0'B,
	lpd := '01'B,
	last_block := last_block,
	seq_nr := seq_nr
};

/* TS 04.12 Section 3.3 */
type record CBCH_Block {
	CBCH_BlockType	block_type,
	OCT22		payload
};
template (value) CBCH_Block ts_CBCH_Block(template (value) uint4_t seq_nr, template (value) boolean last_block, template (value) OCT22 payload) := {
	block_type := ts_CBCH_BlockType(seq_nr, last_block),
	payload := payload
};
template CBCH_Block tr_CBCH_Block(template uint4_t seq_nr := ?, template boolean last_block := ?, template OCT22 payload := ?) := {
	block_type := tr_CBCH_BlockType(seq_nr, last_block),
	payload := payload
};


external function enc_CBCH_Block(in CBCH_Block msg) return octetstring
	with { extension "prototype(convert) encode(RAW)" };
external function dec_CBCH_Block(in octetstring stream) return CBCH_Block
	with { extension "prototype(convert) decode(RAW)" };


/* Convert RF signal level in dBm to RxLev (TS 45.008 Chapter 8.1.4) */
function dbm2rxlev(integer dbm) return uint6_t {
	var integer rxlev := dbm + 110;
	if (rxlev > 63) {
		rxlev := 63;
	} else if (rxlev < 0) {
		rxlev := 0;
	}
	return rxlev;
}

function rxlev2dbm(uint6_t rxlev) return integer {
	return -110 + rxlev;
}

/* convert BER to RxQual value (TS 45.008 Chapter 8.2.4 */
function ber2rxqual(float ber) return uint3_t {
	if (ber < 0.2) {
		return 0;
	} else if (ber < 0.4) {
		return 1;
	} else if (ber < 0.8) {
		return 2;
	} else if (ber < 1.6) {
		return 3;
	} else if (ber < 3.2) {
		return 4;
	} else if (ber < 6.4) {
		return 5;
	} else if (ber < 12.8) {
		return 6;
	} else {
		return 7;
	}
}

/* convert RxQual to BER (TS 45.008 Chapter 8.2.4 */
function rxqual2ber(uint3_t rxqual) return float {
	select (rxqual) {
	case (0) { return 0.14 }
	case (1) { return 0.28 }
	case (2) { return 0.57 }
	case (3) { return 1.13 }
	case (4) { return 2.26 }
	case (5) { return 4.53 }
	case (6) { return 9.05 }
	case (7) { return 18.10 }
	case else { return 1000.0 }
	}
}

const float GSM_FRAME_DURATION := 0.12/26.0; /* 4.615 ms */
const float GSM51_MFRAME_DURATION := 51.0 * GSM_FRAME_DURATION; /* 235.365 ms */
const float GSM51_MFRAMES_PER_SEC := 1.0 / GSM51_MFRAME_DURATION; /* 4.248 */

/* number of downlink CCCH blocks per second */
function f_ccch_blocks_per_mframe(boolean combined_ccch) return integer {
	if (not combined_ccch) {
		/* 9 blocks per 51 multiframe */
		return 9;
	} else {
		/* 3 blocks per 51 multiframe */
		return 3;
	}
}

/* this ignores any possible paging combining! */
function f_pch_block_rate_est(boolean combined_ccch, integer bs_ag_blks_res) return float {
	var integer ccch_per_mframe := f_ccch_blocks_per_mframe(combined_ccch);
	var integer pch_per_mframe := ccch_per_mframe - bs_ag_blks_res;
	return GSM51_MFRAMES_PER_SEC * int2float(pch_per_mframe);
}

/* this ignores any possible imm.ass combining! */
function f_agch_block_rate_est(boolean combined_ccch, integer bs_ag_blks_res) return float {
	var integer ccch_per_mframe := f_ccch_blocks_per_mframe(combined_ccch);
	return GSM51_MFRAMES_PER_SEC * int2float(bs_ag_blks_res);
}

/* compute TC as per 45.002 6.3.1.3 */
function f_gsm_compute_tc(integer fn) return integer {
	return (fn / 51) mod 8;
}


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