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