| module SGsAP_Templates { |
| |
| /* Templates for the SGsAP protocol as per 3GPP TS 29.118 |
| * (C) 2018 by Harald Welte <laforg@gnumonks.org> |
| * All rights reserved. |
| * |
| * Released under the terms of the GNU General Public License, Version 2 or |
| * (at your option) any later version. |
| * |
| * SPDX-License-Identifier: GPL-2.0-or-later |
| */ |
| |
| import from SGsAP_Types all; |
| import from GSM_Types all; |
| import from General_Types all; |
| import from Osmocom_Types all; |
| import from MobileL3_CommonIE_Types all; |
| |
| /* 9.4.2 */ |
| template (value) EPS_LocationUpdateType ts_SGsAP_IE_EpsLuType(template (value) EPS_location_update_type lut) := { |
| iEI := '00001010'B, |
| lengthIndicator := 1, |
| locationUpdateType := lut |
| } |
| template EPS_LocationUpdateType tr_SGsAP_IE_EpsLuType(template EPS_location_update_type lut) := { |
| iEI := '00001010'B, |
| lengthIndicator := 1, |
| locationUpdateType := lut |
| } |
| |
| /* 9.4.3 */ |
| template (value) ErroneousMessage ts_SGsAP_IE_ErrMsg(template (value) octetstring err_msg) := { |
| iEI := '00011011'B, |
| lengthIndicator := lengthof(valueof(err_msg)), |
| erroneousMessage := err_msg |
| } |
| template ErroneousMessage tr_SGsAP_IE_ErrMsg(template octetstring err_msg) := { |
| iEI := '00011011'B, |
| lengthIndicator := ?, |
| erroneousMessage := err_msg |
| } |
| |
| |
| /* 9.4.6 */ |
| private function ts_SGsAP_IMSI(hexstring digits) return template (value) IMSI { |
| var template (value) IMSI imsi := { |
| iEI := '00000001'B, |
| lengthIndicator := lengthof(digits)/2 + 1, |
| iMSI := { |
| field1 := '001'B, |
| parity := '0'B, /* even */ |
| digits := digits, |
| fillerDigit := '1111'B /* even */ |
| } |
| } |
| if (lengthof(digits) mod 2 == 1) { |
| /* odd number of digits */ |
| imsi.iMSI.parity := '1'B; |
| imsi.iMSI.fillerDigit := omit; |
| } |
| return imsi; |
| } |
| private function ts_SGsAP_IMSI_omit(template (omit) hexstring digits) return template (omit) IMSI { |
| if (istemplatekind(digits, "omit")) { |
| return omit; |
| } else { |
| return ts_SGsAP_IMSI(valueof(digits)); |
| } |
| } |
| private function tr_SGsAP_IMSI(template hexstring digits) return template IMSI { |
| if (istemplatekind(digits, "omit")) { |
| return omit; |
| } else if (istemplatekind(digits, "*")) { |
| return *; |
| } else if (istemplatekind(digits, "?")) { |
| return ?; |
| } |
| log("tr_SGsAP_IMSI: ", digits); |
| var template IMSI imsi := { |
| iEI := '00000001'B, |
| lengthIndicator := lengthof(digits)/2 + 1, |
| iMSI := { |
| field1 := '001'B, |
| parity := '0'B, /* even */ |
| digits := digits, |
| fillerDigit := '1111'B /* even */ |
| } |
| } |
| if (lengthof(digits) mod 2 == 1) { |
| /* odd number of digits */ |
| /* odd number of digits */ |
| imsi.iMSI.parity := '1'B; |
| imsi.iMSI.fillerDigit := omit; |
| } |
| return imsi; |
| } |
| |
| /* 9.4.7 */ |
| template (value) IMSI_DetachFromEPS_ServiceType ts_SGsAP_IE_DetServiceType(template (value) IMSI_detachFromEPS_serviceType st) := { |
| iEI := '00010000'B, |
| lengthIndicator := 1, |
| serviceType := st |
| } |
| template IMSI_DetachFromEPS_ServiceType tr_SGsAP_IE_DetServiceType(template IMSI_detachFromEPS_serviceType st) := { |
| iEI := '00010000'B, |
| lengthIndicator := 1, |
| serviceType := st |
| } |
| |
| /* 9.4.8 */ |
| template (value) IMSI_DetachFromNonEPS_ServiceType ts_SGsAP_IE_DetNonEpsServiceType(template (value) IMSI_detachFromNonEPS_serviceType st) := { |
| iEI := '00010001'B, |
| lengthIndicator := 1, |
| serviceType := st |
| } |
| template IMSI_DetachFromNonEPS_ServiceType tr_SGsAP_IE_DetNonEpsServiceType(template IMSI_detachFromNonEPS_serviceType st) := { |
| iEI := '00010001'B, |
| lengthIndicator := 1, |
| serviceType := st |
| } |
| |
| /* 9.4.11 */ |
| private function f_enc_mnc_digit3(GsmMnc mnc) return HEX1 { |
| if (lengthof(mnc) == 2) { |
| return 'F'H; |
| } else { |
| return mnc[2]; |
| } |
| } |
| template (value) LocationAreaIdValue ts_SGsAP_LAI(GsmMcc mcc, GsmMnc mnc, GsmLac lac) := { |
| mccDigit1 := mcc[0], |
| mccDigit2 := mcc[1], |
| mccDigit3 := mcc[2], |
| mncDigit3 := f_enc_mnc_digit3(mnc), |
| mncDigit1 := mnc[0], |
| mncDigit2 := mnc[1], |
| lac := int2oct(lac, 2) |
| } |
| template (value) LocationAreaId ts_SGsAP_IE_Lai(template (value) LocationAreaIdValue lai) := { |
| iEI := '00000100'B, |
| lengthIndicator := 5, |
| locationAreaId := lai |
| } |
| template LocationAreaId tr_SGsAP_IE_Lai(template LocationAreaIdValue lai) := { |
| iEI := '00000100'B, |
| lengthIndicator := 5, |
| locationAreaId := lai |
| } |
| function ts_SGsAP_IE_Lai_omit(template (omit) LocationAreaIdValue lai) return template (omit) LocationAreaId { |
| if (istemplatekind(lai, "omit")) { |
| return omit; |
| } else { |
| return ts_SGsAP_IE_Lai(lai); |
| } |
| } |
| function tr_SGsAP_IE_Lai_omit(template LocationAreaIdValue lai) return template LocationAreaId { |
| if (istemplatekind(lai, "omit")) { |
| return omit; |
| } else if (istemplatekind(lai, "*")) { |
| return *; |
| } else { |
| return tr_SGsAP_IE_Lai(lai); |
| } |
| } |
| |
| /* 9.4.21a */ |
| template (value) TrackingAreaIdentityValue ts_SGsAP_TAI(GsmMcc mcc, GsmMnc mnc, uint16_t tac) := { |
| mccDigit1 := mcc[0], |
| mccDigit2 := mcc[1], |
| mccDigit3 := mcc[2], |
| mncDigit3 := f_enc_mnc_digit3(mnc), |
| mncDigit1 := mnc[0], |
| mncDigit2 := mnc[1], |
| tAC := int2oct(tac, 2) |
| } |
| template (value) TrackingAreaIdentity ts_SGsAP_IE_TAI(template (value) TrackingAreaIdentityValue tai) := { |
| iEI := '00100011'B, |
| lengthIndicator := 5, |
| iD := tai |
| } |
| function ts_SGsAP_IE_TAI_omit(template (omit) TrackingAreaIdentityValue tai) |
| return template (omit) TrackingAreaIdentity { |
| if (istemplatekind(tai, "omit")) { |
| return omit; |
| } else { |
| return ts_SGsAP_IE_TAI(tai); |
| } |
| } |
| |
| |
| /* 9.4.12 */ |
| template (value) MM_Information ts_SGsAP_IE_MmInfo(template (value) octetstring mm_info) := { |
| iEI := '00010111'B, |
| lengthIndicator := lengthof(valueof(mm_info)), |
| information := mm_info |
| } |
| template MM_Information tr_SGsAP_IE_MmInfo(template octetstring mm_info) := { |
| iEI := '00010111'B, |
| lengthIndicator := ?, |
| information := mm_info |
| } |
| |
| |
| |
| /* 9.4.13 */ |
| template (value) MME_Name ts_SGsAP_IE_MmeName(template (value) octetstring name) := { |
| iEI := '00001001'B, |
| lengthIndicator := lengthof(valueof(name)), |
| name := name |
| }; |
| template MME_Name tr_SGsAP_IE_MmeName(template octetstring name) := { |
| iEI := '00001001'B, |
| lengthIndicator := ?, |
| name := name |
| }; |
| |
| /* 9.4.14 */ |
| function f_l3_to_sgs_id(MobileIdentityLV l3) return MobileIdentityValue { |
| var OddEvenInd_Identity l3v := l3.mobileIdentityV.oddEvenInd_identity; |
| var MobileIdentityValue ret; |
| ret.typeOfIdentity := l3.mobileIdentityV.typeOfIdentity; |
| if (ischosen(l3v.imei)) { |
| ret.iD.imei.oddevenIndicator := l3v.imei.oddevenIndicator; |
| ret.iD.imei.digits := l3v.imei.digits; |
| } else if (ischosen(l3v.imsi)) { |
| ret.iD.imsi.oddevenIndicator := l3v.imsi.oddevenIndicator; |
| ret.iD.imsi.digits := l3v.imsi.digits; |
| ret.iD.imsi.fillerDigit := l3v.imsi.fillerDigit; |
| } else if (ischosen(l3v.imei_sv)) { |
| ret.iD.imei_sv.oddevenIndicator := l3v.imei_sv.oddevenIndicator; |
| ret.iD.imei_sv.digits := l3v.imei_sv.digits; |
| ret.iD.imei_sv.fillerDigit := l3v.imei_sv.fillerDigit; |
| } else if (ischosen(l3v.tmsi_ptmsi)) { |
| ret.iD.tmsi_ptmsi.oddevenIndicator := l3v.tmsi_ptmsi.oddevenIndicator; |
| ret.iD.tmsi_ptmsi.fillerDigit := l3v.tmsi_ptmsi.fillerDigit; |
| ret.iD.tmsi_ptmsi.octets := l3v.tmsi_ptmsi.octets; |
| } else if (ischosen(l3v.tmgi_and_MBMS_SessionID)) { |
| ret.iD.tmgi_and_MBMS_SessionID.oddevenIndicator := l3v.tmgi_and_MBMS_SessionID.oddevenIndicator; |
| ret.iD.tmgi_and_MBMS_SessionID.mCC_MNCIndicator := l3v.tmgi_and_MBMS_SessionID.mCC_MNCIndicator; |
| ret.iD.tmgi_and_MBMS_SessionID.mBMS_SessionIdentityIndicator := l3v.tmgi_and_MBMS_SessionID.mBMS_SessionIdentityIndicator; |
| ret.iD.tmgi_and_MBMS_SessionID.spare := l3v.tmgi_and_MBMS_SessionID.spare; |
| ret.iD.tmgi_and_MBMS_SessionID.mBMS_ServiceID := l3v.tmgi_and_MBMS_SessionID.mBMS_ServiceID; |
| ret.iD.tmgi_and_MBMS_SessionID.mccDigit1 := l3v.tmgi_and_MBMS_SessionID.mccDigit1; |
| ret.iD.tmgi_and_MBMS_SessionID.mccDigit2 := l3v.tmgi_and_MBMS_SessionID.mccDigit2; |
| ret.iD.tmgi_and_MBMS_SessionID.mccDigit3 := l3v.tmgi_and_MBMS_SessionID.mccDigit3; |
| ret.iD.tmgi_and_MBMS_SessionID.mccDigit3 := l3v.tmgi_and_MBMS_SessionID.mccDigit3; |
| ret.iD.tmgi_and_MBMS_SessionID.mccDigit1 := l3v.tmgi_and_MBMS_SessionID.mccDigit1; |
| ret.iD.tmgi_and_MBMS_SessionID.mccDigit2 := l3v.tmgi_and_MBMS_SessionID.mccDigit2; |
| ret.iD.tmgi_and_MBMS_SessionID.mBMS_SessionIdentity := l3v.tmgi_and_MBMS_SessionID.mBMS_SessionIdentity; |
| } else if (ischosen(l3v.no_identity)) { |
| ret.iD.no_identity.oddevenIndicator := l3v.no_identity.oddevenIndicator; |
| ret.iD.no_identity.fillerDigits := l3v.no_identity.fillerDigits; |
| } |
| return ret; |
| } |
| template MobileIdentity ts_SGsAP_IE_MobileID(template (value) MobileIdentityLV l3_mi) := { |
| iEI := '00001110'B, |
| lengthIndicator := 0, /* overwritten */ |
| iD := f_l3_to_sgs_id(valueof(l3_mi)) |
| } |
| |
| |
| /* 9.4.15 */ |
| template (value) NAS_MessageContainer ts_SGsAP_NasContainer(template (value) octetstring nas_pdu) := { |
| iEI := '00010110'B, |
| lengthIndicator := lengthof(valueof(nas_pdu)), |
| nAS_MessageContainer := nas_pdu |
| } |
| template NAS_MessageContainer tr_SGsAP_NasContainer(template octetstring nas_pdu) := { |
| iEI := '00010110'B, |
| lengthIndicator := ?, |
| nAS_MessageContainer := nas_pdu |
| } |
| |
| /* 9.4.16 */ |
| template (value) RejectCause ts_SGsAP_IE_RejCause(template (value) Reject_Cause cause) := { |
| iEI := '00001111'B, |
| lengthIndicator := 1, |
| cause := cause |
| } |
| template RejectCause tr_SGsAP_IE_RejCause(template Reject_Cause cause) := { |
| iEI := '00001111'B, |
| lengthIndicator := 1, |
| cause := cause |
| } |
| |
| /* 9.4.17 */ |
| template (value) ServiceIndicator ts_SGsAP_ServiceInd(template (value) Service_Indicator si) := { |
| iEI := '00100000'B, |
| lengthIndicator := 1, |
| indicator := si |
| } |
| template ServiceIndicator tr_SGsAP_ServiceInd(template Service_Indicator si) := { |
| iEI := '00100000'B, |
| lengthIndicator := 1, |
| indicator := si |
| } |
| |
| |
| /* 9.4.18 */ |
| template (value) SGsCause ts_SGsAP_IE_SgsCause(template (value) SGs_Cause cause) := { |
| iEI := '00001000'B, |
| lengthIndicator := 1, |
| cause := cause |
| } |
| function tr_SGsAP_IE_SgsCause(template SGs_Cause cause) return template SGsCause { |
| if (istemplatekind(cause, "omit")) { |
| return omit; |
| } else if (istemplatekind(cause, "*")) { |
| return *; |
| } else { |
| var template SGsCause ret := { |
| iEI := '00001000'B, |
| lengthIndicator := 1, |
| cause := cause |
| } |
| return ret; |
| } |
| } |
| |
| /* 9.4.21c */ |
| template (value) UE_EMM_Mode ts_SGsAP_IE_UeEmmMode(template (value) UE_EMM_mode mode) := { |
| iEI := '00100101'B, |
| lengthIndicator := 1, |
| mode := mode |
| } |
| template UE_EMM_Mode tr_SGsAP_IE_UeEmmMode(template UE_EMM_mode mode) := { |
| iEI := '00100101'B, |
| lengthIndicator := 1, |
| mode := mode |
| } |
| |
| |
| /* 9.4.22 */ |
| template (value) VLR_Name ts_SGsAP_IE_VlrName(template (value) octetstring name) := { |
| iEI := '00000010'B, |
| lengthIndicator := lengthof(name), |
| name := name |
| } |
| template VLR_Name tr_SGsAP_IE_VlrName(template octetstring name) := { |
| iEI := '00000010'B, |
| lengthIndicator := ?, |
| name := name |
| } |
| |
| |
| |
| |
| |
| /* 3GPP TS 29.118 Section 8.1 */ |
| template (value) PDU_SGsAP ts_SGsAP_ALERT_ACK(hexstring imsi) := { |
| sGsAP_ALERT_ACK := { |
| messageType := '00001110'B, |
| iMSI := ts_SGsAP_IMSI(imsi) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_ALERT_ACK(template hexstring imsi) := { |
| sGsAP_ALERT_ACK := { |
| messageType := '00001110'B, |
| iMSI := tr_SGsAP_IMSI(imsi) |
| } |
| } |
| |
| /* 3GPP TS 29.118 Section 8.2 */ |
| template PDU_SGsAP ts_SGsAP_ALERT_REJECT(hexstring imsi, |
| template (value) SGs_Cause cause) := { |
| sGsAP_ALERT_REJECT := { |
| messageType := '00001111'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| sGsCause := ts_SGsAP_IE_SgsCause(cause) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_ALERT_REJECT(template hexstring imsi, |
| template SGs_Cause cause := ?) := { |
| sGsAP_ALERT_REJECT := { |
| messageType := '00001111'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| sGsCause := tr_SGsAP_IE_SgsCause(cause) |
| } |
| } |
| |
| /* 3GPP TS 29.118 Section 8.3 */ |
| template (value) PDU_SGsAP ts_SGsAP_ALERT_REQ(hexstring imsi) := { |
| sGsAP_ALERT_REQUEST := { |
| messageType := '00001101'B, |
| iMSI := ts_SGsAP_IMSI(imsi) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_ALERT_REQ(template hexstring imsi) := { |
| sGsAP_ALERT_REQUEST := { |
| messageType := '00001101'B, |
| iMSI := tr_SGsAP_IMSI(imsi) |
| } |
| } |
| |
| /* 3GPP TS 29.118 Section 8.4 */ |
| template (value) PDU_SGsAP ts_SGsAP_DL_UD(hexstring imsi, |
| template (value) octetstring nas_pdu) := { |
| sGsAP_DOWNLINK_UNITDATA := { |
| messageType := '00000111'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| nAS_MessageContainer := ts_SGsAP_NasContainer(nas_pdu) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_DL_UD(template hexstring imsi, template octetstring nas_pdu := ?) := { |
| sGsAP_DOWNLINK_UNITDATA := { |
| messageType := '00000111'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| nAS_MessageContainer := tr_SGsAP_NasContainer(nas_pdu) |
| } |
| } |
| |
| /* 8.5 */ |
| template (value) PDU_SGsAP ts_SGsAP_EPS_DETACH_ACK(hexstring imsi) := { |
| sGsAP_EPS_DETACH_ACK:= { |
| messageType := '00010010'B, |
| iMSI := ts_SGsAP_IMSI(imsi) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_EPS_DETACH_ACK(template hexstring imsi) := { |
| sGsAP_EPS_DETACH_ACK:= { |
| messageType := '00010010'B, |
| iMSI := tr_SGsAP_IMSI(valueof(imsi)) |
| } |
| } |
| |
| /* 8.6 */ |
| template (value) PDU_SGsAP ts_SGsAP_EPS_DETACH_IND(hexstring imsi, |
| template (value) octetstring mme_name, |
| template (value) IMSI_detachFromEPS_serviceType det_serv_typ) := { |
| sGsAP_EPS_DETACH_INDICATION:= { |
| messageType := '00010001'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| mME_Name := ts_SGsAP_IE_MmeName(mme_name), |
| iMSI_DetachFromEPS_ServiceType := ts_SGsAP_IE_DetServiceType(det_serv_typ) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_EPS_DETACH_IND(template hexstring imsi, |
| template octetstring mme_name, |
| template IMSI_detachFromEPS_serviceType det_serv_typ) := { |
| sGsAP_EPS_DETACH_INDICATION:= { |
| messageType := '00010001'B, |
| iMSI := tr_SGsAP_IMSI(valueof(imsi)), |
| mME_Name := tr_SGsAP_IE_MmeName(mme_name), |
| iMSI_DetachFromEPS_ServiceType := tr_SGsAP_IE_DetServiceType(det_serv_typ) |
| } |
| } |
| |
| /* 8.7 */ |
| template (value) PDU_SGsAP ts_SGsAP_IMSI_DETACH_ACK(hexstring imsi) := { |
| sGsAP_IMSI_DETACH_ACK := { |
| messageType := '00010100'B, |
| iMSI := ts_SGsAP_IMSI(imsi) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_IMSI_DETACH_ACK(template hexstring imsi) := { |
| sGsAP_IMSI_DETACH_ACK := { |
| messageType := '00010100'B, |
| iMSI := tr_SGsAP_IMSI(imsi) |
| } |
| } |
| |
| /* 8.8 */ |
| template (value) PDU_SGsAP ts_SGsAP_IMSI_DETACH_IND(hexstring imsi, |
| template (value) octetstring mme_name, |
| template (value) IMSI_detachFromNonEPS_serviceType det_serv_typ) := { |
| sGsAP_IMSI_DETACH_INDICATION := { |
| messageType := '00010011'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| mME_Name := ts_SGsAP_IE_MmeName(mme_name), |
| iMSI_DetachFromNonEPS_ServiceType := ts_SGsAP_IE_DetNonEpsServiceType(det_serv_typ) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_IMSI_DETACH_IND(template hexstring imsi, |
| template octetstring mme_name := ?, |
| template IMSI_detachFromNonEPS_serviceType det_serv_typ := ?) := { |
| sGsAP_IMSI_DETACH_INDICATION := { |
| messageType := '00010011'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| mME_Name := tr_SGsAP_IE_MmeName(mme_name), |
| iMSI_DetachFromNonEPS_ServiceType := tr_SGsAP_IE_DetNonEpsServiceType(det_serv_typ) |
| } |
| } |
| |
| /* 8.9 */ |
| template (value) PDU_SGsAP ts_SGsAP_LU_ACCEPT(hexstring imsi, |
| template (value) LocationAreaIdValue lai, |
| template (value) MobileIdentityLV mobile_id) := { |
| sGsAP_LOCATION_UPDATE_ACCEPT := { |
| messageType := '00001010'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| locationAreaId := ts_SGsAP_IE_Lai(lai), |
| newTMSIorIMSI := ts_SGsAP_IE_MobileID(mobile_id) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_LU_ACCEPT(template hexstring imsi, |
| template LocationAreaIdValue lai := ?) := { |
| sGsAP_LOCATION_UPDATE_ACCEPT := { |
| messageType := '00001010'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| locationAreaId := tr_SGsAP_IE_Lai(lai), |
| newTMSIorIMSI := * |
| } |
| } |
| |
| /* 8.10 */ |
| template (value) PDU_SGsAP ts_SGsAP_LU_REJECT(hexstring imsi, |
| template (value) Reject_Cause rej_cause, |
| template (omit) LocationAreaIdValue lai) := { |
| sGsAP_LOCATION_UPDATE_REJECT := { |
| messageType := '00001011'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| rejectCause := ts_SGsAP_IE_RejCause(rej_cause), |
| locationAreaId := ts_SGsAP_IE_Lai_omit(lai) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_LU_REJECT(template hexstring imsi, |
| template Reject_Cause rej_cause, |
| template LocationAreaIdValue lai) := { |
| sGsAP_LOCATION_UPDATE_REJECT := { |
| messageType := '00001011'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| rejectCause := tr_SGsAP_IE_RejCause(rej_cause), |
| locationAreaId := tr_SGsAP_IE_Lai_omit(lai) |
| } |
| } |
| |
| /* 8.11 */ |
| template (value) PDU_SGsAP ts_SGsAP_LU_REQ(hexstring imsi, |
| template (value) octetstring mme_name, |
| template (value) EPS_location_update_type eps_lu_type, |
| template (value) LocationAreaIdValue new_lai, |
| template (omit) TrackingAreaIdentityValue tAI := omit) := { |
| sGsAP_LOCATION_UPDATE_REQUEST := { |
| messageType := '00001001'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| mME_Name := ts_SGsAP_IE_MmeName(mme_name), |
| ePS_LocationUpdateType := ts_SGsAP_IE_EpsLuType(eps_lu_type), |
| newLocationAreaId := ts_SGsAP_IE_Lai(new_lai), |
| oldLocationAreaId := omit, |
| tMSI_Status := omit, |
| iMEI_SV := omit, |
| tAI := ts_SGsAP_IE_TAI_omit(tAI), |
| eCGI := omit, |
| tMSI_NRI := omit, |
| cS_DomainOperator := omit |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_LU_REQ(template hexstring imsi, |
| template octetstring mme_name := ?, |
| template EPS_location_update_type eps_lu_type := ?, |
| template LocationAreaIdValue new_lai := ?) := { |
| sGsAP_LOCATION_UPDATE_REQUEST := { |
| messageType := '00001001'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| mME_Name := tr_SGsAP_IE_MmeName(mme_name), |
| ePS_LocationUpdateType := tr_SGsAP_IE_EpsLuType(eps_lu_type), |
| newLocationAreaId := tr_SGsAP_IE_Lai_omit(new_lai), |
| oldLocationAreaId := *, |
| tMSI_Status := *, |
| iMEI_SV := *, |
| tAI := *, |
| eCGI := *, |
| tMSI_NRI := *, |
| cS_DomainOperator := * |
| } |
| } |
| |
| /* 8.12 */ |
| template (value) PDU_SGsAP ts_SGsAP_MM_INFO_REQ(hexstring imsi, |
| template (value) octetstring mm_info) := { |
| sGsAP_MM_INFORMATION_REQUEST := { |
| messageType := '00011010'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| mM_Information := ts_SGsAP_IE_MmInfo(mm_info) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_MM_INFO_REQ(template hexstring imsi, |
| template octetstring mm_info :=?) := { |
| sGsAP_MM_INFORMATION_REQUEST := { |
| messageType := '00011010'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| mM_Information := tr_SGsAP_IE_MmInfo(mm_info) |
| } |
| } |
| |
| /* 8.13 */ |
| template (value) PDU_SGsAP ts_SGsAP_PAGING_REJ(hexstring imsi, |
| template (value) SGs_Cause cause) := { |
| sGsAP_PAGING_REJECT := { |
| messageType := '00000010'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| sGsCause := ts_SGsAP_IE_SgsCause(cause) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_PAGING_REJ(template hexstring imsi, |
| template SGs_Cause cause := ?) := { |
| sGsAP_PAGING_REJECT := { |
| messageType := '00000010'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| sGsCause := tr_SGsAP_IE_SgsCause(cause) |
| } |
| } |
| |
| /* 8.14 */ |
| template (value) PDU_SGsAP ts_SGsAP_PAGING_REQ(hexstring imsi, |
| template (value) octetstring vlr_name, |
| template (value) Service_Indicator serv_ind, |
| template (omit) OCT4 tmsi) := |
| { |
| sGsAP_PAGING_REQUEST := { |
| messageType := '00000001'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| vLR_Name := ts_SGsAP_IE_VlrName(vlr_name), |
| serviceIndicator := ts_SGsAP_ServiceInd(serv_ind), |
| tMSI := omit, |
| cLI := omit, |
| locationAreaId := omit, |
| globalCN_Id := omit, |
| sS_Code := omit, |
| lCS_Indicator := omit, |
| lCS_ClientIdentity := omit, |
| channelNeeded := omit, |
| eMLPP_Priority := omit, |
| additionalPagingIndicator := omit |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_PAGING_REQ(template hexstring imsi, |
| template octetstring vlr_name, |
| template Service_Indicator serv_ind, |
| template OCT4 tmsi) := |
| { |
| sGsAP_PAGING_REQUEST := { |
| messageType := '00000001'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| vLR_Name := tr_SGsAP_IE_VlrName(vlr_name), |
| serviceIndicator := tr_SGsAP_ServiceInd(serv_ind), |
| tMSI := *, |
| cLI := *, |
| locationAreaId := *, |
| globalCN_Id := *, |
| sS_Code := *, |
| lCS_Indicator := *, |
| lCS_ClientIdentity := *, |
| channelNeeded := *, |
| eMLPP_Priority := *, |
| additionalPagingIndicator := * |
| } |
| } |
| |
| /* 8.15 */ |
| template (value) PDU_SGsAP ts_SGsAP_RESET_ACK_MME(template (value) octetstring mme_name) := { |
| sGsAP_RESET_ACK := { |
| messageType := '00010110'B, |
| mME_Name := ts_SGsAP_IE_MmeName(mme_name), |
| vLR_Name := omit |
| } |
| } |
| template (value) PDU_SGsAP ts_SGsAP_RESET_ACK_VLR(template (value) octetstring vlr_name) := { |
| sGsAP_RESET_ACK := { |
| messageType := '00010110'B, |
| mME_Name := omit, |
| vLR_Name := ts_SGsAP_IE_VlrName(vlr_name) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_RESET_ACK(template octetstring mme_name, template octetstring vlr_name) := { |
| sGsAP_RESET_ACK := { |
| messageType := '00010110'B, |
| mME_Name := tr_SGsAP_IE_MmeName(mme_name), |
| vLR_Name := tr_SGsAP_IE_VlrName(vlr_name) |
| } |
| } |
| |
| /* 8.16 */ |
| template (value) PDU_SGsAP ts_SGsAP_RESET_IND_MME(template (value) octetstring mme_name) := { |
| sGsAP_RESET_INDICATION := { |
| messageType := '00010101'B, |
| mME_Name := ts_SGsAP_IE_MmeName(mme_name), |
| vLR_Name := omit |
| } |
| } |
| template (value) PDU_SGsAP ts_SGsAP_RESET_IND_VLR(template (value) octetstring vlr_name) := { |
| sGsAP_RESET_INDICATION := { |
| messageType := '00010101'B, |
| mME_Name := omit, |
| vLR_Name := ts_SGsAP_IE_VlrName(vlr_name) |
| } |
| } |
| |
| template PDU_SGsAP tr_SGsAP_RESET_IND_MME(template octetstring mme_name) := { |
| sGsAP_RESET_INDICATION := { |
| messageType := '00010101'B, |
| mME_Name := tr_SGsAP_IE_MmeName(mme_name), |
| vLR_Name := omit |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_RESET_IND_VLR(template octetstring vlr_name) := { |
| sGsAP_RESET_INDICATION := { |
| messageType := '00010101'B, |
| mME_Name := omit, |
| vLR_Name := tr_SGsAP_IE_VlrName(vlr_name) |
| } |
| } |
| |
| /* 8.17 */ |
| template (value) PDU_SGsAP ts_SGsAP_SERVICE_REQ(hexstring imsi, |
| template (value) Service_Indicator serv_ind, |
| template (value) UE_EMM_mode emm_mode) := { |
| sGsAP_SERVICE_REQUEST := { |
| messageType := '00000110'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| serviceIndicator := ts_SGsAP_ServiceInd(serv_ind), |
| iMEI_SV := omit, |
| uE_TimeZone := omit, |
| mobileStationClassmark2 := omit, |
| tAI := omit, |
| eCGI := omit, |
| /* optional, but "the MME shall include this IE." */ |
| uE_EMM_Mode := ts_SGsAP_IE_UeEmmMode(emm_mode) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_SERVICE_REQ(template hexstring imsi, |
| template Service_Indicator serv_ind := ?, |
| template UE_EMM_mode emm_mode := ?) := { |
| sGsAP_SERVICE_REQUEST := { |
| messageType := '00000110'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| serviceIndicator := tr_SGsAP_ServiceInd(serv_ind), |
| iMEI_SV := *, |
| uE_TimeZone := *, |
| mobileStationClassmark2 := *, |
| tAI := *, |
| eCGI := *, |
| /* optional, but "the MME shall include this IE." */ |
| uE_EMM_Mode := tr_SGsAP_IE_UeEmmMode(emm_mode) |
| } |
| } |
| |
| |
| /* 8.18 */ |
| template (value) PDU_SGsAP ts_SGsAP_STATUS(template (omit) hexstring imsi, |
| template (value) SGs_Cause cause, |
| template (value) octetstring err_msg) := { |
| sGsAP_STATUS := { |
| messageType := '00011101'B, |
| iMSI := ts_SGsAP_IMSI_omit(imsi), |
| sGsCause := ts_SGsAP_IE_SgsCause(cause), |
| erroneousMessage := ts_SGsAP_IE_ErrMsg(err_msg) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_STATUS(template hexstring imsi, |
| template SGs_Cause cause, |
| template octetstring err_msg) := { |
| sGsAP_STATUS := { |
| messageType := '00011101'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| sGsCause := tr_SGsAP_IE_SgsCause(cause), |
| erroneousMessage := tr_SGsAP_IE_ErrMsg(err_msg) |
| } |
| } |
| |
| |
| /* 8.19 */ |
| template (value) PDU_SGsAP ts_SGsAP_TMSI_REALL_CMPL(hexstring imsi) := { |
| sGsAP_TMSI_REALLOCATION_COMPLETE := { |
| messageType := '00001100'B, |
| iMSI := ts_SGsAP_IMSI(imsi) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_TMSI_REALL_CMPL(template hexstring imsi) := { |
| sGsAP_TMSI_REALLOCATION_COMPLETE := { |
| messageType := '00001100'B, |
| iMSI := tr_SGsAP_IMSI(imsi) |
| } |
| } |
| |
| /* 8.20 */ |
| template (value) PDU_SGsAP ts_SGsAP_UE_ACT_IND(hexstring imsi) := { |
| sGsAP_UE_ACTIVITY_INDICATION := { |
| messageType := '00010000'B, |
| iMSI := ts_SGsAP_IMSI(imsi) |
| /* Rel 14: Max UE Avail Time */ |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_UE_ACT_IND(template hexstring imsi) := { |
| sGsAP_UE_ACTIVITY_INDICATION := { |
| messageType := '00010000'B, |
| iMSI := tr_SGsAP_IMSI(imsi) |
| /* Rel 14: Max UE Avail Time */ |
| } |
| } |
| |
| /* 8.21 */ |
| template (value) PDU_SGsAP ts_SGsAP_UE_UNREACHABLE(hexstring imsi, |
| template (value) SGs_Cause cause) := { |
| sGsAP_UE_UNREACHABLE := { |
| messageType := '00011111'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| sGsCause := ts_SGsAP_IE_SgsCause(cause) |
| /* Rel 14: Requested Retransmission Time */ |
| /* Rel 14: Additional UE Unreachable indicators */ |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_UE_UNREACHABLE(template hexstring imsi, |
| template SGs_Cause cause := ?) := { |
| sGsAP_UE_UNREACHABLE := { |
| messageType := '00011111'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| sGsCause := tr_SGsAP_IE_SgsCause(cause) |
| /* Rel 14: Requested Retransmission Time */ |
| /* Rel 14: Additional UE Unreachable indicators */ |
| } |
| } |
| |
| /* 8.22 */ |
| template (value) PDU_SGsAP ts_SGsAP_UL_UD(hexstring imsi, |
| template (value) octetstring nas_msg) := { |
| sGsAP_UPLINK_UNITDATA := { |
| messageType := '00001000'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| nAS_MessageContainer := ts_SGsAP_NasContainer(nas_msg), |
| iMEI_SV := omit, |
| uE_TimeZone := omit, |
| mobileStationClassmark2 := omit, |
| tAI := omit, |
| eCGI := omit |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_UL_UD(template hexstring imsi, |
| template octetstring nas_msg := ?) := { |
| sGsAP_UPLINK_UNITDATA := { |
| messageType := '00001000'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| nAS_MessageContainer := tr_SGsAP_NasContainer(nas_msg), |
| iMEI_SV := *, |
| uE_TimeZone := *, |
| mobileStationClassmark2 := *, |
| tAI := *, |
| eCGI := * |
| } |
| } |
| |
| /* 8.23 */ |
| template (value) PDU_SGsAP ts_SGsAP_RELEASE_REQ(hexstring imsi, |
| template (value) SGs_Cause cause) := { |
| sGsAP_RELEASE_REQUEST := { |
| messageType := '00011011'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| sGsCause := ts_SGsAP_IE_SgsCause(cause) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_RELEASE_REQ(template hexstring imsi, |
| template SGs_Cause cause) := { |
| sGsAP_RELEASE_REQUEST := { |
| messageType := '00011011'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| sGsCause := tr_SGsAP_IE_SgsCause(cause) |
| } |
| } |
| |
| /* 8.24 */ |
| template (value) PDU_SGsAP ts_SGsAP_SERVICE_ABORT_REQ(hexstring imsi) := { |
| sGsAP_SERVICE_ABORT_REQUEST := { |
| messageType := '00010111'B, |
| iMSI := ts_SGsAP_IMSI(imsi) |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_SERVICE_ABORT_REQ(template hexstring imsi) := { |
| sGsAP_SERVICE_ABORT_REQUEST := { |
| messageType := '00010111'B, |
| iMSI := tr_SGsAP_IMSI(imsi) |
| } |
| } |
| |
| /* 8.25 */ |
| template (value) PDU_SGsAP ts_SGsAP_MO_CSFB_IND(hexstring imsi) := { |
| sGsAP_MO_CSFB_INDICATION := { |
| messageType := '00011000'B, |
| iMSI := ts_SGsAP_IMSI(imsi), |
| tAI := omit, |
| eCGI := omit |
| } |
| } |
| template PDU_SGsAP tr_SGsAP_MO_CSFB_IND(template hexstring imsi) := { |
| sGsAP_MO_CSFB_INDICATION := { |
| messageType := '00011000'B, |
| iMSI := tr_SGsAP_IMSI(imsi), |
| tAI := *, |
| eCGI := * |
| } |
| } |
| |
| |
| |
| |
| |
| |
| } |