RLCMAC_CSN1_Types: Add release 6 and release 8 additions to PacketCellChangeNotification

The PacketCellChangeNotification type currently lacks the release 6 and
the release 8 additions. Those basically add 3G and 4g/5g compatibility to the
PacketCellChangeNotification message type.

Spec reference: 3gpp TS 44.060 11.2.3a

Related: OS#6044
Co-authored-by: Vadim Yanitskiy <vyanitskiy@sysmocom.de>
Change-Id: I4e1c63c06fb89111765df187a93db563e77c3fc4
diff --git a/library/RLCMAC_CSN1_Types.ttcn b/library/RLCMAC_CSN1_Types.ttcn
index 2093f55..917b5d5 100644
--- a/library/RLCMAC_CSN1_Types.ttcn
+++ b/library/RLCMAC_CSN1_Types.ttcn
@@ -941,7 +941,76 @@
 		variant (sign_var) "PRESENCE(sign_var_presence = '1'B)"
 	};
 
-	/* 11.2.3a Packet Cell Change Notification */
+	/* 11.2.3a Packet Cell Change Notification, 3G Target Cell Struct (Rel-6 extension) */
+	type record UtranTargetCellFdd {
+		uint14_t	arfcn,
+		BIT1		bandwidth_presence,
+		uint3_t		bandwidth optional,
+		uint10_t	scrambling_code
+	} with {
+		variant (bandwidth) "PRESENCE(bandwidth_presence = '1'B)"
+	};
+	type record UtranTargetCellTdd {
+		uint14_t	arfcn,
+		BIT1		bandwidth_presence,
+		uint3_t		bandwidth optional,
+		uint7_t		cell_parameter,
+		BIT1		sync_case
+	} with {
+		variant (bandwidth) "PRESENCE(bandwidth_presence = '1'B)"
+	};
+	type record UtranTargetCell {
+		BIT1			fdd_presence,
+		UtranTargetCellFdd	fdd optional,
+		BIT1			tdd_presence,
+		UtranTargetCellTdd	tdd optional,
+		uint6_t		reporting_quantity
+	} with {
+		variant (fdd) "PRESENCE(fdd_presence = '1'B)"
+		variant (tdd) "PRESENCE(tdd_presence = '1'B)"
+	};
+
+	/* 11.2.3a Packet Cell Change Notification, Eutran Target Cell Struct (Rel-8 extension) */
+	type record EutranTargetCell {
+		uint16_t	earfcn,
+		BIT1		meas_bandwidth_presence,
+		uint3_t		meas_bandwidth optional,
+		uint9_t		phys_layer_cell_id,
+		uint6_t		reporting_quantity
+	} with {
+		variant (meas_bandwidth) "PRESENCE(meas_bandwidth_presence = '1'B)"
+	};
+
+	/* 11.2.3a Packet Cell Change Notification, 3G CCN Measurement Report Struct (Rel-6 extension) */
+	type record of UtranCCNMeasReportItem UtranReportingQuantityList;
+	type record UtranCCNMeasReportItem {
+		uint7_t			cell_list_index,
+		uint6_t			reporting_quantity
+	} with { variant "" };
+	type record UtranCCNMeasReport {
+		uint3_t			     n_3g,
+		UtranReportingQuantityList   cells
+	} with {
+		variant (n_3g) "LENGTHTO(cells) - 1"
+		variant (n_3g) "UNIT(elements)"
+	};
+
+	/* 11.2.3a Packet Cell Change Notification, E-UTRAN CCN Measurement Report Struct (Rel-8 extension) */
+	type record length(1..4) of EutranCCNMeasReportItem EutranReportingQuantityList;
+	type record EutranCCNMeasReportItem {
+		uint3_t			frequency_list_index,
+		uint9_t			cell_identity,
+		uint6_t			reporting_quantity
+	} with { variant "" };
+	type record EutranCCNMeasReport {
+		uint1_t				utran_ba_used,
+		uint2_t				n_eutran,
+		EutranReportingQuantityList	cells
+	} with {
+		variant (n_eutran) "LENGTHTO(cells) - 1"
+		variant (n_eutran) "UNIT(elements)"
+	};
+
 	type record NCMeasurementItem {
 		uint6_t freq,
 		BIT1	bsic_presence,
@@ -957,22 +1026,74 @@
 		uint3_t		num_meas,
 		NCMeasurements	meas
 	} with { variant "" };
-	type record PacketCellChangeNotification {
-		GlobalTfi 		gtfi,
-		/* TODO: support 3g/4g in these bits */
+
+	/* 11.2.3a Packet Cell Change Notification, Rel-Additions (Matrioshka) */
+	private type record PktCellChgNotifAdditions {
+		BIT1	    			rel6_presence,
+		PktCellChgNotifR6Additions	rel6 optional
+	} with {
+		variant (rel6) "PRESENCE(rel6_presence = '1'B)"
+	};
+	private type record PktCellChgNotifR6Additions {
+		BIT1				utran_ba_used_presence,
+		uint1_t				utran_ba_used optional,
+		UtranCCNMeasReport		utran_ccn_meas_rep
+	} with {
+		variant (utran_ba_used) "PRESENCE(utran_ba_used_presence = '1'B)"
+	};
+
+	private type record PktCellChgNotifyU0 {
+		BIT1			tag ('0'B),
+		uint10_t		arfcn,
+		uint6_t			bsic
+	} with { variant "" };
+	private type record PktCellChgNotifyU10 {
+		BIT2			tag ('10'B),
+		UtranTargetCell		utran_target_cell
+	} with { variant "" };
+	private type record PktCellChgNotifyU110 {
+		BIT3			tag ('110'B),
 		BIT1			arfcn_bsic_presence,
 		uint10_t		arfcn optional,
 		uint6_t			bsic optional,
+		BIT1			utran_target_cell_presence,
+		UtranTargetCell		utran_target_cell optional,
+		BIT1			eutran_target_cell_presence,
+		EutranTargetCell	eutran_target_cell optional,
+		BIT1			eutran_ccn_meas_rep_presence,
+		EutranCCNMeasReport 	eutran_ccn_meas_rep optional
+	} with {
+		variant (arfcn) "PRESENCE(arfcn_bsic_presence = '1'B)"
+		variant (bsic) "PRESENCE(arfcn_bsic_presence = '1'B)"
+		variant (utran_target_cell) "PRESENCE(utran_target_cell_presence = '1'B)"
+		variant (eutran_target_cell) "PRESENCE(eutran_target_cell_presence = '1'B)"
+		variant (eutran_ccn_meas_rep) "PRESENCE(eutran_ccn_meas_rep_presence = '1'B)"
+	};
+	private type union PktCellChgNotifyUnion {
+		PktCellChgNotifyU0	u0,
+		PktCellChgNotifyU10	u10,	/* Rel-6 additions */
+		PktCellChgNotifyU110	u110	/* Rel-8 additions */
+		/* TODO: PktCellChgNotifyU1110     Rel-9 additions */
+		/* TODO: Message escape : { 1111 } bit (*) = <no string> > */
+	} with {
+		variant "TAG(u0, tag = '0'B;
+			     u10, tag = '10'B;
+			     u110, tag = '110'B)"
+	};
+
+	/* 11.2.3a Packet Cell Change Notification, message body */
+	type record PacketCellChangeNotification {
+		GlobalTfi 		gtfi,
+		PktCellChgNotifyUnion	u,
 		BIT1			ba_psi3_presence,
 		BIT1			ba_used optional,
 		BIT2			psi3_change_mark optional,
 		BIT1			pmo_used,
 		BIT1			pccn_sending,
-		CCNMesurementReport	ccn_meas_rep
-		/* TODO: Rel6 additions for 3G support */
+		CCNMesurementReport	ccn_meas_rep,
+		/* Rel-Additions (Matrioshka) */
+		PktCellChgNotifAdditions rel_additions optional
 	} with {
-		variant (arfcn) "PRESENCE(arfcn_bsic_presence = '0'B)"
-		variant (bsic) "PRESENCE(arfcn_bsic_presence = '0'B)"
 		variant (ba_used) "PRESENCE(ba_psi3_presence = '0'B)"
 		variant (psi3_change_mark) "PRESENCE(ba_psi3_presence = '1'B)"
 	};