637 lines
25 KiB
Python
637 lines
25 KiB
Python
# -*- coding: UTF-8 -*-
|
|
#/**
|
|
# * Software Name : pycrate
|
|
# * Version : 0.3
|
|
# *
|
|
# * 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_mobile/TS24008_GMM.py
|
|
# * Created : 2017-06-22
|
|
# * Authors : Benoit Michau
|
|
# *--------------------------------------------------------
|
|
#*/
|
|
|
|
__all__ = [
|
|
'GMMAttachAccept',
|
|
'GMMAttachComplete',
|
|
'GMMAttachReject',
|
|
'GMMAttachRequest',
|
|
'GMMAuthenticationCipheringFailure',
|
|
'GMMAuthenticationCipheringReject',
|
|
'GMMAuthenticationCipheringRequest',
|
|
'GMMAuthenticationCipheringResponse',
|
|
'GMMDetachAcceptMO',
|
|
'GMMDetachAcceptMT',
|
|
'GMMDetachRequestMO',
|
|
'GMMDetachRequestMT',
|
|
'GMMIdentityRequest',
|
|
'GMMIdentityResponse',
|
|
'GMMInformation',
|
|
'GMMPTMSIReallocationCommand',
|
|
'GMMPTMSIReallocationComplete',
|
|
'GMMRoutingAreaUpdateAccept',
|
|
'GMMRoutingAreaUpdateComplete',
|
|
'GMMRoutingAreaUpdateReject',
|
|
'GMMRoutingAreaUpdateRequest',
|
|
'GMMServiceAccept',
|
|
'GMMServiceReject',
|
|
'GMMServiceRequest',
|
|
'GMMStatus',
|
|
#
|
|
'GMMTypeMOClasses',
|
|
'GMMTypeMTClasses',
|
|
'get_gmm_msg_mo_instances',
|
|
'get_gmm_msg_mt_instances'
|
|
]
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# 3GPP TS 24.008: Mobile radio interface layer 3 specification
|
|
# release 13 (d90)
|
|
#------------------------------------------------------------------------------#
|
|
|
|
from pycrate_core.utils import *
|
|
from pycrate_core.elt import *
|
|
from pycrate_core.base import *
|
|
|
|
from .TS24008_IE import *
|
|
from .TS24301_IE import AddUpdateType, UENetCap
|
|
from .TS24007 import *
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# GPRS Mobility Management header
|
|
# TS 24.008, section 10.1 to 10.4
|
|
#------------------------------------------------------------------------------#
|
|
|
|
# PS Mobility Management procedures dict
|
|
_PS_MM_dict = {
|
|
1 : "GPRS - Attach request",
|
|
2 : "GPRS - Attach accept",
|
|
3 : "GPRS - Attach complete",
|
|
4 : "GPRS - Attach reject",
|
|
5 : "GPRS - Detach request",
|
|
6 : "GPRS - Detach accept",
|
|
8 : "GPRS - Routing area update request",
|
|
9 : "GPRS - Routing area update accept",
|
|
10: "GPRS - Routing area update complete",
|
|
11: "GPRS - Routing area update reject",
|
|
12: "GPRS - Service Request",
|
|
13: "GPRS - Service Accept",
|
|
14: "GPRS - Service Reject",
|
|
16: "GPRS - P-TMSI reallocation command",
|
|
17: "GPRS - P-TMSI reallocation complete",
|
|
18: "GPRS - Authentication and ciphering request",
|
|
19: "GPRS - Authentication and ciphering response",
|
|
20: "GPRS - Authentication and ciphering reject",
|
|
28: "GPRS - Authentication and ciphering failure",
|
|
21: "GPRS - Identity request",
|
|
22: "GPRS - Identity response",
|
|
32: "GPRS - GMM status",
|
|
33: "GPRS - GMM information",
|
|
}
|
|
|
|
class GMMHeader(Envelope):
|
|
_GEN = (
|
|
Uint('SkipInd', bl=4),
|
|
Uint('ProtDisc', val=8, bl=4, dic=ProtDisc_dict),
|
|
Uint8('Type', val=32, dic=_PS_MM_dict),
|
|
)
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Attach Request
|
|
# TS 24.008, section 9.4.1
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMAttachRequest(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':1}),
|
|
Type4LV('MSNetCap', val={'V':b'\0\0'}, IE=ms_network_capability_value_part),
|
|
Type1V('CKSN', dic=CKSN_dict),
|
|
Type1V('AttachType', IE=AttachType()),
|
|
Type3V('DRXParam', val={'V':b'\0\0'}, bl={'V':16}, IE=DRXParam()),
|
|
Type4LV('ID', val={'V':b'\xf4\0\0\0\0'}, IE=ID()),
|
|
Type3V('OldRAI', val={'V':b'\0\xf1\x10\0\0\0'}, bl={'V':48}, IE=RAI()),
|
|
Type4LV('MSRACap', val={'V':5*b'\0'}, IE=ms_ra_capability_value_part),
|
|
Type3TV('OldPTMSISign', val={'T':0x19, 'V':b'\0\0\0'}, bl={'V':24}),
|
|
Type3TV('ReqREADYTimer', val={'T':0x17, 'V':b'\0'}, bl={'V':8}, IE=GPRSTimer()),
|
|
Type1TV('TMSIStatus', val={'T':0x9, 'V':0}, IE=TMSIStatus()),
|
|
Type4TLV('PSLCSCap', val={'T':0x33, 'V':b'\0'}, IE=PSLCSCap()),
|
|
Type4TLV('MSCm2', val={'T':0x11, 'V':b'@\0\0'}, IE=MSCm2()),
|
|
Type4TLV('MSCm3', val={'T':0x20, 'V':b''}, IE=classmark_3_value_part),
|
|
Type4TLV('SuppCodecs', val={'T':0x40, 'V':b'\0\x01\0'}, IE=SuppCodecList()),
|
|
Type4TLV('UENetCap', val={'T':0x58, 'V':b'\0\0'}, IE=UENetCap()),
|
|
Type4TLV('AddID', val={'T':0x1A, 'V':b'\xf4\0\0\0\0'}, IE=ID()),
|
|
Type4TLV('AddRAI', val={'T':0x1B, 'V':6*b'\0'}, IE=RAI()),
|
|
Type4TLV('VoiceDomPref', val={'T':0x5D, 'V':b'\0'}, IE=VoiceDomPref()),
|
|
Type1TV('DeviceProp', val={'T':0xD, 'V':0}, IE=DeviceProp()),
|
|
Type1TV('PTMSIType', val={'T':0xE, 'V':0}, IE=PTMSIType()),
|
|
Type1TV('MSNetFeatSupp', val={'T':0xC, 'V':0}, IE=MSNetFeatSupp()),
|
|
Type4TLV('OldLAI', val={'T':0x14, 'V':5*b'\0'}, IE=LAI()),
|
|
Type1TV('AddUpdateType', val={'T':0xF, 'V':0}, IE=AddUpdateType()),
|
|
Type4TLV('TMSIBasedNRICont', val={'T':0x10, 'V':b'\0\0'}, IE=NRICont()),
|
|
Type4TLV('T3324', val={'T':0x6A, 'V':b'\0'}, IE=GPRSTimer()),
|
|
Type4TLV('T3312Ext', val={'T':0x39, 'V':b'\0'}, IE=GPRSTimer3()),
|
|
Type4TLV('ExtDRXParam', val={'T':0x6E, 'V':b'\0'}, IE=ExtDRXParam())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Attach Accept
|
|
# TS 24.008, section 9.4.2
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMAttachAccept(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':2}),
|
|
Type1V('ForceStdby', dic=ForceStdby_dict),
|
|
Type1V('AttachResult', IE=AttachResult()),
|
|
Type3V('PeriodicRAUpdateTimer', val={'V':b'\0'}, bl={'V':8}, IE=GPRSTimer()),
|
|
Type1V('RadioPriorityTOM8', dic=RadioPrio_dict),
|
|
Type1V('RadioPrioritySMS', dic=RadioPrio_dict),
|
|
Type3V('RAI', val={'V':b'\0\xf1\x10\0\0\0'}, bl={'V':48}, IE=RAI()),
|
|
Type3TV('PTMSISign', val={'T':0x19, 'V':b'\0\0\0'}, bl={'V':24}),
|
|
Type3TV('NegoREADYTimer', val={'T':0x17, 'V':b'\0'}, bl={'V':8}, IE=GPRSTimer()),
|
|
Type4TLV('AllocPTMSI', val={'T':0x18, 'V':b'\xf4\0\0\0\0'}, IE=ID()),
|
|
Type4TLV('MSIdent', val={'T':0x23, 'V':b'\xf4\0\0\0\0'}, IE=ID()),
|
|
Type3TV('GMMCause', val={'T':0x25, 'V':b'\x11'}, bl={'V':8}, IE=GMMCause()),
|
|
Type4TLV('T3302', val={'T':0x2A, 'V':b'\0'}, IE=GPRSTimer()),
|
|
Type2('CellNotif', val={'T':0x8C}),
|
|
Type4TLV('EquivPLMNList', val={'T':0x4A, 'V':3*b'\0'}, IE=PLMNList()),
|
|
Type1TV('NetFeatSupp', val={'T':0xA, 'V':0}, IE=NetFeatSupp()),
|
|
Type4TLV('EmergNumList', val={'T':0x34, 'V':b'\x02\x01\0'}, IE=EmergNumList()),
|
|
Type1TV('ReqMSInfo', val={'T':0xA, 'V':0}, IE=ReqMSInfo()),
|
|
Type4TLV('T3319', val={'T':0x37, 'V':b'\0'}, IE=GPRSTimer()),
|
|
Type4TLV('T3323', val={'T':0x38, 'V':b'\0'}, IE=GPRSTimer()),
|
|
Type4TLV('T3312Ext', val={'T':0x39, 'V':b'\0'}, IE=GPRSTimer3()),
|
|
Type4TLV('AddNetFeatSupp', val={'T':0x66, 'V':b'\0'}, IE=AddNetFeatSupp()),
|
|
Type4TLV('T3324', val={'T':0x6A, 'V':b'\0'}, IE=GPRSTimer()),
|
|
Type4TLV('ExtDRXParam', val={'T':0x6E, 'V':b'\0'}, IE=ExtDRXParam()),
|
|
Type1TV('UPIntegrityInd', val={'T':0xC, 'V':0}, IE=UPIntegrityInd()),
|
|
Type4TLV('MSNetCap', val={'T':0x31, 'V':b'\0\0'},
|
|
IE=ms_network_capability_value_part),
|
|
Type4TLV('MSRACap', val={'T':0x33, 'V':5*b'\0'},
|
|
IE=ms_ra_capability_value_part)
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Attach Complete
|
|
# TS 24.008, section 9.4.3
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMAttachComplete(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':3}),
|
|
Type4TLV('InterRATHOInfo', val={'T':0x27, 'V':b'\0'}),
|
|
Type4TLV('EUTRANInterRATHOInfo', val={'T':0x2B, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Attach Reject
|
|
# TS 24.008, section 9.4.4
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMAttachReject(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':4}),
|
|
Type3V('GMMCause', val={'V':b'\x11'}, bl={'V':8}, IE=GMMCause()),
|
|
Type4TLV('T3302', val={'T':0x2A, 'V':b'\0'}, IE=GPRSTimer()),
|
|
Type4TLV('T3346', val={'T':0x3A, 'V':b'\0'}, IE=GPRSTimer())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Detach Request (mobile terminated)
|
|
# TS 24.008, section 9.4.5.1
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMDetachRequestMT(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':5}),
|
|
Type1V('ForceStdby', dic=ForceStdby_dict),
|
|
Type1V('DetachType', IE=DetachTypeMT()),
|
|
Type3TV('GMMCause', val={'T':0x25, 'V':b'\x11'}, bl={'V':8}, IE=GMMCause())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Detach Request (mobile originated)
|
|
# TS 24.008, section 9.4.5.2
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMDetachRequestMO(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':5}),
|
|
Uint('spare', bl=4),
|
|
Type1V('DetachType', IE=DetachTypeMO()),
|
|
Type4TLV('AllocPTMSI', val={'T':0x18, 'V':b'\xf4\0\0\0\0'}, IE=ID()),
|
|
Type4TLV('PTMSISign', val={'T':0x19, 'V':b'\0\0\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Detach Accept (mobile terminated)
|
|
# TS 24.008, section 9.4.6.1
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMDetachAcceptMT(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':6}),
|
|
Uint('spare', bl=4),
|
|
Type1V('ForceStdby', dic=ForceStdby_dict)
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Detach Accept (mobile originated)
|
|
# TS 24.008, section 9.4.6.2
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMDetachAcceptMO(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':6}),
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# P-TMSI Reallocation Command
|
|
# TS 24.008, section 9.4.7
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMPTMSIReallocationCommand(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':16}),
|
|
Type4LV('AllocPTMSI', val={'V':b'\xf4\0\0\0\0'}, IE=ID()),
|
|
Type3V('RAI', val={'V':b'\0\xf1\x10\0\0\0'}, bl={'V':48}, IE=RAI()),
|
|
Uint('spare', bl=4),
|
|
Type1V('ForceStdby', dic=ForceStdby_dict),
|
|
Type3TV('PTMSISign', val={'T':0x19, 'V':b'\0\0\0'}, bl={'V':24}),
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# P-TMSI Reallocation Complete
|
|
# TS 24.008, section 9.4.8
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMPTMSIReallocationComplete(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':17}),
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Authentication and ciphering request
|
|
# TS 24.008, section 9.4.9
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMAuthenticationCipheringRequest(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':18}),
|
|
Type1V('IMEISVReq'),
|
|
Type1V('CiphAlgo', dic=CiphAlgo_dict),
|
|
Type1V('ACRef'),
|
|
Type1V('ForceStdby', dic=ForceStdby_dict),
|
|
Type3TV('RAND', val={'T':0x21, 'V':16*b'\0'}, bl={'V':128}),
|
|
Type1TV('CKSN', val={'T':0x8, 'V':0}, dic=CKSN_dict),
|
|
Type4TLV('AUTN', val={'T':0x28, 'V':16*b'\0'}, IE=AUTN()),
|
|
Type4TLV('MSNetCap', val={'T':0x31, 'V':b'\0\0'},
|
|
IE=ms_network_capability_value_part),
|
|
Type1TV('IntegAlgo', val={'T':0x9, 'V':0}, dic=IntegAlgo_dict),
|
|
Type4TLV('MAC', val={'T':0x43, 'V':4*b'\0'}),
|
|
Type4TLV('MSRACap', val={'T':0x33, 'V':5*b'\0'},
|
|
IE=ms_ra_capability_value_part)
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Authentication and ciphering response
|
|
# TS 24.008, section 9.4.10
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMAuthenticationCipheringResponse(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':19}),
|
|
Uint('spare', bl=4),
|
|
Type1V('ACRef'),
|
|
Type3TV('RES', val={'T':0x22, 'V':4*b'\0'}, bl={'V':32}),
|
|
Type4TLV('IMEISV', val={'T':0x23, 'V':b'\x03\0\0\0\0\0\0\0\xf0'}, IE=ID()),
|
|
Type4TLV('RESExt', val={'T':0x29, 'V':4*b'\0'}),
|
|
Type4TLV('MAC', val={'T':0x43, 'V':4*b'\0'}),
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Authentication and ciphering failure
|
|
# TS 24.008, section 9.4.10a
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMAuthenticationCipheringFailure(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':28}),
|
|
Type3V('GMMCause', val={'V':b'\x11'}, bl={'V':8}, IE=GMMCause()),
|
|
Type4TLV('AUTS', val={'T':0x30, 'V':14*b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Authentication and ciphering reject
|
|
# TS 24.008, section 9.4.11
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMAuthenticationCipheringReject(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':20}),
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Identity Request
|
|
# TS 24.008, section 9.4.12
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMIdentityRequest(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':21}),
|
|
Type1V('ForceStdby', dic=ForceStdby_dict),
|
|
Type1V('IDType', val={'V':IDTYPE_IMSI}, dic=IDType_dict)
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Identity Response
|
|
# TS 24.008, section 9.4.13
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMIdentityResponse(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':22}),
|
|
Type4LV('ID', val={'V':b'\xf4\0\0\0\0'}, IE=ID())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Routing Area Update Request
|
|
# TS 24.008, section 9.4.14
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMRoutingAreaUpdateRequest(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':8}),
|
|
Type1V('CKSN', dic=CKSN_dict),
|
|
Type1V('UpdateType', IE=UpdateType()),
|
|
Type3V('OldRAI', val={'V':b'\0\xf1\x10\0\0\0'}, bl={'V':48}, IE=RAI()),
|
|
Type4LV('MSRACap', val={'V':5*b'\0'}, IE=ms_ra_capability_value_part),
|
|
Type3TV('OldPTMSISign', val={'T':0x19, 'V':b'\0\0\0'}, bl={'V':24}),
|
|
Type3TV('ReqREADYTimer', val={'T':0x17, 'V':b'\0'}, bl={'V':8}, IE=GPRSTimer()),
|
|
Type3TV('DRXParam', val={'T':0x27, 'V':b'\0\0'}, bl={'V':16}, IE=DRXParam()),
|
|
Type1TV('TMSIStatus', val={'T':0x9, 'V':0}, IE=TMSIStatus()),
|
|
Type4TLV('PTMSI', val={'T':0x18, 'V':b'\xf4\0\0\0\0'}, IE=ID()),
|
|
Type4TLV('MSNetCap', val={'T':0x31, 'V':b'\0\0'}, IE=ms_network_capability_value_part),
|
|
Type4TLV('PDPCtxtStat', val={'T':0x32, 'V':b'\0\0'}, IE=PDPCtxtStat()),
|
|
Type4TLV('PSLCSCap', val={'T':0x33, 'V':b'\0'}, IE=PSLCSCap()),
|
|
Type4TLV('MBMSCtxtStat', val={'T':0x35, 'V':b''}, IE=MBMSCtxtStat()),
|
|
Type4TLV('UENetCap', val={'T':0x58, 'V':b'\0\0'}, IE=UENetCap()),
|
|
Type4TLV('AddID', val={'T':0x1A, 'V':b'\xf4\0\0\0\0'}, IE=ID()),
|
|
Type4TLV('AddRAI', val={'T':0x1B, 'V':6*b'\0'}, IE=RAI()),
|
|
Type4TLV('MSCm2', val={'T':0x11, 'V':b'@\0\0'}, IE=MSCm2()),
|
|
Type4TLV('MSCm3', val={'T':0x20, 'V':b''}, IE=classmark_3_value_part),
|
|
Type4TLV('SuppCodecs', val={'T':0x40, 'V':b'\0\x01\0'}, IE=SuppCodecList()),
|
|
Type4TLV('VoiceDomPref', val={'T':0x5D, 'V':b'\0'}, IE=VoiceDomPref()),
|
|
Type1TV('PTMSIType', val={'T':0xE, 'V':0}, IE=PTMSIType()),
|
|
Type1TV('DeviceProp', val={'T':0xD, 'V':0}, IE=DeviceProp()),
|
|
Type1TV('MSNetFeatSupp', val={'T':0xC, 'V':0}, IE=MSNetFeatSupp()),
|
|
Type4TLV('OldLAI', val={'T':0x14, 'V':5*b'\0'}, IE=LAI()),
|
|
Type1TV('AddUpdateType', val={'T':0xF, 'V':0}, IE=AddUpdateType()),
|
|
Type4TLV('TMSIBasedNRICont', val={'T':0x10, 'V':b'\0\0'}, IE=NRICont()),
|
|
Type4TLV('T3324', val={'T':0x6A, 'V':b'\0'}, IE=GPRSTimer()),
|
|
Type4TLV('T3312Ext', val={'T':0x39, 'V':b'\0'}, IE=GPRSTimer3()),
|
|
Type4TLV('ExtDRXParam', val={'T':0x6E, 'V':b'\0'}, IE=ExtDRXParam())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Routing Area Update Accept
|
|
# TS 24.008, section 9.4.15
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMRoutingAreaUpdateAccept(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':9}),
|
|
Type1V('ForceStdby', dic=ForceStdby_dict),
|
|
Type1V('UpdateResult', IE=UpdateResult()),
|
|
Type3V('PeriodicRAUpdateTimer', val={'V':b'\0'}, bl={'V':8}, IE=GPRSTimer()),
|
|
Type3V('RAI', val={'V':b'\0\xf1\x10\0\0\0'}, bl={'V':48}, IE=RAI()),
|
|
Type3TV('PTMSISign', val={'T':0x19, 'V':b'\0\0\0'}, bl={'V':24}),
|
|
Type4TLV('AllocPTMSI', val={'T':0x18, 'V':b'\xf4\0\0\0\0'}, IE=ID()),
|
|
Type4TLV('MSIdent', val={'T':0x23, 'V':b'\xf4\0\0\0\0'}, IE=ID()),
|
|
Type4TLV('RcvNPDUNumList', val={'T':0x26, 'V':b'\0\0'},
|
|
IE=receive_npdu_number_list_value),
|
|
Type3TV('NegoREADYTimer', val={'T':0x17, 'V':b'\0'}, bl={'V':8}, IE=GPRSTimer()),
|
|
Type3TV('GMMCause', val={'T':0x25, 'V':b'\x11'}, bl={'V':8}, IE=GMMCause()),
|
|
Type4TLV('T3302', val={'T':0x2A, 'V':b'\0'}, IE=GPRSTimer()),
|
|
Type2('CellNotif', val={'T':0x8C}),
|
|
Type4TLV('EquivPLMNList', val={'T':0x4A, 'V':3*b'\0'}, IE=PLMNList()),
|
|
Type4TLV('PDPCtxtStat', val={'T':0x32, 'V':b'\0\0'}, IE=PDPCtxtStat()),
|
|
Type1TV('NetFeatSupp', val={'T':0xA, 'V':0}, IE=NetFeatSupp()),
|
|
Type4TLV('EmergNumList', val={'T':0x34, 'V':b'\x02\x01\0'}, IE=EmergNumList()),
|
|
Type4TLV('MBMSCtxtStat', val={'T':0x35, 'V':b''}, IE=MBMSCtxtStat()),
|
|
Type1TV('ReqMSInfo', val={'T':0xA, 'V':0}, IE=ReqMSInfo()),
|
|
Type4TLV('T3319', val={'T':0x37, 'V':b'\0'}, IE=GPRSTimer()),
|
|
Type4TLV('T3323', val={'T':0x38, 'V':b'\0'}, IE=GPRSTimer()),
|
|
Type4TLV('T3312Ext', val={'T':0x39, 'V':b'\0'}, IE=GPRSTimer3()),
|
|
Type4TLV('AddNetFeatSupp', val={'T':0x66, 'V':b'\0'}, IE=AddNetFeatSupp()),
|
|
Type4TLV('T3324', val={'T':0x6A, 'V':b'\0'}, IE=GPRSTimer()),
|
|
Type4TLV('ExtDRXParam', val={'T':0x6E, 'V':b'\0'}, IE=ExtDRXParam()),
|
|
Type1TV('UPIntegrityInd', val={'T':0xC, 'V':0}, IE=UPIntegrityInd()),
|
|
Type4TLV('MSNetCap', val={'T':0x31, 'V':b'\0\0'},
|
|
IE=ms_network_capability_value_part),
|
|
Type4TLV('MSRACap', val={'T':0x33, 'V':5*b'\0'},
|
|
IE=ms_ra_capability_value_part)
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Routing Area Update Complete
|
|
# TS 24.008, section 9.4.16
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMRoutingAreaUpdateComplete(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':10}),
|
|
Type4TLV('RcvNPDUNumList', val={'T':0x26, 'V':b'\0\0'},
|
|
IE=receive_npdu_number_list_value),
|
|
Type4TLV('InterRATHOInfo', val={'T':0x27, 'V':b'\0'}),
|
|
Type4TLV('EUTRANInterRATHOInfo', val={'T':0x2B, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Routing Area Update Reject
|
|
# TS 24.008, section 9.4.17
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMRoutingAreaUpdateReject(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':11}),
|
|
Type3V('GMMCause', val={'V':b'\x11'}, bl={'V':8}, IE=GMMCause()),
|
|
Uint('spare', bl=4),
|
|
Type1V('ForceStdby', dic=ForceStdby_dict),
|
|
Type4TLV('T3302', val={'T':0x2A, 'V':b'\0'}, IE=GPRSTimer()),
|
|
Type4TLV('T3346', val={'T':0x3A, 'V':b'\0'}, IE=GPRSTimer())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# GMM Status
|
|
# TS 24.008, section 9.4.18
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMStatus(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':32}),
|
|
Type3V('GMMCause', val={'V':b'\x11'}, bl={'V':8}, IE=GMMCause())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# GMM Information
|
|
# TS 24.008, section 9.4.19
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMInformation(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':33}),
|
|
Type4TLV('NetFullName', val={'T':0x43, 'V':b'\0'}, IE=NetworkName()),
|
|
Type4TLV('NetShortName', val={'T':0x45, 'V':b'\0'}, IE=NetworkName()),
|
|
Type3TV('LocalTimeZone', val={'T':0x46, 'V':b'\0'}, bl={'V':8}),
|
|
Type3TV('UnivTimeAndTimeZone', val={'T':0x47, 'V':7*b'\0'}, bl={'V':56},
|
|
IE=TimeZoneTime()),
|
|
Type4TLV('LSAIdentity', val={'T':0x48, 'V':b''}),
|
|
Type4TLV('DLSavingTime', val={'T':0x49, 'V':b'\0'}, IE=DLSavingTime())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Service Request
|
|
# TS 24.008, section 9.4.20
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMServiceRequest(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':12}),
|
|
Type1V('ServiceType', dic=ServiceType_dict),
|
|
Type1V('CKSN', dic=CKSN_dict),
|
|
Type4LV('PTMSI', val={'V':b'\xf4\0\0\0\0'}, IE=ID()),
|
|
Type4TLV('PDPCtxtStat', val={'T':0x32, 'V':b'\0\0'}, IE=PDPCtxtStat()),
|
|
Type4TLV('MBMSCtxtStat', val={'T':0x35, 'V':b''}, IE=MBMSCtxtStat()),
|
|
Type4TLV('ULDataStat', val={'T':0x36, 'V':b'\0\0'}, IE=ULDataStat()),
|
|
Type1TV('DeviceProp', val={'T':0xD, 'V':0}, IE=DeviceProp())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Service Accept
|
|
# TS 24.008, section 9.4.21
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMServiceAccept(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':13}),
|
|
Type4TLV('PDPCtxtStat', val={'T':0x32, 'V':b'\0\0'}, IE=PDPCtxtStat()),
|
|
Type4TLV('MBMSCtxtStat', val={'T':0x35, 'V':b''}, IE=MBMSCtxtStat()),
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Service Reject
|
|
# TS 24.008, section 9.4.22
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class GMMServiceReject(Layer3):
|
|
_GEN = (
|
|
GMMHeader(val={'Type':14}),
|
|
Type3V('GMMCause', val={'V':b'\x11'}, bl={'V':8}, IE=GMMCause()),
|
|
Type4TLV('T3346', val={'T':0x3A, 'V':b'\0'}, IE=GPRSTimer())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# GMM dispatchers
|
|
#------------------------------------------------------------------------------#
|
|
|
|
GMMTypeMOClasses = {
|
|
1 : GMMAttachRequest,
|
|
2 : GMMAttachAccept,
|
|
3 : GMMAttachComplete,
|
|
4 : GMMAttachReject,
|
|
5 : GMMDetachRequestMO,
|
|
6 : GMMDetachAcceptMO,
|
|
8 : GMMRoutingAreaUpdateRequest,
|
|
9 : GMMRoutingAreaUpdateAccept,
|
|
10: GMMRoutingAreaUpdateComplete,
|
|
11: GMMRoutingAreaUpdateReject,
|
|
12: GMMServiceRequest,
|
|
13: GMMServiceAccept,
|
|
14: GMMServiceReject,
|
|
16: GMMPTMSIReallocationCommand,
|
|
17: GMMPTMSIReallocationComplete,
|
|
18: GMMAuthenticationCipheringRequest,
|
|
19: GMMAuthenticationCipheringResponse,
|
|
20: GMMAuthenticationCipheringReject,
|
|
28: GMMAuthenticationCipheringFailure,
|
|
21: GMMIdentityRequest,
|
|
22: GMMIdentityResponse,
|
|
32: GMMStatus,
|
|
33: GMMInformation
|
|
}
|
|
|
|
GMMTypeMTClasses = {
|
|
1 : GMMAttachRequest,
|
|
2 : GMMAttachAccept,
|
|
3 : GMMAttachComplete,
|
|
4 : GMMAttachReject,
|
|
5 : GMMDetachRequestMT,
|
|
6 : GMMDetachAcceptMT,
|
|
8 : GMMRoutingAreaUpdateRequest,
|
|
9 : GMMRoutingAreaUpdateAccept,
|
|
10: GMMRoutingAreaUpdateComplete,
|
|
11: GMMRoutingAreaUpdateReject,
|
|
12: GMMServiceRequest,
|
|
13: GMMServiceAccept,
|
|
14: GMMServiceReject,
|
|
16: GMMPTMSIReallocationCommand,
|
|
17: GMMPTMSIReallocationComplete,
|
|
18: GMMAuthenticationCipheringRequest,
|
|
19: GMMAuthenticationCipheringResponse,
|
|
20: GMMAuthenticationCipheringReject,
|
|
28: GMMAuthenticationCipheringFailure,
|
|
21: GMMIdentityRequest,
|
|
22: GMMIdentityResponse,
|
|
32: GMMStatus,
|
|
33: GMMInformation
|
|
}
|
|
|
|
def get_gmm_msg_mo_instances():
|
|
return {k: GMMTypeMOClasses[k]() for k in GMMTypeMOClasses}
|
|
|
|
def get_gmm_msg_mt_instances():
|
|
return {k: GMMTypeMTClasses[k]() for k in GMMTypeMTClasses}
|
|
|