RSL_Types: Add (most) VGCS/VBS related IEs + Messages

This will help us to start tests for VGCS/VBS.

Change-Id: I4c4a9ac1bbd5114cb2237ea282d7bace13a52abe
diff --git a/library/RSL_Types.ttcn b/library/RSL_Types.ttcn
index 0f03c87..ceb6adb 100644
--- a/library/RSL_Types.ttcn
+++ b/library/RSL_Types.ttcn
@@ -4,7 +4,7 @@
  *
  * RSL is a 3GPP standard protocol used between BTS and BSC in a GSM network.
  *
- * (C) 2017 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2017-2023 by Harald Welte <laforge@gnumonks.org>
  * All rights reserved.
  *
  * Released under the terms of GNU General Public License, Version 2 or
@@ -206,7 +206,7 @@
 		RSL_IE_CBCH_LOAD_INFO		('00101101'B),
 		RSL_IE_SMSCB_CHAN_INDICATOR	('00101110'B),
 		RSL_IE_GROUP_CALL_REF		('00101111'B),
-		RSL_IE_CHAN_DESC		('00110000'B),
+		RSL_IE_GROUP_CHAN_DESC		('00110000'B),
 		RSL_IE_NCH_DRX_INFO		('00110001'B),
 		RSL_IE_CMD_INDICATOR		('00110010'B),
 		RSL_IE_EMLPP_PRIO		('00110011'B),
@@ -850,6 +850,78 @@
 		slot_count := slot_count
 	}
 
+	/* 9.3.45 Group Call Reference */
+	type record RSL_IE_GroupCallReference {
+		uint8_t		len,
+		GroupCallRef	group_or_bcast_call_ref
+	} with {
+		variant (len) "LENGTHTO(group_or_bcast_call_ref)"
+	};
+	template (value) RSL_IE_GroupCallReference ts_GroupCallRef(template (value) GroupCallRef gcr) := {
+		len := 0, // overwritten
+		group_or_bcast_call_ref := gcr
+	}
+	template (present) RSL_IE_GroupCallReference tr_GroupCallRef(template (present) GroupCallRef gcr := ?) := {
+		len := ?,
+		group_or_bcast_call_ref := gcr
+	}
+
+	/* 9.3.46 Channel description */
+	type record RSL_IE_GroupChannelDescription {
+		uint8_t 	len,
+		octetstring 	chan_desc
+	} with {
+		variant (len) "LENGTHTO(chan_desc)"
+	};
+	template (value) RSL_IE_GroupChannelDescription ts_GroupChanDesc(template (value) octetstring cd) := {
+		len := 0, // overwritten
+		chan_desc := cd
+	}
+	template (present) RSL_IE_GroupChannelDescription tr_GroupChanDesc(template (present) octetstring cd) := {
+		len := ?,
+		chan_desc := cd
+	}
+
+	/* 9.3.47 NCH DRX Information */
+	type record RSL_IE_NchDrxInformation {
+		uint8_t 	len,
+		BIT2		spare,
+		BIT1		nln_status,
+		BIT3		emlpp_priority,
+		BIT2		nln
+	} with {
+		variant (len) "LENGTHTO(spare,nln_status,emlpp_priority,nln)"
+	};
+
+	/* 9.3.48 Command Indicator */
+	type enumerated RSL_CommandIndicator {
+		CMD_IND_START		(0),
+		CMD_IND_STOP		(1)
+	} with { variant "FIELDLENGTH(8)" };
+	type record RSL_IE_CommandIndicator {
+		uint8_t			len,
+		RSL_CommandIndicator	command_value
+	} with {
+		variant (len) "LENGTHTO(command_value)"
+	};
+	template (value) RSL_IE_CommandIndicator ts_CommandInd(template (value) RSL_CommandIndicator ci) := {
+		len := 0, // overwritten
+		command_value := ci
+	}
+	template (present) RSL_IE_CommandIndicator tr_CommandInd(template (present) RSL_CommandIndicator ci) := {
+		len := ?,
+		command_value := ci
+	}
+
+	/* 9.3.50 UIC */
+	type record RSL_IE_Uic {
+		uint8_t		len,
+		BIT2		spare,
+		uint6_t		uic
+	} with {
+		variant (len) "LENGTHTO(spare,uic)"
+	};
+
 	/* 9.3.52, 3GPP TS 44.018 10.5.2.21aa  */
 	type record RSL_IE_MultirateCfg {
 		uint8_t 	len,
@@ -1086,6 +1158,12 @@
 		RSL_LV			full_imm_ass_info,
 		MobileIdentityLV	ms_identity,
 
+		RSL_IE_GroupCallReference group_call_ref,
+		RSL_IE_GroupChannelDescription group_chan_desc,
+		RSL_IE_NchDrxInformation nch_drx_info,
+		RSL_IE_CommandIndicator	cmd_indicator,
+		RSL_IE_Uic		uic,
+
 		uint16_t		ipa_conn_id,
 		uint16_t		ipa_local_port,
 		uint16_t		ipa_remote_port,
@@ -1153,6 +1231,12 @@
 					ms_identity, iei =  RSL_IE_MS_IDENTITY;
 					other, iei = RSL_IE_FULL_BCCH_INFO;
 
+					group_call_ref, iei = RSL_IE_GROUP_CALL_REF;
+					group_chan_desc, iei = RSL_IE_GROUP_CHAN_DESC;
+					nch_drx_info, iei = RSL_IE_NCH_DRX_INFO;
+					cmd_indicator, iei = RSL_IE_CMD_INDICATOR;
+					uic, iei = RSL_IE_UIC;
+
 					ipa_conn_id, iei = RSL_IE_IPAC_CONN_ID;
 					ipa_remote_ip, iei = RSL_IE_IPAC_REMOTE_IP;
 					ipa_remote_port, iei = RSL_IE_IPAC_REMOTE_PORT;
@@ -2659,6 +2743,50 @@
 		}
 	}
 
+	template (value) RSL_Message ts_RSL_NOTIF_CMD_START(template (value) GroupCallRef group_call_ref,
+							    template (value) octetstring chan_desc) := {
+		msg_disc := ts_RSL_MsgDisc(RSL_MDISC_CCHAN, false),
+		msg_type := RSL_MT_NOT_CMD,
+		ies := {
+			t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := ts_RslChanNr_PCH_AGCH(0)}),
+			t_RSL_IE(RSL_IE_CMD_INDICATOR, RSL_IE_Body:{cmd_indicator := ts_CommandInd(CMD_IND_START)}),
+			t_RSL_IE(RSL_IE_GROUP_CALL_REF, RSL_IE_Body:{group_call_ref := ts_GroupCallRef(group_call_ref)}),
+			t_RSL_IE(RSL_IE_GROUP_CHAN_DESC, RSL_IE_Body:{group_chan_desc := ts_GroupChanDesc(chan_desc)})
+		}
+	}
+	template RSL_Message tr_RSL_NOTIF_CMD_START(template (present) GroupCallRef group_call_ref,
+						    template (present) octetstring chan_desc := ?) := {
+		msg_disc := tr_RSL_MsgDisc(RSL_MDISC_CCHAN, false),
+		msg_type := RSL_MT_NOT_CMD,
+		ies := {
+			tr_RSL_IE(RSL_IE_Body:{chan_nr := t_RslChanNr_PCH_AGCH(0)}),
+			tr_RSL_IE(RSL_IE_Body:{cmd_indicator := tr_CommandInd(CMD_IND_START)}),
+			tr_RSL_IE(RSL_IE_Body:{group_call_ref := tr_GroupCallRef(group_call_ref)}),
+			tr_RSL_IE(RSL_IE_Body:{group_chan_desc := tr_GroupChanDesc(chan_desc)}),
+			*
+		}
+	}
+
+	template (value) RSL_Message ts_RSL_NOTIF_CMD_STOP(template (value) GroupCallRef group_call_ref) := {
+		msg_disc := ts_RSL_MsgDisc(RSL_MDISC_CCHAN, false),
+		msg_type := RSL_MT_NOT_CMD,
+		ies := {
+			t_RSL_IE(RSL_IE_CHAN_NR, RSL_IE_Body:{chan_nr := ts_RslChanNr_PCH_AGCH(0)}),
+			t_RSL_IE(RSL_IE_CMD_INDICATOR, RSL_IE_Body:{cmd_indicator := ts_CommandInd(CMD_IND_STOP)}),
+			t_RSL_IE(RSL_IE_GROUP_CALL_REF, RSL_IE_Body:{group_call_ref := ts_GroupCallRef(group_call_ref)})
+		}
+	}
+	template RSL_Message tr_RSL_NOTIF_CMD_STOP(template (present) GroupCallRef group_call_ref) := {
+		msg_disc := tr_RSL_MsgDisc(RSL_MDISC_CCHAN, false),
+		msg_type := RSL_MT_NOT_CMD,
+		ies := {
+			tr_RSL_IE(RSL_IE_Body:{chan_nr := t_RslChanNr_PCH_AGCH(0)}),
+			tr_RSL_IE(RSL_IE_Body:{cmd_indicator := tr_CommandInd(CMD_IND_STOP)}),
+			tr_RSL_IE(RSL_IE_Body:{group_call_ref := tr_GroupCallRef(group_call_ref)}),
+			*
+		}
+	}
+
 
 
 	function f_rsl_find_ie(RSL_Message msg, RSL_IE_Type iei, out RSL_IE_Body ret) return boolean {