module BSSMAP_Templates { 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_KC128 ts_BSSMAP_IE_Kc128(OCT16 kc128) := { elementIdentifier := '83'O, kC128_Value := kc128 } 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[0] & mnc[2] & mnc[1]); } 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 */ } } } } } with { encode "RAW" };