osmo-ttcn3-hacks/library/BSSLAP_Types.ttcn

607 lines
15 KiB
Plaintext

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_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" };