module BSSGP_Types {

	import from General_Types all;
	import from Osmocom_Types all;
	import from GSM_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,	/* 11.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 := {
			imsi := {
				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" };
