module BSSLAP_Types {

/* BSSLAP_Types, defining abstract TTCN-3 data types for the 3GPP BSSLAP protocol.
 *
 * BSSLAP is a 3GPP standard protocol used between BSC and SMLC in a GSM network.
 * This file covers 3GPP TS 48.071 version 15.0.0 Release 15
 *
 * (C) 2020 by 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
 */

import from General_Types all;
import from Osmocom_Types all;


/* 3GPP TS 48.071 Table 5.1 */
type enumerated BSSLAP_IEI {
	BSSLAP_IEI_TA			('00000001'B),
	BSSLAP_IEI_CELL_ID		('00001001'B),
	BSSLAP_IEI_CHAN_DESC		('00010000'B),
	BSSLAP_IEI_MEAS_REP		('00010100'B),
	BSSLAP_IEI_CAUSE		('00011000'B),
	BSSLAP_IEI_RRLP_FLAG		('00011001'B),
	BSSLAP_IEI_RRLP			('00011011'B),
	BSSLAP_IEI_CELL_ID_LIST		('00011100'B),
	BSSLAP_IEI_ENH_MEAS_REP		('00011101'B),
	BSSLAP_IEI_LAC			('00011110'B),
	BSSLAP_IEI_FREQ_LIST		('00100001'B),
	BSSLAP_IEI_MS_POWER		('00100010'B),
	BSSLAP_IEI_DELTA_TIMER		('00100011'B),
	BSSLAP_IEI_SERVING_CELL_ID	('00100100'B),
	BSSLAP_IEI_ENCR_KEY		('00100101'B),
	BSSLAP_IEI_CIPH_MODE_SET	('00100110'B),
	BSSLAP_IEI_CHAN_MODE		('00100111'B),
	BSSLAP_IEI_MR_CONFIG		('00101000'B),
	BSSLAP_IEI_POLLING_REPETITION	('00101001'B),
	BSSLAP_IEI_PACKET_CHAN_DESC	('00101010'B),
	BSSLAP_IEI_TLLI			('00101011'B),
	BSSLAP_IEI_TFI			('00101100'B),
	BSSLAP_IEI_TBF_START_TIME	('00101101'B),
	BSSLAP_IEI_PWRUP_START_TIME	('00101110'B),
	BSSLAP_IEI_LONG_ENCR_KEY	('00101111'B),
	BSSLAP_IEI_CONCUR_POS_PROC_F	('00110000'B)
} with { variant "FIELDLENGTH(8)" };

/* 3GPP TS 48.071 Section 5.1 */
type enumerated BSSLAP_MsgType {
	BSSLAP_MSGT_TA_REQUEST		('00000001'B),
	BSSLAP_MSGT_TA_RESPONSE		('00000010'B),
	BSSLAP_MSGT_REJECT		('00001010'B),
	BSSLAP_MSGT_RESET		('00001011'B),
	BSSLAP_MSGT_ABORT		('00001100'B),
	BSSLAP_MSGT_TA_LAYER3		('00001101'B),
	BSSLAP_MSGT_MS_POS_CMD		('00001111'B),
	BSSLAP_MSGT_MS_POS_RESP		('00010000'B),
	BSSLAP_MSGT_UTDOA_REQ		('00010001'B),
	BSSLAP_MSGT_UTDOA_RESP		('00010010'B)
} with { variant "FIELDLENGTH(8)" };


/* Section 4.2.1 */
type record BSSLAP_TaRequest {
	BSSLAP_MsgType			msg_type
};

/* Section 4.2.2 */
type record BSSLAP_TaResponse {
	BSSLAP_MsgType			msg_type,
	BSSLAP_IE_CellId		serving_cell_id,
	BSSLAP_IE_TimingAdvance		timing_advance,
	BSSLAP_IE_MeasRep		meas_rep optional,
	BSSLAP_IE_EnhMeasRep		enh_meas_rep optional,
	BSSLAP_IE_CellIdList		meas_cell_id_list optional,
	BSSLAP_IE_ConcurMethodF		concur_meth_flag optional
};

/* Section 4.2.5 */
type record BSSLAP_Reject {
	BSSLAP_MsgType			msg_type,
	BSSLAP_IE_Cause			cause
};

/* Section 4.2.6 */
type record BSSLAP_Reset {
	BSSLAP_MsgType			msg_type,
	BSSLAP_IE_CellId		cell_id,
	BSSLAP_IE_TimingAdvance		timing_advance,
	BSSLAP_IE_ChanDesc		chan_desc,
	BSSLAP_IE_Cause			cause,
	BSSLAP_IE_MeasRep		meas_rep optional,
	BSSLAP_IE_EnhMeasRep		enh_meas_rep optional,
	BSSLAP_IE_CellIdList		meas_cell_id_list optional,
	BSSLAP_IE_LAC			lac optional,
	BSSLAP_IE_FreqList		freq_list optional,
	BSSLAP_IE_ChanMode		chan_mode optional,
	BSSLAP_IE_MultiRateConfig	mr_config optional,
	BSSLAP_IE_PacketChanDesc	pkt_chan_desc optional,
	BSSLAP_IE_TLLI			tlli optional,
	BSSLAP_IE_TFI			tfi optional,
	BSSLAP_IE_StartingTime		tbf_start_time optional,
	BSSLAP_IE_EncryptionKey		encr_key optional,
	BSSLAP_IE_CiphModeSet		ciph_mode_set optional,
	BSSLAP_IE_LongEncryptionKey	long_encr_key optional
};

/* Section 4.2.7 */
type record BSSLAP_Abort {
	BSSLAP_MsgType			msg_type,
	BSSLAP_IE_Cause			cause
};

/* Section 4.2.8 */
type record BSSLAP_TA_Layer3 {
	BSSLAP_MsgType			msg_type,
	BSSLAP_IE_TimingAdvance		timing_advance,
	BSSLAP_IE_MeasRep		meas_rep optional,
	BSSLAP_IE_EnhMeasRep		enh_meas_rep optional,
	BSSLAP_IE_CellIdList		meas_cell_id_list optional
};

/* Section 4.2.9 */
type record BSSLAP_MS_PosCmd {
	BSSLAP_MsgType			msg_type,
	BSSLAP_IE_RrlpFlag		flag,
	BSSLAP_IE_Rrlp			rrlp_info
};

/* Section 4.2.10 */
type record BSSLAP_MS_PosResp {
	BSSLAP_MsgType			msg_type,
	BSSLAP_IE_RrlpFlag		flag,
	BSSLAP_IE_Rrlp			rrlp_info,
	BSSLAP_IE_TimingAdvance		timing_advance optional,
	BSSLAP_IE_MeasRep		meas_rep optional,
	BSSLAP_IE_EnhMeasRep		enh_meas_rep optional,
	BSSLAP_IE_CellIdList		meas_cell_id_list optional,
	BSSLAP_IE_ConcurMethodF		concur_meth_flag optional
};

/* Section 4.2.11 */
type record BSSLAP_UTDOA_Req {
	BSSLAP_MsgType			msg_type,
	BSSLAP_IE_DeltaTimer		delta_timer optional,
	BSSLAP_IE_PollingRep		polling_repetition optional
};

type union BSSLAP_PDU {
	BSSLAP_TaRequest	ta_req,
	BSSLAP_TaResponse	ta_resp,
	BSSLAP_Reject		reject,
	BSSLAP_Reset		reset,
	BSSLAP_Abort		abort,
	BSSLAP_TA_Layer3	ta_layer3,
	BSSLAP_MS_PosCmd	ms_pos_cmd,
	BSSLAP_MS_PosResp	ms_pos_resp,
	BSSLAP_UTDOA_Req	utdoa_req
	// TODO: U-TDOA Resp
} with { variant "TAG(
		ta_req,		msg_type = BSSLAP_MSGT_TA_REQUEST;
		ta_resp,	msg_type = BSSLAP_MSGT_TA_RESPONSE;
		reject,		msg_type = BSSLAP_MSGT_REJECT;
		reset,		msg_type = BSSLAP_MSGT_RESET;
		abort,		msg_type = BSSLAP_MSGT_ABORT;
		ta_layer3,	msg_type = BSSLAP_MSGT_TA_LAYER3;
		ms_pos_cmd,	msg_type = BSSLAP_MSGT_MS_POS_CMD;
		ms_pos_resp,	msg_type = BSSLAP_MSGT_MS_POS_RESP;
		utdoa_req,	msg_type = BSSLAP_MSGT_UTDOA_REQ;
		)"
};


/* Section 5.2 */
type record BSSLAP_IE_TimingAdvance {
	BSSLAP_IEI		iei,
	uint8_t			ta
} with { variant "PRESENCE(iei = BSSLAP_IEI_TA)" };


/* Section 5.4 */
type record BSSLAP_IE_CellId {
	BSSLAP_IEI		iei,
	uint16_t		cell_id
} with { variant "PRESENCE(iei = BSSLAP_IEI_CELL_ID)" };

/* Section 5.8 */
type record BSSLAP_IE_ChanDesc {
	BSSLAP_IEI		iei,
	OCT3			chan_desc
} with { variant "PRESENCE(iei = BSSLAP_IEI_CHAN_DESC)" };


/* Section 5.12 */
type record BSSLAP_IE_MeasRep {
	BSSLAP_IEI		iei,
	uint8_t			len,
	octetstring		meas_rep
} with {
	variant "PRESENCE(iei = BSSLAP_IEI_MEAS_REP)"
	variant (len) "LENGTHTO(meas_rep)"
};

/* Section 5.14 */
type record BSSLAP_IE_Cause {
	BSSLAP_IEI		iei,
	BSSLAP_Cause		cause
} with { variant "PRESENCE(iei = BSSLAP_IEI_CAUSE)" };
type enumerated BSSLAP_Cause {
	BSSLAP_CAUSE_CONGESTION			('00000000'B),
	BSSLAP_CAUSE_CHAN_MODE_NOT_SUPP		('00000001'B),
	BSSLAP_CAUSE_POS_PROC_NOT_SUPP		('00000010'B),
	BSSLAP_CAUSE_OTHER_RADIO_EVT_FAIL	('00000011'B),
	BSSLAP_CAUSE_INTRA_BSS_HO		('00000100'B),
	BSSLAP_CAUSE_SUPERV_TIMER_EXPIRED	('00000101'B),
	BSSLAP_CAUSE_INTER_BSS_HO		('00000110'B),
	BSSLAP_CAUSE_LOSS_SIG_CONN_MS		('00000111'B),
	BSSLAP_CAUSE_INCORR_SERV_CELL_ID	('00001000'B),
	BSSLAP_CAUSE_BSSAP_LE_SEGMENT_ERR	('00001001'B),
	BSSLAP_CAUSE_CONCUR_POS_PROC_NOT_EN	('00001010'B)
};

/* Section 5.15 */
type record BSSLAP_IE_RrlpFlag {
	BSSLAP_IEI		iei,
	BIT7			spare,
	boolean			not_a_pos_cmd
} with { variant "PRESENCE(iei = BSSLAP_IEI_RRLP_FLAG)" };

/* Section 5.16 */
type record BSSLAP_IE_Rrlp {
	BSSLAP_IEI		iei,
	uint16_t		len,
	octetstring		rrlp_apdu
} with {
	variant "PRESENCE(iei = BSSLAP_IEI_RRLP)"
	variant (len) "LENGTHTO(rrlp_apdu)"
};

/* Section 5.17 */
type record BSSLAP_IE_CellIdList {
	BSSLAP_IEI		iei,
	uint8_t			len,
	BSSLAP_CellIdList	cell_id_list
} with {
	variant "PRESENCE(iei = BSSLAP_IEI_CELL_ID_LIST)"
	variant (len) "LENGTHTO(cell_id_list)"
};
type record of BSSLAP_CellIdListEnt BSSLAP_CellIdList;
type union BSSLAP_CellIdListEnt {
	BIT4			spare,
	BSSLAP_CellIdDiscr	discr,
	BSSLAP_CellIdListEntU	u
}// with {
//};
type enumerated BSSLAP_CellIdDiscr {
	BSSLAP_CIDL_DISC_CGI	('0000'B),
	BSSLAP_CIDL_DISC_LAC_CI	('0001'B),
	BSSLAP_CIDL_DISC_3G_1	('0010'B),
	BSSLAP_CIDL_DISC_3G_2	('0011'B)
} with { variant "FIELDLENGTH(4)" };
type union BSSLAP_CellIdListEntU {
	BSSLAP_CellIdListEntCGI		cgi,
	BSSLAP_CellIdListEntLACCI	lac_ci,
	BSSLAP_CellIdListEnt3G1		umts_cont1,
	BSSLAP_CellIdListEnt3G2		umts_cont2
};
type record BSSLAP_CellIdListEntCGI {
	HEX6n		mcc_mnc,
	uint16_t	lac,
	uint16_t	ci
};
type record BSSLAP_CellIdListEntLACCI {
	uint16_t	lac,
	uint16_t	ci
};
type record BSSLAP_CellIdListEnt3G1 {
	OCT9		cont
};
type record BSSLAP_CellIdListEnt3G2 {
	OCT6		cont
};

/* Section 5.18 */
type record BSSLAP_IE_EnhMeasRep {
	BSSLAP_IEI		iei,
	uint8_t			len,
	octetstring		meas_rep
} with {
	variant "PRESENCE(iei = BSSLAP_IEI_ENH_MEAS_REP)"
	variant (len) "LENGTHTO(meas_rep)"
};

/* Section 5.19 */
type record BSSLAP_IE_LAC {
	BSSLAP_IEI		iei,
	uint16_t		lac
} with { variant "PRESENCE(iei = BSSLAP_IEI_LAC)" };

/* Section 5.20 */
type record BSSLAP_IE_FreqList {
	BSSLAP_IEI		iei,
	uint8_t			len,
	octetstring		freq_list
} with {
	variant "PRESENCE(iei = BSSLAP_IEI_FREQ_LIST)"
	variant (len) "LENGTHTO(freq_list)"
};

/* Section 5.21 */
type record BSSLAP_IE_MsPower {
	BSSLAP_IEI		iei,
	uint8_t			ms_pwr
} with { variant "PRESENCE(iei = BSSLAP_IEI_MS_POWER)" };

/* Section 5.22 */
type record BSSLAP_IE_DeltaTimer {
	BSSLAP_IEI		iei,
	uint8_t			timer_val
} with { variant "PRESENCE(iei = BSSLAP_IEI_MS_POWER)" };

/* Section 5.23 */
type record BSSLAP_IE_ServingCellId {
	BSSLAP_IEI		iei,
	uint8_t			len,
	octetstring		val	// FIXME: like TS 08.08
} with {
	variant "PRESENCE(iei = BSSLAP_IEI_SERVING_CELL_ID)"
	variant (len) "LENGTHTO(val)"
};

/* Section 5.24 */
type record BSSLAP_IE_EncryptionKey {
	BSSLAP_IEI		iei,
	OCT8			kc
} with { variant "PRESENCE(iei = BSSLAP_IEI_ENCR_KEY)" };

/* Section 5.25 */
type record BSSLAP_IE_CiphModeSet {
	BSSLAP_IEI		iei,
	BIT1			spare,
	BIT3			iei2,
	BIT3			algo_id,
	boolean			sc
} with { variant "PRESENCE(iei = BSSLAP_IEI_CIPH_MODE_SET)" };

/* Section 5.26 */
type record BSSLAP_IE_ChanMode {
	BSSLAP_IEI		iei,
	OCT1			mode
} with { variant "PRESENCE(iei = BSSLAP_IEI_CHAN_MODE)" };

/* Section 5.27 */
type record BSSLAP_IE_MultiRateConfig {
	BSSLAP_IEI		iei,
	uint8_t			len,
	/* TODO: Unify with TS 48.018 */
	uint3_t			mr_speech_ver,
	boolean			nscb,
	boolean			icmi,
	BIT1			spare,
	uint2_t			start_mode,
	octetstring		parameters
} with {
	variant "PRESENCE(iei = BSSLAP_IEI_MR_CONFIG)"
	variant (len) "LENGTHTO(mr_speech_ver,nscb,icmi,spare,start_mode,parameters)"
};

/* Section 5.28 */
type record BSSLAP_IE_PollingRep {
	BSSLAP_IEI		iei,
	BIT2			spare,
	uint6_t			num_rep
} with { variant "PRESENCE(iei = BSSLAP_IEI_MR_CONFIG)" };

/* Section 5.29 */
type record BSSLAP_IE_PacketChanDesc {
	BSSLAP_IEI		iei,
	OCT4			chan_desc
} with { variant "PRESENCE(iei = BSSLAP_IEI_PACKET_CHAN_DESC)" };

/* Section 5.30 */
type record BSSLAP_IE_TLLI {
	BSSLAP_IEI		iei,
	OCT4			tlli
} with { variant "PRESENCE(iei = BSSLAP_IEI_TLLI)" };

/* Section 5.31 */
type record BSSLAP_IE_TFI {
	BSSLAP_IEI		iei,
	BIT3			spare,
	uint5_t			tfi
} with { variant "PRESENCE(iei = BSSLAP_IEI_TFI)" };

/* Section 5.32 */
type record BSSLAP_IE_StartingTime {
	BSSLAP_IEI		iei,
	uint5_t			t1_p,
	uint6_t			t3,
	uint6_t			t2
} with { variant "PRESENCE(iei = BSSLAP_IEI_TBF_START_TIME)" };

/* Section 5.33 */
type record BSSLAP_IE_LongEncryptionKey {
	BSSLAP_IEI		iei,
	OCT16			kc
} with { variant "PRESENCE(iei = BSSLAP_IEI_LONG_ENCR_KEY)" };

/* Section 5.34 */
type record BSSLAP_IE_ConcurMethodF {
	BSSLAP_IEI		iei,
	BSSLAP_ConcurMethodF	flag
} with { variant "PRESENCE(iei = BSSLAP_IEI_CONCUR_POS_PROC_F)" };
type enumerated BSSLAP_ConcurMethodF {
	BSSLAP_SECOND_CONCUR_ALLOWED	('00000000'B),
	BSSLAP_SECOND_CONCUR_DISALLOWED	('11111111'B)
} with { variant "FIELDLENGTH(8)" };



external function enc_BSSLAP_PDU(in BSSLAP_PDU msg) return octetstring
	with { extension "prototype(convert) encode(RAW)" };
external function dec_BSSLAP_PDU(in octetstring stream) return BSSLAP_PDU
	with { extension "prototype(convert) decode(RAW)" };

template (value) BSSLAP_PDU ts_BSSLAP_TA_Req := {
	ta_req := {
		msg_type := BSSLAP_MSGT_TA_REQUEST
	}
}
template (present) BSSLAP_PDU tr_BSSLAP_TA_Req := {
	ta_req := {
		msg_type := BSSLAP_MSGT_TA_REQUEST
	}
}

template (value) BSSLAP_PDU
ts_BSSLAP_TA_Resp(uint16_t cell_id, uint8_t ta)  := {
	ta_resp := {
		msg_type := BSSLAP_MSGT_TA_RESPONSE,
		serving_cell_id := ts_BSSLAP_IE_CellId(cell_id),
		timing_advance := ts_BSSLAP_IE_TA(ta),
		meas_rep := omit,
		enh_meas_rep := omit,
		meas_cell_id_list := omit,
		concur_meth_flag := omit
 	}
}
template (present) BSSLAP_PDU
tr_BSSLAP_TA_Resp(template (present) uint16_t cell_id, template (present) uint8_t ta)  := {
	ta_resp := {
		msg_type := BSSLAP_MSGT_TA_RESPONSE,
		serving_cell_id := tr_BSSLAP_IE_CellId(cell_id),
		timing_advance := tr_BSSLAP_IE_TA(ta),
		meas_rep := *,
		enh_meas_rep := *,
		meas_cell_id_list := *,
		concur_meth_flag := *
 	}
}

template (value) BSSLAP_PDU
ts_BSSLAP_Reject(BSSLAP_Cause cause) := {
	reject := {
		msg_type := BSSLAP_MSGT_REJECT,
		cause := ts_BSSLAP_IE_Cause(cause)
	}
}
template (present) BSSLAP_PDU
tr_BSSLAP_Reject(template (present) BSSLAP_Cause cause) := {
	reject := {
		msg_type := BSSLAP_MSGT_REJECT,
		cause := tr_BSSLAP_IE_Cause(cause)
	}
}


template (value) BSSLAP_PDU
ts_BSSLAP_Abort(BSSLAP_Cause cause) := {
	abort := {
		msg_type := BSSLAP_MSGT_ABORT,
		cause := ts_BSSLAP_IE_Cause(cause)
	}
}
template (present) BSSLAP_PDU
tr_BSSLAP_Abort(template (present) BSSLAP_Cause cause) := {
	abort := {
		msg_type := BSSLAP_MSGT_ABORT,
		cause := tr_BSSLAP_IE_Cause(cause)
	}
}

template (value) BSSLAP_PDU ts_BSSLAP_TA_Layer3(uint8_t ta) := {
	ta_layer3 := {
		msg_type := BSSLAP_MSGT_TA_LAYER3,
		timing_advance := ts_BSSLAP_IE_TA(ta),
		meas_rep := omit,
		enh_meas_rep := omit,
		meas_cell_id_list := omit
	}
}

template (present) BSSLAP_PDU tr_BSSLAP_TA_Layer3(template BSSLAP_IE_TimingAdvance timing_advance := *) := {
	ta_layer3 := {
		msg_type := BSSLAP_MSGT_TA_LAYER3,
		timing_advance := timing_advance,
		meas_rep := *,
		enh_meas_rep := *,
		meas_cell_id_list := *
	}
}

template (value) BSSLAP_IE_ChanDesc ts_BSSLAP_IE_ChanDesc := {
	iei := BSSLAP_IEI_CHAN_DESC,
	chan_desc := '112233'O /* FIXME */
}

template (value) BSSLAP_PDU
ts_BSSLAP_Reset(uint16_t cell_id,
		uint8_t ta,
		BSSLAP_IE_ChanDesc chan_desc,
		BSSLAP_Cause cause) := {
	reset := {
		msg_type := BSSLAP_MSGT_RESET,
		cell_id := ts_BSSLAP_IE_CellId(cell_id),
		timing_advance := ts_BSSLAP_IE_TA(ta),
		chan_desc := chan_desc,
		cause := tr_BSSLAP_IE_Cause(cause),
		meas_rep := omit,
		enh_meas_rep := omit,
		meas_cell_id_list := omit,
		lac := omit,
		freq_list := omit,
		chan_mode := omit,
		mr_config := omit,
		pkt_chan_desc := omit,
		tlli := omit,
		tfi := omit,
		tbf_start_time := omit,
		encr_key := omit,
		ciph_mode_set := omit,
		long_encr_key := omit
	}
}

template (present) BSSLAP_PDU
tr_BSSLAP_Reset(template (present) BSSLAP_Cause cause) := {
	reset := {
		msg_type := BSSLAP_MSGT_RESET,
		cell_id := ?,
		timing_advance := ?,
		chan_desc := ?,
		cause := tr_BSSLAP_IE_Cause(cause),
		meas_rep := *,
		enh_meas_rep := *,
		meas_cell_id_list := *,
		lac := *,
		freq_list := *,
		chan_mode := *,
		mr_config := *,
		pkt_chan_desc := *,
		tlli := *,
		tfi := *,
		tbf_start_time := *,
		encr_key := *,
		ciph_mode_set := *,
		long_encr_key := *
	}
}

template (value) BSSLAP_IE_TimingAdvance ts_BSSLAP_IE_TA(uint8_t ta) := {
	iei := BSSLAP_IEI_TA,
	ta := ta
}
template (present) BSSLAP_IE_TimingAdvance tr_BSSLAP_IE_TA(template (present) uint8_t ta) := {
	iei := BSSLAP_IEI_TA,
	ta := ta
}

template (value) BSSLAP_IE_CellId ts_BSSLAP_IE_CellId(uint16_t cell_id) := {
	iei := BSSLAP_IEI_CELL_ID,
	cell_id := cell_id
}
template (present) BSSLAP_IE_CellId tr_BSSLAP_IE_CellId(template (present) uint16_t cell_id) := {
	iei := BSSLAP_IEI_CELL_ID,
	cell_id := cell_id
}

template (value) BSSLAP_IE_Cause ts_BSSLAP_IE_Cause(BSSLAP_Cause cause) := {
	iei := BSSLAP_IEI_CAUSE,
	cause := cause
}
template (present) BSSLAP_IE_Cause tr_BSSLAP_IE_Cause(template (present) BSSLAP_Cause cause) := {
	iei := BSSLAP_IEI_CAUSE,
	cause := cause
}






} with { encode "RAW" };
