diff options
-rw-r--r-- | deps/Makefile | 2 | ||||
-rw-r--r-- | library/SGsAP_Templates.ttcn | 860 | ||||
-rwxr-xr-x | msc/gen_links.sh | 6 |
3 files changed, 867 insertions, 1 deletions
diff --git a/deps/Makefile b/deps/Makefile index cb9e3592..f2f38bd5 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -40,6 +40,7 @@ ECLIPSEGIT2_REPOS= titan.ProtocolModules.GRE \ titan.ProtocolModules.LLC_v7.1.0 \ titan.ProtocolModules.MobileL3_v13.4.0 \ titan.ProtocolModules.NS_v7.3.0 \ + titan.ProtocolModules.SGsAP_13.2.0 \ titan.ProtocolModules.SNDCP_v7.0.0 \ titan.ProtocolEmulations.SCCP @@ -77,6 +78,7 @@ titan.ProtocolModules.NS_v7.3.0_commit= R.2.A titan.ProtocolModules.RTP_commit= R.5.A titan.ProtocolModules.ROSE_commit= R.1.C titan.ProtocolModules.SCTP_commit= R.2.A +titan.ProtocolModules.SGsAP_13.2.0_commit= 81544cf008378058b95ff20d33f3770fadb7e235 titan.ProtocolModules.SDP_commit= R.14.A titan.ProtocolModules.SMPP_commit= R.2.A-2-gb7aee69 titan.ProtocolModules.SNDCP_v7.0.0_commit= R.2.A diff --git a/library/SGsAP_Templates.ttcn b/library/SGsAP_Templates.ttcn new file mode 100644 index 00000000..aac045ee --- /dev/null +++ b/library/SGsAP_Templates.ttcn @@ -0,0 +1,860 @@ +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. + */ + +import from SGsAP_Types all; +import from GSM_Types all; +import from General_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 *; + } + 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.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) charstring name) := { + iEI := '00001001'B, + lengthIndicator := lengthof(valueof(name)), + name := name +}; +template MME_Name tr_SGsAP_IE_MmeName(template charstring 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) charstring name) := { + iEI := '00000010'B, + lengthIndicator := lengthof(name), + name := name +} +template VLR_Name tr_SGsAP_IE_VlrName(template charstring 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) charstring 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 charstring 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) charstring 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 charstring 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) charstring mme_name, + template (value) EPS_location_update_type eps_lu_type, + template (value) LocationAreaIdValue new_lai) := { + 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 := omit, + eCGI := omit, + tMSI_NRI := omit, + cS_DomainOperator := omit + } +} +template PDU_SGsAP tr_SGsAP_LU_REQ(template hexstring imsi, + template charstring 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) charstring 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 charstring 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) charstring 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) charstring 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 charstring mme_name, template charstring 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) charstring 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) charstring 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(template charstring mme_name, template charstring vlr_name) := { + sGsAP_RESET_INDICATION := { + messageType := '00010101'B, + mME_Name := tr_SGsAP_IE_MmeName(mme_name), + 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 := * + } +} + + + + + + +} diff --git a/msc/gen_links.sh b/msc/gen_links.sh index a191aa59..df646d93 100755 --- a/msc/gen_links.sh +++ b/msc/gen_links.sh @@ -81,6 +81,9 @@ DIR=$BASEDIR/titan.ProtocolModules.SMPP/src FILES="SMPP_EncDec.cc SMPP_Types.ttcn" gen_links $DIR $FILES +DIR=$BASEDIR/titan.ProtocolModules.SGsAP_13.2.0/src +FILES="SGsAP_Types.ttcn" +gen_links $DIR $FILES DIR=../library FILES="General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn MNCC_Types.ttcn MNCC_EncDec.cc MNCC_CodecPort.ttcn mncc.h MNCC_Emulation.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc " @@ -90,7 +93,8 @@ FILES+="BSSMAP_Emulation.ttcn BSSAP_CodecPort.ttcn BSSMAP_Templates.ttcn BSSAP_A FILES+="RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunctDef.cc " FILES+="MGCP_CodecPort.ttcn MGCP_CodecPort_CtrlFunctDef.cc " FILES+="SMPP_CodecPort.ttcn SMPP_CodecPort_CtrlFunct.ttcn SMPP_CodecPort_CtrlFunctDef.cc SMPP_Emulation.ttcn SMPP_Templates.ttcn " -FILES+="SS_Templates.ttcn SCCP_Templates.ttcn USSD_Helpers.ttcn" +FILES+="SS_Templates.ttcn SCCP_Templates.ttcn USSD_Helpers.ttcn " +FILES+="SGsAP_Templates.ttcn " gen_links $DIR $FILES ignore_pp_results |