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 * 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) } with { variant "FIELDLENGTH(8)" }; /* 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) } with { variant "FIELDLENGTH(8)" }; /* 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)" }