pycrate/pycrate_mobile/TS29002_MAPAppCtx.py

174 lines
6.2 KiB
Python
Raw Normal View History

# * coding: UTF8 *
#/**
# * Software Name : pycrate
# * Version : 0.4.0
# *
# * Copyright 2019. 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_mobile/TS29002_MAPAppCtx.py
# * Created : 2019-01-22
# * Authors : Benoit Michau
# *--------------------------------------------------------
#*/
from pycrate_asn1dir.TCAP_MAPv2v3 import GLOBAL as GLOBAL_MAPv2v3
#------------------------------------------------------------------------------#
# MAP application context functions
#------------------------------------------------------------------------------#
Operations = GLOBAL_MAPv2v3.MOD['MAPv2v3-Protocol']['Supported-MAP-Operations']
OperationPkgs = GLOBAL_MAPv2v3.MOD['MAPv2v3-Application']['Supported-MAP-OperationPackages']
ApplicationCtxs = GLOBAL_MAPv2v3.MOD['MAPv2v3-Application']['Supported-MAP-ApplicationContexts']
Errors_v2 = GLOBAL_MAPv2v3.MOD['MAPv2-Errors']
Errors_v3 = GLOBAL_MAPv2v3.MOD['MAP-Errors']
Errors = {}
for errname in Errors_v3['_val_']:
errval = Errors_v3[errname]._val
errcode = errval['errorCode'][1]
Errors[errcode] = [errval]
for errname in Errors_v2['_val_']:
errval = Errors_v2[errname]._val
errcode = errval['errorCode'][1]
if errcode in Errors:
Errors[errcode].append(errval)
else:
Errors[errcode] = [errval]
def get_error(errcode):
"""returns the list of defined MAP errors for the given error code
There is a single MAP error per errcode per MAP version (v1, v2, v3)
"""
return Errors.get(errcode, [])
def get_operation(opcode):
"""returns the list of defined MAP operations for the given opcode
There is a single MAP operation per opcode per MAP version (v1, v2, v3)
"""
t, op = Operations.get('operationCode', ('local', opcode))
if t == 'M':
# several operation / version
return op
elif t == 'U':
# single operation for all versions
return [op]
else:
# no operation for this opcode
return []
def list_operation_pkg_names():
"""returns the list of names of defined MAP operation-packages
"""
names = []
for name in GLOBAL_MAPv2v3.MOD['MAPv2v3-Application']['_val_']:
if name.split('-')[-2][-7:] == 'Package':
names.append(name)
return names
def list_application_ctx_names():
"""returns the list of names of defined MAP application-contexts
"""
names = []
for name in GLOBAL_MAPv2v3.MOD['MAPv2v3-Application']['_val_']:
if name.split('-')[-2][-7:] == 'Context':
names.append(name)
return names
def get_operation_pkgs(opcode, mode='S'):
"""returns the list of defined MAP operation-packages that include the MAP
operation(s) for the given opcode
mode: 'S' for Supplier (initiator) or 'C' for Consumer (responder)
"""
ret = {}
key = 'Supplier' if mode in ('s', 'S') else 'Consumer'
for opname in list_operation_pkg_names():
opval = GLOBAL_MAPv2v3.MOD['MAPv2v3-Application'][opname]._val
if key not in opval:
continue
for oval in opval[key].getv():
if oval['operationCode'] == ('local', opcode):
if opname in ret:
assert(ret[opname] == opval)
pass
else:
ret[opname] = opval
return ret
def get_application_ctx(oid):
"""returns the defined MAP application-context for the given OID
"""
t, ac = ApplicationCtxs.get('code', oid)
if t == 'M':
assert()
elif t == 'U':
return ac
else:
assert( t == 'N' )
return None
def get_application_ctxs(opcode, mode='I'):
"""returns the list of defined MAP application-contexts that include the MAP
operation(s) for the given opcode
mode: 'I' for Initiator or 'R' for Responder
"""
ret = {}
key = ('Symmetric', 'InitiatorConsumerOf') if mode in ('I', 'i') else ('Symmetric', 'ResponderConsumerOf')
keyrev = ('Symmetric', 'ResponderConsumerOf') if mode in ('I', 'i') else ('Symmetric', 'InitiatorConsumerOf')
for acname in list_application_ctx_names():
acval = GLOBAL_MAPv2v3.MOD['MAPv2v3-Application'][acname]._val
# looking at Supplier within the Initiator potential operation-package
for k in key:
if k in acval:
for opval in acval[k].getv():
# here, we look at "Supplier" within the operation-package
if 'Supplier' in opval:
for oval in opval['Supplier'].getv():
if oval['operationCode'] == ('local', opcode):
if acname in ret:
assert(ret[acname] == acval)
else:
ret[acname] = acval
#
# looking at Consumer within the Responder potential operation-package
for k in keyrev:
if k in acval:
for opval in acval[k].getv():
if 'Consumer' in opval:
for oval in opval['Consumer'].getv():
if oval['operationCode'] == ('local', opcode):
if acname in ret:
assert(ret[acname] == acval)
else:
ret[acname] = acval
#
return ret