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 * 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_PDU ts_BSSLAP_TA_Layer3(uint8_t ta) := { ta_layer3 := { msg_type := BSSLAP_MSGT_TA_LAYER3, timing_advance := ts_BSSLAP_IE_TA(ta), meas_rep := omit, enh_meas_rep := omit, meas_cell_id_list := omit } } template (present) BSSLAP_PDU tr_BSSLAP_TA_Layer3(template BSSLAP_IE_TimingAdvance timing_advance := *) := { ta_layer3 := { msg_type := BSSLAP_MSGT_TA_LAYER3, timing_advance := timing_advance, meas_rep := *, enh_meas_rep := *, meas_cell_id_list := * } } template (value) BSSLAP_IE_ChanDesc ts_BSSLAP_IE_ChanDesc := { iei := BSSLAP_IEI_CHAN_DESC, chan_desc := '112233'O /* FIXME */ } template (value) BSSLAP_PDU ts_BSSLAP_Reset(uint16_t cell_id, uint8_t ta, BSSLAP_IE_ChanDesc chan_desc, BSSLAP_Cause cause) := { reset := { msg_type := BSSLAP_MSGT_RESET, cell_id := ts_BSSLAP_IE_CellId(cell_id), timing_advance := ts_BSSLAP_IE_TA(ta), chan_desc := chan_desc, cause := tr_BSSLAP_IE_Cause(cause), meas_rep := omit, enh_meas_rep := omit, meas_cell_id_list := omit, lac := omit, freq_list := omit, chan_mode := omit, mr_config := omit, pkt_chan_desc := omit, tlli := omit, tfi := omit, tbf_start_time := omit, encr_key := omit, ciph_mode_set := omit, long_encr_key := omit } } template (present) BSSLAP_PDU tr_BSSLAP_Reset(template (present) BSSLAP_Cause cause) := { reset := { msg_type := BSSLAP_MSGT_RESET, cell_id := ?, timing_advance := ?, chan_desc := ?, cause := tr_BSSLAP_IE_Cause(cause), meas_rep := *, enh_meas_rep := *, meas_cell_id_list := *, lac := *, freq_list := *, chan_mode := *, mr_config := *, pkt_chan_desc := *, tlli := *, tfi := *, tbf_start_time := *, encr_key := *, ciph_mode_set := *, long_encr_key := * } } 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" };