# -*- coding: UTF-8 -*- #/** # * Software Name : pycrate # * Version : 0.4 # * # * Copyright 2017. Benoit Michau. ANSSI. # * # * This library is free software; you can redistribute it and/or # * modify it under the terms of the GNU Lesser General Public # * License as published by the Free Software Foundation; either # * version 2.1 of the License, or (at your option) any later version. # * # * This library is distributed in the hope that it will be useful, # * but WITHOUT ANY WARRANTY; without even the implied warranty of # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # * Lesser General Public License for more details. # * # * You should have received a copy of the GNU Lesser General Public # * License along with this library; if not, write to the Free Software # * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, # * MA 02110-1301 USA # * # *-------------------------------------------------------- # * File Name : pycrate_corenet/ProcCNS1ap.py # * Created : 2017-11-28 # * Authors : Benoit Michau # *-------------------------------------------------------- #*/ __all__ = [ 'S1APSigProc', 'S1APNonUESigProc', # 'S1APERABSetup', 'S1APERABModify', 'S1APERABRelease', 'S1APERABModificationInd', 'S1APInitialContextSetup', 'S1APUEContextReleaseRequest', 'S1APUEContextRelease', 'S1APUEContextModification', 'S1APUERadioCapabilityMatch', 'S1APUEContextModificationInd', 'S1APUEContextSuspend', 'S1APUEContextResume', 'S1APConnectionEstablishmentInd', 'S1APHandoverPreparation', 'S1APHandoverResourceAllocation', 'S1APHandoverNotification', 'S1APPathSwitchRequest', 'S1APHandoverCancel', 'S1APENBStatusTransfer', 'S1APMMEStatusTransfer', 'S1APPaging', 'S1APInitialUEMessage', 'S1APDownlinkNASTransport', 'S1APUplinkNASTransport', 'S1APNASNonDeliveryInd', 'S1APRerouteNASRequest', 'S1APResetCN', 'S1APResetENB', 'S1APErrorIndNonUECN', 'S1APErrorIndNonUEENB', 'S1APErrorIndCN', 'S1APErrorIndENB', 'S1APS1Setup', 'S1APENBConfigUpdate', 'S1APMMEConfigUpdate', 'S1APOverloadStart', 'S1APOverloadStop', 'S1APDownlinkS1CDMA2000Tunnelling', 'S1APUplinkS1CDMA2000Tunnelling', 'S1APUECapabilityInfoInd', 'S1APTraceStart', 'S1APTraceFailureInd', 'S1APDeactivateTrace', 'S1APCellTrafficTrace', 'S1APLocationReportingControl', 'S1APLocationReportFailure', 'S1APLocationReport', 'S1APWriteReplaceWarning', 'S1APKill', 'S1APPWSRestartInd', 'S1APPWSFailureInd', 'S1APENBDirectInfoTransfer', 'S1APMMEDirectInfoTransfer', 'S1APENBConfigTransfer', 'S1APMMEConfigTransfer', 'S1APDownlinkUELPPaTransport', 'S1APUplinkUELPPaTransport', 'S1APDownlinkNonUELPPaTransport', 'S1APUplinkNonUELPPaTransport', # 'S1APProcEnbDispatcher', 'S1APProcCnDispatcher', 'S1APNonUEProcEnbDispatcher', 'S1APNonUEProcCnDispatcher' ] from .utils import * from .ProcProto import * #------------------------------------------------------------------------------# # S1AP signalling procedure # TS 36.413, version d30 # Core Network side #------------------------------------------------------------------------------# class S1APSigProc(LinkSigProc): """S1AP UE-associated signalling procedure handler instance attributes: - Name : procedure name - S1 : reference to the S1d instance running this procedure - ENB : reference to the ENBd instance connected by S1 - Server: reference to the CorenetServer instance handling the eNB - UE : reference to the UEd instance connected by S1 - Desc : ASN.1 procedure description - Code : procedure code - Crit : procedure criticality - Cont : ASN.1 procedure PDU(s) content - Encod : custom PDU encoders with fixed values - Decod : custom PDU decoders with transform functions """ TRACK_PDU = True # for UE-related signalling UE = None def __init__(self, s1d): # self.Name = self.__class__.__name__ self.S1 = s1d self.ENB = s1d.ENB self.Server = s1d.ENB.Server if s1d.UE: self.UE = s1d.UE else: self._log('WNG', 'no UEd instance attached') # # to store PDU traces self._pdu = [] # list of PDU to be sent to the eNB self._pdu_tx = [] # enable NAS procedure to set callback to .postprocess() before self terminates self._cb = None # self._log('DBG', 'instantiating procedure') def _log(self, logtype, msg): self.S1._log(logtype, '[%s] %s' % (self.Name, msg)) def _recv(self, pdu): if self.TRACK_PDU: self._pdu.append( (time(), 'UL', pdu) ) self.errcause, self.UEInfo = None, {} try: self.decode_pdu(pdu, self.UEInfo) except Exception as err: self._err = err self._log('ERR', 'decode_pdu (%s), sending error indication' % err) self.errcause = ('protocol', 'abstract-syntax-error-reject') def recv(self, pdu): self._recv(pdu) self._log('ERR', 'recv() not implemented') def _send(self): if self.TRACK_PDU: for pdu in self._pdu_tx: self._pdu.append( (time(), 'DL', pdu) ) return self._pdu_tx def send(self): self._log('ERR', 'send() not implemented') return self._send() def trigger(self): return [] def abort(self): if self.Code in self.S1.Proc: del self.S1.Proc[self.Code] self._log('INF', 'aborting') class S1APNonUESigProc(LinkSigProc): """S1AP non-UE-associated signalling procedure handler instance attributes: - Name : procedure name - ENB : reference to the ENBd instance connected by S1 - Server: reference to the CorenetServer instance handling the eNB - Desc : ASN.1 procedure description - Code : procedure code - Crit : procedure criticality - Cont : ASN.1 procedure PDU(s) content - Encod : custom PDU encoders with fixed values - Decod : custom PDU decoders with transform functions """ TRACK_PDU = True def __init__(self, enbd): # self.Name = self.__class__.__name__ self.ENB = enbd self.Server = enbd.Server # # to store PDU traces self._pdu = [] # list of PDU to be sent to the HNB self._pdu_tx = [] # self._log('DBG', 'instantiating procedure') def _log(self, logtype, msg): self.ENB._log(logtype, '[%s] %s' % (self.Name, msg)) def _recv(self, pdu): if self.TRACK_PDU: self._pdu.append( (time(), 'UL', pdu) ) self.errcause, self.ENBInfo = None, {} try: self.decode_pdu(pdu, self.ENBInfo) except Exception as err: self._err = err self._log('ERR', 'decode_pdu (%s), sending error indication' % err) self.errcause = ('protocol', 'abstract-syntax-error-reject') def recv(self, pdu): self._recv(pdu) self._log('ERR', 'recv() not implemented') def _send(self): if self.TRACK_PDU: for pdu in self._pdu_tx: self._pdu.append( (time(), 'DL', pdu) ) return self._pdu_tx def send(self): self._log('ERR', 'send() not implemented') return self._send() def trigger(self): return [] def abort(self): if self.Code in self.ENB.Proc: del self.ENB.Proc[self.Code] self._log('INF', 'aborting') #------------------------------------------------------------------------------# # E-RAB Management procedures # TS 36.413, section 8.2 #------------------------------------------------------------------------------# class S1APERABSetup(S1APSigProc): """E-RAB Setup: TS 36.413, section 8.2.1 CN-initiated request-response UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 16: E_RABToBeSetupListBearerSUReq (M) - 66: UEAggregateMaximumBitrate (O) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 28: E_RABSetupListBearerSURes (O) - 29: E_RABList (O) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.e_RABSetup # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } class S1APERABModify(S1APSigProc): """E-RAB Modify: TS 36.413, section 8.2.2 CN-initiated request-response UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 30: E_RABToBeModifiedListBearerModReq (M) - 66: UEAggregateMaximumBitrate (O) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 31: E_RABModifyListBearerModRes (O) - 32: E_RABList (O) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.e_RABModify # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } class S1APERABRelease(S1APSigProc): """E-RAB Release: TS 36.413, section 8.2.3 CN-initiated request-response UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 26: NAS_PDU (O) - 33: E_RABList (M) - 66: UEAggregateMaximumBitrate (O) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 34: E_RABList (O) - 58: CriticalityDiagnostics (O) - 69: E_RABReleaseListBearerRelComp (O) - 189: UserLocationInformation (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.e_RABRelease # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } class S1APERABModificationInd(S1APSigProc): """E-RAB Modification Indication: TS 36.413, section 8.2.4 eNB-initiated request-response UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 176: TunnelInformation (O) - 199: E_RABToBeModifiedListBearerModInd (M) - 201: E_RABNotToBeModifiedListBearerModInd (O) - 226: CSGMembershipInfo (O) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 58: CriticalityDiagnostics (O) - 146: CSGMembershipStatus (O) - 203: E_RABModifyListBearerModConf (O) - 205: E_RABList (O) - 210: E_RABList (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.e_RABModificationIndication # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } #------------------------------------------------------------------------------# # Context Management procedures # TS 36.413, section 8.3 #------------------------------------------------------------------------------# class S1APInitialContextSetup(S1APSigProc): """Initial Context Setup: TS 36.413, section 8.3.1 CN-initiated request-response UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 24: E_RABToBeSetupListCtxtSUReq (M) - 25: TraceActivation (O) - 41: HandoverRestrictionList (O) - 66: UEAggregateMaximumBitrate (M) - 73: SecurityKey (M) - 74: UERadioCapability (O) - 75: GUMMEI (O) - 106: SubscriberProfileIDforRFP (O) - 107: UESecurityCapabilities (M) - 108: CSFallbackIndicator (O) - 124: SRVCCOperationPossible (O) - 146: CSGMembershipStatus (O) - 158: MME_UE_S1AP_ID (O) - 159: LAI (O) - 165: ManagementBasedMDTAllowed (O) - 177: MDTPLMNList (O) - 187: AdditionalCSFallbackIndicator (C) - 192: Masked_IMEISV (O) - 195: ProSeAuthorized (O) - 196: ExpectedUEBehaviour (O) - 241: UEUserPlaneCIoTSupportIndicator (O) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 48: E_RABList (O) - 51: E_RABSetupListCtxtSURes (M) - 58: CriticalityDiagnostics (O) UnsuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 2: Cause (M) - 8: ENB_UE_S1AP_ID (M) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.initialContextSetup # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } def send(self): self._enable_gtpu() return self._send() def _enable_gtpu(self): if hasattr(self, '_gtp_add_mobile_ebi'): for erab in self._gtp_add_mobile_ebi: pdncfg = self.S1.ESM.PDN[erab] rabcfg = pdncfg['RAB'] pdncfg['state'] = 1 self.UE.Server.GTPUd.add_mobile( rabcfg['SGW-GTP-TEID'], # teid_ul pdncfg['PDNAddr'], # mobile_addr (rabcfg['SGW-TLA'], rabcfg['ENB-TLA']), # local gtpu addr, enb gtpu ip (maybe None) rabcfg['ENB-GTP-TEID']) # teid_dl (maybe None) else: self._log('WNG', 'enable_gtpu: no GTP mobile info provided') def _disable_gtpu(self): if hasattr(self, '_gtp_rem_mobile_ebi'): for erab in self._gtp_rem_mobile_ebi: if erab in self.S1.ESM.PDN: pdncfg = self.S1.ESM.PDN[erab] self.Server.GTPUd.rem_mobile(pdncfg['RAB']['SGW-GTP-TEID']) pdncfg['state'] = 0 else: self._log('WNG', 'disable_gtpu: no GTP mobile info provided') def recv(self, pdu): self._recv(pdu) try: del self.S1.Proc[self.Code] except Exception: pass # if self.errcause: self._log('WNG', 'error in the response decoding') self.success = False if hasattr(self, '_gtp_add_mobile_ebi'): self._gtp_rem_mobile_ebi = self._gtp_add_mobile_ebi self._disable_gtpu() # elif pdu[0] == 'unsuccessfulOutcome': try: self._log('WNG', 'failure, rejected with cause %r' % (self.UEInfo['Cause'], )) except Exception: self._log('WNG', 'failure, rejected without cause') self.success = False if hasattr(self, '_gtp_add_mobile_ebi'): self._gtp_rem_mobile_ebi = self._gtp_add_mobile_ebi self._disable_gtpu() # else: self.success = True # E-RAB successfully established, to be completed with eNB IP and TEID for erabsetupitem in self.UEInfo['E_RABSetupListCtxtSURes']: erabsetupitem = erabsetupitem['value'][1] erab = erabsetupitem['e-RAB-ID'] if erab in self._gtp_add_mobile_ebi: rabcfg = self.S1.ESM.PDN[erab]['RAB'] rabcfg['ENB-TLA'] = inet_ntoa(uint_to_bytes(*erabsetupitem['transportLayerAddress'])) rabcfg['ENB-GTP-TEID'] = bytes_to_uint(erabsetupitem['gTP-TEID'], 32) # activate the DL parameters self.Server.GTPUd.set_mobile_dl( rabcfg['SGW-GTP-TEID'], # teid_ul ran_ip=(rabcfg['SGW-TLA'], rabcfg['ENB-TLA']), teid_dl=rabcfg['ENB-GTP-TEID']) # E-RAB failed to established if 'E_RABList' in self.UEInfo: self._gtp_rem_mobile_ebi = [] for erabitem in self.UEInfo['E_RABList']: erabitem = erabitem['value'][1] erab = erabitem['e-RAB-ID'] if erab in self._gtp_add_mobile_ebi: self._gtp_rem_mobile_ebi.append(erab) self._log('INF', 'unable to establish E-RAB %i, cause %r'\ % (erab, erabitem['cause'])) self._disable_gtpu() def abort(self): S1APSigProc.abort(self) if hasattr(self, '_gtp_add_mobile_ebi'): self._gtp_rem_mobile_ebi = self._gtp_add_mobile_ebi self._disable_gtpu() class S1APUEContextReleaseRequest(S1APSigProc): """UE Context Release Request (eNB initiated): TS 36.413, section 8.3.2 eNB-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 2: Cause (M) - 8: ENB_UE_S1AP_ID (M) - 164: GWContextReleaseIndication (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.uEContextReleaseRequest # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } recv = S1APSigProc._recv def trigger(self): # copy the cause signaled by the eNB Proc = self.S1.init_s1ap_proc(S1APUEContextRelease, Cause=self.UEInfo['Cause'], UE_S1AP_IDs=('uE-S1AP-ID-pair', {'mME-UE-S1AP-ID': self.S1.CtxId, 'eNB-UE-S1AP-ID': self.S1.CtxId})) if Proc: return [Proc] else: return [] class S1APUEContextRelease(S1APSigProc): """UE Context Release (MME initiated): TS 36.413, section 8.3.3 CN-initiated request UE-associated signalling procedure InitiatingMessage: IEs: - 2: Cause (M) - 99: UE_S1AP_IDs (M) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 58: CriticalityDiagnostics (O) - 189: UserLocationInformation (O) - 212: CellIdentifierAndCELevelForCECapableUEs (O) - 213: InformationOnRecommendedCellsAndENBsForPaging (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.uEContextRelease # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } send = S1APSigProc._send def _release_s1(self): # suspend all RAB self.S1.ESM.pdn_suspend() # update mobility state if self.S1.EMM.state != 'INACTIVE': self.S1.EMM.state = 'IDLE' self._log('INF', 'UE disconnected, cause %r' % (self._NetInfo['Cause'], )) # # disconnect the S1 interface to the eNB for the UE self.S1.unset_ran() self.S1.unset_ctx() def recv(self, pdu): # recv the S1APUEContextRelease response self._recv(pdu) # remove from the S1AP procedure stack try: del self.S1.Proc[self.Code] except Exception: pass self._release_s1() def abort(self): # remove from the S1AP procedure stack try: del self.S1.Proc[self.Code] except Exception: pass self._log('INF', 'aborting') self._release_s1() class S1APUEContextModification(S1APSigProc): """UE Context Modification: TS 36.413, section 8.3.4 CN-initiated request-response UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 66: UEAggregateMaximumBitrate (O) - 73: SecurityKey (O) - 106: SubscriberProfileIDforRFP (O) - 107: UESecurityCapabilities (O) - 108: CSFallbackIndicator (O) - 146: CSGMembershipStatus (O) - 159: LAI (O) - 187: AdditionalCSFallbackIndicator (C) - 195: ProSeAuthorized (O) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 58: CriticalityDiagnostics (O) UnsuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 2: Cause (M) - 8: ENB_UE_S1AP_ID (M) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.uEContextModification # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } class S1APUERadioCapabilityMatch(S1APSigProc): """UE Radio Capability Match: TS 36.413, section 8.3.5 CN-initiated request-response UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 74: UERadioCapability (O) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 58: CriticalityDiagnostics (O) - 169: VoiceSupportMatchIndicator (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.uERadioCapabilityMatch # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } class S1APUEContextModificationInd(S1APSigProc): """UE Context Modification Indication: TS 36.413, section 8.3.6 eNB-initiated request-response UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 226: CSGMembershipInfo (O) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 58: CriticalityDiagnostics (O) - 146: CSGMembershipStatus (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.uEContextModificationIndication # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } class S1APUEContextSuspend(S1APNonUESigProc): """UE Context Suspend: TS 36.413, section 8.3.7 eNB-initiated request-response non-UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 212: CellIdentifierAndCELevelForCECapableUEs (O) - 213: InformationOnRecommendedCellsAndENBsForPaging (O) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.uEContextSuspend # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } class S1APUEContextResume(S1APNonUESigProc): """UE Context Resume: TS 36.413, section 8.3.8 eNB-initiated request-response non-UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 235: E_RABFailedToResumeListResumeReq (O) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 58: CriticalityDiagnostics (O) - 237: E_RABFailedToResumeListResumeRes (O) UnsuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 2: Cause (M) - 8: ENB_UE_S1AP_ID (M) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.uEContextResume # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } class S1APConnectionEstablishmentInd(S1APSigProc): """Connection Establishment Indication: TS 36.413, section 8.3.9 CN-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 74: UERadioCapability (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.connectionEstablishmentIndication # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } #------------------------------------------------------------------------------# # Handover Signalling # TS 36.413, section 8.4 #------------------------------------------------------------------------------# class S1APHandoverPreparation(S1APNonUESigProc): """Handover Preparation: TS 36.413, section 8.4.1 eNB-initiated request-response non-UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 1: HandoverType (M) - 2: Cause (M) - 4: TargetID (M) - 8: ENB_UE_S1AP_ID (M) - 79: Direct_Forwarding_Path_Availability (O) - 104: Source_ToTarget_TransparentContainer (M) - 125: SRVCCHOIndication (O) - 127: CSG_Id (O) - 132: MSClassmark2 (C) - 133: MSClassmark3 (C) - 138: Source_ToTarget_TransparentContainer (O) - 145: CellAccessMode (O) - 150: PS_ServiceNotAvailable (O) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 1: HandoverType (M) - 8: ENB_UE_S1AP_ID (M) - 12: E_RABSubjecttoDataForwardingList (O) - 13: E_RABList (O) - 58: CriticalityDiagnostics (O) - 123: Target_ToSource_TransparentContainer (M) - 135: NASSecurityParametersfromE_UTRAN (C) - 139: Target_ToSource_TransparentContainer (O) UnsuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 2: Cause (M) - 8: ENB_UE_S1AP_ID (M) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.handoverPreparation # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } class S1APHandoverResourceAllocation(S1APNonUESigProc): """Handover Resource Allocation: TS 36.413, section 8.4.2 CN-initiated request-response non-UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 1: HandoverType (M) - 2: Cause (M) - 25: TraceActivation (O) - 40: SecurityContext (M) - 41: HandoverRestrictionList (O) - 53: E_RABToBeSetupListHOReq (M) - 66: UEAggregateMaximumBitrate (M) - 75: GUMMEI (O) - 98: RequestType (O) - 104: Source_ToTarget_TransparentContainer (M) - 107: UESecurityCapabilities (M) - 124: SRVCCOperationPossible (O) - 127: CSG_Id (O) - 136: NASSecurityParameterstoE_UTRAN (C) - 146: CSGMembershipStatus (O) - 158: MME_UE_S1AP_ID (O) - 165: ManagementBasedMDTAllowed (O) - 177: MDTPLMNList (O) - 192: Masked_IMEISV (O) - 195: ProSeAuthorized (O) - 196: ExpectedUEBehaviour (O) - 241: UEUserPlaneCIoTSupportIndicator (O) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 18: E_RABAdmittedList (M) - 19: E_RABFailedtoSetupListHOReqAck (O) - 58: CriticalityDiagnostics (O) - 123: Target_ToSource_TransparentContainer (M) - 127: CSG_Id (O) - 145: CellAccessMode (O) UnsuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 2: Cause (M) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.handoverResourceAllocation # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } class S1APHandoverNotification(S1APNonUESigProc): """Handover Notification: TS 36.413, section 8.4.3 eNB-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 67: TAI (M) - 100: EUTRAN_CGI (M) - 176: TunnelInformation (O) - 186: LHN_ID (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.handoverNotification # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } class S1APPathSwitchRequest(S1APNonUESigProc): """Path Switch Request: TS 36.413, section 8.4.4 eNB-initiated request-response non-UE-associated signalling procedure InitiatingMessage: IEs: - 8: ENB_UE_S1AP_ID (M) - 22: E_RABToBeSwitchedDLList (M) - 67: TAI (M) - 88: MME_UE_S1AP_ID (M) - 100: EUTRAN_CGI (M) - 107: UESecurityCapabilities (M) - 127: CSG_Id (O) - 145: CellAccessMode (O) - 146: CSGMembershipStatus (O) - 157: GUMMEI (O) - 176: TunnelInformation (O) - 186: LHN_ID (O) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 33: E_RABList (O) - 40: SecurityContext (M) - 58: CriticalityDiagnostics (O) - 66: UEAggregateMaximumBitrate (O) - 95: E_RABToBeSwitchedULList (O) - 146: CSGMembershipStatus (O) - 158: MME_UE_S1AP_ID (O) - 195: ProSeAuthorized (O) - 241: UEUserPlaneCIoTSupportIndicator (O) UnsuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 2: Cause (M) - 8: ENB_UE_S1AP_ID (M) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.pathSwitchRequest # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } class S1APHandoverCancel(S1APSigProc): """Handover Cancellation: TS 36.413, section 8.4.5 eNB-initiated request-response UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 2: Cause (M) - 8: ENB_UE_S1AP_ID (M) SuccessfulOutcome: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.handoverCancel # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } class S1APENBStatusTransfer(S1APNonUESigProc): """eNB Status Transfer: TS 36.413, section 8.4.6 eNB-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 90: ENB_StatusTransfer_TransparentContainer (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.eNBStatusTransfer # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } class S1APMMEStatusTransfer(S1APNonUESigProc): """MME Status Transfer: TS 36.413, section 8.4.7 CN-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 90: ENB_StatusTransfer_TransparentContainer (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.mMEStatusTransfer # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } #------------------------------------------------------------------------------# # Paging # TS 36.413, section 8.5 #------------------------------------------------------------------------------# class S1APPaging(S1APNonUESigProc): """Paging: TS 36.413, section 8.5 CN-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 43: UEPagingID (M) - 44: PagingDRX (O) - 46: TAIList (M) - 80: UEIdentityIndexValue (M) - 109: CNDomain (M) - 128: CSG_IdList (O) - 151: PagingPriority (O) - 198: UERadioCapabilityForPaging (O) - 211: AssistanceDataForPaging (O) - 227: Paging_eDRXInformation (O) - 231: Extended_UEIdentityIndexValue (O) - 239: NB_IoT_Paging_eDRXInformation (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.paging # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } send = S1APNonUESigProc._send #------------------------------------------------------------------------------# # NAS transport # TS 36.413, section 8.6 #------------------------------------------------------------------------------# class S1APInitialUEMessage(S1APSigProc): """Initial UE Message: TS 36.413, section 8.6.2.1 eNB-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 8: ENB_UE_S1AP_ID (M) - 26: NAS_PDU (M) - 67: TAI (M) - 75: GUMMEI (O) - 96: S_TMSI (O) - 100: EUTRAN_CGI (M) - 127: CSG_Id (O) - 134: RRC_Establishment_Cause (M) - 145: CellAccessMode (O) - 155: TransportLayerAddress (O) - 160: RelayNode_Indicator (O) - 170: GUMMEIType (O) - 176: TunnelInformation (O) - 184: TransportLayerAddress (O) - 186: LHN_ID (O) - 223: MME_Group_ID (O) - 230: UE_Usage_Type (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.initialUEMessage # Custom decoders Decod = { 'ini': ({ 'TAI' : lambda x: (plmn_buf_to_str(x['pLMNidentity']), bytes_to_uint(x['tAC'], 16)), 'EUTRAN_CGI': lambda x: (plmn_buf_to_str(x['pLMNidentity']), cellid_bstr_to_str(x['cell-ID'])) }, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } def recv(self, pdu_rx): self._recv(pdu_rx) if not self.errcause: # verification against ENBd parameters and S1AP infos: err = False if self.UEInfo['EUTRAN_CGI'][0] != self.ENB.ID[0] or \ self.UEInfo['EUTRAN_CGI'][1][:5] != self.ENB.ID[1][:5]: self._log('WNG', 'invalid EUTRAN-CGI %s.%s' % self.UEInfo['EUTRAN_CGI']) err = True if self.UEInfo['TAI'] not in self.ENB.Config['TAIs']: self._log('WNG', 'invalid TAI, %s.%.4x' % self.UEInfo['TAI']) err = True if err: self.errcause = ('protocol', 'message-not-compatible-with-receiver-state') # if not self.errcause: self.S1.EMM.state = 'ACTIVE' self._log('INF', 'RRC establishment cause: %s' % self.UEInfo['RRC_Establishment_Cause']) self.UE.set_tai(*self.UEInfo['TAI']) self._ret = self.S1.process_nas(self.UEInfo['NAS_PDU']) def trigger(self): return self._ret class S1APDownlinkNASTransport(S1APSigProc): """Downlink NAS Transport: TS 36.413, section 8.6.2.2 CN-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 26: NAS_PDU (M) - 41: HandoverRestrictionList (O) - 74: UERadioCapability (O) - 106: SubscriberProfileIDforRFP (O) - 124: SRVCCOperationPossible (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.downlinkNASTransport # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } send = S1APSigProc._send class S1APUplinkNASTransport(S1APSigProc): """Uplink NAS Transport: TS 36.413, section 8.6.2.3 eNB-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 26: NAS_PDU (M) - 67: TAI (M) - 100: EUTRAN_CGI (M) - 155: TransportLayerAddress (O) - 184: TransportLayerAddress (O) - 186: LHN_ID (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.uplinkNASTransport # Custom decoders Decod = { 'ini': ({ 'TAI' : lambda x: (plmn_buf_to_str(x['pLMNidentity']), bytes_to_uint(x['tAC'], 16)), 'EUTRAN_CGI': lambda x: (plmn_buf_to_str(x['pLMNidentity']), cellid_bstr_to_str(x['cell-ID'])) }, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } def recv(self, pdu_rx): self._recv(pdu_rx) if not self.errcause: # verification against ENBd parameters and S1AP infos: err = False if self.UEInfo['EUTRAN_CGI'][0] != self.ENB.ID[0] or \ self.UEInfo['EUTRAN_CGI'][1][:5] != self.ENB.ID[1][:5]: self._log('WNG', 'invalid EUTRAN-CGI %s.%s' % self.UEInfo['EUTRAN_CGI']) err = True if self.UEInfo['TAI'] not in self.ENB.Config['TAIs']: self._log('WNG', 'invalid TAI, %s.%.4x' % self.UEInfo['TAI']) err = True if err: self.errcause = ('protocol', 'message-not-compatible-with-receiver-state') # if not self.errcause: self._ret = self.S1.process_nas(self.UEInfo['NAS_PDU']) def trigger(self): return self._ret class S1APNASNonDeliveryInd(S1APSigProc): """NAS Non Delivery Indication: TS 36.413, section 8.6.2.4 eNB-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 2: Cause (M) - 8: ENB_UE_S1AP_ID (M) - 26: NAS_PDU (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.nASNonDeliveryIndication # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } class S1APRerouteNASRequest(S1APSigProc): """Reroute NAS Request: TS 36.413, section 8.6.2.5 CN-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (O) - 8: ENB_UE_S1AP_ID (M) - 223: MME_Group_ID (M) - 224: Additional_GUTI (O) - 225: [OCTET STRING] (M) - 230: UE_Usage_Type (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.rerouteNASRequest # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } #------------------------------------------------------------------------------# # Management procedures # TS 36.413, section 8.7 #------------------------------------------------------------------------------# class S1APResetCN(S1APNonUESigProc): """Reset: TS 36.413, section 8.7.1 and 8.7.1.2.1 CN-initiated request-response non-UE-associated signalling procedure InitiatingMessage: IEs: - 2: Cause (M) - 92: ResetType (M) SuccessfulOutcome: IEs: - 58: CriticalityDiagnostics (O) - 93: UE_associatedLogicalS1_ConnectionListResAck (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.reset # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } send = S1APNonUESigProc._send def recv(self, pdu): self._recv(pdu) try: del self.ENB.Proc[self.Code] except Exception: pass if not self.errcause: self._log('INF', 'success') class S1APResetENB(S1APNonUESigProc): """Reset: TS 36.413, section 8.7.1 and 8.7.1.2.2 eNB-initiated request-response non-UE-associated signalling procedure InitiatingMessage: IEs: - 2: Cause (M) - 92: ResetType (M) SuccessfulOutcome: IEs: - 58: CriticalityDiagnostics (O) - 93: UE_associatedLogicalS1_ConnectionListResAck (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.reset # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } def recv(self, pdu): self._recv(pdu) if not self.errcause: if self.ENBInfo['ResetType'][0] == 's1-Interface': # reset all resources self._log('INF', 'complete s1 interface, cause %r' % (self.ENBInfo['Cause'], )) for ue in self.ENB.UE.values(): ue.S1.unset_ran() ue.S1.unset_ctx() # prepare the reset response self.encode_pdu('suc') else: # reset only listed resources self._log('INF', 'part of s1 interface, cause %r' % (self.ENBInfo['Cause'], )) # get the list of enb-ue-id to reset ue_res_list, ue_ack_list = self.ENBInfo['ResetType'][1], [] for res in ue_res_list: if res['id'] == 91 and res['Value'][0] == 'UE-associatedLogicalS1-ConnectionItem': conitem = res['Value'][1] if 'eNB-UE-S1AP-ID' in conitem: uectx = conitem['eNB-UE-S1AP-ID'] elif 'mME-UE-S1AP-ID' in conitem: uectx = conitem['mME-UE-S1AP-ID'] else: uectx = None if uectx is not None: if uectx in self.ENB.UE: ue = self.ENB.UE[enbid] ue.S1.unset_ran() ue.S1.unset_ctx() ue_ack_list.append(res) # prepare the reset response self.encode_pdu('suc', E_associatedLogicalS1_ConnectionListResAck=ue_ack_list) send = S1APNonUESigProc._send class S1APErrorIndNonUECN(S1APNonUESigProc): """Error Indication: TS 36.413, section 8.7.2 CN-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (O) - 2: Cause (O) - 8: ENB_UE_S1AP_ID (O) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.errorIndication # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } errcause = None def recv(self, pdu): if self.TRACK_PDU: self._pdu.append( (time(), 'UL', pdu) ) send = S1APNonUESigProc._send class S1APErrorIndNonUEENB(S1APNonUESigProc): """Error Indication: TS 36.413, section 8.7.2 eNB-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (O) - 2: Cause (O) - 8: ENB_UE_S1AP_ID (O) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.errorIndication # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } def recv(self, pdu): self._recv(pdu) if not self.errcause and 'Cause' in self.ENBInfo: self._log('WNG', 'error ind received: %r' % (self.ENBInfo['Cause'], )) # if it corresponds to an said-unknown UE ID, disconnect the UE instance if self.ENBInfo['Cause'] == ('radioNetwork', 'unknown-enb-ue-s1ap-id') \ and 'MME_UE_S1AP_ID' in self.ENBInfo \ and self.ENBInfo['MME_UE_S1AP_ID'] in self.ENB.UE: ue = self.ENB.UE[self.ENBInfo['MME_UE_S1AP_ID']] if ue.S1.is_connected(): self._log('INF', 'UE %s to be disconnected' % ue.IMSI) ue.S1.unset_ran() # if it corresponds to a previously CN-initiated class 1 procedure # abort it try: self.ENB.Proc[self.ENB.ProcLast].abort() except Exception: pass class S1APErrorIndCN(S1APSigProc): """Error Indication: TS 36.413, section 8.7.2 CN-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (O) - 2: Cause (O) - 8: ENB_UE_S1AP_ID (O) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.errorIndication # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } errcause = None def recv(self, pdu): if self.TRACK_PDU: self._pdu.append( (time(), 'UL', pdu) ) send = S1APSigProc._send class S1APErrorIndENB(S1APSigProc): """Error Indication: TS 36.413, section 8.7.2 eNB-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (O) - 2: Cause (O) - 8: ENB_UE_S1AP_ID (O) - 58: CriticalityDiagnostics (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.errorIndication # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } def recv(self, pdu): self._recv(pdu) if not self.errcause: self._log('WNG', 'error ind received: %s.%i' % self.UEInfo['Cause']) # if it corresponds to a previously CN-initiated class 1 procedure # abort it try: self.S1.Proc[self.S1.ProcLast].abort() except Exception: pass class S1APS1Setup(S1APNonUESigProc): """S1 Setup: TS 36.413, section 8.7.3 eNB-initiated request-response non-UE-associated signalling procedure InitiatingMessage: IEs: - 59: Global_ENB_ID (M) - 60: ENBname (O) - 64: SupportedTAs (M) - 128: CSG_IdList (O) - 137: PagingDRX (M) - 228: UE_RetentionInformation (O) - 234: NB_IoT_DefaultPagingDRX (O) SuccessfulOutcome: IEs: - 58: CriticalityDiagnostics (O) - 61: MMEname (O) - 87: RelativeMMECapacity (M) - 105: ServedGUMMEIs (M) - 163: MMERelaySupportIndicator (O) - 228: UE_RetentionInformation (O) UnsuccessfulOutcome: IEs: - 2: Cause (M) - 58: CriticalityDiagnostics (O) - 65: TimeToWait (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.s1Setup # Custom decoders Decod = { 'ini': ({ 'Global_ENB_ID': globenbid_to_hum, 'SupportedTAs': supptas_to_hum, }, {}), 'suc': ({}, {}), 'uns': ({}, {}) } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } def recv(self, pdu): # recv the S1SetupRequest self._recv(pdu) if self.errcause: # procedure unsuccessful outcome self.encode_pdu('uns', Cause=self.errcause) self._log('INF', 'eNB S1 not setup successfully') else: self.ENB.Config = cpdict(self.ENBInfo) self.ENB.Config['TAIs'] = [] for tas in self.ENBInfo['SupportedTAs']: for plmn in tas['broadcastPLMNs']: if plmn == self.Server.PLMN or \ self.Server.EQUIV_PLMN and plmn in self.Server.EQUIV_PLMN: # supported PLMN by Corenet self.ENB.Config['TAIs'].append( (plmn, tas['tAC']) ) self.ENB.ID = (self.ENBInfo['Global_ENB_ID']['pLMNidentity'], self.ENBInfo['Global_ENB_ID']['eNB-ID'][1]) # prepare the S1SetupResponse IEs = self.ENB.get_s1setup_ies_from_cfg() self.encode_pdu('suc', **IEs) self._log('INF', 'eNB S1 setup successfully') send = S1APNonUESigProc._send class S1APENBConfigUpdate(S1APNonUESigProc): """eNB Configuration Update: TS 36.413, section 8.7.4 eNB-initiated request-response non-UE-associated signalling procedure InitiatingMessage: IEs: - 60: ENBname (O) - 64: SupportedTAs (O) - 128: CSG_IdList (O) - 137: PagingDRX (O) - 234: NB_IoT_DefaultPagingDRX (O) SuccessfulOutcome: IEs: - 58: CriticalityDiagnostics (O) UnsuccessfulOutcome: IEs: - 2: Cause (M) - 58: CriticalityDiagnostics (O) - 65: TimeToWait (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.eNBConfigurationUpdate # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } class S1APMMEConfigUpdate(S1APNonUESigProc): """MME Configuration Update: TS 36.413, section 8.7.5 CN-initiated request-response non-UE-associated signalling procedure InitiatingMessage: IEs: - 61: MMEname (O) - 87: RelativeMMECapacity (O) - 105: ServedGUMMEIs (O) SuccessfulOutcome: IEs: - 58: CriticalityDiagnostics (O) UnsuccessfulOutcome: IEs: - 2: Cause (M) - 58: CriticalityDiagnostics (O) - 65: TimeToWait (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.mMEConfigurationUpdate # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': ({}, {}) } class S1APOverloadStart(S1APNonUESigProc): """Overload Start: TS 36.413, section 8.7.6 CN-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 101: OverloadResponse (M) - 154: GUMMEIList (O) - 161: TrafficLoadReductionIndication (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.overloadStart # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } class S1APOverloadStop(S1APNonUESigProc): """Overload Stop: TS 36.413, section 8.7.7 CN-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 154: GUMMEIList (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.overloadStop # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } #------------------------------------------------------------------------------# # S1 CDMA2000 Tunnelling Procedures # TS 36.413, section 8.8 #------------------------------------------------------------------------------# class S1APDownlinkS1CDMA2000Tunnelling(S1APSigProc): """Downlink S1 CDMA2000 Tunnelling: TS 36.413, section 8.8.2.1 CN-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 12: E_RABSubjecttoDataForwardingList (O) - 70: Cdma2000PDU (M) - 71: Cdma2000RATType (M) - 83: Cdma2000HOStatus (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.downlinkS1cdma2000tunnelling # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } class S1APUplinkS1CDMA2000Tunnelling(S1APSigProc): """Uplink S1 CDMA2000 Tunnelling: TS 36.413, section 8.8.2.1 eNB-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 70: Cdma2000PDU (M) - 71: Cdma2000RATType (M) - 72: Cdma2000SectorID (M) - 84: Cdma2000HORequiredIndication (O) - 97: Cdma2000OneXRAND (O) - 102: Cdma2000OneXSRVCCInfo (O) - 140: EUTRANRoundTripDelayEstimationInfo (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.uplinkS1cdma2000tunnelling # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } #------------------------------------------------------------------------------# # UE Capability Info Indication # TS 36.413, section 8.9 #------------------------------------------------------------------------------# class S1APUECapabilityInfoInd(S1APSigProc): """UE Capability Info Indication: TS 36.413, section 8.9 eNB-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 74: UERadioCapability (M) - 198: UERadioCapabilityForPaging (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.uECapabilityInfoIndication # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } def recv(self, pdu): self._recv(pdu) if not self.errcause: # set the UERadioCapability in UE.Cap ueradcap, uecapinfo = decode_ue_rad_cap(self.UEInfo['UERadioCapability']) self.UE.Cap['UERadioCap'] = (self.UEInfo['UERadioCapability'], ueradcap, uecapinfo) if 'UERadioCapabilityForPaging' in self.UEInfo: self.UE.Cap['UERadioCapPaging'] = self.UEInfo['UERadioCapabilityForPaging'] # if 'UERadioCapabilityForPaging' in self.UEInfo: self.UE.Cap['UERadioCapPaging'] = (self.UEInfo['UERadioCapabilityForPaging'], None, None) #------------------------------------------------------------------------------# # Trace Procedures # TS 36.413, section 8.10 #------------------------------------------------------------------------------# class S1APTraceStart(S1APSigProc): """Trace Start: TS 36.413, section 8.10.1 CN-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 25: TraceActivation (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.traceStart # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } send = S1APSigProc._send class S1APTraceFailureInd(S1APSigProc): """Trace Failure Indication: TS 36.413, section 8.10.2 eNB-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 2: Cause (M) - 8: ENB_UE_S1AP_ID (M) - 86: E_UTRAN_Trace_ID (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.traceFailureIndication # Custom decoders Decod = { 'ini': ({ 'E_UTRAN_Trace_ID': lambda x: (plmn_buf_to_str(x[:3]), bytes_to_uint(x[3:6], 24), bytes_to_uint(x[6:8], 16)), }, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } def recv(self, pdu): self._recv(pdu) if not self.errcause: # just log the failure self._log('INF', 'trace id %s.%.6x.%.4x, cause %r'\ % (self.UEInfo['E_UTRAN_Trace_ID'][0], self.UEInfo['E_UTRAN_Trace_ID'][1], self.UEInfo['E_UTRAN_Trace_ID'][2], self.UEInfo['Cause'])) class S1APDeactivateTrace(S1APSigProc): """Deactivate Start: TS 36.413, section 8.10.3 CN-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 86: E_UTRAN_Trace_ID (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.deactivateTrace # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } send = S1APSigProc._send class S1APCellTrafficTrace(S1APSigProc): """Cell Traffic Trace: TS 36.413, section 8.10.4 eNB-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 86: E_UTRAN_Trace_ID (M) - 100: EUTRAN_CGI (M) - 131: TransportLayerAddress (M) - 166: PrivacyIndicator (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.cellTrafficTrace # Custom decoders Decod = { 'ini': ({ 'E_UTRAN_Trace_ID': lambda x: (plmn_buf_to_str(x[:3]), bytes_to_uint(x[3:6], 24), bytes_to_uint(x[6:8], 16)), 'EUTRAN_CGI': lambda x: (plmn_buf_to_str(x['pLMNidentity']), cellid_bstr_to_str(x['cell-ID'])), }, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } def recv(self, pdu): self._recv(pdu) if not self.errcause: # convert the TLA if self.UEInfo['TransportLayerAddress'][1] == 32: # IPv4 addr = inet_ntoa_cn(1, uint_to_bytes(self.UEInfo['TransportLayerAddress'][0], 32)) elif self.UEInfo['TransportLayerAddress'][1] == 128: # IPv6 addr = inet_ntoa_cn(2, uint_to_bytes(self.UEInfo['TransportLayerAddress'][0], 128)) else: addr = uint_to_bytes(*self.UEInfo['TransportLayerAddress']) # just log the indications self._log('INF', 'trace id %s.%.6x.%.4x, EUTRAN CGI %s.%s, address %s'\ % (self.UEInfo['E_UTRAN_Trace_ID'][0], self.UEInfo['E_UTRAN_Trace_ID'][1], self.UEInfo['E_UTRAN_Trace_ID'][2], self.UEInfo['EUTRAN_CGI'][0], self.UEInfo['EUTRAN_CGI'][1], addr)) #------------------------------------------------------------------------------# # Location Reporting Procedures # TS 36.413, section 8.11 #------------------------------------------------------------------------------# class S1APLocationReportingControl(S1APSigProc): """Location Reporting Control: TS 36.413, section 8.11.1 CN-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 98: RequestType (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.locationReportingControl # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } send = S1APSigProc._send class S1APLocationReportFailure(S1APSigProc): """Location Report Failure Indication: TS 36.413, section 8.11.2 eNB-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 2: Cause (M) - 8: ENB_UE_S1AP_ID (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.locationReportingFailureIndication # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } def recv(self, pdu): self._recv(pdu) if not self.errcause: # just log the failure self._log('INF', 'cause %r' % (self.UEInfo['Cause'], )) class S1APLocationReport(S1APSigProc): """Location Report: TS 36.413, section 8.11.3 eNB-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 67: TAI (M) - 98: RequestType (M) - 100: EUTRAN_CGI (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.locationReport # Custom decoders Decod = { 'ini': ({ 'TAI' : lambda x: (plmn_buf_to_str(x['pLMNidentity']), bytes_to_uint(x['tAC'], 16)), 'EUTRAN_CGI': lambda x: (plmn_buf_to_str(x['pLMNidentity']), cellid_bstr_to_str(x['cell-ID'])) }, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } def recv(self, pdu): self._recv(pdu) if not self.errcause: # just log the failure self._log('INF', 'reqtype %s, TAI %s.%.4x, EUTRAN CGI %s.%s'\ % (self.UEInfo['RequestType'], self.UEInfo['TAI'][0], self.UEInfo['TAI'][1], self.UEInfo['EUTRAN_CGI'][0], self.UEInfo['EUTRAN_CGI'][1] )) #------------------------------------------------------------------------------# # Warning Message Transmission Procedures # TS 36.413, section 8.12 #------------------------------------------------------------------------------# class S1APWriteReplaceWarning(S1APNonUESigProc): """Write Replace Warning: TS 36.413, section 8.12.1 CN-initiated request-response non-UE-associated signalling procedure InitiatingMessage: IEs: - 111: MessageIdentifier (M) - 112: SerialNumber (M) - 113: WarningAreaList (O) - 114: RepetitionPeriod (M) - 115: NumberofBroadcastRequest (M) - 116: WarningType (O) - 117: WarningSecurityInfo (O) - 118: DataCodingScheme (O) - 119: WarningMessageContents (O) - 142: ConcurrentWarningMessageIndicator (O) - 144: ExtendedRepetitionPeriod (O) SuccessfulOutcome: IEs: - 58: CriticalityDiagnostics (O) - 111: MessageIdentifier (M) - 112: SerialNumber (M) - 120: BroadcastCompletedAreaList (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.writeReplaceWarning # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } send = S1APNonUESigProc._send def recv(self, pdu): self._recv(pdu) try: del self.ENB.Proc[self.Code] except Exception: pass if not self.errcause: msgid, sernum = self.ENBInfo['MessageIdentifier'][0], self.ENBInfo['SerialNumber'][0] if msgid != self._NetInfo['MessageIdentifier'][0]: self._log('MessageIdentifier mismatch: 0x%.4x instead of 0x%.4x'\ % (msgid, self._NetInfo['MessageIdentifier'][0])) elif 'BroadcastCompletedAreaList' not in self.ENBInfo \ or not self.ENBInfo['BroadcastCompletedAreaList']: self._log('broadcasting failed') else: self.ENB.WARN[(msgid, sernum)] = self._NetInfo self._log('INF', 'broadcasting warning message') class S1APKill(S1APNonUESigProc): """Kill: TS 36.413, section 8.12.2 CN-initiated request-response non-UE-associated signalling procedure InitiatingMessage: IEs: - 111: MessageIdentifier (M) - 112: SerialNumber (M) - 113: WarningAreaList (O) - 191: KillAllWarningMessages (O) SuccessfulOutcome: IEs: - 58: CriticalityDiagnostics (O) - 111: MessageIdentifier (M) - 112: SerialNumber (M) - 141: BroadcastCancelledAreaList (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.kill # Custom decoders Decod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': ({}, {}), 'uns': None } send = S1APNonUESigProc._send def recv(self, pdu): self._recv(pdu) try: del self.ENB.Proc[self.Code] except Exception: pass if not self.errcause: self._log('INF', 'stopped broadcasting warning message') class S1APPWSRestartInd(S1APNonUESigProc): """PWS Restart Indication: TS 36.413, section 8.12.3 eNB-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 59: Global_ENB_ID (M) - 182: ECGIListForRestart (M) - 188: TAIListForRestart (M) - 190: EmergencyAreaIDListForRestart (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.pWSRestartIndication # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } def recv(self, pdu): self._recv(pdu) if not self.errcause: self._log('INF', 'restarting broascasting warning message') class S1APPWSFailureInd(S1APNonUESigProc): """PWS Failure Indication: TS 36.413, section 8.12.4 eNB-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 59: Global_ENB_ID (M) - 222: PWSfailedECGIList (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.pWSFailureIndication # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } def recv(self, pdu): self._recv(pdu) if not self.errcause: self._log('INF', 'failure broascasting warning message') #------------------------------------------------------------------------------# # eNB / MME Direct Information Transfer # TS 36.413, section 8.13 and 8.14 #------------------------------------------------------------------------------# class S1APENBDirectInfoTransfer(S1APNonUESigProc): """eNB Direct Information Transfer: TS 36.413, section 8.13 eNB-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 121: Inter_SystemInformationTransferType (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.eNBDirectInformationTransfer # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } class S1APMMEDirectInfoTransfer(S1APNonUESigProc): """MME Direct Information Transfer: TS 36.413, section 8.14 CN-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 122: Inter_SystemInformationTransferType (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.mMEDirectInformationTransfer # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } #------------------------------------------------------------------------------# # eNB / MME Configuration Transfer # TS 36.413, section 8.15 and 8.16 #------------------------------------------------------------------------------# class S1APENBConfigTransfer(S1APNonUESigProc): """eNB Configuration Transfer: TS 36.413, section 8.15 eNB-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 129: SONConfigurationTransfer (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.eNBConfigurationTransfer # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } class S1APMMEConfigTransfer(S1APNonUESigProc): """eNB Configuration Transfer: TS 36.413, section 8.16 eNB-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 130: SONConfigurationTransfer (O) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.mMEConfigurationTransfer # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } #------------------------------------------------------------------------------# # LPPa transport # TS 36.413, section 8.17 #------------------------------------------------------------------------------# class S1APDownlinkUELPPaTransport(S1APSigProc): """Downlink UE Associated LPPa Transport: TS 36.413, section 8.17.2.1 CN-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 147: LPPa_PDU (M) - 148: Routing_ID (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.downlinkUEAssociatedLPPaTransport # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } class S1APUplinkUELPPaTransport(S1APSigProc): """Uplink UE Associated LPPa Transport: TS 36.413, section 8.17.2.2 eNB-initiated request only UE-associated signalling procedure InitiatingMessage: IEs: - 0: MME_UE_S1AP_ID (M) - 8: ENB_UE_S1AP_ID (M) - 147: LPPa_PDU (M) - 148: Routing_ID (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.uplinkUEAssociatedLPPaTransport # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } class S1APDownlinkNonUELPPaTransport(S1APNonUESigProc): """Downlink Non UE Associated LPPa Transport: TS 36.413, section 8.17.2.3 CN-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 147: LPPa_PDU (M) - 148: Routing_ID (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.downlinkNonUEAssociatedLPPaTransport # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } class S1APUplinkNonUELPPaTransport(S1APNonUESigProc): """Uplink Non UE Associated LPPa Transport: TS 36.413, section 8.17.2.4 eNB-initiated request only non-UE-associated signalling procedure InitiatingMessage: IEs: - 147: LPPa_PDU (M) - 148: Routing_ID (M) """ # ASN.1 procedure description Desc = S1AP.S1AP_PDU_Descriptions.uplinkNonUEAssociatedLPPaTransport # Custom decoders Decod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # Custom encoders Encod = { 'ini': ({}, {}), 'suc': None, 'uns': None } # initializing all S1AP procedures classes S1APERABSetup.init() S1APERABModify.init() S1APERABRelease.init() S1APERABModificationInd.init() S1APInitialContextSetup.init() S1APUEContextReleaseRequest.init() S1APUEContextRelease.init() S1APUEContextModification.init() S1APUERadioCapabilityMatch.init() S1APUEContextModificationInd.init() S1APUEContextSuspend.init() S1APUEContextResume.init() S1APConnectionEstablishmentInd.init() S1APHandoverPreparation.init() S1APHandoverResourceAllocation.init() S1APHandoverNotification.init() S1APPathSwitchRequest.init() S1APHandoverCancel.init() S1APENBStatusTransfer.init() S1APMMEStatusTransfer.init() S1APPaging.init() S1APInitialUEMessage.init() S1APDownlinkNASTransport.init() S1APUplinkNASTransport.init() S1APNASNonDeliveryInd.init() S1APRerouteNASRequest.init() S1APResetCN.init() S1APResetENB.init() S1APErrorIndNonUECN.init() S1APErrorIndNonUEENB.init() S1APErrorIndCN.init() S1APErrorIndENB.init() S1APS1Setup.init() S1APENBConfigUpdate.init() S1APMMEConfigUpdate.init() S1APOverloadStart.init() S1APOverloadStop.init() S1APDownlinkS1CDMA2000Tunnelling.init() S1APUplinkS1CDMA2000Tunnelling.init() S1APUECapabilityInfoInd.init() S1APTraceStart.init() S1APTraceFailureInd.init() S1APDeactivateTrace.init() S1APCellTrafficTrace.init() S1APLocationReportingControl.init() S1APLocationReportFailure.init() S1APLocationReport.init() S1APWriteReplaceWarning.init() S1APKill.init() S1APPWSRestartInd.init() S1APPWSFailureInd.init() S1APENBDirectInfoTransfer.init() S1APMMEDirectInfoTransfer.init() S1APENBConfigTransfer.init() S1APMMEConfigTransfer.init() S1APDownlinkUELPPaTransport.init() S1APUplinkUELPPaTransport.init() S1APDownlinkNonUELPPaTransport.init() S1APUplinkNonUELPPaTransport.init() # S1AP eNB-initiated UE-associated signalling procedures dispatcher S1APProcEnbDispatcher = { 12 : S1APInitialUEMessage, 13 : S1APUplinkNASTransport, 15 : S1APErrorIndENB, 16 : S1APNASNonDeliveryInd, 18 : S1APUEContextReleaseRequest, 20 : S1APUplinkS1CDMA2000Tunnelling, 22 : S1APUECapabilityInfoInd, 28 : S1APTraceFailureInd, 32 : S1APLocationReportFailure, 33 : S1APLocationReport, 42 : S1APCellTrafficTrace, 45 : S1APUplinkUELPPaTransport, 50 : S1APERABModificationInd, 53 : S1APUEContextModificationInd } # S1AP CN-initiated UE-associated signalling procedures dispatcher S1APProcCnDispatcher = { 5 : S1APERABSetup, 6 : S1APERABModify, 7 : S1APERABRelease, 9 : S1APInitialContextSetup, 11 : S1APDownlinkNASTransport, 15 : S1APErrorIndCN, 19 : S1APDownlinkS1CDMA2000Tunnelling, 21 : S1APUEContextModification, 23 : S1APUEContextRelease, 26 : S1APDeactivateTrace, 27 : S1APTraceStart, 31 : S1APLocationReportingControl, 44 : S1APDownlinkUELPPaTransport, 48 : S1APUERadioCapabilityMatch, 52 : S1APRerouteNASRequest, 54 : S1APConnectionEstablishmentInd } # S1AP eNB-initiated non-UE-associated signalling procedures dispatcher S1APNonUEProcEnbDispatcher = { 0 : S1APHandoverPreparation, 2 : S1APHandoverNotification, 3 : S1APPathSwitchRequest, 4 : S1APHandoverCancel, 14 : S1APResetENB, 15 : S1APErrorIndNonUEENB, 17 : S1APS1Setup, 24 : S1APENBStatusTransfer, 29 : S1APENBConfigUpdate, 37 : S1APENBDirectInfoTransfer, 40 : S1APENBConfigTransfer, 41 : S1APMMEConfigTransfer, 47 : S1APUplinkNonUELPPaTransport, 49 : S1APPWSRestartInd, 51 : S1APPWSFailureInd, 55 : S1APUEContextSuspend, 56 : S1APUEContextResume, } # S1AP CN-initiated non-UE-associated signalling procedures dispatcher S1APNonUEProcCnDispatcher = { 1 : S1APHandoverResourceAllocation, 10 : S1APPaging, 14 : S1APResetCN, 15 : S1APErrorIndNonUECN, 25 : S1APMMEStatusTransfer, 30 : S1APMMEConfigUpdate, 34 : S1APOverloadStart, 35 : S1APOverloadStop, 36 : S1APWriteReplaceWarning, 38 : S1APMMEDirectInfoTransfer, 43 : S1APKill, 46 : S1APDownlinkNonUELPPaTransport }