2839 lines
71 KiB
Python
2839 lines
71 KiB
Python
# -*- coding: UTF-8 -*-
|
|
#/**
|
|
# * Software Name : pycrate
|
|
# * Version : 0.4
|
|
# *
|
|
# * Copyright 2020. Benoit Michau. P1Sec.
|
|
# *
|
|
# * 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/ProcCNNgap.py
|
|
# * Created : 2020-04-15
|
|
# * Authors : Benoit Michau
|
|
# *--------------------------------------------------------
|
|
#*/
|
|
|
|
__all__ = [
|
|
"NGAPSigProc",
|
|
"NGAPNonUESigProc",
|
|
#
|
|
"NGAPPDUSessResSetup",
|
|
"NGAPPDUSessResRelease",
|
|
"NGAPPDUSessResModify",
|
|
"NGAPPDUSessResNotify",
|
|
"NGAPPDUSessResModifyInd",
|
|
"NGAPInitialContextSetup",
|
|
"NGAPUEContextReleaseRequest",
|
|
"NGAPUEContextRelease",
|
|
"NGAPUEContextModification",
|
|
"NGAPRRCInactiveTransitionReport",
|
|
"NGAPHandoverPreparation",
|
|
"NGAPHandoverResourceAllocation",
|
|
"NGAPHandoverNotification",
|
|
"NGAPPathSwitchRequest",
|
|
"NGAPHandoverCancel",
|
|
"NGAPUplinkRANStatusTransfer",
|
|
"NGAPDownlinkRANStatusTransfer",
|
|
"NGAPPaging",
|
|
"NGAPInitialUEMessage",
|
|
"NGAPDownlinkNASTransport",
|
|
"NGAPUplinkNASTransport",
|
|
"NGAPNASNonDeliveryInd",
|
|
"NGAPRerouteNASRequest",
|
|
"NGAPNGSetup",
|
|
"NGAPRANConfigUpdate",
|
|
"NGAPAMFConfigUpdate",
|
|
"NGAPNGResetCN",
|
|
"NGAPNGResetRAN",
|
|
"NGAPErrorIndNonUECN",
|
|
"NGAPErrorIndNonUERAN",
|
|
"NGAPErrorIndCN",
|
|
"NGAPErrorIndRAN",
|
|
"NGAPAMFStatusInd",
|
|
"NGAPOverloadStart",
|
|
"NGAPOverloadStop",
|
|
"NGAPUplinkRANConfigTransfer",
|
|
"NGAPDownlinkRANConfigTransfer",
|
|
"NGAPWriteReplaceWarning",
|
|
"NGAPPWSCancel",
|
|
"NGAPPWSRestartInd",
|
|
"NGAPPWSFailureInd",
|
|
"NGAPDownlinkUENRPPaTransport",
|
|
"NGAPUplinkUENRPPaTransport",
|
|
"NGAPDownlinkNonUENRPPaTransport",
|
|
"NGAPUplinkNonUENRPPaTransport",
|
|
"NGAPTraceStart",
|
|
"NGAPTraceFailureInd",
|
|
"NGAPDeactivateTrace",
|
|
"NGAPCellTrafficTrace",
|
|
"NGAPLocationReportingControl",
|
|
"NGAPLocationReportingFailureInd",
|
|
"NGAPLocationReport",
|
|
"NGAPUETNLABindingRelease",
|
|
"NGAPUERadioCapabilityInfoInd",
|
|
"NGAPUERadioCapabilityCheck",
|
|
"NGAPSecondaryRATDataUsageReport",
|
|
"NGAPUplinkRIMInfoTransfer",
|
|
"NGAPDownlinkRIMInfoTransfer",
|
|
#
|
|
"NGAPProcRANDispatcher",
|
|
"NGAPProcCNDispatcher",
|
|
"NGAPNonUEProcRANDispatcher",
|
|
"NGAPNonUEProcCNDispatcher",
|
|
]
|
|
|
|
from .utils import *
|
|
from .ProcProto import *
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# NGAP signalling procedure
|
|
# TS 38.413, version g10
|
|
# Core Network side
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
|
class NGAPSigProc(LinkSigProc):
|
|
"""NGAP UE-associated signalling procedure handler
|
|
|
|
instance attributes:
|
|
- Name : procedure name
|
|
- NG : reference to the UENGd instance running this procedure
|
|
- GNB : reference to the GNBd instance connected by NG
|
|
- Server: reference to the CorenetServer instance handling the gNB
|
|
- UE : reference to the UEd instance connected by NG
|
|
- 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, ngd):
|
|
#
|
|
self.Name = self.__class__.__name__
|
|
self.NG = ngd
|
|
self.GNB = ngd.GNB
|
|
self.Server = ngd.GNB.Server
|
|
if ngd.UE:
|
|
self.UE = ngd.UE
|
|
else:
|
|
self._log('WNG', 'no UEd instance attached')
|
|
#
|
|
# to store PDU traces
|
|
self._pdu = []
|
|
# list of PDU to be sent to the gNB
|
|
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.NG._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.NG.Proc:
|
|
del self.NG.Proc[self.Code]
|
|
self._log('INF', 'aborting')
|
|
|
|
|
|
class NGAPNonUESigProc(LinkSigProc):
|
|
"""NGAP non-UE-associated signalling procedure handler
|
|
|
|
instance attributes:
|
|
- Name : procedure name
|
|
- GNB : reference to the GNBd instance connected by NG
|
|
- Server: reference to the CorenetServer instance handling the gNB
|
|
- 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, gnbd):
|
|
#
|
|
self.Name = self.__class__.__name__
|
|
self.GNB = gnbd
|
|
self.Server = gnbd.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.GNB._log(logtype, '[%s] %s' % (self.Name, msg))
|
|
|
|
def _recv(self, pdu):
|
|
if self.TRACK_PDU:
|
|
self._pdu.append( (time(), 'UL', pdu) )
|
|
self.errcause, self.GNBInfo = None, {}
|
|
try:
|
|
self.decode_pdu(pdu, self.GNBInfo)
|
|
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.GNB.Proc:
|
|
del self.GNB.Proc[self.Code]
|
|
self._log('INF', 'aborting')
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# PDU Session Management Procedures
|
|
# TS 38.413, section 8.2
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPPDUSessResSetup(NGAPSigProc):
|
|
"""PDU Session Resource Setup: TS 38.413, section 8.2.1
|
|
|
|
CN-initiated
|
|
request-response
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 38: NAS_PDU (O)
|
|
- 74: PDUSessionResourceSetupListSUReq (M)
|
|
- 83: RANPagingPriority (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 110: UEAggregateMaximumBitRate (O)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 58: PDUSessionResourceFailedToSetupListSURes (O)
|
|
- 75: PDUSessionResourceSetupListSURes (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.pDUSessionResourceSetup
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPPDUSessResRelease(NGAPSigProc):
|
|
"""PDU Session Resource Release: TS 38.413, section 8.2.2
|
|
|
|
CN-initiated
|
|
request-response
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 38: NAS_PDU (O)
|
|
- 79: PDUSessionResourceToReleaseListRelCmd (M)
|
|
- 83: RANPagingPriority (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 70: PDUSessionResourceReleasedListRelRes (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 121: UserLocationInformation (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.pDUSessionResourceRelease
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({
|
|
'UserLocationInformation': lambda x: ngap_userloc_to_hum(x)
|
|
}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPPDUSessResModify(NGAPSigProc):
|
|
"""PDU Session Resource Modify: TS 38.413, section 8.2.3
|
|
|
|
CN-initiated
|
|
request-response
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 64: PDUSessionResourceModifyListModReq (M)
|
|
- 83: RANPagingPriority (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 54: PDUSessionResourceFailedToModifyListModRes (O)
|
|
- 65: PDUSessionResourceModifyListModRes (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 121: UserLocationInformation (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.pDUSessionResourceModify
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPPDUSessResNotify(NGAPSigProc):
|
|
"""PDU Session Resource Notify: TS 38.413, section 8.2.4
|
|
|
|
RAN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 66: PDUSessionResourceNotifyList (O)
|
|
- 67: PDUSessionResourceReleasedListNot (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 121: UserLocationInformation (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.pDUSessionResourceNotify
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({
|
|
'UserLocationInformation': lambda x: ngap_userloc_to_hum(x)
|
|
}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPPDUSessResModifyInd(NGAPSigProc):
|
|
"""PDU Session Resource Modify Indication: TS 38.413, section 8.2.5
|
|
|
|
RAN-initiatied
|
|
request-response
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 63: PDUSessionResourceModifyListModInd (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 62: PDUSessionResourceModifyListModCfm (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 131: PDUSessionResourceFailedToModifyListModCfm (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.pDUSessionResourceModifyIndication
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# UE Context Management Procedures
|
|
# TS 38.413, section 8.3
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPInitialContextSetup(NGAPSigProc):
|
|
"""Initial Context Setup: TS 38.413, section 8.3.1
|
|
|
|
CN-initiated
|
|
request-reponse
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 0: AllowedNSSAI (M)
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 18: CoreNetworkAssistanceInformationForInactive (O)
|
|
- 24: EmergencyFallbackIndicator (O)
|
|
- 28: GUAMI (M)
|
|
- 31: IndexToRFSP (O)
|
|
- 33: LocationReportingRequestType (O)
|
|
- 34: MaskedIMEISV (O)
|
|
- 36: MobilityRestrictionList (O)
|
|
- 38: NAS_PDU (O)
|
|
- 48: AMFName (O)
|
|
- 71: PDUSessionResourceSetupListCxtReq (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 91: RRCInactiveTransitionReportRequest (O)
|
|
- 94: SecurityKey (M)
|
|
- 108: TraceActivation (O)
|
|
- 110: UEAggregateMaximumBitRate (C)
|
|
- 117: UERadioCapability (O)
|
|
- 118: UERadioCapabilityForPaging (O)
|
|
- 119: UESecurityCapabilities (M)
|
|
- 146: RedirectionVoiceFallback (O)
|
|
- 165: CNAssistedRANTuning (O)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 55: PDUSessionResourceFailedToSetupListCxtRes (O)
|
|
- 72: PDUSessionResourceSetupListCxtRes (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
UnsuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 15: Cause (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 132: PDUSessionResourceFailedToSetupListCxtFail (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.initialContextSetup
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
|
|
class NGAPUEContextReleaseRequest(NGAPSigProc):
|
|
"""UE Context Release Request: TS 38.413, section 8.3.2
|
|
|
|
RAN-initiatied
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 15: Cause (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 133: PDUSessionResourceListCxtRelReq (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.uEContextReleaseRequest
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
recv = NGAPSigProc._recv
|
|
|
|
def trigger(self):
|
|
# copy the cause signaled by the gNB
|
|
Proc = self.NG.init_ngap_proc(NGAPUEContextRelease,
|
|
Cause=self.UEInfo['Cause'],
|
|
UE_NGAP_IDs=('uE-NGAP-ID-pair',
|
|
{'aMF-UE-NGAP-ID': self.NG.CtxId,
|
|
'rAN-UE-NGAP-ID': self.NG.CtxId}))
|
|
if Proc:
|
|
return [Proc]
|
|
else:
|
|
return []
|
|
|
|
|
|
class NGAPUEContextRelease(NGAPSigProc):
|
|
"""UE Context Release: TS 38.413, section 8.3.3
|
|
|
|
CN-initiated
|
|
request-reponse
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 15: Cause (M)
|
|
- 114: UE_NGAP_IDs (M)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 32: InfoOnRecommendedCellsAndRANNodesForPaging (O)
|
|
- 60: PDUSessionResourceListCxtRelCpl (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 121: UserLocationInformation (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.uEContextRelease
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({
|
|
'UserLocationInformation': lambda x: ngap_userloc_to_hum(x)
|
|
}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
send = NGAPSigProc._send
|
|
|
|
def _release_ng(self):
|
|
# TODO: suspend all PDU sessions
|
|
#self.NG.FGSM.pdu_suspend()
|
|
# update mobility state
|
|
if self.NG.FGMM.state != 'INACTIVE':
|
|
self.NG.FGMM.state = 'IDLE'
|
|
self._log('INF', 'UE disconnected, cause %r' % (self._NetInfo['Cause'], ))
|
|
#
|
|
# disconnect the NG interface to the gNB for the UE
|
|
self.NG.unset_ran()
|
|
self.NG.unset_ctx()
|
|
|
|
def recv(self, pdu):
|
|
# recv the NGAPUEContextRelease response
|
|
self._recv(pdu)
|
|
# remove from the NGAP procedure stack
|
|
try:
|
|
del self.NG.Proc[self.Code]
|
|
except Exception:
|
|
pass
|
|
self._release_ng()
|
|
|
|
def abort(self):
|
|
# remove from the NGAP procedure stack
|
|
try:
|
|
del self.NG.Proc[self.Code]
|
|
except Exception:
|
|
pass
|
|
self._log('INF', 'aborting')
|
|
self._release_ng()
|
|
|
|
|
|
class NGAPUEContextModification(NGAPSigProc):
|
|
"""UE Context Modification: TS 38.413, section 8.3.4
|
|
|
|
CN-initiated
|
|
request-reponse
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 18: CoreNetworkAssistanceInformationForInactive (O)
|
|
- 24: EmergencyFallbackIndicator (O)
|
|
- 31: IndexToRFSP (O)
|
|
- 40: AMF_UE_NGAP_ID (O)
|
|
- 83: RANPagingPriority (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 91: RRCInactiveTransitionReportRequest (O)
|
|
- 94: SecurityKey (O)
|
|
- 110: UEAggregateMaximumBitRate (O)
|
|
- 119: UESecurityCapabilities (O)
|
|
- 162: GUAMI (O)
|
|
- 165: CNAssistedRANTuning (O)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 92: RRCState (O)
|
|
- 121: UserLocationInformation (O)
|
|
UnsuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 15: Cause (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.uEContextModification
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({
|
|
'UserLocationInformation': lambda x: ngap_userloc_to_hum(x)
|
|
}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
|
|
class NGAPRRCInactiveTransitionReport(NGAPSigProc):
|
|
"""RRC Inactive Transition Report: TS 38.413, section 8.3.5
|
|
|
|
RAN-initiatied
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 92: RRCState (M)
|
|
- 121: UserLocationInformation (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.rRCInactiveTransitionReport
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({
|
|
'UserLocationInformation': lambda x: ngap_userloc_to_hum(x)
|
|
}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# UE Mobility Management Procedures
|
|
# TS 38.413, section 8.4
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPHandoverPreparation(NGAPNonUESigProc):
|
|
"""Handover Preparation: TS 38.413, section 8.4.1
|
|
|
|
RAN-initiatied
|
|
request-reponse
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 15: Cause (M)
|
|
- 22: DirectForwardingPathAvailability (O)
|
|
- 29: HandoverType (M)
|
|
- 61: PDUSessionResourceListHORqd (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 101: SourceToTarget_TransparentContainer (M)
|
|
- 105: TargetID (M)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 29: HandoverType (M)
|
|
- 39: NASSecurityParametersFromNGRAN (C)
|
|
- 59: PDUSessionResourceHandoverList (O)
|
|
- 78: PDUSessionResourceToReleaseListHOCmd (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 106: TargetToSource_TransparentContainer (M)
|
|
UnsuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 15: Cause (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.handoverPreparation
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
|
|
class NGAPHandoverResourceAllocation(NGAPNonUESigProc):
|
|
"""Handover Resource Allocation: TS 38.413, section 8.4.2
|
|
|
|
CN-initiated
|
|
request-reponse
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 0: AllowedNSSAI (M)
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 15: Cause (M)
|
|
- 18: CoreNetworkAssistanceInformationForInactive (O)
|
|
- 28: GUAMI (M)
|
|
- 29: HandoverType (M)
|
|
- 33: LocationReportingRequestType (O)
|
|
- 34: MaskedIMEISV (O)
|
|
- 36: MobilityRestrictionList (O)
|
|
- 37: NAS_PDU (O)
|
|
- 41: NewSecurityContextInd (O)
|
|
- 73: PDUSessionResourceSetupListHOReq (M)
|
|
- 91: RRCInactiveTransitionReportRequest (O)
|
|
- 93: SecurityContext (M)
|
|
- 101: SourceToTarget_TransparentContainer (M)
|
|
- 108: TraceActivation (O)
|
|
- 110: UEAggregateMaximumBitRate (M)
|
|
- 119: UESecurityCapabilities (M)
|
|
- 146: RedirectionVoiceFallback (O)
|
|
- 165: CNAssistedRANTuning (O)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 53: PDUSessionResourceAdmittedList (M)
|
|
- 56: PDUSessionResourceFailedToSetupListHOAck (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 106: TargetToSource_TransparentContainer (M)
|
|
UnsuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 15: Cause (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.handoverResourceAllocation
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
|
|
class NGAPHandoverNotification(NGAPNonUESigProc):
|
|
"""Handover Notification: TS 38.413, section 8.4.3
|
|
|
|
RAN-initiatied
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 121: UserLocationInformation (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.handoverNotification
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({
|
|
'UserLocationInformation': lambda x: ngap_userloc_to_hum(x)
|
|
}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPPathSwitchRequest(NGAPNonUESigProc):
|
|
"""Path Switch Request: TS 38.413, section 8.4.4
|
|
|
|
RAN-initiatied
|
|
request-reponse
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 57: PDUSessionResourceFailedToSetupListPSReq (O)
|
|
- 76: PDUSessionResourceToBeSwitchedDLList (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 100: AMF_UE_NGAP_ID (M)
|
|
- 119: UESecurityCapabilities (M)
|
|
- 121: UserLocationInformation (M)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 0: AllowedNSSAI (M)
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 18: CoreNetworkAssistanceInformationForInactive (O)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 41: NewSecurityContextInd (O)
|
|
- 68: PDUSessionResourceReleasedListPSAck (O)
|
|
- 77: PDUSessionResourceSwitchedList (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 91: RRCInactiveTransitionReportRequest (O)
|
|
- 93: SecurityContext (M)
|
|
- 119: UESecurityCapabilities (O)
|
|
- 146: RedirectionVoiceFallback (O)
|
|
- 165: CNAssistedRANTuning (O)
|
|
UnsuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 69: PDUSessionResourceReleasedListPSFail (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.pathSwitchRequest
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({
|
|
'UserLocationInformation': lambda x: ngap_userloc_to_hum(x)
|
|
}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
|
|
class NGAPHandoverCancel(NGAPSigProc):
|
|
"""Handover Cancellation: TS 38.413, section 8.4.5
|
|
|
|
RAN-initiatied
|
|
request-reponse
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 15: Cause (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.handoverCancel
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPUplinkRANStatusTransfer(NGAPSigProc):
|
|
"""Uplink RAN Status Transfer: TS 38.413, section 8.4.6
|
|
|
|
RAN-initiatied
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 84: RANStatusTransfer_TransparentContainer (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.uplinkRANStatusTransfer
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPDownlinkRANStatusTransfer(NGAPSigProc):
|
|
"""Downlink RAN Status Transfer: TS 38.413, section 8.4.7
|
|
|
|
CN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 84: RANStatusTransfer_TransparentContainer (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.downlinkRANStatusTransfer
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Paging Procedures
|
|
# TS 38.413, section 8.5
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPPaging(NGAPNonUESigProc):
|
|
"""Paging: TS 38.413, section 8.5.1
|
|
|
|
CN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 11: AssistanceDataForPaging (O)
|
|
- 50: PagingDRX (O)
|
|
- 51: PagingOrigin (O)
|
|
- 52: PagingPriority (O)
|
|
- 103: TAIListForPaging (M)
|
|
- 115: UEPagingIdentity (M)
|
|
- 118: UERadioCapabilityForPaging (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.paging
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Transport of NAS Messages Procedures
|
|
# TS 38.413, section 8.6
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPInitialUEMessage(NGAPSigProc):
|
|
"""Initial UE Message: TS 38.413, section 8.6.1
|
|
|
|
RAN-initiatied
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 0: AllowedNSSAI (O)
|
|
- 3: AMFSetID (O)
|
|
- 26: FiveG_S_TMSI (O)
|
|
- 38: NAS_PDU (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 90: RRCEstablishmentCause (M)
|
|
- 112: UEContextRequest (O)
|
|
- 121: UserLocationInformation (M)
|
|
- 171: SourceToTarget_AMFInformationReroute (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.initialUEMessage
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({
|
|
'UserLocationInformation': lambda x: ngap_userloc_to_hum(x)
|
|
}, {}),
|
|
'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 of UserLocInfo against GNBd parameters:
|
|
err = False
|
|
userloc = self.UEInfo['UserLocationInformation']
|
|
tai = userloc['TAI']
|
|
if 'NR-CGI' in userloc:
|
|
cgi = userloc['NR-CGI']
|
|
else:
|
|
cgi = userloc['EUTRA-CGI']
|
|
if cgi[0] != self.GNB.ID[0] or cgi[1][0] != self.GNB.ID[2][0]:
|
|
self._log('WNG', 'invalid Cell Global-ID, %s.%.9x' % (cgi[0], cgi[1][0]))
|
|
err = True
|
|
elif tai not in self.GNB.Config['TAIs']:
|
|
self._log('WNG', 'invalid TAI, %s.%.6x' % tai)
|
|
err = True
|
|
if err:
|
|
self.errcause = ('protocol', 'message-not-compatible-with-receiver-state')
|
|
#
|
|
if not self.errcause:
|
|
self.NG.FGMM.state = 'ACTIVE'
|
|
self._log('INF', 'RRC establishment cause: %s' % self.UEInfo['RRCEstablishmentCause'])
|
|
self.UE.set_tai(*tai)
|
|
self._ret = self.NG.process_nas(self.UEInfo['NAS_PDU'])
|
|
|
|
def trigger(self):
|
|
return self._ret
|
|
|
|
|
|
class NGAPDownlinkNASTransport(NGAPSigProc):
|
|
"""Downlink NAS Transport: TS 38.413, section 8.6.2
|
|
|
|
CN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 0: AllowedNSSAI (O)
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 31: IndexToRFSP (O)
|
|
- 36: MobilityRestrictionList (O)
|
|
- 38: NAS_PDU (M)
|
|
- 48: AMFName (O)
|
|
- 83: RANPagingPriority (O)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 110: UEAggregateMaximumBitRate (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.downlinkNASTransport
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
send = NGAPSigProc._send
|
|
|
|
|
|
class NGAPUplinkNASTransport(NGAPSigProc):
|
|
"""Uplink NAS Transport: TS 38.413, section 8.6.3
|
|
|
|
RAN-initiatied
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 38: NAS_PDU (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 121: UserLocationInformation (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.uplinkNASTransport
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({
|
|
'UserLocationInformation': lambda x: ngap_userloc_to_hum(x)
|
|
}, {}),
|
|
'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 of UserLocInfo against GNBd parameters:
|
|
err = False
|
|
userloc = self.UEInfo['UserLocationInformation']
|
|
tai = userloc['TAI']
|
|
if 'NR-CGI' in userloc:
|
|
cgi = userloc['NR-CGI']
|
|
else:
|
|
cgi = userloc['EUTRA-CGI']
|
|
if cgi[0] != self.GNB.ID[0] or cgi[1][0] != self.GNB.ID[2][0]:
|
|
self._log('WNG', 'invalid Cell Global-ID, %s.%.9x' % (cgi[0], cgi[1][0]))
|
|
err = True
|
|
elif tai not in self.GNB.Config['TAIs']:
|
|
self._log('WNG', 'invalid TAI, %s.%.6x' % tai)
|
|
err = True
|
|
if err:
|
|
self.errcause = ('protocol', 'message-not-compatible-with-receiver-state')
|
|
#
|
|
if not self.errcause:
|
|
self._ret = self.NG.process_nas(self.UEInfo['NAS_PDU'])
|
|
|
|
def trigger(self):
|
|
return self._ret
|
|
|
|
|
|
class NGAPNASNonDeliveryInd(NGAPSigProc):
|
|
"""NAS Non Delivery Indication: TS 38.413, section 8.6.4
|
|
|
|
RAN-initiatied
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 15: Cause (M)
|
|
- 38: NAS_PDU (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.nASNonDeliveryIndication
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPRerouteNASRequest(NGAPSigProc):
|
|
"""Reroute NAS Request: TS 38.413, section 8.6.5
|
|
|
|
CN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 0: AllowedNSSAI (O)
|
|
- 3: AMFSetID (M)
|
|
- 10: AMF_UE_NGAP_ID (O)
|
|
- 42: [OCTET STRING] (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 171: SourceToTarget_AMFInformationReroute (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.rerouteNASRequest
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Interface Management Procedures
|
|
# TS 38.413, section 8.7
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPNGSetup(NGAPNonUESigProc):
|
|
"""NG Setup : TS 38.413, section 8.7.1
|
|
|
|
gNB-initiated
|
|
request-response
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 21: PagingDRX (M)
|
|
- 27: GlobalRANNodeID (M)
|
|
- 82: RANNodeName (O)
|
|
- 102: SupportedTAList (M)
|
|
- 147: UERetentionInformation (O)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 1: AMFName (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 80: PLMNSupportList (M)
|
|
- 86: RelativeAMFCapacity (M)
|
|
- 96: ServedGUAMIList (M)
|
|
- 147: UERetentionInformation (O)
|
|
UnsuccessfulOutcome:
|
|
IEs:
|
|
- 15: Cause (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 107: TimeToWait (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.nGSetup
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({
|
|
'GlobalRANNodeID': globranid_to_hum,
|
|
'SupportedTAList': supptalist_to_hum,
|
|
},
|
|
{}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
def recv(self, pdu):
|
|
# recv the NGSetupRequest
|
|
self._recv(pdu)
|
|
if self.errcause:
|
|
# procedure unsuccessful outcome
|
|
self.encode_pdu('uns', Cause=self.errcause)
|
|
self._log('INF', 'gNB NG Setup unsuccessful')
|
|
else:
|
|
self.GNB.Config = cpdict(self.GNBInfo)
|
|
tais = set()
|
|
for (tac, bcastplmnlist) in self.GNBInfo['SupportedTAList'].items():
|
|
for (plmn, _) in bcastplmnlist:
|
|
tais.add( (plmn, tac) )
|
|
self.GNB.Config['TAIs'] = tuple(tais)
|
|
self.GNB.ID = self.GNBInfo['GlobalRANNodeID']
|
|
# prepare the NGSetupResponse
|
|
IEs = self.GNB.get_ngsetup_ies_from_cfg()
|
|
self.encode_pdu('suc', **IEs)
|
|
self._log('INF', 'gNB NG Setup successful')
|
|
|
|
send = NGAPNonUESigProc._send
|
|
|
|
|
|
class NGAPRANConfigUpdate(NGAPNonUESigProc):
|
|
"""RAN Configuration Update: TS 38.413, section 8.7.2
|
|
|
|
RAN-initiated
|
|
request-response
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 21: PagingDRX (O)
|
|
- 27: GlobalRANNodeID (O)
|
|
- 82: RANNodeName (O)
|
|
- 102: SupportedTAList (O)
|
|
- 167: NGRAN_TNLAssociationToRemoveList (O)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 19: CriticalityDiagnostics (O)
|
|
UnsuccessfulOutcome:
|
|
IEs:
|
|
- 15: Cause (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 107: TimeToWait (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.rANConfigurationUpdate
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({
|
|
'GlobalRANNodeID': globranid_to_hum,
|
|
'SupportedTAList': supptalist_to_hum,
|
|
},
|
|
{}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
def recv(self, pdu):
|
|
# recv the RANConfigUpdate, which provides similar configuration
|
|
# information as the NGSetup message
|
|
self._recv(pdu)
|
|
if self.errcause:
|
|
# procedure unsuccessful outcome
|
|
self.encode_pdu('uns', Cause=self.errcause)
|
|
self._log('INF', 'gNB Config Update unsuccessful')
|
|
else:
|
|
gnbcfg = cpdict(self.GNBInfo)
|
|
if 'NGRAN_TNLAssociationToRemoveList' in gnbcfg:
|
|
del gnbcfg['NGRAN_TNLAssociationToRemoveList']
|
|
self.GNB.Config.update(gnbcfg)
|
|
if 'SupportedTAList' in gnbcfg:
|
|
tais = set()
|
|
for (tac, bcastplmnlist) in self.GNBInfo['SupportedTAList'].items():
|
|
for (plmn, _) in bcastplmnlist:
|
|
tais.add( (plmn, tac) )
|
|
self.GNB.Config['TAIs'] = tuple(tais)
|
|
if 'GlobalRANNodeID' in gnbcfg:
|
|
self.GNB.ID = self.GNBInfo['GlobalRANNodeID']
|
|
# TODO: process NGRAN_TNLAssociationToRemoveList
|
|
# prepare the ConfigUpdateResponse
|
|
self.encode_pdu('suc')
|
|
self._log('INF', 'gNB Config Update successful')
|
|
|
|
send = NGAPNonUESigProc._send
|
|
|
|
|
|
class NGAPAMFConfigUpdate(NGAPNonUESigProc):
|
|
"""AMF Configuration Update: TS 38.413, section 8.7.3
|
|
|
|
CN-initiated
|
|
request-response
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 1: AMFName (O)
|
|
- 6: AMF_TNLAssociationToAddList (O)
|
|
- 7: AMF_TNLAssociationToRemoveList (O)
|
|
- 8: AMF_TNLAssociationToUpdateList (O)
|
|
- 80: PLMNSupportList (O)
|
|
- 86: RelativeAMFCapacity (O)
|
|
- 96: ServedGUAMIList (O)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 4: TNLAssociationList (O)
|
|
- 5: AMF_TNLAssociationSetupList (O)
|
|
- 19: CriticalityDiagnostics (O)
|
|
UnsuccessfulOutcome:
|
|
IEs:
|
|
- 15: Cause (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 107: TimeToWait (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.aMFConfigurationUpdate
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': ({}, {})
|
|
}
|
|
|
|
def recv(self, pdu):
|
|
# receive the AMFConfigUpdate response
|
|
self._recv(pdu)
|
|
try:
|
|
del self.GNB.Proc[self.Code]
|
|
except Exception:
|
|
pass
|
|
if not self.errcause:
|
|
self._log('INF', 'success')
|
|
|
|
send = NGAPNonUESigProc._send
|
|
|
|
|
|
class NGAPNGResetCN(NGAPNonUESigProc):
|
|
"""NG Reset: TS 38.413, section 8.7.4.2.1
|
|
|
|
CN-initiated
|
|
request-response
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 15: Cause (M)
|
|
- 88: ResetType (M)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 111: UE_associatedLogicalNG_connectionList (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.nGReset
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPNGResetRAN(NGAPNonUESigProc):
|
|
"""NG Reset: TS 38.413, section 8.7.4.2.2
|
|
|
|
RAN-initiated
|
|
request-response
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 15: Cause (M)
|
|
- 88: ResetType (M)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 111: UE_associatedLogicalNG_connectionList (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.nGReset
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPErrorIndNonUECN(NGAPNonUESigProc):
|
|
"""Error Indication: TS 38.413, section 8.7.5
|
|
|
|
CN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (O)
|
|
- 15: Cause (O)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 85: RAN_UE_NGAP_ID (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_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 = NGAPNonUESigProc._send
|
|
|
|
|
|
class NGAPErrorIndNonUERAN(NGAPNonUESigProc):
|
|
"""Error Indication: TS 38.413, section 8.7.5
|
|
|
|
RAN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (O)
|
|
- 15: Cause (O)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 85: RAN_UE_NGAP_ID (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_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.GNBInfo:
|
|
self._log('WNG', 'error ind received: %r' % (self.GNBInfo['Cause'], ))
|
|
# if it corresponds to a said-unknown UE ID, disconnect the UE instance
|
|
if self.GNBInfo['Cause'] == ('radioNetwork', 'unknown-local-UE-NGAP-ID') \
|
|
and 'AMF_UE_NGAP_ID' in self.GNBInfo \
|
|
and self.GNBInfo['AMF_UE_NGAP_ID'] in self.GNB.UE:
|
|
ue = self.GNB.UE[self.GNBInfo['AMF_UE_NGAP_ID']]
|
|
if ue.NG.is_connected():
|
|
self._log('INF', 'UE %s to be disconnected' % ue.IMSI)
|
|
ue.NG.unset_ran()
|
|
# if it corresponds to a previously CN-initiated class 1 procedure
|
|
# abort it
|
|
try:
|
|
self.GNB.Proc[self.GNB.ProcLast].abort()
|
|
except Exception:
|
|
pass
|
|
|
|
|
|
class NGAPErrorIndCN(NGAPSigProc):
|
|
"""Error Indication: TS 38.413, section 8.7.5
|
|
|
|
CN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (O)
|
|
- 15: Cause (O)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 85: RAN_UE_NGAP_ID (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_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 = NGAPSigProc._send
|
|
|
|
|
|
class NGAPErrorIndRAN(NGAPSigProc):
|
|
"""Error Indication: TS 38.413, section 8.7.5
|
|
|
|
RAN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (O)
|
|
- 15: Cause (O)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 85: RAN_UE_NGAP_ID (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_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.NG.Proc[self.NG.ProcLast].abort()
|
|
except Exception:
|
|
pass
|
|
|
|
|
|
class NGAPAMFStatusInd(NGAPNonUESigProc):
|
|
"""AMF Status Indication: TS 38.413, section 8.7.6
|
|
|
|
CN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 120: UnavailableGUAMIList (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.aMFStatusIndication
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPOverloadStart(NGAPNonUESigProc):
|
|
"""Overload Start: TS 38.413, section 8.7.7
|
|
|
|
CN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 2: OverloadResponse (O)
|
|
- 9: TrafficLoadReductionIndication (O)
|
|
- 49: OverloadStartNSSAIList (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.overloadStart
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPOverloadStop(NGAPNonUESigProc):
|
|
"""Overload Start: TS 38.413, section 8.7.8
|
|
|
|
CN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
None
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.overloadStop
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Configuration Transfer Procedures
|
|
# TS 38.413, section 8.8
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPUplinkRANConfigTransfer(NGAPNonUESigProc):
|
|
"""Uplink RAN Configuration Transfer: TS 38.413, section 8.8.1
|
|
|
|
RAN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 99: SONConfigurationTransfer (O)
|
|
- 158: EN_DCSONConfigurationTransfer (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.uplinkRANConfigurationTransfer
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPDownlinkRANConfigTransfer(NGAPNonUESigProc):
|
|
"""Downlink RAN Configuration Transfer: TS 38.413, section 8.8.2
|
|
|
|
CN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 98: SONConfigurationTransfer (O)
|
|
- 157: EN_DCSONConfigurationTransfer (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.downlinkRANConfigurationTransfer
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Warning Message Transmission Procedures
|
|
# TS 38.413, section 8.9
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPWriteReplaceWarning(NGAPNonUESigProc):
|
|
"""Write-Replace Warning: TS 38.413, section 8.9.1
|
|
|
|
CN-initiated
|
|
request-response
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 17: ConcurrentWarningMessageInd (O)
|
|
- 20: DataCodingScheme (O)
|
|
- 35: MessageIdentifier (M)
|
|
- 47: NumberOfBroadcastsRequested (M)
|
|
- 87: RepetitionPeriod (M)
|
|
- 95: SerialNumber (M)
|
|
- 122: WarningAreaList (O)
|
|
- 123: WarningMessageContents (O)
|
|
- 124: WarningSecurityInfo (O)
|
|
- 125: WarningType (O)
|
|
- 141: WarningAreaCoordinates (O)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 13: BroadcastCompletedAreaList (O)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 35: MessageIdentifier (M)
|
|
- 95: SerialNumber (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.writeReplaceWarning
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPPWSCancel(NGAPNonUESigProc):
|
|
"""PWS Cancel: TS 38.413, section 8.9.2
|
|
|
|
CN-initiated
|
|
request-response
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 14: CancelAllWarningMessages (O)
|
|
- 35: MessageIdentifier (M)
|
|
- 95: SerialNumber (M)
|
|
- 122: WarningAreaList (O)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 12: BroadcastCancelledAreaList (O)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 35: MessageIdentifier (M)
|
|
- 95: SerialNumber (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.pWSCancel
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPPWSRestartInd(NGAPNonUESigProc):
|
|
"""PWS Restart Indication: TS 38.413, section 8.9.3
|
|
|
|
RAN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 16: CellIDListForRestart (M)
|
|
- 23: EmergencyAreaIDListForRestart (O)
|
|
- 27: GlobalRANNodeID (M)
|
|
- 104: TAIListForRestart (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.pWSRestartIndication
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPPWSFailureInd(NGAPNonUESigProc):
|
|
"""PWS Failure Indication: TS 38.413, section 8.9.4
|
|
|
|
RAN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 27: GlobalRANNodeID (M)
|
|
- 81: PWSFailedCellIDList (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.pWSFailureIndication
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# NRPPa Transport Procedures
|
|
# TS 38.413, section 8.10
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPDownlinkUENRPPaTransport(NGAPSigProc):
|
|
"""DOWNLINK UE ASSOCIATED NRPPA TRANSPORT: TS 38.413, section 8.10.2.1
|
|
|
|
CN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 46: NRPPa_PDU (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 89: RoutingID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.downlinkUEAssociatedNRPPaTransport
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPUplinkUENRPPaTransport(NGAPSigProc):
|
|
"""UPLINK UE ASSOCIATED NRPPA TRANSPORT: TS 38.413, section 8.10.2.2
|
|
|
|
RAN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 46: NRPPa_PDU (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 89: RoutingID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.uplinkUEAssociatedNRPPaTransport
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPDownlinkNonUENRPPaTransport(NGAPNonUESigProc):
|
|
"""DOWNLINK NON UE ASSOCIATED NRPPA TRANSPORT: TS 38.413, section 8.10.3.1
|
|
|
|
CN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 46: NRPPa_PDU (M)
|
|
- 89: RoutingID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.downlinkNonUEAssociatedNRPPaTransport
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPUplinkNonUENRPPaTransport(NGAPNonUESigProc):
|
|
"""UPLINK NON UE ASSOCIATED NRPPA TRANSPORT: TS 38.413, section 8.10.3.2
|
|
|
|
RAN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 46: NRPPa_PDU (M)
|
|
- 89: RoutingID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.uplinkNonUEAssociatedNRPPaTransport
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Trace Procedures
|
|
# TS 38.413, section 8.11
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPTraceStart(NGAPSigProc):
|
|
"""Trace Start: TS 38.413, section 8.11.1
|
|
|
|
CN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 108: TraceActivation (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.traceStart
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPTraceFailureInd(NGAPSigProc):
|
|
"""Trace Failure Indication: TS 38.413, section 8.11.2
|
|
|
|
RAN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 15: Cause (M)
|
|
- 44: NGRANTraceID (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.traceFailureIndication
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPDeactivateTrace(NGAPSigProc):
|
|
"""Deactivate Trace: TS 38.413, section 8.11.3
|
|
|
|
CN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 44: NGRANTraceID (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.deactivateTrace
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPCellTrafficTrace(NGAPSigProc):
|
|
"""Cell Traffic Trace: TS 38.413, section 8.11.4
|
|
|
|
RAN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 43: NGRAN_CGI (M)
|
|
- 44: NGRANTraceID (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 109: TransportLayerAddress (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.cellTrafficTrace
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Location Reporting Procedures
|
|
# TS 38.413, section 8.12
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPLocationReportingControl(NGAPSigProc):
|
|
"""Location Reporting Control: TS 38.413, section 8.12.1
|
|
|
|
CN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 33: LocationReportingRequestType (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.locationReportingControl
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPLocationReportingFailureInd(NGAPSigProc):
|
|
"""Location Reporting Failure Indication: TS 38.413, section 8.12.2
|
|
|
|
RAN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 15: Cause (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.locationReportingFailureIndication
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPLocationReport(NGAPSigProc):
|
|
"""Location Report: TS 38.413, section 8.12.3
|
|
|
|
RAN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 33: LocationReportingRequestType (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 116: UEPresenceInAreaOfInterestList (O)
|
|
- 121: UserLocationInformation (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.locationReport
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({
|
|
'UserLocationInformation': lambda x: ngap_userloc_to_hum(x)
|
|
}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# UE TNLA Binding Procedures
|
|
# TS 38.413, section 8.13
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPUETNLABindingRelease(NGAPSigProc):
|
|
"""UE TNLA Binding Release: TS 38.413, section 8.13.1
|
|
|
|
CN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.uETNLABindingRelease
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# UE Radio Capability Management Procedures
|
|
# TS 38.413, section 8.14
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPUERadioCapabilityInfoInd(NGAPSigProc):
|
|
"""UE Radio Capability Info Indication: TS 38.413, section 8.14.1
|
|
|
|
RAN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 117: UERadioCapability (M)
|
|
- 118: UERadioCapabilityForPaging (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.uERadioCapabilityInfoIndication
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPUERadioCapabilityCheck(NGAPSigProc):
|
|
"""UE Radio Capability Info Check: TS 38.413, section 8.14.2
|
|
|
|
CN-initiated
|
|
request-response
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 117: UERadioCapability (O)
|
|
SuccessfulOutcome:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 19: CriticalityDiagnostics (O)
|
|
- 30: IMSVoiceSupportIndicator (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.uERadioCapabilityCheck
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': ({}, {}),
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Data Usage Reporting Procedures
|
|
# TS 38.413, section 8.15
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPSecondaryRATDataUsageReport(NGAPSigProc):
|
|
"""Secondary RAT Data Usage Report: TS 38.413, section 8.15.1
|
|
|
|
RAN-initiated
|
|
request only
|
|
UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 10: AMF_UE_NGAP_ID (M)
|
|
- 85: RAN_UE_NGAP_ID (M)
|
|
- 121: UserLocationInformation (O)
|
|
- 142: PDUSessionResourceSecondaryRATUsageList (M)
|
|
- 143: HandoverFlag (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.secondaryRATDataUsageReport
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({
|
|
'UserLocationInformation': lambda x: ngap_userloc_to_hum(x)
|
|
}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# RIM Information Transfer Procedures
|
|
# TS 38.413, section 8.16
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class NGAPUplinkRIMInfoTransfer(NGAPNonUESigProc):
|
|
"""Uplink RIM Information Transfer: TS 38.413, section 8.16.1
|
|
|
|
RAN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 175: RIMInformationTransfer (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.uplinkRIMInformationTransfer
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
class NGAPDownlinkRIMInfoTransfer(NGAPNonUESigProc):
|
|
"""Downlink RIM Information Transfer: TS 38.413, section 8.16.2
|
|
|
|
CN-initiated
|
|
request only
|
|
non-UE-associated signalling procedure
|
|
|
|
InitiatingMessage:
|
|
IEs:
|
|
- 175: RIMInformationTransfer (O)
|
|
"""
|
|
|
|
# ASN.1 procedure description
|
|
Desc = NGAP.NGAP_PDU_Descriptions.downlinkRIMInformationTransfer
|
|
|
|
# Custom decoders
|
|
Decod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
# Custom encoders
|
|
Encod = {
|
|
'ini': ({}, {}),
|
|
'suc': None,
|
|
'uns': None
|
|
}
|
|
|
|
|
|
# initializing all NGAP procedures classes
|
|
NGAPPDUSessResSetup.init()
|
|
NGAPPDUSessResRelease.init()
|
|
NGAPPDUSessResModify.init()
|
|
NGAPPDUSessResNotify.init()
|
|
NGAPPDUSessResModifyInd.init()
|
|
NGAPInitialContextSetup.init()
|
|
NGAPUEContextReleaseRequest.init()
|
|
NGAPUEContextRelease.init()
|
|
NGAPUEContextModification.init()
|
|
NGAPRRCInactiveTransitionReport.init()
|
|
NGAPHandoverPreparation.init()
|
|
NGAPHandoverResourceAllocation.init()
|
|
NGAPHandoverNotification.init()
|
|
NGAPPathSwitchRequest.init()
|
|
NGAPHandoverCancel.init()
|
|
NGAPUplinkRANStatusTransfer.init()
|
|
NGAPDownlinkRANStatusTransfer.init()
|
|
NGAPPaging.init()
|
|
NGAPInitialUEMessage.init()
|
|
NGAPDownlinkNASTransport.init()
|
|
NGAPUplinkNASTransport.init()
|
|
NGAPNASNonDeliveryInd.init()
|
|
NGAPRerouteNASRequest.init()
|
|
NGAPNGSetup.init()
|
|
NGAPRANConfigUpdate.init()
|
|
NGAPAMFConfigUpdate.init()
|
|
NGAPNGResetCN.init()
|
|
NGAPNGResetRAN.init()
|
|
NGAPErrorIndNonUECN.init()
|
|
NGAPErrorIndNonUERAN.init()
|
|
NGAPErrorIndCN.init()
|
|
NGAPErrorIndRAN.init()
|
|
NGAPAMFStatusInd.init()
|
|
NGAPOverloadStart.init()
|
|
NGAPOverloadStop.init()
|
|
NGAPUplinkRANConfigTransfer.init()
|
|
NGAPDownlinkRANConfigTransfer.init()
|
|
NGAPWriteReplaceWarning.init()
|
|
NGAPPWSCancel.init()
|
|
NGAPPWSRestartInd.init()
|
|
NGAPPWSFailureInd.init()
|
|
NGAPDownlinkUENRPPaTransport.init()
|
|
NGAPUplinkUENRPPaTransport.init()
|
|
NGAPDownlinkNonUENRPPaTransport.init()
|
|
NGAPUplinkNonUENRPPaTransport.init()
|
|
NGAPTraceStart.init()
|
|
NGAPTraceFailureInd.init()
|
|
NGAPDeactivateTrace.init()
|
|
NGAPCellTrafficTrace.init()
|
|
NGAPLocationReportingControl.init()
|
|
NGAPLocationReportingFailureInd.init()
|
|
NGAPLocationReport.init()
|
|
NGAPUETNLABindingRelease.init()
|
|
NGAPUERadioCapabilityInfoInd.init()
|
|
NGAPUERadioCapabilityCheck.init()
|
|
NGAPSecondaryRATDataUsageReport.init()
|
|
NGAPUplinkRIMInfoTransfer.init()
|
|
NGAPDownlinkRIMInfoTransfer.init()
|
|
|
|
# NGAP RAN-initiated UE-associated signalling procedures dispatcher
|
|
NGAPProcRANDispatcher = {
|
|
2 : NGAPCellTrafficTrace,
|
|
9 : NGAPErrorIndRAN,
|
|
10 : NGAPHandoverCancel,
|
|
15 : NGAPInitialUEMessage,
|
|
17 : NGAPLocationReportingFailureInd,
|
|
18 : NGAPLocationReport,
|
|
19 : NGAPNASNonDeliveryInd,
|
|
27 : NGAPPDUSessResModifyInd,
|
|
30 : NGAPPDUSessResNotify,
|
|
37 : NGAPRRCInactiveTransitionReport,
|
|
38 : NGAPTraceFailureInd,
|
|
42 : NGAPUEContextReleaseRequest,
|
|
44 : NGAPUERadioCapabilityInfoInd,
|
|
46 : NGAPUplinkNASTransport,
|
|
49 : NGAPUplinkRANStatusTransfer,
|
|
50 : NGAPUplinkUENRPPaTransport,
|
|
52 : NGAPSecondaryRATDataUsageReport
|
|
}
|
|
|
|
# NGAP CN-initiated UE-associated signalling procedures dispatcher
|
|
NGAPProcCNDispatcher = {
|
|
3 : NGAPDeactivateTrace,
|
|
4 : NGAPDownlinkNASTransport,
|
|
7 : NGAPDownlinkRANStatusTransfer,
|
|
8 : NGAPDownlinkUENRPPaTransport,
|
|
9 : NGAPErrorIndCN,
|
|
14 : NGAPInitialContextSetup,
|
|
16 : NGAPLocationReportingControl,
|
|
26 : NGAPPDUSessResModify,
|
|
28 : NGAPPDUSessResRelease,
|
|
29 : NGAPPDUSessResSetup,
|
|
36 : NGAPRerouteNASRequest,
|
|
39 : NGAPTraceStart,
|
|
40 : NGAPUEContextModification,
|
|
41 : NGAPUEContextRelease,
|
|
43 : NGAPUERadioCapabilityCheck,
|
|
45 : NGAPUETNLABindingRelease
|
|
}
|
|
|
|
# NGAP RAN-initiated non-UE-associated signalling procedures dispatcher
|
|
NGAPNonUEProcRANDispatcher = {
|
|
9 : NGAPErrorIndNonUERAN,
|
|
11 : NGAPHandoverNotification,
|
|
12 : NGAPHandoverPreparation,
|
|
20 : NGAPNGResetRAN,
|
|
21 : NGAPNGSetup,
|
|
25 : NGAPPathSwitchRequest,
|
|
33 : NGAPPWSFailureInd,
|
|
34 : NGAPPWSRestartInd,
|
|
35 : NGAPRANConfigUpdate,
|
|
47 : NGAPUplinkNonUENRPPaTransport,
|
|
48 : NGAPUplinkRANConfigTransfer,
|
|
53 : NGAPUplinkRIMInfoTransfer
|
|
}
|
|
|
|
# NGAP CN-initiated non-UE-associated signalling procedures dispatcher
|
|
NGAPNonUEProcCNDispatcher = {
|
|
0 : NGAPAMFConfigUpdate,
|
|
1 : NGAPAMFStatusInd,
|
|
5 : NGAPDownlinkNonUENRPPaTransport,
|
|
6 : NGAPDownlinkRANConfigTransfer,
|
|
9 : NGAPErrorIndNonUECN,
|
|
13 : NGAPHandoverResourceAllocation,
|
|
20 : NGAPNGResetCN,
|
|
22 : NGAPOverloadStart,
|
|
23 : NGAPOverloadStop,
|
|
24 : NGAPPaging,
|
|
32 : NGAPPWSCancel,
|
|
51 : NGAPWriteReplaceWarning,
|
|
54 : NGAPDownlinkRIMInfoTransfer
|
|
}
|
|
|