686 lines
21 KiB
Python
686 lines
21 KiB
Python
# -*- coding: UTF-8 -*-
|
|
#/**
|
|
# * Software Name : pycrate
|
|
# * Version : 0.4
|
|
# *
|
|
# * Copyright 2017. Benoit Michau. ANSSI.
|
|
# * Copyright 2018. 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/SIGTRAN.py
|
|
# * Created : 2017-11-24
|
|
# * Authors : Benoit Michau
|
|
# *--------------------------------------------------------
|
|
#*/
|
|
|
|
from pycrate_core.utils import *
|
|
from pycrate_core.elt import *
|
|
from pycrate_core.base import *
|
|
from pycrate_core.charpy import *
|
|
|
|
|
|
# http://www.iana.org/assignments/sigtran-adapt
|
|
|
|
# SIGTRAN messages class
|
|
MGMT = 0
|
|
TRANS = 1
|
|
SSNM = 2
|
|
ASPSM = 3
|
|
ASPTM = 4
|
|
QPTM = 5
|
|
MAUP = 6
|
|
CONLESS = 7
|
|
CONOR = 8
|
|
RKM = 9
|
|
IIM = 10
|
|
M2PA = 11
|
|
SEC = 12
|
|
BPT = 13
|
|
V5PTM = 14
|
|
|
|
Class_dict = {
|
|
MGMT : 'Management Message',
|
|
TRANS : 'Transfer Messages',
|
|
SSNM : 'SS7 Signalling Network Management Messages',
|
|
ASPSM : 'ASP State Maintenance Messages',
|
|
ASPTM : 'ASP Traffic Maintenance Messages',
|
|
QPTM : 'Q.921/Q.931 Boundary Primitives Transport Messages',
|
|
MAUP : 'MTP2 User Adaptation Messages',
|
|
CONLESS : 'Connectionless Messages',
|
|
CONOR : 'Connection-Oriented Messages',
|
|
RKM : 'Routing Key Management Messages',
|
|
IIM : 'Interface Identifier Management Messages',
|
|
M2PA : 'M2PA Messages',
|
|
SEC : 'Security Messages',
|
|
BPT : 'DPNSS/DASS2 Boundary Primitives Transport Messages',
|
|
V5PTM : 'V5 Boundary Primitives Transport Messages',
|
|
}
|
|
|
|
# SIGTRAN MGMT messages type
|
|
MGMT_ERR = 0
|
|
MGMT_NTFY = 1
|
|
MGMT_TEISREQ = 2
|
|
MGMT_TEISCONF = 3
|
|
MGMT_TEISIND = 4
|
|
MGMT_DLCSREQ = 5
|
|
MGMT_DLCSCONF = 6
|
|
MGMT_DLCSIND = 7
|
|
MGMT_TEIQREQ = 8
|
|
|
|
TypeMGMT_dict = {
|
|
MGMT_ERR : 'Error',
|
|
MGMT_NTFY : 'Notify (NTFY)',
|
|
MGMT_TEISREQ : 'TEI Status Request (TEISREQ)',
|
|
MGMT_TEISCONF : 'TEI Status Confirm (TEIS',
|
|
MGMT_TEISIND : 'TEI Status Indication',
|
|
MGMT_DLCSREQ : 'DLC Status Request',
|
|
MGMT_DLCSCONF : 'DLC Status Confirm',
|
|
MGMT_DLCSIND : 'DLC Status Indication',
|
|
MGMT_TEIQREQ : 'TEI Query Request',
|
|
}
|
|
|
|
# SIGTRAN TRANS message type
|
|
TRANS_DATA = 1
|
|
|
|
TypeTRANS_dict = {
|
|
TRANS_DATA : 'Payload data'
|
|
}
|
|
|
|
# SIGTRAN SSNM messages type
|
|
SSNM_DUNA = 1
|
|
SSNM_DAVA = 2
|
|
SSNM_DAUD = 3
|
|
SSNM_SCON = 4
|
|
SSNM_DPU = 5
|
|
SSNM_DRST = 6
|
|
|
|
TypeSSNM_dict = {
|
|
SSNM_DUNA : 'Destination Unavailable',
|
|
SSNM_DAVA : 'Destination Available',
|
|
SSNM_DAUD : 'Destination State Audit',
|
|
SSNM_SCON : 'Signalling Congestion',
|
|
SSNM_DPU : 'Destination User Part Unavailable',
|
|
SSNM_DRST : 'Destination Restricted'
|
|
}
|
|
|
|
# SIGTRAN ASPSM messages type
|
|
ASPSM_UP = 1
|
|
ASPSM_DOWN = 2
|
|
ASPSM_BEAT = 3
|
|
ASPSM_UPACK = 4
|
|
ASPSM_DOWNACK = 5
|
|
ASPSM_BEATACK = 6
|
|
|
|
TypeASPSM_dict = {
|
|
ASPSM_UP : 'ASP Up',
|
|
ASPSM_DOWN : 'ASP Down',
|
|
ASPSM_BEAT : 'Heartbeat',
|
|
ASPSM_UPACK : 'ASP Up Ack',
|
|
ASPSM_DOWNACK : 'ASP Down Ack',
|
|
ASPSM_BEATACK : 'Heartbeat Ack'
|
|
}
|
|
|
|
# SIGTRAN ASPTM messages type
|
|
ASPTM_ACTIVE = 1
|
|
ASPTM_INACTIVE = 2
|
|
ASPTM_ACTIVEACK = 3
|
|
ASPTM_INACTIVEACK = 4
|
|
|
|
TypeASPTM_dict = {
|
|
ASPTM_ACTIVE : 'ASP Active',
|
|
ASPTM_INACTIVE : 'ASP Inactive',
|
|
ASPTM_ACTIVEACK : 'ASP Active Ack',
|
|
ASPTM_INACTIVEACK : 'ASP Inactive Ack'
|
|
}
|
|
|
|
# SIGTRAN QPTM messages type
|
|
QPTM_DATREQ = 1
|
|
QPTM_DATIND = 2
|
|
QPTM_UNITREQ = 3
|
|
QPTM_UNITIND = 4
|
|
QPTM_ESTREQ = 5
|
|
QPTM_ESTCONF = 6
|
|
QPTM_ESTIND = 7
|
|
QPTM_RELREQ = 8
|
|
QPTM_RELCONF = 9
|
|
QPTM_RELIND = 10
|
|
|
|
TypeQPTM_dict = {
|
|
QPTM_DATREQ : 'Data Request Message ',
|
|
QPTM_DATIND : 'Data Indication Message ',
|
|
QPTM_UNITREQ : 'Unit Data Request Message',
|
|
QPTM_UNITIND : 'Unit Data Indication Message',
|
|
QPTM_ESTREQ : 'Establish Request',
|
|
QPTM_ESTCONF : 'Establish Confirm',
|
|
QPTM_ESTIND : 'Establish Indication',
|
|
QPTM_RELREQ : 'Release Request',
|
|
QPTM_RELCONF : 'Release Confirm',
|
|
QPTM_RELIND : 'Release Indication'
|
|
}
|
|
|
|
# SIGTRAN MAUP messages type
|
|
MAUP_DATA = 1
|
|
MAUP_ESTREQ = 2
|
|
MAUP_ESTCONF = 3
|
|
MAUP_RELREQ = 4
|
|
MAUP_RELCONF = 5
|
|
MAUP_RELIND = 6
|
|
MAUP_STATREQ = 7
|
|
MAUP_STATCONF = 8
|
|
MAUP_STATIND = 9
|
|
MAUP_RETRREQ = 10
|
|
MAUP_RETRCONF = 11
|
|
MAUP_RETRIND = 12
|
|
MAUP_RETRCOMP = 13
|
|
MAUP_CONG = 14
|
|
MAUP_DATACK = 15
|
|
|
|
TypeMAUP_dict = {
|
|
MAUP_DATA : 'Data',
|
|
MAUP_ESTREQ : 'Establish Request',
|
|
MAUP_ESTCONF : 'Establish Confirm',
|
|
MAUP_RELREQ : 'Release Request',
|
|
MAUP_RELCONF : 'Release Confirm',
|
|
MAUP_RELIND : 'Release Indication',
|
|
MAUP_STATREQ : 'State Request',
|
|
MAUP_STATCONF : 'State Confirm',
|
|
MAUP_STATIND : 'State Indication',
|
|
MAUP_RETRREQ : 'Data Retrieval Request',
|
|
MAUP_RETRCONF : 'Data Retrieval Confirm',
|
|
MAUP_RETRIND : 'Data Retrieval Indication',
|
|
MAUP_RETRCOMP : 'Data Retrieval Complete Indication',
|
|
MAUP_CONG : 'Congestion Indication',
|
|
MAUP_DATACK : 'Data Acknowledge'
|
|
}
|
|
|
|
# SIGTRAN CONLESS messages type
|
|
CONLESS_CLDT = 1
|
|
CONLESS_CLDR = 2
|
|
|
|
TypeCONLESS_dict = {
|
|
CONLESS_CLDT : 'Connectionless Data Transfer',
|
|
CONLESS_CLDR : 'Connectionless Data Response'
|
|
}
|
|
|
|
# SIGTRAN CONOR messages type
|
|
CONOR_CORE = 1
|
|
CONOR_COAK = 2
|
|
CONOR_COREF = 3
|
|
CONOR_RELRE = 4
|
|
CONOR_RELCO = 5
|
|
CONOR_RESCO = 6
|
|
CONOR_RESRE = 7
|
|
CONOR_CODT = 8
|
|
CONOR_CODA = 9
|
|
CONOR_COERR = 10
|
|
CONOR_COIT = 11
|
|
|
|
TypeCONOR_dict = {
|
|
CONOR_CORE : 'Connection Request',
|
|
CONOR_COAK : 'Connection Acknowledge',
|
|
CONOR_COREF : 'Connection Refused',
|
|
CONOR_RELRE : 'Release Request',
|
|
CONOR_RELCO : 'Release Complete',
|
|
CONOR_RESCO : 'Reset Confirm',
|
|
CONOR_RESRE : 'Reset Request',
|
|
CONOR_CODT : 'Connection Oriented Data Transfer',
|
|
CONOR_CODA : 'Connection Oriented Data Acknowledge',
|
|
CONOR_COERR : 'Connection Oriented Error',
|
|
CONOR_COIT : 'Inactivity Test'
|
|
}
|
|
|
|
# SIGTRAN RKM messages type
|
|
RKM_REGREQ = 1
|
|
RKM_REGRSP = 2
|
|
RKM_DEREGREQ = 3
|
|
RKM_DEREGRSP = 4
|
|
|
|
TypeRKM_dict = {
|
|
RKM_REGREQ : 'Registration Request',
|
|
RKM_REGRSP : 'Registration Response',
|
|
RKM_DEREGREQ : 'Deregistration Request',
|
|
RKM_DEREGRSP : 'Deregistration Response'
|
|
}
|
|
|
|
# SIGTRAN IIM messages type
|
|
IIM_REGREQ = 1
|
|
IIM_REGRSP = 2
|
|
IIM_DEREGREQ = 3
|
|
IIM_DEREGRSP = 4
|
|
|
|
TypeIIM_dict = {
|
|
IIM_REGREQ : 'Registration Request',
|
|
IIM_REGRSP : 'Registration Response',
|
|
IIM_DEREGREQ : 'Deregistration Request',
|
|
IIM_DEREGRSP : 'Deregistration Response'
|
|
}
|
|
|
|
# SIGTRAN M2PA messages type
|
|
M2PA_DATA = 1
|
|
M2PA_STAT = 2
|
|
|
|
TypeM2PA_dict = {
|
|
M2PA_DATA : 'User Data',
|
|
M2PA_STAT : 'Link Status'
|
|
}
|
|
|
|
# SIGTRAN SEC messages type
|
|
SEC_STLS = 1
|
|
SEC_STLSACK = 2
|
|
|
|
TypeSEC_dict = {
|
|
SEC_STLS : 'STARTTLS message',
|
|
SEC_STLSACK : 'STARTTLS_ACK message'
|
|
}
|
|
|
|
# SIGTRAN BPT messages type
|
|
BPT_DATREQ = 1
|
|
BPT_DATIND = 2
|
|
BPT_UNITREQ = 3
|
|
BPT_UNITIND = 4
|
|
BPT_ESTREQ = 5
|
|
BPT_ESTCONF = 6
|
|
BPT_ESTIND = 7
|
|
BPT_RELREQ = 8
|
|
BPT_RELCONF = 9
|
|
BPT_RELIND = 10
|
|
|
|
TypeBPT_dict = {
|
|
BPT_DATREQ : 'Data Request Message ',
|
|
BPT_DATIND : 'Data Indication Message ',
|
|
BPT_UNITREQ : 'Unit Data Request Message',
|
|
BPT_UNITIND : 'Unit Data Indication Message',
|
|
BPT_ESTREQ : 'Establish Request',
|
|
BPT_ESTCONF : 'Establish Confirm',
|
|
BPT_ESTIND : 'Establish Indication',
|
|
BPT_RELREQ : 'Release Request',
|
|
BPT_RELCONF : 'Release Confirm',
|
|
BPT_RELIND : 'Release Indication'
|
|
}
|
|
|
|
# SIGTRAN V5PTM messages type
|
|
V5PTM_DATA = 1
|
|
V5PTM_DATIND = 2
|
|
V5PTM_UNITREQ = 3
|
|
V5PTM_UNITIND = 4
|
|
V5PTM_ESTREQ = 5
|
|
V5PTM_ESTCONF = 6
|
|
V5PTM_ESTIND = 7
|
|
V5PTM_RELREQ = 8
|
|
V5PTM_RELCONF = 9
|
|
V5PTM_RELIND = 10
|
|
V5PTM_LSSTART = 11
|
|
V5PTM_LSSTOP = 12
|
|
V5PTM_LSIND = 13
|
|
V5PTM_SASETREQ = 14
|
|
V5PTM_SASETCONF = 15
|
|
V5PTM_SASTATREQ = 16
|
|
V5PTM_SASTATIND = 17
|
|
V5PTM_ERRIND = 18
|
|
|
|
TypeV5PTM_dict = {
|
|
V5PTM_DATA : 'Data Request Message ',
|
|
V5PTM_DATIND : 'Data Indication Message',
|
|
V5PTM_UNITREQ : 'Unit Data Request Message',
|
|
V5PTM_UNITIND : 'Unit Data Indication Message',
|
|
V5PTM_ESTREQ : 'Establish Request',
|
|
V5PTM_ESTCONF : 'Establish Confirm',
|
|
V5PTM_ESTIND : 'Establish Indication',
|
|
V5PTM_RELREQ : 'Release Request',
|
|
V5PTM_RELCONF : 'Release Confirm',
|
|
V5PTM_RELIND : 'Release Indication',
|
|
V5PTM_LSSTART : 'Link Status Start Reporting',
|
|
V5PTM_LSSTOP : 'Link Status Stop Reporting',
|
|
V5PTM_LSIND : 'Link Status Indication',
|
|
V5PTM_SASETREQ : 'Sa-Bit Set Request',
|
|
V5PTM_SASETCONF : 'Sa-Bit Set Confirm',
|
|
V5PTM_SASTATREQ : 'Sa-Bit Status Request',
|
|
V5PTM_SASTATIND : 'Sa-Bit Status Indication',
|
|
V5PTM_ERRIND : 'Error Indication'
|
|
}
|
|
|
|
# SIGTRAN message parameters
|
|
Params_dict = {
|
|
0 : 'Reserved', # [RFC4233] [RFC3868] [RFC3331]
|
|
1 : 'Interface Identifier', # [RFC4233] [RFC3331] [RFC4129] [RFC3807]
|
|
2 : 'Reserved', # [RFC4233]
|
|
3 : 'Interface Identifier', # [RFC4233] [RFC3331] [RFC4129] [RFC3807]
|
|
4 : 'Info String', # [RFC4233] [RFC3331] [RFC4666] [RFC3868] [RFC4129] [RFC3807]
|
|
5 : 'DLCI', # [RFC4233] [RFC4129]
|
|
6 : 'Routing Context', # [RFC4666] [RFC3868]
|
|
7 : 'Diagnostic Information', # [RFC4233] [RFC3331] [RFC4666] [RFC3868] [RFC4129] [RFC3807]
|
|
8 : 'Interface Identifier', # [RFC4233] [RFC3331] [RFC4129] [RFC3807]
|
|
9 : 'Heartbeat Data', # [RFC4233] [RFC3331] [RFC4666] [RFC3868] [RFC4129] [RFC3807]
|
|
10 : 'Reason', # [RFC4129] [RFC3807]
|
|
11 : 'Traffic Mode Type', # [RFC4233] [RFC3331] [RFC4666] [RFC3868] [RFC4129] [RFC3807]
|
|
12 : 'Error Code', # [RFC4233] [RFC3331] [RFC4666] [RFC3868] [RFC4129] [RFC3807]
|
|
13 : 'Status Type/Information', # [RFC4233] [RFC3331] [RFC4666] [RFC3868] [RFC4129] [RFC3807]
|
|
14 : 'Protocol Data', # [RFC4233] [RFC4129] [RFC3807]
|
|
15 : 'Release Reason', # [RFC4233] [RFC4129] [RFC3807]
|
|
16 : 'Status', # [RFC4233] [RFC4129] [RFC3807]
|
|
17 : 'ASP Identifier', # [RFC3331] [RFC4666] [RFC3868]
|
|
18 : 'Affected Point Code', # [RFC4666] [RFC3868]
|
|
19 : 'Correlation Id', # [RFC3331] [RFC4666] [RFC3868]
|
|
20 : 'Registration Result', # [RFC3868]
|
|
21 : 'Deregistration Result', # [RFC3868]
|
|
22 : 'Registration Status', # [RFC3868]
|
|
23 : 'Deregistration Status', # [RFC3868]
|
|
24 : 'Local Routing Key Identifier', # [RFC3868]
|
|
129 : 'DLCI/EFA', # [RFC3807]
|
|
130 : 'Link Status', # [RFC3807]
|
|
131 : 'Bit ID/Bit Value', # [RFC3807]
|
|
132 : 'Error Reason', # [RFC3807]
|
|
257 : 'SS7 Hop Counter', # [RFC3868]
|
|
258 : 'Source Address', # [RFC3868]
|
|
259 : 'Destination Address', # [RFC3868]
|
|
260 : 'Source Reference Number', # [RFC3868]
|
|
261 : 'Destination Reference Number', # [RFC3868]
|
|
262 : 'SCCP Cause', # [RFC3868]
|
|
263 : 'Sequence Number', # [RFC3868]
|
|
264 : 'Receive Sequence Number', # [RFC3868]
|
|
265 : 'ASP Capabilities', # [RFC3868]
|
|
266 : 'Credit', # [RFC3868]
|
|
267 : 'Data', # [RFC3868]
|
|
268 : 'Cause / User', # [RFC3868]
|
|
269 : 'Network Appearance', # [RFC3868]
|
|
270 : 'Routing Key', # [RFC3868]
|
|
271 : 'DRN Label', # [RFC3868]
|
|
272 : 'TID Label', # [RFC3868]
|
|
273 : 'Address Range', # [RFC3868]
|
|
274 : 'SMI', # [RFC3868]
|
|
275 : 'Importance', # [RFC3868]
|
|
276 : 'Message Priority', # [RFC3868]
|
|
277 : 'Protocol Class', # [RFC3868]
|
|
278 : 'Sequence Control', # [RFC3868]
|
|
279 : 'Segmentation', # [RFC3868]
|
|
280 : 'Congestion Level', # [RFC3868]
|
|
512 : 'Network Appearance', # [RFC4666]
|
|
513 : 'Reserved', # [RFC4666]
|
|
514 : 'Reserved', # [RFC4666]
|
|
515 : 'Reserved', # [RFC4666]
|
|
516 : 'User/Cause', # [RFC4666]
|
|
517 : 'Congestion Indications', # [RFC4666]
|
|
518 : 'Concerned Destination', # [RFC4666]
|
|
519 : 'Routing Key', # [RFC4666]
|
|
520 : 'Registration Result', # [RFC4666]
|
|
521 : 'Deregistration Result', # [RFC4666]
|
|
522 : 'Local_Routing Key Identifier', # [RFC4666]
|
|
523 : 'Destination Point Code', # [RFC4666]
|
|
524 : 'Service Indicators', # [RFC4666]
|
|
525 : 'Reserved', # [RFC4666]
|
|
526 : 'Originating Point Code List', # [RFC4666]
|
|
527 : 'Circuit Range', # [RFC4666]
|
|
528 : 'Protocol Data', # [RFC4666]
|
|
529 : 'Reserved', # [RFC4666]
|
|
530 : 'Registration Status', # [RFC4666]
|
|
531 : 'Deregistration Status', # [RFC4666]
|
|
768 : 'Protocol Data 1', # [RFC3331]
|
|
769 : 'Protocol Data 2', # [RFC3331]
|
|
770 : 'State Request', # [RFC3331]
|
|
771 : 'State Event', # [RFC3331]
|
|
772 : 'Congestion Status', # [RFC3331]
|
|
773 : 'Discard Status', # [RFC3331]
|
|
774 : 'Action', # [RFC3331]
|
|
775 : 'Sequence Number', # [RFC3331]
|
|
776 : 'Retrieval Result', # [RFC3331]
|
|
777 : 'Link Key', # [RFC3331]
|
|
778 : 'Local-LK-Identifier', # [RFC3331]
|
|
779 : 'Signalling Data Terminal Identifier', # [RFC3331]
|
|
780 : 'Signalling Data Link Identifier', # [RFC3331]
|
|
781 : 'Registration Result', # [RFC3331]
|
|
782 : 'Registration Status', # [RFC3331]
|
|
783 : 'De-Registration Result', # [RFC3331]
|
|
784 : 'De-Registration Status', # [RFC3331]
|
|
32769 : 'Global Title', # [RFC3868]
|
|
32770 : 'Point Code', # [RFC3868]
|
|
32771 : 'Subsystem Number', # [RFC3868]
|
|
32772 : 'IPv4 Address', # [RFC3868]
|
|
32773 : 'Hostname', # [RFC3868]
|
|
32774 : 'IPv6 Addresses', # [RFC3868]
|
|
65535 : 'Reserved', # [RFC4233]
|
|
}
|
|
|
|
# SIGTRAN message structure
|
|
# works for both M2UA (RFC 3331) and M3UA (RFC 4666)
|
|
|
|
class Param(Envelope):
|
|
_pad = b'\0'
|
|
_GEN = (
|
|
Uint16('Tag', dic=Params_dict),
|
|
Uint16('Len'),
|
|
Buf('Val', val=b'', rep=REPR_HEX),
|
|
Buf('pad', rep=REPR_HEX)
|
|
)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
Envelope.__init__(self, *args, **kwargs)
|
|
self[1].set_valauto(lambda: 4+self[2].get_len())
|
|
self[2].set_blauto(lambda: 8*max(0, self[1].get_val()-4))
|
|
self[3].set_valauto(lambda: (-self[2].get_len()%4) * self._pad)
|
|
self[3].set_blauto(lambda: 8*(-self[2].get_len()%4))
|
|
|
|
def _from_char(self, char):
|
|
self[0]._from_char(char)
|
|
self[1]._from_char(char)
|
|
self[2]._from_char(char)
|
|
# this is to enable the decoding of some SIGTRAN implementations
|
|
# were padding of the last parameter is omitted
|
|
if not char.len_bit():
|
|
self[3].set_trans(True)
|
|
|
|
|
|
class SIGTRAN(Envelope):
|
|
|
|
# warning RFC 4666: the length must take padding into account,
|
|
# otherwise there will be a mismatch with `Len' fields in the sequence of
|
|
# parameters
|
|
# this class attribute enforces the Length field in the Header at decoding
|
|
_LEN_ENFORCE = True
|
|
|
|
_TypeUndef_dict = {}
|
|
_Type_dict = {
|
|
MGMT : TypeMGMT_dict,
|
|
TRANS : TypeTRANS_dict,
|
|
SSNM : TypeSSNM_dict,
|
|
ASPSM : TypeASPSM_dict,
|
|
ASPTM : TypeASPTM_dict,
|
|
QPTM : TypeQPTM_dict,
|
|
MAUP : TypeMAUP_dict,
|
|
CONLESS : TypeCONLESS_dict,
|
|
CONOR : TypeCONOR_dict,
|
|
RKM : TypeRKM_dict,
|
|
IIM : TypeIIM_dict,
|
|
M2PA : TypeM2PA_dict,
|
|
SEC : TypeSEC_dict,
|
|
BPT : TypeBPT_dict,
|
|
V5PTM : TypeV5PTM_dict
|
|
}
|
|
_GEN = (
|
|
Envelope('Header', GEN=(
|
|
Uint8('Version', val=1),
|
|
Uint8('spare'),
|
|
Uint8('Class', val=TRANS, dic=Class_dict),
|
|
Uint8('Type'),
|
|
Uint32('Len')
|
|
), hier=0),
|
|
Sequence('Params', GEN=Param(), hier=1)
|
|
)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
Envelope.__init__(self, *args, **kwargs)
|
|
self[0][3].set_dicauto(lambda: self._Type_dict.get(self[0][2].get_val(), self._TypeUndef_dict))
|
|
self[0][4].set_valauto(lambda: 8+self[1].get_len())
|
|
|
|
def _from_char(self, char):
|
|
self[0]._from_char(char)
|
|
if self._LEN_ENFORCE:
|
|
clen = char._len_bit
|
|
char._len_bit = char._cur + 8*(max(0, self[0][4].get_val()-8))
|
|
self[1]._from_char(char)
|
|
char._len_bit = clen
|
|
else:
|
|
self[1]._from_char(char)
|
|
|
|
|
|
class M2PA(Envelope):
|
|
# RFC 4165
|
|
|
|
_GEN = (
|
|
Envelope('Header', GEN=(
|
|
Uint8('Version', val=1),
|
|
Uint8('spare'),
|
|
Uint8('Class', val=11, dic=Class_dict),
|
|
Uint8('Type', val=1, dic={1:'User Data', 2:'Link Status'}),
|
|
Uint32('Len')),
|
|
hier=0),
|
|
Envelope('M2PAHeader', GEN=(
|
|
Uint8('unused'),
|
|
Uint24('BSN'),
|
|
Uint8('unused'),
|
|
Uint24('FSN')),
|
|
hier=0),
|
|
Alt('Data', GEN={
|
|
1: Envelope('UserData', GEN=(
|
|
Uint('Priority', bl=2),
|
|
Uint('spare', bl=6),
|
|
Buf('Data', val=b'', rep=REPR_HEX))),
|
|
2: Envelope('LinkStatus', GEN=(
|
|
Uint8('State'),
|
|
Buf('filler', val=b'', rep=REPR_HEX)))
|
|
},
|
|
DEFAULT=Buf('Data', val=b'', rep=REPR_HEX),
|
|
sel=lambda self: self.get_env()[0][3].get_val(),
|
|
hier=1)
|
|
)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
Envelope.__init__(self, *args, **kwargs)
|
|
self[0][4].set_valauto(lambda: 16 + self[2].get_len() if not self[2].get_trans() else 16)
|
|
self[2]._GEN[1][2].set_blauto(lambda: 8*(self[0][4].get_val()-18))
|
|
self[2]._GEN[2][1].set_blauto(lambda: 8*(self[0][4].get_val()-17))
|
|
self[2].DEFAULT.set_blauto(lambda: 8*(self[0][4].get_val()-16))
|
|
|
|
def _from_char(self, char):
|
|
self[0]._from_char(char)
|
|
self[1]._from_char(char)
|
|
if self[0][4].get_val() > 16:
|
|
self[2].set_trans(False)
|
|
self[2]._from_char(char)
|
|
else:
|
|
self[2].set_trans(True)
|
|
|
|
|
|
MTP3SubServInd_dict = {
|
|
0 : 'international network',
|
|
1 : 'spare',
|
|
2 : 'national network',
|
|
3 : 'reserved for national use'
|
|
}
|
|
|
|
MTP3ServInd_dict = {
|
|
0 : 'Signalling network management messages',
|
|
1 : 'Signalling network testing and maintenance messages',
|
|
2 : 'Signaling Network Testing and Maintenance Special Messages (ANSI)',
|
|
3 : 'Signalling Connection Control Part',
|
|
4 : 'Telephone User Part',
|
|
5 : 'ISDN User Part',
|
|
6 : 'DUP (call and circuit-related messages)',
|
|
7 : 'DUP (facility registration and cancellation)',
|
|
8 : 'Reserved for MTP Testing User Part',
|
|
9 : 'Broadband ISDN User Part',
|
|
10: 'Satellite ISDN User Part',
|
|
}
|
|
|
|
|
|
class MTP3(Envelope):
|
|
# ITU-T Q.2210, peer-to-peer info of user parts
|
|
|
|
_GEN = (
|
|
Uint('SubServiceInd', bl=2, dic=MTP3SubServInd_dict),
|
|
Uint('SubServiceSpare', bl=2),
|
|
Uint('ServiceInd', bl=4, dic=MTP3ServInd_dict),
|
|
Uint8('DPC_LSB'),
|
|
Uint('OPC_LSB', bl=2),
|
|
Uint('DPC_MSB', bl=6),
|
|
Uint8('OPC_M'),
|
|
Uint('SLS', bl=4),
|
|
Uint('OPC_MSB', bl=4),
|
|
Uint16('DPC', trans=True),
|
|
Uint16('OPC', trans=True)
|
|
)
|
|
|
|
# additional class attribute for the size in bytes
|
|
_SZ = 5
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
Envelope.__init__(self, *args, **kwargs)
|
|
self[9].set_valauto( lambda: self[3].get_val() + (self[5].get_val()<<8))
|
|
self[10].set_valauto(lambda: self[4].get_val() + (self[6].get_val()<<2) + \
|
|
(self[8].get_val()<<10))
|
|
|
|
def set_val(self, vals):
|
|
if isinstance(vals, dict):
|
|
if 'DPC' in vals:
|
|
dpc = vals['DPC']
|
|
del vals['DPC']
|
|
self[3].set_val(dpc&0xff)
|
|
self[5].set_val(dpc>>8)
|
|
if 'OPC' in vals:
|
|
opc = vals['OPC']
|
|
del vals['OPC']
|
|
self[4].set_val(opc&0x2)
|
|
self[6].set_val((opc>>2)&0xff)
|
|
self[8].set_val(opc>>10)
|
|
if vals:
|
|
Envelope.set_val(self, vals)
|
|
|
|
|
|
class MTP3_JPN(Envelope):
|
|
# MTP3 Japanese variant : DPC / OPC are on 16 bits and SLS is on 8 bits
|
|
|
|
_GEN = (
|
|
Uint('SubServiceInd', bl=2, dic=MTP3SubServInd_dict),
|
|
Uint('SubServiceSpare', bl=2),
|
|
Uint('ServiceInd', bl=4, dic=MTP3ServInd_dict),
|
|
Uint16LE('DPC'),
|
|
Uint16LE('OPC'),
|
|
Uint('SLSSpare', bl=4),
|
|
Uint('SLS', bl=4)
|
|
)
|
|
|
|
# additional class attribute for the size in bytes
|
|
_SZ = 6
|
|
|
|
|
|
class MTP3_ANSI(Envelope):
|
|
# MTP3 ANSI T1.111.1 variant
|
|
# Seems Chinese variant format has the same layout (with priority being spare)
|
|
|
|
_GEN = (
|
|
Uint('SubServiceInd', bl=2, dic=MTP3SubServInd_dict),
|
|
Uint('SubServicePriority', bl=2),
|
|
Uint('ServiceInd', bl=4, dic=MTP3ServInd_dict),
|
|
Uint24('DPC'),
|
|
Uint24('OPC'),
|
|
Uint8('SLS')
|
|
)
|
|
|
|
# additional class attribute for the size in bytes
|
|
_SZ = 8
|
|
|