module L3_Templates { /* L3 Templates, building on top of MobileL3*_Types from Ericsson. * * (C) 2017 by Harald Welte * 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 MobileL3_Types all; import from MobileL3_CommonIE_Types all; import from MobileL3_MM_Types all; import from MobileL3_RRM_Types all; import from MobileL3_CC_Types all; //import from MobileL3_GMM_SM_Types all; //import from MobileL3_SMS_Types all; type enumerated CmServiceType { CM_TYPE_MO_CALL ('0001'B), CM_TYPE_EMERG_CALL ('0010'B), CM_TYPE_MO_SMS ('0100'B), CM_TYPE_SS_ACT ('1000'B), CM_TYPE_VGCS ('1001'B), CM_TYPE_VBS ('1010'B), CM_TYPE_LCS ('1011'B) } /* send template fro Mobile Identity (TMSI) */ template MobileIdentityLV ts_MI_TMSI_LV(OCT4 tmsi) := { lengthIndicator := 0, /* overwritten */ mobileIdentityV := { typeOfIdentity := '000'B, /* overwritten */ oddEvenInd_identity := { tmsi_ptmsi := { oddevenIndicator := '0'B, fillerDigit := '1111'B, octets := tmsi } } } } private function f_enc_IMSI_L3(hexstring digits) return IMSI_L3 { var IMSI_L3 l3; var integer len := lengthof(digits); if (len rem 2 == 1) { /* modulo remainder */ l3.oddevenIndicator := '1'B; l3.fillerDigit := omit; } else { l3.oddevenIndicator := '0'B; l3.fillerDigit := '1111'B; } l3.digits := digits; return l3; } private function f_enc_IMEI_L3(hexstring digits) return IMEI_L3 { var IMEI_L3 l3; var integer len := lengthof(digits); if (len rem 2 == 1) { /* modulo remainder */ l3.oddevenIndicator := '1'B; } else { l3.oddevenIndicator := '0'B; } l3.digits := digits; return l3; } /* send template fro Mobile Identity (IMSI) */ template (value) MobileIdentityLV ts_MI_IMSI_LV(hexstring imsi_digits) := { lengthIndicator := 0, /* overwritten */ mobileIdentityV := { typeOfIdentity := '000'B, /* overwritten */ oddEvenInd_identity := { imsi := f_enc_IMSI_L3(imsi_digits) } } } /* send template fro Mobile Identity (IMEI) */ template (value) MobileIdentityLV ts_MI_IMEI_LV(hexstring imei_digits) := { lengthIndicator := 0, /* overwritten */ mobileIdentityV := { typeOfIdentity := '000'B, /* overwritten */ oddEvenInd_identity := { imei := f_enc_IMEI_L3(imei_digits) } } } /* Send template for Classmark 2 */ template (value) MobileStationClassmark2_LV ts_CM2 := { lengthIndicator := 0, rf_PowerCapability := '000'B, a5_1 := '0'B, esind := '1'B, revisionLevel := '10'B, spare1_1 := '0'B, mobileStationClassmark2_oct4 := omit, mobileStationClassmark2_oct5 := omit }; /* Send template for CM SERVICE REQUEST */ template (value) PDU_ML3_MS_NW ts_CM_SERV_REQ(CmServiceType serv_type, MobileIdentityLV mi_lv) := { discriminator := '0000'B, /* overwritten */ tiOrSkip := { skipIndicator := '0000'B }, msgs := { mm := { cMServiceRequest := { messageType := '000000'B, /* overwritten */ nsd := '00'B, cm_ServiceType := int2bit(enum2int(serv_type), 4), cipheringKeySequenceNumber := { '000'B, '0'B }, mobileStationClassmark2 := ts_CM2, mobileIdentity := mi_lv, priorityLevel := omit, additionalUpdateParameterTV := omit, deviceProperties := omit } } } } template PDU_ML3_NW_MS tr_MT_simple(template BIT4 discr := ?) := { discriminator := discr, tiOrSkip := { skipIndicator := '0000'B }, msgs := ? } template PDU_ML3_NW_MS tr_CM_SERV_ACC := { discriminator := '0101'B, tiOrSkip := { skipIndicator := '0000'B }, msgs := { mm := { cMServiceAccept := { messageType := '100001'B, nsd := ? } } } } template PDU_ML3_NW_MS tr_CM_SERV_REJ(template OCT1 rej_cause := ?) := { discriminator := '0101'B, tiOrSkip := { skipIndicator := '0000'B }, msgs := { mm := { cMServiceReject := { messageType := '100010'B, nsd := ?, rejectCause := rej_cause, t3246_Value := * } } } } /* Send template for PAGING RESPONSE */ template (value) PDU_ML3_MS_NW ts_PAG_RESP(MobileIdentityLV mi_lv) := { discriminator := '0000'B, /* overwritten */ tiOrSkip := { skipIndicator := '0000'B }, msgs := { rrm := { pagingResponse := { messageType := '00000000'B, /* overwritten */ cipheringKeySequenceNumber := { '000'B, '0'B }, spare1_4 := '0000'B, mobileStationClassmark := ts_CM2, mobileIdentity := mi_lv, additionalUpdateParameters := omit } } } } template (value) PDU_ML3_MS_NW ts_RRM_ModeModifyAck(ChannelDescription2_V desc, ChannelMode_V mode) := { discriminator := '0000'B, /* overwritten */ tiOrSkip := { skipIndicator := '0000'B }, msgs := { rrm := { channelModeModifyAck := { messageType := '00010111'B, channelDescription := desc, channelMode := mode, extendedTSCSet := omit } } } } template (value) PDU_ML3_MS_NW ts_RRM_CiphModeCompl := { discriminator := '0000'B, /* overwritten */ tiOrSkip := { skipIndicator := '0000'B }, msgs := { rrm := { cipheringModeComplete := { messageType := '00110010'B, mobileEquipmentIdentity := omit } } } } template PDU_ML3_MS_NW ts_ML3_MO := { discriminator := '0000'B, tiOrSkip := { skipIndicator := '0000'B }, msgs := ? } template LocationUpdatingType ts_ML3_IE_LuType := { lut := ?, spare1_1 := '0'B, fop := '0'B } template LocationUpdatingType ts_ML3_IE_LuType_Normal modifies ts_ML3_IE_LuType := { lut := '00'B } template LocationUpdatingType ts_ML3_IE_LuType_Periodic modifies ts_ML3_IE_LuType := { lut := '01'B } template LocationUpdatingType ts_ML3_IE_LuType_Attach modifies ts_ML3_IE_LuType := { lut := '10'B } template CipheringKeySequenceNumberV ts_ML3_IE_CKSN(integer cksn) := { keySequence := int2bit(cksn, 3), spare := '0'B } template PDU_ML3_MS_NW ts_ML3_MO_LU_Req(LocationUpdatingType lu_type, LocationAreaIdentification_V lai, MobileIdentityLV mi, MobileStationClassmark1_V cm1) modifies ts_ML3_MO := { msgs := { mm := { locationUpdateRequest := { messageType := '001000'B, nsd := '00'B, /* ? */ locationUpdatingType := lu_type, cipheringKeySequenceNumber := ts_ML3_IE_CKSN(0), locationAreaIdentification := lai, mobileStationClassmark1 := cm1, mobileIdentityLV := mi, classmarkInformationType2_forUMTS := omit, additionalUpdateParameterTV := omit, deviceProperties := omit, mS_NetworkFeatureSupport := omit } } } } template PDU_ML3_MS_NW ts_ML3_MO_TmsiRealloc_Cmpl modifies ts_ML3_MO := { msgs := { mm := { tmsiReallocComplete := { messageType := '011011'B, nsd := '00'B } } } } template PDU_ML3_NW_MS tr_ML3_MT_LU_Acc := { discriminator := '0101'B, tiOrSkip := { skipIndicator := '0000'B }, msgs := { mm := { locationUpdateAccept := { messageType := '000010'B, nsd := '00'B, locationAreaIdentification := ?, mobileIdentityTLV := *, followOnProceed := *, cTS_Permission := *, equivalentPLMNs := *, emergencyNumberList := *, perMS_T3212 := * } } } } template PDU_ML3_NW_MS tr_ML3_MT_LU_Rej(template OCT1 cause := ?) := { discriminator := '0101'B, tiOrSkip := { skipIndicator := '0000'B }, msgs := { mm := { locationUpdateReject := { messageType := '000100'B, nsd := '00'B, rejectCause := cause, t3246_Value := * } } } } template PDU_ML3_NW_MS tr_ML3_MT_MM_ID_Req(template BIT3 id_type := ?) := { discriminator := '0101'B, tiOrSkip := { skipIndicator := '0000'B }, msgs := { mm := { identityRequest := { messageType := '011000'B, nsd := '00'B, identityType := id_type, spare1_5 := ? } } } } template PDU_ML3_MS_NW ts_ML3_MO_MM_ID_Rsp(MobileIdentityLV mi) modifies ts_ML3_MO := { msgs := { mm := { identityResponse := { messageType := '011001'B, nsd := '00'B, mobileIdentityLV := mi, p_TMSI_TypeTV := omit, routingAreaIdentification2TLV := omit, p_TMSISignature2TLV := omit } } } } template PDU_ML3_MS_NW ts_ML3_MO_MM_ID_Rsp_IMSI(hexstring imsi) := ts_ML3_MO_MM_ID_Rsp(valueof(ts_MI_IMSI_LV(imsi))); template PDU_ML3_MS_NW ts_ML3_MO_MM_ID_Rsp_IMEI(hexstring imei) := ts_ML3_MO_MM_ID_Rsp(valueof(ts_MI_IMEI_LV(imei))); template (value) MobileStationClassmark1_V ts_CM1(BIT1 a5_1_unavail := '0'B, BIT2 rev := '10'B) := { rf_PowerCapability := '010'B, a5_1 := a5_1_unavail, esind := '1'B, revisionLevel := rev, spare1_1 := '0'B } template PDU_ML3_MS_NW ts_ML3_MO_MM_IMSI_DET_Ind(MobileIdentityLV mi, template MobileStationClassmark1_V cm1 := ts_CM1) modifies ts_ML3_MO := { msgs := { mm := { imsiDetachIndication := { messageType := '000001'B, nsd := '00'B, mobileStationClassmark1 := cm1, mobileIdentityLV := mi } } } } template PDU_ML3_MS_NW ts_ML3_MO_CC(integer tid) := { discriminator := '0011'B, tiOrSkip := { transactionId := { tio := '000'B, tiFlag := '0'B, tIExtension := omit } } } template (value) CalledPartyBCD_Number ts_Called(hexstring digits) := { elementIdentifier := '5E'O, lengthIndicator := 0, /* overwritten */ numberingPlanIdentification := '0000'B, typeOfNumber := '000'B, /* unknown */ ext1 := '0'B, digits := digits } template (value) BearerCapability_TLV ts_Bcap_voice := { elementIdentifier := '04'O, lengthIndicator := 0, /* overwritten */ octet3 := { informationTransferCapability := '000'B, transferMode := '0'B, codingStandard := '0'B, radioChannelRequirement := '11'B, /* FR preferred */ extension_octet_3 := '0'B, /* overwritten */ speech_aux_3a_3b := omit }, octet4 := omit, octet5 := omit, octet6 := omit, octet7 := omit } template PDU_ML3_MS_NW ts_ML3_MO_CC_SETUP(integer tid, hexstring called, template BearerCapability_TLV bcap := ts_Bcap_voice) := { discriminator := '0011'B, tiOrSkip := { transactionId := { tio := int2bit(tid, 3), tiFlag := '0'B, tIExtension := omit } }, msgs := { cc := { setup_MS_NW := { messageType := '000101'B, nsd := '00'B, bcRepeatIndicator := omit, bearerCapability1 := bcap, bearerCapability2 := omit, facility := omit, callingPartySubAddress := omit, calledPartyBCD_Number := ts_Called(called), calledPartySubAddress := omit, llc_RepeatIndicator := omit, lowLayerCompatibility1 := omit, lowLayerCompatibility2 := omit, hlc_RepeatIndicator := omit, highLayerCompatibility1 := omit, highLayerCompatibility2 := omit, user_user := omit, ss_VersionIndicator := omit, clir_Suppression := omit, clir_Invocation := omit, cC_Capabilities := omit, facility_ccbs1 := omit, facility_ccbs2 := omit, streamIdentifier := omit, supportedCodecs := omit, redial := omit } } } } template PDU_ML3_MS_NW ts_ML3_MO_CC_EMERG_SETUP(integer tid, template BearerCapability_TLV bcap := ts_Bcap_voice) := { discriminator := '0011'B, tiOrSkip := { transactionId := { tio := int2bit(tid, 3), tiFlag := '0'B, tIExtension := omit } }, msgs := { cc := { emergencySetup := { messageType := '001110'B, nsd := '00'B, bearerCapability := bcap, streamIdentifier := omit, supportedCodecs := omit, emergencyCategory := omit } } } } template PDU_ML3_NW_MS tr_ML3_MT_CC_CALL_PROC(integer tid) := { discriminator := '0011'B, tiOrSkip := { transactionId := { tio := int2bit(tid, 3), tiFlag := ?, tIExtension := omit } }, msgs := { cc := { callProceeding := { messageType := '000010'B, nsd := '00'B, repeatIndicator := *, bearerCapability1 := *, bearerCapability2 := *, facility := *, progressIndicator := *, priorityGranted := *, networkCCCapabilities := * } } } } template PDU_ML3_NW_MS tr_ML3_MT_CC_ALERTING(integer tid) := { discriminator := '0011'B, tiOrSkip := { transactionId := { tio := int2bit(tid, 3), tiFlag := ?, tIExtension := omit } }, msgs := { cc := { alerting_NW_MS := { messageType := '000001'B, nsd := '00'B, facility := *, progressIndicator := *, user_user := * } } } } template PDU_ML3_NW_MS tr_ML3_MT_CC_DISC(integer tid) := { discriminator := '0011'B, tiOrSkip := { transactionId := { tio := int2bit(tid, 3), tiFlag := ?, tIExtension := omit } }, msgs := { cc := { disconnect_NW_MS := { messageType := '100101'B, nsd := '00'B, cause := ?, facility := *, progressIndicator := *, user_user := *, allowedActions := * } } } } template PDU_ML3_NW_MS tr_ML3_MT_CC_RELEASE(integer tid) := { discriminator := '0011'B, tiOrSkip := { transactionId := { tio := int2bit(tid, 3), tiFlag := ?, tIExtension := omit } }, msgs := { cc := { release_NW_MS := { messageType := '101101'B, nsd := '00'B, cause := ?, secondCause := *, facility := *, user_user := * } } } } template PDU_ML3_NW_MS tr_ML3_MT_MM_AUTH_REQ(template OCT16 rand := ?) := { discriminator := '0101'B, tiOrSkip := { skipIndicator := '0000'B }, msgs := { mm := { authenticationRequest := { messageType := '010010'B, nsd := '00'B, cipheringKeySequenceNumber := ?, spare2_4 := ?, authenticationParRAND := rand, authenticationParAUTN := * } } } } template (value) PDU_ML3_MS_NW ts_ML3_MT_MM_AUTH_RESP_2G(OCT4 sres) := { discriminator := '0101'B, tiOrSkip := { skipIndicator := '0000'B }, msgs := { mm := { authenticationResponse := { messageType := '010100'B, nsd := '00'B, authenticationParSRES := sres, authenticationParSRESext := omit } } } } template (value) PDU_ML3_MS_NW ts_ML3_MT_MM_AUTH_RESP_3G(OCT4 sres, octetstring res) := { discriminator := '0101'B, tiOrSkip := { skipIndicator := '0000'B }, msgs := { mm := { authenticationResponse := { messageType := '010100'B, nsd := '00'B, authenticationParSRES := sres, authenticationParSRESext := { elementIdentifier := '21'O, lengthIndicator := 0, /* overwritten */ valueField := res } } } } } }