524 lines
21 KiB
Python
524 lines
21 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_SM.py
|
|
# * Created : 2017-06-22
|
|
# * Authors : Benoit Michau
|
|
# *--------------------------------------------------------
|
|
#*/
|
|
|
|
__all__ = [
|
|
'SMActivateMBMSContextAccept',
|
|
'SMActivateMBMSContextReject',
|
|
'SMActivateMBMSContextRequest',
|
|
'SMActivatePDPContextAccept',
|
|
'SMActivatePDPContextReject',
|
|
'SMActivatePDPContextRequest',
|
|
'SMActivateSecondaryPDPContextAccept',
|
|
'SMActivateSecondaryPDPContextReject',
|
|
'SMActivateSecondaryPDPContextRequest',
|
|
'SMDeactivatePDPContextAccept',
|
|
'SMDeactivatePDPContextRequest',
|
|
'SMModifyPDPContextAcceptMO',
|
|
'SMModifyPDPContextAcceptMT',
|
|
'SMModifyPDPContextReject',
|
|
'SMModifyPDPContextRequestMO',
|
|
'SMModifyPDPContextRequestMT',
|
|
'SMNotification',
|
|
'SMRequestMBMSContextActivation',
|
|
'SMRequestMBMSContextActivationReject',
|
|
'SMRequestPDPContextActivation',
|
|
'SMRequestPDPContextActivationReject',
|
|
'SMRequestSecondaryPDPContextActivation',
|
|
'SMRequestSecondaryPDPContextActivationReject',
|
|
'SMStatus',
|
|
#
|
|
'SMTypeClasses',
|
|
'get_sm_msg_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 .TS24007 import *
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# GPRS Session Management header
|
|
# TS 24.008, section 10.1 to 10.4
|
|
#------------------------------------------------------------------------------#
|
|
|
|
# PS Mobility Management procedures dict
|
|
_PS_SM_dict = {
|
|
65: "GPRS - Activate PDP context request",
|
|
66: "GPRS - Activate PDP context accept",
|
|
67: "GPRS - Activate PDP context reject",
|
|
68: "GPRS - Request PDP context activation",
|
|
69: "GPRS - Request PDP context activation rejection",
|
|
70: "GPRS - Deactivate PDP context request",
|
|
71: "GPRS - Deactivate PDP context accept",
|
|
72: "GPRS - Modify PDP context request(Network to MS direction)",
|
|
73: "GPRS - Modify PDP context accept (MS to network direction)",
|
|
74: "GPRS - Modify PDP context request(MS to network direction)",
|
|
75: "GPRS - Modify PDP context accept (Network to MS direction)",
|
|
76: "GPRS - Modify PDP context reject",
|
|
77: "GPRS - Activate secondary PDP context request",
|
|
78: "GPRS - Activate secondary PDP context accept",
|
|
79: "GPRS - Activate secondary PDP context reject",
|
|
85: "GPRS - SM Status",
|
|
86: "GPRS - Activate MBMS Context Request",
|
|
87: "GPRS - Activate MBMS Context Accept",
|
|
88: "GPRS - Activate MBMS Context Reject",
|
|
89: "GPRS - Request MBMS Context Activation",
|
|
90: "GPRS - Request MBMS Context Activation Reject",
|
|
91: "GPRS - Request Secondary PDP Context Activation",
|
|
92: "GPRS - Request Secondary PDP Context Activation Reject",
|
|
93: "GPRS - Notification"
|
|
}
|
|
|
|
class SMHeader(Envelope):
|
|
_GEN = (
|
|
TIPD(val={'ProtDisc': 10}),
|
|
Uint8('Type', val=85, dic=_PS_SM_dict),
|
|
)
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Activate PDP context request
|
|
# TS 24.008, section 9.5.1
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMActivatePDPContextRequest(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':65}),
|
|
Type3V('NSAPI', val={'V':b'\x05'}, bl={'V':8}, IE=NSAPI()),
|
|
Type3V('LLC_SAPI', val={'V':b'\0'}, bl={'V':8}, IE=LLC_SAPI()),
|
|
Type4LV('QoS', val={'V':11*b'\x00'}, IE=QoS()),
|
|
Type4LV('PDPAddr', val={'V':b'\x00\x01'}, IE=PDPAddr()),
|
|
Type4TLV('APN', val={'T':0x28, 'V':b'\0'}, IE=APN()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type1TV('ReqType', val={'T':0xA, 'V':1}, dic=RequestType_dict),
|
|
Type1TV('DeviceProp', val={'T':0xC, 'V':0}, IE=DeviceProp()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\x00'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Activate PDP context accept
|
|
# TS 24.008, section 9.5.2
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMActivatePDPContextAccept(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':66}),
|
|
Type3V('LLC_SAPI', val={'V':b'\0'}, bl={'V':8}, IE=LLC_SAPI()),
|
|
Type4LV('QoS', val={'V':11*b'\0'}, IE=QoS()),
|
|
Uint('spare', bl=4),
|
|
Type1V('RadioPriority', dic=RadioPrio_dict),
|
|
Type4TLV('PDPAddr', val={'T':0x2B, 'V':b'\0\x01'}, IE=PDPAddr()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type4TLV('PacketFlowId', val={'T':0x34, 'V':b'\0'}, IE=PacketFlowId()),
|
|
Type4TLV('SMCause', val={'T':0x39, 'V':b'\x6f'}, IE=SMCause()),
|
|
Type1TV('ConType', val={'T':0xB, 'V':0}, dic=ConnectivityType_dict),
|
|
Type1TV('WLANOffloadInd', val={'T':0xC, 'V':0}, IE=WLANOffloadAccept()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Activate PDP context reject
|
|
# TS 24.008, section 9.5.3
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMActivatePDPContextReject(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':67}),
|
|
Type3V('SMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=SMCause()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type4TLV('BackOffTimer', val={'T':0x37, 'V':b'\0'}, IE=GPRSTimer3()),
|
|
Type4TLV('ReattemptInd', val={'T':0x6B, 'V':b'\0'}, IE=ReattemptInd()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Activate Secondary PDP Context Request
|
|
# TS 24.008, section 9.5.4
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMActivateSecondaryPDPContextRequest(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':77}),
|
|
Type3V('NSAPI', val={'V':b'\x05'}, bl={'V':8}, IE=NSAPI()),
|
|
Type3V('LLC_SAPI', val={'V':b'\0'}, bl={'V':8}, IE=LLC_SAPI()),
|
|
Type4LV('QoS', val={'V':11*b'\0'}, IE=QoS()),
|
|
Type4LV('LinkedTI', val={'V':b'\0'}, IE=TI()),
|
|
Type4TLV('TFT', val={'T':0x36, 'V':b'\0'}, IE=TFT()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type1TV('DeviceProp', val={'T':0xC, 'V':0}, IE=DeviceProp()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Activate Secondary PDP Context Accept
|
|
# TS 24.008, section 9.5.5
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMActivateSecondaryPDPContextAccept(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':78}),
|
|
Type3V('LLC_SAPI', val={'V':b'\0'}, bl={'V':8}, IE=LLC_SAPI()),
|
|
Type4LV('QoS', val={'V':11*b'\0'}, IE=QoS()),
|
|
Uint('spare', bl=4),
|
|
Type1V('RadioPriority', dic=RadioPrio_dict),
|
|
Type4TLV('PacketFlowId', val={'T':0x34, 'V':b'\0'}, IE=PacketFlowId()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type1TV('WLANOffloadInd', val={'T':0xC, 'V':0}, IE=WLANOffloadAccept()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Activate Secondary PDP Context Reject
|
|
# TS 24.008, section 9.5.6
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMActivateSecondaryPDPContextReject(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':79}),
|
|
Type3V('SMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=SMCause()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type4TLV('BackOffTimer', val={'T':0x37, 'V':b'\0'}, IE=GPRSTimer3()),
|
|
Type4TLV('ReattemptInd', val={'T':0x6B, 'V':b'\0'}, IE=ReattemptInd()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Request PDP Context Activation
|
|
# TS 24.008, section 9.5.7
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMRequestPDPContextActivation(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':68}),
|
|
Type4LV('PDPAddr', val={'V':b'\0\x01'}, IE=PDPAddr()),
|
|
Type4TLV('APN', val={'T':0x28, 'V':b'\0'}, IE=APN()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Request PDP Context Activation Rejection
|
|
# TS 24.008, section 9.5.8
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMRequestPDPContextActivationReject(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':69}),
|
|
Type3V('SMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=SMCause()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Modify PDP context request (Network to MS direction)
|
|
# TS 24.008, section 9.5.9
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMModifyPDPContextRequestMT(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':72}),
|
|
Uint('spare', bl=4),
|
|
Type1V('RadioPriority', dic=RadioPrio_dict),
|
|
Type3V('LLC_SAPI', val={'V':b'\0'}, bl={'V':8}, IE=LLC_SAPI()),
|
|
Type4LV('QoS', val={'V':11*b'\0'}, IE=QoS()),
|
|
Type4TLV('PDPAddr', val={'T':0x2B, 'V':b'\0\x01'}, IE=PDPAddr()),
|
|
Type4TLV('PacketFlowId', val={'T':0x34, 'V':b'\0'}, IE=PacketFlowId()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type4TLV('TFT', val={'T':0x36, 'V':b'\0'}, IE=TFT()),
|
|
Type1TV('WLANOffloadInd', val={'T':0xC, 'V':0}, IE=WLANOffloadAccept()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Modify PDP context request (MS to Network direction)
|
|
# TS 24.008, section 9.5.10
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMModifyPDPContextRequestMO(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':74}),
|
|
Type3TV('LLC_SAPI', val={'T':0x32, 'V':b'\0'}, bl={'V':8}, IE=LLC_SAPI()),
|
|
Type4TLV('QoS', val={'T':0x30, 'V':11*b'\0'}, IE=QoS()),
|
|
Type4TLV('TFT', val={'T':0x31, 'V':b'\0'}, IE=TFT()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type1TV('DeviceProp', val={'T':0xC, 'V':0}, IE=DeviceProp()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Modify PDP Context Accept (MS to Network direction)
|
|
# TS 24.008, section 9.5.11
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMModifyPDPContextAcceptMO(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':73}),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Modify PDP Context Accept (Network to MS direction)
|
|
# TS 24.008, section 9.5.12
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMModifyPDPContextAcceptMT(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':75}),
|
|
Type4TLV('QoS', val={'T':0x30, 'V':11*b'\0'}, IE=QoS()),
|
|
Type3TV('LLC_SAPI', val={'T':0x32, 'V':b'\0'}, bl={'V':8}, IE=LLC_SAPI()),
|
|
Type1TV('RadioPriority', val={'T':0x8, 'V':0}, IE=RadioPriority()),
|
|
Type4TLV('PacketFlowId', val={'T':0x34, 'V':b'\0'}, IE=PacketFlowId()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type1TV('WLANOffloadInd', val={'T':0xC, 'V':0}, IE=WLANOffloadAccept()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Modify PDP Context Reject
|
|
# TS 24.008, section 9.5.13
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMModifyPDPContextReject(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':76}),
|
|
Type3V('SMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=SMCause()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type4TLV('BackOffTimer', val={'T':0x37, 'V':b'\0'}, IE=GPRSTimer3()),
|
|
Type4TLV('ReattemptInd', val={'T':0x6B, 'V':b'\0'}, IE=ReattemptInd()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Deactivate PDP Context Request
|
|
# TS 24.008, section 9.5.14
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMDeactivatePDPContextRequest(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':70}),
|
|
Type3V('SMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=SMCause()),
|
|
Type1TV('TearDownInd', val={'T':0x9, 'V':0}, IE=TearDownInd()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type4TLV('MBMSProtConfig', val={'T':0x35, 'V':b'\0'}),
|
|
Type4TLV('T3396', val={'T':0x37, 'V':b'\0'}, IE=GPRSTimer3()),
|
|
Type1TV('WLANOffloadInd', val={'T':0xC, 'V':0}, IE=WLANOffloadAccept())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Deactivate PDP Context Accept
|
|
# TS 24.008, section 9.5.15
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMDeactivatePDPContextAccept(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':71}),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type4TLV('MBMSProtConfig', val={'T':0x35, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Request Secondary PDP Context Activation
|
|
# TS 24.008, section 9.5.15a
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMRequestSecondaryPDPContextActivation(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':91}),
|
|
Type4LV('QoS', val={'V':11*b'\0'}, IE=QoS()),
|
|
Type4LV('LinkedTI', val={'V':b'\0'}, IE=TI()),
|
|
Type4TLV('TFT', val={'T':0x36, 'V':b'\0'}, IE=TFT()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type1TV('WLANOffloadInd', val={'T':0xC, 'V':0}, IE=WLANOffloadAccept()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Request Secondary PDP Context Activation Reject
|
|
# TS 24.008, section 9.5.15b
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMRequestSecondaryPDPContextActivationReject(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':92}),
|
|
Type3V('SMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=SMCause()),
|
|
Type4TLV('ProtConfig', val={'T':0x27, 'V':b'\x80'}, IE=ProtConfig()),
|
|
Type4TLV('NBIFOMContainer', val={'T':0x33, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Notification
|
|
# TS 24.008, section 9.5.16a
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMNotification(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':93}),
|
|
Type4LV('NotificationInd', val={'V':b'\0'}, IE=NotificationInd())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# SM Status
|
|
# TS 24.008, section 9.5.21
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMStatus(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':85}),
|
|
Type3V('SMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=SMCause())
|
|
)
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Activate MBMS Context Request
|
|
# TS 24.008, section 9.5.22
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMActivateMBMSContextRequest(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':86}),
|
|
Type3V('MBMS_NSAPI', val={'V':b'\0'}, bl={'V':8}, IE=ENSAPI()),
|
|
Type3V('LLC_SAPI', val={'V':b'\0'}, bl={'V':8}, IE=LLC_SAPI()),
|
|
Type4LV('MBMSBearerCap', val={'V':b'\0'}, IE=MBMSBearerCap()),
|
|
Type4LV('MCastAddr', val={'V':b'\0\x01'}, IE=PDPAddr()),
|
|
Type4LV('APN', val={'V':b'\0'}, IE=APN()),
|
|
Type4TLV('MBMSProtConfig', val={'T':0x35, 'V':b'\0'}),
|
|
Type1TV('DeviceProp', val={'T':0xC, 'V':0}, IE=DeviceProp())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Activate MBMS Context Accept
|
|
# TS 24.008, section 9.5.23
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMActivateMBMSContextAccept(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':87}),
|
|
Type4LV('TMGI', val={'V':b'\0\0\0'}, IE=TMGI()),
|
|
Type3V('LLC_SAPI', val={'V':b'\0'}, bl={'V':8}, IE=LLC_SAPI()),
|
|
Type4TLV('MBMSProtConfig', val={'T':0x35, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Activate MBMS Context Reject
|
|
# TS 24.008, section 9.5.24
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMActivateMBMSContextReject(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':88}),
|
|
Type3V('SMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=SMCause()),
|
|
Type4TLV('MBMSProtConfig', val={'T':0x35, 'V':b'\0'}),
|
|
Type4TLV('BackOffTimer', val={'T':0x37, 'V':b'\0'}, IE=GPRSTimer3()),
|
|
Type4TLV('ReattemptInd', val={'T':0x6B, 'V':b'\0'}, IE=ReattemptInd())
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Request MBMS Context Activation
|
|
# TS 24.008, section 9.5.25
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMRequestMBMSContextActivation(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':89}),
|
|
Type3V('LinkedNSAPI', val={'V':b'\x05'}, bl={'V':8}, IE=NSAPI()),
|
|
Type4LV('MCastAddr', val={'V':b'\0\x01'}, IE=PDPAddr()),
|
|
Type4LV('APN', val={'V':b'\0'}, IE=APN()),
|
|
Type4TLV('MBMSProtConfig', val={'T':0x35, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# Request MBMS Context Activation Reject
|
|
# TS 24.008, section 9.5.26
|
|
#------------------------------------------------------------------------------#
|
|
|
|
class SMRequestMBMSContextActivationReject(Layer3):
|
|
_GEN = (
|
|
SMHeader(val={'Type':90}),
|
|
Type3V('SMCause', val={'V':b'\x6f'}, bl={'V':8}, IE=SMCause()),
|
|
Type4TLV('MBMSProtConfig', val={'T':0x35, 'V':b'\0'})
|
|
)
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
# SM dispatchers
|
|
#------------------------------------------------------------------------------#
|
|
|
|
SMTypeClasses = {
|
|
65: SMActivatePDPContextRequest,
|
|
66: SMActivatePDPContextAccept,
|
|
67: SMActivatePDPContextReject,
|
|
68: SMRequestPDPContextActivation,
|
|
69: SMRequestPDPContextActivationReject,
|
|
70: SMDeactivatePDPContextRequest,
|
|
71: SMDeactivatePDPContextAccept,
|
|
72: SMModifyPDPContextRequestMT,
|
|
73: SMModifyPDPContextAcceptMO,
|
|
74: SMModifyPDPContextRequestMO,
|
|
75: SMModifyPDPContextAcceptMT,
|
|
76: SMModifyPDPContextReject,
|
|
77: SMActivateSecondaryPDPContextRequest,
|
|
78: SMActivateSecondaryPDPContextAccept,
|
|
79: SMActivateSecondaryPDPContextReject,
|
|
85: SMStatus,
|
|
86: SMActivateMBMSContextRequest,
|
|
87: SMActivateMBMSContextAccept,
|
|
88: SMActivateMBMSContextReject,
|
|
89: SMRequestMBMSContextActivation,
|
|
90: SMRequestMBMSContextActivationReject,
|
|
91: SMRequestSecondaryPDPContextActivation,
|
|
92: SMRequestSecondaryPDPContextActivationReject,
|
|
93: SMNotification
|
|
}
|
|
|
|
def get_sm_msg_instances():
|
|
return {k: SMTypeClasses[k]() for k in SMTypeClasses}
|
|
|