TTCN-3 definitions for BSSMAP-LE and BSSLAP protocols
Both are part of GSM LCS and are spoken between BSC and SMLC
Change-Id: If31830be2c8e1b624579f6663e74955763db9d0e
diff --git a/library/BSSAP_LE_Types.ttcn b/library/BSSAP_LE_Types.ttcn
new file mode 100644
index 0000000..ae7385b
--- /dev/null
+++ b/library/BSSAP_LE_Types.ttcn
@@ -0,0 +1,594 @@
+module BSSAP_LE_Types {
+
+/* BSSAP_LE_Types, defining abstract TTCN-3 data types for the 3GPP BSSMAP-LE protocol.
+ *
+ * BSSMAP-LE is a 3GPP standard protocol used by SMLC and its peers in a GSM network.
+ * This file covers 3GPP TS 49.031 version 15.0.0 Release 15
+ *
+ * (C) 2020 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.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from BSSAP_Types all;
+import from BSSLAP_Types all;
+import from MobileL3_CommonIE_Types all;
+
+/* TS 49.031 Section 10.1 */
+type enumerated BSSMAP_LE_MsgType {
+ BSSMAP_LE_PERFORM_LOC_REQ ('00101011'B),
+ BSSMAP_LE_PERFORM_LOC_RESP ('00101101'B),
+ BSSMAP_LE_PERFORM_LOC_ABORT ('00101110'B),
+ BSSMAP_LE_PERFORM_LOC_INFO ('00101111'B),
+ BSSMAP_LE_ASSIST_INFO_REQ ('00100000'B),
+ BSSMAP_LE_ASSIST_INFO_RESP ('00100001'B),
+
+ BSSMAP_LE_CONN_ORIENTED_INFO ('00101010'B),
+ BSSMAP_LE_CONN_LESS_INFO ('00111010'B),
+
+ BSSMAP_LE_RESET ('00110000'B),
+ BSSMAP_LE_RESET_ACK ('00110001'B)
+};
+
+/* TS 49.031 Section 10.2 */
+type enumerated BSSMAP_LE_IEI {
+ BSSMAP_LE_IEI_LCS_QoS ('00111110'B),
+ BSSMAP_LE_IEI_LCS_PRIORITY ('01000011'B),
+ BSSMAP_LE_IEI_LOCATION_TYPE ('01000100'B),
+ BSSMAP_LE_IEI_GANSS_LOCATION_TYPE ('10000010'B),
+ BSSMAP_LE_IEI_GEO_LOCATION ('01000101'B),
+ BSSMAP_LE_IEI_POSITIONING_DATA ('01000110'B),
+ BSSMAP_LE_IEI_GANSS_POS_DATA ('10000011'B),
+ BSSMAP_LE_IEI_VELOCITY_DATA ('01010101'B),
+ BSSMAP_LE_IEI_LCS_CAUSE ('01000111'B),
+ BSSMAP_LE_IEI_LCS_CLIENT_TYPE ('01001000'B),
+ BSSMAP_LE_IEI_APDU ('01001001'B),
+ BSSMAP_LE_IEI_NET_ELEM_ID ('01001010'B),
+ BSSMAP_LE_IEI_REQ_GPS_ASS_D ('01001011'B),
+ BSSMAP_LE_IEI_REQ_GANSS_ASS_D ('01000001'B),
+ BSSMAP_LE_IEI_DECIPH_KEYS ('01001100'B),
+ BSSMAP_LE_IEI_RET_ERR_REQ ('01001101'B),
+ BSSMAP_LE_IEI_RET_ERR_CAUSE ('01001110'B),
+ BSSMAP_LE_IEI_SEGMENTATION ('01001111'B),
+ BSSMAP_LE_IEI_CLASSMARK3_INFO ('00010011'B),
+ BSSMAP_LE_IEI_CAUSE ('00000100'B),
+ BSSMAP_LE_IEI_CELL_ID ('00000101'B),
+ BSSMAP_LE_IEI_CHOSEN_CHAN ('00100001'B),
+ BSSMAP_LE_IEI_IMSI ('00000000'B),
+ BSSMAP_LE_IEI_LCS_CAPABILITY ('01010000'B),
+ BSSMAP_LE_IEI_PKT_MEAS_REP ('01010001'B),
+ BSSMAP_LE_IEI_CELL_ID_LIST ('01010010'B),
+ BSSMAP_LE_IEI_IMEI ('10000000'B),
+ BSSMAP_LE_IEI_BSS_MLAT_CAP ('10000100'B),
+ BSSMAP_LE_IEI_CELL_INFO_LIST ('10000101'B),
+ BSSMAP_LE_IEI_BTS_RX_ACC_LVL ('10000110'B),
+ BSSMAP_LE_IEI_MLAT_METHOD ('10000111'B),
+ BSSMAP_LE_IEI_MLAT_TA ('10001000'B),
+ BSSMAP_LE_IEI_MS_SYNC_ACC ('10001001'B),
+ BSSMAP_LE_IEI_SHORT_ID_SET ('10001010'B),
+ BSSMAP_LE_IEI_RANDOM_ID_SET ('10001011'B),
+ BSSMAP_LE_IEI_SHORT_BSS_ID ('10001100'B),
+ BSSMAP_LE_IEI_RANDOM_ID ('10001101'B),
+ BSSMAP_LE_IEI_SHORT_ID ('10001110'B),
+ BSSMAP_LE_IEI_COVERAGE_CLASS ('10001111'B),
+ BSSMAP_LE_IEI_MTA_ACC_SEC_RQD ('10010000'B)
+};
+
+/* Section 9.1 */
+type record BSSMAP_LE_PerfLocReq {
+ BSSMAP_LE_MsgType msg_type,
+ BSSMAP_LE_IE_LocationType location_type,
+ BSSMAP_IE_CellIdentifier cell_id,
+ BSSMAP_IE_ClassmarkInformationType3 cm3 optional,
+ BSSMAP_LE_IE_LcsClientType lcs_client_type optional,
+ BSSMAP_IE_ChosenChannel chosen_channel optional,
+ BSSMAP_LE_IE_LcsPriority lcs_priority optional,
+ BSSMAP_LE_IE_LcsQoS lcs_qos optional,
+ BSSMAP_LE_IE_ReqGpsAssD req_gps_ass_d optional,
+ BSSMAP_LE_IE_APDU bsslap_apdu optional,
+ BSSMAP_LE_IE_LcsCapability lcs_capability optional,
+ BSSMAP_LE_IE_PacketMeasRep packet_meas_rep optional,
+ BSSMAP_LE_IE_CellIdList meas_cell_id_list optional,
+ BSSMAP_LE_IE_IMSI imsi optional,
+ BSSMAP_LE_IE_IMEI imei optional
+ // TODO: more optional IEs
+};
+
+/* Section 9.2 */
+type record BSSMAP_LE_PerfLocResp {
+ BSSMAP_LE_MsgType msg_type,
+ BSSMAP_LE_IE_GeographicLoc geographic_loc optional,
+ BSSMAP_LE_IE_PositioningData pos_data optional,
+ BSSMAP_LE_IE_DecipheringKeys deciph_keys optional,
+ BSSMAP_LE_IE_LcsCause lcs_cause optional,
+ BSSMAP_LE_IE_VelocityData velocity_data optional,
+ BSSMAP_LE_IE_GanssPosData ganss_pos_data optional
+};
+
+/* Section 9.4 */
+type record BSSMAP_LE_PerfLocAbort {
+ BSSMAP_LE_MsgType msg_type,
+ BSSMAP_LE_IE_LcsCause lcs_cause
+};
+
+/* Section 9.8 */
+type record BSSMAP_LE_ConnOrientedInfo {
+ BSSMAP_LE_MsgType msg_type,
+ BSSMAP_LE_IE_APDU bsslap_apdu,
+ BSSMAP_LE_IE_Segmentation segmentation optional
+ // TODO: MLA related optional IEs
+};
+
+/* Section 9.9 */
+type record BSSMAP_LE_ConnLessInfo {
+ BSSMAP_LE_MsgType msg_type,
+ BSSMAP_LE_IE_NetElementId source_id,
+ BSSMAP_LE_IE_NetElementId dest_id,
+ BSSMAP_LE_IE_APDU bsslap_apdu optional,
+ BSSMAP_LE_IE_Segmentation segmentation optional,
+ BSSMAP_LE_IE_RetErrReq ret_err_req optional,
+ BSSMAP_LE_IE_RetErrCause ret_err_cause optional
+};
+
+/* Section 9.10 */
+type record BSSMAP_LE_Reset {
+ BSSMAP_LE_MsgType msg_type,
+ BSSMAP_IE_Cause cause
+};
+
+/* Section 9.11 */
+type record BSSMAP_LE_ResetAck {
+ BSSMAP_LE_MsgType msg_type
+};
+
+/* Section 9.12 */
+type record BSSMAP_LE_PerformLocInfo {
+ BSSMAP_LE_MsgType msg_type,
+ BSSMAP_IE_CellIdentifier cell_id,
+ BSSMAP_LE_IE_APDU bsslap_apdu optional
+};
+
+type union BSSMAP_LE_PDU {
+ BSSMAP_LE_PerfLocReq perf_loc_req,
+ BSSMAP_LE_PerfLocResp perf_loc_resp,
+ BSSMAP_LE_PerfLocAbort perf_loc_abort,
+ BSSMAP_LE_ConnOrientedInfo co_info,
+ BSSMAP_LE_ConnLessInfo cl_info,
+ BSSMAP_LE_Reset reset,
+ BSSMAP_LE_ResetAck reset_ack,
+ BSSMAP_LE_PerformLocInfo perf_loc_info,
+ /* The following BSSMAP messages defined in 3GPP TS 48.008 are applicable to the Lb interface to
+ * support signaling to a Type A LMU using an SDCCH */
+ PDU_BSSMAP_CipherModeCommand cipherModeCommand,
+ PDU_BSSMAP_CipherModeComplete cipherModeComplete,
+ PDU_BSSMAP_CipherModeReject cipherModeReject,
+ PDU_BSSMAP_ClassmarkUpdate classmarkUpdate,
+ PDU_BSSMAP_ClearCommand clearCommand,
+ PDU_BSSMAP_ClearComplete clearComplete,
+ PDU_BSSMAP_ClearRequest clearRequest,
+ PDU_BSSMAP_CompleteLayer3Information completeLayer3Information,
+ PDU_BSSMAP_Confusion confusion,
+ PDU_BSSMAP_HandoverRequired handoverRequired,
+ PDU_BSSMAP_HandoverRequiredReject handoverRequiredReject,
+ PDU_BSSMAP_HandoverPerformed handoverPerformed,
+ PDU_BSSMAP_Paging paging
+} with {
+ variant "TAG(
+ perf_loc_req, msg_type = BSSMAP_LE_PERFORM_LOC_REQ;
+ perf_loc_resp, msg_type = BSSMAP_LE_PERFORM_LOC_RESP;
+ perf_loc_abort, msg_type = BSSMAP_LE_PERFORM_LOC_ABORT;
+ co_info, msg_type = BSSMAP_LE_CONN_ORIENTED_INFO;
+ cl_info, msg_type = BSSMAP_LE_CONN_LESS_INFO;
+ reset, msg_type = BSSMAP_LE_RESET;
+ reset_ack, msg_type = BSSMAP_LE_RESET_ACK;
+ perf_loc_info, msg_type = BSSMAP_LE_PERFORM_LOC_INFO;
+ )"
+};
+
+/* Section 10.3 */
+type record BSSMAP_LE_IE_APDU {
+ BSSMAP_LE_IEI iei,
+ uint16_t len,
+ BIT1 spare,
+ BSSMAP_LE_ProtocolId protocol_id,
+ octetstring data
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_APDU)"
+ variant (len) "LENGTHTO(spare,protocol_id,data)"
+};
+type enumerated BSSMAP_LE_ProtocolId {
+ BSSMAP_LE_PROT_RESERVED ('0000000'B),
+ BSSMAP_LE_PROT_BSSLAP ('0000001'B),
+ BSSMAP_LE_PROT_LLP ('0000010'B),
+ BSSMAP_LE_PROT_SMLCPP ('0000011'B)
+} with { variant "FIELDLENGTH(7)" };
+
+/* Section 10.8 */
+type record BSSMAP_LE_IE_DecipheringKeys {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ BIT7 spare,
+ boolean ciph_key_flag,
+ OCT7 cur_deciph_key,
+ OCT7 next_deciph_key
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_DECIPH_KEYS)"
+ variant (len) "LENGTHTO(spare,ciph_key_flag,cur_deciph_key,next_deciph_key)"
+}
+
+/* Section 10.9 */
+type record BSSMAP_LE_IE_GeographicLoc {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ octetstring location
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_GEO_LOCATION)"
+ variant (len) "LENGTHTO(location)"
+}
+
+/* Section 10.10 */
+type record BSSMAP_LE_IE_ReqGpsAssD {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ BIT16 flags,
+ octetstring sat_data
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_REQ_GPS_ASS_D)"
+ variant (len) "LENGTHTO(flags,sat_data)"
+}
+
+/* Section 10.11 */
+type record BSSMAP_LE_IE_IMSI {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ MobileIdentityV imsi
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_IMSI)"
+ variant (len) "LENGTHTO(imsi)"
+}
+
+/* Section 10.13 */
+type record BSSMAP_LE_IE_LcsCause {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ BSSMAP_LE_LcsCause cause,
+ OCT1 diag_val optional
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_IMSI)"
+ variant (len) "LENGTHTO(cause,diag_val)"
+}
+type enumerated BSSMAP_LE_LcsCause {
+ BSSMAP_LE_LCS_CAUSE_UNSPEIFIED ('00000000'B),
+ BSSMAP_LE_LCS_CAUSE_SYSTEM_FAILURE ('00000001'B),
+ BSSMAP_LE_LCS_CAUSE_PROTOCOL_ERROR ('00000010'B),
+ BSSMAP_LE_LCS_CAUSE_DATA_MISSING_IN_REQ ('00000011'B),
+ BSSMAP_LE_LCS_CAUSE_UNEXP_DATA_IN_REQ ('00000100'B),
+ BSSMAP_LE_LCS_CAUSE_POS_METH_FAILURE ('00000101'B),
+ BSSMAP_LE_LCS_CAUSE_TGT_MS_UNREACHABLE ('00000110'B),
+ BSSMAP_LE_LCS_CAUSE_REQUEST_ABORTED ('00000111'B),
+ BSSMAP_LE_LCS_CAUSE_FACILITY_NOTSUPP ('00001000'B),
+ BSSMAP_LE_LCS_CAUSE_INTER_BSC_HO ('00001001'B),
+ BSSMAP_LE_LCS_CAUSE_INTRA_BSC_HO ('00001010'B),
+ BSSMAP_LE_LCS_CAUSE_CONGESTION ('00001011'B),
+ BSSMAP_LE_LCS_CAUSE_INTER_NSE_CHG ('00001100'B),
+ BSSMAP_LE_LCS_CAUSE_RA_UPDAT ('00001101'B),
+ BSSMAP_LE_LCS_CAUSE_PTMSI_REALLOC ('00001110'B),
+ BSSMAP_LE_LCS_CAUSE_GPRS_SUSPENSION ('00001111'B)
+} with { variant "FIELDLENGTH(8)" };
+
+/* Section 10.14 */
+type record BSSMAP_LE_IE_LcsClientType {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ BSSMAP_LE_ClientType cltype
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_CAUSE)"
+ variant (len) "LENGTHTO(cltype)"
+}
+type enumerated BSSMAP_LE_ClientType {
+ BSSMAP_LE_LCS_CTYPE_VALUE_ADDED_UNSPECIFIED ('00000000'B),
+ BSSMAP_LE_LCS_CTYPE_PLMN_OPER_UNSPECIFIED ('00100000'B),
+ BSSMAP_LE_LCS_CTYPE_PLMN_OPER_BCAST_SERVICE ('00100001'B),
+ BSSMAP_LE_LCS_CTYPE_PLMN_OPER_OAM ('00100010'B),
+ BSSMAP_LE_LCS_CTYPE_PLMN_OPER_ANON_STATS ('00100011'B),
+ BSSMAP_LE_LCS_CTYPE_PLMN_OPER_TGT_MS_SVC ('00100100'B),
+ BSSMAP_LE_LCS_CTYPE_EMERG_SVC_UNSPECIFIED ('00110000'B),
+ BSSMAP_LE_LCS_CTYPE_LI_UNSPECIFIED ('01000000'B)
+} with { variant "FIELDLENGTH(8)" };
+
+/* Section 10.15 */
+type record BSSMAP_LE_IE_LcsPriority {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ OCT1 priority
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_LCS_PRIORITY)"
+ variant (len) "LENGTHTO(priority)"
+}
+
+/* Section 10.16 */
+type record BSSMAP_LE_IE_LcsQoS {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+
+ BIT6 spare,
+ boolean vel,
+ boolean vert,
+
+ boolean ha,
+ uint7_t horiz_acc,
+
+ boolean va,
+ uint7_t vert_acc,
+
+ BIT2 rt,
+ BIT6 spare2
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_LCS_QoS)"
+ variant (len) "LENGTHTO(spare,vel,vert,ha,horiz_acc,va,vert_acc,rt,spare2)"
+}
+
+/* Section 10.18 */
+type record BSSMAP_LE_IE_LocationType {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ BSSMAP_LE_LocInfo loc_info,
+ BSSMAP_LE_PosMethod pos_method optional
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_LOCATION_TYPE)"
+ variant (len) "LENGTHTO(loc_info,pos_method)"
+ variant (pos_method) "PRESENCE(loc_info = BSSMAP_LE_LOC_INFO_ASS_INFO_FOR_TGT_MS,
+ loc_info = BSSMAP_LE_LOC_INFO_DECIPH_KEYS_FOR_BCAST)"
+}
+type enumerated BSSMAP_LE_LocInfo {
+ BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC ('00000000'B),
+ BSSMAP_LE_LOC_INFO_ASS_INFO_FOR_TGT_MS ('00000001'B),
+ BSSMAP_LE_LOC_INFO_DECIPH_KEYS_FOR_BCAST ('00000010'B)
+} with { variant "FIELDLENGTH(8)" };
+type enumerated BSSMAP_LE_PosMethod {
+ BSSMAP_LE_POS_METHOD_RESERVED ('00000000'B),
+ BSSMAP_LE_POS_MOBILE_ASSISTED_EOTD ('00000001'B),
+ BSSMAP_LE_POS_MOBILE_BASED_EOTD ('00000010'B),
+ BSSMAP_LE_POS_ASSISTED_GPS ('00000011'B),
+ BSSMAP_LE_POS_ASSISTED_GANSS ('00000100'B),
+ BSSMAP_LE_POS_ASSISTED_GPS_AND_GANSS ('00000101'B)
+} with { variant "FIELDLENGTH(8)" };
+
+/* Section 10.19 */
+type record BSSMAP_LE_IE_NetElementId {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ BIT4 spare,
+ BSSMAP_LE_IdDiscr id_discr,
+ BSSMAP_LE_IdU u
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_NET_ELEM_ID)"
+ variant (len) "LENGTHTO(spare,id_discr,u)"
+ variant (u) "CROSSTAG(
+ cgi, id_discr = BSSMAP_LE_ID_DISC_CGI;
+ lac_ci, id_discr = BSSMAP_LE_ID_DISC_LAC_CI;
+ lai, id_discr = BSSMAP_LE_ID_DISC_LAI;
+ lac, id_discr = BSSMAP_LE_ID_DISC_LAC;
+ lmu, id_discr = BSSMAP_LE_ID_LMU;
+ )"
+};
+type enumerated BSSMAP_LE_IdDiscr {
+ BSSMAP_LE_ID_DISC_CGI ('0000'B),
+ BSSMAP_LE_ID_DISC_LAC_CI ('0001'B),
+ BSSMAP_LE_ID_DISC_LAI ('0100'B),
+ BSSMAP_LE_ID_DISC_LAC ('0101'B),
+ BSSMAP_LE_ID_LMU ('0110'B)
+} with { variant "FIELDLENGTH(4)" };
+type union BSSMAP_LE_IdU {
+ BSSMAP_LE_Id_CGI cgi,
+ BSSMAP_LE_Id_LAC_CI lac_ci,
+ BSSMAP_LE_Id_LAI lai,
+ uint16_t lac,
+ octetstring lmu
+};
+type record BSSMAP_LE_Id_CGI {
+ HEX6n mcc_mnc,
+ uint16_t lac,
+ uint16_t ci
+};
+type record BSSMAP_LE_Id_LAC_CI {
+ uint16_t lac,
+ uint16_t ci
+};
+type record BSSMAP_LE_Id_LAI {
+ HEX6n mcc_mnc,
+ uint16_t lac
+};
+
+/* Section 10.20 */
+type record BSSMAP_LE_IE_PositioningData {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ BIT4 spare,
+ uint4_t discr,
+ BSSMAP_LE_PosMethList pos_meth
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_POSITIONING_DATA)"
+ variant (len) "LENGTHTO(spare,discr,pos_meth)"
+};
+type record of BSSMAP_LE_PosMethodN BSSMAP_LE_PosMethList;
+type record BSSMAP_LE_PosMethodN {
+ BSSMAP_LE_Method method,
+ BSSMAP_LE_Usage usage
+};
+type enumerated BSSMAP_LE_Method {
+ BSSMAP_LE_METHOD_TA ('00000'B),
+ BSSMAP_LE_METHOD_RESERVED0 ('00001'B),
+ BSSMAP_LE_METHOD_RESERVED1 ('00010'B),
+ BSSMAP_LE_METHOD_MOBILE_ASS_EOTD ('00011'B),
+ BSSMAP_LE_METHOD_MOBILE_BASED_EOTD ('00100'B),
+ BSSMAP_LE_METHOD_MOBILE_ASS_GPS ('00101'B),
+ BSSMAP_LE_METHOD_MOBILE_BASED_GPS ('00110'B),
+ BSSMAP_LE_METHOD_CONVENTIONAL_GPS ('00111'B),
+ BSSMAP_LE_METHOD_UTDOA ('01000'B),
+ BSSMAP_LE_METHOD_CELL_ID ('01100'B)
+} with { variant "FIELDLENGTH(5)" };
+type enumerated BSSMAP_LE_Usage {
+ BSSMAP_LE_USAGE_ATTEMPTED_UNSUCC ('000'B),
+ BSSMAP_LE_USAGE_ATTEMPTED_SUCC_NOT_USED ('001'B),
+ BSSMAP_LE_USAGE_ATTEMPTED_SUCC_USED_VRFY_NOT_GEN ('010'B),
+ BSSMAP_LE_USAGE_ATTEMPTED_SUCC_USED_GEN ('011'B),
+ BSSMAP_LE_USAGE_ATTEMPTED_SUCC_USAGE_UNDETERMINED ('100'B)
+} with { variant "FIELDLENGTH(3)" };
+
+/* Section 10.21 */
+type record BSSMAP_LE_IE_RetErrReq {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ OCT1 ret_err_type
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_RET_ERR_REQ)"
+ variant (len) "LENGTHTO(ret_err_type)"
+}
+
+/* Section 10.22 */
+type record BSSMAP_LE_IE_RetErrCause {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ BSSMAP_LE_RetErrCause cause
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_RET_ERR_REQ)"
+ variant (len) "LENGTHTO(cause)"
+}
+type enumerated BSSMAP_LE_RetErrCause {
+ BSSMAP_LE_RE_CAUSE_UNSPECIFIED ('00000000'B),
+ BSSMAP_LE_RE_CAUSE_SYSTEM_FAILURE ('00000001'B),
+ BSSMAP_LE_RE_CAUSE_PROTOCOL_ERROR ('00000010'B),
+ BSSMAP_LE_RE_CAUSE_DEST_UNKNOWN ('00000011'B),
+ BSSMAP_LE_RE_CAUSE_DEST_UNREACHABLE ('00000100'B),
+ BSSMAP_LE_RE_CAUSE_CONGESTION ('00000101'B)
+} with { variant "FIELDLENGTH(8)" };
+
+/* Section 10.24 */
+type record BSSMAP_LE_IE_Segmentation {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ BIT3 spare,
+ boolean s_non_final,
+ uint4_t seg_nr,
+ OCT2 msg_id optional
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_SEGMENTATION)"
+ variant (len) "LENGTHTO(spare,s_non_final,seg_nr,msg_id)"
+}
+
+/* Section 10.26 */
+type record BSSMAP_LE_IE_LcsCapability {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ octetstring lcs_cap
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_LCS_CAPABILITY)"
+ variant (len) "LENGTHTO(lcs_cap)"
+}
+
+type record BSSMAP_LE_IE_PacketMeasRep {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ octetstring pkt_meas_rep
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_PKT_MEAS_REP)"
+ variant (len) "LENGTHTO(pkt_meas_rep)"
+}
+
+type record BSSMAP_LE_IE_CellIdList {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ BSSLAP_CellIdList cell_id_list
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_CELL_ID_LIST)"
+ variant (len) "LENGTHTO(cell_id_list)"
+}
+
+/* Section 10.29 */
+type record BSSMAP_LE_IE_IMEI {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ MobileIdentityV imei
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_IMEI)"
+ variant (len) "LENGTHTO(imei)"
+}
+
+/* Section 10.30 */
+type record BSSMAP_LE_IE_VelocityData {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ octetstring data
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_VELOCITY_DATA)"
+ variant (len) "LENGTHTO(data)"
+}
+
+/* Section 10.32 */
+type record BSSMAP_LE_IE_GanssPosData {
+ BSSMAP_LE_IEI iei,
+ uint8_t len,
+ BSSMAP_LE_GanssList list
+} with {
+ variant "PRESENCE(iei = BSSMAP_LE_IEI_VELOCITY_DATA)"
+ variant (len) "LENGTHTO(list)"
+}
+type record of BSSMAP_LE_Ganss BSSMAP_LE_GanssList;
+type record BSSMAP_LE_Ganss {
+ BSSMAP_LE_GanssMethod method,
+ BSSMAP_LE_GanssId id,
+ BSSMAP_LE_Usage usage
+};
+type enumerated BSSMAP_LE_GanssMethod {
+ BSSMAP_LE_GANSS_METH_MS_BASED ('00'B),
+ BSSMAP_LE_GANSS_METH_MS_ASSISTED ('01'B),
+ BSSMAP_LE_GANSS_METH_MS_CONVENTIONAL ('10'B),
+ BSSMAP_LE_GANSS_METH_MS_RESERVED ('11'B)
+} with { variant "FIELDLENGTH(2)" };
+type enumerated BSSMAP_LE_GanssId {
+ BSSMAP_LE_GANSS_ID_GALILEO ('000'B),
+ BSSMAP_LE_GANSS_ID_SBAS ('001'B),
+ BSSMAP_LE_GANSS_ID_MODERNIZED_GPS ('010'B),
+ BSSMAP_LE_GANSS_ID_QZSS ('011'B),
+ BSSMAP_LE_GANSS_ID_GLONASS ('100'B),
+ BSSMAP_LE_GANSS_ID_BDS ('101'B)
+} with { variant "FIELDLENGTH(3)" };
+
+/* FIXME: Further IEs */
+
+
+
+
+type union BSSMAPLEorDTAP {
+ BSSMAP_LE_PDU bssmap,
+ octetstring dtap
+}
+
+type record PDU_BSSAP_LE {
+ BIT1 discriminator, // 0 = BSSMAP-LE; 1 = DTAP-LE
+ BIT7 spare, // always '0000000'B
+ OCT1 dlci optional,
+ LIN1 lengthIndicator,
+ BSSMAPLEorDTAP pdu
+} with {
+ variant (lengthIndicator) "LENGTHTO(pdu)"
+ variant (pdu) "CROSSTAG(bssmap, discriminator='0'B;
+ dtap, discriminator='1'B)"
+ variant (dlci) "PRESENCE(discriminator='1'B)"
+}
+
+
+external function enc_PDU_BSSAP_LE(in PDU_BSSAP_LE pdu) return octetstring
+with { extension "prototype(convert) encode(RAW)" }
+external function dec_PDU_BSSAP_LE(in octetstring stream) return PDU_BSSAP_LE
+with { extension "prototype(convert) decode(RAW)" }
+
+
+} with { encode "RAW" ; variant "FIELDORDER(msb)" }
diff --git a/library/BSSLAP_Types.ttcn b/library/BSSLAP_Types.ttcn
new file mode 100644
index 0000000..90c3953
--- /dev/null
+++ b/library/BSSLAP_Types.ttcn
@@ -0,0 +1,530 @@
+module BSSLAP_Types {
+
+/* BSSLAP_Types, defining abstract TTCN-3 data types for the 3GPP BSSLAP protocol.
+ *
+ * BSSLAP is a 3GPP standard protocol used between BSC and SMLC in a GSM network.
+ * This file covers 3GPP TS 48.071 version 15.0.0 Release 15
+ *
+ * (C) 2020 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.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+import from General_Types all;
+import from Osmocom_Types all;
+
+
+/* 3GPP TS 48.071 Table 5.1 */
+type enumerated BSSLAP_IEI {
+ BSSLAP_IEI_TA ('00000001'B),
+ BSSLAP_IEI_CELL_ID ('00001001'B),
+ BSSLAP_IEI_CHAN_DESC ('00010000'B),
+ BSSLAP_IEI_MEAS_REP ('00010100'B),
+ BSSLAP_IEI_CAUSE ('00011000'B),
+ BSSLAP_IEI_RRLP_FLAG ('00011001'B),
+ BSSLAP_IEI_RRLP ('00011011'B),
+ BSSLAP_IEI_CELL_ID_LIST ('00011100'B),
+ BSSLAP_IEI_ENH_MEAS_REP ('00011101'B),
+ BSSLAP_IEI_LAC ('00011110'B),
+ BSSLAP_IEI_FREQ_LIST ('00100001'B),
+ BSSLAP_IEI_MS_POWER ('00100010'B),
+ BSSLAP_IEI_DELTA_TIMER ('00100011'B),
+ BSSLAP_IEI_SERVING_CELL_ID ('00100100'B),
+ BSSLAP_IEI_ENCR_KEY ('00100101'B),
+ BSSLAP_IEI_CIPH_MODE_SET ('00100110'B),
+ BSSLAP_IEI_CHAN_MODE ('00100111'B),
+ BSSLAP_IEI_MR_CONFIG ('00101000'B),
+ BSSLAP_IEI_POLLING_REPETITION ('00101001'B),
+ BSSLAP_IEI_PACKET_CHAN_DESC ('00101010'B),
+ BSSLAP_IEI_TLLI ('00101011'B),
+ BSSLAP_IEI_TFI ('00101100'B),
+ BSSLAP_IEI_TBF_START_TIME ('00101101'B),
+ BSSLAP_IEI_PWRUP_START_TIME ('00101110'B),
+ BSSLAP_IEI_LONG_ENCR_KEY ('00101111'B),
+ BSSLAP_IEI_CONCUR_POS_PROC_F ('00110000'B)
+} with { variant "FIELDLENGTH(8)" };
+
+/* 3GPP TS 48.071 Section 5.1 */
+type enumerated BSSLAP_MsgType {
+ BSSLAP_MSGT_TA_REQUEST ('00000001'B),
+ BSSLAP_MSGT_TA_RESPONSE ('00000010'B),
+ BSSLAP_MSGT_REJECT ('00001010'B),
+ BSSLAP_MSGT_RESET ('00001011'B),
+ BSSLAP_MSGT_ABORT ('00001100'B),
+ BSSLAP_MSGT_TA_LAYER3 ('00001101'B),
+ BSSLAP_MSGT_MS_POS_CMD ('00001111'B),
+ BSSLAP_MSGT_MS_POS_RESP ('00010000'B),
+ BSSLAP_MSGT_UTDOA_REQ ('00010001'B),
+ BSSLAP_MSGT_UTDOA_RESP ('00010010'B)
+} with { variant "FIELDLENGTH(8)" };
+
+
+/* Section 4.2.1 */
+type record BSSLAP_TaRequest {
+ BSSLAP_MsgType msg_type
+};
+
+/* Section 4.2.2 */
+type record BSSLAP_TaResponse {
+ BSSLAP_MsgType msg_type,
+ BSSLAP_IE_CellId serving_cell_id,
+ BSSLAP_IE_TimingAdvance timing_advance,
+ BSSLAP_IE_MeasRep meas_rep optional,
+ BSSLAP_IE_EnhMeasRep enh_meas_rep optional,
+ BSSLAP_IE_CellIdList meas_cell_id_list optional,
+ BSSLAP_IE_ConcurMethodF concur_meth_flag optional
+};
+
+/* Section 4.2.5 */
+type record BSSLAP_Reject {
+ BSSLAP_MsgType msg_type,
+ BSSLAP_IE_Cause cause
+};
+
+/* Section 4.2.6 */
+type record BSSLAP_Reset {
+ BSSLAP_MsgType msg_type,
+ BSSLAP_IE_CellId cell_id,
+ BSSLAP_IE_TimingAdvance timing_advance,
+ BSSLAP_IE_ChanDesc chan_desc,
+ BSSLAP_IE_Cause cause,
+ BSSLAP_IE_MeasRep meas_rep optional,
+ BSSLAP_IE_EnhMeasRep enh_meas_rep optional,
+ BSSLAP_IE_CellIdList meas_cell_id_list optional,
+ BSSLAP_IE_LAC lac optional,
+ BSSLAP_IE_FreqList freq_list optional,
+ BSSLAP_IE_ChanMode chan_mode optional,
+ BSSLAP_IE_MultiRateConfig mr_config optional,
+ BSSLAP_IE_PacketChanDesc pkt_chan_desc optional,
+ BSSLAP_IE_TLLI tlli optional,
+ BSSLAP_IE_TFI tfi optional,
+ BSSLAP_IE_StartingTime tbf_start_time optional,
+ BSSLAP_IE_EncryptionKey encr_key optional,
+ BSSLAP_IE_CiphModeSet ciph_mode_set optional,
+ BSSLAP_IE_LongEncryptionKey long_encr_key optional
+};
+
+/* Section 4.2.7 */
+type record BSSLAP_Abort {
+ BSSLAP_MsgType msg_type,
+ BSSLAP_IE_Cause cause
+};
+
+/* Section 4.2.8 */
+type record BSSLAP_TA_Layer3 {
+ BSSLAP_MsgType msg_type,
+ BSSLAP_IE_TimingAdvance timing_advance,
+ BSSLAP_IE_MeasRep meas_rep optional,
+ BSSLAP_IE_EnhMeasRep enh_meas_rep optional,
+ BSSLAP_IE_CellIdList meas_cell_id_list optional
+};
+
+/* Section 4.2.9 */
+type record BSSLAP_MS_PosCmd {
+ BSSLAP_MsgType msg_type,
+ BSSLAP_IE_RrlpFlag flag,
+ BSSLAP_IE_Rrlp rrlp_info
+};
+
+/* Section 4.2.10 */
+type record BSSLAP_MS_PosResp {
+ BSSLAP_MsgType msg_type,
+ BSSLAP_IE_RrlpFlag flag,
+ BSSLAP_IE_Rrlp rrlp_info,
+ BSSLAP_IE_TimingAdvance timing_advance optional,
+ BSSLAP_IE_MeasRep meas_rep optional,
+ BSSLAP_IE_EnhMeasRep enh_meas_rep optional,
+ BSSLAP_IE_CellIdList meas_cell_id_list optional,
+ BSSLAP_IE_ConcurMethodF concur_meth_flag optional
+};
+
+/* Section 4.2.11 */
+type record BSSLAP_UTDOA_Req {
+ BSSLAP_MsgType msg_type,
+ BSSLAP_IE_DeltaTimer delta_timer optional,
+ BSSLAP_IE_PollingRep polling_repetition optional
+};
+
+type union BSSLAP_PDU {
+ BSSLAP_TaRequest ta_req,
+ BSSLAP_TaResponse ta_resp,
+ BSSLAP_Reject reject,
+ BSSLAP_Reset reset,
+ BSSLAP_Abort abort,
+ BSSLAP_TA_Layer3 ta_layer3,
+ BSSLAP_MS_PosCmd ms_pos_cmd,
+ BSSLAP_MS_PosResp ms_pos_resp,
+ BSSLAP_UTDOA_Req utdoa_req
+ // TODO: U-TDOA Resp
+} with { variant "TAG(
+ ta_req, msg_type = BSSLAP_MSGT_TA_REQUEST;
+ ta_resp, msg_type = BSSLAP_MSGT_TA_RESPONSE;
+ reject, msg_type = BSSLAP_MSGT_REJECT;
+ reset, msg_type = BSSLAP_MSGT_RESET;
+ abort, msg_type = BSSLAP_MSGT_ABORT;
+ ta_layer3, msg_type = BSSLAP_MSGT_TA_LAYER3;
+ ms_pos_cmd, msg_type = BSSLAP_MSGT_MS_POS_CMD;
+ ms_pos_resp, msg_type = BSSLAP_MSGT_MS_POS_RESP;
+ utdoa_req, msg_type = BSSLAP_MSGT_UTDOA_REQ;
+ )"
+};
+
+
+/* Section 5.2 */
+type record BSSLAP_IE_TimingAdvance {
+ BSSLAP_IEI iei,
+ uint8_t ta
+} with { variant "PRESENCE(iei = BSSLAP_IEI_TA)" };
+
+
+/* Section 5.4 */
+type record BSSLAP_IE_CellId {
+ BSSLAP_IEI iei,
+ uint16_t cell_id
+} with { variant "PRESENCE(iei = BSSLAP_IEI_CELL_ID)" };
+
+/* Section 5.8 */
+type record BSSLAP_IE_ChanDesc {
+ BSSLAP_IEI iei,
+ OCT3 chan_desc
+} with { variant "PRESENCE(iei = BSSLAP_IEI_CHAN_DESC)" };
+
+
+/* Section 5.12 */
+type record BSSLAP_IE_MeasRep {
+ BSSLAP_IEI iei,
+ uint8_t len,
+ octetstring meas_rep
+} with {
+ variant "PRESENCE(iei = BSSLAP_IEI_MEAS_REP)"
+ variant (len) "LENGTHTO(meas_rep)"
+};
+
+/* Section 5.14 */
+type record BSSLAP_IE_Cause {
+ BSSLAP_IEI iei,
+ BSSLAP_Cause cause
+} with { variant "PRESENCE(iei = BSSLAP_IEI_CAUSE)" };
+type enumerated BSSLAP_Cause {
+ BSSLAP_CAUSE_CONGESTION ('00000000'B),
+ BSSLAP_CAUSE_CHAN_MODE_NOT_SUPP ('00000001'B),
+ BSSLAP_CAUSE_POS_PROC_NOT_SUPP ('00000010'B),
+ BSSLAP_CAUSE_OTHER_RADIO_EVT_FAIL ('00000011'B),
+ BSSLAP_CAUSE_INTRA_BSS_HO ('00000100'B),
+ BSSLAP_CAUSE_SUPERV_TIMER_EXPIRED ('00000101'B),
+ BSSLAP_CAUSE_INTER_BSS_HO ('00000110'B),
+ BSSLAP_CAUSE_LOSS_SIG_CONN_MS ('00000111'B),
+ BSSLAP_CAUSE_INCORR_SERV_CELL_ID ('00001000'B),
+ BSSLAP_CAUSE_BSSAP_LE_SEGMENT_ERR ('00001001'B),
+ BSSLAP_CAUSE_CONCUR_POS_PROC_NOT_EN ('00001010'B)
+};
+
+/* Section 5.15 */
+type record BSSLAP_IE_RrlpFlag {
+ BSSLAP_IEI iei,
+ BIT7 spare,
+ boolean not_a_pos_cmd
+} with { variant "PRESENCE(iei = BSSLAP_IEI_RRLP_FLAG)" };
+
+/* Section 5.16 */
+type record BSSLAP_IE_Rrlp {
+ BSSLAP_IEI iei,
+ uint16_t len,
+ octetstring rrlp_apdu
+} with {
+ variant "PRESENCE(iei = BSSLAP_IEI_RRLP)"
+ variant (len) "LENGTHTO(rrlp_apdu)"
+};
+
+/* Section 5.17 */
+type record BSSLAP_IE_CellIdList {
+ BSSLAP_IEI iei,
+ uint8_t len,
+ BSSLAP_CellIdList cell_id_list
+} with {
+ variant "PRESENCE(iei = BSSLAP_IEI_CELL_ID_LIST)"
+ variant (len) "LENGTHTO(cell_id_list)"
+};
+type record of BSSLAP_CellIdListEnt BSSLAP_CellIdList;
+type union BSSLAP_CellIdListEnt {
+ BIT4 spare,
+ BSSLAP_CellIdDiscr discr,
+ BSSLAP_CellIdListEntU u
+}// with {
+//};
+type enumerated BSSLAP_CellIdDiscr {
+ BSSLAP_CIDL_DISC_CGI ('0000'B),
+ BSSLAP_CIDL_DISC_LAC_CI ('0001'B),
+ BSSLAP_CIDL_DISC_3G_1 ('0010'B),
+ BSSLAP_CIDL_DISC_3G_2 ('0011'B)
+} with { variant "FIELDLENGTH(4)" };
+type union BSSLAP_CellIdListEntU {
+ BSSLAP_CellIdListEntCGI cgi,
+ BSSLAP_CellIdListEntLACCI lac_ci,
+ BSSLAP_CellIdListEnt3G1 umts_cont1,
+ BSSLAP_CellIdListEnt3G2 umts_cont2
+};
+type record BSSLAP_CellIdListEntCGI {
+ HEX6n mcc_mnc,
+ uint16_t lac,
+ uint16_t ci
+};
+type record BSSLAP_CellIdListEntLACCI {
+ uint16_t lac,
+ uint16_t ci
+};
+type record BSSLAP_CellIdListEnt3G1 {
+ OCT9 cont
+};
+type record BSSLAP_CellIdListEnt3G2 {
+ OCT6 cont
+};
+
+/* Section 5.18 */
+type record BSSLAP_IE_EnhMeasRep {
+ BSSLAP_IEI iei,
+ uint8_t len,
+ octetstring meas_rep
+} with {
+ variant "PRESENCE(iei = BSSLAP_IEI_ENH_MEAS_REP)"
+ variant (len) "LENGTHTO(meas_rep)"
+};
+
+/* Section 5.19 */
+type record BSSLAP_IE_LAC {
+ BSSLAP_IEI iei,
+ uint16_t lac
+} with { variant "PRESENCE(iei = BSSLAP_IEI_LAC)" };
+
+/* Section 5.20 */
+type record BSSLAP_IE_FreqList {
+ BSSLAP_IEI iei,
+ uint8_t len,
+ octetstring freq_list
+} with {
+ variant "PRESENCE(iei = BSSLAP_IEI_FREQ_LIST)"
+ variant (len) "LENGTHTO(freq_list)"
+};
+
+/* Section 5.21 */
+type record BSSLAP_IE_MsPower {
+ BSSLAP_IEI iei,
+ uint8_t ms_pwr
+} with { variant "PRESENCE(iei = BSSLAP_IEI_MS_POWER)" };
+
+/* Section 5.22 */
+type record BSSLAP_IE_DeltaTimer {
+ BSSLAP_IEI iei,
+ uint8_t timer_val
+} with { variant "PRESENCE(iei = BSSLAP_IEI_MS_POWER)" };
+
+/* Section 5.23 */
+type record BSSLAP_IE_ServingCellId {
+ BSSLAP_IEI iei,
+ uint8_t len,
+ octetstring val // FIXME: like TS 08.08
+} with {
+ variant "PRESENCE(iei = BSSLAP_IEI_SERVING_CELL_ID)"
+ variant (len) "LENGTHTO(val)"
+};
+
+/* Section 5.24 */
+type record BSSLAP_IE_EncryptionKey {
+ BSSLAP_IEI iei,
+ OCT8 kc
+} with { variant "PRESENCE(iei = BSSLAP_IEI_ENCR_KEY)" };
+
+/* Section 5.25 */
+type record BSSLAP_IE_CiphModeSet {
+ BSSLAP_IEI iei,
+ BIT1 spare,
+ BIT3 iei2,
+ BIT3 algo_id,
+ boolean sc
+} with { variant "PRESENCE(iei = BSSLAP_IEI_CIPH_MODE_SET)" };
+
+/* Section 5.26 */
+type record BSSLAP_IE_ChanMode {
+ BSSLAP_IEI iei,
+ OCT1 mode
+} with { variant "PRESENCE(iei = BSSLAP_IEI_CHAN_MODE)" };
+
+/* Section 5.27 */
+type record BSSLAP_IE_MultiRateConfig {
+ BSSLAP_IEI iei,
+ uint8_t len,
+ /* TODO: Unify with TS 48.018 */
+ uint3_t mr_speech_ver,
+ boolean nscb,
+ boolean icmi,
+ BIT1 spare,
+ uint2_t start_mode,
+ octetstring parameters
+} with {
+ variant "PRESENCE(iei = BSSLAP_IEI_MR_CONFIG)"
+ variant (len) "LENGTHTO(mr_speech_ver,nscb,icmi,spare,start_mode,parameters)"
+};
+
+/* Section 5.28 */
+type record BSSLAP_IE_PollingRep {
+ BSSLAP_IEI iei,
+ BIT2 spare,
+ uint6_t num_rep
+} with { variant "PRESENCE(iei = BSSLAP_IEI_MR_CONFIG)" };
+
+/* Section 5.29 */
+type record BSSLAP_IE_PacketChanDesc {
+ BSSLAP_IEI iei,
+ OCT4 chan_desc
+} with { variant "PRESENCE(iei = BSSLAP_IEI_PACKET_CHAN_DESC)" };
+
+/* Section 5.30 */
+type record BSSLAP_IE_TLLI {
+ BSSLAP_IEI iei,
+ OCT4 tlli
+} with { variant "PRESENCE(iei = BSSLAP_IEI_TLLI)" };
+
+/* Section 5.31 */
+type record BSSLAP_IE_TFI {
+ BSSLAP_IEI iei,
+ BIT3 spare,
+ uint5_t tfi
+} with { variant "PRESENCE(iei = BSSLAP_IEI_TFI)" };
+
+/* Section 5.32 */
+type record BSSLAP_IE_StartingTime {
+ BSSLAP_IEI iei,
+ uint5_t t1_p,
+ uint6_t t3,
+ uint6_t t2
+} with { variant "PRESENCE(iei = BSSLAP_IEI_TBF_START_TIME)" };
+
+/* Section 5.33 */
+type record BSSLAP_IE_LongEncryptionKey {
+ BSSLAP_IEI iei,
+ OCT16 kc
+} with { variant "PRESENCE(iei = BSSLAP_IEI_LONG_ENCR_KEY)" };
+
+/* Section 5.34 */
+type record BSSLAP_IE_ConcurMethodF {
+ BSSLAP_IEI iei,
+ BSSLAP_ConcurMethodF flag
+} with { variant "PRESENCE(iei = BSSLAP_IEI_CONCUR_POS_PROC_F)" };
+type enumerated BSSLAP_ConcurMethodF {
+ BSSLAP_SECOND_CONCUR_ALLOWED ('00000000'B),
+ BSSLAP_SECOND_CONCUR_DISALLOWED ('11111111'B)
+} with { variant "FIELDLENGTH(8)" };
+
+
+
+external function enc_BSSLAP_PDU(in BSSLAP_PDU msg) return octetstring
+ with { extension "prototype(convert) encode(RAW)" };
+external function dec_BSSLAP_PDU(in octetstring stream) return BSSLAP_PDU
+ with { extension "prototype(convert) decode(RAW)" };
+
+template (value) BSSLAP_PDU ts_BSSLAP_TA_Req := {
+ ta_req := {
+ msg_type := BSSLAP_MSGT_TA_REQUEST
+ }
+}
+template (present) BSSLAP_PDU tr_BSSLAP_TA_Req := {
+ ta_req := {
+ msg_type := BSSLAP_MSGT_TA_REQUEST
+ }
+}
+
+template (value) BSSLAP_PDU
+ts_BSSLAP_TA_Resp(uint16_t cell_id, uint8_t ta) := {
+ ta_resp := {
+ msg_type := BSSLAP_MSGT_TA_RESPONSE,
+ serving_cell_id := ts_BSSLAP_IE_CellId(cell_id),
+ timing_advance := ts_BSSLAP_IE_TA(ta),
+ meas_rep := omit,
+ enh_meas_rep := omit,
+ meas_cell_id_list := omit,
+ concur_meth_flag := omit
+ }
+}
+template (present) BSSLAP_PDU
+tr_BSSLAP_TA_Resp(template (present) uint16_t cell_id, template (present) uint8_t ta) := {
+ ta_resp := {
+ msg_type := BSSLAP_MSGT_TA_RESPONSE,
+ serving_cell_id := tr_BSSLAP_IE_CellId(cell_id),
+ timing_advance := tr_BSSLAP_IE_TA(ta),
+ meas_rep := *,
+ enh_meas_rep := *,
+ meas_cell_id_list := *,
+ concur_meth_flag := *
+ }
+}
+
+template (value) BSSLAP_PDU
+ts_BSSLAP_Reject(BSSLAP_Cause cause) := {
+ reject := {
+ msg_type := BSSLAP_MSGT_REJECT,
+ cause := ts_BSSLAP_IE_Cause(cause)
+ }
+}
+template (present) BSSLAP_PDU
+tr_BSSLAP_Reject(template (present) BSSLAP_Cause cause) := {
+ reject := {
+ msg_type := BSSLAP_MSGT_REJECT,
+ cause := tr_BSSLAP_IE_Cause(cause)
+ }
+}
+
+
+template (value) BSSLAP_PDU
+ts_BSSLAP_Abort(BSSLAP_Cause cause) := {
+ abort := {
+ msg_type := BSSLAP_MSGT_ABORT,
+ cause := ts_BSSLAP_IE_Cause(cause)
+ }
+}
+template (present) BSSLAP_PDU
+tr_BSSLAP_Abort(template (present) BSSLAP_Cause cause) := {
+ abort := {
+ msg_type := BSSLAP_MSGT_ABORT,
+ cause := tr_BSSLAP_IE_Cause(cause)
+ }
+}
+
+
+
+template (value) BSSLAP_IE_TimingAdvance ts_BSSLAP_IE_TA(uint8_t ta) := {
+ iei := BSSLAP_IEI_TA,
+ ta := ta
+}
+template (present) BSSLAP_IE_TimingAdvance tr_BSSLAP_IE_TA(template (present) uint8_t ta) := {
+ iei := BSSLAP_IEI_TA,
+ ta := ta
+}
+
+template (value) BSSLAP_IE_CellId ts_BSSLAP_IE_CellId(uint16_t cell_id) := {
+ iei := BSSLAP_IEI_CELL_ID,
+ cell_id := cell_id
+}
+template (present) BSSLAP_IE_CellId tr_BSSLAP_IE_CellId(template (present) uint16_t cell_id) := {
+ iei := BSSLAP_IEI_CELL_ID,
+ cell_id := cell_id
+}
+
+template (value) BSSLAP_IE_Cause ts_BSSLAP_IE_Cause(BSSLAP_Cause cause) := {
+ iei := BSSLAP_IEI_CAUSE,
+ cause := cause
+}
+template (present) BSSLAP_IE_Cause tr_BSSLAP_IE_Cause(template (present) BSSLAP_Cause cause) := {
+ iei := BSSLAP_IEI_CAUSE,
+ cause := cause
+}
+
+
+
+
+
+
+} with { encode "RAW" };
diff --git a/library/BSSMAP_LE_Templates.ttcn b/library/BSSMAP_LE_Templates.ttcn
new file mode 100644
index 0000000..70805e7
--- /dev/null
+++ b/library/BSSMAP_LE_Templates.ttcn
@@ -0,0 +1,434 @@
+module BSSMAP_LE_Templates {
+
+/* BSSMAP-LE Templates, building on top of BSSAP_LE_Types.
+ *
+ * (C) 2017-2020 by Harald Welte <laforge@gnumonks.org>
+ * contributions by sysmocom - s.f.m.c. GmbH
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from GSM_Types all;
+import from BSSAP_Types all;
+import from BSSAP_LE_Types all;
+import from BSSMAP_Templates all;
+import from L3_Templates all;
+
+function ts_BSSMAP_LE_LcsCause(template (omit) BSSMAP_LE_LcsCause cause)
+return template (omit) BSSMAP_LE_IE_LcsCause {
+ if (istemplatekind(cause, "omit")) {
+ return omit;
+ }
+ var template (omit) BSSMAP_LE_IE_LcsCause ie := {
+ iei := BSSMAP_LE_IEI_IMSI,
+ len := 0,
+ cause := cause,
+ diag_val := omit
+ }
+ return ie;
+}
+function tr_BSSMAP_LE_LcsCause(template BSSMAP_LE_LcsCause cause)
+return template BSSMAP_LE_IE_LcsCause {
+ if (istemplatekind(cause, "omit")) {
+ return omit;
+ }
+ var template BSSMAP_LE_IE_LcsCause ie := {
+ iei := BSSMAP_LE_IEI_IMSI,
+ len := ?,
+ cause := cause,
+ diag_val := *
+ }
+ return ie;
+}
+
+
+function ts_BSSMAP_LE_GeographicLoc(template (omit) octetstring loc)
+return template (omit) BSSMAP_LE_IE_GeographicLoc {
+ if (istemplatekind(loc, "omit")) {
+ return omit;
+ }
+ var template (omit) BSSMAP_LE_IE_GeographicLoc ie := {
+ iei := BSSMAP_LE_IEI_GEO_LOCATION,
+ len := 0,
+ location := loc
+ }
+ return ie;
+}
+function tr_BSSMAP_LE_GeographicLoc(template octetstring loc)
+return template BSSMAP_LE_IE_GeographicLoc {
+ if (istemplatekind(loc, "omit")) {
+ return omit;
+ }
+ var template BSSMAP_LE_IE_GeographicLoc ie := {
+ iei := BSSMAP_LE_IEI_GEO_LOCATION,
+ len := ?,
+ location := loc
+ }
+ return ie;
+}
+
+
+
+
+template (value) PDU_BSSAP_LE ts_BSSAP_LE_BSSMAP := {
+ discriminator := '0'B,
+ spare := '0000000'B,
+ dlci := omit,
+ lengthIndicator := 0, /* overwritten by codec */
+ pdu := {
+ bssmap := -
+ }
+}
+
+template (present) PDU_BSSAP_LE tr_BSSAP_LE_BSSMAP := {
+ discriminator := '0'B,
+ spare := '0000000'B,
+ dlci := *,
+ lengthIndicator := ?,
+ pdu := {
+ bssmap := ?
+ }
+}
+
+template (value) PDU_BSSAP_LE ts_BSSAP_LE_DTAP(octetstring dtap, template (value) OCT1 dlci) := {
+ discriminator := '1'B,
+ spare := '0000000'B,
+ dlci := dlci,
+ lengthIndicator := 0, /* overwritten by codec */
+ pdu := {
+ dtap := dtap
+ }
+}
+
+template (present) PDU_BSSAP_LE tr_BSSAP_LE_DTAP := {
+ discriminator := '1'B,
+ spare := '0000000'B,
+ dlci := *,
+ lengthIndicator := ?,
+ pdu := {
+ dtap := ?
+ }
+}
+
+function ts_BSSMAP_LE_IMSI(template (omit) hexstring imsi) return template (omit) BSSMAP_LE_IE_IMSI {
+ if (istemplatekind(imsi, "omit")) {
+ return omit;
+ }
+ template (value) BSSMAP_LE_IE_IMSI res := {
+ iei := BSSMAP_LE_IEI_IMSI,
+ len := 0,
+ imsi := ts_MI_IMSI(valueof(imsi))
+ };
+ return res;
+}
+function tr_BSSMAP_LE_IMSI(template hexstring imsi) return template BSSMAP_LE_IE_IMSI {
+ if (istemplatekind(imsi, "omit")) {
+ return omit;
+ }
+ template BSSMAP_LE_IE_IMSI res := {
+ iei := BSSMAP_LE_IEI_IMSI,
+ len := ?,
+ imsi := tr_MI_IMSI(imsi)
+ };
+ return res;
+}
+
+template (value) BSSMAP_LE_IE_LocationType ts_BSSMAP_LE_LocType(template (value) BSSMAP_LE_LocInfo li,
+ template (omit) BSSMAP_LE_PosMethod pm := omit) := {
+ iei := BSSMAP_LE_IEI_LOCATION_TYPE,
+ len := 0,
+ loc_info := li,
+ pos_method := pm
+}
+template (present) BSSMAP_LE_IE_LocationType tr_BSSMAP_LE_LocType(template (present) BSSMAP_LE_LocInfo li,
+ template BSSMAP_LE_PosMethod pm := omit) := {
+ iei := BSSMAP_LE_IEI_LOCATION_TYPE,
+ len := ?,
+ loc_info := li,
+ pos_method := pm
+}
+
+
+/* Section 9.1 */
+template (value) PDU_BSSAP_LE ts_BSMAP_LE_PerfLocReq(BSSMAP_LE_LocInfo loc_info := BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC,
+ template (value) BSSMAP_IE_CellIdentifier cell_id,
+ template (omit) hexstring imsi)
+
+modifies ts_BSSAP_LE_BSSMAP := {
+ pdu := {
+ bssmap := {
+ perf_loc_req := {
+ msg_type := BSSMAP_LE_PERFORM_LOC_REQ,
+ location_type := ts_BSSMAP_LE_LocType(loc_info),
+ cell_id := cell_id,
+ cm3 := omit,
+ lcs_client_type := omit,
+ chosen_channel := omit,
+ lcs_priority := omit,
+ lcs_qos := omit,
+ req_gps_ass_d := omit,
+ bsslap_apdu := omit,
+ lcs_capability := omit,
+ packet_meas_rep := omit,
+ meas_cell_id_list := omit,
+ imsi := ts_BSSMAP_LE_IMSI(imsi),
+ imei := omit
+ }
+ }
+ }
+}
+template (present) PDU_BSSAP_LE tr_BSMAP_LE_PerfLocReq(BSSMAP_LE_LocInfo loc_info := BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC,
+ template (present) BSSMAP_IE_CellIdentifier cell_id,
+ template hexstring imsi)
+modifies tr_BSSAP_LE_BSSMAP := {
+ pdu := {
+ bssmap := {
+ perf_loc_req := {
+ msg_type := BSSMAP_LE_PERFORM_LOC_REQ,
+ location_type := tr_BSSMAP_LE_LocType(loc_info),
+ cell_id := cell_id,
+ cm3 := *,
+ lcs_client_type := *,
+ chosen_channel := *,
+ lcs_priority := *,
+ lcs_qos := *,
+ req_gps_ass_d := *,
+ bsslap_apdu := *,
+ lcs_capability := *,
+ packet_meas_rep := *,
+ meas_cell_id_list := *,
+ imsi := tr_BSSMAP_LE_IMSI(imsi),
+ imei := *
+ }
+ }
+ }
+}
+
+
+/* Section 9.2 */
+template (value) PDU_BSSAP_LE ts_BSMAP_LE_PerfLocResp(BSSMAP_LE_LocInfo loc_info := BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC,
+ template (omit) octetstring geo_loc,
+ template (omit) BSSMAP_LE_LcsCause cause)
+
+modifies ts_BSSAP_LE_BSSMAP := {
+ pdu := {
+ bssmap := {
+ perf_loc_resp := {
+ msg_type := BSSMAP_LE_PERFORM_LOC_RESP,
+ geographic_loc := ts_BSSMAP_LE_GeographicLoc(geo_loc),
+ pos_data := omit,
+ deciph_keys := omit,
+ lcs_cause := ts_BSSMAP_LE_LcsCause(cause),
+ velocity_data := omit,
+ ganss_pos_data := omit
+ }
+ }
+ }
+}
+template (present) PDU_BSSAP_LE tr_BSMAP_LE_PerfLocResp(template BSSMAP_LE_LocInfo loc_info := BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC,
+ template octetstring geo_loc,
+ template BSSMAP_LE_LcsCause cause)
+modifies tr_BSSAP_LE_BSSMAP := {
+ pdu := {
+ bssmap := {
+ perf_loc_resp := {
+ msg_type := BSSMAP_LE_PERFORM_LOC_RESP,
+ geographic_loc := tr_BSSMAP_LE_GeographicLoc(geo_loc),
+ pos_data := *,
+ deciph_keys := *,
+ lcs_cause := tr_BSSMAP_LE_LcsCause(cause),
+ velocity_data := *,
+ ganss_pos_data := *
+ }
+ }
+ }
+}
+
+
+/* Section 9.8 */
+template (value) PDU_BSSAP_LE ts_BSSMAP_LE_ConnInfo(BSSMAP_LE_ProtocolId prot_id, octetstring data,
+ template (omit) BSSMAP_LE_IE_Segmentation segm := omit)
+modifies ts_BSSAP_LE_BSSMAP := {
+ pdu := {
+ bssmap := {
+ co_info := {
+ msg_type := BSSMAP_LE_CONN_ORIENTED_INFO,
+ bsslap_apdu := {
+ iei := BSSMAP_LE_IEI_APDU,
+ len := 0,
+ spare := '0'B,
+ protocol_id := prot_id,
+ data := data
+ },
+ segmentation := segm
+ }
+ }
+ }
+}
+template (present) PDU_BSSAP_LE tr_BSSMAP_LE_ConnInfo(template (present) BSSMAP_LE_ProtocolId prot_id,
+ template (present) octetstring data,
+ template BSSMAP_LE_IE_Segmentation segm := omit)
+modifies tr_BSSAP_LE_BSSMAP := {
+ pdu := {
+ bssmap := {
+ co_info := {
+ msg_type := BSSMAP_LE_CONN_ORIENTED_INFO,
+ bsslap_apdu := {
+ iei := BSSMAP_LE_IEI_APDU,
+ len := ?,
+ spare := '0'B,
+ protocol_id := prot_id,
+ data := data
+ },
+ segmentation := segm
+ }
+ }
+ }
+}
+
+
+
+/* Section 9.10 */
+template (value) PDU_BSSAP_LE ts_BSSMAP_LE_Reset(myBSSMAP_Cause cause) modifies ts_BSSAP_LE_BSSMAP := {
+ pdu := {
+ bssmap := {
+ reset := {
+ msg_type := BSSMAP_LE_RESET,
+ cause := ts_BSSMAP_IE_Cause(enum2int(cause))
+ }
+ }
+ }
+}
+template (present) PDU_BSSAP_LE tr_BSSMAP_LE_Reset modifies tr_BSSAP_LE_BSSMAP := {
+ pdu := {
+ bssmap := {
+ reset := {
+ msg_type := BSSMAP_LE_RESET,
+ cause := ?
+ }
+ }
+ }
+}
+
+/* Section 9.11 */
+template (value) PDU_BSSAP_LE ts_BSSMAP_LE_ResetAck modifies ts_BSSAP_LE_BSSMAP := {
+ pdu := {
+ bssmap := {
+ reset := {
+ msg_type := BSSMAP_LE_RESET_ACK
+ }
+ }
+ }
+}
+template (present) PDU_BSSAP_LE tr_BSSMAP_LE_ResetAck modifies tr_BSSAP_LE_BSSMAP := {
+ pdu := {
+ bssmap := {
+ reset_ack := {
+ msg_type := BSSMAP_LE_RESET_ACK
+ }
+ }
+ }
+}
+
+function ts_BSSMAP_LE_APDU(BSSMAP_LE_ProtocolId prot_id, template (omit) octetstring data)
+return template (omit) BSSMAP_LE_IE_APDU {
+ var BSSMAP_LE_IE_APDU ie := {
+ iei := BSSMAP_LE_IEI_APDU,
+ len := 0, // overwritten
+ spare := '0'B,
+ protocol_id := prot_id
+ }
+ if (istemplatekind(data, "omit")) {
+ return omit;
+ }
+ ie.data := valueof(data);
+ return ie;
+}
+
+function tr_BSSMAP_LE_APDU(template BSSMAP_LE_ProtocolId prot_id, template octetstring data)
+return template BSSMAP_LE_IE_APDU {
+ var template BSSMAP_LE_IE_APDU ie := {
+ iei := BSSMAP_LE_IEI_APDU,
+ len := ?,
+ spare := '0'B,
+ protocol_id := prot_id
+ }
+ if (istemplatekind(data, "omit")) {
+ return omit;
+ } else if (istemplatekind(data, "*")) {
+ return *;
+ }
+ ie.data := valueof(data);
+ return ie;
+}
+
+
+/* Section 9.12 */
+template (value) PDU_BSSAP_LE ts_BSSMAP_LE_PerformLocInfo(BSSMAP_IE_CellIdentifier cell_id,
+ BSSMAP_LE_ProtocolId prot_id,
+ template (omit) octetstring data)
+modifies ts_BSSAP_LE_BSSMAP := {
+ pdu := {
+ bssmap := {
+ perf_loc_info := {
+ msg_type := BSSMAP_LE_PERFORM_LOC_INFO,
+ cell_id := cell_id,
+ bsslap_apdu := ts_BSSMAP_LE_APDU(prot_id, data)
+ }
+ }
+ }
+}
+template (present) PDU_BSSAP_LE tr_BSSMAP_LE_PerformLocInfo(template (present) BSSMAP_IE_CellIdentifier cell_id,
+ template BSSMAP_LE_ProtocolId prot_id,
+ template octetstring data)
+modifies tr_BSSAP_LE_BSSMAP := {
+ pdu := {
+ bssmap := {
+ perf_loc_info := {
+ msg_type := BSSMAP_LE_PERFORM_LOC_INFO,
+ cell_id := cell_id,
+ bsslap_apdu := tr_BSSMAP_LE_APDU(prot_id, data)
+ }
+ }
+ }
+}
+
+/* return Layer3 octetstring inside BSSAP-LE PDU */
+function f_bssap_le_extract_l3(PDU_BSSAP_LE bssap) return template octetstring {
+ if (ischosen(bssap.pdu.bssmap)) {
+ return omit;
+ } else {
+ return bssap.pdu.dtap;
+ }
+}
+
+
+template PDU_BSSAP_LE tr_BSSMAP_LE_Paging(template hexstring imsi_digits := ?,
+ template OCT4 tmsi := *,
+ template BSSMAP_IE_ChannelNeeded chneed := *)
+modifies tr_BSSAP_LE_BSSMAP := {
+ pdu := {
+ bssmap := {
+ paging := {
+ messageType := '52'O,
+ iMSI := tr_BSSMAP_Imsi(imsi_digits),
+ tMSI := tr_BSSMAP_IE_TMSI(tmsi) ifpresent,
+ cellIdentifierList := ?,
+ channelNeeded := chneed,
+ eMLPP_Priority := omit,
+ pagingInformation := omit /* only VGCS/VBS flag */
+ }
+ }
+ }
+}
+
+
+
+
+} with { encode "RAW" };