Add CBSP (Cell Broadcast Service Protocol) types + templates

Change-Id: Ida2e0af7d282fd7d5318110c05efa5a10114242c
diff --git a/library/CBSP_Types.ttcn b/library/CBSP_Types.ttcn
new file mode 100644
index 0000000..43a7d7d
--- /dev/null
+++ b/library/CBSP_Types.ttcn
@@ -0,0 +1,381 @@
+module CBSP_Types {
+
+/* CBSP_Types, defining abstract TTCN-3 data types for the CBSP protocol.
+ *
+ * CBSP is a ETSI/3GPP standard protocol used between CBC (Cell Broadcast Centre) 
+ * and BSC (Base Station Controller) in 2G/GSM/GERAN networks. It is specified
+ * in 3GPP TS 48.049.
+ *
+ * (C) 2019 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.
+ */
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from BSSAP_Types all;
+
+
+/* 8.2.2 Message Type */
+type enumerated CBSP_MessageType {
+	CBSP_MSGT_WRITE_REPLACE			('01'O),
+	CBSP_MSGT_WRITE_REPLACE_COMPL		('02'O),
+	CBSP_MSGT_WRITE_REPLACE_FAIL		('03'O),
+	CBSP_MSGT_KILL				('04'O),
+	CBSP_MSGT_KILL_COMPL			('05'O),
+	CBSP_MSGT_KILL_FAIL			('06'O),
+	CBSP_MSGT_LOAD_QUERY			('07'O),
+	CBSP_MSGT_LOAD_QUERY_COMPL		('08'O),
+	CBSP_MSGT_LOAD_QUERY_FAIL		('09'O),
+	CBSP_MSGT_MSG_STATUS_QUERY		('0a'O),
+	CBSP_MSGT_MSG_STATUS_QUERY_COMPL	('0b'O),
+	CBSP_MSGT_MSG_STATUS_QUERY_FAIL		('0c'O),
+	CBSP_MSGT_SET_DRX			('0d'O),
+	CBSP_MSGT_SET_DRX_COMPL			('0e'O),
+	CBSP_MSGT_SET_DRX_FAIL			('0f'O),
+	CBSP_MSGT_RESET				('10'O),
+	CBSP_MSGT_RESET_COMPL			('11'O),
+	CBSP_MSGT_RESET_FAIL			('12'O),
+	CBSP_MSGT_RESTART			('13'O),
+	CBSP_MSGT_FAILURE			('14'O),
+	CBSP_MSGT_ERROR_IND			('15'O),
+	CBSP_MSGT_KEEP_ALIVE			('16'O),
+	CBSP_MSGT_KEEP_ALIVE_COMPL		('17'O)
+} with { variant "FIELDLENGTH(8)" };
+
+/* 8.2.1 Information Element Identifier */
+type enumerated CBSP_IEI {
+	CBSP_IEI_MSG_CONTENT			('01'O),
+	CBSP_IEI_OLD_SERIAL_NR			('02'O),
+	CBSP_IEI_NEW_SERIAL_NR			('03'O),
+	CBSP_IEI_CELL_LIST			('04'O),
+	CBSP_IEI_CATEGORY			('05'O),
+	CBSP_IEI_REP_PERIOD			('06'O),
+	CBSP_IEI_NUM_BCAST_REQ			('07'O),
+	CBSP_IEI_NUM_BCAST_COMPL_LIST		('08'O),
+	CBSP_IEI_FAILURE_LIST			('09'O),
+	CBSP_IEI_RR_LOADING_LIST		('0a'O),
+	CBSP_IEI_CAUSE				('0b'O),
+	CBSP_IEI_DCS				('0c'O),
+	CBSP_IEI_RECOVERY_IND			('0d'O),
+	CBSP_IEI_MSG_ID				('0e'O),
+	CBSP_IEI_EMERG_IND			('0f'O),
+	CBSP_IEI_WARN_TYPE			('10'O),
+	CBSP_IEI_WARN_SEC_INFO			('11'O),
+	CBSP_IEI_CHANNEL_IND			('12'O),
+	CBSP_IEI_NUM_OF_PAGES			('13'O),
+	CBSP_IEI_SCHEDULE_PERIOD		('14'O),
+	CBSP_IEI_NUM_OF_RES_SLOTS		('15'O),
+	CBSP_IEI_BCAST_MSG_TYPE			('16'O),
+	CBSP_IEI_WARNING_PERIOD			('17'O),
+	CBSP_IEI_KEEP_ALIVE_REP_PERIOD		('18'O)
+} with { variant "FIELDLENGTH(8)" };
+
+/* 8.2.7 Category */
+type enumerated CBSP_Category {
+	CBSP_CATEG_HIGH_PRIO			('00'O),
+	CBSP_CATEG_BACKGROUND			('01'O),
+	CBSP_CATEG_NORMAL			('02'O)
+} with { variant "FIELDLENGTH(8)" };
+
+/* Cell ID Discriminator (8.2.11, ...) */
+type enumerated CBSP_CellIdDisc {
+	CBSP_CIDD_WHOLE_CGI		(0),
+	CBSP_CIDD_LAC_CI		(1),
+	CBSP_CIDD_CI			(2),
+	CBSP_CIDD_LAI			(4),
+	CBSP_CIDD_LAC			(5),
+	CBSP_CIDD_ALL_IN_BSC		(6)
+} with { variant "FIELDLENGTH(4)" };
+
+/* 8.2.13 Cause */
+type enumerated CBSP_Cause {
+	CBSP_CAUSE_PARAM_NOT_RECOGNISED		('00'O),
+	CBSP_CAUSE_PARAM_VAL_INVALID		('01'O),
+	CBSP_CAUSE_MSG_REF_NOT_IDENTIFIED	('02'O),
+	CBSP_CAUSE_CELL_ID_NOT_VALID		('03'O),
+	CBSP_CAUSE_UNRECOGNISED_MSG		('04'O),
+	CBSP_CAUSE_MISSING_MAND_IE		('05'O),
+	CBSP_CAUSE_BSC_CAPACITY_EXCEEDED	('06'O),
+	CBSP_CAUSE_CELL_MEMORY_EXCEEDED		('07'O),
+	CBSP_CAUSE_BSC_MEMORY_EXCEEDED		('08'O),
+	CBSP_CAUSE_CB_NOT_SUPPORTED		('09'O),
+	CBSP_CAUSE_CB_NOT_OPERATIONAL		('0a'O),
+	CBSP_CAUSE_INCOMPATIBLE_DRX_PARAM	('0b'O),
+	CBSP_CAUSE_EXT_CHAN_NOT_SUPPORTED	('0c'O),
+	CBSP_CAUSE_MSG_REF_ALREADY_USED		('0d'O),
+	CBSP_CAUSE_UNSPECIFIED_ERROR		('0e'O),
+	CBSP_CAUSE_LAI_OR_LAC_NPT_VALID		('0f'O)
+} with { variant "FIELDLENGTH(8)" };
+
+type record CBSP_IE_MessageContent {
+	uint8_t		user_len,
+	octetstring	val
+} with { variant (val) "FIELDLENGTH(82)" };
+
+/* 8.2.6 Cell List */
+type record CBSP_IE_CellList {
+	uint16_t	len,
+	BIT4		spare1_4,
+	BIT4		cell_id_discr,
+	BSSMAP_FIELD_CellIdentificationList cell_id
+} with {
+	variant (len) "LENGTHTO(cell_id_discr,spare1_4,cell_id)"
+	variant (cell_id) "CROSSTAG(
+		cIl_CGI,		cell_id_discr = '0000'B;
+		cIl_LAC_CI,		cell_id_discr = '0001'B;
+		cIl_CI,			cell_id_discr = '0010'B;
+		cIl_LAI,		cell_id_discr = '0100'B;
+		cIl_LAC,		cell_id_discr = '0101'B;
+		cIl_allInBSS,		cell_id_discr = '0110'B;
+			)"
+};
+
+/* 8.2.10 Number of Broadcasts Completed List */
+type record CBSP_IE_NumBcastComplList {
+	uint16_t	len,
+	BIT4		spare1_4,
+	BIT4		cell_id_discr,
+	CBSP_FIELD_NumBcastCompl list
+} with {
+	variant (len) "LENGTHTO(cell_id_discr,spare1_4,list)"
+	variant (list) "CROSSTAG(
+		cI_CGI,		cell_id_discr = '0000'B;
+		cI_LAC_CI,	cell_id_discr = '0001'B;
+		cI_CI,		cell_id_discr = '0010'B;
+		cI_LAI,		cell_id_discr = '0100'B;
+		cI_LAC,		cell_id_discr = '0101'B;
+		cI_allInBSS,	cell_id_discr = '0110'B;
+			)"
+};
+type union CBSP_FIELD_NumBcastCompl {
+	CBSP_FIELD_NumBcastCompl_CGI		cI_CGI,
+	CBSP_FIELD_NumBcastCompl_LAC_CI		cI_LAC_CI,
+	OCT0					cI_allInBSS,
+	CBSP_FIELD_NumBcastCompl_CI		cI_CI,
+	CBSP_FIELD_NumBcastCompl_LAC		cI_LAC,
+	CBSP_FIELD_NumBcastCompl_LAI		cI_LAI
+};
+type record CBSP_FIELD_NumBcastCompl_CGI {
+	BSSMAP_FIELD_CellIdentification_CGI	ci,
+	uint16_t				num_bcats_compl,
+	CBSP_NumBcastInfo			num_bcast_info,
+	BIT4					spare1_4
+};
+type record CBSP_FIELD_NumBcastCompl_LAC_CI {
+	BSSMAP_FIELD_CellIdentification_LAC_CI	ci,
+	uint16_t				num_bcats_compl,
+	CBSP_NumBcastInfo			num_bcast_info,
+	BIT4					spare1_4
+};
+type record CBSP_FIELD_NumBcastCompl_LAI {
+	BSSMAP_FIELD_CellIdentification_LAI	ci,
+	uint16_t				num_bcats_compl,
+	CBSP_NumBcastInfo			num_bcast_info,
+	BIT4					spare1_4
+};
+type record CBSP_FIELD_NumBcastCompl_CI {
+	OCT2					ci,
+	uint16_t				num_bcats_compl,
+	CBSP_NumBcastInfo			num_bcast_info,
+	BIT4					spare1_4
+};
+type record CBSP_FIELD_NumBcastCompl_LAC {
+	OCT2					lac,
+	uint16_t				num_bcats_compl,
+	CBSP_NumBcastInfo			num_bcast_info,
+	BIT4					spare1_4
+};
+type enumerated CBSP_NumBcastInfo {
+	CBSP_NUM_BCAST_INFO_VALID	(0),
+	CBSP_NUM_BCAST_INFO_OVERFLOW	(1),
+	CBSP_NUM_BCAST_INFO_UNKNOWN	(2)
+} with { variant "FIELDLENGTH(4)" };
+
+
+/* 8.2.11 Failure List */
+type record CBSP_FailureListItem {
+	BIT4		spare1_4,
+	BIT4		cell_id_discr,
+	CBSP_FIELD_CellIdentification cell_id,
+	CBSP_Cause	cause
+} with {
+	variant (cell_id) "CROSSTAG(
+		cI_CGI,		cell_id_discr = '0000'B;
+		cI_LAC_CI,	cell_id_discr = '0001'B;
+		cI_CI,		cell_id_discr = '0010'B;
+		cI_LAI,		cell_id_discr = '0100'B;
+		cI_LAC,		cell_id_discr = '0101'B;
+		cI_allInBSS,	cell_id_discr = '0110'B;
+			)"
+};
+type union CBSP_FIELD_CellIdentification
+{
+	BSSMAP_FIELD_CellIdentification_CGI    cI_CGI,
+	BSSMAP_FIELD_CellIdentification_LAC_CI cI_LAC_CI,
+	OCT2                                   cI_CI,
+	BSSMAP_FIELD_CellIdentification_LAI    cI_LAI,
+	OCT2                                   cI_LAC,
+	OCT2                                   cI_allInBSS
+};
+
+type record of CBSP_FailureListItem CBSP_FailureListItems;
+type record CBSP_IE_FailureList {
+	uint16_t	len,
+	CBSP_FailureListItems list
+} with {
+	variant (len) "LENGTHTO(list)"
+};
+
+/* 8.2.12 RR Loading List */
+type record CBSP_IE_RrLoadingList {
+	uint16_t	len,
+	BIT4		spare1_4,
+	BIT4		cell_id_discr,
+	CBSP_FIELD_RrLoadingList list
+} with {
+	variant (len) "LENGTHTO(cell_id_discr,spare1_4,list)"
+	variant (list) "CROSSTAG(
+		cI_CGI,		cell_id_discr = '0000'B;
+		cI_LAC_CI,	cell_id_discr = '0001'B;
+		cI_CI,		cell_id_discr = '0010'B;
+		cI_LAI,		cell_id_discr = '0100'B;
+		cI_LAC,		cell_id_discr = '0101'B;
+		cI_allInBSS,	cell_id_discr = '0110'B;
+			)"
+};
+type union CBSP_FIELD_RrLoadingList {
+	CBSP_FIELD_RrLoadingList_CGI		cI_CGI,
+	CBSP_FIELD_RrLoadingList_LAC_CI		cI_LAC_CI,
+	OCT0					cI_allInBSS,
+	CBSP_FIELD_RrLoadingList_CI		cI_CI,
+	CBSP_FIELD_RrLoadingList_LAC		cI_LAC,
+	CBSP_FIELD_RrLoadingList_LAI		cI_LAI
+};
+type record CBSP_FIELD_RrLoadingList_CGI {
+	BSSMAP_FIELD_CellIdentification_CGI	ci,
+	uint8_t					load1,
+	uint8_t					load2
+};
+type record CBSP_FIELD_RrLoadingList_LAC_CI {
+	BSSMAP_FIELD_CellIdentification_LAC_CI	ci,
+	uint8_t					load1,
+	uint8_t					load2
+};
+type record CBSP_FIELD_RrLoadingList_LAI {
+	BSSMAP_FIELD_CellIdentification_LAI	ci,
+	uint8_t					load1,
+	uint8_t					load2
+};
+type record CBSP_FIELD_RrLoadingList_CI {
+	OCT2					ci,
+	uint8_t					load1,
+	uint8_t					load2
+};
+type record CBSP_FIELD_RrLoadingList_LAC {
+	OCT2					lac,
+	uint8_t					load1,
+	uint8_t					load2
+};
+
+/* 8.2.15 Recovery Indication */
+type record CBSP_IE_RecoveryInd {
+	BIT4			spare1_4,
+	CBSP_RecoveryInd	recovery
+};
+type enumerated CBSP_RecoveryInd {
+	CBSP_RI_DATA_AVAILABLE	(0),
+	CBSP_RI_DATA_LOST	(1)
+} with { variant "FIELDLENGTH(4)" };
+
+/* 8.2.24 Broadcast Message Type */
+type record CBSP_IE_BcastMsgType {
+	BIT4			spare1_4,
+	CBSP_BcastMsgType	msg_type
+};
+type enumerated CBSP_BcastMsgType {
+	CBSP_BC_MSGT_CBS	(0),
+	CBSP_BC_MSGT_EMERG	(1)
+} with { variant "FIELDLENGTH(4)" };
+
+
+type union CBSP_IE_Body {
+	CBSP_IE_MessageContent	msg_content,
+	uint16_t		old_ser_nr,
+	uint16_t		new_ser_nr,
+	CBSP_IE_CellList	cell_list,
+	CBSP_Category		category,
+	uint16_t		rep_period,
+	uint16_t		num_bcast_req,
+	CBSP_IE_NumBcastComplList num_bcast_compl_list,
+	CBSP_IE_FailureList	failure_list,
+	CBSP_IE_RrLoadingList	rr_loading_list,
+	CBSP_Cause		cause,
+	uint8_t 		dcs,
+	CBSP_IE_RecoveryInd	recovery_ind,
+	uint16_t		msg_id,
+	uint8_t			emerg_ind,
+	uint16_t		warn_type,
+	octetstring		warn_sec_info,
+	uint8_t			channel_ind,
+	uint8_t			num_of_pages,
+	uint8_t			schedule_period,
+	uint8_t			num_of_res_slots,
+	CBSP_IE_BcastMsgType	bcast_msg_type,
+	uint8_t			warning_period,
+	uint8_t			keep_alive_rep_period
+} with {
+	variant (warn_sec_info) "FIELDLENGTH(50)"
+};
+
+type record CBSP_IE {
+	CBSP_IEI		iei,
+	CBSP_IE_Body		body
+} with {
+	variant (body)	"CROSSTAG(	msg_content, iei = CBSP_IEI_MSG_CONTENT;
+					old_ser_nr, iei = CBSP_IEI_OLD_SERIAL_NR;
+					new_ser_nr, iei = CBSP_IEI_NEW_SERIAL_NR;
+					cell_list, iei = CBSP_IEI_CELL_LIST;
+					category, iei = CBSP_IEI_CATEGORY;
+					rep_period, iei = CBSP_IEI_REP_PERIOD;
+					num_bcast_req, iei = CBSP_IEI_NUM_BCAST_REQ;
+					num_bcast_compl_list, iei = CBSP_IEI_NUM_BCAST_COMPL_LIST;
+					failure_list, iei = CBSP_IEI_FAILURE_LIST;
+					rr_loading_list, iei = CBSP_IEI_RR_LOADING_LIST;
+					cause, iei = CBSP_IEI_CAUSE;
+					dcs, iei = CBSP_IEI_DCS;
+					recovery_ind, iei = CBSP_IEI_RECOVERY_IND;
+					msg_id, iei = CBSP_IEI_MSG_ID;
+					emerg_ind, iei = CBSP_IEI_EMERG_IND;
+					warn_type, iei = CBSP_IEI_WARN_TYPE;
+					warn_sec_info, iei = CBSP_IEI_WARN_SEC_INFO;
+					channel_ind, iei = CBSP_IEI_CHANNEL_IND;
+					num_of_pages, iei = CBSP_IEI_NUM_OF_PAGES;
+					schedule_period, iei = CBSP_IEI_SCHEDULE_PERIOD;
+					num_of_res_slots, iei = CBSP_IEI_NUM_OF_RES_SLOTS;
+					bcast_msg_type, iei = CBSP_IEI_BCAST_MSG_TYPE;
+					warning_period, iei = CBSP_IEI_WARNING_PERIOD;
+					keep_alive_rep_period, iei = CBSP_IEI_KEEP_ALIVE_REP_PERIOD
+		)"
+};
+
+type set of CBSP_IE CBSP_IEs;
+
+type record CBSP_PDU {
+	CBSP_MessageType	msg_type,
+	uint24_t		len,
+	CBSP_IEs		ies
+} with {
+	variant (len) "LENGTHTO(ies)"
+};
+
+external function enc_CBSP_PDU(in CBSP_PDU msg) return octetstring
+	with { extension "prototype(convert) encode(RAW)" };
+
+external function dec_CBSP_PDU(in octetstring msg) return CBSP_PDU
+	with { extension "prototype(convert) decode(RAW)" };
+
+
+} with { encode "RAW"; variant "FIELDORDER(msb)" }