module BSSMAP_LE_Templates { /* BSSMAP-LE Templates, building on top of BSSAP_LE_Types. * * (C) 2017-2020 by Harald Welte * 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" };