456 lines
11 KiB
Plaintext
456 lines
11 KiB
Plaintext
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_LCS_CAUSE,
|
|
len := 1,
|
|
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_LCS_CAUSE,
|
|
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_BSSMAP_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,
|
|
template (omit) octetstring bsslap_apdu := omit)
|
|
|
|
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 := ts_BSSMAP_LE_APDU(BSSMAP_LE_PROT_BSSLAP, bsslap_apdu),
|
|
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_BSSMAP_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_BSSMAP_LE_PerfLocResp(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_BSSMAP_LE_PerfLocResp(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,
|
|
protocol_id := prot_id,
|
|
spare := '0'B,
|
|
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 := ?,
|
|
protocol_id := prot_id,
|
|
spare := '0'B,
|
|
data := data
|
|
},
|
|
segmentation := segm
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (value) PDU_BSSAP_LE ts_BSSMAP_LE_PerfLocAbort(BSSMAP_LE_LcsCause cause)
|
|
modifies ts_BSSAP_LE_BSSMAP := {
|
|
pdu := {
|
|
bssmap := {
|
|
perf_loc_abort := {
|
|
msg_type := BSSMAP_LE_PERFORM_LOC_ABORT,
|
|
lcs_cause := ts_BSSMAP_LE_LcsCause(cause)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
template (present) PDU_BSSAP_LE tr_BSSMAP_LE_PerfLocAbort(template BSSMAP_LE_LcsCause cause)
|
|
modifies tr_BSSAP_LE_BSSMAP := {
|
|
pdu := {
|
|
bssmap := {
|
|
perf_loc_abort := {
|
|
msg_type := BSSMAP_LE_PERFORM_LOC_ABORT,
|
|
lcs_cause := tr_BSSMAP_LE_LcsCause(cause)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 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_ack := {
|
|
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
|
|
protocol_id := prot_id,
|
|
spare := '0'B
|
|
}
|
|
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 := ?,
|
|
protocol_id := prot_id,
|
|
spare := '0'B
|
|
}
|
|
if (istemplatekind(data, "omit")) {
|
|
return omit;
|
|
} else if (istemplatekind(data, "*")) {
|
|
return *;
|
|
}
|
|
ie.data := 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" };
|