module BSSAP_LE_Types {

/* BSSAP_LE_Types, defining abstract TTCN-3 data types for the 3GPP BSSMAP-LE protocol.
 *
 * BSSMAP-LE is a 3GPP standard protocol used by SMLC and its peers in a GSM network.
 * This file covers 3GPP TS 49.031 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;
import from BSSAP_Types all;
import from BSSLAP_Types all;
import from MobileL3_CommonIE_Types all;

/* TS 49.031 Section 10.1 */
type enumerated BSSMAP_LE_MsgType {
	BSSMAP_LE_PERFORM_LOC_REQ	('00101011'B),
	BSSMAP_LE_PERFORM_LOC_RESP	('00101101'B),
	BSSMAP_LE_PERFORM_LOC_ABORT	('00101110'B),
	BSSMAP_LE_PERFORM_LOC_INFO	('00101111'B),
	BSSMAP_LE_ASSIST_INFO_REQ	('00100000'B),
	BSSMAP_LE_ASSIST_INFO_RESP	('00100001'B),

	BSSMAP_LE_CONN_ORIENTED_INFO	('00101010'B),
	BSSMAP_LE_CONN_LESS_INFO	('00111010'B),

	BSSMAP_LE_RESET			('00110000'B),
	BSSMAP_LE_RESET_ACK		('00110001'B)
} with { variant "FIELDLENGTH(8)" };

/* TS 49.031 Section 10.2 */
type enumerated BSSMAP_LE_IEI {
	BSSMAP_LE_IEI_LCS_QoS		('00111110'B),
	BSSMAP_LE_IEI_LCS_PRIORITY	('01000011'B),
	BSSMAP_LE_IEI_LOCATION_TYPE	('01000100'B),
	BSSMAP_LE_IEI_GANSS_LOCATION_TYPE ('10000010'B),
	BSSMAP_LE_IEI_GEO_LOCATION	('01000101'B),
	BSSMAP_LE_IEI_POSITIONING_DATA	('01000110'B),
	BSSMAP_LE_IEI_GANSS_POS_DATA	('10000011'B),
	BSSMAP_LE_IEI_VELOCITY_DATA	('01010101'B),
	BSSMAP_LE_IEI_LCS_CAUSE		('01000111'B),
	BSSMAP_LE_IEI_LCS_CLIENT_TYPE	('01001000'B),
	BSSMAP_LE_IEI_APDU		('01001001'B),
	BSSMAP_LE_IEI_NET_ELEM_ID	('01001010'B),
	BSSMAP_LE_IEI_REQ_GPS_ASS_D	('01001011'B),
	BSSMAP_LE_IEI_REQ_GANSS_ASS_D	('01000001'B),
	BSSMAP_LE_IEI_DECIPH_KEYS	('01001100'B),
	BSSMAP_LE_IEI_RET_ERR_REQ	('01001101'B),
	BSSMAP_LE_IEI_RET_ERR_CAUSE	('01001110'B),
	BSSMAP_LE_IEI_SEGMENTATION	('01001111'B),
	BSSMAP_LE_IEI_CLASSMARK3_INFO	('00010011'B),
	BSSMAP_LE_IEI_CAUSE		('00000100'B),
	BSSMAP_LE_IEI_CELL_ID		('00000101'B),
	BSSMAP_LE_IEI_CHOSEN_CHAN	('00100001'B),
	BSSMAP_LE_IEI_IMSI		('00000000'B),
	BSSMAP_LE_IEI_LCS_CAPABILITY	('01010000'B),
	BSSMAP_LE_IEI_PKT_MEAS_REP	('01010001'B),
	BSSMAP_LE_IEI_CELL_ID_LIST	('01010010'B),
	BSSMAP_LE_IEI_IMEI		('10000000'B),
	BSSMAP_LE_IEI_BSS_MLAT_CAP	('10000100'B),
	BSSMAP_LE_IEI_CELL_INFO_LIST	('10000101'B),
	BSSMAP_LE_IEI_BTS_RX_ACC_LVL	('10000110'B),
	BSSMAP_LE_IEI_MLAT_METHOD	('10000111'B),
	BSSMAP_LE_IEI_MLAT_TA		('10001000'B),
	BSSMAP_LE_IEI_MS_SYNC_ACC	('10001001'B),
	BSSMAP_LE_IEI_SHORT_ID_SET	('10001010'B),
	BSSMAP_LE_IEI_RANDOM_ID_SET	('10001011'B),
	BSSMAP_LE_IEI_SHORT_BSS_ID	('10001100'B),
	BSSMAP_LE_IEI_RANDOM_ID		('10001101'B),
	BSSMAP_LE_IEI_SHORT_ID		('10001110'B),
	BSSMAP_LE_IEI_COVERAGE_CLASS	('10001111'B),
	BSSMAP_LE_IEI_MTA_ACC_SEC_RQD	('10010000'B)
} with { variant "FIELDLENGTH(8)" };

/* Section 9.1 */
type record BSSMAP_LE_PerfLocReq {
	BSSMAP_LE_MsgType 			msg_type,
	BSSMAP_LE_IE_LocationType		location_type,
	BSSMAP_IE_CellIdentifier		cell_id,
	BSSMAP_IE_ClassmarkInformationType3	cm3 optional,
	BSSMAP_LE_IE_LcsClientType		lcs_client_type optional,
	BSSMAP_IE_ChosenChannel			chosen_channel optional,
	BSSMAP_LE_IE_LcsPriority		lcs_priority optional,
	BSSMAP_LE_IE_LcsQoS			lcs_qos optional,
	BSSMAP_LE_IE_ReqGpsAssD			req_gps_ass_d optional,
	BSSMAP_LE_IE_APDU			bsslap_apdu optional,
	BSSMAP_LE_IE_LcsCapability		lcs_capability optional,
	BSSMAP_LE_IE_PacketMeasRep		packet_meas_rep optional,
	BSSMAP_LE_IE_CellIdList			meas_cell_id_list optional,
	BSSMAP_LE_IE_IMSI			imsi optional,
	BSSMAP_LE_IE_IMEI			imei optional
	// TODO: more optional IEs
};

/* Section 9.2 */
type record BSSMAP_LE_PerfLocResp {
	BSSMAP_LE_MsgType			msg_type,
	BSSMAP_LE_IE_GeographicLoc		geographic_loc optional,
	BSSMAP_LE_IE_PositioningData		pos_data optional,
	BSSMAP_LE_IE_DecipheringKeys		deciph_keys optional,
	BSSMAP_LE_IE_LcsCause			lcs_cause optional,
	BSSMAP_LE_IE_VelocityData		velocity_data optional,
	BSSMAP_LE_IE_GanssPosData		ganss_pos_data optional
};

/* Section 9.4 */
type record BSSMAP_LE_PerfLocAbort {
	BSSMAP_LE_MsgType			msg_type,
	BSSMAP_LE_IE_LcsCause			lcs_cause
};

/* Section 9.8 */
type record BSSMAP_LE_ConnOrientedInfo {
	BSSMAP_LE_MsgType			msg_type,
	BSSMAP_LE_IE_APDU			bsslap_apdu,
	BSSMAP_LE_IE_Segmentation		segmentation optional
	// TODO: MLA related optional IEs
};

/* Section 9.9 */
type record BSSMAP_LE_ConnLessInfo {
	BSSMAP_LE_MsgType			msg_type,
	BSSMAP_LE_IE_NetElementId		source_id,
	BSSMAP_LE_IE_NetElementId		dest_id,
	BSSMAP_LE_IE_APDU			bsslap_apdu optional,
	BSSMAP_LE_IE_Segmentation		segmentation optional,
	BSSMAP_LE_IE_RetErrReq			ret_err_req optional,
	BSSMAP_LE_IE_RetErrCause		ret_err_cause optional
};

/* Section 9.10 */
type record BSSMAP_LE_Reset {
	BSSMAP_LE_MsgType 		msg_type,
	BSSMAP_IE_Cause			cause
};

/* Section 9.11 */
type record BSSMAP_LE_ResetAck {
	BSSMAP_LE_MsgType 		msg_type
};

/* Section 9.12 */
type record BSSMAP_LE_PerformLocInfo {
	BSSMAP_LE_MsgType 		msg_type,
	BSSMAP_IE_CellIdentifier	cell_id,
	BSSMAP_LE_IE_APDU		bsslap_apdu optional
};

type union BSSMAP_LE_PDU {
	BSSMAP_LE_PerfLocReq		perf_loc_req,
	BSSMAP_LE_PerfLocResp		perf_loc_resp,
	BSSMAP_LE_PerfLocAbort		perf_loc_abort,
	BSSMAP_LE_ConnOrientedInfo	co_info,
	BSSMAP_LE_ConnLessInfo		cl_info,
	BSSMAP_LE_Reset			reset,
	BSSMAP_LE_ResetAck		reset_ack,
	BSSMAP_LE_PerformLocInfo	perf_loc_info,
	/* The following BSSMAP messages defined in 3GPP TS 48.008 are applicable to the Lb interface to
	 * support signaling to a Type A LMU using an SDCCH */
	PDU_BSSMAP_CipherModeCommand	cipherModeCommand,
	PDU_BSSMAP_CipherModeComplete	cipherModeComplete,
	PDU_BSSMAP_CipherModeReject	cipherModeReject,
	PDU_BSSMAP_ClassmarkUpdate	classmarkUpdate,
	PDU_BSSMAP_ClearCommand		clearCommand,
	PDU_BSSMAP_ClearComplete	clearComplete,
	PDU_BSSMAP_ClearRequest		clearRequest,
	PDU_BSSMAP_CompleteLayer3Information	completeLayer3Information,
	PDU_BSSMAP_Confusion		confusion,
	PDU_BSSMAP_HandoverRequired	handoverRequired,
	PDU_BSSMAP_HandoverRequiredReject handoverRequiredReject,
	PDU_BSSMAP_HandoverPerformed	handoverPerformed,
	PDU_BSSMAP_Paging		paging
} with {
	variant "TAG(
			perf_loc_req,	msg_type = BSSMAP_LE_PERFORM_LOC_REQ;
			perf_loc_resp,	msg_type = BSSMAP_LE_PERFORM_LOC_RESP;
			perf_loc_abort,	msg_type = BSSMAP_LE_PERFORM_LOC_ABORT;
			co_info,	msg_type = BSSMAP_LE_CONN_ORIENTED_INFO;
			cl_info,	msg_type = BSSMAP_LE_CONN_LESS_INFO;
			reset,		msg_type = BSSMAP_LE_RESET;
			reset_ack,	msg_type = BSSMAP_LE_RESET_ACK;
			perf_loc_info,	msg_type = BSSMAP_LE_PERFORM_LOC_INFO;
		)"
};

/* Section 10.3 */
type record BSSMAP_LE_IE_APDU {
	BSSMAP_LE_IEI		iei,
	uint16_t		len,
	BSSMAP_LE_ProtocolId	protocol_id,
	BIT1			spare,
	octetstring		data
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_APDU)"
	variant (len) "LENGTHTO(protocol_id,spare,data)"
};
type enumerated BSSMAP_LE_ProtocolId {
	BSSMAP_LE_PROT_RESERVED		('0000000'B),
	BSSMAP_LE_PROT_BSSLAP		('0000001'B),
	BSSMAP_LE_PROT_LLP		('0000010'B),
	BSSMAP_LE_PROT_SMLCPP		('0000011'B)
} with { variant "FIELDLENGTH(7)" };

/* Section 10.8 */
type record BSSMAP_LE_IE_DecipheringKeys {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	BIT7			spare,
	boolean			ciph_key_flag,
	OCT7			cur_deciph_key,
	OCT7			next_deciph_key
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_DECIPH_KEYS)"
	variant (len) "LENGTHTO(spare,ciph_key_flag,cur_deciph_key,next_deciph_key)"
}

/* Section 10.9 */
type record BSSMAP_LE_IE_GeographicLoc {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	octetstring		location
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_GEO_LOCATION)"
	variant (len) "LENGTHTO(location)"
}

/* Section 10.10 */
type record BSSMAP_LE_IE_ReqGpsAssD {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	BIT16			flags,
	octetstring		sat_data
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_REQ_GPS_ASS_D)"
	variant (len) "LENGTHTO(flags,sat_data)"
}

/* Section 10.11 */
type record BSSMAP_LE_IE_IMSI {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	MobileIdentityV		imsi
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_IMSI)"
	variant (len) "LENGTHTO(imsi)"
}

/* Section 10.13 */
type record BSSMAP_LE_IE_LcsCause {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	BSSMAP_LE_LcsCause	cause,
	OCT1			diag_val optional
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_LCS_CAUSE)"
	variant (len) "LENGTHTO(cause,diag_val)"
}
type enumerated BSSMAP_LE_LcsCause {
	BSSMAP_LE_LCS_CAUSE_UNSPECIFIED		('00000000'B),
	BSSMAP_LE_LCS_CAUSE_SYSTEM_FAILURE	('00000001'B),
	BSSMAP_LE_LCS_CAUSE_PROTOCOL_ERROR	('00000010'B),
	BSSMAP_LE_LCS_CAUSE_DATA_MISSING_IN_REQ	('00000011'B),
	BSSMAP_LE_LCS_CAUSE_UNEXP_DATA_IN_REQ	('00000100'B),
	BSSMAP_LE_LCS_CAUSE_POS_METH_FAILURE	('00000101'B),
	BSSMAP_LE_LCS_CAUSE_TGT_MS_UNREACHABLE	('00000110'B),
	BSSMAP_LE_LCS_CAUSE_REQUEST_ABORTED	('00000111'B),
	BSSMAP_LE_LCS_CAUSE_FACILITY_NOTSUPP	('00001000'B),
	BSSMAP_LE_LCS_CAUSE_INTER_BSC_HO	('00001001'B),
	BSSMAP_LE_LCS_CAUSE_INTRA_BSC_HO	('00001010'B),
	BSSMAP_LE_LCS_CAUSE_CONGESTION		('00001011'B),
	BSSMAP_LE_LCS_CAUSE_INTER_NSE_CHG	('00001100'B),
	BSSMAP_LE_LCS_CAUSE_RA_UPDAT		('00001101'B),
	BSSMAP_LE_LCS_CAUSE_PTMSI_REALLOC	('00001110'B),
	BSSMAP_LE_LCS_CAUSE_GPRS_SUSPENSION	('00001111'B)
} with { variant "FIELDLENGTH(8)" };

/* Section 10.14 */
type record BSSMAP_LE_IE_LcsClientType {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	BSSMAP_LE_ClientType	cltype
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_CAUSE)"
	variant (len) "LENGTHTO(cltype)"
}
type enumerated BSSMAP_LE_ClientType {
	BSSMAP_LE_LCS_CTYPE_VALUE_ADDED_UNSPECIFIED	('00000000'B),
	BSSMAP_LE_LCS_CTYPE_PLMN_OPER_UNSPECIFIED	('00100000'B),
	BSSMAP_LE_LCS_CTYPE_PLMN_OPER_BCAST_SERVICE	('00100001'B),
	BSSMAP_LE_LCS_CTYPE_PLMN_OPER_OAM		('00100010'B),
	BSSMAP_LE_LCS_CTYPE_PLMN_OPER_ANON_STATS	('00100011'B),
	BSSMAP_LE_LCS_CTYPE_PLMN_OPER_TGT_MS_SVC	('00100100'B),
	BSSMAP_LE_LCS_CTYPE_EMERG_SVC_UNSPECIFIED	('00110000'B),
	BSSMAP_LE_LCS_CTYPE_LI_UNSPECIFIED		('01000000'B)
} with { variant "FIELDLENGTH(8)" };

/* Section 10.15 */
type record BSSMAP_LE_IE_LcsPriority {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	OCT1			priority
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_LCS_PRIORITY)"
	variant (len) "LENGTHTO(priority)"
}

/* Section 10.16 */
type record BSSMAP_LE_IE_LcsQoS {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,

	BIT6			spare,
	boolean			vel,
	boolean			vert,

	boolean			ha,
	uint7_t			horiz_acc,

	boolean			va,
	uint7_t			vert_acc,

	BIT2			rt,
	BIT6			spare2
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_LCS_QoS)"
	variant (len) "LENGTHTO(spare,vel,vert,ha,horiz_acc,va,vert_acc,rt,spare2)"
}

/* Section 10.18 */
type record BSSMAP_LE_IE_LocationType {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	BSSMAP_LE_LocInfo	loc_info,
	BSSMAP_LE_PosMethod	pos_method optional
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_LOCATION_TYPE)"
	variant (len) "LENGTHTO(loc_info,pos_method)"
	variant (pos_method) "PRESENCE(loc_info = BSSMAP_LE_LOC_INFO_ASS_INFO_FOR_TGT_MS,
				       loc_info = BSSMAP_LE_LOC_INFO_DECIPH_KEYS_FOR_BCAST)"
}
type enumerated BSSMAP_LE_LocInfo {
	BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC	('00000000'B),
	BSSMAP_LE_LOC_INFO_ASS_INFO_FOR_TGT_MS		('00000001'B),
	BSSMAP_LE_LOC_INFO_DECIPH_KEYS_FOR_BCAST	('00000010'B)
} with { variant "FIELDLENGTH(8)" };
type enumerated BSSMAP_LE_PosMethod {
	BSSMAP_LE_POS_METHOD_RESERVED		('00000000'B),
	BSSMAP_LE_POS_MOBILE_ASSISTED_EOTD	('00000001'B),
	BSSMAP_LE_POS_MOBILE_BASED_EOTD		('00000010'B),
	BSSMAP_LE_POS_ASSISTED_GPS		('00000011'B),
	BSSMAP_LE_POS_ASSISTED_GANSS		('00000100'B),
	BSSMAP_LE_POS_ASSISTED_GPS_AND_GANSS	('00000101'B)
} with { variant "FIELDLENGTH(8)" };

/* Section 10.19 */
type record BSSMAP_LE_IE_NetElementId {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	BIT4			spare,
	BSSMAP_LE_IdDiscr	id_discr,
	BSSMAP_LE_IdU		u
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_NET_ELEM_ID)"
	variant (len) "LENGTHTO(spare,id_discr,u)"
	variant (u) "CROSSTAG(
				cgi,		id_discr = BSSMAP_LE_ID_DISC_CGI;
				lac_ci,		id_discr = BSSMAP_LE_ID_DISC_LAC_CI;
				lai,		id_discr = BSSMAP_LE_ID_DISC_LAI;
				lac,		id_discr = BSSMAP_LE_ID_DISC_LAC;
				lmu,		id_discr = BSSMAP_LE_ID_LMU;
			)"
};
type enumerated BSSMAP_LE_IdDiscr {
	BSSMAP_LE_ID_DISC_CGI		('0000'B),
	BSSMAP_LE_ID_DISC_LAC_CI	('0001'B),
	BSSMAP_LE_ID_DISC_LAI		('0100'B),
	BSSMAP_LE_ID_DISC_LAC		('0101'B),
	BSSMAP_LE_ID_LMU		('0110'B)
} with { variant "FIELDLENGTH(4)" };
type union BSSMAP_LE_IdU {
	BSSMAP_LE_Id_CGI	cgi,
	BSSMAP_LE_Id_LAC_CI	lac_ci,
	BSSMAP_LE_Id_LAI	lai,
	uint16_t		lac,
	octetstring		lmu
};
type record BSSMAP_LE_Id_CGI {
	HEX6n		mcc_mnc,
	uint16_t	lac,
	uint16_t	ci
};
type record BSSMAP_LE_Id_LAC_CI {
	uint16_t	lac,
	uint16_t	ci
};
type record BSSMAP_LE_Id_LAI {
	HEX6n		mcc_mnc,
	uint16_t	lac
};

/* Section 10.20 */
type record BSSMAP_LE_IE_PositioningData {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	BIT4			spare,
	uint4_t			discr,
	BSSMAP_LE_PosMethList	pos_meth
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_POSITIONING_DATA)"
	variant (len) "LENGTHTO(spare,discr,pos_meth)"
};
type record of BSSMAP_LE_PosMethodN BSSMAP_LE_PosMethList;
type record BSSMAP_LE_PosMethodN {
	BSSMAP_LE_Method	method,
	BSSMAP_LE_Usage		usage
};
type enumerated BSSMAP_LE_Method {
	BSSMAP_LE_METHOD_TA				('00000'B),
	BSSMAP_LE_METHOD_RESERVED0			('00001'B),
	BSSMAP_LE_METHOD_RESERVED1			('00010'B),
	BSSMAP_LE_METHOD_MOBILE_ASS_EOTD		('00011'B),
	BSSMAP_LE_METHOD_MOBILE_BASED_EOTD		('00100'B),
	BSSMAP_LE_METHOD_MOBILE_ASS_GPS			('00101'B),
	BSSMAP_LE_METHOD_MOBILE_BASED_GPS		('00110'B),
	BSSMAP_LE_METHOD_CONVENTIONAL_GPS		('00111'B),
	BSSMAP_LE_METHOD_UTDOA				('01000'B),
	BSSMAP_LE_METHOD_CELL_ID			('01100'B)
} with { variant "FIELDLENGTH(5)" };
type enumerated BSSMAP_LE_Usage {
	BSSMAP_LE_USAGE_ATTEMPTED_UNSUCC			('000'B),
	BSSMAP_LE_USAGE_ATTEMPTED_SUCC_NOT_USED			('001'B),
	BSSMAP_LE_USAGE_ATTEMPTED_SUCC_USED_VRFY_NOT_GEN	('010'B),
	BSSMAP_LE_USAGE_ATTEMPTED_SUCC_USED_GEN			('011'B),
	BSSMAP_LE_USAGE_ATTEMPTED_SUCC_USAGE_UNDETERMINED	('100'B)
} with { variant "FIELDLENGTH(3)" };

/* Section 10.21 */
type record BSSMAP_LE_IE_RetErrReq {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	OCT1			ret_err_type
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_RET_ERR_REQ)"
	variant (len) "LENGTHTO(ret_err_type)"
}

/* Section 10.22 */
type record BSSMAP_LE_IE_RetErrCause {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	BSSMAP_LE_RetErrCause	cause
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_RET_ERR_REQ)"
	variant (len) "LENGTHTO(cause)"
}
type enumerated BSSMAP_LE_RetErrCause {
	BSSMAP_LE_RE_CAUSE_UNSPECIFIED		('00000000'B),
	BSSMAP_LE_RE_CAUSE_SYSTEM_FAILURE	('00000001'B),
	BSSMAP_LE_RE_CAUSE_PROTOCOL_ERROR	('00000010'B),
	BSSMAP_LE_RE_CAUSE_DEST_UNKNOWN		('00000011'B),
	BSSMAP_LE_RE_CAUSE_DEST_UNREACHABLE	('00000100'B),
	BSSMAP_LE_RE_CAUSE_CONGESTION		('00000101'B)
} with { variant "FIELDLENGTH(8)" };

/* Section 10.24 */
type record BSSMAP_LE_IE_Segmentation {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	BIT3			spare,
	boolean			s_non_final,
	uint4_t			seg_nr,
	OCT2			msg_id optional
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_SEGMENTATION)"
	variant (len) "LENGTHTO(spare,s_non_final,seg_nr,msg_id)"
}

/* Section 10.26 */
type record BSSMAP_LE_IE_LcsCapability {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	octetstring		lcs_cap
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_LCS_CAPABILITY)"
	variant (len) "LENGTHTO(lcs_cap)"
}

type record BSSMAP_LE_IE_PacketMeasRep {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	octetstring		pkt_meas_rep
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_PKT_MEAS_REP)"
	variant (len) "LENGTHTO(pkt_meas_rep)"
}

type record BSSMAP_LE_IE_CellIdList {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	BSSLAP_CellIdList	cell_id_list
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_CELL_ID_LIST)"
	variant (len) "LENGTHTO(cell_id_list)"
}

/* Section 10.29 */
type record BSSMAP_LE_IE_IMEI {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	MobileIdentityV		imei
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_IMEI)"
	variant (len) "LENGTHTO(imei)"
}

/* Section 10.30 */
type record BSSMAP_LE_IE_VelocityData {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	octetstring		data
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_VELOCITY_DATA)"
	variant (len) "LENGTHTO(data)"
}

/* Section 10.32 */
type record BSSMAP_LE_IE_GanssPosData {
	BSSMAP_LE_IEI		iei,
	uint8_t			len,
	BSSMAP_LE_GanssList	list
} with {
	variant "PRESENCE(iei = BSSMAP_LE_IEI_VELOCITY_DATA)"
	variant (len) "LENGTHTO(list)"
}
type record of BSSMAP_LE_Ganss BSSMAP_LE_GanssList;
type record BSSMAP_LE_Ganss {
	BSSMAP_LE_GanssMethod	method,
	BSSMAP_LE_GanssId	id,
	BSSMAP_LE_Usage		usage
};
type enumerated BSSMAP_LE_GanssMethod {
	BSSMAP_LE_GANSS_METH_MS_BASED		('00'B),
	BSSMAP_LE_GANSS_METH_MS_ASSISTED	('01'B),
	BSSMAP_LE_GANSS_METH_MS_CONVENTIONAL	('10'B),
	BSSMAP_LE_GANSS_METH_MS_RESERVED	('11'B)
} with { variant "FIELDLENGTH(2)" };
type enumerated BSSMAP_LE_GanssId {
	BSSMAP_LE_GANSS_ID_GALILEO		('000'B),
	BSSMAP_LE_GANSS_ID_SBAS			('001'B),
	BSSMAP_LE_GANSS_ID_MODERNIZED_GPS	('010'B),
	BSSMAP_LE_GANSS_ID_QZSS			('011'B),
	BSSMAP_LE_GANSS_ID_GLONASS		('100'B),
	BSSMAP_LE_GANSS_ID_BDS			('101'B)
} with { variant "FIELDLENGTH(3)" };

/* FIXME: Further IEs */




type union BSSMAPLEorDTAP {
	BSSMAP_LE_PDU		bssmap,
	octetstring  		dtap
}

type record PDU_BSSAP_LE {
	BIT1		discriminator, 	// 0 = BSSMAP-LE; 1 = DTAP-LE
	BIT7		spare,		// always '0000000'B
	OCT1		dlci optional,
	LIN1		lengthIndicator,
	BSSMAPLEorDTAP	pdu
} with {
	variant (lengthIndicator) "LENGTHTO(pdu)"
	variant (pdu) "CROSSTAG(bssmap, discriminator='0'B;
				dtap, discriminator='1'B)"
	variant (dlci) "PRESENCE(discriminator='1'B)"
}


external function enc_PDU_BSSAP_LE(in PDU_BSSAP_LE pdu) return octetstring
with { extension "prototype(convert) encode(RAW)" }
external function dec_PDU_BSSAP_LE(in octetstring stream) return PDU_BSSAP_LE
with { extension "prototype(convert) decode(RAW)" }


} with { encode "RAW" ; }
