osmo-ttcn3-hacks/library/BSSMAP_Templates.ttcn

774 lines
21 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

module BSSMAP_Templates {
/* BSSMAP Templates, building on top of BSSAP_Types from Ericsson.
*
* (C) 2017 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.
*/
import from General_Types all;
import from Osmocom_Types all;
import from GSM_Types all;
import from BSSAP_Types all;
type integer BssmapCause;
/* 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)" };
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 := omit,
lengthIndicator := ?,
pdu := {
bssmap := ?
}
}
template PDU_BSSAP ts_BSSAP_DTAP := {
discriminator := '1'B,
spare := '0000000'B,
dlci := omit,
lengthIndicator := 0, /* overwritten by codec */
pdu := {
dtap := ?
}
}
template PDU_BSSAP tr_BSSAP_DTAP := {
discriminator := '1'B,
spare := '0000000'B,
dlci := omit,
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 (value) PDU_BSSAP ts_BSSMAP_Reset(BssmapCause cause) modifies ts_BSSAP_BSSMAP := {
pdu := {
bssmap := {
reset := {
messageType := '30'O,
cause := ts_BSSMAP_IE_Cause(cause),
a_InterfaceSelectorForReset := omit
}
}
}
}
template PDU_BSSAP tr_BSSMAP_Reset modifies tr_BSSAP_BSSMAP := {
pdu := {
bssmap := {
reset := {
messageType := '30'O,
cause := ?,
a_InterfaceSelectorForReset := *
}
}
}
}
template (value) PDU_BSSAP ts_BSSMAP_ResetAck modifies ts_BSSAP_BSSMAP := {
pdu := {
bssmap := {
resetAck := {
messageType := '31'O,
a_InterfaceSelectorForReset := omit
}
}
}
}
template PDU_BSSAP tr_BSSMAP_ResetAck modifies tr_BSSAP_BSSMAP := {
pdu := {
bssmap := {
resetAck := {
messageType := '31'O,
a_InterfaceSelectorForReset := *
}
}
}
}
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(mcc, mnc, lac, ci)
modifies ts_BSSMAP_IE_CellID := {
cellIdentification := {
cI_LAC_CGI := {
mnc_mcc := FIXME,
lac := int2oct(lac, 2),
ci := int2oct(ci, 2)
}
}
}
*/
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(BSSMAP_FIELD_CellIdentificationList cid_list) := {
elementIdentifier := '1A'O,
lengthIndicator := 0, /* overwritten */
cellIdentifierDiscriminator := '0000'B, /* overwritten */
spare1_4 := '0000'B,
cellIdentificationList := cid_list
}
template PDU_BSSAP ts_BSSMAP_HandoReq(BssmapCause cause, 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
}
}
}
}
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;
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 := '01'O /* FRv1 */
}
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 (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))
}
template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA(BSSMAP_FIELD_IPAddress addr,
uint16_t udp_port) := {
elementIdentifier := '7C'O,
lengthIndicator := 0, /* 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);
template (value) BSSMAP_IE_AoIP_TransportLayerAddress ts_BSSMAP_IE_AoIP_TLA6(OCT16 ip, uint16_t pt) :=
ts_BSSMAP_IE_AoIP_TLA({ipv6:=ip}, pt);
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 PDU_BSSAP
ts_BSSMAP_AssignmentReq(template BSSMAP_IE_CircuitIdentityCode cic := omit,
template BSSMAP_IE_AoIP_TransportLayerAddress aoip := 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
}
}
}
}
template PDU_BSSAP tr_BSSMAP_AssignmentReq modifies tr_BSSAP_BSSMAP := {
pdu := {
bssmap := {
assignmentRequest := {
messageType :='01'O, /* overwritten */
channelType := ?,
layer3HeaderInfo := *,
priority := *,
circuitIdentityCode := ?,
downLinkDTX_Flag := *,
interferenceBandToBeUsed := *,
classmarkInformationType2 := *,
groupCallReference := *,
talkerFlag := *,
configurationEvolutionIndication := *,
lsaAccesControlSuppression := *,
serviceHandover := *,
encryptionInformation := *,
talkerPriority := *,
aoIPTransportLayer := *,
codecList := *,
callIdentifier := *,
kC128 := *,
globalCallReference := *,
lCLS_Configuration := *,
lCLS_ConnectionStatusControl := *,
lCLS_CorrelationNotNeeded := *
}
}
}
}
template PDU_BSSAP
ts_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := omit,
template BSSMAP_IE_AoIP_TransportLayerAddress aoip := 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 := omit,
codecList := omit,
lCLS_BSS_Status := omit
}
}
}
}
template PDU_BSSAP tr_BSSMAP_AssignmentComplete(template BSSMAP_IE_CircuitIdentityCode cic := *,
template BSSMAP_IE_AoIP_TransportLayerAddress aoip := *)
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 := *
}
}
}
}
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 PDU_BSSAP tr_BSSMAP_ClearCommand modifies tr_BSSAP_BSSMAP := {
pdu := {
bssmap := {
clearCommand := {
messageType := '20'O, /* overwritten */
layer3HeaderInfo := *,
cause := ?,
cSFB_Indication := *
}
}
}
}
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 PDU_BSSAP tr_BSSMAP_ClearRequest modifies tr_BSSAP_BSSMAP := {
pdu := {
bssmap := {
clearRequest := {
messageType := '22'O, /* overwritten */
cause := ?
}
}
}
}
function f_hex_is_odd_length(hexstring digits) return bitstring {
if (lengthof(digits) rem 2 == 1) {
return '1'B;
} else {
return '0'B;
}
}
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_FIELD_CellIdentificationList ts_BSSMAP_CIL_noCell := {
cIl_noCell := ''O
}
private function f_enc_mcc_mnc(GsmMcc mcc, GsmMnc mnc) return OCT3 {
return hex2oct(mcc[1] & mcc[0] & mnc[2] & mcc[2] & mnc[1] & mnc[0]);
}
template 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 BSSMAP_FIELD_CellIdentification_LAC_CI ts_BSSMAP_CI_LAC_CI(GsmLac lac, GsmCellId ci) := {
lac := int2oct(lac, 2),
ci := int2oct(ci, 2)
}
template 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 OCT2 ts_BSSMAP_CI_CI(GsmCellId ci) := int2oct(ci, 2);
template OCT2 ts_BSSMAP_CI_LAC(GsmLac lac) := int2oct(lac, 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
};
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 := '51'O,
iMSI := ts_BSSMAP_Imsi(imsi_digits),
tMSI := f_tmsi_or_omit(tmsi),
cellIdentifierList := ts_BSSMAP_IE_CidList(valueof(cid_list)),
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_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 := ?
}
}
}
}
} with { encode "RAW" };