module BSSGP_Types {

	import from General_Types all;
	import from Osmocom_Types all;
	import from GSM_Types all;
	import from GSM_RR_Types all;
	import from BSSGP_Helper_Functions all;

	type enumerated BssgpPduType {
		DL_UNITDATA		('00'H),
		UL_UNITDATA		('01'H),
		RA_CAPABILITY		('02'H),
		DL_MBMS_UNITDATA	('04'H),
		UL_MBMS_UNITDATA	('05'H),
		/* between GMM SAPs */
		PAGING_PS		('06'H),
		PAGING_CS		('07'H),
		RA_CAPABILITY_UPDATE	('08'H),
		RA_CAPABILITY_UPDATE_ACK ('09'H),
		RADIO_STATUS		('0A'H),
		SUSPEND			('0B'H),
		SUSPEND_ACK		('0C'H),
		SUSPEND_NACK		('0D'H),
		RESUME			('0E'H),
		RESUME_ACK		('0F'H),
		RESUME_NACK		('10'H),
		/* between NM SAPs */
		BVC_BLOCK		('20'H),
		BVC_BLOCK_ACK		('21'H),
		BVC_RESET		('22'H),
		BVC_RESET_ACK		('23'H),
		BVC_UNBLOCK		('24'H),
		BVC_UNBLOCK_ACK		('25'H),
		FLOW_CONTROL_BVC	('26'H),
		FLOW_CONTROL_BVC_ACK	('27'H),
		FLOW_CONTROL_MS		('28'H),
		FLOW_CONTROL_MS_ACK	('29'H),
		FLUSH_LL		('2A'H),
		FLUSH_LL_ACK		('2B'H),
		LLC_DISCARDED		('2C'H),
		FLOW_CONTROL_PFC	('2D'H),
		FLOW_CONTROL_PFC_ACK	('2E'H),
		SGSN_INVOKE_TRACE	('40'H),
		STATUS			('41'H)
		/* between PFM SAPs : TODO */
		/* between LCS SAPs : TODO */
		/* between RIM SAPs : TODO */
		/* between MBMS SAPs : TODO */
	} with { variant "FIELDLENGTH(8)" };

	type enumerated BssgpIEI {
		ALIGNMENT_OCTETS		('00'H),
		BMAX_DEFAULT_MS			('01'H),
		BSS_AREA_INDICATION		('02'H),
		BUCKET_LEAK_RATE		('03'H),
		BVCI				('04'H),
		BVC_BUCKET_SIZE			('05'H),
		BVC_MEASUREMENT			('06'H),
		CAUSE				('07'H),
		CELL_ID				('08'H),
		CHENNEL_NEEDED			('09'H),
		DRX_PARAMETERS			('0A'H),
		EMLPP_PRIORITY			('0B'H),
		FLUSH_ACTION			('0C'H),
		IMSI				('0D'H),
		LLC_PDU				('0E'H),
		LLC_FRAMES_DISCARDED		('0F'H),
		LOCATION_AREA			('10'H),
		MOBILE_IDENTITY			('11'H),
		MS_BUCKET_SIZE			('12'H),
		MS_RADIO_ACCESS_CAPABILITY	('13'H),
		OMC_ID				('14'H),
		PDU_IN_ERROR			('15'H),
		PDU_LIFETIME			('16'H),
		PRIORITY			('17'H),
		QOS_PROFILE			('18'H),
		RADIO_CAUSE			('19'H),
		RA_CAP_UPD_CAUSE		('1A'H),
		ROUTEING_AREA			('1B'H),
		R_DEFAULT_MS			('1C'H),
		SUSPE_DN_REFERENCE_NR		('1D'H),
		TAG				('1E'H),
		TLLI				('1F'H),
		TMSI				('20'H),
		TRACE_REFERENCE			('21'H),
		TRACE_TYPE			('22'H),
		TRANSACTION_ID			('23'H),
		TRIGGER_ID			('24'H),
		NUMBER_OF_OCTETS_AFFECTED	('25'H),
		LSA_IDENTIFIER_LIST		('26'H),
		LSA_INFORMATION			('27'H),
		PACKET_FLOW_IDENTIFIER		('28'H),
		PACKET_FLOW_TIMER		('29'H),
		AGGREGATE_BSS_QOS_PROFILE	('3a'H),
		FEATURE_BITMAP			('3b'H),
		BUCKET_FILL_RATIO		('3c'H),
		SERVICE_UTRAN_CCO		('3d'H),
		NSEI				('3e'H),
		RRLP_APDU			('3f'H),
		LCS_QOS				('40'H),
		LCS_CLIENT_TYPE			('41'H),
		REQUESTED_GPS_ASSIST_DATA	('42'H),
		LOCATION_TYPE			('43'H),
		LOCATION_ESTIMATE		('44'H),
		POSITIONING_DATA		('45'H),
		DECIPHERING_KEYS		('46'H),
		LCS_PRIORITY			('47'H),
		LCS_CAUSE			('48'H),
		LCS_CAPABILITY			('49'H),
		RRLP_FLAGS			('4a'H),
		RIM_APPLICATION_IDENTITY	('4b'H),
		RIM_SEQUENCE_NUMBER		('4c'H),
		RAN_INFO_REUEST_AC		('4d'H),
		RAN_INFO_AC			('4e'H),
		RIM_PDU_INDICATIONS		('4f'H),
		PFC_FLOC_CONTROL_PARAMETERS	('52'H),
		GLOBAL_CN_ID			('53'H),
		RIM_ROUTING_INFORMATION		('54'H),
		RIM_PROTOCOL_VERSION_NUMBER	('55'H),
		APP_ERROR_CONTAINER		('56'H),
		/* FIXME */
		EXTENDED_FEATURE_BITMAP		('69'H)
	} with { variant "FIELDLENGTH(8)" };

	type enumerated BssgpCause {
		BSSGP_CAUSE_PROC_OVERLOAD			('00'H),
		BSSGP_CAUSE_EQUIMENT_FAILURE			('01'H),
		BSSGP_CAUSE_TRANSIT_NETWORK_FAILURE		('02'H),
		BSSGP_CAUSE_NET_SV_CAP_MOD_GT_ZERO_KBPS		('03'H),
		BSSGP_CAUSE_UNKNOWN_MS				('04'H),
		BSSGP_CAUSE_BVCI_UNKNOWN			('05'H),
		BSSGP_CAUSE_CELL_TRAFFIC_CONGESTION		('06'H),
		BSSGP_CAUSE_SGSN_CONGESTION			('07'H),
		BSSGP_CAUSE_OM_INTERVENTION			('08'H),
		BSSGP_CAUSE_BVCI_BLOCKED			('09'H),
		BSSGP_CAUSE_PFC_CREATE_FAILURE			('0a'H),
		BSSGP_CAUSE_PFC_PREEMPTED			('0b'H),
		BSSGP_CAUSE_ABQP_NO_MORE_SUPPORTED		('0c'H),
		BSSGP_CAUSE_SEMANTICALLY_INCORRECT_PDU		('20'H),
		BSSGP_CAUSE_INVALID_MANDATORY_IE		('21'H),
		BSSGP_CAUSE_MISSING_MANDATORY_IE		('22'H),
		BSSGP_CAUSE_MISSING_CONDITIONAL_IE		('23'H),
		BSSGP_CAUSE_UNEXPECTED_CONDITIONAL_IE		('24'H),
		BSSGP_CAUSE_CONDITIONAL_IE_ERROR		('25'H),
		BSSGP_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE ('26'H),
		BSSGP_CAUSE_PROTOCOL_ERROR_UNSPECIFIED		('27'H),
		BSSGP_CAUSE_PDU_NOT_COMPATIBLE_WITH_FEATURE_SET	('28'H),
		BSSGP_CAUSE_REQUESTED_INFO_NOT_AVAILABLE	('29'H),
		BSSGP_CAUSE_UNKNOWN_DESTINATION_ADDRESS		('2a'H),
		BSSGP_CAUSE_UNKNOWN_RIM_APP_IDENTITY		('2b'H),
		BSSGP_CAUSE_INVALID_CONTAINER_UNIT_INFO		('2c'H),
		BSSGP_CAUSE_PFC_QUEUING				('2d'H),
		BSSGP_CAUSE_PFC_CREATED_SUCCESSFULLY		('2e'H),
		BSSGP_CAUSE_T12_EXPIRY				('2f'H),
		BSSGP_CAUSE_MS_UNDER_PS_HANDOVER_TREATMENT	('30'H),
		BSSGP_CAUSE_UPLINK_QUALITY			('31'H),
		BSSGP_CAUSE_UPLINK_STRENGTH			('32'H),
		BSSGP_CAUSE_DOWNLINK_QUALITY			('33'H),
		BSSGP_CAUSE_DOWNLINK_STRENGTH			('34'H),
		BSSGP_CAUSE_DISTANCE				('35'H),
		BSSGP_CAUSE_BETTER_CELL				('36'H),
		BSSGP_CAUSE_TRAFFIC				('37'H),
		BSSGP_CAUSE_OM_INTERVENTION2			('38'H),
		BSSGP_CAUSE_MS_BACK_ON_OLD_CHANNEL		('39'H),
		BSSGP_CAUSE_T13_EXPIRY				('3a'H),
		BSSGP_CAUSE_T14_EXPIRY				('3b'H),
		BSSGP_CAUSE_NOT_ALL_REQUESTED_PFC_CREATED	('3c'H)
	} with { variant "FIELDLENGTH(8)" };

	/* 11.3.28 */
	type record BssgpQosProfile {
		uint16_t	r,
		BIT2		spare,
		boolean		c_r,
		boolean		t,
		boolean		a,
		uint3_t		precedence
	} with { variant (c_r) "FIELDLENGTH(1)"
		 variant (t) "FIELDLENGTH(1)"
		 variant (a) "FIELDLENGTH(1)"
	};

	/* 11.3.84 */
	type record BssgpFeatureBitmap {
		boolean		mbms,
		boolean		enh_radio_status,
		boolean		pfc_fc,
		boolean		rim,
		boolean		lcs,
		boolean		inr,
		boolean		cbl,
		boolean		pfc
	} with { variant "" };

	/* 11.3.47 */
	type record BssgpServiceUtranCco {
		uint5_t		spare,
		uint3_t		value_part
	} with { variant "" };

	/* 11.3.84 */
	type record BssgpExtendedFeatureBitmap {
		BIT7		spare,
		BIT1		ps_handover
	} with { variant "" };

	type uint16_t BssgpPduLifetime;

	/* TS 48.008 3.2.2.18 */
	type record BssmapPriority {
		BIT1		spare,
		boolean		pci,
		uint4_t		level,
		boolean		qa,
		boolean		pvi
	} with { variant "" };

	type BssmapPriority BssgpPriority;

	type uint32_t BssgpTlli;

	type uint16_t BssgpBvci;

	type record BssgpCellId {
		RoutingAreaIdentification	ra_id,
		CellIdentity			cell_id
	} with { variant "" };

	type union BssgpIeUnion {
		uint16_t		bmax_default_ms,  /* 11.3.2 */
		uint16_t		bucket_leak_rate, /* 11.3.4 */
		uint16_t		bvc_bucket_size,  /* 11.3.5 */
		BssgpBvci		bvci,		/* 11.3.6 */
		uint16_t		bvc_measurement, /* 11.3.7 */
		BssgpCause		cause,		/* 11.3.8 */
		BssgpCellId		cell_id,	/* 11.3.9 */
		DrxParameter		drx_parameter,	/* 10.3.11 */
		MobileIdentity		imsi,		/* 11.3.14 */
		LocationAreaIdentification lai,		/* 11.3.17 */
		MobileIdentity		mobile_id,	/* 11.3.20 */
		BssgpPduLifetime	pdu_lifetime,	/* 11.3.25 */
		BssgpPriority		priority,	/* 11.3.27 */
		BssgpQosProfile		qos_profile,	/* 11.3.28 */
		BssgpTlli		tlli,		/* 11.3.25 */
		uint16_t		r_default_ms,	/* 11.3.32 */
		GsmTmsi			tmsi,		/* 11.3.36 */
		BssgpServiceUtranCco	svc_utran_cco,	/* 11.3.47 */
		BssgpFeatureBitmap	feature_bitmap,	/* 11.3.40 */
		BssgpExtendedFeatureBitmap ext_feature_bitmap,	/* 11.3.84 */
		octetstring		other
	};

	type record BssgpTLV {
		BssgpIEI	iei,
		/* we cannot express a variable-length "length" field with extension octets in the TTCN-3
		 * syntax, so we simply assume a plain 16 bit length value here and have a 'pseudl-BSSGP'
		 * translator in front which explands all variable-length "length" fields to 16bits */
		uint16_t	len,
		BssgpIeUnion	u
	} with {
		variant (u) "CROSSTAG(
					bmax_default_ms,	iei = BMAX_DEFAULT_MS;
					bucket_leak_rate,	iei = BUCKET_LEAK_RATE;
					bvc_bucket_size,	iei = BVC_BUCKET_SIZE;
					bvci,			iei = BVCI;
					bvc_measurement,	iei = BVC_MEASUREMENT;
					cause,			iei = CAUSE;
					cell_id,		iei = CELL_ID;
					drx_parameter,		iei = DRX_PARAMETERS;
					imsi,			iei = IMSI;
					lai,			iei = LOCATION_AREA;
					priority,		iei = PRIORITY;
					mobile_id,		iei = MOBILE_IDENTITY;
					pdu_lifetime,		iei = PDU_LIFETIME;
					qos_profile,		iei = QOS_PROFILE;
					tlli,			iei = TLLI;
					r_default_ms,		iei = R_DEFAULT_MS;
					tmsi,			iei = TMSI;
					svc_utran_cco,		iei = SERVICE_UTRAN_CCO;
					feature_bitmap,		iei = FEATURE_BITMAP;
					ext_feature_bitmap,	iei = EXTENDED_FEATURE_BITMAP;
					other, OTHERWISE)"
		variant (len) "LENGTHTO(u)"
	};

	external function enc_BssgpTLV(in BssgpTLV pdu) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	external function dec_BssgpTLV(in octetstring stream) return BssgpTLV
		with { extension "prototype(convert) decode(RAW)" };


	type record of BssgpTLV BssgpTLVs;

	/* 10.2.1 */
	type record BssgpDlUnitdata {
		BssgpTlli		tlli,
		BssgpQosProfile		qos_profile,
		BssgpTLV		pdu_lifetime,
		/* optional parts */
		BssgpTLVs		tlvs
	} with { variant "" };

	/* 10.2.2 */
	type record BssgpUlUnitdata {
		BssgpTlli		tlli,
		BssgpQosProfile		qos_profile,
		BssgpTLV		cell_id,
		/* optional parts */
		BssgpTLVs		tlvs
	} with { variant "" };

	type record BssgpNormalPdu {
		BssgpTLVs		tlvs optional
	} with { variant "" };

	type union BssgpPduUnion {
		BssgpDlUnitdata		dl_unitdata,
		BssgpUlUnitdata		ul_unitdata,
		BssgpNormalPdu		other
	};

	type record BssgpPdu {
		BssgpPduType		pdu_type,
		BssgpPduUnion		u
	} with {
		variant (u) "CROSSTAG(
					dl_unitdata,	pdu_type = DL_UNITDATA;
					ul_unitdata,	pdu_type = UL_UNITDATA;
					other,		OTHERWISE)"
	}

	external function enc_BssgpPdu(in BssgpPdu pdu) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	external function dec_BssgpPdu(in octetstring stream) return BssgpPdu
		with { extension "prototype(convert) decode(RAW)" };

	template BssgpPdu t_BSSGP_other(template BssgpPduType pdu_type, template BssgpTLVs tlvs) := {
		pdu_type := pdu_type,
		u := {
			other := {
				tlvs := tlvs
			}
		}
	}

	template BssgpTLV t_BSSGP_IE_Cause(template BssgpCause cause) := {
		iei := CAUSE,
		len := 1,
		u := { cause := cause }
	}

	template BssgpTLV t_BSSGP_IE_Bvci(template BssgpBvci bvci) := {
		iei := BVCI,
		len := 2,
		u := { bvci := bvci }
	}

	template BssgpTLV t_BSSGP_IE_CellId(template BssgpCellId cid) := {
		iei := CELL_ID,
		len := 8,
		u := { cell_id := cid }
	}

	template BssgpTLV t_BSSGP_IE_Lifetime(uint16_t time) := {
		iei := PDU_LIFETIME,
		len := 2,
		u := { pdu_lifetime := time }
	}

	template BssgpTLV t_BSSGP_IE_Tmsi(template GsmTmsi tmsi) := {
		iei := TMSI,
		len := 4,
		u := { tmsi := tmsi }
	}

	template BssgpTLV t_BSSGP_IE_Imsi(template hexstring imsi) := {
		iei := IMSI,
		len := 4,
		u := {
			mobile_id := {
				imsi := {
					mi_type := MI_TYPE_IMSI,
					odd := true, /* IMSI has 15 digits */
					digits := imsi
				}
			}
		}
	}

	template BssgpTLV t_BSSGP_IE_Qos(BssgpQosProfile qos) := {
		iei := QOS_PROFILE,
		len := 0,
		u := {
			qos_profile := qos
		}
	}

	template BssgpTLV t_BssgpIE(template BssgpIEI iei, template BssgpIeUnion u) := {
		iei := iei,
		len := 0,
		u := u
	}

	template BssgpTLV t_BSSGP_IE_PDU(BssgpPdu pdu) :=
		t_BssgpIE(PDU_IN_ERROR, { other := f_BSSGP_compact_len(enc_BssgpPdu(pdu)) });

	template BssgpPdu t_BVC_RESET(template BssgpCause cause, template BssgpBvci bvci, template BssgpCellId cell_id) := 
		t_BSSGP_other(BVC_RESET, { t_BSSGP_IE_Bvci(bvci), t_BSSGP_IE_Cause(cause), t_BSSGP_IE_CellId(cell_id) });
	template BssgpPdu t_BVC_RESET_ACK(template BssgpBvci bvci, template BssgpCellId cell_id) := 
		t_BSSGP_other(BVC_RESET_ACK, { t_BSSGP_IE_Bvci(bvci), t_BSSGP_IE_CellId(cell_id) });

	template BssgpPdu t_BVC_UNBLOCK(template BssgpBvci bvci) := t_BSSGP_other(BVC_UNBLOCK, { t_BSSGP_IE_Bvci(bvci) });
	template BssgpPdu t_BVC_UNBLOCK_ACK(template BssgpBvci bvci) := t_BSSGP_other(BVC_UNBLOCK_ACK, { t_BSSGP_IE_Bvci(bvci) });

	template BssgpPdu t_BVC_BLOCK(template BssgpBvci bvci, template BssgpCause cause) := 
		t_BSSGP_other(BVC_BLOCK, { t_BSSGP_IE_Bvci(bvci), t_BSSGP_IE_Cause(cause) });
	template BssgpPdu t_BVC_BLOCK_ACK(template BssgpBvci bvci) := t_BSSGP_other(BVC_BLOCK_ACK, { t_BSSGP_IE_Bvci(bvci) });


	template BssgpPdu tr_BSSGP_type(template BssgpPduType pdu_type, template BssgpPduUnion u := ?) := {
		pdu_type := pdu_type,
		u := u
	}

	template BssgpPdu t_BVC_FC_BVC := t_BSSGP_other(FLOW_CONTROL_BVC, ?);
	template BssgpPdu t_BVC_FC_BVC_ACK := t_BSSGP_other(FLOW_CONTROL_BVC_ACK, {});
	template BssgpPdu t_BVC_FC_MS := t_BSSGP_other(FLOW_CONTROL_MS, ?);
	template BssgpPdu t_BVC_FC_MS_ACK := t_BSSGP_other(FLOW_CONTROL_MS_ACK, {});

	template BssgpPdu t_BSSGP_STATUS(template BssgpTLVs tlvs) := t_BSSGP_other(STATUS, tlvs);
	
} with { encode "RAW" };
