2017-11-12 14:18:50 +00:00
|
|
|
|
# -*- coding: UTF-8 -*-
|
|
|
|
|
#/**
|
|
|
|
|
# * Software Name : pycrate
|
2018-02-09 21:23:26 +00:00
|
|
|
|
# * Version : 0.3
|
2017-11-12 14:18:50 +00:00
|
|
|
|
# *
|
|
|
|
|
# * Copyright 2017. Benoit Michau. ANSSI.
|
|
|
|
|
# *
|
2018-04-15 19:47:21 +00:00
|
|
|
|
# * 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,
|
2017-11-12 14:18:50 +00:00
|
|
|
|
# * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
2018-04-15 19:47:21 +00:00
|
|
|
|
# * 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
|
2017-11-12 14:18:50 +00:00
|
|
|
|
# *
|
|
|
|
|
# *--------------------------------------------------------
|
|
|
|
|
# * File Name : pycrate_mobile/TS24080_SS.py
|
|
|
|
|
# * Created : 2017-10-26
|
|
|
|
|
# * Authors : Benoit Michau
|
|
|
|
|
# *--------------------------------------------------------
|
|
|
|
|
#*/
|
|
|
|
|
|
2018-02-09 20:58:36 +00:00
|
|
|
|
__all__ = [
|
|
|
|
|
'SSReleaseComplete',
|
|
|
|
|
'SSFacility',
|
|
|
|
|
'SSRegisterMO',
|
|
|
|
|
'SSRegisterMT',
|
|
|
|
|
'SSTypeMOClasses',
|
|
|
|
|
'SSTypeMTClasses',
|
|
|
|
|
'get_ss_msg_mo_instances',
|
|
|
|
|
'get_ss_msg_mt_instances'
|
|
|
|
|
]
|
|
|
|
|
|
2017-11-12 14:18:50 +00:00
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# 3GPP TS 24.080: Mobile radio interface layer 3
|
|
|
|
|
# Supplementary services specification
|
|
|
|
|
# release 13 (d00)
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
|
|
from pycrate_core.utils import *
|
|
|
|
|
from pycrate_core.elt import *
|
|
|
|
|
from pycrate_core.base import *
|
|
|
|
|
|
|
|
|
|
from .TS24007 import *
|
|
|
|
|
from .TS24008_IE import Cause
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# Facility information element
|
|
|
|
|
# TS 24.080, section 3.6
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# Facility is defined using the ASN.1 MAP module !
|
|
|
|
|
|
|
|
|
|
_WITH_ASN1 = True
|
|
|
|
|
|
|
|
|
|
if _WITH_ASN1:
|
|
|
|
|
|
|
|
|
|
from threading import Event
|
|
|
|
|
from pycrate_asn1dir import SS
|
|
|
|
|
from pycrate_asn1rt import wrapper
|
|
|
|
|
|
|
|
|
|
ASN_SS_READY = Event()
|
|
|
|
|
ASN_SS_READY.set()
|
|
|
|
|
_ACQUIRE_TO = 0.005
|
|
|
|
|
|
|
|
|
|
def asn_ss_acquire():
|
|
|
|
|
if not ASN_SS_READY.is_set():
|
|
|
|
|
ASN_SS_READY.wait(_ACQUIRE_TO)
|
|
|
|
|
if not ASN_SS_READY.is_set():
|
|
|
|
|
raise(PycrateErr('unable to acquire the SS ASN.1 module'))
|
|
|
|
|
ASN_SS_READY.clear()
|
|
|
|
|
|
|
|
|
|
def asn_ss_release():
|
|
|
|
|
ASN_SS_READY.set()
|
|
|
|
|
|
|
|
|
|
Facility = wrapper.gen_ber_wrapper(SS.SS_Facility.Facility, asn_ss_acquire, asn_ss_release)
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
|
|
class Facility(Buf):
|
|
|
|
|
_rep = REPR_HEX
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# Supplementary service version indicator
|
|
|
|
|
# TS 24.080, section 3.7.2
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
|
|
_SSVersion_dict = {
|
|
|
|
|
0 : 'phase 2 service, ellipsis notation, and phase 2 error handling is supported',
|
|
|
|
|
1 : 'SS-Protocol version 3 is supported, and phase 2 error handling is supported'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class SSVersion(Uint8):
|
|
|
|
|
_dic = _SSVersion_dict
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# Supplementary Services header
|
|
|
|
|
# TS 24.080, section 3.4
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
|
|
_SS_dict = {
|
|
|
|
|
42 : 'Clearing message - RELEASE COMPLETE',
|
|
|
|
|
58 : 'Misc - FACILITY',
|
|
|
|
|
59 : 'Misc - REGISTER'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class SSHeader(Envelope):
|
|
|
|
|
_GEN = (
|
2018-02-09 20:58:36 +00:00
|
|
|
|
TIPD(val={'ProtDisc': 11}),
|
2017-11-12 14:18:50 +00:00
|
|
|
|
Uint('Seqn', bl=2),
|
|
|
|
|
Uint('Type', val=58, bl=6, dic=_SS_dict)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# Facility
|
|
|
|
|
# TS 24.080, section 2.3
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
|
|
class SSFacility(Layer3):
|
2018-02-09 20:58:36 +00:00
|
|
|
|
_GEN = (
|
|
|
|
|
SSHeader(val={'Type':58}),
|
2017-11-12 14:18:50 +00:00
|
|
|
|
Type4LV('Facility', val={'V':b'\0'}, IE=Facility()),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# Register (network to MS direction)
|
|
|
|
|
# TS 24.080, section 2.4.1
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
|
|
class SSRegisterMT(Layer3):
|
2018-02-09 20:58:36 +00:00
|
|
|
|
_GEN = (
|
|
|
|
|
SSHeader(val={'Type':59}),
|
|
|
|
|
Type4TLV('Facility', val={'T':0x1C, 'V':b''}),
|
2017-11-12 14:18:50 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# Register (MS to network direction)
|
|
|
|
|
# TS 24.080, section 2.4.2
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
|
|
class SSRegisterMO(Layer3):
|
2018-02-09 20:58:36 +00:00
|
|
|
|
_GEN = (
|
|
|
|
|
SSHeader(val={'Type':59}),
|
|
|
|
|
Type4TLV('Facility', val={'T':0x1C, 'V':b''}, IE=Facility()),
|
|
|
|
|
Type4TLV('SSVersion', val={'T':0x7F, 'V':b'\0'}, IE=SSVersion())
|
2017-11-12 14:18:50 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# Release complete
|
|
|
|
|
# TS 24.080, section 2.5
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
|
|
class SSReleaseComplete(Layer3):
|
2018-02-09 20:58:36 +00:00
|
|
|
|
_GEN = (
|
|
|
|
|
SSHeader(val={'Type':42}),
|
|
|
|
|
Type4TLV('Cause', val={'T':0x8, 'V':b'\x80\x80'}, IE=Cause()),
|
|
|
|
|
Type4TLV('Facility', val={'T':0x1C, 'V':b''})
|
2017-11-12 14:18:50 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
# SS dispatcher
|
|
|
|
|
#------------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
|
|
SSTypeMOClasses = {
|
|
|
|
|
42 : SSReleaseComplete,
|
|
|
|
|
58 : SSFacility,
|
|
|
|
|
59 : SSRegisterMO
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SSTypeMTClasses = {
|
|
|
|
|
42 : SSReleaseComplete,
|
|
|
|
|
58 : SSFacility,
|
|
|
|
|
59 : SSRegisterMT
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def get_ss_msg_mo_instances():
|
|
|
|
|
return {k: SSTypeMOClasses[k]() for k in SSTypeMOClasses}
|
|
|
|
|
|
|
|
|
|
def get_ss_msg_mt_instances():
|
|
|
|
|
return {k: SSTypeMTClasses[k]() for k in SSTypeMTClasses}
|
|
|
|
|
|