| module BSSMAP_Templates { |
| |
| /* BSSMAP Templates, building on top of BSSAP_Types from Ericsson. |
| * |
| * (C) 2017-2019 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 Native_Functions all; |
| import from Misc_Helpers all; |
| import from GSM_Types all; |
| import from BSSAP_Types all; |
| |
| type integer BssmapCause; |
| type integer SpeechVersion; |
| type integer Channel; |
| type integer ChannelMode; |
| type octetstring oldToNewBSSIEs; |
| |
| /* 48.008 3.2.2.5 - this actually belongs to BSSAP_Types.ttcn */ |
| type enumerated myBSSMAP_Cause { |
| /* 000 / 001: Normal event */ |
| GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE ('0000000'B), |
| GSM0808_CAUSE_RADIO_INTERFACE_FAILURE ('0000001'B), |
| GSM0808_CAUSE_UPLINK_QUALITY ('0000010'B), |
| GSM0808_CAUSE_UPLINK_STRENGTH ('0000011'B), |
| GSM0808_CAUSE_DOWNLINK_QUALITY ('0000100'B), |
| GSM0808_CAUSE_DOWNLINK_STRENGTH ('0000101'B), |
| GSM0808_CAUSE_DISTANCE ('0000110'B), |
| GSM0808_CAUSE_O_AND_M_INTERVENTION ('0000111'B), |
| GSM0808_CAUSE_RESPONSE_TO_MSC_INVOCATION ('0001000'B), |
| GSM0808_CAUSE_CALL_CONTROL ('0001001'B), |
| GSM0808_CAUSE_RADIO_INTERFACE_FAILURE_REVERSION ('0001010'B), |
| GSM0808_CAUSE_HANDOVER_SUCCESSFUL ('0001011'B), |
| GSM0808_CAUSE_BETTER_CELL ('0001100'B), |
| GSM0808_CAUSE_DIRECTED_RETRY ('0001101'B), |
| GSM0808_CAUSE_JOINED_GROUP_CALL_CHANNEL ('0001110'B), |
| GSM0808_CAUSE_TRAFFIC ('0001111'B), |
| GSM0808_CAUSE_REDUCE_LOAD_IN_SERVING_CELL ('0010000'B), |
| GSM0808_CAUSE_TRAFFIC_LOAD_IN_TGT_HIGHER_THAN_IN_SRC_CELL ('0010001'B), |
| GSM0808_CAUSE_RELOCATION_TRIGGERED ('0010010'B), |
| GSM0808_CAUSE_REQUSTED_OPT_NOT_AUTHORISED ('0010100'B), |
| GSM0808_CAUSE_ALT_CHAN_CONFIG_REQUESTED ('0010101'B), |
| GSM0808_CAUSE_RESP_TO_INT_HO_ENQ_MSG ('0010110'B), |
| GSM0808_CAUSE_INT_HO_ENQUIRY_REJECT ('0010111'B), |
| GSM0808_CAUSE_REDUNDANCY_LEVEL_NOT_ADEQUATE ('0011000'B), |
| /* reserved */ |
| /* 010: Resource unavailable */ |
| GSM0808_CAUSE_EQUIPMENT_FAILURE ('0100000'B), |
| GSM0808_CAUSE_NO_RADIO_RESOURCE_AVAILABLE ('0100001'B), |
| GSM0808_CAUSE_RQSTED_TERRESTRIAL_RESOURCE_UNAVAILABLE ('0100010'B), |
| GSM0808_CAUSE_CCCH_OVERLOAD ('0100011'B), |
| GSM0808_CAUSE_PROCESSOR_OVERLOAD ('0100100'B), |
| GSM0808_CAUSE_BSS_NOT_EQUIPPED ('0100101'B), |
| GSM0808_CAUSE_MS_NOT_EQUIPPED ('0100110'B), |
| GSM0808_CAUSE_INVALID_CELL ('0100111'B), |
| GSM0808_CAUSE_TRAFFIC_LOAD ('0101000'B), |
| GSM0808_CAUSE_PREEMPTION ('0101001'B), |
| GSM0808_CAUSE_DTM_HO_SGSN_FAILURE ('0101010'B), |
| GSM0808_CAUSE_DTM_HO_PS_ALLOC_FAILURE ('0101011'B), |
| /* reserved */ |
| /* 011: Service or option not available, but implemented */ |
| GSM0808_CAUSE_RQSTED_TRANSCODING_RATE_ADAPTION_UNAVAILABLE ('0110000'B), |
| GSM0808_CAUSE_CIRCUIT_POOL_MISMATCH ('0110001'B), |
| GSM0808_CAUSE_SWITCH_CIRCUIT_POOL ('0110010'B), |
| GSM0808_CAUSE_RQSTED_SPEECH_VERSION_UNAVAILABLE ('0110011'B), |
| GSM0808_CAUSE_LSA_NOT_ALLOWED ('0110100'B), |
| GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL ('0110101'B), |
| GSM0808_CAUSE_REQ_A_IF_TYPE_UNAVAIL ('0110110'B), |
| GSM0808_CAUSE_INVALID_CSG_CELL ('0110111'B), |
| /* reserved */ |
| /* 100: Service or option not implemented or currently disabled */ |
| GSM0808_CAUSE_REQ_REDUND_LEVEL_NOT_AVAIL ('0111111'B), |
| GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED ('1000000'B), |
| GSM0808_CAUSE_GERAN_IU_MODE_FAILURE ('1000001'B), |
| GSM0808_CAUSE_INC_RELOC_NOT_SUPP_DT_PUESBINE_FEATURE ('1000010'B), |
| GSM0808_CAUSE_ACCESS_RESTRICTED_DUE_TO_SHARED_NETWORKS ('1000011'B), |
| GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_NOT_SUPP ('1000100'B), |
| GSM0808_CAUSE_REQ_A_IF_TYPE_NOT_SUPP ('1000101'B), |
| GSM0808_CAUSE_REQ_REDUND_LVL_NOT_SUPP ('1000110'B), |
| /* reserved */ |
| /* 101: Invalid message */ |
| GSM0808_CAUSE_TERRESTRIAL_CIRCUIT_ALREADY_ALLOCATED ('1010000'B), |
| GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS ('1010001'B), |
| GSM0808_CAUSE_INFORMATION_ELEMENT_OR_FIELD_MISSING ('1010010'B), |
| GSM0808_CAUSE_INCORRECT_VALUE ('1010011'B), |
| GSM0808_CAUSE_UNKNOWN_MESSAGE_TYPE ('1010100'B), |
| GSM0808_CAUSE_UNKNOWN_INFORMATION_ELEMENT ('1010101'B), |
| GSM0808_CAUSE_DTM_HO_INVALID_PS_IND ('1010110'B), |
| GSM0808_CAUSE_CALL_ID_ALREADY_ALLOC ('1010111'B), |
| /* reserved */ |
| /* 110: protocol error */ |
| GSM0808_CAUSE_PROTOCOL_ERROR_BETWEEN_BSS_AND_MSC ('1100000'B), |
| GSM0808_CAUSE_VGCS_VBS_CALL_NON_EXISTANT ('1100001'B), |
| GSM0808_CAUSE_DTM_HO_TIMER_EXPIRY ('1100010'B) |
| } with { variant "FIELDLENGTH(7)" }; |
| |
| type enumerated BSSMAP_LcsCause { |
| BSSMAP_LCS_CAUSE_UNSPECIFIED ('00000000'B), |
| BSSMAP_LCS_CAUSE_SYSTEM_FAILURE ('00000001'B), |
| BSSMAP_LCS_CAUSE_PROTOCOL_ERROR ('00000010'B), |
| BSSMAP_LCS_CAUSE_DATA_MISSING_IN_REQ ('00000011'B), |
| BSSMAP_LCS_CAUSE_UNEXP_DATA_IN_REQ ('00000100'B), |
| BSSMAP_LCS_CAUSE_POS_METH_FAILURE ('00000101'B), |
| BSSMAP_LCS_CAUSE_TGT_MS_UNREACHABLE ('00000110'B), |
| BSSMAP_LCS_CAUSE_REQUEST_ABORTED ('00000111'B), |
| BSSMAP_LCS_CAUSE_FACILITY_NOTSUPP ('00001000'B), |
| BSSMAP_LCS_CAUSE_INTER_BSC_HO ('00001001'B), |
| BSSMAP_LCS_CAUSE_INTRA_BSC_HO ('00001010'B), |
| BSSMAP_LCS_CAUSE_CONGESTION ('00001011'B), |
| BSSMAP_LCS_CAUSE_INTER_NSE_CHG ('00001100'B), |
| BSSMAP_LCS_CAUSE_RA_UPDAT ('00001101'B), |
| BSSMAP_LCS_CAUSE_PTMSI_REALLOC ('00001110'B), |
| BSSMAP_LCS_CAUSE_GPRS_SUSPENSION ('00001111'B) |
| } with { variant "FIELDLENGTH(8)" }; |
| |
| template PDU_BSSAP ts_BSSAP_BSSMAP := { |
| discriminator := '0'B, |
| spare := '0000000'B, |
| dlci := omit, |
| lengthIndicator := 0, /* overwritten by codec */ |
| pdu := { |
| bssmap := ? |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSAP_BSSMAP := { |
| discriminator := '0'B, |
| spare := '0000000'B, |
| dlci := *, |
| lengthIndicator := ?, |
| pdu := { |
| bssmap := ? |
| } |
| } |
| |
| template PDU_BSSAP ts_BSSAP_DTAP(octetstring dtap, template OCT1 dlci := omit) := { |
| discriminator := '1'B, |
| spare := '0000000'B, |
| dlci := dlci, |
| lengthIndicator := 0, /* overwritten by codec */ |
| pdu := { |
| dtap := dtap |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSAP_DTAP := { |
| discriminator := '1'B, |
| spare := '0000000'B, |
| dlci := *, |
| lengthIndicator := ?, |
| pdu := { |
| dtap := ? |
| } |
| } |
| |
| template (value) BSSMAP_IE_Cause ts_BSSMAP_IE_Cause(BssmapCause val) := { |
| elementIdentifier := '04'O, |
| lengthIndicator := 0, |
| causeValue := int2bit(val, 7), |
| extensionCauseValue := '0'B, |
| spare1 := omit |
| } |
| template BSSMAP_IE_Cause tr_BSSMAP_IE_Cause(template (present) myBSSMAP_Cause val) := { |
| elementIdentifier := '04'O, |
| lengthIndicator := ?, |
| causeValue := f_tr_causeValue(val), |
| extensionCauseValue := ?, |
| spare1 := * |
| } |
| private function f_tr_causeValue(template (present) myBSSMAP_Cause val) |
| return template (present) BIT7 { |
| if (istemplatekind(val, "?")) { |
| return ?; |
| } else { |
| var integer int_val := enum2int(valueof(val)); |
| return int2bit(valueof(int_val), 7); |
| } |
| } |
| |
| template (value) BSSMAP_IE_SpeechVersion ts_BSSMAP_IE_SpeechVersion(SpeechVersion val) := { |
| elementIdentifier := '40'O, |
| speechVersionIdentifier := int2bit(val, 7), |
| spare1_1 := '0'B |
| } |
| |
| template (value) BSSMAP_IE_CurrentChannelType1 ts_BSSMAP_IE_CurrentChannelType1(Channel c, ChannelMode cm) := { |
| elementIdentifier := '31'O, |
| channel := int2bit(c, 4), |
| channelMode := int2bit(cm, 4) |
| } |
| |
| template (value) BSSMAP_IE_OldToNewBSSInfo ts_BSSMAP_IE_OldToNewBSSInfo(oldToNewBSSIEs val) := { |
| elementIdentifier := '3A'O, |
| lengthIndicator := 0, /* overwritten by codec */ |
| oldToNewBSSIEs := val |
| } |
| |
| template (value) BSSMAP_IE_Osmo_OsmuxSupport tr_BSSMAP_IE_Osmo_OsmuxSupport := { |
| elementIdentifier := 'F0'O |
| } |
| |
| private function f_enc_osmux_support(boolean osmux_enabled) return template (omit) BSSMAP_IE_Osmo_OsmuxSupport { |
| if (osmux_enabled) { |
| return tr_BSSMAP_IE_Osmo_OsmuxSupport; |
| } |
| return omit; |
| } |
| |
| template (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause, boolean osmux_enabled := false) modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| reset := { |
| messageType := '30'O, |
| cause := ts_BSSMAP_IE_Cause(cause), |
| a_InterfaceSelectorForReset := omit, |
| osmuxSupport := f_enc_osmux_support(osmux_enabled) |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_Reset(boolean osmux_enabled := false) modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| reset := { |
| messageType := '30'O, |
| cause := ?, |
| a_InterfaceSelectorForReset := *, |
| osmuxSupport := f_enc_osmux_support(osmux_enabled) |
| } |
| } |
| } |
| } |
| |
| template (value) PDU_BSSAP ts_BSSMAP_ResetAck(boolean osmux_enabled := false) modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| resetAck := { |
| messageType := '31'O, |
| a_InterfaceSelectorForReset := omit, |
| osmuxSupport := f_enc_osmux_support(osmux_enabled) |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_ResetAck(boolean osmux_enabled := false) modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| resetAck := { |
| messageType := '31'O, |
| a_InterfaceSelectorForReset := *, |
| osmuxSupport := f_enc_osmux_support(osmux_enabled) |
| } |
| } |
| } |
| } |
| |
| template BSSMAP_IE_CellIdentifier ts_BSSMAP_IE_CellID := { |
| elementIdentifier := '05'O, |
| lengthIndicator := 0, |
| cellIdentifierDiscriminator := '0000'B, |
| spare1_4 := '0000'B, |
| cellIdentification := ? |
| } |
| |
| type uint16_t BssmapLAC; |
| type uint16_t BssmapCI; |
| |
| template BSSMAP_IE_CellIdentifier ts_CellId_CGI(hexstring mcc, hexstring mnc, BssmapLAC lac, BssmapCI ci) |
| modifies ts_BSSMAP_IE_CellID := { |
| cellIdentification := { |
| cI_CGI := ts_BSSMAP_CI_CGI(mcc, mnc, lac, ci) |
| } |
| } |
| |
| template BSSMAP_IE_CellIdentifier ts_CellID_LAC_CI(BssmapLAC lac, BssmapCI ci) |
| modifies ts_BSSMAP_IE_CellID := { |
| cellIdentification := { |
| cI_LAC_CI := { |
| lac := int2oct(lac, 2), |
| ci := int2oct(ci, 2) |
| } |
| } |
| } |
| |
| template BSSMAP_IE_CellIdentifier ts_CellId_CI(BssmapCI ci) |
| modifies ts_BSSMAP_IE_CellID := { |
| cellIdentification := { |
| cI_CI := int2oct(ci, 2) |
| } |
| } |
| |
| template BSSMAP_IE_CellIdentifier ts_CellId_none |
| modifies ts_BSSMAP_IE_CellID := { |
| cellIdentification := { |
| cI_noCell := ''O |
| } |
| } |
| |
| |
| template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := { |
| elementIdentifier := '17'O, |
| lengthIndicator := 0, |
| layer3info := l3info |
| } |
| |
| template BSSMAP_IE_Layer3Information tr_BSSMAP_IE_L3Info(template octetstring l3info) := { |
| elementIdentifier := '17'O, |
| lengthIndicator := ?, |
| layer3info := l3info |
| } |
| |
| |
| template PDU_BSSAP ts_BSSMAP_ComplL3(BSSMAP_IE_CellIdentifier cell_id, octetstring l3_info) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| completeLayer3Information := { |
| messageType := '57'O, |
| cellIdentifier := cell_id, |
| layer3Information := ts_BSSMAP_IE_L3Info(l3_info), |
| chosenChannel := omit, |
| lSAIdentifier := omit, |
| aPDU := omit, |
| codecList := omit, |
| redirectAttemptFlag := omit, |
| sendSequenceNumber := omit, |
| iMSI := omit |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_ComplL3(template octetstring l3_info := ?, |
| template BSSMAP_IE_CellIdentifier cell_id := ?) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| completeLayer3Information := { |
| messageType := '57'O, |
| cellIdentifier := cell_id, |
| layer3Information := tr_BSSMAP_IE_L3Info(l3_info), |
| chosenChannel := *, |
| lSAIdentifier := *, |
| aPDU := *, |
| codecList := *, |
| redirectAttemptFlag := *, |
| sendSequenceNumber := *, |
| iMSI := * |
| } |
| } |
| } |
| } |
| |
| template BSSMAP_IE_CellIdentifierList ts_BSSMAP_IE_CidList(template BSSMAP_FIELD_CellIdentificationList cid_list) := { |
| elementIdentifier := '1A'O, |
| lengthIndicator := 0, /* overwritten */ |
| cellIdentifierDiscriminator := '0000'B, /* overwritten */ |
| spare1_4 := '0000'B, |
| cellIdentificationList := cid_list |
| } |
| |
| const OCT1 ChRate_ANY := '00'O; |
| const OCT1 ChRate_TCHF := '08'O; |
| const OCT1 ChRate_TCHH := '09'O; |
| const OCT1 ChRate_TCHForH_Fpref := '0A'O; |
| const OCT1 ChRate_TCHForH_Hpref := '0B'O; |
| const OCT1 ChRate_TCHForH_Fpref_nochg := '1A'O; |
| const OCT1 ChRate_TCHForH_Hpref_nochg := '1B'O; |
| const OCT1 ChRate_TCHForH := '0F'O; |
| const OCT1 ChRate_TCHForH_nochg := '1F'O; |
| |
| const OCT1 Spdi_TCHF_FR := '01'O; |
| const OCT1 Spdi_TCHF_EFR := '11'O; |
| const OCT1 Spdi_TCHF_AMR := '21'O; |
| const OCT1 Spdi_TCHH_HR := '05'O; |
| const OCT1 Spdi_TCHH_AMR := '25'O; |
| |
| template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelType := { |
| elementIdentifier := '0B'O, /* overwritten */ |
| lengthIndicator := 0, /* overwritten */ |
| speechOrDataIndicator := '0001'B, /* speech */ |
| spare1_4 := '0000'B, |
| channelRateAndType := ChRate_TCHF, |
| speechId_DataIndicator := Spdi_TCHF_FR |
| } |
| |
| template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCTM modifies ts_BSSMAP_IE_ChannelType := { |
| speechOrDataIndicator := '0100'B /* speech + CTM */ |
| } |
| |
| template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeCSD := { |
| elementIdentifier := '0B'O, /* overwritten */ |
| lengthIndicator := 0, /* overwritten */ |
| speechOrDataIndicator := '0010'B, /* data */ |
| spare1_4 := '0000'B, |
| channelRateAndType := ChRate_TCHF, |
| speechId_DataIndicator := '10'O /* 9600 bps / transparent */ |
| } |
| |
| template (value) BSSMAP_IE_ChannelType ts_BSSMAP_IE_ChannelTypeSIGNAL := { |
| elementIdentifier := '0B'O, /* overwritten */ |
| lengthIndicator := 0, /* overwritten */ |
| speechOrDataIndicator := '0011'B, /* data */ |
| spare1_4 := '0000'B, |
| channelRateAndType := ChRate_ANY, |
| speechId_DataIndicator := '00'O /* spare */ |
| } |
| |
| template (value) BSSMAP_IE_EncryptionInformation ts_BSSMAP_IE_EncrInfo(OCT8 kc, OCT1 algs := '05'O) := { |
| elementIdentifier := '0A'O, |
| lengthIndicator := 0, /* overwritten */ |
| permittedAlgorithms := algs, |
| key := kc |
| } |
| |
| template BSSMAP_IE_EncryptionInformation tr_BSSMAP_IE_EncrInfo(template OCT8 kc := ?, template OCT1 algs := ?) := { |
| elementIdentifier := '0A'O, |
| lengthIndicator := ?, /* overwritten */ |
| permittedAlgorithms := algs, |
| key := kc |
| } |
| |
| |
| |
| template (value) BSSMAP_IE_CircuitIdentityCode ts_BSSMAP_IE_CIC(uint11_t span, uint5_t ts) := { |
| elementIdentifier := '01'O, /* overwritten */ |
| cicHigh := bit2oct(substr(int2bit(span, 11) << 5, 0, 8)), |
| cicLow := bit2oct((substr(int2bit(span, 11), 8, 3) << 5) & int2bit(ts, 5)) |
| } |
| |
| function f_bssmap_ie_cic_2_int(BSSMAP_IE_CircuitIdentityCode cic_ie) return integer { |
| var integer cic := (oct2int(cic_ie.cicHigh) * 256) + oct2int(cic_ie.cicLow); |
| return cic; |
| } |
| |
| template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr, |
| uint16_t udp_port, |
| integer len) := { |
| elementIdentifier := '7C'O, |
| lengthIndicator := len, /* overwritten */ |
| ipAddress := addr, |
| uDPPortValue := udp_port |
| } |
| template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA4(OCT4 ip, uint16_t pt) := |
| ts_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6); |
| template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) := |
| ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18); |
| |
| function f_ts_BSSMAP_IE_AoIP_TLA(charstring addr, uint16_t udp_port) |
| return template (value) BSSMAP_IE_AoIP_TransportLayerAddress { |
| if (f_addr_is_ipv6(addr)) { |
| var OCT16 ip6 := f_inet6_addr(addr); |
| return ts_BSSMAP_IE_AoIP_TLA6(ip6, udp_port); |
| } else { |
| var OCT4 ip := f_inet_addr(addr); |
| return ts_BSSMAP_IE_AoIP_TLA4(ip, udp_port); |
| } |
| } |
| |
| template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA(template BSSMAP_FIELD_IPAddress addr, |
| template uint16_t udp_port, |
| template integer len := ?) := { |
| elementIdentifier := '7C'O, |
| lengthIndicator := len, |
| ipAddress := addr, |
| uDPPortValue := udp_port |
| } |
| template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA4(template OCT4 ip, template uint16_t pt) := |
| tr_BSSMAP_IE_AoIP_TLA({ipv4:=ip}, pt, 6); |
| template BSSMAP_IE_AoIP_TransportLayerAddress tr_BSSMAP_IE_AoIP_TLA6(template OCT16 ip, template uint16_t pt) := |
| tr_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt, 18); |
| |
| function f_tr_BSSMAP_IE_AoIP_TLA(charstring addr, template uint16_t udp_port) |
| return template BSSMAP_IE_AoIP_TransportLayerAddress { |
| if (f_addr_is_ipv6(addr)) { |
| var OCT16 ip6 := f_inet6_addr(addr); |
| return tr_BSSMAP_IE_AoIP_TLA6(ip6, udp_port); |
| } else { |
| var OCT4 ip := f_inet_addr(addr); |
| return tr_BSSMAP_IE_AoIP_TLA4(ip, udp_port); |
| } |
| } |
| |
| template (value) BSSMAP_IE_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := { |
| elementIdentifier := '83'O, |
| kC128_Value := kc128 |
| } |
| |
| /* 3.2.2.103 */ |
| template (value) BSSMAP_FIELD_CodecElement ts_CodecBase := { |
| codecType := GSM_FR, |
| tF := '0'B, |
| pT := '0'B, |
| pI := '0'B, |
| fI := '1'B, |
| extendedCodecType := omit, |
| s0_7 := omit, |
| s8_15 := omit |
| } |
| template (value) BSSMAP_FIELD_CodecElement ts_CodecFR modifies ts_CodecBase := { |
| codecType := GSM_FR |
| } |
| template (value) BSSMAP_FIELD_CodecElement ts_CodecEFR modifies ts_CodecBase := { |
| codecType := GSM_EFR |
| } |
| template (value) BSSMAP_FIELD_CodecElement ts_CodecHR modifies ts_CodecBase := { |
| codecType := GSM_HR |
| } |
| template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_F modifies ts_CodecBase := { |
| codecType := FR_AMR, |
| s0_7 := '11111111'B, |
| s8_15 := '01010111'B /* S11, S13 and S15 are reserved and coded with zeroes */ |
| } |
| template (value) BSSMAP_FIELD_CodecElement ts_CodecAMR_H modifies ts_CodecBase := { |
| codecType := HR_AMR, |
| s0_7 := '00111111'B, |
| s8_15 := '00000111'B /* S6 - S7 and S11 – S15 are reserved and coded with zeroes */ |
| } |
| template BSSMAP_IE_SpeechCodecList ts_BSSMAP_IE_CodecList(template BSSMAP_FIELD_CodecElements elem) := { |
| elementIdentifier := '7D'O, |
| lengthIndicator := 0, /* overwritten */ |
| codecElements := valueof(elem) |
| } |
| template BSSMAP_IE_SpeechCodec ts_BSSMAP_IE_SpeechCodec(template BSSMAP_FIELD_CodecElements elem) := { |
| elementIdentifier := '7E'O, |
| lengthIndicator := 0, /* overwritten */ |
| codecElements := valueof(elem) |
| } |
| |
| template (value) BSSMAP_IE_Osmo_OsmuxCID ts_OsmuxCID(INT1 cid) := { |
| elementIdentifier := 'F1'O, |
| osmuxCID := cid |
| } |
| |
| template PDU_BSSAP |
| ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit, |
| template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit, |
| template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| assignmentRequest := { |
| messageType :='01'O, /* overwritten */ |
| channelType := ts_BSSMAP_IE_ChannelType, |
| layer3HeaderInfo := omit, |
| priority := omit, |
| circuitIdentityCode := cic, |
| downLinkDTX_Flag := omit, |
| interferenceBandToBeUsed := omit, |
| classmarkInformationType2 := omit, |
| groupCallReference := omit, |
| talkerFlag := omit, |
| configurationEvolutionIndication := omit, |
| lsaAccesControlSuppression := omit, |
| serviceHandover := omit, |
| encryptionInformation := omit, |
| talkerPriority := omit, |
| aoIPTransportLayer := aoip, |
| codecList := omit, |
| callIdentifier := omit, |
| kC128 := omit, |
| globalCallReference := omit, |
| lCLS_Configuration := omit, |
| lCLS_ConnectionStatusControl := omit, |
| lCLS_CorrelationNotNeeded := omit, |
| osmuxCID := osmuxCID |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := *, |
| template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *, |
| template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| assignmentRequest := { |
| messageType :='01'O, /* overwritten */ |
| channelType := ?, |
| layer3HeaderInfo := *, |
| priority := *, |
| circuitIdentityCode := cic, |
| downLinkDTX_Flag := *, |
| interferenceBandToBeUsed := *, |
| classmarkInformationType2 := *, |
| groupCallReference := *, |
| talkerFlag := *, |
| configurationEvolutionIndication := *, |
| lsaAccesControlSuppression := *, |
| serviceHandover := *, |
| encryptionInformation := *, |
| talkerPriority := *, |
| aoIPTransportLayer := aoip, |
| codecList := *, |
| callIdentifier := *, |
| kC128 := *, |
| globalCallReference := *, |
| lCLS_Configuration := *, |
| lCLS_ConnectionStatusControl := *, |
| lCLS_CorrelationNotNeeded := *, |
| osmuxCID := osmuxCID |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP |
| ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit, |
| template BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit, |
| template BSSMAP_IE_SpeechCodec speechCodec := omit, |
| template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := omit) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| assignmentComplete := { |
| messageType :='02'O, /* overwritten */ |
| rR_Cause := omit, |
| circuitIdentityCode := cic, |
| cellIdentifier := omit, |
| chosenChannel := omit, |
| chosenEncryptionAlgorithm := omit, |
| circuitPool := omit, |
| speechVersion := omit, |
| lSAIdentifier := omit, |
| talkerPriority := omit, |
| aoIPTransportLayer := aoip, |
| speechCodec := speechCodec, |
| codecList := omit, |
| lCLS_BSS_Status := omit, |
| osmuxCID := osmuxCID |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *, |
| template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *, |
| template BSSMAP_IE_Osmo_OsmuxCID osmuxCID := *) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| assignmentComplete := { |
| messageType := '02'O, /* overwritten */ |
| rR_Cause := *, |
| circuitIdentityCode := cic, |
| cellIdentifier := *, |
| chosenChannel := *, |
| chosenEncryptionAlgorithm := *, |
| circuitPool := *, |
| speechVersion := *, |
| lSAIdentifier := *, |
| talkerPriority := *, |
| aoIPTransportLayer := aoip, |
| speechCodec := *, |
| codecList := *, |
| lCLS_BSS_Status := *, |
| osmuxCID := osmuxCID |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_AssignmentFail modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| assignmentFailure := { |
| messageType := '03'O, /* overwritten */ |
| rR_Cause := *, |
| circuitPool := *, |
| circuitPoolList := *, |
| talkerPriority := *, |
| codecList := * |
| } |
| } |
| } |
| } |
| |
| |
| template (value) PDU_BSSAP ts_BSSMAP_ClearCommand(BssmapCause cause) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| clearCommand := { |
| messageType := '20'O, /* overwritten */ |
| layer3HeaderInfo := omit, |
| cause := ts_BSSMAP_IE_Cause(cause), |
| cSFB_Indication := omit |
| } |
| } |
| } |
| } |
| template (value) PDU_BSSAP ts_BSSMAP_ClearCommandCSFB(BssmapCause cause) |
| modifies ts_BSSMAP_ClearCommand := { |
| pdu := { |
| bssmap := { |
| clearCommand := { |
| cSFB_Indication := { |
| elementIdentifier := '8F'O |
| } |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| clearCommand := { |
| messageType := '20'O, /* overwritten */ |
| layer3HeaderInfo := *, |
| cause := ?, |
| cSFB_Indication := * |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_ClearCommandCSFB modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| clearCommand := { |
| messageType := '20'O, /* overwritten */ |
| layer3HeaderInfo := *, |
| cause := ?, |
| cSFB_Indication := { |
| elementIdentifier := '8F'O |
| } |
| } |
| } |
| } |
| } |
| |
| template (value) PDU_BSSAP ts_BSSMAP_ClearComplete |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| clearComplete := { |
| messageType := '21'O /* overwritten */ |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_ClearComplete modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| clearComplete := { |
| messageType := '21'O |
| } |
| } |
| } |
| } |
| |
| template (value) PDU_BSSAP ts_BSSMAP_ClearRequest(BssmapCause cause) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| clearRequest := { |
| messageType := '22'O, /* overwritten */ |
| cause := ts_BSSMAP_IE_Cause(cause) |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| clearRequest := { |
| messageType := '22'O, /* overwritten */ |
| cause := ? |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP ts_BSSMAP_HandoverRequired(BssmapCause cause, |
| template BSSMAP_FIELD_CellIdentificationList cid_list) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverRequired := { |
| messageType := '11'O, |
| cause := ts_BSSMAP_IE_Cause(cause), |
| responseRequest := omit, |
| cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list), |
| circuitPoolList := omit, |
| currentChannelType1 := omit, |
| speechVersion := omit, |
| queueingIndicator := omit, |
| oldToNewBSSInfo := omit, |
| sourceToTargetRNCTransparentInfo := omit, |
| sourceToTargetRNCTransparentInfoCDMA := omit, |
| gERANClassmark := omit, |
| talkerPriority := omit, |
| speechCodec := omit, |
| cSG_Identifier := omit |
| } |
| } |
| } |
| } |
| |
| |
| template PDU_BSSAP tr_BSSMAP_HandoverRequired modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverRequired := { |
| messageType := '11'O |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_HandoverRequiredReject modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverRequiredReject := { |
| messageType := '1A'O |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_HandoverCommand |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverCommand := { |
| messageType := '13'O |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_HandoverSucceeded |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverSucceeded := { |
| messageType := '15'O |
| } |
| } |
| } |
| } |
| |
| template (value) PDU_BSSAP ts_BSSMAP_HandoverCommand(octetstring layer3info) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverCommand := { |
| messageType := '13'O, |
| layer3Information := { |
| elementIdentifier := '17'O, |
| lengthIndicator := 0, |
| layer3info := layer3info |
| }, |
| cellIdentifier := omit, |
| newBSSToOldBSSInfo := omit, |
| talkerPriority := omit |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_HandoverFailure modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverFailure := { |
| messageType := '16'O, |
| cause := ?, |
| rR_Cause := *, |
| circuitPool := *, |
| circuitPoolList := *, |
| gERANClassmark := *, |
| newBSSToOldBSSInfo := *, |
| interSystemInformation := *, |
| talkerPriority := *, |
| codecList := * |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_HandoverRequest modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverRequest := { |
| messageType := '10'O |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP ts_BSSMAP_HandoverRequest( |
| template BSSMAP_IE_CircuitIdentityCode cic := omit, |
| template BSSMAP_IE_AoIP_TransportLayerAddress aoip_tla := omit, |
| template BSSMAP_IE_CellIdentifier cell_id_target := ts_CellID_LAC_CI(1, 0), |
| template BSSMAP_IE_CellIdentifier cell_id_source := ts_CellID_LAC_CI(1, 1) |
| ) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverRequest := { |
| messageType := '10'O, |
| channelType := ts_BSSMAP_IE_ChannelType, |
| encryptionInformation := |
| ts_BSSMAP_IE_EncrInfo('0000000000000000'O,'01'O), |
| classmarkInformationType := { |
| classmarkInformationType1 := { |
| elementIdentifier := '1D'O, |
| rf_PowerCapability := '000'B, |
| a5_1 := '0'B, |
| esind := '0'B, |
| revisionLevel := '10'B, |
| spare1_1 := '0'B |
| } |
| }, |
| cellIdentifierSource := cell_id_source, |
| priority := omit, |
| circuitIdentityCode := cic, |
| downLinkDTX_Flag := omit, |
| cellIdentifierTarget := cell_id_target, |
| interferenceBandToBeUsed := omit, |
| cause := omit, |
| classmarkInformationType3 := omit, |
| currentChannelType1 := omit, |
| speechVersion := omit, |
| groupCallReference := omit, |
| talkerFlag := omit, |
| configurationEvolutionIndication := omit, |
| chosenEncryptionAlgorithm := omit, |
| oldToNewBSSInfo := omit, |
| lSAInformation := omit, |
| lSAAccessControlSuppression := omit, |
| serviceHandover := omit, |
| iMSI_bssmap := omit, |
| sourceToTargetRNCTransparentInfo := omit, |
| sourceToTargetRNCTransparentInfoCDMA := omit, |
| sNAAccessInformation := omit, |
| talkerPriority := omit, |
| aoIPTransportLayer := aoip_tla, |
| codecList := omit, |
| callIdentifier := omit, |
| kC128 := omit, |
| globalCallReference := omit, |
| lCLS_Configuration := omit, |
| connectionStatusControl := omit |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_HandoverRequestAcknowledge(template octetstring layer3info) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverRequestAck := { |
| messageType := '12'O, |
| layer3Information := { |
| elementIdentifier := '17'O, |
| lengthIndicator := ?, |
| layer3info := layer3info |
| } |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP ts_BSSMAP_HandoverRequestAcknowledge( |
| template octetstring layer3info, |
| template LIN1 layer3infoLength, |
| template BSSMAP_IE_AoIP_TransportLayerAddress aoIPTransportLayer := omit, |
| template BSSMAP_IE_SpeechCodec speechCodec := omit, |
| template BSSMAP_IE_ChosenChannel chosenChannel := omit, |
| template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := omit) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverRequestAck := { |
| messageType := '12'O, |
| layer3Information := { |
| elementIdentifier := '17'O, |
| lengthIndicator := layer3infoLength, |
| layer3info := layer3info |
| }, |
| chosenChannel := chosenChannel, |
| chosenEncryptionAlgorithm := chosenEncryptionAlgorithm, |
| circuitPool := omit, |
| speechVersion := omit, |
| circuitIdentityCode := omit, |
| lSAIdentifier := omit, |
| newBSSToOldBSSInfo := omit, |
| interSystemInformation := omit, |
| talkerPriority := omit, |
| aoIPTransportLayer := aoIPTransportLayer, |
| codecList := omit, |
| speechCodec := speechCodec, |
| lCLS_bSS_Status := omit |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_HandoverDetect |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverDetect := { |
| messageType := '1B'O, |
| talkerPriority := * |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP ts_BSSMAP_HandoverDetect |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverDetect := { |
| messageType := '1B'O, |
| talkerPriority := omit |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_HandoverComplete |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverComplete := { |
| messageType := '14'O, |
| rR_Cause := *, |
| talkerPriority := *, |
| speechCodec := *, |
| codecList := *, |
| chosenEncryptionAlgorithm := *, |
| chosenChannel := *, |
| lCLS_BSS_Status := * |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP ts_BSSMAP_HandoverComplete |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverComplete := { |
| messageType := '14'O, |
| rR_Cause := omit, |
| talkerPriority := omit, |
| speechCodec := omit, |
| codecList := omit, |
| chosenEncryptionAlgorithm := omit, |
| chosenChannel := omit, |
| lCLS_BSS_Status := omit |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_HandoverPerformed |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| handoverPerformed := { |
| messageType := '17'O, |
| cause := ?, |
| cellIdentifier := ?, |
| chosenChannel := *, |
| chosenEncryptionAlgorithm := *, |
| speechVersion := *, |
| lSAIdentifier := *, |
| talkerPriority := *, |
| codecList := *, |
| speechCodec := *, |
| lCLS_BSS_Status := * |
| } |
| } |
| } |
| } |
| |
| template BSSMAP_IE_IMSI ts_BSSMAP_Imsi(hexstring imsi_digits) := { |
| elementIdentifier := '08'O, |
| lengthIndicator := 0, /* overwritten */ |
| typeOfIdentity := '001'B, /* IMSI */ |
| oddEvenIndicator := f_hex_is_odd_length(imsi_digits), |
| digits := imsi_digits |
| } |
| |
| template BSSMAP_IE_IMSI tr_BSSMAP_Imsi(template hexstring imsi_digits) := { |
| elementIdentifier := '08'O, |
| lengthIndicator := ?, /* overwritten */ |
| typeOfIdentity := '001'B, /* IMSI */ |
| oddEvenIndicator := ?, |
| digits := imsi_digits |
| } |
| |
| template BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := { |
| cIl_noCell := ''O |
| } |
| template (value) BSSMAP_FIELD_CellIdentificationList ts_BSSMAP_CIL_BSS := { |
| cIl_allInBSS := ''O |
| } |
| template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_BSS := { |
| cIl_allInBSS := ''O |
| } |
| |
| template (value) BSSMAP_FIELD_CellIdentificationList |
| ts_BSSMAP_CIL_CGI(template (value) BSSMAP_FIELD_CellIdentificationList_CGI cgil) := { |
| cIl_CGI := cgil |
| } |
| template BSSMAP_FIELD_CellIdentificationList |
| tr_BSSMAP_CIL_CGI(template BSSMAP_FIELD_CellIdentificationList_CGI cgil) := { |
| cIl_CGI := cgil |
| } |
| |
| template (value) BSSMAP_FIELD_CellIdentificationList |
| ts_BSSMAP_CIL_LAC_CI(template (value) BSSMAP_FIELD_CellIdentificationList_LAC_CI lac_cil) := { |
| cIl_LAC_CI := lac_cil |
| } |
| template BSSMAP_FIELD_CellIdentificationList |
| tr_BSSMAP_CIL_LAC_CI(template BSSMAP_FIELD_CellIdentificationList_LAC_CI lac_cil) := { |
| cIl_LAC_CI := lac_cil |
| } |
| |
| template (value) BSSMAP_FIELD_CellIdentificationList |
| ts_BSSMAP_CIL_CI(template (value) RecordOfOCT2 cil) := { |
| cIl_CI := cil |
| } |
| template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_CI(template RecordOfOCT2 cil) := { |
| cIl_CI := cil |
| } |
| |
| template (value) BSSMAP_FIELD_CellIdentificationList |
| ts_BSSMAP_CIL_LAI(template (value) BSSMAP_FIELD_CellIdentificationList_LAI lail) := { |
| cIl_LAI := lail |
| } |
| template BSSMAP_FIELD_CellIdentificationList |
| tr_BSSMAP_CIL_LAI(template BSSMAP_FIELD_CellIdentificationList_LAI lail) := { |
| cIl_LAI := lail |
| } |
| |
| template (value) BSSMAP_FIELD_CellIdentificationList |
| ts_BSSMAP_CIL_LAC(template (value) RecordOfOCT2 lacl) := { |
| cIl_LAC := lacl |
| } |
| template BSSMAP_FIELD_CellIdentificationList tr_BSSMAP_CIL_LAC(template RecordOfOCT2 lacl) := { |
| cIl_LAC := lacl |
| } |
| |
| |
| private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 { |
| if (lengthof(mnc) == 2) { |
| return hex2oct(mcc[1] & mcc[0] & 'F'H & mcc[2] & mnc[1] & mnc[0]); |
| } else { |
| return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]); |
| } |
| } |
| |
| template (value) BSSMAP_FIELD_CellIdentification_CGI ts_BSSMAP_CI_CGI(GsmMcc mcc, GsmMnc mnc, GsmLac lac, GsmCellId ci) := { |
| mcc_mnc := f_enc_mcc_mnc(mcc, mnc), |
| lac := int2oct(lac, 2), |
| ci := int2oct(ci, 2) |
| } |
| |
| template (value) BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := { |
| lac := int2oct(lac, 2), |
| ci := int2oct(ci, 2) |
| } |
| |
| template (value) BSSMAP_FIELD_CellIdentification_LAI ts_BSSMAP_CI_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := { |
| mcc_mnc := f_enc_mcc_mnc(mcc, mnc), |
| lac := int2oct(lac, 2) |
| } |
| |
| template (value) OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 2); |
| template (value) OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2); |
| |
| template (value) BSSMAP_FIELD_CellIdentification_PLMN_LAC_RNC |
| ts_BSSMAP_CI_PLMN_LAC_RNC(GsmMcc mcc, GsmMnc mnc, GsmLac lac, uint16_t rnc_id) := { |
| mcc_mnc := f_enc_mcc_mnc(mcc, mnc), |
| lac := int2oct(lac, 2), |
| rncId := int2oct(rnc_id, 2) |
| } |
| |
| template (value) BSSMAP_FIELD_CellIdentification_LAC_RNC ts_BSSMAP_CI_LAC_RNC(GsmLac lac, uint16_t rnc_id) := { |
| lac := int2oct(lac, 2), |
| rncId := int2oct(rnc_id, 2) |
| } |
| |
| template BSSMAP_IE_ChannelNeeded ts_BSSMAP_IE_ChanNeeded(BIT2 chneed) := { |
| elementIdentifier := '24'O, |
| channel := chneed, |
| spare := '000000'B |
| } |
| |
| template BSSMAP_IE_TMSI ts_BSSMAP_IE_TMSI(OCT4 tmsi) := { |
| elementIdentifier := '09'O, |
| lengthIndicator := 4, |
| tmsiOctets := tmsi |
| }; |
| |
| template BSSMAP_IE_TMSI tr_BSSMAP_IE_TMSI(template OCT4 tmsi) := { |
| elementIdentifier := '09'O, |
| lengthIndicator := 4, |
| tmsiOctets := tmsi |
| }; |
| |
| private function f_tmsi_or_omit(template OCT4 tmsi) return template BSSMAP_IE_TMSI { |
| var template BSSMAP_IE_TMSI ret; |
| if (ispresent(tmsi)) { |
| ret := ts_BSSMAP_IE_TMSI(valueof(tmsi)); |
| } else { |
| ret := omit; |
| } |
| return ret; |
| } |
| |
| template PDU_BSSAP ts_BSSMAP_Paging(hexstring imsi_digits, |
| template BSSMAP_FIELD_CellIdentificationList cid_list, |
| template OCT4 tmsi := omit, |
| template BSSMAP_IE_ChannelNeeded chneed := omit) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| paging := { |
| messageType := '52'O, |
| iMSI := ts_BSSMAP_Imsi(imsi_digits), |
| tMSI := f_tmsi_or_omit(tmsi), |
| cellIdentifierList := ts_BSSMAP_IE_CidList(cid_list), |
| channelNeeded := chneed, |
| eMLPP_Priority := omit, |
| pagingInformation := omit /* only VGCS/VBS flag */ |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_Paging(template hexstring imsi_digits := ?, |
| template OCT4 tmsi := *, |
| template BSSMAP_IE_ChannelNeeded chneed := *) |
| modifies tr_BSSAP_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 */ |
| } |
| } |
| } |
| } |
| |
| |
| template PDU_BSSAP ts_BSSMAP_CipherModeCmd(OCT1 alg, OCT8 key) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| cipherModeCommand := { |
| messageType := '53'O, |
| layer3HeaderInfo := omit, |
| encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg), |
| cipherResponseMode := omit, |
| kC128 := omit |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP ts_BSSMAP_CipherModeCmdKc128(OCT1 alg, OCT8 key, OCT16 kc128) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| cipherModeCommand := { |
| messageType := '53'O, |
| layer3HeaderInfo := omit, |
| encryptionInformation := ts_BSSMAP_IE_EncrInfo(key, alg), |
| cipherResponseMode := omit, |
| kC128 := { '83'O, kc128 } |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_CipherModeCmd(template OCT1 alg, template OCT8 key) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| cipherModeCommand := { |
| messageType := '53'O, |
| layer3HeaderInfo := *, |
| encryptionInformation := tr_BSSMAP_IE_EncrInfo(key, alg), |
| cipherResponseMode := *, |
| kC128 := * |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP ts_BSSMAP_CipherModeCompl(OCT1 alg) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| cipherModeComplete := { |
| messageType := '55'O, |
| layer3MessageContents := omit, |
| chosenEncryptionAlgorithm := { |
| elementIdentifier := '2C'O, |
| algorithmIdentifier := alg |
| } |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP ts_BSSMAP_CipherModeComplAlg(template BSSMAP_IE_ChosenEncryptionAlgorithm chosenEncryptionAlgorithm := ?) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| cipherModeComplete := { |
| messageType := '55'O, |
| layer3MessageContents := omit, |
| chosenEncryptionAlgorithm := chosenEncryptionAlgorithm |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_CipherModeCompl(template OCT1 alg := ?) modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| cipherModeComplete := { |
| messageType := '55'O, |
| layer3MessageContents := *, |
| chosenEncryptionAlgorithm := { |
| elementIdentifier := '2C'O, |
| algorithmIdentifier := alg |
| } |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_CipherModeRej modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| cipherModeReject := { |
| messageType := '59'O, |
| cause := ? |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_ClassmarkReq modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| classmarkRequest := { |
| messageType := '58'O, |
| talkerPriority := * |
| } |
| } |
| } |
| } |
| |
| template BSSMAP_IE_ClassmarkInformationType2 ts_CM2_default := { |
| elementIdentifier := '12'O, |
| lengthIndicator := 0, /* overwritten */ |
| /* CM1 */ |
| rf_PowerCapability := '010'B, /* class3 */ |
| a5_1 := '0'B, /* supported */ |
| esind := '1'B, /* early classmark supported */ |
| revisionLevel := '10'B, /* R99 */ |
| spare1_1 := '0'B, |
| /* CM2 */ |
| fc := '1'B, /* E-GSM support */ |
| vgcs := '0'B, |
| vbs := '0'B, |
| sm_Capability := '1'B, |
| ss_ScreenIndicator := '00'B, |
| ps_Capability := '1'B, |
| spare2_1 := '0'B, |
| classmarkInformationType2_oct5 := { |
| a5_2 := '0'B, /* not available */ |
| a5_3 := '1'B, /* available */ |
| cmsp := '0'B, /* not supported */ |
| solsa := '0'B, /* not suported */ |
| ucs2 := '0'B, /* GSM alphabet preferred */ |
| lcsvacap := '0'B, /* not supported */ |
| spare := '0'B, |
| cm3 := '0'B /* no CM3 */ |
| } |
| } |
| |
| template PDU_BSSAP ts_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := ts_CM2_default, |
| template BSSMAP_IE_ClassmarkInformationType3 cm3 := omit) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| classmarkUpdate := { |
| messageType := '54'O, |
| classmarkInformationType2 := cm2, |
| classmarkInformationType3 := cm3, |
| talkerPriority := omit |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_ClassmarkUpd(template BSSMAP_IE_ClassmarkInformationType2 cm2 := *, |
| template BSSMAP_IE_ClassmarkInformationType3 cm3 := *) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| classmarkUpdate := { |
| messageType := '54'O, |
| classmarkInformationType2 := cm2, |
| classmarkInformationType3 := cm3, |
| talkerPriority := * |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP ts_BSSMAP_ClassmarkRequest |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| classmarkRequest := { |
| messageType := '58'O, |
| talkerPriority := omit |
| } |
| } |
| } |
| } |
| |
| /* return Layer3 octetstring inside BSSAP PDU */ |
| function f_bssap_extract_l3(PDU_BSSAP bssap) return template octetstring { |
| if (ischosen(bssap.pdu.bssmap)) { |
| var PDU_BSSMAP bssmap := bssap.pdu.bssmap; |
| if (ischosen(bssmap.completeLayer3Information)) { |
| return bssmap.completeLayer3Information.layer3Information.layer3info; |
| } else if (ischosen(bssmap.handoverRequestAck)) { |
| return bssmap.handoverRequestAck.layer3Information.layer3info; |
| } else if (ischosen(bssmap.handoverCommand)) { |
| return bssmap.handoverCommand.layer3Information.layer3info; |
| } else if (ischosen(bssmap.uplinkRequest)) { |
| return bssmap.uplinkRequest.layer3Information.layer3info; |
| } else if (ischosen(bssmap.uplinkRequestConfirmation)) { |
| return bssmap.uplinkRequestConfirmation.layer3Information.layer3info; |
| } else if (ischosen(bssmap.uplinkApplicationData)) { |
| return bssmap.uplinkApplicationData.layer3Information.layer3info; |
| } else if (ischosen(bssmap.rerouteCommand)) { |
| return bssmap.rerouteCommand.initialLayer3Information.layer3info; |
| } else { |
| return omit; |
| } |
| } else { |
| return bssap.pdu.dtap; |
| } |
| } |
| |
| /* TS 29.205 B.2.1.9 */ |
| template (value) GlobalCallReferenceValue ts_GCR(octetstring net_id, OCT2 node_id, OCT5 cref_id) := { |
| networkIDLengthIndicator := 0, /* overwritten */ |
| networkID := net_id, |
| nodeIDLengthIndicator := 0, /* overwritten */ |
| nodeID := node_id, |
| callReferenceIDLengthIndicator := 0, /* overwritten */ |
| callReferenceID := cref_id |
| } |
| template GlobalCallReferenceValue tr_GCR(template octetstring net_id, |
| template OCT2 node_id, |
| template OCT5 cref_id) := { |
| networkIDLengthIndicator := ?, |
| networkID := net_id, |
| nodeIDLengthIndicator := ?, |
| nodeID := node_id, |
| callReferenceIDLengthIndicator := ?, |
| callReferenceID := cref_id |
| } |
| |
| /* TS 47.008 3.2.2.115 */ |
| template (value) BSSMAP_IE_GlobalCallReference ts_BSSMAP_IE_GCR(template (value) GlobalCallReferenceValue gcr) := { |
| elementIdentifier := '89'O, |
| lengthIndicator := 0, /* overwritten */ |
| globalCallReferenceValue := gcr |
| } |
| template BSSMAP_IE_GlobalCallReference tr_BSSMAP_IE_GCR(template GlobalCallReferenceValue gcr) := { |
| elementIdentifier := '89'O, |
| lengthIndicator := ?, |
| globalCallReferenceValue := gcr |
| } |
| |
| /* TS 48.008 3.2.2.116 */ |
| const BIT4 LCLS_CFG_both_way := '0000'B; |
| const BIT4 LCLS_CFG_both_way_and_bicast_UL := '0001'B; |
| const BIT4 LCLS_CFG_both_way_and_send_DL := '0010'B; |
| const BIT4 LCLS_CFG_both_way_and_send_DL_block_local_DL := '0011'B; |
| const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL := '0100'B; |
| const BIT4 LCLS_CFG_both_way_and_bicast_UL_send_DL_block_local_DL := '0101'B; |
| |
| template (value) BSSMAP_IE_LCLS_Configuration ts_BSSMAP_IE_LclsCfg(BIT4 cfg_val) := { |
| elementIdentifier := '8A'O, |
| lCLS_ConfigurationValue := cfg_val, |
| spare := '0000'B |
| } |
| template BSSMAP_IE_LCLS_Configuration tr_BSSMAP_IE_LclsCfg(template BIT4 cfg_val) := { |
| elementIdentifier := '8A'O, |
| lCLS_ConfigurationValue := cfg_val, |
| spare := '0000'B |
| } |
| |
| /* TS 48.008 3.2.2.117 */ |
| const BIT4 LCLS_CSC_connect := '0000'B; |
| const BIT4 LCLS_CSC_do_not_connect := '0001'B; |
| const BIT4 LCLS_CSC_release_lcls := '0010'B; |
| const BIT4 LCLS_CSC_bicast_UL_at_handover := '0011'B; |
| const BIT4 LCLS_CSC_bicast_UL_and_recv_DL_at_handover := '0100'B; |
| |
| template (value) BSSMAP_IE_LCLS_ConnectionStatusControl ts_BSSMAP_IE_LclsCsc(BIT4 csc) := { |
| elementIdentifier := '8B'O, |
| lCLS_ConnectionStatusControlValue := csc, |
| spare := '0000'B |
| } |
| template BSSMAP_IE_LCLS_ConnectionStatusControl tr_BSSMAP_IE_LclsCsc(template BIT4 csc) := { |
| elementIdentifier := '8B'O, |
| lCLS_ConnectionStatusControlValue := csc, |
| spare := '0000'B |
| } |
| |
| /* TS 48.008 3.2.2.119 */ |
| const BIT4 LCLS_STS_not_yet_ls := '0000'B; |
| const BIT4 LCLS_STS_not_possible_ls := '0001'B; |
| const BIT4 LCLS_STS_no_longer_ls := '0010'B; |
| const BIT4 LCLS_STS_req_lcls_not_supp := '0011'B; |
| const BIT4 LCLS_STS_locally_switched := '0100'B; |
| |
| template (value) BSSMAP_IE_LCLS_BSS_Status ts_BSSMAP_IE_LclsSts(BIT4 sts) := { |
| elementIdentifier := '8D'O, |
| lCLS_BSS_StatusValue := sts, |
| spare := '0000'B |
| } |
| template BSSMAP_IE_LCLS_BSS_Status tr_BSSMAP_IE_LclsSts(template BIT4 sts) := { |
| elementIdentifier := '8D'O, |
| lCLS_BSS_StatusValue := sts, |
| spare := '0000'B |
| } |
| |
| /* TS 48.008 3.2.1.91 */ |
| template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrl(template (omit) BSSMAP_IE_LCLS_Configuration cfg, |
| template (omit) BSSMAP_IE_LCLS_ConnectionStatusControl csc) modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| lCLS_ConnectControl := { |
| messageType := '74'O, |
| lCLS_Configuration := cfg, |
| lCLS_ConnectionStatusControl := csc |
| } |
| } |
| } |
| } |
| template PDU_BSSAP tr_BSSMAP_LclsConnCtrl(template BSSMAP_IE_LCLS_Configuration cfg, |
| template BSSMAP_IE_LCLS_ConnectionStatusControl csc) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| lCLS_ConnectControl := { |
| messageType := '74'O, |
| lCLS_Configuration := cfg, |
| lCLS_ConnectionStatusControl := csc |
| } |
| } |
| } |
| } |
| |
| /* TS 48.008 3.2.1.92 */ |
| template (value) PDU_BSSAP ts_BSSMAP_LclsConnCtrlAck(template (value) BSSMAP_IE_LCLS_BSS_Status sts) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| lCLS_connectControlAck := { |
| messageType := '75'O, |
| lCLS_BSS_Status := sts |
| } |
| } |
| } |
| } |
| template PDU_BSSAP tr_BSSMAP_LclsConnCtrlAck(template BSSMAP_IE_LCLS_BSS_Status sts) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| lCLS_connectControlAck := { |
| messageType := '75'O, |
| lCLS_BSS_Status := sts |
| } |
| } |
| } |
| } |
| |
| /* TS 48.008 3.2.1.93 */ |
| template (value) PDU_BSSAP ts_BSSMAP_LclsNotification(template (omit) BSSMAP_IE_LCLS_BSS_Status sts, |
| template (omit) BSSMAP_IE_LCLS_BreakRequest brq) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| lCLS_Notification := { |
| messageType := '76'O, |
| lCLS_BSS_Status := sts, |
| lCLS_BreakRequest := brq |
| } |
| } |
| } |
| } |
| template PDU_BSSAP tr_BSSMAP_LclsNotification(template BSSMAP_IE_LCLS_BSS_Status sts, |
| template BSSMAP_IE_LCLS_BreakRequest brq) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| lCLS_Notification := { |
| messageType := '76'O, |
| lCLS_BSS_Status := sts, |
| lCLS_BreakRequest := brq |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_LclsNotificationSts(BIT4 sts) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| lCLS_Notification := { |
| messageType := '76'O, |
| lCLS_BSS_Status := tr_BSSMAP_IE_LclsSts(sts), |
| lCLS_BreakRequest := omit |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP ts_BSSMAP_CommonId(hexstring imsi_digits) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| commonID := { |
| messageType := '2F'O, |
| iMSI := ts_BSSMAP_Imsi(imsi_digits), |
| sNAAccessInformation := omit, |
| selectedPLMNId := omit, |
| lastUsedEUTRANPLMNId := omit |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_CommonId(template hexstring imsi_digits) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| commonID := { |
| messageType := '2F'O, |
| iMSI := tr_BSSMAP_Imsi(imsi_digits), |
| sNAAccessInformation := * |
| } |
| } |
| } |
| } |
| |
| template PDU_BSSAP tr_BSSMAP_SAPInReject(template (present) GsmSapi sapi := ?, |
| template BSSMAP_IE_Cause cause := ?) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| sAPInReject := { |
| messageType := '25'O, |
| dLCI := { |
| elementIdentifier := '18'O, |
| sapiValue := f_tr_SAPI(sapi), |
| spare := ?, |
| c1 := ?, c2 := ? |
| }, |
| cause := cause |
| } |
| } |
| } |
| } |
| |
| private function f_tr_SAPI(template (present) GsmSapi sapi) |
| return template (present) BIT3 { |
| if (istemplatekind(sapi, "?")) { |
| return ?; |
| } else { |
| return int2bit(valueof(sapi), 3); |
| } |
| } |
| |
| template (value) BSSMAP_IE_LocationType ts_BSSMAP_IE_LocationType |
| := { |
| elementIdentifier := '44'O, |
| lengthIndicator := 1, |
| locationInformation := '00'O, |
| positioningMethod := omit |
| } |
| |
| template (value) PDU_BSSAP ts_BSSMAP_Perform_Location_Request(template (omit) BSSMAP_IE_IMSI imsi, |
| template (omit) BSSMAP_IE_CellIdentifier cellIdentifier := omit |
| ) |
| modifies ts_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| performLocationRequest := { |
| messageType := '2B'O, |
| locationType := ts_BSSMAP_IE_LocationType, |
| cellIdentifier := cellIdentifier, |
| classmarkInformationType3 := omit, |
| lCS_ClientType := omit, |
| chosenChannel := omit, |
| lCS_Priority := omit, |
| lCS_QOS := omit, |
| gPS_AssistanceData := omit, |
| aPDU := omit, |
| iMSI := imsi, |
| iMEI := omit, |
| gANSS_LocationType := omit, |
| gANSS_AssistanceData := omit |
| } |
| } |
| } |
| } |
| |
| template (present) BSSMAP_IE_LocationEstimate tr_BSSMAP_IE_LocationEstimate(template (present) octetstring geo_loc := ?) |
| := { |
| elementIdentifier := '45'O, |
| lengthIndicator := ?, |
| geographicLocation := geo_loc |
| } |
| |
| function tr_BSSMAP_LcsCause(template (present) BSSMAP_LcsCause cause) |
| return template (omit) BSSMAP_IE_LCSCause { |
| if (istemplatekind(cause, "omit")) { |
| return omit; |
| } |
| var template BSSMAP_IE_LCSCause ie := { |
| elementIdentifier := '47'O, |
| lengthIndicator := 1, |
| causeValue := int2bit(enum2int(valueof(cause)), 8), |
| diagnosticValue := omit |
| } |
| return ie; |
| } |
| |
| template (present) PDU_BSSAP tr_BSSMAP_Perform_Location_Response( |
| template BSSMAP_IE_LocationEstimate locationEstimate := *, |
| template BSSMAP_IE_PositioningData positioningData := *, |
| template BSSMAP_IE_LCSCause lCS_Cause := * |
| ) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| performLocationResponse := { |
| messageType := '2D'O, |
| locationEstimate := locationEstimate, |
| positioningData := positioningData, |
| decipheringKeys := *, |
| lCS_Cause := lCS_Cause, |
| velocityEstimate := *, |
| gANSS_PositioningData := * |
| } |
| } |
| } |
| } |
| |
| template (present) PDU_BSSAP tr_BSSMAP_Perform_Location_Abort(template (present) BSSMAP_IE_LCSCause lCS_Cause := ?) |
| modifies tr_BSSAP_BSSMAP := { |
| pdu := { |
| bssmap := { |
| performLocationAbort := { |
| messageType := '2E'O, |
| lCS_Cause := lCS_Cause |
| } |
| } |
| } |
| } |
| |
| } with { encode "RAW" }; |