From c87abfcb6098bb696f8941bac5be2b5d418a2d76 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 18 Mar 2018 10:58:00 +0100 Subject: [PATCH] Remove M3UA/MTP3/SCCP code from this repo, use upstream repos Originally, this code was not yet in an official upstream git repo. However, it has been for many months, so let's remove our local copy and use upstream git repositories like for all the other modules. Change-Id: I2c616fb865df32cfec323d42e5d0d06de40c497b --- M3UA_CNL113536/M3UA_CNL113536.tpd | 44 - M3UA_CNL113536/doc/documentation_note.txt | 13 - M3UA_CNL113536/src/M3UA_Types.ttcn | 805 --- M3UA_CNL113537/demo/Abstract_Socket.cc | 1 - M3UA_CNL113537/demo/Abstract_Socket.hh | 1 - M3UA_CNL113537/demo/BICC_EncDec.cc | 1 - M3UA_CNL113537/demo/BICC_Types.ttcn | 1 - M3UA_CNL113537/demo/General_Types.ttcn | 1 - M3UA_CNL113537/demo/M3UA_Emulation.ttcn | 1 - M3UA_CNL113537/demo/M3UA_Emulation_Test.ttcn | 152 - M3UA_CNL113537/demo/M3UA_Types.ttcn | 1 - M3UA_CNL113537/demo/MTP3asp_EncDec.cc | 1 - M3UA_CNL113537/demo/MTP3asp_Types.ttcn | 1 - M3UA_CNL113537/demo/Makefile | 920 --- M3UA_CNL113537/demo/SCTPasp_PT.cc | 1 - M3UA_CNL113537/demo/SCTPasp_PT.hh | 1 - M3UA_CNL113537/demo/SCTPasp_PortType.ttcn | 1 - M3UA_CNL113537/demo/SCTPasp_Types.ttcn | 1 - M3UA_CNL113537/demo/m3ua_emu.cfg | 21 - M3UA_CNL113537/src/M3UA_Emulation.ttcn | 1307 ---- MTP3asp_CNL113337/MTP3asp_CNL113337.tpd | 89 - MTP3asp_CNL113337/demo/MTP3asp_PT.cc | 2952 -------- MTP3asp_CNL113337/demo/MTP3asp_PT.hh | 249 - MTP3asp_CNL113337/demo/MTP3asp_PortType.ttcn | 61 - MTP3asp_CNL113337/demo/MTP3asp_Types.ttcn | 324 - MTP3asp_CNL113337/demo/Makefile | 353 - MTP3asp_CNL113337/demo/mtp3test.ttcn | 292 - .../demo/mtp3test_MTP3_ansi2.cfg | 75 - .../doc/MTP3asp_CNL113337_FS.pdf | Bin 143496 -> 0 bytes .../doc/MTP3asp_CNL113337_PRI.pdf | Bin 131894 -> 0 bytes .../doc/MTP3asp_CNL113337_UG.pdf | Bin 178705 -> 0 bytes MTP3asp_CNL113337/src/MTP3asp_EncDec.cc | 20 - MTP3asp_CNL113337/src/MTP3asp_PT.cc | 2952 -------- MTP3asp_CNL113337/src/MTP3asp_PT.hh | 249 - MTP3asp_CNL113337/src/MTP3asp_PortType.ttcn | 66 - MTP3asp_CNL113337/src/MTP3asp_Types.ttcn | 324 - SCCP_CNL113341/SCCP_CNL113341.tpd | 87 - SCCP_CNL113341/demo/General_Types.ttcn | 1 - SCCP_CNL113341/demo/MTP3asp_PT.cc | 1 - SCCP_CNL113341/demo/MTP3asp_PT.hh | 1 - SCCP_CNL113341/demo/MTP3asp_PortType.ttcn | 1 - SCCP_CNL113341/demo/MTP3asp_Types.ttcn | 1 - SCCP_CNL113341/demo/Makefile.ini | 737 -- .../N_UNITDATAtest_600longdata_xudt_ansi_log | 2141 ------ SCCP_CNL113341/demo/SCCP_Emulation.ttcn | 1 - SCCP_CNL113341/demo/SCCP_Mapping.ttcnpp | 1 - SCCP_CNL113341/demo/SCCP_Testcases.cfg | 55 - SCCP_CNL113341/demo/SCCP_Testcases.ttcn | 468 -- SCCP_CNL113341/demo/SCCP_Types.ttcn | 1 - SCCP_CNL113341/demo/SCCP_selftest.cfg | 52 - SCCP_CNL113341/demo/SCCP_selftest.ttcn | 607 -- SCCP_CNL113341/demo/SCCPasp_Types.ttcn | 1 - SCCP_CNL113341/src/SCCP_Emulation.ttcn | 6043 ----------------- SCCP_CNL113341/src/SCCP_EncDec.cc | 19 - SCCP_CNL113341/src/SCCP_Mapping.ttcnpp | 129 - SCCP_CNL113341/src/SCCP_Types.ttcn | 1553 ----- SCCP_CNL113341/src/SCCPasp_Types.ttcn | 895 --- SCTPasp_CNL113469/SCTPasp_CNL113469.tpd | 50 - .../doc/SCTPasp_CNL113469_PRI.doc | Bin 64512 -> 0 bytes .../doc/SCTPasp_CNL113469_UG.doc | Bin 162816 -> 0 bytes SCTPasp_CNL113469/doc/SCTPasp_FS.pdf | Bin 167590 -> 0 bytes SCTPasp_CNL113469/src/SCTPasp_PT.cc | 1549 ----- SCTPasp_CNL113469/src/SCTPasp_PT.hh | 157 - SCTPasp_CNL113469/src/SCTPasp_PortType.ttcn | 62 - SCTPasp_CNL113469/src/SCTPasp_Types.ttcn | 201 - bin/install.script | 24 +- bsc-nat/gen_links.sh | 5 +- bsc-nat/regen_makefile.sh | 2 +- bsc/gen_links.sh | 12 +- bsc/regen_makefile.sh | 2 +- deps/Makefile | 7 +- msc/gen_links.sh | 7 +- msc/regen_makefile.sh | 2 +- rmlinks.sh | 2 +- selftest/gen_links.sh | 5 +- selftest/regen_makefile.sh | 2 +- 76 files changed, 32 insertions(+), 26133 deletions(-) delete mode 100644 M3UA_CNL113536/M3UA_CNL113536.tpd delete mode 100644 M3UA_CNL113536/doc/documentation_note.txt delete mode 100644 M3UA_CNL113536/src/M3UA_Types.ttcn delete mode 120000 M3UA_CNL113537/demo/Abstract_Socket.cc delete mode 120000 M3UA_CNL113537/demo/Abstract_Socket.hh delete mode 120000 M3UA_CNL113537/demo/BICC_EncDec.cc delete mode 120000 M3UA_CNL113537/demo/BICC_Types.ttcn delete mode 120000 M3UA_CNL113537/demo/General_Types.ttcn delete mode 120000 M3UA_CNL113537/demo/M3UA_Emulation.ttcn delete mode 100644 M3UA_CNL113537/demo/M3UA_Emulation_Test.ttcn delete mode 120000 M3UA_CNL113537/demo/M3UA_Types.ttcn delete mode 120000 M3UA_CNL113537/demo/MTP3asp_EncDec.cc delete mode 120000 M3UA_CNL113537/demo/MTP3asp_Types.ttcn delete mode 100644 M3UA_CNL113537/demo/Makefile delete mode 120000 M3UA_CNL113537/demo/SCTPasp_PT.cc delete mode 120000 M3UA_CNL113537/demo/SCTPasp_PT.hh delete mode 120000 M3UA_CNL113537/demo/SCTPasp_PortType.ttcn delete mode 120000 M3UA_CNL113537/demo/SCTPasp_Types.ttcn delete mode 100644 M3UA_CNL113537/demo/m3ua_emu.cfg delete mode 100644 M3UA_CNL113537/src/M3UA_Emulation.ttcn delete mode 100644 MTP3asp_CNL113337/MTP3asp_CNL113337.tpd delete mode 100644 MTP3asp_CNL113337/demo/MTP3asp_PT.cc delete mode 100644 MTP3asp_CNL113337/demo/MTP3asp_PT.hh delete mode 100644 MTP3asp_CNL113337/demo/MTP3asp_PortType.ttcn delete mode 100644 MTP3asp_CNL113337/demo/MTP3asp_Types.ttcn delete mode 100644 MTP3asp_CNL113337/demo/Makefile delete mode 100644 MTP3asp_CNL113337/demo/mtp3test.ttcn delete mode 100644 MTP3asp_CNL113337/demo/mtp3test_MTP3_ansi2.cfg delete mode 100644 MTP3asp_CNL113337/doc/MTP3asp_CNL113337_FS.pdf delete mode 100644 MTP3asp_CNL113337/doc/MTP3asp_CNL113337_PRI.pdf delete mode 100644 MTP3asp_CNL113337/doc/MTP3asp_CNL113337_UG.pdf delete mode 100644 MTP3asp_CNL113337/src/MTP3asp_EncDec.cc delete mode 100644 MTP3asp_CNL113337/src/MTP3asp_PT.cc delete mode 100644 MTP3asp_CNL113337/src/MTP3asp_PT.hh delete mode 100644 MTP3asp_CNL113337/src/MTP3asp_PortType.ttcn delete mode 100644 MTP3asp_CNL113337/src/MTP3asp_Types.ttcn delete mode 100644 SCCP_CNL113341/SCCP_CNL113341.tpd delete mode 120000 SCCP_CNL113341/demo/General_Types.ttcn delete mode 120000 SCCP_CNL113341/demo/MTP3asp_PT.cc delete mode 120000 SCCP_CNL113341/demo/MTP3asp_PT.hh delete mode 120000 SCCP_CNL113341/demo/MTP3asp_PortType.ttcn delete mode 120000 SCCP_CNL113341/demo/MTP3asp_Types.ttcn delete mode 100644 SCCP_CNL113341/demo/Makefile.ini delete mode 100644 SCCP_CNL113341/demo/N_UNITDATAtest_600longdata_xudt_ansi_log delete mode 120000 SCCP_CNL113341/demo/SCCP_Emulation.ttcn delete mode 120000 SCCP_CNL113341/demo/SCCP_Mapping.ttcnpp delete mode 100644 SCCP_CNL113341/demo/SCCP_Testcases.cfg delete mode 100644 SCCP_CNL113341/demo/SCCP_Testcases.ttcn delete mode 120000 SCCP_CNL113341/demo/SCCP_Types.ttcn delete mode 100644 SCCP_CNL113341/demo/SCCP_selftest.cfg delete mode 100644 SCCP_CNL113341/demo/SCCP_selftest.ttcn delete mode 120000 SCCP_CNL113341/demo/SCCPasp_Types.ttcn delete mode 100644 SCCP_CNL113341/src/SCCP_Emulation.ttcn delete mode 100644 SCCP_CNL113341/src/SCCP_EncDec.cc delete mode 100644 SCCP_CNL113341/src/SCCP_Mapping.ttcnpp delete mode 100644 SCCP_CNL113341/src/SCCP_Types.ttcn delete mode 100644 SCCP_CNL113341/src/SCCPasp_Types.ttcn delete mode 100644 SCTPasp_CNL113469/SCTPasp_CNL113469.tpd delete mode 100644 SCTPasp_CNL113469/doc/SCTPasp_CNL113469_PRI.doc delete mode 100644 SCTPasp_CNL113469/doc/SCTPasp_CNL113469_UG.doc delete mode 100644 SCTPasp_CNL113469/doc/SCTPasp_FS.pdf delete mode 100644 SCTPasp_CNL113469/src/SCTPasp_PT.cc delete mode 100644 SCTPasp_CNL113469/src/SCTPasp_PT.hh delete mode 100644 SCTPasp_CNL113469/src/SCTPasp_PortType.ttcn delete mode 100644 SCTPasp_CNL113469/src/SCTPasp_Types.ttcn diff --git a/M3UA_CNL113536/M3UA_CNL113536.tpd b/M3UA_CNL113536/M3UA_CNL113536.tpd deleted file mode 100644 index c67290231..000000000 --- a/M3UA_CNL113536/M3UA_CNL113536.tpd +++ /dev/null @@ -1,44 +0,0 @@ - - - - M3UA_CNL113536 - - - - - - - - - - Default - - - - - true - true - true - bin/M3UA_CNL113536 - - - bin - - - - - diff --git a/M3UA_CNL113536/doc/documentation_note.txt b/M3UA_CNL113536/doc/documentation_note.txt deleted file mode 100644 index eb68bfba8..000000000 --- a/M3UA_CNL113536/doc/documentation_note.txt +++ /dev/null @@ -1,13 +0,0 @@ -Please note that the storage of the documentation of the product has been -moved to the eridoc.ericsson.se from the ClearCase. - -You can access the documentation of the product via the following links: - -The documentation belongs to the R2A revision of the product -can be found here: -http://document.internal.ericsson.com/Download?DocNo=1095-CNL113536&Rev=C&Lang=EN&PRev=Y - -The documentation belongs to the latest revision of the product -can be found here: -http://document.internal.ericsson.com/Download?DocNo=1095-CNL113536&Rev=HIGHEST&Lang=EN&Status=FREE&PRev=Y - diff --git a/M3UA_CNL113536/src/M3UA_Types.ttcn b/M3UA_CNL113536/src/M3UA_Types.ttcn deleted file mode 100644 index d79d8327a..000000000 --- a/M3UA_CNL113536/src/M3UA_Types.ttcn +++ /dev/null @@ -1,805 +0,0 @@ -/****************************************************************************** -* Copyright (c) 2004, 2015 Ericsson AB -* All rights reserved. This program and the accompanying materials -* are made available under the terms of the Eclipse Public License v1.0 -* which accompanies this distribution, and is available at -* http://www.eclipse.org/legal/epl-v10.html -* -* Contributors: -* Ferenc Kovacs -* Gabor Bettesch -* Gabor Szalai -******************************************************************************/ -// -// File: M3UA_Types.ttcn -// Rev: R2A -// Prodnr: CNL 113 536 -// Reference: - -module M3UA_Types { - -import from General_Types all; - -external function enc_PDU_M3UA(in PDU_M3UA pdu) return octetstring -with { extension "prototype(convert)" - extension "encode(RAW)" - } - -external function dec_PDU_M3UA(in octetstring stream) return PDU_M3UA -with { extension "prototype(convert)" - extension "decode(RAW)" - } - -//++++++++++++++++++++++++++++++++++++++++++++++++++ -// M3UA PARAMETERS -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type octetstring M3UA_OCT0_255 length (0..255); - -type record M3UA_Point_Code -{ - OCT1 mask, - OCT3 affected_Point_Code -} - -type record of M3UA_Point_Code M3UA_Point_Codes; - -type record M3UA_Error_Code -{ - OCT2 tag, - integer lengthInd, - OCT4 errorCode -} with { variant (lengthInd) "LENGTHTO(tag,lengthInd,errorCode)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - } - -type record M3UA_Routing_Context -{ - OCT2 tag, - integer lengthInd, - octetstring routingContext -} with { variant (lengthInd) "LENGTHTO(tag,lengthInd,routingContext)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - variant "PADDING(dword32)"; - } - -type record M3UA_Affected_Point_Codes -{ - OCT2 tag, - integer lengthInd, - M3UA_Point_Codes pointCodes -} with { variant (lengthInd) "LENGTHTO(tag,lengthInd,pointCodes)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - } - -type record M3UA_Network_Appearance -{ - OCT2 tag, - integer lengthInd, - OCT4 networkAppearance -} with { variant (lengthInd) "LENGTHTO(tag,lengthInd,networkAppearance)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - } - -type record M3UA_Diagnostic_information -{ - OCT2 tag, - integer lengthInd, - octetstring diagnosticInformation -} with { variant (lengthInd) "LENGTHTO(tag,lengthInd,diagnosticInformation)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - variant "PADDING(dword32)"; - } - -type record M3UA_Correlation_ID -{ - OCT2 tag, - integer lengthInd, - OCT4 correlationID -} with { variant (lengthInd) "LENGTHTO(tag,lengthInd,correlationID)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - } - -type record M3UA_Protocol_Data -{ - OCT2 tag, - integer lengthInd, - OCT4 oPC, - OCT4 dPC, - OCT1 sI, - OCT1 nI, - OCT1 mP, - OCT1 sLS, - octetstring userProtocolData -} with { variant (lengthInd) "LENGTHTO(tag,lengthInd,oPC,dPC,sI,nI,mP,sLS, - userProtocolData)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - variant "PADDING(dword32)"; - } - -type record M3UA_Info_String -{ - OCT2 tag, - integer lengthInd, - M3UA_OCT0_255 infoString -} with { variant (lengthInd) "LENGTHTO(tag,lengthInd,infoString)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - variant "PADDING(dword32)"; - } - -type record M3UA_Concerned_Destination -{ - OCT2 tag, - integer lengthInd, - OCT1 reserved, - OCT3 concernedDestination -} with { variant (lengthInd) "LENGTHTO(tag,lengthInd,reserved, - concernedDestination)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - } - -type record M3UA_Congestion_Indicators -{ - OCT2 tag, - integer lengthInd, - OCT1 reserved, - OCT3 congestionLevel -} with { variant (lengthInd) "LENGTHTO(tag,lengthInd,reserved,congestionLevel)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - } - -type record M3UA_User_Cause -{ - OCT2 tag, - integer lengthInd, - OCT2 cause, - OCT2 user -} with { variant (lengthInd) "LENGTHTO(tag,lengthInd,cause,user)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - } - -type record M3UA_ASP_Identifier -{ - OCT2 tag, - integer lengthInd, - OCT4 aSPIdentifier -} with { variant (lengthInd) "LENGTHTO(tag,lengthInd,aSPIdentifier)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - } - -type record M3UA_Heartbeat_Data -{ - OCT2 tag, - integer lengthInd, - octetstring heartbeat_Data -} with { variant (lengthInd) "LENGTHTO(tag,lengthInd,heartbeat_Data)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - variant "PADDING(dword32)"; - } - -type record M3UA_Traffic_Mode_Type -{ - OCT2 tag, - integer lengthInd, - OCT4 trafficModeType -} with { variant (lengthInd) "LENGTHTO (tag,lengthInd,trafficModeType)"; - variant (lengthInd) "FIELDLENGTH(16)"; - variant (lengthInd) "BYTEORDER(last)"; - } - - -//++++++++++++++++++++++++++++++++++++++++++++++++++ -//PDUs -//++++++++++++++++++++++++++++++++++++++++++++++++++ - -// M3UA_ERR PDU -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_ERR -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_ERR_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_ERR_MessageParameters -{ - M3UA_Error_Code error_Code, - M3UA_Routing_Context routing_Context optional, - M3UA_Affected_Point_Codes affected_Point_Codes optional, - M3UA_Network_Appearance network_Appearance optional, - M3UA_Diagnostic_information diagnostic_information optional -} with { variant "TAG(error_Code, tag = '000C'O; - routing_Context, tag = '0006'O; - affected_Point_Codes, tag = '0012'O; - network_Appearance, tag = '0200'O; - diagnostic_information, tag = '0007'O; )" - } - - -// M3UA_NOTIFY -// NOTE1 : NOTIFY should not come and will be dropped if it comes -// NOTE2 : messageParameters is simpified implementation as octetstring -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_NOTIFY -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - octetstring messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - - -// M3UA_DATA PDU -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_DATA -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_DATA_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_DATA_MessageParameters -{ - M3UA_Network_Appearance network_Appearance optional, - M3UA_Routing_Context routing_Context optional, - M3UA_Protocol_Data protocol_Data, - M3UA_Correlation_ID correlation_ID optional -} with { variant "TAG(network_Appearance, tag = '0200'O; - routing_Context, tag = '0006'O; - protocol_Data, tag = '0210'O; - correlation_ID, tag = '0013'O; )" - } - - -// M3UA_DUNA PDU -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_DUNA -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_DUNA_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_DUNA_MessageParameters -{ - M3UA_Network_Appearance network_Appearance optional, - M3UA_Routing_Context routing_Context optional, - M3UA_Affected_Point_Codes affected_Point_Codes, - M3UA_Info_String info_String optional -} with { variant "TAG(network_Appearance, tag = '0200'O; - routing_Context, tag = '0006'O; - affected_Point_Codes, tag = '0012'O; - info_String, tag = '0004'O )" - } - - -// M3UA_DAVA PDU -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_DAVA -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_DAVA_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_DAVA_MessageParameters -{ - M3UA_Network_Appearance network_Appearance optional, - M3UA_Routing_Context routing_Context optional, - M3UA_Affected_Point_Codes affected_Point_Codes, - M3UA_Info_String info_String optional -} with { variant "TAG(network_Appearance, tag = '0200'O; - routing_Context, tag = '0006'O; - affected_Point_Codes, tag = '0012'O; - info_String, tag = '0004'O )" - } - - -// M3UA_DAUD PDU -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_DAUD -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_DAUD_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_DAUD_MessageParameters -{ - M3UA_Network_Appearance network_Appearance optional, - M3UA_Routing_Context routing_Context optional, - M3UA_Affected_Point_Codes affected_Point_Codes, - M3UA_Info_String info_String optional -} with { variant "TAG(network_Appearance, tag = '0200'O; - routing_Context, tag = '0006'O; - affected_Point_Codes, tag = '0012'O; - info_String, tag = '0004'O )" - } - - -// M3UA_SCON PDU -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_SCON -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_SCON_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_SCON_MessageParameters -{ - M3UA_Network_Appearance network_Appearance optional, - M3UA_Routing_Context routing_Context optional, - M3UA_Affected_Point_Codes affected_Point_Codes, - M3UA_Concerned_Destination concerned_Destination optional, - M3UA_Congestion_Indicators congestion_Indicators optional, - M3UA_Info_String info_String optional -} with { variant "TAG(network_Appearance, tag = '0200'O; - routing_Context, tag = '0006'O; - affected_Point_Codes, tag = '0012'O; - concerned_Destination, tag = '0206'O; - congestion_Indicators, tag = '0205'O; - info_String, tag = '0004'O )" - } - - -// M3UA_DUPU PDU -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_DUPU -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_DUPU_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_DUPU_MessageParameters -{ - M3UA_Network_Appearance network_Appearance optional, - M3UA_Routing_Context routing_Context optional, - M3UA_Affected_Point_Codes affected_Point_Codes, - M3UA_User_Cause user_Cause, - M3UA_Info_String info_String optional -} with { variant "TAG(network_Appearance, tag = '0200'O; - routing_Context, tag = '0006'O; - affected_Point_Codes, tag = '0012'O; - user_Cause, tag = '0204'O; - info_String, tag = '0004'O )" - } - - -// M3UA_DRST PDU -// NOTE1 : DRST should not come and will be dropped if it comes -// NOTE2 : messageParameters is simpified implementation as octetstring -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_DRST -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - octetstring messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - - -// M3UA_ASPUP -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_ASPUP -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_ASPUP_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_ASPUP_MessageParameters -{ - M3UA_ASP_Identifier aSP_Identifier optional, - M3UA_Info_String info_String optional -} with { variant "TAG(aSP_Identifier, tag = '0011'O; - info_String, tag = '0004'O; )" - } - - -//M3UA_ASPUP_Ack -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_ASPUP_Ack -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_ASPUP_Ack_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_ASPUP_Ack_MessageParameters -{ - M3UA_Info_String info_String optional -} with { variant "TAG(info_String, tag = '0004'O; )" - } - - -//M3UA_ASPDN -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_ASPDN -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_ASPDN_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_ASPDN_MessageParameters -{ - M3UA_Info_String info_String optional -} with { variant "TAG(info_String, tag = '0004'O; )" - } - - -//M3UA_ASPDN_Ack -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_ASPDN_Ack -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_ASPDN_Ack_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_ASPDN_Ack_MessageParameters -{ - M3UA_Info_String info_String optional -} with { variant "TAG(info_String, tag = '0004'O;)" - } - - -// M3UA_BEAT -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_BEAT -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_BEAT_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_BEAT_MessageParameters -{ - M3UA_Heartbeat_Data heartbeat_Data optional -} with { variant "TAG(heartbeat_Data, tag = '0009'O; )" - } - - -// M3UA_BEAT_Ack -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_BEAT_Ack -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_BEAT_Ack_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_BEAT_Ack_MessageParameters -{ - M3UA_Heartbeat_Data heartbeat_Data optional -} with { variant "TAG(heartbeat_Data, tag = '0009'O; )" - } - - -// M3UA_ASPAC -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_ASPAC -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_ASPAC_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_ASPAC_MessageParameters -{ - M3UA_Traffic_Mode_Type traffic_Mode_Type optional, - M3UA_Routing_Context routing_Context optional, - M3UA_Info_String info_String optional -} with { variant "TAG(traffic_Mode_Type, tag = '000B'O; - routing_Context, tag = '0006'O; - info_String, tag = '0004'O; )" - } - - -// M3UA_ASPAC_Ack -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_ASPAC_Ack -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_ASPAC_Ack_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_ASPAC_Ack_MessageParameters -{ - M3UA_Traffic_Mode_Type traffic_Mode_Type optional, - M3UA_Routing_Context routing_Context optional, - M3UA_Info_String info_String optional -} with { variant "TAG(traffic_Mode_Type, tag = '000B'O; - routing_Context, tag = '0006'O; - info_String, tag = '0004'O; )" - } - - -// M3UA_ASPIA -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_ASPIA -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_ASPIA_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_ASPIA_MessageParameters -{ - M3UA_Routing_Context routing_Context optional, - M3UA_Info_String info_String optional -} with { variant "TAG(routing_Context, tag = '0006'O; - info_String, tag = '0004'O; )" - } - - -// M3UA_ASPIA_Ack -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_ASPIA_Ack -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - M3UA_ASPIA_Ack_MessageParameters messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - -type set M3UA_ASPIA_Ack_MessageParameters -{ - M3UA_Routing_Context routing_Context optional, - M3UA_Info_String info_String optional -} with { variant "TAG(routing_Context, tag = '0006'O; - info_String, tag = '0004'O; )" - } - - -// M3UA_REG_REQ -// NOTE1 : REG REQ should not come and will be dropped if it comes -// NOTE2 : messageParameters is simpified implementation as octetstring -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_REG_REQ -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - octetstring messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - - -// M3UA_REG_RSP -// NOTE1 : REG RSP should not come and will be dropped if it comes -// NOTE2 : messageParameters is simpified implementation as octetstring -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_REG_RSP -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - octetstring messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - - -// M3UA_DEREG_REQ -// NOTE1 : DEREG REQ should not come and will be dropped if it comes -// NOTE2 : messageParameters is simpified implementation as octetstring -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_DEREG_REQ -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - octetstring messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - - -// M3UA_DEREG_RSP -// NOTE1 : DEREG RSP should not come and will be dropped if it comes -// NOTE2 : messageParameters is simpified implementation as octetstring -//++++++++++++++++++++++++++++++++++++++++++++++++++ -type record M3UA_DEREG_RSP -{ - OCT1 version, - OCT1 reserved, - OCT2 messageClassAndType, - integer messageLength, - octetstring messageParameters -} with { variant (messageLength) "LENGTHTO(version,reserved,messageClassAndType, - messageLength,messageParameters)"; - variant (messageLength) "FIELDLENGTH(32)"; - variant (messageLength) "BYTEORDER(last)"; - } - - -// Top level PDU -//************************************************************************ -type union PDU_M3UA -{ - M3UA_ERR m3UA_ERR, // Error - M3UA_NOTIFY m3UA_NOTIFY, // Notify - should not come - M3UA_DATA m3UA_DATA, // Payload data - M3UA_DUNA m3UA_DUNA, // Destination Unavailable - M3UA_DAVA m3UA_DAVA, // Destination Available - M3UA_DAUD m3UA_DAUD, // Destination State Audit - M3UA_SCON m3UA_SCON, // Signaling Congestion - M3UA_DUPU m3UA_DUPU, // Destination User Part Unavailable - M3UA_DRST m3UA_DRST, // DRST - should not come - M3UA_ASPUP m3UA_ASPUP, // ASP up - M3UA_ASPDN m3UA_ASPDN, // ASP down - M3UA_BEAT m3UA_BEAT, // Heartbeat - M3UA_BEAT_Ack m3UA_BEAT_Ack, // Heartbeat Ack - M3UA_ASPUP_Ack m3UA_ASPUP_Ack, // ASP up ack - M3UA_ASPDN_Ack m3UA_ASPDN_Ack, // ASP down ack - M3UA_ASPAC m3UA_ASPAC, // ASP Active - M3UA_ASPIA m3UA_ASPIA, // ASP Inactive - M3UA_ASPAC_Ack m3UA_ASPAC_Ack, // ASP Active Ack - M3UA_ASPIA_Ack m3UA_ASPIA_Ack, // ASP Inactive - M3UA_REG_REQ m3UA_REG_REQ, // REG REQ - should not come - M3UA_REG_RSP m3UA_REG_RSP, // REG RSP - should not come - M3UA_DEREG_REQ m3UA_DEREG_REQ, // DEREG REQ - should not come - M3UA_DEREG_RSP m3UA_DEREG_RSP // DEREG RSP - should not come -} with { variant "TAG( - m3UA_ERR, messageClassAndType = '0000'O; //MGMT Class (0), - m3UA_NOTIFY, messageClassAndType = '0001'O; //MGMT Class (0), - m3UA_DATA, messageClassAndType = '0101'O; //Transf msg Class(1), - m3UA_DUNA, messageClassAndType = '0201'O; //SSNM Class(2), - m3UA_DAVA, messageClassAndType = '0202'O; //SSNM Class(2), - m3UA_DAUD, messageClassAndType = '0203'O; //SSNM Class(2), - m3UA_SCON, messageClassAndType = '0204'O; //SSNM Class(2), - m3UA_DUPU, messageClassAndType = '0205'O; //SSNM Class(2), - m3UA_DRST, messageClassAndType = '0206'O; //SSNM Class(2), - m3UA_ASPUP, messageClassAndType = '0301'O; //ASPSM Class(3), - m3UA_ASPDN, messageClassAndType = '0302'O; //ASPSM Class(3), - m3UA_BEAT, messageClassAndType = '0303'O; //ASPSM Class(3), - m3UA_ASPUP_Ack, messageClassAndType = '0304'O; //ASPSM Class(3), - m3UA_ASPDN_Ack, messageClassAndType = '0305'O; //ASPSM Class(3), - m3UA_BEAT_Ack, messageClassAndType = '0306'O; //ASPSM Class(3), - m3UA_ASPAC, messageClassAndType = '0401'O; //ASPTM Class(4), - m3UA_ASPIA, messageClassAndType = '0402'O; //ASPTM Class(4), - m3UA_ASPAC_Ack, messageClassAndType = '0403'O; //ASPTM Class(4), - m3UA_ASPIA_Ack, messageClassAndType = '0404'O; //ASPTM Class(4), - m3UA_REG_REQ, messageClassAndType = '0901'O; //RKM Class(9), - m3UA_REG_RSP, messageClassAndType = '0902'O; //RKM Class(9), - m3UA_DEREG_REQ, messageClassAndType = '0903'O; //RKM Class(9), - m3UA_DEREG_RSP, messageClassAndType = '0904'O; )" //RKM Class(9), - } -} with { encode "RAW"} diff --git a/M3UA_CNL113537/demo/Abstract_Socket.cc b/M3UA_CNL113537/demo/Abstract_Socket.cc deleted file mode 120000 index 6d1b3f35b..000000000 --- a/M3UA_CNL113537/demo/Abstract_Socket.cc +++ /dev/null @@ -1 +0,0 @@ -../../../TestPorts/Common_Components/Abstract_Socket_CNL113384/src/Abstract_Socket.cc \ No newline at end of file diff --git a/M3UA_CNL113537/demo/Abstract_Socket.hh b/M3UA_CNL113537/demo/Abstract_Socket.hh deleted file mode 120000 index ecb6c0369..000000000 --- a/M3UA_CNL113537/demo/Abstract_Socket.hh +++ /dev/null @@ -1 +0,0 @@ -../../../TestPorts/Common_Components/Abstract_Socket_CNL113384/src/Abstract_Socket.hh \ No newline at end of file diff --git a/M3UA_CNL113537/demo/BICC_EncDec.cc b/M3UA_CNL113537/demo/BICC_EncDec.cc deleted file mode 120000 index f3f7144d2..000000000 --- a/M3UA_CNL113537/demo/BICC_EncDec.cc +++ /dev/null @@ -1 +0,0 @@ -../../../ProtocolModules/BICC_Q.1902.1_CNL113359/src/BICC_EncDec.cc \ No newline at end of file diff --git a/M3UA_CNL113537/demo/BICC_Types.ttcn b/M3UA_CNL113537/demo/BICC_Types.ttcn deleted file mode 120000 index de200f7a4..000000000 --- a/M3UA_CNL113537/demo/BICC_Types.ttcn +++ /dev/null @@ -1 +0,0 @@ -../../../ProtocolModules/BICC_Q.1902.1_CNL113359/src/BICC_Types.ttcn \ No newline at end of file diff --git a/M3UA_CNL113537/demo/General_Types.ttcn b/M3UA_CNL113537/demo/General_Types.ttcn deleted file mode 120000 index 354ebf3fc..000000000 --- a/M3UA_CNL113537/demo/General_Types.ttcn +++ /dev/null @@ -1 +0,0 @@ -../../../ProtocolModules/COMMON/src/General_Types.ttcn \ No newline at end of file diff --git a/M3UA_CNL113537/demo/M3UA_Emulation.ttcn b/M3UA_CNL113537/demo/M3UA_Emulation.ttcn deleted file mode 120000 index bf12ab9e9..000000000 --- a/M3UA_CNL113537/demo/M3UA_Emulation.ttcn +++ /dev/null @@ -1 +0,0 @@ -../src/M3UA_Emulation.ttcn \ No newline at end of file diff --git a/M3UA_CNL113537/demo/M3UA_Emulation_Test.ttcn b/M3UA_CNL113537/demo/M3UA_Emulation_Test.ttcn deleted file mode 100644 index 4c1e86af6..000000000 --- a/M3UA_CNL113537/demo/M3UA_Emulation_Test.ttcn +++ /dev/null @@ -1,152 +0,0 @@ -module M3UA_Emulation_Test -{ - -//import from MTP3asp_PortType all; -import from MTP3asp_Types all; -import from BICC_Types all; -import from M3UA_Emulation all; -import from SCTPasp_PortType all; - -modulepar -{ - SCTP_Association_Address tsp_address := { 0, "", 0, "" }; - // float tsp_serverWait := 5.0; - // boolean tsp_serverTest := false; -} - -type port MTP3asp_PT_Int message -{ - out ASP_MTP3_TRANSFERreq; - in ASP_MTP3_TRANSFERind; -} with {extension "internal"} - -type component BICC_CT -{ - port MTP3asp_PT_Int BICC_MTP3_PORT; -} - -type component MTC_CT -{ - var BICC_CT vlc_BICC_COMPONENT_1; - var M3UA_CT vlc_M3UA_COMPONENT_1; - port SCTPasp_PT SCTP_PORT; - -// var BICC_CT vlc_BICC_COMPONENT_2; -// port MTP3asp_PT M3UA_PORT; -} - -function f_testconfig_bicc(SCTP_Association_Address pl_address) runs on MTC_CT -{ - vlc_BICC_COMPONENT_1 := BICC_CT.create; - vlc_M3UA_COMPONENT_1 := M3UA_CT.create; - connect(vlc_BICC_COMPONENT_1:BICC_MTP3_PORT, - vlc_M3UA_COMPONENT_1:MTP3_SP_PORT); - map(system:SCTP_PORT, vlc_M3UA_COMPONENT_1:SCTP_PORT); - vlc_M3UA_COMPONENT_1.start(f_M3UA_Emulation(pl_address)); -} - -function f_testconfig_end_demo_bicc() runs on MTC_CT -{ - unmap(system:SCTP_PORT, vlc_M3UA_COMPONENT_1:SCTP_PORT); - disconnect(vlc_BICC_COMPONENT_1:BICC_MTP3_PORT, vlc_M3UA_COMPONENT_1:MTP3_SP_PORT); - vlc_M3UA_COMPONENT_1.stop; -} - -template ASP_MTP3_TRANSFERind tr_ASP_MTP3_TRANSFERind_BICC := -{ sio := { - ni := '10'B, - prio := ?, - si := '1101'B - }, - opc := ?, - dpc := ?, - sls := ?, - data := ? -} - -function f_init_BICC_bicc() runs on BICC_CT -{ - var PDU_BICC vl_PDU_BICC; - var ASP_MTP3_TRANSFERind vl_ASP_MTP3_TRANSFERind; - var ASP_MTP3_TRANSFERreq vl_ASP_MTP3_TRANSFERreq; - - vl_PDU_BICC := { - BICC_GRA := { - CIC := '00000000'O, - MType := '00010111'B, - var_part_ptr := 1, - RngSts := - { range := '1F'O, - status := ''O - } - } - } - - vl_ASP_MTP3_TRANSFERreq := { - sio := { - ni := '10'B, - prio := '00'B, - si := '1101'B - }, - opc := 115, - dpc := 300, - sls := 0, - data := enc_PDU_BICC(vl_PDU_BICC) - } - - timer T_Timer := 5.0; - T_Timer.start; - alt { - [] BICC_MTP3_PORT.receive(tr_ASP_MTP3_TRANSFERind_BICC) - -> value vl_ASP_MTP3_TRANSFERind { - log("BICC_MTP3_PORT: received message: ", vl_ASP_MTP3_TRANSFERind); - vl_PDU_BICC := dec_PDU_BICC(vl_ASP_MTP3_TRANSFERind.data); - log("received BICC message: ", vl_PDU_BICC); - setverdict(pass); - BICC_MTP3_PORT.send(vl_ASP_MTP3_TRANSFERreq); - T_Timer.stop; - } - [] BICC_MTP3_PORT.receive(ASP_MTP3_TRANSFERind : ?) - -> value vl_ASP_MTP3_TRANSFERind { - log("BICC_MTP3_PORT: received message: ", vl_ASP_MTP3_TRANSFERind); - repeat; - } - [] BICC_MTP3_PORT.receive { - setverdict(fail); - } - [] T_Timer.timeout { - setverdict(fail); - } - } - - T_Timer.start; - alt { - [] BICC_MTP3_PORT.receive(tr_ASP_MTP3_TRANSFERind_BICC) - -> value vl_ASP_MTP3_TRANSFERind { - log("BICC_MTP3_PORT: received message: ", vl_ASP_MTP3_TRANSFERind); - vl_PDU_BICC := dec_PDU_BICC(vl_ASP_MTP3_TRANSFERind.data); - log("received BICC message: ", vl_PDU_BICC); - repeat; - } - [] BICC_MTP3_PORT.receive(ASP_MTP3_TRANSFERind : ?) - -> value vl_ASP_MTP3_TRANSFERind { - log("BICC_MTP3_PORT: received message: ", vl_ASP_MTP3_TRANSFERind); - repeat; - } - [] BICC_MTP3_PORT.receive { - } - [] T_Timer.timeout { - } - } - -} - -testcase tc_M3UA_demo_bicc() runs on MTC_CT -{ - f_testconfig_bicc(tsp_address); - vlc_BICC_COMPONENT_1.start(f_init_BICC_bicc()); - vlc_BICC_COMPONENT_1.done; - f_testconfig_end_demo_bicc(); -} - -} diff --git a/M3UA_CNL113537/demo/M3UA_Types.ttcn b/M3UA_CNL113537/demo/M3UA_Types.ttcn deleted file mode 120000 index ca43cb342..000000000 --- a/M3UA_CNL113537/demo/M3UA_Types.ttcn +++ /dev/null @@ -1 +0,0 @@ -../../../ProtocolModules/M3UA_CNL113536/src/M3UA_Types.ttcn \ No newline at end of file diff --git a/M3UA_CNL113537/demo/MTP3asp_EncDec.cc b/M3UA_CNL113537/demo/MTP3asp_EncDec.cc deleted file mode 120000 index 88f108395..000000000 --- a/M3UA_CNL113537/demo/MTP3asp_EncDec.cc +++ /dev/null @@ -1 +0,0 @@ -../../../TestPorts/MTP3asp_CNL113337/src/MTP3asp_EncDec.cc \ No newline at end of file diff --git a/M3UA_CNL113537/demo/MTP3asp_Types.ttcn b/M3UA_CNL113537/demo/MTP3asp_Types.ttcn deleted file mode 120000 index 9f03c54ed..000000000 --- a/M3UA_CNL113537/demo/MTP3asp_Types.ttcn +++ /dev/null @@ -1 +0,0 @@ -../../../TestPorts/MTP3asp_CNL113337/src/MTP3asp_Types.ttcn \ No newline at end of file diff --git a/M3UA_CNL113537/demo/Makefile b/M3UA_CNL113537/demo/Makefile deleted file mode 100644 index ffc0aeb09..000000000 --- a/M3UA_CNL113537/demo/Makefile +++ /dev/null @@ -1,920 +0,0 @@ -# This Makefile was generated by the Makefile Generator -# of the TTCN-3 Test Executor version 1.7.pre1 build 7 -# for Gabor Bettesch (ethgbh@mwux018) on Tue May 29 11:06:47 2007 - -# Copyright 2000-2007 Test Competence Center, Ericsson R & D, Hungary -# For trouble reporting use the tool MTTSMS. -# For TR writers guide please visit the web page: http://ttcn.ericsson.se - -# The following make commands are available: -# - make, make all Builds the executable test suite. -# - make archive Archives all source files. -# - make check Checks the semantics of TTCN-3 and ASN.1 modules. -# - make clean Removes all generated files. -# - make compile Translates TTCN-3 and ASN.1 modules to C++. -# - make dep Creates/updates dependency list. -# - make objects Builds the object files without linking the executable. -# - make tags Creates/updates tags file using ctags. - -# WARNING! This Makefile can be used with GNU make only. -# Other versions of make may report syntax errors in it. - -# -# Do NOT touch this line... -# -.PHONY: all archive check clean dep objects - -# -# Set these variables... -# - -# The path of your TTCN-3 Test Executor installation: -# Uncomment this line to override the environment variable. -# TTCN3_DIR = - -# Your platform: (SOLARIS, SOLARIS8, LINUX, FREEBSD or WIN32) -PLATFORM = LINUX - -# Your C++ compiler: -CXX = g++ - -# Flags for the C++ preprocessor (and makedepend as well): -CPPFLAGS = -D$(PLATFORM) -DTARGET_TEST -I$(TTCN3_DIR)/include -I$(SCTP_DIR)/include - -# Flags for the C++ compiler: -CXXFLAGS = -Wall - -# Flags for the linker: -LDFLAGS = - -# Flags for the TTCN-3 and ASN.1 compiler: -COMPILER_FLAGS = -L - -# Execution mode: (either ttcn3 or ttcn3-parallel) -TTCN3_LIB = ttcn3-parallel - -# The path of your OpenSSL installation: -# If you do not have your own one, leave it unchanged. -OPENSSL_DIR = $(TTCN3_DIR) - -# Directory to store the archived source files: -ARCHIVE_DIR = backup - -SCTP_DIR = /usr/local/lksctp-tools-1.0.6 -# -# You may change these variables. Add your files if necessary... -# - -# TTCN-3 modules of this project: -TTCN3_MODULES = General_Types.ttcn BICC_Types.ttcn M3UA_Emulation.ttcn M3UA_Emulation_Test.ttcn M3UA_Types.ttcn SCTPasp_PortType.ttcn SCTPasp_Types.ttcn MTP3asp_Types.ttcn -#MTP3asp_PortType.ttcn -# ASN.1 modules of this project: -ASN1_MODULES = - -# C++ source & header files generated from the TTCN-3 & ASN.1 modules of -# this project: -GENERATED_SOURCES = $(TTCN3_MODULES:.ttcn=.cc) $(ASN1_MODULES:.asn=.cc) -GENERATED_HEADERS = $(GENERATED_SOURCES:.cc=.hh) - -# C/C++ Source & header files of Test Ports, external functions and -# other modules: -USER_SOURCES = Abstract_Socket.cc BICC_EncDec.cc SCTPasp_PT.cc MTP3asp_EncDec.cc -USER_HEADERS = Abstract_Socket.hh SCTPasp_PT.hh -#MTP3asp_PT.hh MTP3asp_PT.cc -# Object files of this project that are needed for the executable test suite: -OBJECTS = $(GENERATED_SOURCES:.cc=.o) $(USER_SOURCES:.cc=.o) - -# Other files of the project (Makefile, configuration files, etc.) -# that will be added to the archived source files: -OTHER_FILES = m3ua_emu.cfg Makefile - -# The name of the executable test suite: -TARGET = M3UA_Emulation_Test - -# -# Do not modify these unless you know what you are doing... -# Platform specific additional libraries: -# -SOLARIS_LIBS = -lsocket -lnsl -SOLARIS8_LIBS = -lsocket -lnsl -LINUX_LIBS = -FREEBSD_LIBS = -WIN32_LIBS = - -# -# Rules for building the executable... -# - -all: $(TARGET) ; - -objects: $(OBJECTS) ; - -$(TARGET): $(OBJECTS) - $(CXX) $(LDFLAGS) -o $@ $^ \ - -L$(TTCN3_DIR)/lib -L$(SCTP_DIR)/lib -l$(TTCN3_LIB) \ - -L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS) - -.cc.o .c.o: - $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $< - -$(GENERATED_SOURCES) $(GENERATED_HEADERS): compile - @if [ ! -f $@ ]; then $(RM) compile; $(MAKE) compile; fi - -check: $(TTCN3_MODULES) $(ASN1_MODULES) - $(TTCN3_DIR)/bin/compiler -s $(COMPILER_FLAGS) $^ - -compile: $(TTCN3_MODULES) $(ASN1_MODULES) - $(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) $^ - $? - touch $@ - -browserdata.dat: $(TTCN3_MODULES) $(ASN1_MODULES) - $(TTCN3_DIR)/bin/compiler -B -s $(COMPILER_FLAGS) $^ - -tags: $(TTCN3_MODULES) $(ASN1_MODULES) \ -$(USER_HEADERS) $(USER_SOURCES) - $(TTCN3_DIR)/bin/ctags_ttcn3 --line-directives=yes $^ - -clean: - -$(RM) $(TARGET) $(OBJECTS) $(GENERATED_HEADERS) \ - $(GENERATED_SOURCES) compile \ - browserdata.dat tags *.log - -dep: $(GENERATED_SOURCES) $(USER_SOURCES) - makedepend $(CPPFLAGS) $^ - -archive: - mkdir -p $(ARCHIVE_DIR) - tar -cvhf - $(TTCN3_MODULES) $(ASN1_MODULES) \ - $(USER_HEADERS) $(USER_SOURCES) $(OTHER_FILES) \ - | gzip >$(ARCHIVE_DIR)/`basename $(TARGET) .exe`-`date '+%y%m%d-%H%M'`.tgz - -# -# Add your rules here if necessary... -# - -# DO NOT DELETE - -General_Types.o: General_Types.hh /usr/local/TTCNv3-1.7.pl0/include/TTCN3.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/version.h -General_Types.o: /usr/include/string.h /usr/include/features.h -General_Types.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -General_Types.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -General_Types.o: /usr/include/stdio.h /usr/include/bits/types.h -General_Types.o: /usr/include/bits/typesizes.h /usr/include/libio.h -General_Types.o: /usr/include/_G_config.h /usr/include/wchar.h -General_Types.o: /usr/include/bits/wchar.h /usr/include/gconv.h -General_Types.o: /usr/include/bits/stdio_lim.h -General_Types.o: /usr/include/bits/sys_errlist.h -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Basetype.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Types.h -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Encdec.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Template.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Integer.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Optional.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/BER.hh -General_Types.o: /usr/include/stdlib.h /usr/include/sys/types.h -General_Types.o: /usr/include/time.h /usr/include/endian.h -General_Types.o: /usr/include/bits/endian.h /usr/include/sys/select.h -General_Types.o: /usr/include/bits/select.h /usr/include/bits/sigset.h -General_Types.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h -General_Types.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Logger.hh -General_Types.o: /usr/include/sys/time.h -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Textbuf.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Error.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Parameters.h -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Float.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Boolean.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Null.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Objid.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Verdicttype.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Component.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Bitstring.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/RAW.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Hexstring.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Octetstring.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Any.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Charstring.hh -General_Types.o: /usr/include/regex.h -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Universal_charstring.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Struct_of.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Array.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_CharacterString.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_External.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_EmbeddedPDV.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Addfunc.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Timer.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Port.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Module_list.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Snapshot.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Default.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Runtime.hh -General_Types.o: /usr/local/TTCNv3-1.7.pl0/include/TEXT.hh -BICC_Types.o: BICC_Types.hh General_Types.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/TTCN3.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/version.h -BICC_Types.o: /usr/include/string.h /usr/include/features.h -BICC_Types.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -BICC_Types.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -BICC_Types.o: /usr/include/stdio.h /usr/include/bits/types.h -BICC_Types.o: /usr/include/bits/typesizes.h /usr/include/libio.h -BICC_Types.o: /usr/include/_G_config.h /usr/include/wchar.h -BICC_Types.o: /usr/include/bits/wchar.h /usr/include/gconv.h -BICC_Types.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Basetype.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Types.h -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Encdec.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Template.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Integer.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Optional.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/BER.hh /usr/include/stdlib.h -BICC_Types.o: /usr/include/sys/types.h /usr/include/time.h -BICC_Types.o: /usr/include/endian.h /usr/include/bits/endian.h -BICC_Types.o: /usr/include/sys/select.h /usr/include/bits/select.h -BICC_Types.o: /usr/include/bits/sigset.h /usr/include/bits/time.h -BICC_Types.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h -BICC_Types.o: /usr/include/alloca.h -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Logger.hh -BICC_Types.o: /usr/include/sys/time.h -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Textbuf.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Error.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Parameters.h -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Float.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Boolean.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Null.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Objid.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Verdicttype.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Component.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Bitstring.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/RAW.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Hexstring.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Octetstring.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Any.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Charstring.hh -BICC_Types.o: /usr/include/regex.h -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Universal_charstring.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Struct_of.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Array.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_CharacterString.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_External.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_EmbeddedPDV.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Addfunc.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Timer.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Port.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Module_list.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Snapshot.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Default.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Runtime.hh -BICC_Types.o: /usr/local/TTCNv3-1.7.pl0/include/TEXT.hh -M3UA_Emulation.o: M3UA_Emulation.hh M3UA_Types.hh General_Types.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/TTCN3.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/version.h -M3UA_Emulation.o: /usr/include/string.h /usr/include/features.h -M3UA_Emulation.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -M3UA_Emulation.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -M3UA_Emulation.o: /usr/include/stdio.h /usr/include/bits/types.h -M3UA_Emulation.o: /usr/include/bits/typesizes.h /usr/include/libio.h -M3UA_Emulation.o: /usr/include/_G_config.h /usr/include/wchar.h -M3UA_Emulation.o: /usr/include/bits/wchar.h /usr/include/gconv.h -M3UA_Emulation.o: /usr/include/bits/stdio_lim.h -M3UA_Emulation.o: /usr/include/bits/sys_errlist.h -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Basetype.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Types.h -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Encdec.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Template.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Integer.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Optional.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/BER.hh -M3UA_Emulation.o: /usr/include/stdlib.h /usr/include/sys/types.h -M3UA_Emulation.o: /usr/include/time.h /usr/include/endian.h -M3UA_Emulation.o: /usr/include/bits/endian.h /usr/include/sys/select.h -M3UA_Emulation.o: /usr/include/bits/select.h /usr/include/bits/sigset.h -M3UA_Emulation.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h -M3UA_Emulation.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Logger.hh -M3UA_Emulation.o: /usr/include/sys/time.h -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Textbuf.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Error.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Parameters.h -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Float.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Boolean.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Null.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Objid.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Verdicttype.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Component.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Bitstring.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/RAW.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Hexstring.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Octetstring.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Any.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Charstring.hh -M3UA_Emulation.o: /usr/include/regex.h -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Universal_charstring.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Struct_of.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Array.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_CharacterString.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_External.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_EmbeddedPDV.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Addfunc.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Timer.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Port.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Module_list.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Snapshot.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Default.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/Runtime.hh -M3UA_Emulation.o: /usr/local/TTCNv3-1.7.pl0/include/TEXT.hh -M3UA_Emulation.o: SCTPasp_PortType.hh SCTPasp_Types.hh SCTPasp_PT.hh -M3UA_Emulation.o: /usr/include/sys/socket.h /usr/include/sys/uio.h -M3UA_Emulation.o: /usr/include/bits/uio.h /usr/include/bits/socket.h -M3UA_Emulation.o: /usr/include/limits.h /usr/include/bits/posix1_lim.h -M3UA_Emulation.o: /usr/include/bits/local_lim.h /usr/include/linux/limits.h -M3UA_Emulation.o: /usr/include/bits/posix2_lim.h /usr/include/bits/sockaddr.h -M3UA_Emulation.o: /usr/include/asm/socket.h /usr/include/asm/sockios.h -M3UA_Emulation.o: /usr/include/netinet/in.h /usr/include/stdint.h -M3UA_Emulation.o: /usr/include/bits/in.h /usr/include/bits/byteswap.h -M3UA_Emulation.o: /usr/local/lksctp-tools-1.0.6/include/netinet/sctp.h -M3UA_Emulation.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h -M3UA_Emulation.o: /usr/include/linux/stddef.h /usr/include/linux/compiler.h -M3UA_Emulation.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h -M3UA_Emulation.o: MTP3asp_Types.hh -M3UA_Emulation_Test.o: M3UA_Emulation_Test.hh BICC_Types.hh General_Types.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/TTCN3.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/version.h -M3UA_Emulation_Test.o: /usr/include/string.h /usr/include/features.h -M3UA_Emulation_Test.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -M3UA_Emulation_Test.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -M3UA_Emulation_Test.o: /usr/include/stdio.h /usr/include/bits/types.h -M3UA_Emulation_Test.o: /usr/include/bits/typesizes.h /usr/include/libio.h -M3UA_Emulation_Test.o: /usr/include/_G_config.h /usr/include/wchar.h -M3UA_Emulation_Test.o: /usr/include/bits/wchar.h /usr/include/gconv.h -M3UA_Emulation_Test.o: /usr/include/bits/stdio_lim.h -M3UA_Emulation_Test.o: /usr/include/bits/sys_errlist.h -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Basetype.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Types.h -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Encdec.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Template.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Integer.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Optional.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/BER.hh -M3UA_Emulation_Test.o: /usr/include/stdlib.h /usr/include/sys/types.h -M3UA_Emulation_Test.o: /usr/include/time.h /usr/include/endian.h -M3UA_Emulation_Test.o: /usr/include/bits/endian.h /usr/include/sys/select.h -M3UA_Emulation_Test.o: /usr/include/bits/select.h /usr/include/bits/sigset.h -M3UA_Emulation_Test.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h -M3UA_Emulation_Test.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Logger.hh -M3UA_Emulation_Test.o: /usr/include/sys/time.h -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Textbuf.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Error.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Parameters.h -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Float.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Boolean.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Null.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Objid.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Verdicttype.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Component.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Bitstring.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/RAW.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Hexstring.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Octetstring.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Any.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Charstring.hh -M3UA_Emulation_Test.o: /usr/include/regex.h -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Universal_charstring.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Struct_of.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Array.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_CharacterString.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_External.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_EmbeddedPDV.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Addfunc.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Timer.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Port.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Module_list.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Snapshot.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Default.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/Runtime.hh -M3UA_Emulation_Test.o: /usr/local/TTCNv3-1.7.pl0/include/TEXT.hh -M3UA_Emulation_Test.o: M3UA_Emulation.hh M3UA_Types.hh SCTPasp_PortType.hh -M3UA_Emulation_Test.o: SCTPasp_Types.hh SCTPasp_PT.hh -M3UA_Emulation_Test.o: /usr/include/sys/socket.h /usr/include/sys/uio.h -M3UA_Emulation_Test.o: /usr/include/bits/uio.h /usr/include/bits/socket.h -M3UA_Emulation_Test.o: /usr/include/limits.h /usr/include/bits/posix1_lim.h -M3UA_Emulation_Test.o: /usr/include/bits/local_lim.h -M3UA_Emulation_Test.o: /usr/include/linux/limits.h -M3UA_Emulation_Test.o: /usr/include/bits/posix2_lim.h -M3UA_Emulation_Test.o: /usr/include/bits/sockaddr.h /usr/include/asm/socket.h -M3UA_Emulation_Test.o: /usr/include/asm/sockios.h /usr/include/netinet/in.h -M3UA_Emulation_Test.o: /usr/include/stdint.h /usr/include/bits/in.h -M3UA_Emulation_Test.o: /usr/include/bits/byteswap.h -M3UA_Emulation_Test.o: /usr/local/lksctp-tools-1.0.6/include/netinet/sctp.h -M3UA_Emulation_Test.o: /usr/include/linux/types.h -M3UA_Emulation_Test.o: /usr/include/linux/posix_types.h -M3UA_Emulation_Test.o: /usr/include/linux/stddef.h -M3UA_Emulation_Test.o: /usr/include/linux/compiler.h -M3UA_Emulation_Test.o: /usr/include/asm/posix_types.h -M3UA_Emulation_Test.o: /usr/include/asm/types.h MTP3asp_Types.hh -M3UA_Types.o: M3UA_Types.hh General_Types.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/TTCN3.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/version.h -M3UA_Types.o: /usr/include/string.h /usr/include/features.h -M3UA_Types.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -M3UA_Types.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -M3UA_Types.o: /usr/include/stdio.h /usr/include/bits/types.h -M3UA_Types.o: /usr/include/bits/typesizes.h /usr/include/libio.h -M3UA_Types.o: /usr/include/_G_config.h /usr/include/wchar.h -M3UA_Types.o: /usr/include/bits/wchar.h /usr/include/gconv.h -M3UA_Types.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Basetype.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Types.h -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Encdec.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Template.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Integer.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Optional.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/BER.hh /usr/include/stdlib.h -M3UA_Types.o: /usr/include/sys/types.h /usr/include/time.h -M3UA_Types.o: /usr/include/endian.h /usr/include/bits/endian.h -M3UA_Types.o: /usr/include/sys/select.h /usr/include/bits/select.h -M3UA_Types.o: /usr/include/bits/sigset.h /usr/include/bits/time.h -M3UA_Types.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h -M3UA_Types.o: /usr/include/alloca.h -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Logger.hh -M3UA_Types.o: /usr/include/sys/time.h -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Textbuf.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Error.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Parameters.h -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Float.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Boolean.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Null.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Objid.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Verdicttype.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Component.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Bitstring.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/RAW.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Hexstring.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Octetstring.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Any.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Charstring.hh -M3UA_Types.o: /usr/include/regex.h -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Universal_charstring.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Struct_of.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Array.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_CharacterString.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_External.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_EmbeddedPDV.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Addfunc.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Timer.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Port.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Module_list.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Snapshot.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Default.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Runtime.hh -M3UA_Types.o: /usr/local/TTCNv3-1.7.pl0/include/TEXT.hh -SCTPasp_PortType.o: SCTPasp_PortType.hh SCTPasp_Types.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/TTCN3.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/version.h -SCTPasp_PortType.o: /usr/include/string.h /usr/include/features.h -SCTPasp_PortType.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -SCTPasp_PortType.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -SCTPasp_PortType.o: /usr/include/stdio.h /usr/include/bits/types.h -SCTPasp_PortType.o: /usr/include/bits/typesizes.h /usr/include/libio.h -SCTPasp_PortType.o: /usr/include/_G_config.h /usr/include/wchar.h -SCTPasp_PortType.o: /usr/include/bits/wchar.h /usr/include/gconv.h -SCTPasp_PortType.o: /usr/include/bits/stdio_lim.h -SCTPasp_PortType.o: /usr/include/bits/sys_errlist.h -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Basetype.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Types.h -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Encdec.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Template.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Integer.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Optional.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/BER.hh -SCTPasp_PortType.o: /usr/include/stdlib.h /usr/include/sys/types.h -SCTPasp_PortType.o: /usr/include/time.h /usr/include/endian.h -SCTPasp_PortType.o: /usr/include/bits/endian.h /usr/include/sys/select.h -SCTPasp_PortType.o: /usr/include/bits/select.h /usr/include/bits/sigset.h -SCTPasp_PortType.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h -SCTPasp_PortType.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Logger.hh -SCTPasp_PortType.o: /usr/include/sys/time.h -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Textbuf.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Error.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Parameters.h -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Float.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Boolean.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Null.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Objid.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Verdicttype.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Component.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Bitstring.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/RAW.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Hexstring.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Octetstring.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Any.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Charstring.hh -SCTPasp_PortType.o: /usr/include/regex.h -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Universal_charstring.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Struct_of.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Array.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_CharacterString.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_External.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_EmbeddedPDV.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Addfunc.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Timer.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Port.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Module_list.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Snapshot.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Default.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/Runtime.hh -SCTPasp_PortType.o: /usr/local/TTCNv3-1.7.pl0/include/TEXT.hh SCTPasp_PT.hh -SCTPasp_PortType.o: /usr/include/sys/socket.h /usr/include/sys/uio.h -SCTPasp_PortType.o: /usr/include/bits/uio.h /usr/include/bits/socket.h -SCTPasp_PortType.o: /usr/include/limits.h /usr/include/bits/posix1_lim.h -SCTPasp_PortType.o: /usr/include/bits/local_lim.h /usr/include/linux/limits.h -SCTPasp_PortType.o: /usr/include/bits/posix2_lim.h -SCTPasp_PortType.o: /usr/include/bits/sockaddr.h /usr/include/asm/socket.h -SCTPasp_PortType.o: /usr/include/asm/sockios.h /usr/include/netinet/in.h -SCTPasp_PortType.o: /usr/include/stdint.h /usr/include/bits/in.h -SCTPasp_PortType.o: /usr/include/bits/byteswap.h -SCTPasp_PortType.o: /usr/local/lksctp-tools-1.0.6/include/netinet/sctp.h -SCTPasp_PortType.o: /usr/include/linux/types.h -SCTPasp_PortType.o: /usr/include/linux/posix_types.h -SCTPasp_PortType.o: /usr/include/linux/stddef.h /usr/include/linux/compiler.h -SCTPasp_PortType.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h -SCTPasp_Types.o: SCTPasp_Types.hh /usr/local/TTCNv3-1.7.pl0/include/TTCN3.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/version.h -SCTPasp_Types.o: /usr/include/string.h /usr/include/features.h -SCTPasp_Types.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -SCTPasp_Types.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -SCTPasp_Types.o: /usr/include/stdio.h /usr/include/bits/types.h -SCTPasp_Types.o: /usr/include/bits/typesizes.h /usr/include/libio.h -SCTPasp_Types.o: /usr/include/_G_config.h /usr/include/wchar.h -SCTPasp_Types.o: /usr/include/bits/wchar.h /usr/include/gconv.h -SCTPasp_Types.o: /usr/include/bits/stdio_lim.h -SCTPasp_Types.o: /usr/include/bits/sys_errlist.h -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Basetype.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Types.h -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Encdec.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Template.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Integer.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Optional.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/BER.hh -SCTPasp_Types.o: /usr/include/stdlib.h /usr/include/sys/types.h -SCTPasp_Types.o: /usr/include/time.h /usr/include/endian.h -SCTPasp_Types.o: /usr/include/bits/endian.h /usr/include/sys/select.h -SCTPasp_Types.o: /usr/include/bits/select.h /usr/include/bits/sigset.h -SCTPasp_Types.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h -SCTPasp_Types.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Logger.hh -SCTPasp_Types.o: /usr/include/sys/time.h -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Textbuf.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Error.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Parameters.h -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Float.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Boolean.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Null.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Objid.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Verdicttype.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Component.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Bitstring.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/RAW.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Hexstring.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Octetstring.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Any.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Charstring.hh -SCTPasp_Types.o: /usr/include/regex.h -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Universal_charstring.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Struct_of.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Array.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_CharacterString.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_External.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_EmbeddedPDV.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Addfunc.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Timer.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Port.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Module_list.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Snapshot.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Default.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Runtime.hh -SCTPasp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/TEXT.hh -MTP3asp_Types.o: MTP3asp_Types.hh /usr/local/TTCNv3-1.7.pl0/include/TTCN3.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/version.h -MTP3asp_Types.o: /usr/include/string.h /usr/include/features.h -MTP3asp_Types.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -MTP3asp_Types.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -MTP3asp_Types.o: /usr/include/stdio.h /usr/include/bits/types.h -MTP3asp_Types.o: /usr/include/bits/typesizes.h /usr/include/libio.h -MTP3asp_Types.o: /usr/include/_G_config.h /usr/include/wchar.h -MTP3asp_Types.o: /usr/include/bits/wchar.h /usr/include/gconv.h -MTP3asp_Types.o: /usr/include/bits/stdio_lim.h -MTP3asp_Types.o: /usr/include/bits/sys_errlist.h -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Basetype.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Types.h -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Encdec.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Template.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Integer.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Optional.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/BER.hh -MTP3asp_Types.o: /usr/include/stdlib.h /usr/include/sys/types.h -MTP3asp_Types.o: /usr/include/time.h /usr/include/endian.h -MTP3asp_Types.o: /usr/include/bits/endian.h /usr/include/sys/select.h -MTP3asp_Types.o: /usr/include/bits/select.h /usr/include/bits/sigset.h -MTP3asp_Types.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h -MTP3asp_Types.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Logger.hh -MTP3asp_Types.o: /usr/include/sys/time.h -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Textbuf.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Error.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Parameters.h -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Float.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Boolean.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Null.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Objid.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Verdicttype.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Component.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Bitstring.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/RAW.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Hexstring.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Octetstring.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Any.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Charstring.hh -MTP3asp_Types.o: /usr/include/regex.h -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Universal_charstring.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Struct_of.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Array.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_CharacterString.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_External.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_EmbeddedPDV.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Addfunc.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Timer.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Port.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Module_list.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Snapshot.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Default.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/Runtime.hh -MTP3asp_Types.o: /usr/local/TTCNv3-1.7.pl0/include/TEXT.hh -Abstract_Socket.o: Abstract_Socket.hh /usr/include/sys/socket.h -Abstract_Socket.o: /usr/include/features.h /usr/include/sys/cdefs.h -Abstract_Socket.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h -Abstract_Socket.o: /usr/include/gnu/stubs-32.h /usr/include/sys/uio.h -Abstract_Socket.o: /usr/include/sys/types.h /usr/include/bits/types.h -Abstract_Socket.o: /usr/include/bits/typesizes.h /usr/include/time.h -Abstract_Socket.o: /usr/include/endian.h /usr/include/bits/endian.h -Abstract_Socket.o: /usr/include/sys/select.h /usr/include/bits/select.h -Abstract_Socket.o: /usr/include/bits/sigset.h /usr/include/bits/time.h -Abstract_Socket.o: /usr/include/sys/sysmacros.h -Abstract_Socket.o: /usr/include/bits/pthreadtypes.h /usr/include/bits/uio.h -Abstract_Socket.o: /usr/include/bits/socket.h /usr/include/limits.h -Abstract_Socket.o: /usr/include/bits/posix1_lim.h -Abstract_Socket.o: /usr/include/bits/local_lim.h /usr/include/linux/limits.h -Abstract_Socket.o: /usr/include/bits/posix2_lim.h -Abstract_Socket.o: /usr/include/bits/sockaddr.h /usr/include/asm/socket.h -Abstract_Socket.o: /usr/include/asm/sockios.h /usr/include/netinet/in.h -Abstract_Socket.o: /usr/include/stdint.h /usr/include/bits/wchar.h -Abstract_Socket.o: /usr/include/bits/in.h /usr/include/bits/byteswap.h -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/TTCN3.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/version.h -Abstract_Socket.o: /usr/include/string.h /usr/include/stdio.h -Abstract_Socket.o: /usr/include/libio.h /usr/include/_G_config.h -Abstract_Socket.o: /usr/include/wchar.h /usr/include/gconv.h -Abstract_Socket.o: /usr/include/bits/stdio_lim.h -Abstract_Socket.o: /usr/include/bits/sys_errlist.h -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Basetype.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Types.h -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Encdec.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Template.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Integer.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Optional.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/BER.hh -Abstract_Socket.o: /usr/include/stdlib.h /usr/include/alloca.h -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Logger.hh -Abstract_Socket.o: /usr/include/sys/time.h -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Textbuf.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Error.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Parameters.h -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Float.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Boolean.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Null.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Objid.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Verdicttype.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Component.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Bitstring.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/RAW.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Hexstring.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Octetstring.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Any.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Charstring.hh -Abstract_Socket.o: /usr/include/regex.h -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Universal_charstring.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Struct_of.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Array.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_CharacterString.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_External.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_EmbeddedPDV.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Addfunc.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Timer.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Port.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Module_list.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Snapshot.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Default.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/Runtime.hh -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/TEXT.hh -Abstract_Socket.o: /usr/include/unistd.h /usr/include/bits/posix_opt.h -Abstract_Socket.o: /usr/include/bits/confname.h /usr/include/getopt.h -Abstract_Socket.o: /usr/include/strings.h /usr/include/errno.h -Abstract_Socket.o: /usr/include/bits/errno.h /usr/include/linux/errno.h -Abstract_Socket.o: /usr/include/asm/errno.h /usr/include/asm-generic/errno.h -Abstract_Socket.o: /usr/include/asm-generic/errno-base.h /usr/include/netdb.h -Abstract_Socket.o: /usr/include/rpc/netdb.h /usr/include/bits/netdb.h -Abstract_Socket.o: /usr/include/sys/stat.h /usr/include/bits/stat.h -Abstract_Socket.o: /usr/include/netinet/tcp.h /usr/include/arpa/inet.h -Abstract_Socket.o: /usr/include/fcntl.h /usr/include/bits/fcntl.h -Abstract_Socket.o: /usr/local/TTCNv3-1.7.pl0/include/memory.h -BICC_EncDec.o: BICC_Types.hh General_Types.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/TTCN3.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/version.h -BICC_EncDec.o: /usr/include/string.h /usr/include/features.h -BICC_EncDec.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -BICC_EncDec.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -BICC_EncDec.o: /usr/include/stdio.h /usr/include/bits/types.h -BICC_EncDec.o: /usr/include/bits/typesizes.h /usr/include/libio.h -BICC_EncDec.o: /usr/include/_G_config.h /usr/include/wchar.h -BICC_EncDec.o: /usr/include/bits/wchar.h /usr/include/gconv.h -BICC_EncDec.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Basetype.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Types.h -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Encdec.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Template.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Integer.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Optional.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/BER.hh /usr/include/stdlib.h -BICC_EncDec.o: /usr/include/sys/types.h /usr/include/time.h -BICC_EncDec.o: /usr/include/endian.h /usr/include/bits/endian.h -BICC_EncDec.o: /usr/include/sys/select.h /usr/include/bits/select.h -BICC_EncDec.o: /usr/include/bits/sigset.h /usr/include/bits/time.h -BICC_EncDec.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h -BICC_EncDec.o: /usr/include/alloca.h -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Logger.hh -BICC_EncDec.o: /usr/include/sys/time.h -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Textbuf.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Error.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Parameters.h -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Float.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Boolean.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Null.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Objid.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Verdicttype.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Component.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Bitstring.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/RAW.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Hexstring.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Octetstring.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Any.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Charstring.hh -BICC_EncDec.o: /usr/include/regex.h -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Universal_charstring.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Struct_of.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Array.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_CharacterString.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_External.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_EmbeddedPDV.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Addfunc.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Timer.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Port.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Module_list.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Snapshot.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Default.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Runtime.hh -BICC_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/TEXT.hh -SCTPasp_PT.o: SCTPasp_PT.hh SCTPasp_PortType.hh SCTPasp_Types.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/TTCN3.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/version.h -SCTPasp_PT.o: /usr/include/string.h /usr/include/features.h -SCTPasp_PT.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -SCTPasp_PT.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -SCTPasp_PT.o: /usr/include/stdio.h /usr/include/bits/types.h -SCTPasp_PT.o: /usr/include/bits/typesizes.h /usr/include/libio.h -SCTPasp_PT.o: /usr/include/_G_config.h /usr/include/wchar.h -SCTPasp_PT.o: /usr/include/bits/wchar.h /usr/include/gconv.h -SCTPasp_PT.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Basetype.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Types.h -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Encdec.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Template.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Integer.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Optional.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/BER.hh /usr/include/stdlib.h -SCTPasp_PT.o: /usr/include/sys/types.h /usr/include/time.h -SCTPasp_PT.o: /usr/include/endian.h /usr/include/bits/endian.h -SCTPasp_PT.o: /usr/include/sys/select.h /usr/include/bits/select.h -SCTPasp_PT.o: /usr/include/bits/sigset.h /usr/include/bits/time.h -SCTPasp_PT.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h -SCTPasp_PT.o: /usr/include/alloca.h -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Logger.hh -SCTPasp_PT.o: /usr/include/sys/time.h -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Textbuf.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Error.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Parameters.h -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Float.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Boolean.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Null.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Objid.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Verdicttype.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Component.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Bitstring.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/RAW.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Hexstring.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Octetstring.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Any.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Charstring.hh -SCTPasp_PT.o: /usr/include/regex.h -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Universal_charstring.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Struct_of.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Array.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_CharacterString.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_External.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_EmbeddedPDV.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Addfunc.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Timer.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Port.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Module_list.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Snapshot.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Default.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/Runtime.hh -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/TEXT.hh -SCTPasp_PT.o: /usr/include/sys/socket.h /usr/include/sys/uio.h -SCTPasp_PT.o: /usr/include/bits/uio.h /usr/include/bits/socket.h -SCTPasp_PT.o: /usr/include/limits.h /usr/include/bits/posix1_lim.h -SCTPasp_PT.o: /usr/include/bits/local_lim.h /usr/include/linux/limits.h -SCTPasp_PT.o: /usr/include/bits/posix2_lim.h /usr/include/bits/sockaddr.h -SCTPasp_PT.o: /usr/include/asm/socket.h /usr/include/asm/sockios.h -SCTPasp_PT.o: /usr/include/netinet/in.h /usr/include/stdint.h -SCTPasp_PT.o: /usr/include/bits/in.h /usr/include/bits/byteswap.h -SCTPasp_PT.o: /usr/local/lksctp-tools-1.0.6/include/netinet/sctp.h -SCTPasp_PT.o: /usr/include/linux/types.h /usr/include/linux/posix_types.h -SCTPasp_PT.o: /usr/include/linux/stddef.h /usr/include/linux/compiler.h -SCTPasp_PT.o: /usr/include/asm/posix_types.h /usr/include/asm/types.h -SCTPasp_PT.o: /usr/include/arpa/inet.h /usr/include/unistd.h -SCTPasp_PT.o: /usr/include/bits/posix_opt.h /usr/include/bits/confname.h -SCTPasp_PT.o: /usr/include/getopt.h /usr/include/netdb.h -SCTPasp_PT.o: /usr/include/rpc/netdb.h /usr/include/bits/netdb.h -SCTPasp_PT.o: /usr/local/TTCNv3-1.7.pl0/include/memory.h /usr/include/fcntl.h -SCTPasp_PT.o: /usr/include/bits/fcntl.h /usr/include/errno.h -SCTPasp_PT.o: /usr/include/bits/errno.h /usr/include/linux/errno.h -SCTPasp_PT.o: /usr/include/asm/errno.h /usr/include/asm-generic/errno.h -SCTPasp_PT.o: /usr/include/asm-generic/errno-base.h -MTP3asp_EncDec.o: MTP3asp_Types.hh /usr/local/TTCNv3-1.7.pl0/include/TTCN3.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/version.h -MTP3asp_EncDec.o: /usr/include/string.h /usr/include/features.h -MTP3asp_EncDec.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -MTP3asp_EncDec.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -MTP3asp_EncDec.o: /usr/include/stdio.h /usr/include/bits/types.h -MTP3asp_EncDec.o: /usr/include/bits/typesizes.h /usr/include/libio.h -MTP3asp_EncDec.o: /usr/include/_G_config.h /usr/include/wchar.h -MTP3asp_EncDec.o: /usr/include/bits/wchar.h /usr/include/gconv.h -MTP3asp_EncDec.o: /usr/include/bits/stdio_lim.h -MTP3asp_EncDec.o: /usr/include/bits/sys_errlist.h -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Basetype.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Types.h -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Encdec.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Template.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Integer.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Optional.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/BER.hh -MTP3asp_EncDec.o: /usr/include/stdlib.h /usr/include/sys/types.h -MTP3asp_EncDec.o: /usr/include/time.h /usr/include/endian.h -MTP3asp_EncDec.o: /usr/include/bits/endian.h /usr/include/sys/select.h -MTP3asp_EncDec.o: /usr/include/bits/select.h /usr/include/bits/sigset.h -MTP3asp_EncDec.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h -MTP3asp_EncDec.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Logger.hh -MTP3asp_EncDec.o: /usr/include/sys/time.h -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Textbuf.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Error.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Parameters.h -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Float.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Boolean.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Null.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Objid.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Verdicttype.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Component.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Bitstring.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/RAW.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Hexstring.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Octetstring.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_Any.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Charstring.hh -MTP3asp_EncDec.o: /usr/include/regex.h -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Universal_charstring.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Struct_of.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Array.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_CharacterString.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_External.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/ASN_EmbeddedPDV.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Addfunc.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Timer.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Port.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Module_list.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Snapshot.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Default.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/Runtime.hh -MTP3asp_EncDec.o: /usr/local/TTCNv3-1.7.pl0/include/TEXT.hh diff --git a/M3UA_CNL113537/demo/SCTPasp_PT.cc b/M3UA_CNL113537/demo/SCTPasp_PT.cc deleted file mode 120000 index 2b931e952..000000000 --- a/M3UA_CNL113537/demo/SCTPasp_PT.cc +++ /dev/null @@ -1 +0,0 @@ -../../../TestPorts/SCTPasp_CNL113469/src/SCTPasp_PT.cc \ No newline at end of file diff --git a/M3UA_CNL113537/demo/SCTPasp_PT.hh b/M3UA_CNL113537/demo/SCTPasp_PT.hh deleted file mode 120000 index e37473f5a..000000000 --- a/M3UA_CNL113537/demo/SCTPasp_PT.hh +++ /dev/null @@ -1 +0,0 @@ -../../../TestPorts/SCTPasp_CNL113469/src/SCTPasp_PT.hh \ No newline at end of file diff --git a/M3UA_CNL113537/demo/SCTPasp_PortType.ttcn b/M3UA_CNL113537/demo/SCTPasp_PortType.ttcn deleted file mode 120000 index 4394e347f..000000000 --- a/M3UA_CNL113537/demo/SCTPasp_PortType.ttcn +++ /dev/null @@ -1 +0,0 @@ -../../../TestPorts/SCTPasp_CNL113469/src/SCTPasp_PortType.ttcn \ No newline at end of file diff --git a/M3UA_CNL113537/demo/SCTPasp_Types.ttcn b/M3UA_CNL113537/demo/SCTPasp_Types.ttcn deleted file mode 120000 index 71876a06e..000000000 --- a/M3UA_CNL113537/demo/SCTPasp_Types.ttcn +++ /dev/null @@ -1 +0,0 @@ -../../../TestPorts/SCTPasp_CNL113469/src/SCTPasp_Types.ttcn \ No newline at end of file diff --git a/M3UA_CNL113537/demo/m3ua_emu.cfg b/M3UA_CNL113537/demo/m3ua_emu.cfg deleted file mode 100644 index 9533515d1..000000000 --- a/M3UA_CNL113537/demo/m3ua_emu.cfg +++ /dev/null @@ -1,21 +0,0 @@ -[LOGGING] -LogSourceInfo := Yes -FileMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING -ConsoleMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING - -[EXECUTE] -M3UA_Emulation_Test.tc_M3UA_demo_bicc - -[TESTPORT_PARAMETERS] -system.SCTP_PORT.debug := "yes" - -[MODULE_PARAMETERS] -M3UA_Emulation.tsp_logVerbose := true; -M3UA_Emulation.tsp_M3UA_Server_Mode := false; -M3UA_Emulation_Test.tsp_address := -{ - local_sctp_port := 2905, - local_ip_addr := "10.6.70.19", - remote_sctp_port := 2905, - remote_ip_addr := "159.107.193.33" -} diff --git a/M3UA_CNL113537/src/M3UA_Emulation.ttcn b/M3UA_CNL113537/src/M3UA_Emulation.ttcn deleted file mode 100644 index 7a4a7e9b2..000000000 --- a/M3UA_CNL113537/src/M3UA_Emulation.ttcn +++ /dev/null @@ -1,1307 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// // -// Copyright Test Competence Center (TCC) ETH 2009 // -// // -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied // -// // -/////////////////////////////////////////////////////////////////////////////// -// -// File: M3UA_Emulation.ttcn -// Reference: M3UA Protocol Emulation -// Rev: R1B01 -// Prodnr: CNL 113 537 -// Updated: 2009-01-06 -// Contact: http://ttcn.ericsson.se - -module M3UA_Emulation -{ - -modulepar -{ - boolean tsp_logVerbose := false; - float tsp_Timer := 2.0; // General timer used in M3UA emulation. - float tsp_ASPUP_Resend_Timer := 2.0; - float tsp_ASPAC_Resend_Timer := 2.0; - float tsp_Assoc_Restart_Timer := 60.0; - float tsp_Heartbeat_Timer := 30.0; - integer tsp_SCTP_PayloadProtocolID := 3; // 3 for M3UA. - boolean tsp_Enable_M3UA_Heartbeat := false; // Send SCTP packets periodically. - boolean tsp_SCTP_Server_Mode := false; - boolean tsp_M3UA_Server_Mode := false; -} - -import from General_Types all; -import from M3UA_Types all; -import from SCTPasp_Types all; -import from SCTPasp_PortType all; -import from MTP3asp_Types all; - -type record of ASP_MTP3_TRANSFERreq TRANSFERreq_Buffer; - -type record SCTP_Association_Address -{ - integer local_sctp_port, - charstring local_ip_addr, - integer remote_sctp_port, - charstring remote_ip_addr -} - -// Definition of M3UA_Entity which contains M3UA entity data. -type record M3UA_Entity -{ - M3UA_CommStatus commStatus optional, - integer sCTP_Assoc_ID optional, - SCTP_Association_Address assoc -} - -// Type for status of SCTP communication for an M3UA entity. -type enumerated M3UA_CommStatus -{ - aSP_Down_initial_State (0), - aSP_Down_sCTP_Initialize_Done (1), - aSP_Down_sCTP_Associate_done (2), - aSP_Down_commUP_Received (3), - aSP_Down_ASPUP_Sent (4), - aSP_Inactive (5), - aSP_Inact_ASPAC_Sent (6), - aSP_Active (7) // aSPAC_Ack_Received -} - -// We need an internal port to communicate with the MTP3 side. -// internal in name -type port MTP3asp_SP_PT_Int message -{ - in ASP_MTP3_TRANSFERreq; - out ASP_MTP3_TRANSFERind; - // out ASP_MTP3_PAUSE; - // out ASP_MTP3_RESUME; - // out ASP_MTP3_STATUS; -} with { - extension "internal" -} - -// M3UA emulation component. -type component M3UA_CT -{ - var M3UA_Entity v_Entity; - var TRANSFERreq_Buffer v_TRANSFERreq_Buffer := {}; - - var ASP_SCTP v_ASP_SCTP; - var ASP_SCTP_SEND_FAILED v_ASP_SCTP_SEND_FAILED; - var ASP_SCTP_RESULT v_ASP_SCTP_RESULT; - var ASP_SCTP_Connected v_ASP_SCTP_Connected; - var ASP_SCTP_ASSOC_CHANGE v_ASP_SCTP_ASSOC_CHANGE; - var ASP_SCTP_SHUTDOWN_EVENT v_ASP_SCTP_SHUTDOWN_EVENT; - - var PDU_M3UA v_PDU_M3UA; - - // Component timers. - timer T_Timer := tsp_Timer; - timer T_ASPUP_resend := tsp_ASPUP_Resend_Timer; - timer T_ASPAC_resend := tsp_ASPAC_Resend_Timer; - timer T_Heartbeat := tsp_Heartbeat_Timer; - timer T_Assoc_restart := tsp_Assoc_Restart_Timer; - - // Port declarations. - port MTP3asp_SP_PT_Int MTP3_SP_PORT; // Port towards MTP3/M3UA. - port SCTPasp_PT SCTP_PORT; // Port towards target through SCTP. -} - -//******************************** -// Start of SCTP related templates -//******************************** -template ASP_SCTP t_S_SCTP_Send - (in template integer pl_associationID, - in template integer pl_streamID, - in template octetstring pl_userData, - in template integer pl_protocolID) := -{ - client_id := pl_associationID, - sinfo_stream := pl_streamID, - sinfo_ppid := pl_protocolID, - data := pl_userData -} - -template ASP_SCTP_SEND_FAILED t_ASP_SCTP_SEND_FAILED - (in template integer pl_streamID) := -{ - client_id := pl_streamID -} - -template ASP_SCTP_Listen t_ASP_SCTP_Listen - (template charstring pl_local_hostname, - template integer pl_local_portnumber) := -{ - local_hostname := pl_local_hostname, - local_portnumber := pl_local_portnumber -} - -template ASP_SCTP_Connected tr_ASP_SCTP_Connected - (template integer pl_client_id, - template charstring pl_local_hostname, - template integer pl_local_portnumber, - template charstring pl_peer_hostname, - template integer pl_peer_portnumber) := -{ - client_id := pl_client_id, - local_hostname := pl_local_hostname, - local_portnumber := pl_local_portnumber, - peer_hostname := pl_peer_hostname, - peer_portnumber := pl_peer_portnumber -} - -template ASP_SCTP_ConnectFrom t_ASP_SCTP_ConnectFrom - (template charstring pl_local_hostname, - template integer pl_local_portnumber, - template charstring pl_peer_hostname, - template integer pl_peer_portnumber) := -{ - local_hostname := pl_local_hostname, - local_portnumber := pl_local_portnumber, - peer_hostname := pl_peer_hostname, - peer_portnumber := pl_peer_portnumber -} - -template ASP_SCTP_RESULT t_ASP_SCTP_RESULT - (template integer pl_client_id, - template boolean pl_error_status, - template charstring pl_error_message) := -{ - client_id := pl_client_id, - error_status := pl_error_status, - error_message := pl_error_message -} - -template ASP_SCTP_ASSOC_CHANGE tr_S_SCTP_CommunicationUp - (in template integer pl_associationID) := -{ - client_id := pl_associationID, - sac_state := SCTP_COMM_UP -} - -template ASP_SCTP_ASSOC_CHANGE tr_S_SCTP_CommunicationLost - (in template integer pl_associationID) := -{ - client_id := pl_associationID, - sac_state := SCTP_COMM_LOST -} - -template ASP_SCTP_ASSOC_CHANGE tr_S_SCTP_ShutdownComplete - (in template integer pl_associationID) := -{ - client_id := pl_associationID, - sac_state := SCTP_SHUTDOWN_COMP -} - -template ASP_SCTP_SHUTDOWN_EVENT tr_S_SCTP_ShutdownEvent - (in template integer pl_associationID) := -{ - client_id := pl_associationID -} - -template ASP_SCTP_ASSOC_CHANGE tr_S_SCTP_Restart - (in template integer pl_associationID) := -{ - client_id := pl_associationID, - sac_state := SCTP_RESTART -} - -template ASP_SCTP_ASSOC_CHANGE tr_S_SCTP_CANT_STR_ASSOC - (in template integer pl_associationID) := -{ - client_id := pl_associationID, - sac_state := SCTP_CANT_STR_ASSOC -} - -template ASP_SCTP tr_S_SCTP_DataArrive - (in template integer pl_associationID, - in template integer pl_streamID, - in template integer pl_protocolID, - in template PDU_SCTP pl_data) := -{ - client_id := pl_associationID, - sinfo_stream := pl_streamID, - sinfo_ppid := pl_protocolID, - data := pl_data -} - -template ASP_SCTP_Close t_ASP_SCTP_Close - (in template integer pl_associationID) := -{ - client_id := pl_associationID -} -//****************************** -// End of SCTP related templates -//****************************** - -//***************************** -// Start of M3UA PDU templates. -//***************************** -template PDU_M3UA t_PDU_M3UA_ASPUP - (in template M3UA_ASP_Identifier pl_aSP_Identifier, - in template M3UA_Info_String pl_info_String) := -{ - m3UA_ASPUP := { - version := '01'O, - reserved := '00'O, - messageClassAndType := '0301'O, - messageLength := 0, - messageParameters := { - aSP_Identifier := pl_aSP_Identifier, - info_String := pl_info_String - } - } -} - -template PDU_M3UA t_PDU_M3UA_ASPUP_Ack := -{ - m3UA_ASPUP_Ack := { - version := '01'O, - reserved := '00'O, - messageClassAndType := '0304'O, - messageLength := 0, - messageParameters := { - info_String := omit - } - } -} - -template PDU_M3UA t_PDU_M3UA_ASPDN := -{ - m3UA_ASPDN := { - version := '01'O, - reserved := '00'O, - messageClassAndType := '0302'O, - messageLength := 0, - messageParameters := { - info_String := omit - } - } -} - -template PDU_M3UA t_PDU_M3UA_ASPDN_Ack := -{ - m3UA_ASPDN_Ack := { - version := '01'O, - reserved := '00'O, - messageClassAndType := '0305'O, - messageLength := 0, - messageParameters := { - info_String := omit - } - } -} - -template PDU_M3UA t_PDU_M3UA_ASPAC - (in template M3UA_Traffic_Mode_Type pl_traffic_Mode_Type, - in template M3UA_Routing_Context pl_routing_Context, - in template M3UA_Info_String pl_info_String) := -{ - m3UA_ASPAC := { - version := '01'O, - reserved := '00'O, - messageClassAndType := '0401'O, - messageLength := 0, - messageParameters := { - traffic_Mode_Type := pl_traffic_Mode_Type, - routing_Context := pl_routing_Context, - info_String := pl_info_String - } - } -} - -template PDU_M3UA t_PDU_M3UA_ASPAC_Ack - (in template M3UA_Traffic_Mode_Type pl_traffic_mode_type, - in template M3UA_Routing_Context pl_routing_Context) := -{ - m3UA_ASPAC_Ack := { - version := '01'O, - reserved := '00'O, - messageClassAndType := '0403'O, - messageLength := 0, - messageParameters := { - traffic_Mode_Type := pl_traffic_mode_type, - routing_Context := pl_routing_Context, - info_String := omit - } - } -} - -template PDU_M3UA t_PDU_M3UA_ASPIA - (in template M3UA_Routing_Context pl_routing_Context, - in template M3UA_Info_String pl_info_String) := -{ - m3UA_ASPIA := { - version := '01'O, - reserved := '00'O, - messageClassAndType := '0402'O, - messageLength := 0, - messageParameters := { - routing_Context := pl_routing_Context, - info_String := pl_info_String - } - } -} - -template PDU_M3UA t_PDU_M3UA_ASPIA_Ack - (in template M3UA_Routing_Context pl_routing_Context) := -{ - m3UA_ASPIA_Ack := { - version := '01'O, - reserved := '00'O, - messageClassAndType := '0404'O, - messageLength := 0, - messageParameters := { - routing_Context := pl_routing_Context, - info_String := omit - } - } -} - -template PDU_M3UA t_PDU_M3UA_Heartbeat - (in template M3UA_Heartbeat_Data pl_heartbeat_Data) := -{ - m3UA_BEAT := { - version := '01'O, - reserved := '00'O, - messageClassAndType := '0303'O, - messageLength := 0, - messageParameters := { - heartbeat_Data := pl_heartbeat_Data - } - } -} - -template PDU_M3UA t_PDU_M3UA_Beat_Ack - (in template M3UA_Heartbeat_Data pl_heartbeat_Data) := -{ - m3UA_BEAT_Ack := { - version := '01'O, - reserved := '00'O, - messageClassAndType := '0306'O, - messageLength := 0, - messageParameters := { - heartbeat_Data := pl_heartbeat_Data - } - } -} - -template PDU_M3UA t_PDU_M3UA_DATA - (in template M3UA_Network_Appearance pl_network_Appearance, - in template M3UA_Routing_Context pl_routing_Context, - in template M3UA_Protocol_Data pl_protocol_Data, - in template M3UA_Correlation_ID pl_correlation_ID) := -{ - m3UA_DATA := { - version := '01'O, - reserved := '00'O, - messageClassAndType := '0101'O, - messageLength := 0, - messageParameters := { - network_Appearance := pl_network_Appearance, - routing_Context := pl_routing_Context, - protocol_Data := pl_protocol_Data, - correlation_ID := pl_correlation_ID - } - } -} - -template PDU_M3UA t_PDU_M3UA_DAVA - (in template M3UA_Network_Appearance pl_network_Appearance, - in template M3UA_Routing_Context pl_routing_Context, - in template M3UA_Affected_Point_Codes pl_affected_Point_Codes, - in template M3UA_Info_String pl_info_String) := -{ - m3UA_DAVA := { - version := '01'O, - reserved := '00'O, - messageClassAndType := '0202'O, - messageLength := 0, - messageParameters := { - network_Appearance := pl_network_Appearance, - routing_Context := pl_routing_Context, - affected_Point_Codes := pl_affected_Point_Codes, - info_String := pl_info_String - } - } -} -//************************** -// End of M3UA PDU templates -//************************** - -//********************************** -// Start of M3UA parameter templates -//********************************** -template M3UA_Protocol_Data t_M3UA_Protocol_Data - (template OCT4 pl_oPC, - template OCT4 pl_dPC, - template OCT1 pl_sI, - template OCT1 pl_nI, - template OCT1 pl_mP, - template OCT1 pl_sLS, - template octetstring pl_userProtocolData) := -{ - tag := '0210'O, - lengthInd := 0, - oPC := pl_oPC, - dPC := pl_dPC, - sI := pl_sI, - nI := pl_nI, - mP := pl_mP, - sLS := pl_sLS, - userProtocolData := pl_userProtocolData -} -//******************************** -// End of M3UA parameter templates -//******************************** - -//*********************************** -// Dynamic part of the M3UA emulation -//*********************************** - -function f_M3UA_Emulation(SCTP_Association_Address pl_Boot) runs on M3UA_CT -{ - // Initialize parameters from the test case. - v_Entity.assoc := pl_Boot; - v_Entity.commStatus := aSP_Down_initial_State; - - // At this point, we assume that the ports are already connected and mapped - // properly by the user. - log("*************************************************"); - log("M3UA emulation initiated, the test can be started"); - log("*************************************************"); - - f_Initialize_SCTP(); - - // Start the main function in an infinte loop. - f_M3UA_ScanEvents(); -} - -// Initialize the SCTP layer with parameters read from the configuration file. -// We have only a single association. -function f_Initialize_SCTP() runs on M3UA_CT -{ - v_Entity.commStatus := aSP_Down_sCTP_Initialize_Done; - if (tsp_SCTP_Server_Mode) { - // Send out a LISTEN message. The communication status doesn't change - // here. - SCTP_PORT.send - (t_ASP_SCTP_Listen(v_Entity.assoc.local_ip_addr, - v_Entity.assoc.local_sctp_port)); - } - else { - // Send ConnectFrom sequentially, wait for RESULT messages. - f_Associate(); - T_Assoc_restart.start; - } - - if (tsp_SCTP_PayloadProtocolID == 3) { - if (not tsp_M3UA_Server_Mode) { - T_ASPUP_resend.start; - T_ASPAC_resend.start; - } - if (tsp_Enable_M3UA_Heartbeat) { - T_Heartbeat.start; - } - } -} - -// Associate SCTP connection for a M3UA entity. -function f_Associate() runs on M3UA_CT -{ - SCTP_PORT.send(t_ASP_SCTP_ConnectFrom - (v_Entity.assoc.local_ip_addr, - v_Entity.assoc.local_sctp_port, - v_Entity.assoc.remote_ip_addr, - v_Entity.assoc.remote_sctp_port)); - - T_Timer.start; - alt { - [] SCTP_PORT.receive(t_ASP_SCTP_RESULT(*, ?, *)) -> value v_ASP_SCTP_RESULT { - if (v_ASP_SCTP_RESULT.error_status) { - log("Connect failed: ", v_ASP_SCTP_RESULT.error_message); - } - else { - v_Entity.sCTP_Assoc_ID := v_ASP_SCTP_RESULT.client_id; - v_Entity.commStatus := aSP_Down_sCTP_Associate_done; - log("SCTP_ConnectResult -> connection established from: ", - v_Entity.assoc.local_ip_addr, ":", v_Entity.assoc.local_sctp_port, - " to server: ", v_Entity.assoc.remote_ip_addr, ":", - v_Entity.assoc.remote_sctp_port, " association #", - v_Entity.sCTP_Assoc_ID); - if (tsp_logVerbose) { - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to ", - v_Entity.commStatus); - } - } - T_Timer.stop; - } - [] T_Timer.timeout { - log("----------------------------------------------"); - log("No response received to t_ASP_SCTP_ConnectFrom"); - log("----------------------------------------------"); - setverdict(fail); - // mtc.stop; - } - } -} - -// Starts M3UA emulation execution. -function f_M3UA_ScanEvents() runs on M3UA_CT -{ - var ASP_MTP3_TRANSFERreq vl_ASP_MTP3_TRANSFERreq; - - alt { - [] MTP3_SP_PORT.receive(ASP_MTP3_TRANSFERreq : ?) - -> value vl_ASP_MTP3_TRANSFERreq { - f_Send_MTP3_TRANSFERreq(vl_ASP_MTP3_TRANSFERreq); - repeat; - } - [] as_SCTP_CommunicationUp() - [] as_SCTP_DataArrive() - [] as_SCTP_Connected() - [] as_Unexpected_SCTP_Events() - [] as_handleM3UA_timers() - [] as_handleSCTP_timers() - } -} - -function f_Send_MTP3_TRANSFERreq(ASP_MTP3_TRANSFERreq pl_ASP_MTP3_TRANSFERreq) - runs on M3UA_CT -{ - if (v_Entity.commStatus == aSP_Active) { - if (tsp_SCTP_PayloadProtocolID == 3) { // M3UA - SCTP_PORT.send - (t_S_SCTP_Send - (v_Entity.sCTP_Assoc_ID, - 1, - enc_PDU_M3UA - (valueof - (t_PDU_M3UA_DATA - (omit, - omit, - t_M3UA_Protocol_Data - (int2oct(pl_ASP_MTP3_TRANSFERreq.opc, 4), // OPC - int2oct(pl_ASP_MTP3_TRANSFERreq.dpc, 4), // DPC - bit2oct('0000'B & pl_ASP_MTP3_TRANSFERreq.sio.si), // SIO - bit2oct('000000'B & pl_ASP_MTP3_TRANSFERreq.sio.ni), - bit2oct('000000'B & pl_ASP_MTP3_TRANSFERreq.sio.prio), - int2oct(pl_ASP_MTP3_TRANSFERreq.sls, 1), // SLS - pl_ASP_MTP3_TRANSFERreq.data), - omit))), - tsp_SCTP_PayloadProtocolID)); - } - else { // Non-M3UA - SCTP_PORT.send - (t_S_SCTP_Send - (v_Entity.sCTP_Assoc_ID, - 1, - pl_ASP_MTP3_TRANSFERreq.data, - tsp_SCTP_PayloadProtocolID)); - } - if (tsp_logVerbose) { - log("MTP3_SP_PORT: ASP_MTP3_TRANSFERreq received -> message sent " & - "via SCTP"); - } - } - else { - // If the SCTP association is not yet running, we have to buffer the data - // messages arrived from the MTP3 side. Sending of buffered data messages - // should occure when the SCTP association is up and before sending the - // data message in reply for a new ASP_MTP3_TRANSFERreq data message. The - // buffer should be checked before sending. - v_TRANSFERreq_Buffer[sizeof(v_TRANSFERreq_Buffer)] := - pl_ASP_MTP3_TRANSFERreq; - if (tsp_logVerbose) { - log("MTP3_SP_PORT: ASP_MTP3_TRANSFERreq received in an inactive state " & - "-> message was buffered"); - } - } -} - -// Handle communication up messages of users which performed associate earlier. -// We have only one association. -altstep as_SCTP_CommunicationUp() runs on M3UA_CT -{ - [] SCTP_PORT.receive(tr_S_SCTP_CommunicationUp(?)) - -> value v_ASP_SCTP_ASSOC_CHANGE { - if (v_Entity.sCTP_Assoc_ID == v_ASP_SCTP_ASSOC_CHANGE.client_id) { - if (v_Entity.commStatus == aSP_Down_sCTP_Associate_done) { - v_Entity.commStatus := aSP_Down_commUP_Received; - if (tsp_SCTP_PayloadProtocolID != 3) { // Non-M3UA - v_Entity.commStatus := aSP_Active; - var integer v_i; - for (v_i := 0; v_i < sizeof(v_TRANSFERreq_Buffer); v_i := v_i + 1) { - log("Sending buffered message #", v_i); - f_Send_MTP3_TRANSFERreq(v_TRANSFERreq_Buffer[v_i]); - } - v_TRANSFERreq_Buffer := {}; - // MTP3_SP_PORT.send(ASP_MTP3_RESUME : {}); - } - if (tsp_logVerbose) { - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } - if ((not tsp_M3UA_Server_Mode) and - (tsp_SCTP_PayloadProtocolID == 3)) { // M3UA - f_ASPUP_Sending(); - } - } - else { - if (tsp_logVerbose) { - log("SCTP_CommunicationUp received in wrong state (i.e. not after " & - "SCTP_Associate is done) in state: ", v_Entity.commStatus); - } - } - } - else { - if (tsp_logVerbose) { - log("Association does not exists, received in CommunicationUp"); - } - } - repeat; - } -} - -// This altstep handles the data received from SCTP. -altstep as_SCTP_DataArrive() runs on M3UA_CT -{ - [] SCTP_PORT.receive(tr_S_SCTP_DataArrive - (?, // associationID - ?, // streamID - ?, // protocolID - ? // data - )) -> value v_ASP_SCTP { - // Checking the identifier for the association is not necessary, because we - // have only only one association. - if (f_Assoc_Exists(v_ASP_SCTP.client_id)) { - if (tsp_logVerbose) { - log("Message received on association #", v_Entity.sCTP_Assoc_ID); - } - if (tsp_SCTP_PayloadProtocolID == 3) { // M3UA - v_PDU_M3UA := dec_PDU_M3UA(v_ASP_SCTP.data); - f_handle_M3UA_msg(v_PDU_M3UA); - } - else { // Non-M3UA - f_handle_nonM3UA_msg(v_ASP_SCTP.data); - } - } - else{ - log("Message received on unknown association #", v_Entity.sCTP_Assoc_ID, - " -> closing connection"); - SCTP_PORT.send(t_ASP_SCTP_Close(v_Entity.sCTP_Assoc_ID)); - log("SCTP connection closed"); - } - repeat; - } -} - -// Handle the SCTP connected messages. It is sent from the SCTP side and it -// signals, that we're on the right track to create the association. This is -// for server mode. -altstep as_SCTP_Connected() runs on M3UA_CT -{ - [tsp_SCTP_Server_Mode] SCTP_PORT.receive(tr_ASP_SCTP_Connected(?, ?, ?, ?, ?)) - -> value v_ASP_SCTP_Connected { - // Message from the configured endpoint. - if ((v_ASP_SCTP_Connected.local_portnumber == - v_Entity.assoc.local_sctp_port) and - (v_ASP_SCTP_Connected.local_hostname == - v_Entity.assoc.local_ip_addr) and - (v_ASP_SCTP_Connected.peer_portnumber == - v_Entity.assoc.remote_sctp_port) and - (v_ASP_SCTP_Connected.peer_hostname == - v_Entity.assoc.remote_ip_addr)) { - v_Entity.sCTP_Assoc_ID := v_ASP_SCTP_Connected.client_id; - v_Entity.commStatus := aSP_Down_sCTP_Associate_done; - log("ASP_SCTP_Connected -> accepted connection from client: ", - v_ASP_SCTP_Connected.peer_hostname, ":", - v_ASP_SCTP_Connected.peer_portnumber, " on server: ", - v_ASP_SCTP_Connected.local_hostname, ":", - v_ASP_SCTP_Connected.local_portnumber, " with association #", - v_Entity.sCTP_Assoc_ID); - } - else { - log("ASP_SCTP_Connected -> connection from unknown client: ", - v_ASP_SCTP_Connected.peer_hostname, ":", - v_ASP_SCTP_Connected.peer_portnumber); - } - repeat; - } -} - -// Handle error messages of users. -altstep as_Unexpected_SCTP_Events() runs on M3UA_CT -{ - // Handle communications lost message. State of user with given index jumps - // back to initial state and stays there. That user will not be able to - // communicate anymore. - [] SCTP_PORT.receive(tr_S_SCTP_CommunicationLost(?)) - -> value v_ASP_SCTP_ASSOC_CHANGE { - if (f_Assoc_Exists(v_ASP_SCTP_ASSOC_CHANGE.client_id)) { - if (v_Entity.commStatus == aSP_Active) { - // MTP3_SP_PORT.send(ASP_MTP3_PAUSE : {}); - } - v_Entity.commStatus := aSP_Down_sCTP_Initialize_Done; - v_Entity.sCTP_Assoc_ID := omit; - if (tsp_logVerbose) { - log("SCTP_CommunicationLost received"); - log("Association #", v_Entity.sCTP_Assoc_ID, " cleared, state " & - "changed to: ", v_Entity.commStatus); - } - } - else { - if (tsp_logVerbose) { - log("Association does not exist, received in CommunicationLost"); - } - } - repeat; - } - [] SCTP_PORT.receive(tr_S_SCTP_ShutdownComplete(?)) - -> value v_ASP_SCTP_ASSOC_CHANGE { - if (f_Assoc_Exists(v_ASP_SCTP_ASSOC_CHANGE.client_id)) { - if (v_Entity.commStatus == aSP_Active) { - // MTP3_SP_PORT.send(ASP_MTP3_PAUSE : {}); - } - v_Entity.commStatus := aSP_Down_sCTP_Initialize_Done; - if (tsp_logVerbose) { - log("SCTP_ShutdownComplete received"); - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } - } - else { - if (tsp_logVerbose) { - log("Association does not exist, received in ShutdownComplete"); - } - } - repeat; - } - [] SCTP_PORT.receive(tr_S_SCTP_ShutdownEvent(?)) - -> value v_ASP_SCTP_SHUTDOWN_EVENT { - if (f_Assoc_Exists(v_ASP_SCTP_SHUTDOWN_EVENT.client_id)) { - if (v_Entity.commStatus == aSP_Active) { - // MTP3_SP_PORT.send(ASP_MTP3_PAUSE : {}); - } - v_Entity.commStatus := aSP_Down_sCTP_Initialize_Done; - if (tsp_logVerbose) { - log("SCTP_ShutdownEvent received"); - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } - } - else { - if (tsp_logVerbose) { - log("Association does not exist, received in ShutdownEvent"); - } - } - repeat; - } - [] SCTP_PORT.receive(tr_ASP_SCTP_Connected(?, ?, ?, ?, ?)) - -> value v_ASP_SCTP_Connected { - log("Unexpected ASP_SCTP_Connected"); - repeat; - } - [] SCTP_PORT.receive(tr_S_SCTP_Restart(?)) -> value v_ASP_SCTP_ASSOC_CHANGE { - if (f_Assoc_Exists(v_ASP_SCTP_ASSOC_CHANGE.client_id)) { - log("SCTP_Restart received"); - v_Entity.commStatus := aSP_Down_commUP_Received; - if (tsp_logVerbose) { - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } - } - else { - if (tsp_logVerbose) { - log("Association does not exist, received in SCTP_Restart"); - } - } - repeat; - } - [] SCTP_PORT.receive(t_ASP_SCTP_SEND_FAILED(?)) - -> value v_ASP_SCTP_SEND_FAILED { - log("SCTP_Send failed for association #", v_Entity.sCTP_Assoc_ID); - if (f_Assoc_Exists(v_ASP_SCTP_SEND_FAILED.client_id)) { - // Daemon sends an error status message here. - // MTP3_SP_PORT.send(ASP_MTP3_PAUSE : {}); - } - else { - log("Send error received for association that doesn't exist"); - } - repeat; - } - [] SCTP_PORT.receive(tr_S_SCTP_CANT_STR_ASSOC(?)) { - repeat; - } - [] SCTP_PORT.receive { - repeat; - } -} - -// After reception of SCTP_CommunicationUp M3UA ASPUP/ASPAC is resent by the -// entity if it didn't receive ASPUP_Ack/ASPAC_Ack. -altstep as_handleM3UA_timers() runs on M3UA_CT -{ - [] T_ASPUP_resend.timeout { - if ((v_Entity.commStatus == aSP_Down_commUP_Received) or - (v_Entity.commStatus == aSP_Down_ASPUP_Sent)) { - // Try to send ASPUP again. - SCTP_PORT.send - (t_S_SCTP_Send - (v_Entity.sCTP_Assoc_ID, - 0, - enc_PDU_M3UA(valueof(t_PDU_M3UA_ASPUP(omit, omit))), - tsp_SCTP_PayloadProtocolID)); - v_Entity.commStatus := aSP_Down_ASPUP_Sent; - if (tsp_logVerbose) { - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } - } - T_ASPUP_resend.start; - repeat; - } - - [] T_ASPAC_resend.timeout { - if ((v_Entity.commStatus == aSP_Inactive) or - (v_Entity.commStatus == aSP_Inact_ASPAC_Sent)) { - SCTP_PORT.send - (t_S_SCTP_Send - (v_Entity.sCTP_Assoc_ID, - 0, - enc_PDU_M3UA(valueof(t_PDU_M3UA_ASPAC(omit, omit, omit))), - tsp_SCTP_PayloadProtocolID)); - v_Entity.commStatus := aSP_Inact_ASPAC_Sent; - if (tsp_logVerbose) { - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } - } - T_ASPAC_resend.start; - repeat; - } - - [tsp_Enable_M3UA_Heartbeat] T_Heartbeat.timeout { - if (v_Entity.commStatus == aSP_Active) { - SCTP_PORT.send - (t_S_SCTP_Send - (v_Entity.sCTP_Assoc_ID, - 0, - enc_PDU_M3UA(valueof(t_PDU_M3UA_Heartbeat(omit))), - tsp_SCTP_PayloadProtocolID)); - if (tsp_logVerbose) { - log("Heartbeat sent to association #", v_Entity.sCTP_Assoc_ID); - } - } - T_Heartbeat.start; - repeat; - } -} - -// Handles SCTP timer events. In server mode we don't associate. -altstep as_handleSCTP_timers() runs on M3UA_CT -{ - [not tsp_SCTP_Server_Mode] T_Assoc_restart.timeout { - if (v_Entity.commStatus == aSP_Down_sCTP_Initialize_Done) { - f_Associate(); - } - T_Assoc_restart.start; - repeat; - } -} - -// After reception of SCTP CommunicationUp messages M3UA ASPUP is sent by -// every entity and the M3UA ASPUP_Ack is received by every entity. -function f_ASPUP_Sending() runs on M3UA_CT -{ - SCTP_PORT.send - (t_S_SCTP_Send - (v_Entity.sCTP_Assoc_ID, - 0, // streamID - enc_PDU_M3UA(valueof(t_PDU_M3UA_ASPUP(omit, omit))), - tsp_SCTP_PayloadProtocolID)); - v_Entity.commStatus := aSP_Down_ASPUP_Sent; - if (tsp_logVerbose) { - log("M3UA_ASPUP sent"); - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } -} - - -// Test if an association with assocID exists or not. We have only one -// association at the moment, we just check if the given assocID is the same, -// that is associated with our single entity. If we would have more entities -// in a table, the index of it should be returned instead of a boolean value. -function f_Assoc_Exists(integer pl_assocID) runs on M3UA_CT return boolean -{ - if (v_Entity.sCTP_Assoc_ID == pl_assocID) { - return true; - } - else { - if (tsp_logVerbose) { - log("Association #", v_Entity.sCTP_Assoc_ID, " not found"); - } - } - return false; -} - -function f_handle_M3UA_msg(PDU_M3UA pl_PDU_M3UA) runs on M3UA_CT -{ - if (ischosen(pl_PDU_M3UA.m3UA_DATA)) { - if (v_Entity.commStatus == aSP_Active) { - // Send ASP_MTP3_TRANSFERind message. - MTP3_SP_PORT.send - (valueof - (tr_ASP_MTP3_TRANSFERind_sio - (substr(oct2bit(pl_PDU_M3UA.m3UA_DATA.messageParameters.protocol_Data.nI), 6, 2), - substr(oct2bit(pl_PDU_M3UA.m3UA_DATA.messageParameters.protocol_Data.mP), 6, 2), - substr(oct2bit(pl_PDU_M3UA.m3UA_DATA.messageParameters.protocol_Data.sI), 4, 4), - oct2int(pl_PDU_M3UA.m3UA_DATA.messageParameters.protocol_Data.oPC), - oct2int(pl_PDU_M3UA.m3UA_DATA.messageParameters.protocol_Data.dPC), - oct2int(pl_PDU_M3UA.m3UA_DATA.messageParameters.protocol_Data.sLS), - pl_PDU_M3UA.m3UA_DATA.messageParameters.protocol_Data.userProtocolData))); - if (tsp_logVerbose) { - log("MTP3_SP_PORT: Data received -> TRANSFERind sent"); - } - } - else { - // Buffering indication messages? - if (tsp_logVerbose) { - log("MTP3_SP_PORT: Data received, no user connected -> discard"); - } - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_BEAT)) { - if (v_Entity.commStatus == aSP_Active) { - SCTP_PORT.send - (t_S_SCTP_Send - (v_Entity.sCTP_Assoc_ID, - 0, - enc_PDU_M3UA - (valueof - (t_PDU_M3UA_Beat_Ack - (pl_PDU_M3UA.m3UA_BEAT.messageParameters.heartbeat_Data))), - tsp_SCTP_PayloadProtocolID)); - if (tsp_logVerbose) { - log("M3UA_BEAT received -> M3UA_BEAT_Ack sent"); - } - } - else { - if (tsp_logVerbose) { - log("M3UA_BEAT received in wrong state"); - } - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_BEAT_Ack)) { - if (tsp_logVerbose) { - log("Received M3UA_BEAT_Ack -> discard"); - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_ERR)) { - if (tsp_logVerbose) { - log("Received M3UA_ERR -> discard"); - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_NOTIFY)) { - if (tsp_logVerbose) { - log("Received M3UA_NOTIFY -> discard"); - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_DUNA)) { - if (tsp_logVerbose) { - log("Received M3UA_DUNA -> discard"); - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_DAVA)) { - if (tsp_logVerbose) { - log("Received M3UA_DAVA -> discard"); - } - } - // In server mode ASP_M3UA_DAUD messages can be received. In response the - // server must send ASP_M3UA_DAVA messages. It's not checked if we're - // servers or not. - else if (ischosen(pl_PDU_M3UA.m3UA_DAUD)) { - if ((v_Entity.commStatus == aSP_Inactive) or - (v_Entity.commStatus == aSP_Inact_ASPAC_Sent) or - (v_Entity.commStatus == aSP_Active)) { - // Send ASP_M3UA_DAVA message. - SCTP_PORT.send - (t_S_SCTP_Send - (v_Entity.sCTP_Assoc_ID, - 0, - enc_PDU_M3UA - (valueof - (t_PDU_M3UA_DAVA - (pl_PDU_M3UA.m3UA_DAUD.messageParameters.network_Appearance, - pl_PDU_M3UA.m3UA_DAUD.messageParameters.routing_Context, - pl_PDU_M3UA.m3UA_DAUD.messageParameters.affected_Point_Codes, - pl_PDU_M3UA.m3UA_DAUD.messageParameters.info_String))), - tsp_SCTP_PayloadProtocolID)); - if (tsp_logVerbose) { - log("M3UA_DAUD received -> DAVA sent"); - } - } - else { - if (tsp_logVerbose) { - log("M3UA_DAUD received in wrong state"); - } - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_SCON)) { - if (tsp_logVerbose) { - log("Received M3UA_SCON -> discard"); - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_DUPU)) { - if (tsp_logVerbose) { - log("Received M3UA_DUPU -> discard"); - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_DRST)) { - if (tsp_logVerbose) { - log("Received M3UA_DRST -> discard"); - } - } - // In server mode we can receive M3UA_ASPUP messages. The answer will be a - // M3UA_ASPUP_Ack message to the client. - else if (ischosen(pl_PDU_M3UA.m3UA_ASPUP)) { - if (((v_Entity.commStatus == aSP_Down_commUP_Received) or - (v_Entity.commStatus == aSP_Down_ASPUP_Sent)) and - tsp_M3UA_Server_Mode) { - v_Entity.commStatus := aSP_Inactive; - SCTP_PORT.send - (t_S_SCTP_Send - (v_Entity.sCTP_Assoc_ID, - 0, - enc_PDU_M3UA(valueof(t_PDU_M3UA_ASPUP_Ack)), - tsp_SCTP_PayloadProtocolID)); - if (tsp_logVerbose) { - log("M3UA_ASPUP received -> M3UA_ASPUP_Ack sent"); - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } - } - else { - if (tsp_logVerbose) { - log("M3UA_ASPUP received in wrong state or the emulation is not in " & - "M3UA server mode"); - } - } - } - // Receives a M3UA_ASPDN message and sends a M3UA_ASPDN_Ack message in - // response. - else if (ischosen(pl_PDU_M3UA.m3UA_ASPDN)) { - if ((v_Entity.commStatus == aSP_Inactive) or - (v_Entity.commStatus == aSP_Inact_ASPAC_Sent) or - (v_Entity.commStatus == aSP_Active)) { - SCTP_PORT.send - (t_S_SCTP_Send - (v_Entity.sCTP_Assoc_ID, - 0, - enc_PDU_M3UA(valueof(t_PDU_M3UA_ASPDN_Ack)), - tsp_SCTP_PayloadProtocolID)); - if (v_Entity.commStatus == aSP_Active) { - // MTP3_SP_PORT.send(ASP_MTP3_PAUSE : {}); - } - v_Entity.commStatus := aSP_Down_commUP_Received; - if (tsp_logVerbose) { - log("M3UA_ASPDN received -> ASPDN_Ack sent"); - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } - } - else { - if (tsp_logVerbose) { - log("ASPDN received in wrong state or the emulation is not in M3UA " & - "server mode"); - } - } - } - // The M3UA client receives M3UA_ASPUP_Ack messages from the server. In - // response of a M3UA_ASPUP message sent by the client. - else if (ischosen(pl_PDU_M3UA.m3UA_ASPUP_Ack)) { - if (((v_Entity.commStatus == aSP_Down_ASPUP_Sent) or - (v_Entity.commStatus == aSP_Inactive)) and - not tsp_M3UA_Server_Mode) { - v_Entity.commStatus := aSP_Inactive; - if (tsp_logVerbose) { - log("M3UA_ASPUP_Ack received -> send M3UA_ASPAC"); - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } - SCTP_PORT.send - (t_S_SCTP_Send - (v_Entity.sCTP_Assoc_ID, - 0, - enc_PDU_M3UA(valueof(t_PDU_M3UA_ASPAC(omit, omit, omit))), - tsp_SCTP_PayloadProtocolID)); - // The state changes again after sending the M3UA_ASPAC message. - v_Entity.commStatus := aSP_Inact_ASPAC_Sent; - if (tsp_logVerbose) { - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } - } - else { - if (tsp_logVerbose) { - log("M3UA_ASPUP_Ack received in wrong state or the emulation is not " & - "in M3UA client mode"); - } - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_ASPDN_Ack)) { - if (tsp_logVerbose) { - log("Received M3UA_ASPDN_Ack -> discard"); - } - } - // M3UA_ASPAC messages are received on the server side. The server sends a - // M3UA_ASPAC_Ack message back to the client. This step makes the - // association active on both sides. - else if (ischosen(pl_PDU_M3UA.m3UA_ASPAC)) { - if (((v_Entity.commStatus == aSP_Inactive) or - (v_Entity.commStatus == aSP_Inact_ASPAC_Sent)) and - tsp_M3UA_Server_Mode) { - v_Entity.commStatus := aSP_Active; - if (tsp_logVerbose) { - log("M3UA_ASPAC received -> M3UA_ASPAC_Ack sent"); - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } - var integer v_i; - for (v_i := 0; v_i < sizeof(v_TRANSFERreq_Buffer); v_i := v_i + 1) { - log("Sending buffered message #", v_i); - f_Send_MTP3_TRANSFERreq(v_TRANSFERreq_Buffer[v_i]); - } - v_TRANSFERreq_Buffer := {}; - // Send M3UA_ASPAC_Ack. - SCTP_PORT.send - (t_S_SCTP_Send - (v_Entity.sCTP_Assoc_ID, - 0, - enc_PDU_M3UA - (valueof - (t_PDU_M3UA_ASPAC_Ack - (pl_PDU_M3UA.m3UA_ASPAC.messageParameters.traffic_Mode_Type, - pl_PDU_M3UA.m3UA_ASPAC.messageParameters.routing_Context))), - tsp_SCTP_PayloadProtocolID)); - // MTP3_SP_PORT.send(ASP_MTP3_RESUME : {}); - } - else { - if (tsp_logVerbose) { - log("M3UA_ASPAC received in wrong state or the emulation is not in " & - "M3UA server mode"); - } - } - } - // The client receives M3UA_ASPAC_Ack messages from the server. The - // association will be activated. The buffered messages should be send here. - else if (ischosen(pl_PDU_M3UA.m3UA_ASPAC_Ack)) { - if (((v_Entity.commStatus == aSP_Inact_ASPAC_Sent) or - (v_Entity.commStatus == aSP_Active)) and - not tsp_M3UA_Server_Mode) { - // MTP3_SP_PORT.send(ASP_MTP3_RESUME : {}); - v_Entity.commStatus := aSP_Active; - if (tsp_logVerbose) { - log("ASPAC_Ack received for association #", v_Entity.sCTP_Assoc_ID); - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } - var integer v_i; - for (v_i := 0; v_i < sizeof(v_TRANSFERreq_Buffer); v_i := v_i + 1) { - log("Sending buffered message #", v_i); - f_Send_MTP3_TRANSFERreq(v_TRANSFERreq_Buffer[v_i]); - } - v_TRANSFERreq_Buffer := {}; - } - else { - if (tsp_logVerbose) { - log("M3UA_ASPAC_Ack received in wrong state on association #", - v_Entity.sCTP_Assoc_ID, " or the emulation is not in M3UA " & - "client mode"); - } - } - } - // Receives a M3UA_ASPIA message and sends back a M3UA_ASPIA_Ack message in - // response. - else if (ischosen(pl_PDU_M3UA.m3UA_ASPIA)) { - if (v_Entity.commStatus == aSP_Active) { - SCTP_PORT.send - (t_S_SCTP_Send - (v_Entity.sCTP_Assoc_ID, - 0, - enc_PDU_M3UA - (valueof - (t_PDU_M3UA_ASPIA_Ack - (pl_PDU_M3UA.m3UA_ASPIA.messageParameters.routing_Context))), - tsp_SCTP_PayloadProtocolID)); - // MTP3_SP_PORT.send(ASP_MTP3_PAUSE : {}); - v_Entity.commStatus := aSP_Inactive; - if (tsp_logVerbose) { - log("M3UA_ASPIA received -> M3UA_ASPIA_Ack sent"); - log("Association #", v_Entity.sCTP_Assoc_ID, " state changed to: ", - v_Entity.commStatus); - } - } - else { - if (tsp_logVerbose) { - log("M3UA_ASPIA received in wrong state or the emulation is not " & - "running in M3UA server mode"); - } - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_ASPIA_Ack)) { - if (tsp_logVerbose) { - log("Received M3UA_ASPIA_Ack -> discard"); - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_REG_REQ)) { - if (tsp_logVerbose) { - log("Received M3UA_REG_REQ -> discard"); - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_REG_RSP)) { - if (tsp_logVerbose) { - log("Received M3UA_REG_RSP -> discard"); - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_DEREG_REQ)) { - if (tsp_logVerbose) { - log("Received M3UA_DEREG_REQ -> discard"); - } - } - else if (ischosen(pl_PDU_M3UA.m3UA_DEREG_RSP)) { - if (tsp_logVerbose) { - log("Received M3UA_DEREG_RSP -> discard"); - } - } -} - -function f_handle_nonM3UA_msg(octetstring pl_PDU) runs on M3UA_CT -{ - if (v_Entity.commStatus == aSP_Active) { - // Send TRANSFERind message. - MTP3_SP_PORT.send(valueof - (tr_ASP_MTP3_TRANSFERind_sio - ('00'B, - '00'B, - '0000'B, - 0, - 0, - 0, - pl_PDU))); - if (tsp_logVerbose) { - log("Non-M3UA DATA received -> TRANSFERind sent"); - } - } - else { - if (tsp_logVerbose) { - log("DATA received, but no user connected -> discard"); - } - } -} - -} diff --git a/MTP3asp_CNL113337/MTP3asp_CNL113337.tpd b/MTP3asp_CNL113337/MTP3asp_CNL113337.tpd deleted file mode 100644 index bc2b89eec..000000000 --- a/MTP3asp_CNL113337/MTP3asp_CNL113337.tpd +++ /dev/null @@ -1,89 +0,0 @@ - - - - MTP3asp_CNL113337 - - - - - - - - - - - - - - - - - - TARGET_TEST - - - - - true - true - true - bin/MTP3asp_CNL113337 - - TARGET_TEST - - Level 3 - Creating object files with dependency update - - - bin - - - - - - - true - true - true - bin/MTP3asp_CNL113337 - - TARGET_TEST - - Level 3 - Creating object files with dependency update - - - bin - - - - - - - true - true - true - bin/MTP3asp_CNL113337 - Level 3 - Creating object files with dependency update - - - bin - - - - - diff --git a/MTP3asp_CNL113337/demo/MTP3asp_PT.cc b/MTP3asp_CNL113337/demo/MTP3asp_PT.cc deleted file mode 100644 index 37bab8f04..000000000 --- a/MTP3asp_CNL113337/demo/MTP3asp_PT.cc +++ /dev/null @@ -1,2952 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// // -// Copyright Test Competence Center (TCC) ETH 2012 // -// // -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied // -// // -/////////////////////////////////////////////////////////////////////////////// -// -// File: MTP3asp_PT.cc -// Description: Implementation of port MTP3asp_PT -// This test port is written to connect TTCN-3 to SEA according -// to specification ITU-T SS7 MTP3, ANSI, TCC, IETF, MPT -// Reference: ITU-T Recommendation Q.704, RFC3332 -// Rev: R11A01 -// Prodnr: CNL 113 337 -// Updated: 2012-05-24 -// Contact: http://ttcn.ericsson.se - -// IMPORTANT MODIFICATION: -// mtp3_ttc uses ALWAYS 16 bits long SPCs, regardless of mtp3_ni sio - -#include "MTP3asp_PT.hh" - -#include "MTP3asp_Types.hh" -#include "MTP3asp_PortType.hh" - -#include -#include -#include -#include -#include -#include -#include - - -// Constans for M3UA, see rfc 3332 and 2/1056-FCPW 101 86/P-1 -// Constants for decoding M3UA common headers -#define M3UA_VER_OFFS 0 -#define M3UA_CLS_OFFS 2 -#define M3UA_TYP_OFFS 3 -#define M3UA_LGT_OFFS 4 -#define M3UA_MSG_OFFS 8 -#define M3UA_MSG_LENGTH_LENGTH 4 - -// Constants for M3UA protocol -//Msg classes -#define M3UA_MSG_CLS_MGMT 0x00 -#define M3UA_MSG_CLS_TRNSFM 0x01 -#define M3UA_MSG_CLS_SSNM 0x02 -#define M3UA_MSG_CLS_ASPSM 0x03 -#define M3UA_MSG_CLS_ASPTM 0x04 -#define M3UA_MSG_CLS_RKM 0x09 -//Msg types -#define M3UA_MSG_TYP_MGMT_ERR 0x00 -#define M3UA_MSG_TYP_MGMT_NTFY 0x01 - -#define M3UA_MSG_TYP_TRSNFM_DATA 0x01 - -#define M3UA_MSG_TYP_SSNM_DUNA 0x01 -#define M3UA_MSG_TYP_SSNM_DAVA 0x02 -#define M3UA_MSG_TYP_SSNM_DAUD 0x03 -#define M3UA_MSG_TYP_SSNM_SCON 0x04 -#define M3UA_MSG_TYP_SSNM_DUPU 0x05 -#define M3UA_MSG_TYP_SSNM_DRST 0x06 - -#define M3UA_MSG_TYP_ASPSM_ASPUP 0x01 -#define M3UA_MSG_TYP_ASPSM_ASPDN 0x02 -#define M3UA_MSG_TYP_ASPSM_BEAT 0x03 -#define M3UA_MSG_TYP_ASPSM_ASPUPAck 0x04 -#define M3UA_MSG_TYP_ASPSM_ASPDNAck 0x05 -#define M3UA_MSG_TYP_ASPSM_BEATAck 0x06 - -#define M3UA_MSG_TYP_ASPTM_ASPAC 0x01 -#define M3UA_MSG_TYP_ASPTM_ASPIA 0x02 -#define M3UA_MSG_TYP_ASPTM_ASPACAck 0x03 -#define M3UA_MSG_TYP_ASPTM_ASPIAAck 0x04 - -#define M3UA_MSG_TYP_RKM_REGREQ 0x01 -#define M3UA_MSG_TYP_RKM_REGRSP 0x02 -#define M3UA_MSG_TYP_RKM_DEREGREQ 0x03 -#define M3UA_MSG_TYP_RKM_DEREGRESP 0x04 - -//parameters -//common for all adaptation layer -#define PAR_PREFIX_COMMON 0x00 -#define PAR_INFO_STR 0x04 -#define PAR_ROUTING_CTX 0x06 -#define PAR_DIAG_INFO 0x07 -#define PAR_HEART_BEAT 0x09 -#define PAR_TRAFFMODE_T 0x0b -#define PAR_ERROR_CODE 0x0c -#define PAR_STATUS 0x0d -#define PAR_ASP_ID 0x11 -#define PAR_AFFECTED_PC 0x12 -#define PAR_CORREL_ID 0x13 - -//M3UA specific -#define PAR_PREFIX_M3UA 0x02 -#define PAR_NETW_APP 0x00 -#define PAR_USR_O_CAUSE 0x04 -#define PAR_CNGST_IND 0x05 -#define PAR_CNCRD_IND 0x06 -#define PAR_ROUTING_KEY 0x07 -#define PAR_REG_RSLT 0x08 -#define PAR_DEREG_RSLT 0x09 -#define PAR_LOC_RK_ID 0x0a -#define PAR_DPC 0x0b -#define PAR_SI 0x0c -#define PAR_OPC_LIST 0x0e -#define PAR_CIRC_RNG 0x0f -#define PAR_PROT_DATA 0x10 -#define PAR_REG_STAT 0x12 -#define PAR_DEREG_STAT 0x13 - -// error codes: -#define PAR_ERRC_IVER 0x01 -#define PAR_ERRC_UNSMC 0x03 -#define PAR_ERRC_UNSMT 0x04 -#define PAR_ERRC_UNTMT 0x05 -#define PAR_ERRC_UNEM 0x06 -#define PAR_ERRC_PERR 0x07 -#define PAR_ERRC_ISI 0x09 -#define PAR_ERRC_RMB 0x0D -#define PAR_ERRC_ASPIDR 0x0E -#define PAR_ERRC_IASPID 0x0F -#define PAR_ERRC_IPARV 0x11 -#define PAR_ERRC_PARFE 0x12 -#define PAR_ERRC_UPAR 0x13 -#define PAR_ERRC_DSU 0x14 -#define PAR_ERRC_INA 0x15 -#define PAR_ERRC_MP 0x16 -#define PAR_ERRC_IRC 0x19 -#define PAR_ERRC_NCFAS 0x1A - - -// -------------------------- -// Basic Test Port functions -// -------------------------- -using namespace MTP3asp__Types; -namespace MTP3asp__PortType { - -//external functions -//########################################################## - -//f__MTP3__SEA__connect (for MTP3asp_PT) -BOOLEAN f__MTP3__SEA__connect(MTP3asp__PT& portRef, - const CHARSTRING& Hostname,const INTEGER& Port,const CHARSTRING& EntityName,const BOOLEAN& Http) -{ - return f__MTP3__SEA__connect__extern(portRef,Hostname,Port,EntityName,Http); -} -//------------ - -//f__MTP3__SEA__disconnect (for MTP3asp_PT) -BOOLEAN f__MTP3__SEA__disconnect(MTP3asp__PT& portRef) -{ - return f__MTP3__SEA__disconnect__extern(portRef); -} -//------------ - -//f__MTP3__SEA__connect__extern -BOOLEAN f__MTP3__SEA__connect__extern(MTP3asp__PT_PROVIDER& portRef, - const CHARSTRING& Hostname,const INTEGER& Port,const CHARSTRING& EntityName,const BOOLEAN& Http) -{ -#ifndef TARGET_TEST - if (portRef.dynamicConnection && (!(portRef.connectionUp))) - { - delete [] portRef.hostname; - int len = strlen(Hostname); - portRef.hostname = new char[len + 1]; - memcpy(portRef.hostname, Hostname, len + 1); - - portRef.httpport = Port; - - delete [] portRef.entityname; - len = strlen(EntityName); - portRef.entityname = new char[len + 1]; - memcpy(portRef.entityname, EntityName, len + 1); - - if(Http) - portRef.MTP3_open_channel(TRUE); - else - portRef.MTP3_open_channel(FALSE); - - if(portRef.wait_for_open()) - { - portRef.user_connect(); - portRef.connectionUp = TRUE; - return TRUE; - } - } - else -#endif - portRef.log("Dynamic connection feature is not active or already connected."); - return FALSE; -} -//------------ - -//f__MTP3__SEA__disconnect__extern -BOOLEAN f__MTP3__SEA__disconnect__extern(MTP3asp__PT_PROVIDER& portRef) -{ -#ifndef TARGET_TEST - if (portRef.connectionUp) - { - portRef.MTP3_close_connection(); - portRef.connectionUp = FALSE; - return TRUE; - } -#endif - return FALSE; -} -//------------ - -// Test Port constructor -MTP3asp__PT_PROVIDER::MTP3asp__PT_PROVIDER(const char *par_port_name) - : PORT(par_port_name) -{ - MTP_fd=-1; - httpport=-1; - hostname=NULL; - destinationname = NULL; - dynamicConnection = FALSE; - - const char *str="b303d76a-266c-11d4-b8f5-08002090d3da"; - int len = strlen(str); - iid_string= new char[len + 1]; - memcpy(iid_string, str, len + 1); - - entityname=NULL; - Filter=Loop=-1; - Sut_Pc=Tester_Pc=-1; - Ni_is_set = FALSE; - MTPServiceType = MTP3itu; - M3UA_version = 1; - M3UAState = AssocDown; // unnecessary... - mtp3_ni=0; -#ifndef TARGET_TEST - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; -#endif - forward_pause = FALSE; - forward_resume = FALSE; - forward_status = FALSE; -} -//------------ - -// Test Port destructor -MTP3asp__PT_PROVIDER::~MTP3asp__PT_PROVIDER() -{ - delete [] hostname; - delete [] entityname; - delete [] iid_string; -} -//------------ - -// set_parameter -void MTP3asp__PT_PROVIDER::set_parameter(const char *parameter_name, - const char *parameter_value) -{ - log("set_parameter: %s = %s",parameter_name,parameter_value); - if (!strcmp(parameter_name,"Hostname")) - { - delete [] hostname; - int len = strlen(parameter_value); - hostname = new char[len + 1]; - memcpy(hostname, parameter_value, len + 1); - } - else if (!strcmp(parameter_name, "HttpPort")) - { - httpport = atoi(parameter_value); - } - else if (!strcmp(parameter_name,"EntityName")) - { - delete [] entityname; - int len = strlen(parameter_value); - entityname= new char[len + 1]; - memcpy(entityname, parameter_value, len + 1); - } - else if (!strcmp(parameter_name,"DestinationName")) - { - delete [] destinationname; - int len = strlen(parameter_value); - destinationname= new char[len + 1]; - memcpy(destinationname, parameter_value, len + 1); - } - else if (!strcmp(parameter_name,"Filter")) - { - if (!strcmp(parameter_value,"ON")) Filter = MTP3_ON; - else Filter = MTP3_OFF; - } - else if (!strcmp(parameter_name,"Loop")) - { - if (!strcmp(parameter_value,"ON")) Loop = MTP3_ON; - else Loop = MTP3_OFF; - } - else if (!strcmp(parameter_name,"NI")) - { - Ni_is_set = TRUE; - mtp3_ni = atoi(parameter_value); - debuglog("Network indicator is set to %i",mtp3_ni); - } - else if (!strcmp(parameter_name,"SUT_Pc")) - { - Sut_Pc = atoi(parameter_value); - } - else if (!strcmp(parameter_name,"TESTER_Pc")) - { - Tester_Pc = atoi(parameter_value); - } - else if (!strcmp(parameter_name,"M3UA_version")) - { - M3UA_version = atoi(parameter_value); - debuglog("%d",M3UA_version); - } -#ifndef TARGET_TEST - else if (!strcmp(parameter_name,"DynamicConnection")) - { - if (!strcasecmp(parameter_value,"ON")) - { - dynamicConnection = TRUE; - } - } -#endif - else if (!strcmp(parameter_name,"MTP3ServiceType")) - { - if (!strcmp(parameter_value,"TargetM3UA")) - { -#ifndef TARGET_TEST - error("TargetM3UA not supported, since TARGET_TEST not in Makefile"); -#else - log("MTP3ServiceType is set to TargetM3UA"); - user_map_p = &MTP3asp__PT_PROVIDER::Target_user_map; - user_unmap_p = &MTP3asp__PT_PROVIDER::Target_user_unmap; - MTPServiceType = TargetM3UA; -#endif - } - else if (!strcmp(parameter_value,"TargetSTC")) - { -#ifndef TARGET_TEST - error("TargetSTC not supported, since TARGET_TEST not in Makefile"); -#else - log("MTP3ServiceType is set to TargetSTC"); - user_map_p = &MTP3asp__PT_PROVIDER::TargetSTC_user_map; - user_unmap_p = &MTP3asp__PT_PROVIDER::Target_user_unmap; //Same as by Target M3UA - MTPServiceType = TargetSTC; -#endif - } -#ifndef TARGET_TEST - else if (!strcmp(parameter_value,"M3UA")) - { //M3UA - log("MTP3ServiceType is set to M3UA"); - interpreter = &MTP3asp__PT_PROVIDER::M3UA_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::M3UA_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::M3UA_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::M3UA_user_unmap; - MTPServiceType = M3UA; - } - else if (!strcmp(parameter_value,"MTP3itu")) - { - log("MTP3ServiceType is set to MTP3itu"); - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::MTP3_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - MTPServiceType = MTP3itu; - } - else if ( !strcmp(parameter_value,"MTP3ansi")) - { - log("MTP3ServiceType is set to MTP3ansi"); - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::MTP3_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - MTPServiceType = MTP3ansi; - } - else if ( !strcmp(parameter_value,"MTP3ttc")) - { - log("MTP3ServiceType is set to MTP3ttc"); - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::MTP3_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - MTPServiceType = MTP3ttc; - } - else if ( !strcmp(parameter_value,"MTP3mpt")) - { - log("MTP3ServiceType is set to MTP3mpt"); - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::MTP3_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - MTPServiceType = MTP3mpt; - } - else if ( !strcmp(parameter_value,"MTP3bttc")) - { - log("MTP3ServiceType is set to MTP3bttc"); - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::MTP3_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - MTPServiceType = MTP3bttc; - } - else if ( !strcmp(parameter_value,"MTP3iup")) - { - log("MTP3ServiceType is set to MTP3iup"); - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::MTP3_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - MTPServiceType = MTP3iup; - } - else if ( !strcmp(parameter_value,"STC")) - { - log("MTP3ServiceType is set to STC"); - interpreter = &MTP3asp__PT_PROVIDER::STC_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::STC_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::STC_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::STC_user_unmap; - MTPServiceType = STC; - } -#endif - else - { - log("Unsupported MTP3ServiceType: %s, falling back to MTP3itu", - parameter_value); - } - } - else if(strcasecmp(parameter_name, "forward_pause") == 0) - { - if (strcasecmp(parameter_value,"forward") == 0) - forward_pause = TRUE; - else if(strcasecmp(parameter_value,"ignore") == 0) - forward_pause = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. Only forward and ignore can be used!" , - parameter_value, parameter_name); - } - else if(strcasecmp(parameter_name, "forward_resume") == 0) - { - if (strcasecmp(parameter_value,"forward") == 0) - forward_resume = TRUE; - else if(strcasecmp(parameter_value,"ignore") == 0) - forward_resume = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. Only forward and ignore can be used!" , - parameter_value, parameter_name); - } - else if(strcasecmp(parameter_name, "forward_status") == 0) - { - if (strcasecmp(parameter_value,"forward") == 0) - forward_status = TRUE; - else if(strcasecmp(parameter_value,"ignore") == 0) - forward_status = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. Only forward and ignore can be used!" , - parameter_value, parameter_name); - } - else -#ifdef TARGET_TEST - if(!parameter_set(parameter_name ,parameter_value)) //TCP parameters -#endif - log("Unsupported parameter: %s", parameter_name); -} -//------------ - -// User map -void MTP3asp__PT_PROVIDER::user_map(const char *system_port) -{ - if (user_map_p == NULL) - error("Parameter MTP3ServiceType should be set to TargetM3UA in TARGET_TEST mode!"); - - (this->*user_map_p)(system_port); -} -//------------ - -// User unmap -void MTP3asp__PT_PROVIDER::user_unmap(const char *system_port) -{ - (this->*user_unmap_p)(system_port); -} -//------------ - -#ifndef TARGET_TEST -// User connect -void MTP3asp__PT_PROVIDER::user_connect() -{ - (this->*user_connect_p)(); -} -//------------ -#endif - -//User start -void MTP3asp__PT_PROVIDER::user_start() -{ debuglog("user start ordered"); -} -//------------ - -//User stop -void MTP3asp__PT_PROVIDER::user_stop() -{ debuglog("User stop ordered"); -} -//------------ - -//Event Handler -void MTP3asp__PT_PROVIDER::Handle_Fd_Event(int fd, - boolean is_readable, boolean is_writable, boolean is_error) -{ - if (MTPServiceType == TargetM3UA ) - { -#ifdef TARGET_TEST - //In case of target Abstract Socket handles the received message - Handle_Socket_Event(fd, is_readable, is_writable, is_error); -#endif - } -#ifndef TARGET_TEST - else - { - int result; - - result = MPH_ProcessConnection(myConnection); - - if (result <= 0) - { - MPH_CloseConnection(myConnection); - if (result == 0) log("Connection closed by peer."); - else log("Error in incoming message."); - } - } -#endif -} - -void MTP3asp__PT_PROVIDER::Handle_Timeout(double time_since_last_call) -{ -#ifdef TARGET_TEST - Handle_Timeout_Event(time_since_last_call); -#endif -} -//------------ - -//Outgoing send -void MTP3asp__PT_PROVIDER::outgoing_send(const ASP__MTP3__TRANSFERreq& send_par) -{ - MTP3__Field__sio sio_field = send_par.sio(); -#ifndef TARGET_TEST - int si=bit2int(sio_field.si()); -#endif - - OCTETSTRING sio_oct = bit2oct(sio_field.ni()+sio_field.prio()+sio_field.si()); - OCTETSTRING bttc_oct = int2oct(stored_bttc_octet, 1); // additional octet for MTP3bttc - - //Message sending by testing on Target - if (MTPServiceType == TargetM3UA) - { -#ifdef TARGET_TEST - OCTETSTRING tcpData = int2oct(1,1); //Message type - tcpData = tcpData + int2oct(send_par.data().lengthof()+15,4); //Length - tcpData = tcpData + sio_oct; - tcpData = tcpData + int2oct(send_par.opc(),4); - tcpData = tcpData + int2oct(send_par.dpc(),4); - tcpData = tcpData + int2oct(send_par.sls(),1); - tcpData = tcpData + send_par.data(); - send_outgoing((const unsigned char*)tcpData,tcpData.lengthof()); - - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - TTCN_Logger::log_event_str("Transfer Req message sent: "); - tcpData.log(); - TTCN_Logger::end_event(); -#endif - return; - } - //Message sending by testing on Target - if (MTPServiceType == TargetSTC) - { -#ifdef TARGET_TEST - OCTETSTRING tcpData = int2oct(1,1); //Message type - tcpData = tcpData + int2oct(send_par.data().lengthof()+15,4); //Length - tcpData = tcpData + int2oct(0,1); - tcpData = tcpData + int2oct(0,4); - tcpData = tcpData + int2oct(0,4); - tcpData = tcpData + int2oct(0,1); - tcpData = tcpData + send_par.data(); - send_outgoing((const unsigned char*)tcpData,tcpData.lengthof()); - - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - TTCN_Logger::log_event_str("Transfer Req (STC) message sent: "); - tcpData.log(); - TTCN_Logger::end_event(); -#endif - return; - } -#ifndef TARGET_TEST - if (dynamicConnection &&(!connectionUp)) - { - warn("Connection was not activated via function f_M3UA_SEA_connect."); - return; - } - - unsigned int offset; - int MSU_length = send_par.data().lengthof(); - int M3UA_par_length; - int length; - int labellen; // sio+routinglabel length - - switch ( MTPServiceType) - { - case STC: - length = MSU_length; - memcpy(buffer, send_par.data(), send_par.data().lengthof()); - break; - case MTP3iup: - if(si==4) - { - offset = 0; - labellen=6; //ITU-T:sio(1byte) + standard telephony label(5byte) - length = MSU_length+labellen; - buffer[0] = *((const unsigned char*)sio_oct); - SetPointCodesIUP(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, send_par.data(), send_par.data().lengthof()); - } - else - { - offset = 0; - labellen=5; //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - length = MSU_length + labellen; //SIF+SIO ; - //append MTP3 MSU - buffer[offset] = *((const unsigned char*)sio_oct); - SetPointCodes(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, send_par.data(), send_par.data().lengthof()); - } - break; - case MTP3itu: - offset = 0; - labellen=5; //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - length = MSU_length + labellen; //SIF+SIO ; - //append MTP3 MSU - buffer[offset] = *((const unsigned char*)sio_oct); - SetPointCodes(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, send_par.data(), send_par.data().lengthof()); - break; - case MTP3ansi: - offset = 0; - labellen=8; //ANSI: sio(1byte) +routing label(7byte) see T1.111.4 - length = MSU_length + labellen; //SIF+SIO ; - //append MTP3 MSU - buffer[offset] = *((const unsigned char*)sio_oct); - SetPointCodes(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, send_par.data(), send_par.data().lengthof()); - break; - case MTP3ttc: - offset = 0; - //if (mtp3_ni==0){ labellen=5;} - //else { - labellen=6; - //} //TTC: sio(1byte) +routing label(6byte) see ... - length = MSU_length + labellen; //SIF+SIO ; - //append MTP3 MSU - buffer[offset] = *((const unsigned char*)sio_oct); - SetPointCodes(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, send_par.data(), send_par.data().lengthof()); - break; - case MTP3bttc: - offset = 0; - buffer[offset] = *((const unsigned char*)bttc_oct); - offset += 1; - labellen=7; //routing label(7byte) - length = 1 + MSU_length + labellen; //SIF+SIO ; - //append MTP3 MSU - buffer[offset] = *((const unsigned char*)sio_oct); - SetPointCodes(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, send_par.data(), send_par.data().lengthof()); - break; - case MTP3mpt: - offset = 0; - if (mtp3_ni==2) - { labellen=8;} //MPT national: sio(1byte) +routing label(7byte) - else - { labellen=5;} //MPT international: sio(1byte) +routing label(4byte) - length = MSU_length + labellen; //SIF+SIO ; - //append MTP3 MSU - buffer[offset] = *((const unsigned char*)sio_oct); - SetPointCodes(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, - send_par.data(), send_par.data().lengthof()); - break; - case M3UA : - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 test port debug: Message to be encoded is: {"); - send_par.data().log(); - TTCN_Logger::log_event(" "); - if( M3UAState != AssocActive ) - { - TTCN_Logger::log_event(" M3UAState is not ready to send data. Its state code: %d",AssocActive); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - return; - } - //calculating lengths - M3UA_par_length = MSU_length + 16; // ProtocolData parameter - // header length=16 <== see f - TTCN_Logger::log_event(", Adjusted M3UA_par_length to %d to support 16 octets M3UA param header",M3UA_par_length); - length = 8 + M3UA_par_length; //msg length = header+par - TTCN_Logger::log_event(", M3UA MSU_length is %d ==> there should be %d padding octets", MSU_length, 4-(MSU_length%4)); - if (MSU_length%4) { //should be padded to be multiple of 4 octets - length += 4 - (MSU_length%4); //padding shall be counted in msg - //length, but not in par_length - } - TTCN_Logger::log_event(", Set msg length (which includes 8 octets M3UA hdr) to %d ",length); - - //filling the first part of the buffer - //common msg hdr ====================================== - buffer[0] = M3UA_version; - buffer[1] = 0x00; //spare - buffer[2] = M3UA_MSG_CLS_TRNSFM; // msg class - buffer[3] = M3UA_MSG_TYP_TRSNFM_DATA; // msg type - encode_32b_int(buffer+4, length); //msg length, 4 bytes - //ProtocolData parameter header========================= - //tag - buffer[M3UA_MSG_OFFS] = PAR_PREFIX_M3UA; //par. tag 1st octet - buffer[M3UA_MSG_OFFS+1] = PAR_PROT_DATA; // par tag 2nd octet - //length, NOTE: should not contain the padding bytes! - encode_16b_int(buffer+M3UA_MSG_OFFS+2,M3UA_par_length); - //OPC,DPC - encode_32b_int(buffer+M3UA_MSG_OFFS+4,send_par.opc()); - encode_32b_int(buffer+M3UA_MSG_OFFS+8,send_par.dpc()); - //SI, NI, MP, SLS - buffer[M3UA_MSG_OFFS+12] = bit2int(sio_field.si()); // SI LSb aligned - buffer[M3UA_MSG_OFFS+13] = bit2int(sio_field.ni()); // NI LSb aligned - buffer[M3UA_MSG_OFFS+14] = bit2int(sio_field.prio()); //MP LSb - //aligned - buffer[M3UA_MSG_OFFS+15] = 0xFF & send_par.sls(); //SLS - // finally the MTP3 MSU itself.... - offset = M3UA_MSG_OFFS + 16; - TTCN_Logger::log_event(", buffer offset is now set to %d", offset); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - //append MTP3 MSU - memcpy(buffer + offset, send_par.data(), send_par.data().lengthof()); - - //padding - for (int ii = 0; ii< (MSU_length%4); ++ii) buffer[offset+MSU_length+ii]= 0x00; - break; - default: - error("Invalid MTP3ServiceType setting!"); - } - if (TTCN_Logger::log_this_event(TTCN_DEBUG)) - { - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("The encoded buffer is: {"); - OCTETSTRING(length, buffer).log(); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - } - send_msg(buffer, length); -#endif -} -//------------ - -void MTP3asp__PT_PROVIDER::log(const char *msg, ...) -{ - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - va_list ap; - va_start(ap, msg); - TTCN_Logger::log_event_va_list(msg, ap); - va_end(ap); - TTCN_Logger::end_event(); -} -//------------ - -void MTP3asp__PT_PROVIDER::warn(const char *msg, ...) -{ - TTCN_Logger::begin_event(TTCN_WARNING); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - va_list ap; - va_start(ap, msg); - TTCN_Logger::log_event_va_list(msg, ap); - va_end(ap); - TTCN_Logger::end_event(); -} -//------------ - -void MTP3asp__PT_PROVIDER::debuglog(const char *msg, ...) -{ - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - va_list ap; - va_start(ap, msg); - TTCN_Logger::log_event_va_list(msg, ap); - va_end(ap); - TTCN_Logger::end_event(); -} -//------------ - -void MTP3asp__PT_PROVIDER::error(const char *msg, ...) -{ - TTCN_Logger::begin_event(TTCN_ERROR); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - va_list ap; - va_start(ap, msg); - TTCN_Logger::log_event_va_list(msg, ap); - va_end(ap); - TTCN_Logger::end_event(); - TTCN_error("Fatal error in MTP3 Test Port %s.", get_name()); -} -//------------ - -void MTP3asp__PT_PROVIDER::close_log_event() -{ - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); -} -//------------ - - -#ifndef TARGET_TEST -// -------------------------------------------- -// Functions and definitions for test with SEA -// -------------------------------------------- - -// Functions of MPH toolkit -// --------------------------- -void connectCallback(CONNECTION* con, int channel, void *clientData) -{ - ((MTP3asp__PT_PROVIDER *)clientData)->log("Opening channel succeeded " - "(channel number is %u)", channel); - ((MTP3asp__PT_PROVIDER *)clientData)->set_channel(channel); - if(((MTP3asp__PT_PROVIDER *)clientData)->dynamicConnection) - ((MTP3asp__PT_PROVIDER *)clientData)->conn_state = 1; -} - -void messageCallback(CONNECTION* con, int channel, int length, - unsigned char *msg, void *clientData) -{ - ((MTP3asp__PT_PROVIDER *)clientData)->log("Incoming message from channel: %d",channel); - ((MTP3asp__PT_PROVIDER *)clientData)->doInterpret(msg,length,channel,con); -} - -void closeCallback(CONNECTION* con, int channel, void *clientData) -{ - ((MTP3asp__PT_PROVIDER *)clientData)->log("Closed channel: %d", channel); -} - -void errorCallback(CONNECTION* con, char *name, char *errorMessage, - void *clientData) -{ - if(((MTP3asp__PT_PROVIDER *)clientData)->dynamicConnection) - { - ((MTP3asp__PT_PROVIDER *)clientData)->log("Opening channel %s failed: %s", name, errorMessage); - ((MTP3asp__PT_PROVIDER *)clientData)->conn_state = 2; - } - else - ((MTP3asp__PT_PROVIDER *)clientData)->error("Opening channel %s failed: %s", - name, errorMessage); -} -//------------ - -//MTP3_open_channel -void MTP3asp__PT_PROVIDER::MTP3_open_channel(boolean http) -{ - int result; - int Mphport; - char *perrorString; - if( Loop == MTP3_ON ) - { - MTP_fd=-1; - myConnection = NULL; - log("MTP3_open_channel finished for LOOP"); - return; - } - - if(http) - { - Mphport = MPH_GetMphPort(hostname,httpport,&perrorString); - } - else - { - Mphport = httpport; - } - - if (Mphport == -1) - error("GetMphPort failed: %s", *perrorString); - - result = MPH_StringToIid(iid_string, &iid); - if (result == -1) - error("Converting %s to MPH_IID failed.", iid_string); - - myConnection = MPH_OpenConnection(hostname, Mphport); - if (myConnection == NULL) - error("Opening connection to %s:%d failed.", hostname, Mphport); - - MPH_OpenChannel(myConnection, - entityname, - &iid, - connectCallback, - messageCallback, - closeCallback, - errorCallback, - this); - - MTP_fd = MPH_GetConnectionFd(myConnection); - if (MTP_fd != -1) - Handler_Add_Fd_Read(MTP_fd); - else - error("Incorrect file descriptor: %d.", MTP_fd); -} -//------------ - -// MTP3_close_connection -void MTP3asp__PT_PROVIDER::MTP3_close_connection() -{ - MPH_CloseConnection(myConnection); - Handler_Remove_Fd_Read(MTP_fd); - close( MTP_fd ); - //Uninstall_Handler(); // Unnecessary if only socket MTP_fd is in use -} -//------------ - -// wait_for_open -boolean MTP3asp__PT_PROVIDER::wait_for_open() -{ - conn_state = 0; - while(conn_state==0) - { - pollfd pollFd = { MTP_fd, POLLIN, 0 }; - int nEvents = poll(&pollFd, 1, 3000 /* ms */); - if (nEvents == 0) { - log("MPH channel opening time out"); - return FALSE; - } - if (nEvents < 0 || (pollFd.revents & (POLLIN | POLLHUP)) == 0) { - log("MPH channel opening error (%d)", (nEvents < 0) ? errno : 0); - return FALSE; - } - Handle_Fd_Event(MTP_fd, TRUE, FALSE, FALSE); - } - if(conn_state == 1) //connectCallback received - { - conn_state = 0; - return TRUE; - } - else //errorCallback received - { - conn_state = 0; - return FALSE; - } -} -//------------ - -//send msg -void MTP3asp__PT_PROVIDER::send_msg(unsigned char *outbuff, int length) -{ - OCTETSTRING buff(length,outbuff); - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3/M3UA Test Port (%s): {", get_name()); - TTCN_Logger::log_event("outgoing buffer= "); - buff.log(); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - if (Loop == MTP3_ON) - { - log("Message looped back"); - doInterpret(outbuff, length, channel, myConnection); - } else - { - MPH_SendMessage(myConnection,channel,length,outbuff); - log("Message sent on channel %d", channel); - } -} -//------------ - -//Check TestPortVariables -void MTP3asp__PT_PROVIDER::Check_TestPort_Variables() -{ - if(!dynamicConnection) - { - if (httpport==-1) error("Parameter HttpPort is not set."); - if (hostname==NULL) error("Parameter Hostname is not set."); - if (entityname==NULL) error("Parameter EntityName is not set."); - } - if (Filter==-1) error("Parameter Filter is not set."); - if (Loop==-1) error("Parameter Loop is not set."); - if (Sut_Pc==-1) error("Parameter SUT_Pc is not set."); - if (Tester_Pc==-1) error("Parameter TESTER_Pc is not set."); - if (!Ni_is_set) error("Parameter NI is not set."); -} -//------------ - -// ------------------------------------------------- -// STC Functions and definitions for test with SEA -// ------------------------------------------------- -void MTP3asp__PT_PROVIDER::Check_TestPort_Variables_STC() -{ - if(!dynamicConnection) - { - if (httpport==-1) error("Parameter HttpPort is not set."); - if (hostname==NULL) error("Parameter Hostname is not set."); - if (entityname==NULL) error("Parameter EntityName is not set."); - } -} -//------------ - -//STC user map -void MTP3asp__PT_PROVIDER::STC_user_map(const char *system_port) -{ - debuglog("Function STC_user_map started"); - Check_TestPort_Variables_STC(); - if(dynamicConnection) - { - connectionUp = FALSE; - } - else - { - MTP3_open_channel(TRUE); - STC_user_connect(); - } -} -//------------ - -//STC user connect -void MTP3asp__PT_PROVIDER::STC_user_connect() -{ -} - -//STC user unmap -void MTP3asp__PT_PROVIDER::STC_user_unmap(const char *system_port) -{ - MTP3_close_connection(); - dynamicConnection = FALSE; -} -//------------ - -//STC interpreter -void MTP3asp__PT_PROVIDER::STC_interpreter(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con) -{ - if ((length==0) || (inbuffer==NULL)) - { - log("0 byte long message received -> packet dropped."); - return; - } - - if (length==1) - { - log("1 byte long internal SEA message received -> packet dropped."); - return; - } - - if ( !strcmp((const char*)inbuffer,"start") ) - { - log("start message received from SEA"); - return; - } - else if (!strcmp((const char*)inbuffer,"stop")) - { - log("stop message received from SEA"); - return; - } - - // writing out the contents of the buffer - OCTETSTRING buff(length,inbuffer); - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("incoming buffer: "); - buff.log(); - TTCN_Logger::end_event(); - - ASP__MTP3__TRANSFERind recv_msg; - MTP3__Field__sio recv_sio; - recv_sio.ni()= int2bit(0,2); - recv_sio.prio()= int2bit(0,2); - recv_sio.si()= int2bit(0,4); - recv_msg.sio() = recv_sio; - recv_msg.sls() = 0; - recv_msg.opc() = 0; - recv_msg.dpc() = 0; - recv_msg.data() = OCTETSTRING(length, &inbuffer[0]); - incoming_message( recv_msg ); -} - -// ------------------------------------------------- -// MTP3 Functions and definitions for test with SEA -// ------------------------------------------------- - -// SLTM messages for MTP3 -// ----------------------- -unsigned char ttcn_in_sltm[] = { - 'T','T','C','N','-','3',' ','E','x','e','c','u','t','o','r'}; - -const int sizeof_ttcn_in_sltm=15; - -// ITU: -unsigned char sltm_msg_itu[] = -{ - 0x1, //SIO /'test & maint' see Q.704 /14.2.1 => 0x81 suggested !!! - 0x0, 0x0, 0x0, 0x0, //4 bytes for label (dpc, opc,sls) - 0x11, //Heading code ITU, see Q.707/5.4 - 0xF0, //spare+Length of the following string: - 'T', 'T', 'C', 'N', '-', '3', ' ', 'E', 'x', 'e', 'c', 'u', 't', 'o', 'r' -}; -const int sizeof_sltm_msg_itu=7+15; - -// ANSI: -unsigned char sltm_msg_ansi[]= -{ - 0xB1, //SIO - 0x0,0x0,0x0,0x0,0x0,0x0,0x0, // 7 bytes for label - 0x11, // Heading Code ANSI T1.111.7-2001 - 0xF0, // SLC(is 0 OK???)+Length in bytes of the following string: - 'T', 'T', 'C', 'N', '-', '3', ' ', 'E', 'x', 'e', 'c', 'u', 't', 'o', 'r' -}; -const int sizeof_sltm_ansi=10+15; - -// TTC: -unsigned char sltm_msg_ttc_national[]= -{ - 0x81, //SIO - 0x0,0x0,0x0,0x0,0x0,0x0, // 6 bytes for label TO BE CONT!!! - 0x11, // Heading Code - 0xF0, // SLC(is 0 OK???)+Length in bytes of the following string: - 'T', 'T', 'C', 'N', '-', '3', ' ', 'E', 'x', 'e', 'c', 'u', 't', 'o', 'r' -}; -const int sizeof_sltm_msg_ttc_national=9+15; - -// BTTC: -unsigned char sltm_msg_bttc_national[]= -{ - 0x0, // extra octet, ignored - 0x81, //SIO - 0x0,0x0,0x0,0x0,0x0,0x0, // 6 bytes for label TO BE CONT!!! - 0x23, // Heading Code - 'T', 'T' -}; -const int sizeof_sltm_msg_bttc_national=1+8+2; - -// MPT: -unsigned char sltm_msg_mpt_national[]= -{ - 0x81, //SIO - 0x0,0x0,0x0,0x0,0x0,0x0,0x0, // 7 bytes for label - 0x11, // Heading Code - 0xF0, // SLC(is 0 OK???)+Length in bytes of the following string: - 'T', 'T', 'C', 'N', '-', '3', ' ', 'E', 'x', 'e', 'c', 'u', 't', 'o', 'r' -}; -const int sizeof_sltm_msg_mpt_national=10+15; -//------------ - - -// coder functions for MTP3 -// ------------------------- -// unsigned int<-> unsigned char array -// Integer encode/decode functions that will encode/decode from/to -// Result: Least Significant Byte first (in lowest address) = LSB = Little Endian -void MTP3asp__PT_PROVIDER::encode_56bLSB_int(unsigned char *to, unsigned long long int from) -{ - to[0] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[2] = from & 0xFF; - from >>= 8; - to[3] = from & 0xFF; - from >>= 8; - to[4] = from & 0xFF; - from >>= 8; - to[5] = from & 0xFF; - from >>= 8; - to[6] = from & 0xFF; -} -//------------ - -unsigned long long int MTP3asp__PT_PROVIDER::decode_56bLSB_int(const unsigned char *from) -{ - typedef unsigned long long int ull; - return ((ull) from[0]) | - ((ull) from[1] <<8)| - ((ull) from[2] << 16)| - ((ull) from[3] << 24)| - ((ull) from[4] << 32)| - ((ull) from[5] << 40)| - ((ull) from[6] << 48); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_48bLSB_int(unsigned char *to, unsigned long long int from) -{ - to[0] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[2] = from & 0xFF; - from >>= 8; - to[3] = from & 0xFF; - from >>= 8; - to[4] = from & 0xFF; - from >>= 8; - to[5] = from & 0xFF; -} -//------------ - -unsigned long long int MTP3asp__PT_PROVIDER::decode_48bLSB_int(const unsigned char *from) -{ - typedef unsigned long long int ull; - return ((ull) from[0]) | - ((ull) from[1] <<8)| - ((ull) from[2] << 16)| - ((ull) from[3] << 24)| - ((ull) from[4] << 32)| - ((ull) from[5] << 40); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_40bLSB_int(unsigned char *to, unsigned long long int from) -{ - to[0] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[2] = from & 0xFF; - from >>= 8; - to[3] = from & 0xFF; - from >>= 8; - to[4] = from & 0xFF; -} -//------------ - -unsigned long long int MTP3asp__PT_PROVIDER::decode_40bLSB_int(const unsigned char *from) -{ - typedef unsigned long long int ull; - return ((ull) from[0]) | - ((ull) from[1] <<8)| - ((ull) from[2] << 16)| - ((ull) from[3] << 24)| - ((ull) from[4] << 32); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_32bLSB_int(unsigned char *to, unsigned int from) -{ - to[0] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[2] = from & 0xFF; - from >>= 8; - to[3] = from & 0xFF; -} -//------------ - -unsigned int MTP3asp__PT_PROVIDER::decode_32bLSB_int(const unsigned char *from) -{ - return from[0] | (from[1] << 8) | (from[2] << 16) | (from[3] << 24); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_24bLSB_int(unsigned char *to, int from) -{ - to[0] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[2] = from & 0xFF; -} -//------------ - -unsigned int MTP3asp__PT_PROVIDER::decode_24bLSB_int(const unsigned char *from) -{ - return from[0] | (from[1] << 8) | (from[2] << 16); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_16bLSB_int(unsigned char *to, int from) -{ - to[0] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; -} -//------------ - -unsigned int MTP3asp__PT_PROVIDER::decode_16bLSB_int(const unsigned char *from) -{ - return from[0] | (from[1] << 8); -} -//------------ - -//MTP3 user map -void MTP3asp__PT_PROVIDER::MTP3_user_map(const char *system_port) -{ - debuglog("Function MTP3_user_map started"); - Check_TestPort_Variables(); - if(dynamicConnection) - { - connectionUp = FALSE; - } - else - { - MTP3_open_channel(TRUE); - MTP3_user_connect(); - } - debuglog("Function MTP3_user_map finished"); -} -//------------ - -//MTP3 user connect -void MTP3asp__PT_PROVIDER::MTP3_user_connect() -{ - // Sending out an SLTM message: - unsigned char * sltm_msg; - unsigned int offset = 0; - int sizeof_msg; - switch( MTPServiceType) - { - case MTP3itu: - case MTP3iup: - sltm_msg=sltm_msg_itu; - sizeof_msg=sizeof_sltm_msg_itu; - break; - case MTP3ansi: - sltm_msg=sltm_msg_ansi; - sizeof_msg=sizeof_sltm_ansi; - break; - case MTP3ttc: - /* if (mtp3_ni == 0){ - sltm_msg=sltm_msg_itu; - sizeof_msg=sizeof_sltm_msg_itu; - } - else { - */ - sltm_msg=sltm_msg_ttc_national; - sizeof_msg=sizeof_sltm_msg_ttc_national; - // } - break; - case MTP3bttc: - sltm_msg=sltm_msg_bttc_national; - sizeof_msg=sizeof_sltm_msg_bttc_national; - offset = 1; - break; - case MTP3mpt: - if (mtp3_ni == 2) - { - sltm_msg = sltm_msg_mpt_national; - sizeof_msg = sizeof_sltm_msg_mpt_national; - } else - { - sltm_msg = sltm_msg_itu; - sizeof_msg = sizeof_sltm_msg_itu; - } - break; - default: - sltm_msg=sltm_msg_itu; - sizeof_msg=sizeof_sltm_msg_itu; - break; - } - stored_bttc_octet = 0; - unsigned char sio = ((unsigned char) mtp3_ni) << 6; - - if (Ni_is_set) - { sltm_msg[0+offset] = sio | 0x1; } - else - { sltm_msg[0+offset] = 0x1; };//SIO /'test & maint' see Q.704 /14.2.1 => 0x81 suggested !!! - - SetPointCodes(0, Tester_Pc, Sut_Pc, sltm_msg + 1 +offset); // common for ITU, ANSI and TTC - log("MTP3/SLTM message sending..."); - send_msg(sltm_msg, sizeof_msg); -} -//MTP3 user unmap -void MTP3asp__PT_PROVIDER::MTP3_user_unmap(const char *system_port) -{ - MTP3_close_connection(); - dynamicConnection = FALSE; -} - -//MTP3 interpreter -void MTP3asp__PT_PROVIDER::MTP3_interpreter(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con) -{ - if ((length==0) || (inbuffer==NULL)) - { - log("0 byte long message received -> packet dropped."); - return; - } - - if (length==1) - { - log("1 byte long internal SEA message received -> packet dropped."); - return; - } - - if ( !strcmp((const char*)inbuffer,"start") ) - { - log("start message received from SEA"); - return; - } - else if (!strcmp((const char*)inbuffer,"stop")) - { - log("stop message received from SEA"); - return; - } - - // writing out the contents of the buffer - OCTETSTRING buff(length,inbuffer); - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("incoming buffer: "); - buff.log(); - TTCN_Logger::end_event(); - - unsigned int offset = 0; - if ( MTPServiceType==MTP3bttc ) - { - stored_bttc_octet = inbuffer[0]; - offset = 1; - } - int labellen; // sio+routinglabel length - int rec_ni = (inbuffer[offset]) >> 6; //network indicator - if (rec_ni != mtp3_ni) - error("Received NI is different from sent NI."); - - unsigned char sio = inbuffer[offset]; - unsigned int si = sio&0x0F; - - if ( MTPServiceType==MTP3itu ) - { labellen=5; //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - } - else if ( MTPServiceType==MTP3iup ) - { - if(si==4) - labellen=6; //ITU-T:sio(1byte) + standard telephony label(5byte) - else - labellen=5; //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - } - else if ( MTPServiceType==MTP3ansi ) - { labellen=8; //ANSI: sio(1byte) +routing label(7byte) see T1.111.4 - } - else if (MTPServiceType==MTP3ttc) - { labellen=6; //new (2004-03-02): 6= sio(1byte)+ routing label(5bytes) - } - else if (MTPServiceType==MTP3mpt) - { - if ( mtp3_ni == 2) - {labellen=8;} //MPT national: sio(1byte) +routing label(7byte) - else - {labellen=5;} //MPT international: sio(1byte) +routing label(4byte) - } - else if (MTPServiceType==MTP3bttc) - { labellen=7; //7= sio(1byte)+ routing label(6bytes) - } - else - { log("incorrect MTPServiceType - programming error-> packet dropped"); - return; - } - - // checking SIO field (first incoming byte) - management or test message - switch (si) - { - case 0: processing_MTP3_management_msg(inbuffer+offset,length-offset); - return; - case 1: //MTP3itu - case 2: processing_MTP3_test_msg(inbuffer+offset,length-offset); //MTP3ansi - return; - default: - break; - } - - // filling up TTCN structure - if ((Loop==MTP3_ON) || (!Filter) || (Filter&&Check_PcMatch(Sut_Pc,Tester_Pc,&inbuffer[offset+1]))) - { - ASP__MTP3__TRANSFERind recv_msg; - MTP3__Field__sio recv_sio; - BITSTRING sio_bit = oct2bit(OCTETSTRING(1,inbuffer+offset)); - recv_sio.ni()= substr(sio_bit,0,2); - recv_sio.prio()= substr(sio_bit,2,2); - recv_sio.si()= substr(sio_bit,4,4); - recv_msg.sio() = recv_sio; - unsigned int sls,opc,dpc; - if ( (MTPServiceType==MTP3iup) && (si==4) ) - GetPointCodesIUP(sls,opc,dpc,&inbuffer[1]); - else - GetPointCodes(sls,opc,dpc,&inbuffer[offset+1]); - recv_msg.sls() = sls; - recv_msg.opc() = opc; - recv_msg.dpc() = dpc; - int len; - len= length-labellen-offset; //len= length-labellen; - recv_msg.data() = OCTETSTRING(len, &inbuffer[offset+labellen]); - incoming_message( recv_msg ); - } - else - { log("The rooting label (OPC, DPC) not matched with the filter setting -> packet dropped."); - return; - } -} - -void MTP3asp__PT_PROVIDER::processing_MTP3_management_msg(unsigned char* inbuff,int len) -{ - int outlen=0; - int labellen; // sio+routinglabel length - int chm_addlen; // (Changeback) additional length = Heading Code + SLC+ (changeback codes) - int mim_addlen; // (MIM) -"- - unsigned int offset = 0; - OCTETSTRING bttc_oct = int2oct(stored_bttc_octet, 1); // additional octet for MTP3bttc - - if ( MTPServiceType==MTP3itu || MTPServiceType==MTP3iup) - { labellen=5; //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - chm_addlen = 2; - mim_addlen = 1; - } - else if ( MTPServiceType==MTP3ansi ) - { labellen=8; //ANSI: sio(1byte) +routing label(7byte) see T.1.111.4 - chm_addlen = 3; - mim_addlen = 2; - } - else if (MTPServiceType==MTP3ttc) - { //if ( mtp3_ni == 0 ) { labellen=5;} //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - //else { - labellen=6; - //} //sio(1byte)+ routing label(6bytes) see 3/15517-FAY 112 011/2 or jt-q704. - } - else if (MTPServiceType==MTP3mpt) - { if ( mtp3_ni == 2 ) { labellen=8; } - else { labellen=5; } - chm_addlen = 2; - mim_addlen = 1; - } - else if (MTPServiceType==MTP3bttc) - { labellen=7;//sio(1byte)+routing label(6bytes) see 3/15517-FAY 112 011/2 or jt-q704 - offset = 1; - } - else - { log("incorrect MTPServiceType- programming error-> packet dropped"); - return; - } - - if (MTPServiceType==MTP3bttc) - { - buffer[0]=*((const unsigned char*)bttc_oct); //additional stored octet in front - buffer[1]=inbuff[0]; //SIO - if (!ChangePointCodes(&buffer[2],&inbuff[1],len)) - { log("incorrect incoming management message -> packet dropped."); - return; - } - } - else - { - buffer[0]=inbuff[0]; //SIO - if (!ChangePointCodes(&buffer[1],&inbuff[1],len)) - { log("incorrect incoming management message -> packet dropped."); - return; - } - } - - // Changeover & changeback(CHM) see ITU: Q.704/15.4.1 ANSI: T.1.111.4/15.2-4 - if (inbuff[labellen]==0x51) //CBD - { - outlen=labellen+chm_addlen; - if (len packet dropped."); - return; - } - else - { buffer[offset + labellen]= 0x61; // Heading Code <- CBA - memcpy(&buffer[offset + labellen+1],&inbuff[labellen+1],len-labellen-1); - outlen = len; - } - } - else if (inbuff[labellen]==0x16) //MIM H0=6=Mgmt inhibit msg, H1=1=LIN - { - outlen=labellen+mim_addlen; - if (len packet dropped."); - return; - } - else - { - buffer[offset + labellen]= 0x56; // LIN -> LID ; LID = link inhibit denied - memcpy(&buffer[offset + labellen+1],&inbuff[labellen+1],(len-labellen-1)); //SLC+spare+... - outlen = len; - } - } - else if (inbuff[labellen]==0x17 && (MTPServiceType==MTP3iup)) - { - if(forward_resume) incoming_message(ASP__MTP3__RESUME(NULL_VALUE)); - return; - } - -/* else if (inbuff[labellen]==0x17 && (MTPServiceType==MTP3iup)) //TRM H0=7, H1=1 : TRA - { - outlen=labellen+1; - if (len packet dropped."); - return; - } - else - { - outlen = len; - } - }*/ - else - { log("This management message type is not supported -> packet dropped."); - return; - } - - // send message - log("function processing_MTP3_management_msg sends a msg"); - send_msg(buffer, outlen+offset); -} - -// processing MTP3 test msg -// Signalling link test message handling according to Q.707 (ITU) and T1.111.7-2001 (ANSI) -void MTP3asp__PT_PROVIDER::processing_MTP3_test_msg(unsigned char* inbuff,int len) -{ - int outlen=0; - int labellen; // sio+routinglabel length - int addlen; //Heading Code+length indicator - //unsigned int ni; //network indicator - OCTETSTRING bttc_oct = int2oct(stored_bttc_octet, 1); // additional octet for MTP3bttc - unsigned int offset = 0; - if ( MTPServiceType==MTP3itu || MTPServiceType==MTP3iup) - { - labellen=5; //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - addlen = 2; //HC(1 byte)+length ind(1 byte) see Q.707/5.8 - } - else if ( MTPServiceType==MTP3ansi ) - { - labellen=8; //ANSI: sio(1byte) +routing label(7byte) see T1.111.4 - addlen = 2; //HC(1byte) +(length ind+SLC(1byte)) see T1.111.7-2001/5 - } - else if (MTPServiceType==MTP3ttc) - { - /* if (mtp3_ni == 0) { - debuglog("processing_MTP3_test_msg/TTC (Japanese) international"); - labellen=5; //TTC (Japanese) international - addlen=2; - } else { - */ - labellen=6; // previously 7 - // TTC national [ 56bits=sio(1byte)+routing label ] - // r.label= dpc(2bytes)+opc(2bytes)+sls(4bit)+12bits (?) - addlen=2; - //} - } - else if (MTPServiceType==MTP3mpt) - { - if (mtp3_ni == 2) - { labellen=8; //MPT national - addlen=2; - } - else - { labellen=5; // MPT international - addlen=2; - } - } - else if (MTPServiceType==MTP3bttc) - { - labellen=7; - addlen=2; - offset = 1; - } - else - { log("incorrect MTPServiceType - programming error-> packet dropped"); - return; - } - - if (MTPServiceType==MTP3bttc) - { - buffer[0]=*((const unsigned char*)bttc_oct); //additional stored octet in front - buffer[1]=inbuff[0]; //SIO - if (!ChangePointCodes(&buffer[2],&inbuff[1],len)) - { - log("incorrect incoming test message -> packet dropped."); - return; - } - } - else - { - buffer[0]=inbuff[0]; //SIO - if (!ChangePointCodes(&buffer[1],&inbuff[1],len)) - { - log("incorrect incoming test message -> packet dropped."); - return; - } - } - - // Test message handling: SLTM->SLTA, SRT->SRA, SLTA->TRA, others only logged - debuglog("\n==>Test message handling: msg type:%x\n", inbuff[labellen] ); // temporary - switch( inbuff[labellen] ) - { - case 0x11: //SLTM - log("MTP3/SLTM message received"); - outlen=labellen+addlen; - if (len packet dropped."); - return; - } - else - { buffer[offset + labellen]= 0x21; // SLTA - memcpy(&buffer[offset + labellen+1],&inbuff[labellen+1],(len-labellen-1)); - outlen = len; - } - break; - case 0x21: //SLTA - if(!strncmp((const char *)(inbuff+labellen+addlen),(const char *)ttcn_in_sltm,sizeof_ttcn_in_sltm)) - { - log("MTP3/SLTA message received for SLTM sent by Test Port-> TRA message sent"); - buffer[offset]--; - buffer[offset + labellen]= 0x17; // TRA - outlen = labellen+1; - return; -// if(forward_resume) incoming_message(ASP__MTP3__RESUME(NULL_VALUE)); - } - else - { - log("MTP3/SLTA message received -> packet dropped"); - return; - } - break; - case 0x23: // TTC (Japanese) SRT (Signalling Routing Test signal) - log("MTP3ttc/SRT message received"); - outlen=labellen+addlen; - if (len packet dropped."); - return; - } - else - { buffer[offset + labellen]= 0x84; // TTC (Japanese) SRA - memcpy(&buffer[offset + labellen+1],&inbuff[labellen+1],(len-labellen-1)); - outlen = len; - } - break; - case 0x84: // TTC (Japanese) SRA (Signalling Routing test Ack signal) - log("MTP3ttc/SRA message received -> packet dropped"); - return; - default: - log("This management message type is not supported -> packet dropped "); - return; - } - - // send message - log("function processing_MTP3_test_msg sends a message"); - send_msg( buffer,outlen+offset); -} - -// Point Code Manipulation (Get/Set/Change) -// ------------------------------------------------- -void MTP3asp__PT_PROVIDER::GetPointCodes(unsigned int &sls,unsigned int &opc,unsigned int &dpc, unsigned char* msg) -{ - unsigned int label; - sls=0; opc=0; dpc=0; - unsigned long long int Label; - - switch( MTPServiceType) - { - case MTP3itu: - label= decode_32bLSB_int(msg); - sls = (label>>28)&0xF; //sls = (label&0xF0000000)>>28; - opc = (label>>14)&0x3FFF; //opc = (label&0x0FFFC000)>>14; - dpc = label&0x3FFF; //dpc = (label&0x00003FFF); - debuglog("Function GetPointCodes called for service type MTP3itu"); - break; - case MTP3iup: - label= decode_32bLSB_int(msg); - sls = (label>>28)&0xF; //sls = (label&0xF0000000)>>28; - opc = (label>>14)&0x3FFF; //opc = (label&0x0FFFC000)>>14; - dpc = label&0x3FFF; //dpc = (label&0x00003FFF); - debuglog("Function GetPointCodes called for service type MTP3iup"); - break; - case MTP3ansi: - Label=decode_56bLSB_int(msg); - sls = (Label >> 48) & 0xFF; //sls = (Label&0x00FF000000000000)>>48; - opc = (Label >> 24) & 0xFFFFFF;//opc = (Label&0x0000FFFFFF000000)>>24; - dpc = Label & 0xFFFFFF; //dpc = (Label&0x0000000000FFFFFF); - debuglog("Function GetPointCodes called for service type MTP3ansi"); - break; - case MTP3ttc: - /* - if( mtp3_ni == 0) - { - label= decode_32bLSB_int(msg); - sls = (label>>28)&0xF; //sls = (label&0xF0000000)>>28; - opc = (label>>14)&0x3FFF; //opc = (label&0x0FFFC000)>>14; - dpc = label&0x3FFF; - debuglog("Function GetPointCodes called for service type MTP3ttc/international"); - } else - {*/ - Label=decode_48bLSB_int(msg); //0x010203040506 - sls = (Label>>32)&0xF; // sls = (Label&0x000F00000000)>>32; // only 4 bits!!! - opc = (Label>>16)&0xFFFF;//opc = (Label&0x0000FFFF0000)>>16; - dpc = Label&0xFFFF; //dpc = (Label&0x00000000FFFF); - debuglog("Function GetPointCodes called for service type MTP3ttc/national"); - //} - break; - case MTP3bttc: - Label=decode_48bLSB_int(msg); - sls = (Label>>32)&0xF; // sls = (Label&0x000F00000000)>>32; // only 4 bits!!! - opc = (Label>>16)&0xFFFF;//opc = (Label&0x0000FFFF0000)>>16; - dpc = Label&0xFFFF; //dpc = (Label&0x00000000FFFF); - debuglog("Function GetPointCodes called for service type MTP3bttc/national"); - break; - case MTP3mpt: - if( mtp3_ni == 2) - { - Label=decode_56bLSB_int(msg); - sls = (Label >> 48) & 0xFF; //sls = (Label&0x00FF000000000000)>>48; - opc = (Label >> 24) & 0xFFFFFF;//opc = (Label&0x0000FFFFFF000000)>>24; - dpc = Label & 0xFFFFFF; //dpc = (Label&0x0000000000FFFFFF); - debuglog("Function GetPointCodes called for service type MTP3mpt(nat)"); - } - else - { - label= decode_32bLSB_int(msg); - sls = (label>>28)&0xF; //sls = (label&0xF0000000)>>28; - opc = (label>>14)&0x3FFF; //opc = (label&0x0FFFC000)>>14; - dpc = label&0x3FFF; //dpc = (label&0x00003FFF); - debuglog("Function GetPointCodes called for service type MTP3mpt(int)"); - } - break; - default: - break; - } - debuglog("sls:%u opc:%u, dpc:%u",sls,opc,dpc); -} -//------------ - -void MTP3asp__PT_PROVIDER::GetPointCodesIUP(unsigned int &cic,unsigned int &opc,unsigned int &dpc, unsigned char* msg) -{ - debuglog("Function GetPointCodesIUP called"); - cic=0; opc=0; dpc=0; - unsigned long long int Label; - Label=decode_40bLSB_int(msg); //0x0102030405 - cic = (Label>>28)&0xFFF; //cic = (label&0xFFF0000000)>>28; - opc = (Label>>14)&0x3FFF; //opc = (label&0x000FFFC000)>>14; - dpc = Label&0x3FFF; //dpc = (label&0x0000003FFF); - debuglog("cic:%u opc:%u, dpc:%u",cic,opc,dpc); -} - -void MTP3asp__PT_PROVIDER::SetPointCodes(unsigned int sls,unsigned int opc,unsigned int dpc, unsigned char* msg) -{ - unsigned long long int Sls,Opc,Dpc; - - switch( MTPServiceType) - { - case MTP3itu: - encode_32bLSB_int( msg, ((sls<<28)|(opc<<14)|dpc )); - debuglog("Function SetPointCodes called for service type MTP3itu"); - break; - case MTP3iup: - encode_32bLSB_int( msg, ((sls<<28)|(opc<<14)|dpc )); - debuglog("Function SetPointCodes called for service type MTP3iup"); - break; - case MTP3ansi: - Sls=sls; Opc=opc; Dpc=dpc; - encode_56bLSB_int( msg, ((Sls<<48)|(Opc<<24)|Dpc)); - debuglog("Function SetPointCodes called for service type MTP3ansi"); - break; - case MTP3ttc: - /* if ( mtp3_ni == 0 ){ - encode_32bLSB_int( msg, ((sls<<28)|(opc<<14)|dpc )); - debuglog("Function SetPointCodes called for service type MTP3ttc/international"); - } else { - */ - Sls=sls; Opc=opc; Dpc=dpc; - encode_48bLSB_int( msg, ((Sls<<32)|(Opc<<16)|Dpc)); - debuglog("Function SetPointCodes called for service type MTP3ttc/national"); - //} - break; - case MTP3bttc: - Sls=sls; Opc=opc; Dpc=dpc; - encode_48bLSB_int( msg, ((Sls<<32)|(Opc<<16)|Dpc)); - debuglog("Function SetPointCodes called for service type MTP3bttc/national"); - break; - case MTP3mpt: - if ( mtp3_ni == 2 ) - { Sls=sls; Opc=opc; Dpc=dpc; - encode_56bLSB_int( msg, ((Sls<<48)|(Opc<<24)|Dpc)); - debuglog("Function SetPointCodes called for service type MTP3mpt(nat)"); - } - else - { encode_32bLSB_int( msg, ((sls<<28)|(opc<<14)|dpc )); - debuglog("Function SetPointCodes called for service type MTP3mpt(int)"); - } - break; - default: - break; - } -} -//------------ - -void MTP3asp__PT_PROVIDER::SetPointCodesIUP(unsigned int cic,unsigned int opc,unsigned int dpc, unsigned char* msg) -{ - unsigned long long int Cic,Opc,Dpc; - Cic=cic; Opc=opc; Dpc=dpc; - debuglog("Function SetPointCodesIUP called"); - encode_40bLSB_int( msg, ((Cic<<28)|(Opc<<14)|Dpc )); -} - -//Changes the Point codes: dpc<->opc ie. destination <->orig -// inbuff starts from dpc i.e doesn't contain sio !!!! -int MTP3asp__PT_PROVIDER::ChangePointCodes(unsigned char* outbuff, unsigned char *inbuff, int len) -{ - switch( MTPServiceType) - { - case MTP3itu: - case MTP3iup: - if (len<5) - { warn("MTP3itu:len<5. Too short message!"); return 0; }; - break; - case MTP3ansi: - if (len<9 ) return 0; - break; - case MTP3ttc: - //if ( mtp3_ni == 0 && len<5) - //{ warn("MTP3ttc:len<5. Too short message!"); return 0; } - //else - if (len<6) - { warn("MTP3ttc:len<6. Too short message!"); return 0; } - break; - case MTP3bttc: - if (len<7) - { warn("MTP3bttc:len<7. Too short message!"); return 0; } - break; - case MTP3mpt: - if ( mtp3_ni == 2 && len<8) - { warn("MTP3mpt:len<8. Too short message!"); return 0; } - else if (len<5) - { warn("MTP3mpt:len<5. Too short message!"); return 0; } - break; - default: - warn("Unknown MTPServiceType!!!"); - break; - } - unsigned int sls,opc,dpc; - GetPointCodes(sls,opc,dpc,inbuff); - SetPointCodes(sls,dpc,opc,outbuff); - return 1; -} -//------------ - -int MTP3asp__PT_PROVIDER::Check_PcMatch(unsigned int opc, unsigned int dpc, unsigned char *buff) -{ - unsigned int temp_opc,temp_dpc,temp_sls; - - GetPointCodes(temp_sls,temp_opc,temp_dpc,buff); - if ( (temp_opc == opc) && (temp_dpc == dpc) ) return 1; - return 0; -} -//------------ - - -// ------------------------------------------------- -// M3UA Functions and definitions for test with SEA -// ------------------------------------------------- - -// Structures for M3UA -static unsigned char aspup_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version - 0x00, //reserved - M3UA_MSG_CLS_ASPSM, //Msg class: ASPSM - M3UA_MSG_TYP_ASPSM_ASPUP, //Msg type: ASPUP - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x08 // length ends = 8 octets - // ,PAR_PREFIX_COMMON, //optional Info string tag, in included, then msg - // PAR_INFO_STR //msg length should be +20, that is 28=0x1c - // 0x00,0x0f, // length: "TTCN-3 Executor" is 15 chars - // 'T', 'T', 'C', 'N', - // '-', '3', ' ', 'E', - // 'x', 'e', 'c', 'u', - // 't', 'o', 'r', 0x00 //las octet is padding -}; -const int sizeof_aspup_msg = 8; - -static unsigned char aspupack_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version - 0x00, //reserved - M3UA_MSG_CLS_ASPSM, //Msg class: ASPSM - M3UA_MSG_TYP_ASPSM_ASPUPAck, //Msg type: ASPUP - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x08 // length ends = 8 octets -}; -const int sizeof_aspupack_msg = 8; - -static unsigned char aspac_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_ASPTM, //Msg class - M3UA_MSG_TYP_ASPTM_ASPAC, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x08 // length ends = 8 octets -}; -const int sizeof_aspac_msg = 8; - -// ASP Active Acknowledge msg: -static unsigned char aspac_ack_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_ASPTM, //Msg class - M3UA_MSG_TYP_ASPTM_ASPACAck, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x08 // length ends = 8 octets -}; -const int sizeof_aspac_ack_msg = 8; - -static unsigned char aspia_ack_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_ASPTM, //Msg class - M3UA_MSG_TYP_ASPTM_ASPIAAck, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x08 // length ends = 8 octets -}; -const int sizeof_aspia_ack_msg = 8; - -// ASP DOWN Acknowledge msg: -static unsigned char aspdn_ack_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_ASPSM, //Msg class - M3UA_MSG_TYP_ASPSM_ASPDNAck, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x08 // length ends = 8 octets -}; -const int sizeof_aspdn_ack_msg = 8; - -//ASP Destination Available msg: -static unsigned char dava_1apc_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - //or updated doc 2/1056-FCPW 101 86/P-1 - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_SSNM, //Msg class - M3UA_MSG_TYP_SSNM_DAVA, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x10, // length ends, 16 octets - //Affected point code - PAR_PREFIX_COMMON, - PAR_AFFECTED_PC, - 0x00, //par length begins (2 octets) - 0x08, //length ends, 8 octets - 0x00, // point code placeholder begins - 0x00, // - 0x00, // - 0x00 // point code placeholder ends -}; -const int sizeof_dava_1apc_msg = 16; - -static unsigned char duna_1apc_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_SSNM, //Msg class - M3UA_MSG_TYP_SSNM_DUNA, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x10, // length ends, 16 octets - //Affected point code - PAR_PREFIX_COMMON, - PAR_AFFECTED_PC, - 0x00, //par length begins (2 octets) - 0x08, //length ends, 8 octets - 0x00, // point code placeholder begins - 0x00, // - 0x00, // - 0x00 // point code placeholder ends -}; -const int sizeof_duna_1apc_msg = 16; - -static unsigned char error_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_MGMT, //Msg class - M3UA_MSG_TYP_MGMT_ERR, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x18, // length ends, 16+8 octets - // Error code field: - PAR_PREFIX_COMMON, - PAR_ERROR_CODE, - 0x00, //par length begins (2 octets) - 0x08, //length ends, 8 octets - 0x00, // error code placeholder begins (M3UA_MSG_OFFS+4) - 0x00, // - 0x00, // - 0x00, // error code placeholder ends - // additional field: - 0x00, // M3UA_MSG_OFFS+8 - 0x00, // Routing context or Network Appearanance or APC or DI = error_code_id - 0x00, // par length begins (2 octets) - 0x08, // length ends, 8 octets - 0x00, // value placeholder begins M3UA_MSG_OFFS+12 - 0x00, // - 0x00, // - 0x00 // value place holder ends -}; -const int sizeof_error_msg = 24; - -void MTP3asp__PT_PROVIDER::M3UA_user_unmap(const char *system_port) -{ - MTP3_close_connection(); - dynamicConnection = FALSE; -} -//------------ - -void MTP3asp__PT_PROVIDER::M3UA_user_map(const char *system_port) -{ - M3UAState = AssocDown; - Check_TestPort_Variables(); - if(dynamicConnection) - { - connectionUp = FALSE; - } - else - { - MTP3_open_channel(TRUE); - M3UA_user_connect(); - } -} -//------------ - -void MTP3asp__PT_PROVIDER::M3UA_user_connect() -{ - M3UAState = AssocEstabl; - // Sending out an ASPUP message - log("Message ASPUP will be sent"); - send_msg(aspup_msg, sizeof_aspup_msg); - // NOTE: the ASPUPAck will be handled by M3UA_interpreter, which - // also will take care of sending ASPAC upon receiving the ASPUPAck -} -//------------ - -// M3UA_interpreter -void MTP3asp__PT_PROVIDER::M3UA_interpreter(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con) -{ - if ((length==0) || (inbuffer==NULL)) - { warn("0 byte long message received -> packet dropped."); - return; - } - - if (length==1) - { - log("1 byte long internal SEA message received -> packet dropped."); - return; - } - - if ( !strcmp((const char*)inbuffer,"start") ) - { log("start message received from SEA"); - return; - } - else if (!strcmp((const char*)inbuffer,"stop")) - { log("stop message received from SEA"); - return; - } - - // writing out the contents of the buffer - OCTETSTRING buff(length,inbuffer); - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("incoming buffer: "); - buff.log(); - TTCN_Logger::end_event(); - - // version checking - if ( inbuffer[M3UA_VER_OFFS] != M3UA_version ) - { warn("Incompatible M3UA protocol version in header -> packet dropped"); - return; - } - - //length checking - unsigned int indicated_length = decode_32b_int(inbuffer + M3UA_LGT_OFFS ); - if ( indicated_length != (unsigned)length) - warn("Length in common header (%d) mismatches received buffer length (%d)," - "Assuming that it is because of the omission of final parameter padding" - "in indicated length",indicated_length, length); - - // checking MSG class - int unprocessed_chars = 0; - switch (inbuffer[M3UA_CLS_OFFS]) - { - case M3UA_MSG_CLS_MGMT: - unprocessed_chars = processing_M3UA_MGMT_msg(inbuffer, length); - break; - case M3UA_MSG_CLS_TRNSFM : - unprocessed_chars = processing_M3UA_Transfer_msg(inbuffer, length); - break; - case M3UA_MSG_CLS_SSNM : - unprocessed_chars = processing_M3UA_SSNM_msg(inbuffer, length); - break; - case M3UA_MSG_CLS_ASPSM : - unprocessed_chars = processing_M3UA_ASPSM_msg(inbuffer, length); - break; - case M3UA_MSG_CLS_ASPTM : - unprocessed_chars = processing_M3UA_ASPTM_msg(inbuffer, length); - break; - case M3UA_MSG_CLS_RKM : - unprocessed_chars = processing_M3UA_RKM_msg(inbuffer, length); - break; - default: - unprocessed_chars = processing_M3UA_unsupported_msg_class(inbuffer, length); - break; - } - debuglog("%d chars remained unprocessed (might be due to padding)", unprocessed_chars); -} -//------------ - -//processing M3UA MGMT msg -int MTP3asp__PT_PROVIDER::processing_M3UA_MGMT_msg(unsigned char* inbuffer,int length) -{ - debuglog("Entering function:processing_MGMT_msg"); - int offset = M3UA_MSG_OFFS; //pointer for processing - - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): {", get_name()); - TTCN_Logger::log_event("decoded msg class: Mgmt, "); - switch (inbuffer[M3UA_TYP_OFFS])//msg type - { - case M3UA_MSG_TYP_MGMT_ERR: - TTCN_Logger::log_event("type: ERROR-> ignored"); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - break; - case M3UA_MSG_TYP_MGMT_NTFY: - TTCN_Logger::log_event("type: NOTIFY -> ignored"); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - break; - default: - send_M3UA_error_msg( PAR_ERRC_UNSMT, inbuffer[M3UA_TYP_OFFS]); - TTCN_Logger::log_event("Unsupported M3UA msg type %x of class MGMT -> packet dropped.", inbuffer[M3UA_TYP_OFFS]); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - break; - } - return length - offset; -} -//------------ - -//processing M3UA SSNM msg -int MTP3asp__PT_PROVIDER::processing_M3UA_SSNM_msg(unsigned char* inbuffer,int length) -{ - debuglog("Entering function:processing_SSNM_msg"); - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("MTP3 Test Port (%s): {", get_name()); - TTCN_Logger::log_event("decoded msg class: SSNM, "); - int offset = M3UA_MSG_OFFS; //pointer for processing - - switch (inbuffer[M3UA_TYP_OFFS]) - { - case M3UA_MSG_TYP_SSNM_DAUD: - while (offset <= length-8 ) //processing potential params - { - switch (inbuffer[offset++]) //1st octet of tag - { - case PAR_PREFIX_COMMON: - TTCN_Logger::log_event (" DAUD: COMMON parameter "); - switch (inbuffer[offset++]) //2nd octet of COMMON tag - { - case PAR_ROUTING_CTX: - TTCN_Logger::log_event ("Routing Context (unsupported par) -> skipped), "); - skip_par_after_tag(inbuffer, offset); - break; - case PAR_INFO_STR: - TTCN_Logger::log_event ("Info String (unsupported par) -> skipped), "); - skip_par_after_tag(inbuffer, offset); - break; - case PAR_AFFECTED_PC: - TTCN_Logger::log_event ("Affected Point Code -> will send DUNA/DAVA, "); - TTCN_Logger::log_event("will ignore remainder parameters after APC}"); - TTCN_Logger::end_event(); - Send_DAVA_DUNA_to_APCinDAUD(Tester_Pc, inbuffer, offset); - return length-offset; - default: - TTCN_Logger::log_event ("invalid COMMON param tag:0x%02x%02x-> skipped", PAR_PREFIX_COMMON, inbuffer[offset-1]); - send_M3UA_error_msg( PAR_ERRC_PARFE, inbuffer[offset-1]); - skip_par_after_tag(inbuffer, offset); - break; - } - break; - case PAR_PREFIX_M3UA: - TTCN_Logger::log_event ("DAUD: M3UA parameter: "); - switch (inbuffer[offset++]) //2nd octet of M3UA tag - { - case PAR_NETW_APP: - TTCN_Logger::log_event ("Network Appearance (unsupported par) -> skipped), "); - skip_par_after_tag(inbuffer, offset); - break; - default: - TTCN_Logger::log_event ("invalid M3UA param tag:0x%02x%02x-> skipped", - PAR_PREFIX_M3UA, inbuffer[offset-1]); - send_M3UA_error_msg( PAR_ERRC_PARFE, inbuffer[offset-1]); - skip_par_after_tag(inbuffer, offset); - } - break; - default: //1st octet of tag - TTCN_Logger::log_event ("invalid 1st octet param tag:0x%02x in DATA (packet dropped)",inbuffer[offset-1]); - close_log_event(); - return length -offset; - break; - } - } - break; - case M3UA_MSG_TYP_SSNM_DAVA: // Destination Available // Notification to the user part ????? - TTCN_Logger::log_event("type: SSNM_DAVA -> ignored"); - close_log_event(); - break; - case M3UA_MSG_TYP_SSNM_DUNA: // Destination Unavailable // Notification to the user part ????? - TTCN_Logger::log_event("type: SSNM_DUNA -> ignored"); - close_log_event(); - break; - case M3UA_MSG_TYP_SSNM_SCON: // Signalling Congestion // Notification to the user part ????? - TTCN_Logger::log_event("type: SSNM_SCON -> ignored"); - close_log_event(); - break; - case M3UA_MSG_TYP_SSNM_DUPU: //Destinationn User Part Unavailable // Notification to the user part ????? - TTCN_Logger::log_event("type: SSNM_DUPU -> ignored"); - close_log_event(); - break; - case M3UA_MSG_TYP_SSNM_DRST: //Destination Restricted // Notification to the user part ????? - TTCN_Logger::log_event("type: SSNM_DRST -> ignored"); - close_log_event(); - break; - default: //msg type - send_M3UA_error_msg( PAR_ERRC_UNSMT, inbuffer[M3UA_TYP_OFFS]); - TTCN_Logger::log_event("Unsupported M3UA msg type -> packet dropped."); - close_log_event(); - break; - } - return length - offset; -} -//------------ - -//processing M3UA ASPSM msg -int MTP3asp__PT_PROVIDER::processing_M3UA_ASPSM_msg(unsigned char* inbuffer,int length) -{ - debuglog("Entering function:processing_ASPSM_msg"); - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("MTP3 Test Port (%s): {", get_name()); - TTCN_Logger::log_event("decoded msg class: ASPSM, "); - - int offset = M3UA_MSG_OFFS; //pointer for processing - switch (inbuffer[M3UA_TYP_OFFS]) - { - case M3UA_MSG_TYP_ASPSM_ASPUP: - TTCN_Logger::log_event("type: ASPSM_ASPUP -> ASPUPAck will be sent"); - close_log_event(); - send_msg(aspupack_msg, sizeof_aspupack_msg); - break; - case M3UA_MSG_TYP_ASPSM_ASPDN: - TTCN_Logger::log_event("type: ASPSM_ASPDN -> ASPDNAck will be sent"); - close_log_event(); - send_msg(aspdn_ack_msg, sizeof_aspdn_ack_msg); - break; - case M3UA_MSG_TYP_ASPSM_BEAT: - TTCN_Logger::log_event("type: ASPSM_BEAT -> ASPSM_BEATAck will be sent"); - close_log_event(); - //Sending back the packet as acknowledge: - inbuffer[M3UA_TYP_OFFS]= M3UA_MSG_TYP_ASPSM_BEATAck; - send_msg(inbuffer, length); - break; - case M3UA_MSG_TYP_ASPSM_ASPUPAck: - TTCN_Logger::log_event("type: ASPSM_ASPUPAck -> ASPAC will be sent"); - M3UAState = AssocInac; - TTCN_Logger::log_event(" M3UAState's been changed to AssocInac"); - close_log_event(); - send_msg(aspac_msg, sizeof_aspac_msg ); - break; - case M3UA_MSG_TYP_ASPSM_ASPDNAck: - M3UAState = AssocDown; - TTCN_Logger::log_event(" M3UAState's been changed to AssocDown"); - TTCN_Logger::log_event("type: ASPSM_ASPDNAck -> nothing will be sent"); - close_log_event(); - break; - case M3UA_MSG_TYP_ASPSM_BEATAck: - TTCN_Logger::log_event("type: ASPSM_BEATAck -> nothing will be sent"); - close_log_event(); - break; - default: - TTCN_Logger::log_event("Unsupported M3UA msg type %x of class ASPSM-> packet dropped.", (unsigned char)(inbuffer[M3UA_TYP_OFFS])); - close_log_event(); - send_M3UA_error_msg( PAR_ERRC_UNSMT, inbuffer[M3UA_TYP_OFFS]); - break; - } - return length - offset; -} -//------------ - -//processing M3UA ASPTM msg -int MTP3asp__PT_PROVIDER::processing_M3UA_ASPTM_msg(unsigned char* inbuffer,int length) -{ - debuglog("Entering function:processing_ASPTM_msg"); - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("MTP3 Test Port (%s): {", get_name()); - TTCN_Logger::log_event("decoded msg class: ASPTM, "); - - int offset = M3UA_MSG_OFFS; //pointer for processing - switch (inbuffer[M3UA_TYP_OFFS]) - { - case M3UA_MSG_TYP_ASPTM_ASPAC: //ASP Active - M3UAState = AssocActive; - TTCN_Logger::log_event("type: ASPTM_ASPAC -> ASPACAck will be sent"); - close_log_event(); - send_msg(aspac_ack_msg, sizeof_aspac_ack_msg); - break; - case M3UA_MSG_TYP_ASPTM_ASPIA: //ASP InActive - TTCN_Logger::log_event("type: ASPTM_ASPIA -> ASPIAAck will be sent"); - close_log_event(); - send_msg(aspia_ack_msg, sizeof_aspia_ack_msg); - break; - case M3UA_MSG_TYP_ASPTM_ASPACAck: - M3UAState = AssocActive; - TTCN_Logger::log_event("type: ASPTM_ASPACAck -> nothing will be sent"); - TTCN_Logger::log_event("M3UAState's been changed to AssocActive."); - close_log_event(); - break; - case M3UA_MSG_TYP_ASPTM_ASPIAAck: - TTCN_Logger::log_event("type: ASPTM_ASPIAAck -> nothing will be sent"); - close_log_event(); - break; - default: - TTCN_Logger::log_event("Unsupported M3UA msg type %x of class ASPSM-> packet dropped.", (unsigned char)(inbuffer[M3UA_TYP_OFFS])); - close_log_event(); - send_M3UA_error_msg( PAR_ERRC_UNSMT, inbuffer[M3UA_TYP_OFFS]); - break; - } - return length - offset; -} -//------------ - -//processing M3UA RKM msg -int MTP3asp__PT_PROVIDER::processing_M3UA_RKM_msg(unsigned char* inbuffer,int length) -{ - debuglog("Entering function:processing_RKM_msg"); - int offset = M3UA_MSG_OFFS; //pointer for processing - warn("Unsupported M3UA msg class M3UA_RKM -> packet dropped."); - return length - offset; -} -//------------ - -//processing M3UA unsupported msg class -int MTP3asp__PT_PROVIDER::processing_M3UA_unsupported_msg_class(unsigned char* inbuffer,int length) -{ - warn("Unsupported M3UA msg class -> packet dropped."); - send_M3UA_error_msg( PAR_ERRC_UNSMC, inbuffer[M3UA_CLS_OFFS] ); - int offset = M3UA_MSG_OFFS; //pointer for processing - return length - offset; -} -//------------ - -// processing_M3UA_Transfer_msg - called if the msg class is "Transfer" i.e M3UA_MSG_CLS_TRNSFM: -int MTP3asp__PT_PROVIDER::processing_M3UA_Transfer_msg(unsigned char* inbuffer,int length) -{ - debuglog("Entering function:processing_M3UA_Transfer_msg"); - int offset = M3UA_MSG_OFFS; //pointer for processing - unsigned int recv_opc, recv_dpc,recv_si, recv_ni, recv_mp,recv_sls =0; - int param_length = 0; - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): {", get_name()); - TTCN_Logger::log_event("decoded msg class: DataTrnsf, "); - - switch (inbuffer[M3UA_TYP_OFFS]) //msg type - { - case M3UA_MSG_TYP_TRSNFM_DATA: - TTCN_Logger::log_event("msg type DATA, "); - while (offset <= length-8) //processing potential params - { - switch (inbuffer[offset++]) //1st octet of tag. Offset already incremented after the 'case' ! - { - case PAR_PREFIX_COMMON: - TTCN_Logger::log_event (" DATA: COMMON parameter, "); - switch (inbuffer[offset++]) //2nd octet of tag - { - case PAR_ROUTING_CTX: - TTCN_Logger::log_event ("Routing Context (unsupported par) -> skipped), "); - // Send back an error msg - skip_par_after_tag(inbuffer, offset); - break; - case PAR_CORREL_ID: - TTCN_Logger::log_event ("Correlation ID (unsupported par) -> skipped), "); - skip_par_after_tag(inbuffer, offset); - break; - default: - TTCN_Logger::log_event ("invalid COMMON param tag:0x%02x%02x -> skipped", PAR_PREFIX_COMMON, inbuffer[offset-1]); - skip_par_after_tag(inbuffer, offset); - break; - } - case PAR_PREFIX_M3UA: - TTCN_Logger::log_event ("DATA: M3UA parameter: "); - switch (inbuffer[offset++]) //2nd octet of M3UA tag - { - case PAR_PROT_DATA: - //--------------------------------------------- - TTCN_Logger::log_event ("Protocol Data"); - // retrieving length - param_length = decode_16b_int(inbuffer+offset); offset+=2; - TTCN_Logger::log_event(", DATA: Length of Protocol Data parameter is %d",param_length); - // retrieving M3UA protocol data paremeter opc, dpc, si, ni, mp, - // sls - recv_opc = decode_32b_int(inbuffer+offset); offset +=4; - recv_dpc = decode_32b_int(inbuffer+offset); offset +=4; - recv_si = (unsigned int)(inbuffer[offset++]); - recv_ni = (unsigned int)(inbuffer[offset++]); - recv_mp = (unsigned int)(inbuffer[offset++]); - recv_sls = (unsigned int)(inbuffer[offset++]); - TTCN_Logger::log_event(", DATA: decoded Protocol Data parameter:"); - // filling up TTCN structure - if ((Loop==MTP3_ON) || - (!Filter) || - (Filter && - (recv_opc == (unsigned)Sut_Pc) && (recv_dpc == (unsigned)Tester_Pc) && - (recv_ni == (unsigned)mtp3_ni) - )) - { - ASP__MTP3__TRANSFERind recv_msg; - MTP3__Field__sio recv_sio; - recv_sio.ni()= int2bit(recv_ni,2); - recv_sio.prio()= int2bit(recv_mp,2); - recv_sio.si()= int2bit(recv_si,4); - recv_msg.sio() = recv_sio; - recv_msg.sls() = recv_sls; - recv_msg.opc()= recv_opc; - recv_msg.dpc() = recv_dpc;; - recv_msg.data() = OCTETSTRING(param_length-16, // 16 octet paramheader + 5 routing label - &inbuffer[offset]); - recv_msg.log(); - close_log_event(); - incoming_message ( recv_msg ); - offset += param_length-16; - return length - offset; - } - else - { - close_log_event(); - log("Either the received M3UA(OPC, DPC, SI) fields, or the embedded MTP3 rooting label (OPC, DPC) not matched with the filter setting -> packet dropped."); - return length - offset; - } - break; - default: - TTCN_Logger::log_event ("invalid M3UA param tag:0x%02x%02x-> skipped", PAR_PREFIX_M3UA, inbuffer[offset-1]); - skip_par_after_tag(inbuffer, offset); - } - break; - default: - TTCN_Logger::log_event ("invalid 1st octet param tag:0x%02x in DATA (packet dropped)",inbuffer[offset-1]); - close_log_event(); - return length -offset; - break; - } - }// Checking parameter tag (offset packet dropped", - (unsigned int)(inbuffer[M3UA_TYP_OFFS])); - close_log_event(); - send_M3UA_error_msg( PAR_ERRC_UNSMT, inbuffer[M3UA_TYP_OFFS]); - break; - } - - return length -offset; -} - -// Set M3UA SingleAPC - Stores field Single Affected Point Code -void MTP3asp__PT_PROVIDER::Set_M3UA_SingleAPC(unsigned int pc, unsigned char* apc_par) -{ - //setting par type to APC - apc_par[0] = PAR_PREFIX_COMMON; - apc_par[1] = PAR_AFFECTED_PC; - //setting the length to 4+4 = 8 - apc_par[2] = 0x00; - apc_par[3] = 0x08; - //setting the mask - apc_par[4] = 0x00; - //setting the pc - encode_24b_int(apc_par+5,pc); -} - -// Send DAVA DUNA to APCinDAUD -void MTP3asp__PT_PROVIDER::Send_DAVA_DUNA_to_APCinDAUD(unsigned int dava_sep, unsigned char* inbuffer, int & offset) -{ - unsigned int length = decode_16b_int(inbuffer+offset); - offset +=2; - unsigned int current_pc; - - //checking the length - if ((length < 8) || (length%4)) - { warn("Invalid length in APC parameter -> not processed"); - return; - } - - for (unsigned int i = 4 ; i < length; i += 4) - { - if (inbuffer[offset++] == 0x00) // mask===>single pc - { - current_pc = decode_24b_int(inbuffer+offset); - offset +=3; - if (dava_sep == current_pc) //dava - { Set_M3UA_SingleAPC(dava_sep, dava_1apc_msg+M3UA_MSG_OFFS); - log("DAVA will be sent for pc=%d", dava_sep); - send_msg(dava_1apc_msg, sizeof_dava_1apc_msg); - } - else //duna - { Set_M3UA_SingleAPC(current_pc, duna_1apc_msg+M3UA_MSG_OFFS); - log("DUNA will be sent for pc=%d", current_pc); - send_msg(duna_1apc_msg, sizeof_duna_1apc_msg); - } - } - else //masked pc - { warn("Unsupported masking (mask=0x%02x) for PC=%d in APC parameter -> ignored", - inbuffer[offset-1], current_pc); - } - } - return; -} - -// send M3UA error msg -// send an eror msg with error_code. Additional parameter matches to the error code: -void MTP3asp__PT_PROVIDER::send_M3UA_error_msg(unsigned int error_code, unsigned int add_par ) -{ - encode_16b_int( error_msg+M3UA_MSG_OFFS+4, error_code); - encode_16b_int( error_msg+M3UA_MSG_OFFS+8, add_par); - send_msg(error_msg, sizeof_error_msg ); -}; - -// Coder functions for M3UA: int -> unsigned char array -//------------------------------------------------------ -// Result:Less significant byte in highest address -// Most Significant Byte first (in lowest address) = MSB = Big Endian = Network Byte Order -void MTP3asp__PT_PROVIDER::encode_32b_int(unsigned char *to, unsigned int from) -{ - to[3] = from & 0xFF; - from >>= 8; - to[2] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[0] = from & 0xFF; -} -//------------ - -unsigned int MTP3asp__PT_PROVIDER::decode_32b_int(const unsigned char *from) -{ - return from[3] | (from[2] << 8) | (from[1] << 16) | (from[0] << 24); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_24b_int(unsigned char *to, unsigned int from) -{ - to[2] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[0] = from & 0xFF; -} -//------------ - -unsigned int MTP3asp__PT_PROVIDER::decode_24b_int(const unsigned char *from) -{ - return from[2] | (from[1] << 8) | (from[0] << 16); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_16b_int(unsigned char *to, int from) -{ - to[1] = from & 0xFF; - from >>= 8; - to[0] = from & 0xFF; -} -//------------ - -unsigned int MTP3asp__PT_PROVIDER::decode_16b_int(const unsigned char *from) -{ - return from[1] | (from[0] << 8); -} -//------------ - -//skip par after tag -void MTP3asp__PT_PROVIDER::skip_par_after_tag(unsigned char* inbuffer, int &offset) -{ - offset += decode_16b_int(inbuffer+offset)-2; //the length contains - //the param hdr. itself - if (offset%4) offset += 4-(offset%4); //skipping padding -} -//------------ -#endif - - - -#ifdef TARGET_TEST -// -------------------------- -// Functions for Target testing -// -------------------------- -// In case of target this function handles the received message -void MTP3asp__PT_PROVIDER::message_incoming(const unsigned char* msg, int messageLength, int) -{ - OCTETSTRING rcvData = OCTETSTRING(messageLength, msg); - - int msgType = oct2int(substr(rcvData,0,1)); - switch (msgType) - { - case 0: //TRANSFERind message received - if(Tcp_is_up) //Registration was already performed - { - ASP__MTP3__TRANSFERind recv_msg; - MTP3__Field__sio recv_sio; - BITSTRING sio_bit = oct2bit(substr(rcvData,5,1)); - recv_sio.ni()= substr(sio_bit,0,2); - recv_sio.prio()= substr(sio_bit,2,2); - recv_sio.si()= substr(sio_bit,4,4); - recv_msg.sio() = recv_sio; - recv_msg.opc() = oct2int(substr(rcvData,6,4)); - recv_msg.dpc() = oct2int(substr(rcvData,10,4)); - recv_msg.sls() = oct2int(substr(rcvData,14,1)); - recv_msg.data() = substr(rcvData,15,rcvData.lengthof()-15); - if (Tcp_is_up == 1) //No unregistration ongoing - incoming_message(recv_msg); - else //Unregistration ongoing - log("Received ASP_MTP3_TRANSFERind is ignored since unregistration is started."); - } - else - error("Message was received before successful registration in M3UA server."); - break; - - case 4: //Status message received - { - int status = oct2int(substr(rcvData,5,1)); - if(Tcp_is_up == 2) // Unregistration ongoing - { - const char * rcvDat = oct2str(rcvData); - log("Message \"%s\" received. Status = %i", rcvDat, status); - if (status == 2) - { - log("Unregistration performed."); - Tcp_is_up = 0; - } - else if (status == 3) - error("Unsuccessful unregistration."); - else if (status == 5) { - if(forward_status) { - incoming_message(ASP__MTP3__STATUS(NULL_VALUE)); - } - else { - warn("Invalid STATUS message received from M3UA server with status code=%d.", status); - } - } - } - else if(Tcp_is_up == 1) // Active state - { - if (status == 5) { - if(forward_status) { - incoming_message(ASP__MTP3__STATUS(NULL_VALUE)); - } - } - else { - warn("Invalid STATUS message received from M3UA server with status code=%d.", status); - } - } - else // Registration ongoing - { - const char * rcvDat = oct2str(rcvData); - log("Message \"%s\" received. Status = %i", rcvDat, status); - if (status == 0) - { - log("Registration performed."); - Tcp_is_up = 1; - } - else { - error("Unsuccessful registration."); - } - } - } - break; - case 5: - { - if(forward_pause) incoming_message(ASP__MTP3__PAUSE(NULL_VALUE)); - } - break; - case 6: - { - if(forward_resume) incoming_message(ASP__MTP3__RESUME(NULL_VALUE)); - } - break; - - - default: //Unexpected message received - warn("Invalid message received from M3UA server."); - } -} - -void MTP3asp__PT_PROVIDER::Check_Target_TestPort_Variables() -{ - if (Sut_Pc==-1) error("Parameter SUT_Pc is not set."); - if (Tester_Pc==-1) error("Parameter TESTER_Pc is not set."); - if (!Ni_is_set) error("Parameter NI is not set."); - if (M3UA_version==0) error("Parameter M3UA_version cannot be set to 0 in TargetM3UA mode."); - -//packet header - header_descr = new PacketHeaderDescr( 1, 4, PacketHeaderDescr::Header_MSB); -} - -void MTP3asp__PT_PROVIDER::Check_Target_TestPort_Variables_STC() -{ - if( destinationname == NULL) error("Parameter DestinationName is not set in TargetSTC mode."); - - header_descr = new PacketHeaderDescr( 1, 4, PacketHeaderDescr::Header_MSB); -} - -void MTP3asp__PT_PROVIDER::Target_user_map(const char *system_port) -{ - Tcp_is_up = 0; - Check_Target_TestPort_Variables(); - map_user(); - - OCTETSTRING tcpData = int2oct(2,1); //Message type - if( destinationname == NULL) - tcpData = tcpData + int2oct(char2oct(system_port).lengthof()+15,4); //Length - else - tcpData = tcpData + int2oct(char2oct(destinationname).lengthof()+15,4); - tcpData = tcpData + int2oct(mtp3_ni,1); - tcpData = tcpData + int2oct(Sut_Pc,4); - tcpData = tcpData + int2oct(Tester_Pc,4); - tcpData = tcpData + int2oct(M3UA_version,1); - if( destinationname == NULL) - tcpData = tcpData + char2oct(system_port); - else - tcpData = tcpData + char2oct(destinationname); - - send_outgoing((const unsigned char*)tcpData,tcpData.lengthof()); - - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - TTCN_Logger::log_event_str("Registration message sent: "); - tcpData.log(); - TTCN_Logger::end_event(); - - int fd = get_socket_fd(); - pollfd pollFd = { fd, POLLIN, 0 }; - int nEvents = poll(&pollFd, 1, 3000 /* ms */); - if (nEvents == 0) - error("No response received for REGISTER message. Exiting after timeout."); - if (nEvents < 0 || (pollFd.revents & (POLLIN | POLLHUP)) == 0) - error("No response received for REGISTER message. Exiting after error (%d)", - (nEvents < 0) ? errno : 0); - Handle_Fd_Event(fd, TRUE, FALSE, FALSE); -} - -void MTP3asp__PT_PROVIDER::TargetSTC_user_map(const char *system_port) -{ - Tcp_is_up = 0; - Check_Target_TestPort_Variables_STC(); - map_user(); - - OCTETSTRING tcpData = int2oct(2,1); //Message type - tcpData = tcpData + int2oct(char2oct(destinationname).lengthof()+15,4); - tcpData = tcpData + int2oct(0,1); - tcpData = tcpData + int2oct(0,4); - tcpData = tcpData + int2oct(0,4); - tcpData = tcpData + int2oct(0,1); - tcpData = tcpData + char2oct(destinationname); - - send_outgoing((const unsigned char*)tcpData,tcpData.lengthof()); - - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - TTCN_Logger::log_event_str("Registration message sent: "); - tcpData.log(); - TTCN_Logger::end_event(); - - int fd = get_socket_fd(); - pollfd pollFd = { fd, POLLIN, 0 }; - int nEvents = poll(&pollFd, 1, 3000 /* ms */); - if (nEvents == 0) - error("No response received for REGISTER message. Exiting after timeout."); - if (nEvents < 0 || (pollFd.revents & (POLLIN | POLLHUP)) == 0) - error("No response received for REGISTER message. Exiting after error (%d)", - (nEvents < 0) ? errno : 0); - Handle_Fd_Event(fd, TRUE, FALSE, FALSE); -} - -void MTP3asp__PT_PROVIDER::Target_user_unmap(const char *system_port) -{ - OCTETSTRING tcpData = int2oct(3,1); //Message type - tcpData = tcpData + int2oct(6,4); //Length - tcpData = tcpData + int2oct(0,1); - send_outgoing((const unsigned char*)tcpData,tcpData.lengthof()); - - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - TTCN_Logger::log_event_str("Unregistration message sent: "); - tcpData.log(); - TTCN_Logger::end_event(); - - Tcp_is_up = 2; //Unregistration ongoing - - while (Tcp_is_up == 2) - { - int fd = get_socket_fd(); - pollfd pollFd = { fd, POLLIN, 0 }; - int nEvents = poll(&pollFd, 1, 3000 /* ms */); - if (nEvents == 0) - error("No response received for UNREGISTER message. Exiting after timeout."); - if (nEvents < 0 || (pollFd.revents & (POLLIN | POLLHUP)) == 0) - error("No response received for UNREGISTER message. Exiting after error (%d)", - (nEvents < 0) ? errno : 0); - Handle_Fd_Event(fd, TRUE, FALSE, FALSE); - } - unmap_user(); -} -#endif -} diff --git a/MTP3asp_CNL113337/demo/MTP3asp_PT.hh b/MTP3asp_CNL113337/demo/MTP3asp_PT.hh deleted file mode 100644 index 340f24ffa..000000000 --- a/MTP3asp_CNL113337/demo/MTP3asp_PT.hh +++ /dev/null @@ -1,249 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// // -// Copyright Test Competence Center (TCC) ETH 2009 // -// // -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied // -// // -/////////////////////////////////////////////////////////////////////////////// -// -// File: MTP3asp_PT.hh -// Description: Implementation of port MTP3asp_PT -// This test port is written to connect ttcn to SEA -// according to specification ITU-T SS7 MTP3, ANSI, TCC, MPT, IETF, -// Reference: ITU-T Recommendation Q.704, RFC3332 -// Rev: R11A01 -// Prodnr: CNL 113 337 -// Updated: 2009-04-03 -// Contact: http://ttcn.ericsson.se - - -#ifndef MTP3asp_PT_HH -#define MTP3asp_PT_HH - -#include - -#ifdef TARGET_TEST -#include "Abstract_Socket.hh" -#endif - -#ifndef TARGET_TEST -#include "mphclib.h" -#endif - - -#define MAXSIZE 1532 //+32 needed for M3UA -#define MTP3_ON 1 -#define MTP3_OFF 0 -namespace MTP3asp__Types { - class ASP__MTP3__TRANSFERind; - class ASP__MTP3__PAUSE; - class ASP__MTP3__RESUME; - class ASP__MTP3__STATUS; - class ASP__MTP3__TRANSFERreq; -} -namespace MTP3asp__PortType { - -class MTP3asp__PT_PROVIDER : public PORT -#ifdef TARGET_TEST - , public Abstract_Socket -#endif - { -protected: - // pointer to member: user_map/unmap methods - typedef void (MTP3asp__PT_PROVIDER::*usermap_t)(const char *system_port); - // pointer to member: user_connect methods - typedef void (MTP3asp__PT_PROVIDER::*userconnect_t)(); - // pointer to member: interpreter methods -#ifndef TARGET_TEST - typedef void (MTP3asp__PT_PROVIDER::*interpreter_t)(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con); - - void M3UA_interpreter(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con); - void M3UA_user_map(const char *system_port); - void M3UA_user_connect(); - void M3UA_user_unmap(const char *system_port); - void MTP3_interpreter(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con); - void MTP3_user_map(const char *system_port); // common for MTP3 ITU and MTP3 ANSI - void MTP3_user_connect(); - void MTP3_user_unmap(const char *system_port);// common for MTP3 ITU and MTP3 ANSI - void STC_user_connect(); - void STC_interpreter(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con); - void STC_user_map(const char *system_port); - void STC_user_unmap(const char *system_port); -#endif -#ifdef TARGET_TEST - //Map and unmap for target - void Target_user_map(const char *system_port); - void Target_user_unmap(const char *system_port); - void TargetSTC_user_map(const char *system_port); -#endif - -public: - MTP3asp__PT_PROVIDER(const char *par_port_name=NULL); - ~MTP3asp__PT_PROVIDER(); - - typedef enum { MTP3itu, MTP3ansi, MTP3ttc, MTP3mpt, M3UA, TargetM3UA, MTP3bttc,MTP3iup, STC, TargetSTC } MTPServiceType_t ; - - MTPServiceType_t MTPServiceType ; // ctor default is MTP3itu - void set_parameter(const char *parameter_name, const char *parameter_value); - void error(const char *msg, ...); - void log(const char *msg, ...); -#ifndef TARGET_TEST - void user_connect(); - - void set_channel(int chnl) {channel=chnl;}; - void MTP3_open_channel(boolean http); - void MTP3_close_connection(); - - boolean wait_for_open(); - int conn_state; - - interpreter_t interpreter; // pointer to interpreter members, ctor default is MTP3_ITU_interpreter - void doInterpret(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con) - { (this->*interpreter)(inbuffer,length,from_channel, con); } -#endif - //parameter handling - boolean dynamicConnection, connectionUp; - char *hostname; - int httpport; - char *entityname; - int MTP_fd; - -protected: - void user_map(const char *system_port); - void user_unmap(const char *system_port); - - void debuglog(const char *msg, ...); - void warn(const char *msg, ...); - void close_log_event(); - - usermap_t user_map_p ; // pointer to user_map members, default is MTP3itu - usermap_t user_unmap_p; // pointer to user_unmap members, default is MTP3itu - userconnect_t user_connect_p; - - void user_start(); - void user_stop(); - - void outgoing_send(const MTP3asp__Types::ASP__MTP3__TRANSFERreq& send_par); - virtual void incoming_message - (const MTP3asp__Types::ASP__MTP3__TRANSFERind& incoming_par) = 0; - virtual void incoming_message - (const MTP3asp__Types::ASP__MTP3__PAUSE& incoming_par) = 0; - virtual void incoming_message - (const MTP3asp__Types::ASP__MTP3__RESUME& incoming_par) = 0; - virtual void incoming_message - (const MTP3asp__Types::ASP__MTP3__STATUS& incoming_par) = 0; -#ifndef TARGET_TEST - void encode_56bLSB_int(unsigned char *to, unsigned long long int from); - long long unsigned int decode_56bLSB_int(const unsigned char *from); - void encode_48bLSB_int(unsigned char *to, unsigned long long int from); - long long unsigned int decode_48bLSB_int(const unsigned char *from); - void encode_40bLSB_int(unsigned char *to, unsigned long long int from); - long long unsigned int decode_40bLSB_int(const unsigned char *from); - void encode_32bLSB_int(unsigned char *to, unsigned int from); - unsigned int decode_32bLSB_int(const unsigned char *from); - void encode_24bLSB_int(unsigned char *to, int from); - unsigned int decode_24bLSB_int(const unsigned char *from); - void encode_16bLSB_int(unsigned char *to, int from); - unsigned int decode_16bLSB_int(const unsigned char *from); - void encode_32b_int(unsigned char *to, unsigned int from); - unsigned int decode_32b_int(const unsigned char *from); - void encode_24b_int(unsigned char *to, unsigned int from); - unsigned int decode_24b_int(const unsigned char *from); - void encode_16b_int(unsigned char *to, int from); - unsigned int decode_16b_int(const unsigned char *from); - void skip_par_after_tag(unsigned char* inbuffer, int &offset); - - void GetPointCodes(unsigned int &sls,unsigned int &opc,unsigned int &dpc, unsigned char* msg); - void GetPointCodesIUP(unsigned int &cic,unsigned int &opc,unsigned int &dpc, unsigned char* msg); - void SetPointCodes(unsigned int sls, unsigned int opc, unsigned int dpc, unsigned char* msg); - void SetPointCodesIUP(unsigned int cic, unsigned int opc, unsigned int dpc, unsigned char* msg); - int ChangePointCodes(unsigned char* outbuff, unsigned char *inbuff, int len); - void Set_M3UA_SingleAPC(unsigned int pc, unsigned char* apc_par); //for ITU and ANSI - bool Check_M3UA_SingleITUAPC(unsigned int pc, unsigned char* apc_par); - void Send_DAVA_DUNA_to_APCinDAUD(unsigned int dava_sep, unsigned char* inbuffer, int &offset ); - void processing_MTP3_management_msg(unsigned char* inbuff,int len); - void processing_MTP3_test_msg(unsigned char* inbuff,int len); - int processing_M3UA_MGMT_msg(unsigned char* inbuff,int len); - int processing_M3UA_Transfer_msg(unsigned char* inbuff,int len); - int processing_M3UA_SSNM_msg(unsigned char* inbuff,int len); - int processing_M3UA_ASPSM_msg(unsigned char* inbuff,int len); - int processing_M3UA_ASPTM_msg(unsigned char* inbuff,int len); - int processing_M3UA_RKM_msg(unsigned char* inbuff,int len); - int processing_M3UA_unsupported_msg_class(unsigned char* inbuff,int len); - int Check_PcMatch(unsigned int opc, unsigned int dpc, unsigned char *buff); - void send_msg(unsigned char *outbuff, int length); - void send_M3UA_error_msg(unsigned int error_code, unsigned int add_par ); - void Check_TestPort_Variables(); - void Check_TestPort_Variables_STC(); -#endif -#ifdef TARGET_TEST - void Check_Target_TestPort_Variables(); - void Check_Target_TestPort_Variables_STC(); - - //Functions for abstract socket handling - void message_incoming(const unsigned char*, int length, int client_id = -1); - void Add_Fd_Read_Handler(int fd) { Handler_Add_Fd_Read(fd); } - void Add_Fd_Write_Handler(int fd) { Handler_Add_Fd_Write(fd); } - void Remove_Fd_Read_Handler(int fd) { Handler_Remove_Fd_Read(fd); } - void Remove_Fd_Write_Handler(int fd) { Handler_Remove_Fd_Write(fd); } - void Remove_Fd_All_Handlers(int fd) { Handler_Remove_Fd(fd); } - void Handler_Uninstall() { Uninstall_Handler(); } - void Timer_Set_Handler(double call_interval, boolean is_timeout = TRUE, - boolean call_anyway = TRUE, boolean is_periodic = TRUE) { - Handler_Set_Timer(call_interval, is_timeout, call_anyway, is_periodic); - } - const char* local_address_name() { return "localIPAddr";} - const char* local_port_name() { return "localPort";} - const char* remote_address_name(){ return "M3UAtarget_TCP_IPAddr";} - const char* remote_port_name() { return "M3UAtarget_TCP_Port";} - const char* halt_on_connection_reset_name(){ return "halt_on_connection_reset";} - const char* server_mode_name() { return "client_mode";} - const char* socket_debugging_name(){ return "socket_debugging";} - const char* nagling_name() { return "nagling";} - const char* server_backlog_name(){ return "server_backlog";} - const PacketHeaderDescr* Get_Header_Descriptor() const {return header_descr;} -#endif - -private: - void Handle_Fd_Event(int fd, boolean is_readable, boolean is_writable, boolean is_error); - void Handle_Timeout(double time_since_last_call); - - unsigned char M3UA_version; - int channel; - unsigned char buffer[MAXSIZE]; - char *destinationname; - char *iid_string; - boolean Ni_is_set; - int Loop,Filter,Sut_Pc,Tester_Pc; - typedef enum { AssocDown, AssocEstabl, AssocInac, AssocActive} M3UAStateType_t; - M3UAStateType_t M3UAState; - int mtp3_ni; // network indicator in case of MTP3 - int stored_bttc_octet; // used for storage of an additional first byte in MTP3bttc - -#ifndef TARGET_TEST - MPH_IID iid; - CONNECTION *myConnection; -#endif - bool forward_resume, forward_pause, forward_status; -#ifdef TARGET_TEST - int Tcp_is_up; - PacketHeaderDescr *header_descr; - bool is_packet_hdr_length_offset, is_packet_hdr_nr_bytes_in_length, - is_packet_hdr_byte_order; - int packet_hdr_length_offset, packet_hdr_nr_bytes_in_length; - PacketHeaderDescr::HeaderByteOrder packet_hdr_byte_order; -#endif -}; - -extern BOOLEAN f__MTP3__SEA__connect__extern - (MTP3asp__PT_PROVIDER& portRef, const CHARSTRING& Hostname, - const INTEGER& Port, const CHARSTRING& EntityName,const BOOLEAN& Http); - -extern BOOLEAN f__MTP3__SEA__disconnect__extern - (MTP3asp__PT_PROVIDER& portRef); - -} -#endif diff --git a/MTP3asp_CNL113337/demo/MTP3asp_PortType.ttcn b/MTP3asp_CNL113337/demo/MTP3asp_PortType.ttcn deleted file mode 100644 index 86b7a83e7..000000000 --- a/MTP3asp_CNL113337/demo/MTP3asp_PortType.ttcn +++ /dev/null @@ -1,61 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// // -// Copyright Test Competence Center (TCC) ETH 2008 // -// // -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied // -// // -/////////////////////////////////////////////////////////////////////////////// -// -// File: MTP3asp_PortType.ttcn -// Reference: ITU-T Recommendation Q.704, RFC3332 -// Rev: R11A01 -// Prodnr: CNL 113 337 -// Updated: 2008-02-07 -// Contact: http://ttcn.ericsson.se - -module MTP3asp_PortType -{ - - import from MTP3asp_Types all; -// ************************************************************************* -// * MTP3 port type definitions * -// ************************************************************************* - - // MTP3 port type used by the component up to the MTP3 SAP - // (eg. any component connected to the MTP3 test port) - type port MTP3asp_PT message - { - in ASP_MTP3_TRANSFERind; - in ASP_MTP3_PAUSE; - in ASP_MTP3_RESUME; - in ASP_MTP3_STATUS; - out ASP_MTP3_TRANSFERreq; - } with {extension "provider"} - - // MTP3 port type used by the component up to the MTP3 SAP - // (e.g. the distribution component) - type port MTP3asp_SP_PT message - { - in ASP_MTP3_TRANSFERreq; - out ASP_MTP3_TRANSFERind; - } - with {extension "internal"} - -//Connecting functions -//---------------------------- -external function f_MTP3_SEA_connect - ( inout MTP3asp_PT portRef, - in charstring Hostname, - in integer Port, - in charstring EntityName, - in boolean Http //or MPH Port is provided - )return boolean; - -external function f_MTP3_SEA_disconnect - ( inout MTP3asp_PT portRef - )return boolean; - -}//eof module diff --git a/MTP3asp_CNL113337/demo/MTP3asp_Types.ttcn b/MTP3asp_CNL113337/demo/MTP3asp_Types.ttcn deleted file mode 100644 index e96f42016..000000000 --- a/MTP3asp_CNL113337/demo/MTP3asp_Types.ttcn +++ /dev/null @@ -1,324 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// // -// Copyright Test Competence Center (TCC) ETH 2006 // -// // -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied // -// // -/////////////////////////////////////////////////////////////////////////////// -// -// File: MTP3asp_Types.ttcn -// Description: CCSS7 Message Transfer Part primitive (ASP) definitions -// according to specification ITU-T SS7 MTP3, -// Reference: ITU-T Recommendation Q.704, RFC3332, ANSI T.1.111.1-2001, TCC -// Rev: R11A01 -// Prodnr: CNL 113 337 -// Updated: 2007-09-17 -// Contact: http://ttcn.ericsson.se -// -module MTP3asp_Types.objid - { - itu_t(0) identified_organization (4) etsi(0) reserved(127) - etsi_identified_organization(0) ericsson(5) testing (0) - generic(0) mtp3(0) v96(3) aspDefinitions(3) patchNo(0) - } - -{//start of the module - -// ************************************************************************* -// External encoding/decoding functions -// ************************************************************************* - -external function enc_MTP3_to_M3UAserver_msg (in MTP3_to_M3UAserver_msg pdu) - return octetstring - with { extension "prototype(convert)" - extension "encode(RAW)" - }; - -external function dec_MTP3_to_M3UAserver_msg(in octetstring stream) - return MTP3_to_M3UAserver_msg - with { extension "prototype(convert)" - extension "decode(RAW)" - }; - - -// ************************************************************************* -// * Type Definitions Part * -// ************************************************************************* -group Types -{ - group MessageTypes - { - group ASPs - { - //*********************************************************************** - //* ASP type definitions * - //* Note, that ASP types shall be TTCN-3 definitions to allow * - //* the use of anytype in the data field * - //*********************************************************************** - - type record MTP3_Field_sio - { - bitstring ni length(2), - bitstring prio length(2), - bitstring si length(4) - } with { variant "FIELDORDER(msb)"; - }; - - type record ASP_MTP3_TRANSFERind - { - MTP3_Field_sio sio, - integer opc, - integer dpc, - integer sls, - octetstring data - } with { variant (opc) "BYTEORDER(last), FIELDLENGTH(32)"; - variant (dpc) "BYTEORDER(last), FIELDLENGTH(32)"; - variant (sls) "FIELDLENGTH(8)" - }; - - type record ASP_MTP3_PAUSE {}; - - type record ASP_MTP3_RESUME {}; - - type record ASP_MTP3_STATUS {}; - - type record ASP_MTP3_TRANSFERreq - { - MTP3_Field_sio sio, - integer opc, - integer dpc, - integer sls, - octetstring data - } with { variant (opc) "BYTEORDER(last), FIELDLENGTH(32)"; - variant (dpc) "BYTEORDER(last), FIELDLENGTH(32)"; - variant (sls) "FIELDLENGTH(8)" - }; - }//end group ASPs - - //*********************************************************************** - //* Type definition of the message which is sent between MTP3 test port * - //* and SCTP server over TCP. * - //*********************************************************************** - group MTP3_SCTPserver - { - type record ASP_REGISTER_M3UA - { - integer ni (0..3), - integer sut_pc, - integer tester_pc, - integer m3ua_version, - charstring entity - } with { variant (ni) "FIELDLENGTH(8)"; - variant (sut_pc) "BYTEORDER(last), FIELDLENGTH(32)"; - variant (tester_pc) "BYTEORDER(last), FIELDLENGTH(32)"; - variant (m3ua_version) "FIELDLENGTH(8)" - }; - - - // Possible values: - // MTP3_to_SCTPserver_data/status: - const integer reg_ok_status := 0; - const integer reg_error_status := 1; - const integer unreg_ok_status := 2; - const integer unreg_error_status := 3; - - const integer send_error_status := 5; - const integer kill_status := 255; - - // MTP3_to_SCTPserver_data/pause: - const integer SCTP_COMLOST_pause := 0; - const integer M3UA_ASPDN_pause := 1; - const integer M3UA_ASPIA_pause := 2; - - // MTP3_to_SCTPserver_data/resume: - const integer ok_resume := 0; - - type union MTP3_to_SCTPserver_data - { - ASP_MTP3_TRANSFERind transfer_ind, - ASP_MTP3_TRANSFERreq transfer_req, - ASP_REGISTER_M3UA register, - integer unregister (0..255), - integer status (0..255), - integer pause (0..255), - integer resume (0..255) - } - - // MTP3_to_M3UAserver_msg/msgType: - const integer transfer_ind_msgType := 0; - const integer transfer_req_msgType := 1; - const integer register_msgType := 2; - const integer unregister_msgType := 3; - const integer status_msgType := 4; - const integer pause_msgType := 5; - const integer resume_msgType := 6; - - type record MTP3_to_M3UAserver_msg - { - integer msgType (0..255), - integer msgLength, - MTP3_to_SCTPserver_data data - } with { variant (data) "CROSSTAG( - transfer_ind, msgType = transfer_ind_msgType; - transfer_req, msgType = transfer_req_msgType; - register, msgType = register_msgType; - unregister, msgType = unregister_msgType; - status, msgType = status_msgType; - pause, msgType = pause_msgType; - resume, msgType = resume_msgType )"; - variant (msgLength) "FIELDLENGTH(32)"; - variant (msgLength) "LENGTHTO(msgType,msgLength,data)"; - variant (msgLength) "BYTEORDER(last)" - }; - }//end group MTP3_SCTPserver - }//end group Messagetypes -} with {encode "RAW"}//Types - -group Templates -{ - group MessageTemplates - { - group ASPtemplates - { - // ******************************************************************* - // * ASP template definitions * - // ******************************************************************* - - // Base templates - // These general templates can be used as an example or as a base - // template for other templates. - template ASP_MTP3_TRANSFERind t_ASP_MTP3_TRANSFERind - ( - template MTP3_Field_sio pl_SIO, - template integer pl_OPC, - template integer pl_DPC, - template integer pl_SLS, - template octetstring pl_data - ):= - { - sio := pl_SIO, - opc := pl_OPC, - dpc := pl_DPC, - sls := pl_SLS, - data := pl_data - } - - template ASP_MTP3_TRANSFERind tr_ASP_MTP3_TRANSFERind_sio - ( - template bitstring pl_NI, - template bitstring pl_PRIO, - template bitstring pl_SI, - template integer pl_OPC, - template integer pl_DPC, - template integer pl_SLS, - template octetstring pl_data - ):= - { - sio := - { - ni := pl_NI, - prio := pl_PRIO, - si := pl_SI - }, - opc := pl_OPC, - dpc := pl_DPC, - sls := pl_SLS, - data := pl_data - } - - template ASP_MTP3_TRANSFERind tr_ASP_MTP3_TRANSFERind := - { - sio := ?, - opc := ?, - dpc := ?, - sls := ?, - data := ? - } - - template ASP_MTP3_TRANSFERreq t_ASP_MTP3_TRANSFERreq - ( - MTP3_Field_sio pl_SIO, - integer pl_OPC, - integer pl_DPC, - integer pl_SLS, - octetstring pl_data - ):= - { - sio := pl_SIO, - opc := pl_OPC, - dpc := pl_DPC, - sls := pl_SLS, - data := pl_data - } - - template ASP_MTP3_TRANSFERreq tr_ASP_MTP3_TRANSFERreq_sio - ( - template bitstring pl_NI, - template bitstring pl_PRIO, - template bitstring pl_SI, - template integer pl_OPC, - template integer pl_DPC, - template integer pl_SLS, - template octetstring pl_data - ):= - { - sio := - { - ni := pl_NI, - prio := pl_PRIO, - si := pl_SI - }, - opc := pl_OPC, - dpc := pl_DPC, - sls := pl_SLS, - data := pl_data - } - - template ASP_MTP3_TRANSFERreq tr_ASP_MTP3_TRANSFERreq := - { - sio := ?, - opc := ?, - dpc := ?, - sls := ?, - data := ? - } - - template ASP_MTP3_TRANSFERind tr_ASP_MTP3_TRANSFERind_stc := - { - sio := - { - ni := '00'B, - prio := '00'B, - si := '0000'B - }, - opc := 0, - dpc := 0, - sls := 0, - data := ? - } - - template ASP_MTP3_TRANSFERreq t_ASP_MTP3_TRANSFERreq_stc - ( template octetstring pl_data ):= - { - sio := - { - ni := '00'B, - prio := '00'B, - si := '0000'B - }, - opc := 0, - dpc := 0, - sls := 0, - data := pl_data - } - - }//end group ASPtemplates - }//end group Messagetemplates -}//end group Templates - -}//end module - - diff --git a/MTP3asp_CNL113337/demo/Makefile b/MTP3asp_CNL113337/demo/Makefile deleted file mode 100644 index 53b19d35b..000000000 --- a/MTP3asp_CNL113337/demo/Makefile +++ /dev/null @@ -1,353 +0,0 @@ -# This Makefile was generated by the compiler -# of the TTCN-3 Test Executor version 1.4.pl3 -# for Attila Balasko (ethbaat@duna199) on Mon Sep 15 15:48:45 2003 - -# Copyright 2000-2003 Conformance Center, Ericsson R & D, Hungary -# Please send bug reports and comments to Szabo.Janos@eth.ericsson.se - -# The following make commands are available: -# - make, make all Builds the executable test suite. -# - make compile Translates TTCN-3 and ASN.1 modules to C++. -# - make clean Removes all generated files. -# - make dep Creates/updates dependency list. -# - make archive Archives all source files. - -# -# Set these variables... -# - -# The path of your TTCN-3 Test Executor installation: -# Uncomment this line to override the environment variable. -# TTCN3_DIR = - -# Your platform: (SOLARIS, LINUX, FREEBSD or WIN32) -PLATFORM = SOLARIS8 - -# Your C++ compiler: -CXX = g++ - -# Flags for the C++ preprocessor (and makedepend as well): -CPPFLAGS = -D$(PLATFORM) -I$(TTCN3_DIR)/include -I$(SEA_DIR)/include - -# Flags for the C++ compiler: -CXXFLAGS = -Wall - -# Flags for the linker: -LDFLAGS = - -# Flags for the TTCN-3 and ASN.1 compiler: -COMPILER_FLAGS = -L - -# Execution mode: (either ttcn3 or ttcn3-parallel) -TTCN3_LIB = ttcn3-parallel - -# The path of your OpenSSL installation: -# If you do not have your own one, leave it unchanged. -OPENSSL_DIR = $(TTCN3_DIR) - -# Directory to store the archived source files: -# Note: you can set any directory except ./archive -ARCHIVE_DIR = ./backup - -SEA_DIR = /vobs/ttcn/TCC_Releases/Other/SEA_LATEST -# -# You may change these variables. Add your files if necessary... -# - -# The TTCN-3 modules needed for this project: -TTCN3_MODULES = mtp3test.ttcn MTP3asp_Types.ttcn MTP3asp_PortType.ttcn -# The ASN.1 modules needed for this project: -ASN1_MODULES = - -# C++ source & header files generated by TTCN-3 & ASN.1 compilers: -GENERATED_SOURCES = $(TTCN3_MODULES:.ttcn=.cc) -GENERATED_HEADERS = $(GENERATED_SOURCES:.cc=.hh) -# Source & header files of Test Ports and your other modules: -USER_SOURCES = MTP3asp_PT.cc -USER_HEADERS = MTP3asp_PT.hh - -# All object files needed for the executable test suite: -#OBJECTS = mtp3test.o MTP3_ASPs.o general_typedefs.o MTP3user_porttype.o -OBJECTS = $(GENERATED_SOURCES:.cc=.o) $(USER_SOURCES:.cc=.o) -# The name of the executable test suite: -TARGET = mtp3test - -#The names of the config files (to archive): -TARGET_CONFIGS = mtp3test_MTP3_ansi2.cfg -# -# Do not modify these unless you know what you are doing... -# -SOLARIS_LIBS = -lxnet -LINUX_LIBS = -FREEBSD_LIBS = -WIN32_LIBS = - -# -# Rules for building the executable... -# -all: $(TARGET) ; - -$(TARGET): $(OBJECTS) - $(CXX) $(LDFLAGS) -o $@ $(OBJECTS) \ - -L$(TTCN3_DIR)/lib -l$(TTCN3_LIB) \ - -L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS) $(SEA_DIR)/lib/libmphclib.a -lxml2 - -.cc.o .c.o: - $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< - -$(GENERATED_SOURCES) $(GENERATED_HEADERS): compile - @if [ ! -f $@ ]; then $(RM) compile; $(MAKE) compile; fi - -compile: $(TTCN3_MODULES) $(ASN1_MODULES) - $(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) $(TTCN3_MODULES) \ - $(ASN1_MODULES) - $? - touch $@ - -clean: - -$(RM) $(TARGET) $(OBJECTS) $(GENERATED_HEADERS) \ - $(GENERATED_SOURCES) compile *.log - -dep: $(GENERATED_SOURCES) - makedepend $(CPPFLAGS) $(USER_SOURCES) $(GENERATED_SOURCES) - -archive: - mkdir -p $(ARCHIVE_DIR) - tar -cvhf - $(TTCN3_MODULES) $(ASN1_MODULES) \ - $(USER_HEADERS) $(USER_SOURCES) $(TARGET_CONFIGS) Makefile \ - | gzip >$(ARCHIVE_DIR)/$(TARGET)-`date '+%y%m%d-%H%M'`.tgz - -# -# Add your rules here if necessary... -# - -# DO NOT DELETE - -MTP3asp_PT.o: /usr/include/stdio.h /usr/include/iso/stdio_iso.h -MTP3asp_PT.o: /usr/include/sys/feature_tests.h /usr/include/sys/isa_defs.h -MTP3asp_PT.o: /usr/include/sys/va_list.h /usr/include/stdio_tag.h -MTP3asp_PT.o: /usr/include/stdio_impl.h /usr/include/stdlib.h -MTP3asp_PT.o: /usr/include/iso/stdlib_iso.h /usr/include/sys/types.h -MTP3asp_PT.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -MTP3asp_PT.o: /usr/include/sys/select.h /usr/include/sys/time.h -MTP3asp_PT.o: /usr/include/time.h /usr/include/iso/time_iso.h -MTP3asp_PT.o: /usr/include/netinet/in.h /usr/include/sys/stream.h -MTP3asp_PT.o: /usr/include/sys/vnode.h /usr/include/sys/t_lock.h -MTP3asp_PT.o: /usr/include/sys/machlock.h /usr/include/sys/param.h -MTP3asp_PT.o: /usr/include/sys/unistd.h /usr/include/sys/mutex.h -MTP3asp_PT.o: /usr/include/sys/rwlock.h /usr/include/sys/semaphore.h -MTP3asp_PT.o: /usr/include/sys/condvar.h /usr/include/sys/time_impl.h -MTP3asp_PT.o: /usr/include/sys/cred.h /usr/include/sys/uio.h -MTP3asp_PT.o: /usr/include/sys/resource.h /usr/include/vm/seg_enum.h -MTP3asp_PT.o: /usr/include/sys/poll.h /usr/include/sys/strmdep.h -MTP3asp_PT.o: /usr/include/sys/model.h /usr/include/sys/strft.h -MTP3asp_PT.o: /usr/include/sys/byteorder.h /usr/include/netdb.h -MTP3asp_PT.o: /usr/include/sys/socket.h /usr/include/sys/netconfig.h -MTP3asp_PT.o: /usr/include/sys/un.h /usr/include/net/if_dl.h -MTP3asp_PT.o: /usr/include/sys/wait.h /usr/include/sys/siginfo.h -MTP3asp_PT.o: /usr/include/sys/machsig.h /usr/include/sys/procset.h -MTP3asp_PT.o: /usr/include/unistd.h /usr/include/arpa/inet.h -MTP3asp_PT.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -MTP3asp_PT.o: /usr/include/string.h /usr/include/iso/string_iso.h -MTP3asp_PT.o: MTP3asp_PT.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/TTCN3.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/version.h -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Basetype.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Types.h -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Encdec.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Template.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Integer.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Optional.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/BER.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Logger.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Textbuf.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Error.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Parameters.h -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Float.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Boolean.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_Null.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Objid.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Verdicttype.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Component.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Bitstring.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/RAW.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Hexstring.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Octetstring.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_Any.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Charstring.hh -MTP3asp_PT.o: /usr/include/regex.h -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Universal_charstring.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Struct_of.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Array.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_CharacterString.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_External.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_EmbeddedPDV.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Addfunc.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Timer.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Port.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Module_list.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Snapshot.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Default.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Runtime.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/TEXT.hh -MTP3asp_PT.o: /vobs/ttcn/TCC_Releases/Other/SEA_LATEST/include/mphclib.h -MTP3asp_PT.o: MTP3asp_Types.hh MTP3asp_PortType.hh -mtp3test.o: mtp3test.hh MTP3asp_PortType.hh MTP3asp_Types.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/TTCN3.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/version.h -mtp3test.o: /usr/include/string.h /usr/include/iso/string_iso.h -mtp3test.o: /usr/include/sys/feature_tests.h /usr/include/sys/isa_defs.h -mtp3test.o: /usr/include/stdio.h /usr/include/iso/stdio_iso.h -mtp3test.o: /usr/include/sys/va_list.h /usr/include/stdio_tag.h -mtp3test.o: /usr/include/stdio_impl.h -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Basetype.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Types.h -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Encdec.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Template.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Integer.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Optional.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/BER.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Logger.hh -mtp3test.o: /usr/include/stdlib.h /usr/include/iso/stdlib_iso.h -mtp3test.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -mtp3test.o: /usr/include/sys/time.h /usr/include/sys/types.h -mtp3test.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -mtp3test.o: /usr/include/sys/select.h /usr/include/time.h -mtp3test.o: /usr/include/iso/time_iso.h -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Textbuf.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Error.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Parameters.h -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Float.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Boolean.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_Null.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Objid.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Verdicttype.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Component.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Bitstring.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/RAW.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Hexstring.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Octetstring.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_Any.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Charstring.hh -mtp3test.o: /usr/include/regex.h -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Universal_charstring.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Struct_of.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Array.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_CharacterString.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_External.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_EmbeddedPDV.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Addfunc.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Timer.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Port.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Module_list.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Snapshot.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Default.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Runtime.hh -mtp3test.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/TEXT.hh -mtp3test.o: MTP3asp_PT.hh -mtp3test.o: /vobs/ttcn/TCC_Releases/Other/SEA_LATEST/include/mphclib.h -MTP3asp_Types.o: MTP3asp_Types.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/TTCN3.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/version.h -MTP3asp_Types.o: /usr/include/string.h /usr/include/iso/string_iso.h -MTP3asp_Types.o: /usr/include/sys/feature_tests.h /usr/include/sys/isa_defs.h -MTP3asp_Types.o: /usr/include/stdio.h /usr/include/iso/stdio_iso.h -MTP3asp_Types.o: /usr/include/sys/va_list.h /usr/include/stdio_tag.h -MTP3asp_Types.o: /usr/include/stdio_impl.h -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Basetype.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Types.h -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Encdec.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Template.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Integer.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Optional.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/BER.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Logger.hh -MTP3asp_Types.o: /usr/include/stdlib.h /usr/include/iso/stdlib_iso.h -MTP3asp_Types.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -MTP3asp_Types.o: /usr/include/sys/time.h /usr/include/sys/types.h -MTP3asp_Types.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -MTP3asp_Types.o: /usr/include/sys/select.h /usr/include/time.h -MTP3asp_Types.o: /usr/include/iso/time_iso.h -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Textbuf.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Error.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Parameters.h -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Float.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Boolean.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_Null.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Objid.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Verdicttype.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Component.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Bitstring.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/RAW.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Hexstring.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Octetstring.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_Any.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Charstring.hh -MTP3asp_Types.o: /usr/include/regex.h -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Universal_charstring.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Struct_of.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Array.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_CharacterString.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_External.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_EmbeddedPDV.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Addfunc.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Timer.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Port.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Module_list.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Snapshot.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Default.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Runtime.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/TEXT.hh -MTP3asp_PortType.o: MTP3asp_PortType.hh MTP3asp_Types.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/TTCN3.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/version.h -MTP3asp_PortType.o: /usr/include/string.h /usr/include/iso/string_iso.h -MTP3asp_PortType.o: /usr/include/sys/feature_tests.h -MTP3asp_PortType.o: /usr/include/sys/isa_defs.h /usr/include/stdio.h -MTP3asp_PortType.o: /usr/include/iso/stdio_iso.h /usr/include/sys/va_list.h -MTP3asp_PortType.o: /usr/include/stdio_tag.h /usr/include/stdio_impl.h -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Basetype.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Types.h -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Encdec.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Template.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Integer.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Optional.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/BER.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Logger.hh -MTP3asp_PortType.o: /usr/include/stdlib.h /usr/include/iso/stdlib_iso.h -MTP3asp_PortType.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -MTP3asp_PortType.o: /usr/include/sys/time.h /usr/include/sys/types.h -MTP3asp_PortType.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -MTP3asp_PortType.o: /usr/include/sys/select.h /usr/include/time.h -MTP3asp_PortType.o: /usr/include/iso/time_iso.h -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Textbuf.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Error.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Parameters.h -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Float.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Boolean.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_Null.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Objid.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Verdicttype.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Component.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Bitstring.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/RAW.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Hexstring.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Octetstring.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_Any.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Charstring.hh -MTP3asp_PortType.o: /usr/include/regex.h -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Universal_charstring.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Struct_of.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Array.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_CharacterString.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_External.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/ASN_EmbeddedPDV.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Addfunc.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Timer.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Port.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Module_list.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Snapshot.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Default.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/Runtime.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-1.7.pl2-gcc3.4.6/include/TEXT.hh -MTP3asp_PortType.o: MTP3asp_PT.hh -MTP3asp_PortType.o: /vobs/ttcn/TCC_Releases/Other/SEA_LATEST/include/mphclib.h diff --git a/MTP3asp_CNL113337/demo/mtp3test.ttcn b/MTP3asp_CNL113337/demo/mtp3test.ttcn deleted file mode 100644 index 1c842503a..000000000 --- a/MTP3asp_CNL113337/demo/mtp3test.ttcn +++ /dev/null @@ -1,292 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright Test Competence Center (TCC) ETH 2003 -// -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied -// -/////////////////////////////////////////////////////////////////////////////// -// -// File: mtp3test.cc -// Description: basic test for MTP3asp_PT -// Rev: -// Prodnr: CNL 113 337 -// Updated: 2004.06.02 -// Contact: http://ttcn.ericsson.se - - -module mtp3test -{ - -modulepar -{ - //mtp3test specific data: - //OCT1n MTP3_UserPart_SIO; - MTP3_Field_sio MTP3_UserPart_SIO; - integer MTP3_UserPart_OPC, - MTP3_UserPart_DPC, - MTP3_UserPart_SLS -};//modulepar - -import from MTP3asp_Types all; -import from MTP3asp_PortType all; - -/************************************* -* Components -**************************************/ - -/* -**************** 1: 2: ************************ -* MTP3UserPart * <---------> * MTP3/M3UA in MSC * -**************** (MTP3port)************************ -1: MTP3asp_PT MTP3_PCO alias: e.g. CMGW6 - -*/ - -type record of MTP3UserPart_CT CompArray; - -type component MTC_CT -{ - port MTP3asp_PT MTC_PCO; - var MTP3UserPart_CT vc_MTP3UserPart_BSC1A; - var MTP3UserPart_CT vc_MTP3UserPart_BSC1B; - var MTP3UserPart_CT vc_MTP3UserPart_BSC1C; - var MTP3UserPart_CT vc_MTP3UserPart_CMGW3; - var MTP3UserPart_CT vc_MTP3UserPart_CMGW6; - var MTP3UserPart_CT vc_MTP3UserPart_CMGW9; - var MTP3UserPart_CT vc_compArray[6]; -}; - -// Model of MSC: -type component MSC_SCT -{ - port MTP3asp_PT BSC1A; - port MTP3asp_PT BSC1B; - port MTP3asp_PT BSC1C; - port MTP3asp_PT CMGW3; - port MTP3asp_PT CMGW6; - port MTP3asp_PT CMGW9; -}; - -//Model of SS7 MTP3 User Part for Self Test. Only logs the messages -type component MTP3UserPart_CT -{ - var ASP_MTP3_TRANSFERind v_MTP3_TRANSFERind; - var ASP_MTP3_TRANSFERreq v_MTP3_TRANSFERreq; - port MTP3asp_PT MTP3_PCO; - // port ... to the upper layers -} // end component type definition - -/* -function MTC_delay(integer time) runs on MTC_CT { - timer t:=time; - t.start; - setverdict(none); - alt{ []t.timeout {} } - } -*/ - -function mtp3_selftest( ) runs on MTP3UserPart_CT -{ - timer t_Guard := 6.0; - log( "mtp3_selftest started"); - t_Guard.start; - setverdict(none); - alt - { - [] MTP3_PCO.receive ( ASP_MTP3_TRANSFERind:?) -> value v_MTP3_TRANSFERind - { - log("ASP_MTP3_TRANSFERind: received"); - setverdict(pass); - repeat; - } - [] MTP3_PCO.receive - { - log("Unknown signal received"); - setverdict(pass); - repeat; - } - [] t_Guard.timeout - { log("timeout reached");} - } //alt - log("mtp3_selftest finished"); -} - -function f_init( ) runs on MTC_CT -{ - vc_MTP3UserPart_BSC1A := MTP3UserPart_CT.create; - vc_MTP3UserPart_BSC1B := MTP3UserPart_CT.create; - vc_MTP3UserPart_BSC1C := MTP3UserPart_CT.create; - vc_MTP3UserPart_CMGW3 := MTP3UserPart_CT.create; - vc_MTP3UserPart_CMGW6 := MTP3UserPart_CT.create; - vc_MTP3UserPart_CMGW9 := MTP3UserPart_CT.create; - - map(vc_MTP3UserPart_BSC1A:MTP3_PCO,system:BSC1A); - map(vc_MTP3UserPart_BSC1B:MTP3_PCO,system:BSC1B); - map(vc_MTP3UserPart_BSC1C:MTP3_PCO,system:BSC1C); - map(vc_MTP3UserPart_CMGW3:MTP3_PCO,system:CMGW3); - map(vc_MTP3UserPart_CMGW6:MTP3_PCO,system:CMGW6); - map(vc_MTP3UserPart_CMGW9:MTP3_PCO,system:CMGW9); - - log("tc_3 map is ready"); -} - -function f_start() runs on MTC_CT -{ - vc_MTP3UserPart_BSC1A.start( mtp3userpart_test() ); - vc_MTP3UserPart_BSC1B.start( mtp3userpart_test() ); - vc_MTP3UserPart_BSC1C.start( mtp3userpart_test() ); - vc_MTP3UserPart_CMGW3.start( mtp3userpart_test() ); - vc_MTP3UserPart_CMGW6.start( mtp3userpart_test() ); - vc_MTP3UserPart_CMGW9.start( mtp3userpart_test() ); -} - -function f_terminate() runs on MTC_CT -{ - all component.done; - unmap(vc_MTP3UserPart_BSC1A:MTP3_PCO,system:BSC1A); - unmap(vc_MTP3UserPart_BSC1B:MTP3_PCO,system:BSC1B); - unmap(vc_MTP3UserPart_BSC1C:MTP3_PCO,system:BSC1C); - unmap(vc_MTP3UserPart_CMGW3:MTP3_PCO,system:CMGW3); - unmap(vc_MTP3UserPart_CMGW6:MTP3_PCO,system:CMGW6); - unmap(vc_MTP3UserPart_CMGW9:MTP3_PCO,system:CMGW9); -} - -function mtp3userpart_test( ) runs on MTP3UserPart_CT { - timer t_Guard := 5.0; - log( "mtp3userpart_test started"); - v_MTP3_TRANSFERreq := - { - sio := MTP3_UserPart_SIO, - opc := MTP3_UserPart_OPC, - dpc := MTP3_UserPart_DPC, - sls := 0, - data:= '010203040506070809000102030405060708090000010203040506070809000000'O - }; - MTP3_PCO.send( v_MTP3_TRANSFERreq ); - t_Guard.start; - setverdict(none); - alt - { - [] MTP3_PCO.receive ( ASP_MTP3_TRANSFERind:? ) -> value v_MTP3_TRANSFERind - { - log("ASP_MTP3_TRANSFERind: received"); - setverdict(pass); - repeat; - } - [] MTP3_PCO.receive - { - log("Unknown signal received"); - setverdict(pass); - repeat; - } - [] t_Guard.timeout - { - //setverdict(inconc); - log("timeout reached"); - } - } //alt - log("mtp3userpart_test finished"); -} - -testcase tc_1() runs on MTC_CT system MSC_SCT -{ - log ("tc_1 started"); - var MTP3UserPart_CT vc_MTP3userpart; - vc_MTP3userpart := MTP3UserPart_CT.create; - map(vc_MTP3userpart:MTP3_PCO, system:CMGW6); - log("map is ready"); - vc_MTP3userpart.start( mtp3_selftest() ); - //MTC_delay(6); - vc_MTP3userpart.done; - unmap(vc_MTP3userpart:MTP3_PCO, system:CMGW6); - log ("tc_1 finished"); -} - -// TC2: Testcase sending one simple message "MTP-transfer-req" and waiting -testcase tc_2() runs on MTC_CT system MSC_SCT -{ - log ("tc_2 started"); - var MTP3UserPart_CT vc_MTP3userpart; - vc_MTP3userpart := MTP3UserPart_CT.create; - map(vc_MTP3userpart:MTP3_PCO, system:CMGW6); - log("map is ready"); - vc_MTP3userpart.start( mtp3userpart_test() ); - //MTC_delay(6); - vc_MTP3userpart.done; - unmap(vc_MTP3userpart:MTP3_PCO, system:CMGW6); - log ("tc_2 finished"); -} - -testcase tc_3() runs on MTC_CT system MSC_SCT -{ - log ("tc_3 started"); - vc_MTP3UserPart_BSC1A := MTP3UserPart_CT.create; - vc_MTP3UserPart_BSC1B := MTP3UserPart_CT.create; - vc_MTP3UserPart_BSC1C := MTP3UserPart_CT.create; - vc_MTP3UserPart_CMGW3 := MTP3UserPart_CT.create; - vc_MTP3UserPart_CMGW6 := MTP3UserPart_CT.create; - vc_MTP3UserPart_CMGW9 := MTP3UserPart_CT.create; - - map(vc_MTP3UserPart_BSC1A:MTP3_PCO,system:BSC1A); - map(vc_MTP3UserPart_BSC1B:MTP3_PCO,system:BSC1B); - map(vc_MTP3UserPart_BSC1C:MTP3_PCO,system:BSC1C); - map(vc_MTP3UserPart_CMGW3:MTP3_PCO,system:CMGW3); - map(vc_MTP3UserPart_CMGW6:MTP3_PCO,system:CMGW6); - map(vc_MTP3UserPart_CMGW9:MTP3_PCO,system:CMGW9); - - log("tc_3 map is ready"); - vc_MTP3UserPart_BSC1A.start( mtp3userpart_test() ); - vc_MTP3UserPart_BSC1B.start( mtp3userpart_test() ); - vc_MTP3UserPart_BSC1C.start( mtp3userpart_test() ); - vc_MTP3UserPart_CMGW3.start( mtp3userpart_test() ); - vc_MTP3UserPart_CMGW6.start( mtp3userpart_test() ); - vc_MTP3UserPart_CMGW9.start( mtp3userpart_test() ); - - //MTC_delay(6); - all component.done; - unmap(vc_MTP3UserPart_BSC1A:MTP3_PCO,system:BSC1A); - unmap(vc_MTP3UserPart_BSC1B:MTP3_PCO,system:BSC1B); - unmap(vc_MTP3UserPart_BSC1C:MTP3_PCO,system:BSC1C); - unmap(vc_MTP3UserPart_CMGW3:MTP3_PCO,system:CMGW3); - unmap(vc_MTP3UserPart_CMGW6:MTP3_PCO,system:CMGW6); - unmap(vc_MTP3UserPart_CMGW9:MTP3_PCO,system:CMGW9); - log ("tc_3 finished"); -} - -// tc_4 is the same as tc_3 but organized by arrays and cycles -testcase tc_4() runs on MTC_CT system MSC_SCT -{ - f_init(); - f_start(); - f_terminate(); -} - -testcase tc_5() runs on MTC_CT -{ - var ASP_MTP3_TRANSFERreq vl_MTP3_TRANSFERreq := - { sio := - { ni := '00'B, - prio := '00'B, - si := '0000'B - }, - opc := 0, - dpc := 0, - sls := 0, - data:= '010203040506070809000102030405060708090000010203040506070809000000'O - }; - - map(self:MTC_PCO,system:MTC_PCO); - MTC_PCO.send(vl_MTP3_TRANSFERreq); - MTC_PCO.receive; - unmap(self:MTC_PCO,system:MTC_PCO); -} - -control -{ - execute (tc_1()); -} - -}//module diff --git a/MTP3asp_CNL113337/demo/mtp3test_MTP3_ansi2.cfg b/MTP3asp_CNL113337/demo/mtp3test_MTP3_ansi2.cfg deleted file mode 100644 index 35b3e09ad..000000000 --- a/MTP3asp_CNL113337/demo/mtp3test_MTP3_ansi2.cfg +++ /dev/null @@ -1,75 +0,0 @@ -[LOGGING] -#FileName := "mtp3test_MTP3_ansi2.cfg" -FileMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING -#ConsoleMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING - -[EXECUTE] -#Loopback -#mtp3test.TC0 -#SEA test cases, LOOP := OFF -#mtp3test.tc_1 -#mtp3test.tc_2 -#mtp3test.tc_3 -mtp3test.tc_4 -[TESTPORT_PARAMETERS] -// ******************************************************* -// * DO NOT FORGET TO SET THE FOLLOWING TWO LINE TO YOUR SEA * -// ******************************************************* -system.*.Hostname := "zaire" //sea server name -system.*.HttpPort := "5000" //sea http port -system.*.Loop:= "ON" -system.*.Filter:= "OFF" -system.*.MTP3ServiceType := "MTP3itu" // ["MTP3itu" (default)|"MTP3ansi" | "M3UA" | "MTP3ttc" | "MTP3mpt" ] - -system.CMGW3.EntityName := "S7ST-0" //device name to connect -system.CMGW3.NI:= "2" -system.CMGW3.SUT_Pc:= "461088" -system.CMGW3.TESTER_Pc:= "461089" -system.CMGW3.M3UA_version:= "1" - -system.CMGW6.EntityName := "S7ST-1" //device name to connect -system.CMGW6.NI:= "2" -system.CMGW6.SUT_Pc:= "461086" // 07-09-30 =0x07091E see command: s7stp:st=s7stg-0&&-32; -system.CMGW6.TESTER_Pc:= "461087" //07-09-31=0x07091F -system.CMGW6.M3UA_version:= "1" - -system.CMGW9.EntityName := "S7ST-2" //device name to connect -system.CMGW9.NI:= "2" -system.CMGW9.SUT_Pc:= "461088" -system.CMGW9.TESTER_Pc:= "461089" -system.CMGW9.M3UA_version:= "1" - -system.BSC1A.EntityName := "S7ST-3" //device name to connect -system.BSC1A.NI:= "2" -system.BSC1A.SUT_Pc:= "461088" -system.BSC1A.TESTER_Pc:= "461089" -system.BSC1A.M3UA_version:= "1" - -system.BSC1B.EntityName := "S7ST-4" //device name to connect -system.BSC1B.NI:= "2" -system.BSC1B.SUT_Pc:= "461088" -system.BSC1B.TESTER_Pc:= "461089" -system.BSC1B.M3UA_version:= "1" - -system.BSC1C.EntityName := "S7ST-5" //device name to connect -system.BSC1C.NI:= "2" -system.BSC1C.SUT_Pc:= "461088" -system.BSC1C.TESTER_Pc:= "461089" -system.BSC1C.M3UA_version:= "1" - -[MODULE_PARAMETERS] - -// MTP3_user_part for test suite 'mtp3userpart_test' in mtp3test.ttcn -MTP3_UserPart_SIO := -{ - ni := '10'B, - prio := '00'B, - si := '1110'B -}; -MTP3_UserPart_OPC := 461087 // =0x07091E -MTP3_UserPart_DPC := 461086 // -MTP3_UserPart_SLS := 0; - -[MAIN_CONTROLLER] -TCPPort := 9999 -NumHCs := 1 diff --git a/MTP3asp_CNL113337/doc/MTP3asp_CNL113337_FS.pdf b/MTP3asp_CNL113337/doc/MTP3asp_CNL113337_FS.pdf deleted file mode 100644 index b6cf46f115f8c80b00a05439c6b430ad0c880093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143496 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 z z(ibwi;oztzaJPV0N856-M{HWG%!4!eds>AOGh|^Fws}`x7BR`Cjjj7FR@UiabpD)1 zw&-VDe*-mrmUebLOm`)a$CA@FTnk@F^ULg4b$d@v^V41Vxlf~A$jDe2Z-+lr10WA{ z4q?TKrcxcI%o1sFB2@tEp)LS{k|hfjfIyDF$C4g>zbp>+cfQUBFy}a??^rx9)rcu( zBdpg%-0sF;QB&;X284k^glogVUe;-< zg|+1epxAY4?UAp9L59k&@R-gktT*yb%BgY{5OUU9?%W$M5;I*>UT#S~{9Pw&vOU}# z-QsTYwO5{!sA3A%<+MQ??uZ zAqIOeq8p3j0%9_M@WdeCc=-+8uK_U(^;>hgeKnKPnRy*gDSFSn!zaA0WzVs!Q|q0w zUW8EVb&EmcKr-v_>vM~2_=g5KC5=C@-&ye+- zozE^+!vHgmyJ(kcYpSa>#^XDn=l8=JLg%X-W^6Rc_UQRdeQBN=`d|IW4+Go5-2K;A zoN0)cG7=IjnwTTwfShk!%}gOiG!f#$BSNa|A;UUSMpm$y)q z)~ERDCUBr@07qCUJ)~$SOwYWPU0ZWRCmJoIHnOaLtV4Gf`9T468gd?PNmIu06i0wG zwI}hJUVR8{s8-Tfb-1!&g;=sYs}kVZGBn%rgJNHMRF@dqY{p`d7)+pVPLm@38Li=l?(| zZA6xcdRkf8jmEBWQ}^bG6LF@;k^MV2c`&x93RnlLPq5W$yVxs;VmHHnv! zCJc-Tq@NVhsLN?j9@QQ*1@Y$SvDY_t@^ZVY ztJxIJQm;#rJ_eZ{hHN(0Lq%I8(j4n=@7HaT+%noZNcFoL=`qCQu?}5G>;Ox}mbGpE zHfl`tL^p{wHiTJ%MpB+$!;}RAM|lgV9V6L~*05u(ZT(;H#g>&cnJ5|Kz%!;kCB6UE zD3QTMO~aa+k~)(LM{Q>SO#v@p(qiw-fh&79Z<5R}=LZc44vk2OD$ulvWNdt-TmPjb z2`Ia2I39BuzK(-92|`pqu3-=P6fGmrhA3UC>ldoIh&c=nZA*!4O=3Ntpja1K|Mst> zL_pGHK}jP%K?Ti?QY(@Yy3k_z_QC&Okt;j5J^8H5_1=aHqawYTNv5`*b%U1AGb5P^ z*W)2!{PUc&9tR5HlP7-X?SKx}*BNMZYLlBDfdi;dS6?tnR`|niea0Hvy%WkK-k)|z zH1V3$l0?d|j$myv3@}xuF(RUnN5C0KHAT1r5C>z12trB!M4|sf!?KmhhRg+{oU3ED z^&#q@FR4Fgnr1R+O4w}vMs>!FJ7XY$8uKnilU|-iK!axV!c(9?h>F(0AfvKoqFiCJ ziYg{+RvCOy$)6vd3F}m5GS=5o+KqG!jufi&VNnSup*4x(wHQ*#Bh7HBpD#T7RTiK3 zT11E2e*;@=K4h5w^q1g|4~9FF#%j=bT-r8r&5XV~Mi_O8+<@9_WltKG4jD6zBc`0C z={W>64nYLzZ1x%Jrmloh%8DjU#UL`eCfy#Pn*F9E;e|7$99jCCw$AYa^OL7l{%&5B zF@p$-=O%S#G0BP+6?HK82J;z=MiqQ5*Gk4Q2A1g^=b)hd1aQ;y3A#S0E8w=c7;Z3e ze7vH0zSo2PFnm?}cL4E8XKmbW76{*9o_Bh!_A}OvD5Oas3ufb8qhFOr+ZMJTi(hP}`)*EU2vQ($z9^8GQ!XJajz2IIaDX|H%Gkx+lMLnUp?C zL>sn^KbEmt)iAc0t~g(yS~P#6KGAQ=Ht_=tZ|i>+c2C1OazFIieQ&agyZaEtnv^reCjbu&#~D z`7gu73V~Q4Py?<55%}eWl@&QF1=tH2&7r8oKF%#!AY;Tr%y~Ki)l^Yn1%LyBMPAi# zuLl_Niy+I9VnW6V;bFzp1L?n%RYFY*ul!4F%)zk0r|n^(iZ04Qh#G(?NVQ;m5L2lH zff@;%e_o76Veok^hsP65gu}3ML3F_zZvEb#;Qz!{gFF-YEhYZ2^0;FvV`}c4yex-w z-0K^1hLizi){5DdJwL#1&h9y#>l$vrAgzU+^0R|sV>Q4!WI=m3tiQoG*^Ig%Wo6cc zDrVd*#UHnh+sZLr3RcWflR-4r;GSz6dcYby!L!{4T!C%^eYyLslJZMl{q|B5*Zo>b zRxkVB_fl@5OOXZdGV*l`40TyHbPmJOJ zBLQY)U}9$aUzFkhrdIvG6_AVs>}>xZkm3J$N0t6J$nb{K%3XOa!Rc07{z`YEGtuNg zLTDXKB);LE8ZjY|R@guA2%{cY*Eqg`kzP4J9y~AS_8Y!X;AY zC^VFwP_}UyP->!Rhs9qTFHY0=i>>nfq zfUy8~y+X@ztv;c-#UgP!t#(sG0jrK%7NEpaW}VH`>;uhC6zpH@%R)uY~P*HbgcDy zcPXKc+eX6QNenEvHYYMO_*k1!k(=_+=;*`47Q<7s?QSQn&K#%Amv-OgdZ$I0-r$3V z8T)9&Dh{B8pP*Z^7d3rB=BR7RuSn%M9mklbK-P(!D?Xo*YZ9kQYl~R9D~0 zXohu}i!t)Sv~G~liPp&|ihcF^W{?XPZERalQ1-2DvtdI)w`kZzvl{&R$R=P?@r>kf3fZM9>=4AoLCMyKUZRC3#A!9`AROt(Z{CeQz&`CVdvS*;G zxz1LSTW%;9a_-qhQtE^hzjE(vX_}?BQKUOWYGYAA9nI>&)rH-%YO6@HhLUFWIba)7#Z`32ed*o5tKztsTvzc-I?K$!#fB4gdQag% zF6vWL+PfPR+YmWNmudiaT;QShfl5K=YOJ7y#fm1RmbGLv(8mSDOx1@^`oM{_ukDJ6 zg5(zeLttjaV(uXV&x7*DBJcde+H*V3k_YJ7Jr&hw*DQ{LlgVhNjbiu#bSLJ* zm$a!n)rHx`BGRELnF-7uI}Ftfz=F&T02mA`if(z+qK^m^rMLUFo%`QeN_G28Mep4s zefQJtrqY`k9C^-bpO`rfU{`T`{VSQ!5V+useza4n;n~b)13>MCorM{S{E+3E&sLw)gW$$Zmk5AZ_+}nkYHZHa{?yMxXcFt`~O)YFz!fyS> z#ec8GH)*KHH>s*(gihYlGGRxSwzlOeUbjomwNB^E(z>+^J4Civ`(7jh2L+6(eacleRx@aYF~PC$F`3HkbJ?2+-(h>4c_qJ=mm0a;M1Jy zfYX1uD4drXIoBr~ewB=8Cwxz2J7zs%J>b3nF}MuY0sSx&EYFP9(BKCu&y3XYhAGdC z({M;Biab`M9jM7fS{BbOB3qSaO0?0Yl_u2KslYm&6dIHXJK3O==g8E-v!BT&Gd;~N zBavF}RlA$-fh=x>my(=#DkX=II~%iA#w(OUbLJE#YD1qT12kuM+OZoG!YJ3ddH6`k znZOh;=OO`2nuklo*1j}MpRyh@j>2;|9|JKhyh?;HP&4bj_`Ui)@Vz!2smSe|S4csF zw7#%j#2i@{fexY@yvG=|o`@!Z%^i>)qdN??u}VYDIIZ618u}VE)orixExhfV*E(Yt zxWrRlHJqX~q`uy?Hc_&^+o~1`iUxnv8foz?$~ zHrDF}50HK?KWMN#3ws68+nFn{O#+*J64~25*Mt)yRA@k<-d7rd2zj|WFh0f1$-~Mv z+lkTWN@H#P3y48I_zM%yqp6-0^^ht=lL7LZ0oE5c1|a+p#v)-@P;OTHkfn=4ZVJ!= z%gn*VOk2jZ$z)L${HD>`ZL@iW})BYr9YIc<@*X%CW>Dp^gU3oVT4>o@GTHTJUj%>WJ%r7ZJ;<&QT!;|OI z)-lgw2-j_eBqudz3f^d&^tf7UCU=k?9l5;-lR=VzAX~5rlWTonf&xP>ln_af@JByI zBHX~ZD~5Na4lZ%>w=6Sr+0rrgJHuOMwt`#mI}k~EZI;IqHwn$oRrMvW!QU;#c2pBDqWuk8dM`=v(t` zSm<54Gq+~pS{Asny8U3vIk9Ib0&%F|ECq&3iI^cvg75r6Sk3G>ChR|c`gIT8`K&ia zqAP>9#&q|he#c;N?TFa@VkBG${^1C*Tn10H7f4+Se+plq5kYdxl&uyi>g$lBcUbnw z*9HOVp$1d6W8!b5-k7sM3F}i$zMwq`UhgR8;**e8CiVK>X*IO+uxbeooY>&`gR2Ek z6;@AYW11!wqWq&0WO8RE4jCzFY1Y5my1l?Rd$fRerVMYCuVSu7rIyvIym+^W>n&gH z4Ob+ExrZR57UQujyQ&@c;w7gXFQ6C80s1=)=T&cXO#2>ECd0Uq(@Q`#JMxX!icY2- z$1iZ#-Ck+4aaZ)K?arC#b<>H~YVijLKQOV&HUVRjz>(@e8NCD9YU{RoUp?FM_}lVs zo<2YRik;H$>wr3$TRcyXm`@u+8qdqIs=F(@t`vOd+MkVaX{%ki-6Ur3udP0>vz@IA z+~CO+fesl3te11o)boY-{x^o|3UF&KwXsD#=4hK?nR1wk`e(QpUqM-@N)~7Nyt&Jy zu>|R8)JE~dsq{LszLD&G@UWFJ-?%mcAk+%@4&3&rMtvWa(zXP$3$IzgGd&ob&bk?k zTSU>a84}4*pH>;yyrii#X_HbVU9!7)x2fzAqIA~?B8wpF^=XJM)(Clw>JKd{Xjy;k7iFT zT(vo7z(h!!uq0vpq?h6#OkvK4&QUmv&P+s?1~HZRfGb1|TpkmY zaph6A)$D=RgIe4V78;+(1Om*_u*)(E5k0yiGh*&!7+82_;h~|S>yv{6#-Ct2gKZAMpaU~cQ-({n_S`&SGN-bn)^YgaU3Y_NQMvpp4=sq!5HRN!_u zO)_mZMz{jmyQMPPQc6k$h>dKM_Meh^)3$_0&*&E|lKSh#!`8Vmg};VEL}&{LbmzvQ z1Cl&1H1^`(>z&gQ6Sx;7kNurJR~*kCQ!A&&rs}T)QRvP-Tq2vj7&7>Wpr^T3zo(vy ze*?Q^n0~XFpeqjST7C|fKDNwSd*EF~D}hrN*K5$OJd4hsOg_qBSI!rpvq=ZQ^$`vc z5{WSzX9w0_OiVeWJZo~qaPd2y1LJ~OaaK-W+lAYv&)DqDN?9D5+4doG@O4a)FUzDX zXA<~I?Z2Npsn3B6%=3)*B#w^lDzkScPB!gI|IB@Lbr-G=598UBdQ`oCuG#U(KZ`D{ z=&N#}470skT5QfH_+RWij|ezVj!*ygxu>j3MRva)>i9{7ZC@sPWM8O-NzLGG`FeGI z{BLWBny-wsXkLu6TM=h8KQRj8ER0@4o2$MBKZ8ywSSFQs&_CM8ma$$6wT5aAc6&4D zdU(Ip5%G(zEc6#RHBtxe|1^imwT8|52o9fokqo)P7?0-$&E=KyO8vQ$w4%Im6@kCO zg81XsaIGl9;X#rvio&>^R_1=#K&>t^R|`q+j!pr71k&^FGQpon)XXp#7!>v+JGFFf z=w?q6r!g@Tj{vUX@mM9~22Rqc>ZfMxOndVtOr6tbYGav>k3(H#OvB=7t7W(BpgS)_ zys`Tg1v)Qfd}IV*fc8X-IgRr7z#Zgx-p-1YZz zQ{K2Go}TEFw)i^*2IqJ+?bV;;@p&JYa;z?FwS%eCgF2HH0zDS?9hdMkqF}Cg^cf{r z#W8mQ8$mpMl73Ntz+K_m3fCby=cn7bo|B%B3dx2juydai<{|i;pWdUs1JNwzW9}D` zi87f#$hB|aY-b_XTyNJy`1_XEwcS}OZ2jEdUZvr2E{T~V@Y+6PSK62tQ>N&DkLwHh zK7aVA4qTJ#!Cb6I%sZI1lIRg}%hEDD9@||01`XN~NebeOKm(d?@&FCi>6)kwfN_MV z0|ogAq_zQrj4C^ZN4pJuq4@yR&gU>4Lf-?_;(1Z^>B%C*h~3_Xih&N-AWRF!qm&{_~Pss54GLxMP~?@!8!cp za3lktH>Efgr7dWpFE;XivuC{^-Y)(vyP=8P&zh$)ixg2jf?Fejt;Q8L4k%d8H@SPZaGaoTj3nt1# zIn@Ql{)PSV0>p4%=#^iy#O5=b5+9y1NH9B>9#$xyo}y>iMBP^ZQ{uMc!=}vmJ^73N z#+SsQS#^xPG+WM)GLSQmb@}{D1Yy1pW*20X387>_e|*?x4}wJ-$Wefl&PO{P@Lsk6 zk<#yEn@ati1p;IOu(YJ2Hd7y#iiB!KMKSNgPVB)L_}z6L(z7mN$n2~&_*NIUh3HG6 zkSV6MATSe@4Qg#e_vSQjT;iqc7&>URi*)cHnV+h?--KjnD; z6Tbb=tuPBGE9?J?@&325pZ_0s+y8H6pN}TEhRRwiAIEe?ga#(O=rc|sg<-^KENLL9 zH31rpprVQjN-%^3{gQbWTM7}32xDZpAx2=z`cMoOb?QIqXkDZ3U2Iv~M!DV7-n$#- zpy_RI_PZx1(^8HLp zRQS?wvfFE&^(nv?qypX8mY~pJ?x%>KgRI{8#W*BR4ia?L*@zhF4b&DF?ZC6}d6Oz{ zu^22HtB?7$wKXTB$u9O>C*q@`*4t+sIp6Ep=-8O3i0ur99VfU8TwL6i2`4LOsqI$x zx$v1RVs_{uH8BzK+k2Ss$k@oJsGS>5!`Qg9cZVZB9AUmuaPbjqndmo|$Q{h9j&&!^ zTVlgG%Pv_(J_@D&Hkj+T5UvNic=3drS% zDikg8nGzog)D@D;5|*ef>6tP$rGe!e%P5wxs4_DJrAl{-|NUww11@D>3Pe=&CKE2j zU&^v6AxVo0%k3kJz!YFkgh&;cDby!pKEoZ$3@ZYX@lOO{3s;qbDr}ayB1_Z|{t^eI zE2!b{IsctA){MOsx)gTBW*>Qu!95s0AZ}*Wmii@tNbx1XC8bLGdC_0=^u0vievD5n zN8PAyY<0CYzAf=}_5y#EzVvLyUA#&5{ay66{(+w1&3eqrn|uI!gJEDqYECD2J-ax# zX6!c(mh_kGz8J0XtmW;Hb@^Q3o!2`4IqW9~sPlw+V({L=CBjkRJiid|aJbr2PSp=> z#8}gcJ56=C%gyZ^>%AT55i{qRyZT$uD(uk&&U8m~NUL8ppP)+FK!pikpoCBnE7w(? z-nx*@BIPnM2b1$5tS+cp3Y&&XXPyVN8uTPEO18B+4WT&X!Qqt6wU$ zhp?P~P&tIyXweiZ*I-v4&Mvtl`39B^B0r?L@{%|=CO*$s$Yh&HIWEIqo zsJh~pJ|$uBACL&uS=J)*LzgAhG-Yzwx8QQ)us8>8=x-Y(PsZN;RPW9oKX5WtyprAR z>GVR6NH9hwuFLHO)i&A^r9=VI{^;+PKniLnq0yU6kS$It01Qpg<)-VH$bP%_q9Z#P zo5(UG9tISN8L{*1k2UOj-e}Dvu-!5*P1M3^qwt44Uo&3a_6a!G z0ekZF;x;q}C+$ekE|ydAOg4KWlUsQbChU}}T{LNEDtAgH4E|>@cVY%P*kC{=dGAkaVu zav*~nkjR#r(%tkwvU~!2*k@UX>vivPPndDqr_)!jcYsQhax403&A5~9|Dl~W-WPsX zt-h0aZW=0zv)QEJYnW}VKxDy-+S`Xeh;a}0AB~n7z<0@sP-LTkD1uF0n8@bOD=#tt z`c<_K0e6riiKy`vl0eB6JqAa%47;3qj*7*W@7=JsoFu$`EclTx0JBm{JBtTR>f-ep82=hcrSJ?4m7N( z@lFvS%7icNAK`~7OKydFf;wDr%}J54@AO{cPQCZk63oF)oaCOGf~zM7gh@9j-2kfH z9W>(3JFz?W=!9|2GmZT=^0OBU5ct{l7tF`d|Ap@k(Dq-E7gq|4%V?6Bww4@bx5wl0 z&TNL+Hw9xiv#+77edOH;`hF@qKc<>GQFd>a&d3IyJ>>X#v^51cN2K74C8@S=Y}0;s zb+GSz_n44HuBkctuAXR%KEb3u&w;kfWQQm7M8w-uCja!1E2-vlf1hXFHZ{X=rsc#v zjXIz+&%}UkITGWXBB-uLw}!~`+N#-}F-mNYga<5nI2Qtenohs5c!X<+ZIK>lHNtV} z69LOY$~F(vKzL)uyv-2x?v1{?OwkaqC7usxz=XWE&=E13_Ad1B@1>Ln>z{>3{Te>%r#$XjkztILTBQDJc2_L0_&J7PLT_#lz{ygGiFrV`3 zLoVO+^_HSa7_?kIKas-uA;pT_Y5qbEI6ThVvnOPCn+lTs`-&wphhGarX9~TtP+w)KG*_Ann94P5oTW# zXkP=5vP6!a9oG?8JbyQa-yf003sS~NZ_nSi;s8jk3BfVf-E(%w?An<(7mn$s*YnwW zl&ALGZ_OOd!hP>W5G_dlXtjvl%A32(7Kx+p|E94G-t~P7ibtQnRv{KNn6GeldRE>p z%WX;yMkrHovBvD1l8GxzZ>QrOqgxak&wEt7BWBI~giM>>JESkfyN>#0s7J8ZKcH_9 zqMi=nn+^olCtnY{h|dtybHBf!5jc{L2aI$NGKW8&mfTdLfMm0$9kjih(ZJH)O{ffa zFe|M;Zf`$KM-$rup4P#faDZ%3evD%&#osv7?XZW`ti+|wWIPzY;K$(E9^?PnPdsJ<3lyQ7=H>efOvL3uIq!iE8OtK_TWnJcVeB>@!qAwZOl$`ekFYMKL+P?IfO$Y#mS)|@$>F$~%76Cqz= zNmxbvC$7t4SZU_u=PRNSC&slqCmX7&z}j>y&f8y1raqL^*okVzs;M5yR(0IB%mTpDTBJyQ#5$GlnCZ(ohL9jc#?JR##N4}k}$f+ctZrYu^>8p_AM8Hq|Y!ryBeKZnU#bDOBj_K=t#=7bi6vUiQ1tg-{+B+pyq^7k`QqkJ#3@+GYOy4 z_wRaP1Iw>=|GDK|EUxv!QAbEKOrY9igyuCyR~OJ&bV&l`(k5I-`dJi)+BKS<;7^m)+Lte>um|Z+s4+4Y za1eEI4;hWc_J_kSXJR1#`5Z1(XKA)ESuMLxZRdQU`xer2t6jB|{s&HU0NN=`tt`b{8%IQ{?)Cbriq$2Hw++tA0&YnK-Y zA!vf2%C@$6!HFGqLGW0;wUN()*jmfLkRzwu)68fR9gvbJ+LK%}TLpR0lpfYr*97Vt zKgq2@NFo(~=z*}>;_M4d#no%{mYnvETgjR(=&Ab2`MR_&SX^GT-=He?7C@ z$;-}W${x+q2d>!vH$rZqS!P3vzNMA7xQ_1?o-OKztyqbtnA{iAkK{=&kBsaiFx4Aq^eowq^$jW2k!EMIzO}* z_5B1~8_l%1TEEF@*)o|n2+Wic(X{t^KAMxuA?I{e$sq~OK9YWJVfT$ zxXjF_=klax>WjX$X$<#_UYBy49VD2&Rj1=+#IB}n`LPJ?diC*Rm7Caaogfe^Es90t zk?es`npdr&nTu3%1$7JF9A`6wVz$VEA&;Whu40WEH4_E;{1|Oc)hVpA&OCcdA2L@8 zX92x*e*$PbcZhg>q8|l=es!_&YeyYyeE@Ba+=2(AYd>J0h|eIvCBy`qD2ug)CBu$K zSB9V}-(=1vaCHYQJ%A1o6W)x=R(T}jdyrGK&%e0HbQ;Pm7dI;{DzyTp* zY*ujUgX6)78}GUCBn)fd`re`|{4X9yC|0F%xxJ%(%=8=YQA{^1Om{5Si}=NnH!=0< zWi&Cc@LS0i?>WvR$XB>;<w(Ry_ zew#v+=O_$pzt5wi0^ekc=@qJ2klL3fsuwg4Us&!r`SVk(A84S_AY+GaEQphKU`K%7 zxc(dca)?Jr$G8rix~bU}N+(clF~BylcSDhuZhV;IP6QMCrId6u*DGN-o=USdz!9p z%yw16uEM`H2&^`G9hw?2j}#wj%oN=#fU-hkqu|jwesHDL~ zv~&5!t+wDA&Hao!n+N8QUEnULDwR=~>#RsHj3Qh)79YYlrB@oDi8`g&yZu#PW;_Ag{g%18hB4fKJ9$?^M z#V4ob@!8g5wbZMqMM!AdTEjUf=}lcey*BE1O*@=MotR3~vvt!i!4Qid19b4#J*kTh zv@Ln6dDZ4lcJ(d)+1d>(uoGML5kcB*?2^_BdKT$pS$!JTie+j|;8hXRE#hMVmI>xm z&(10|L%0eI+sFVr=JfD7?aeG+9sKABELNz9=1t1R_MqGy3oBY*2(spfNvwAh+F>Pw z)LV4AmOno>8f&rs(9QV9yF*Z3OZF{IBT3QaeS9u9-jp`L62U#!aK0_~pCseNz-Z%O zw+6|^%trH3C?jBl6pLyo{^Jfh7d>$$?|hp`2zWSMr#0Zrj@%u>MbHM}d&RS=Nqv~8 zsdvbhpAd$)nb-*$%G>KfP`lKPlS|AdRxF@WjS)&PbUU_#hX-rjGE6Kopj=RAQ-6GM@))NFQ9z z%agmix_?E?JB2b*3T9YO8eluT_yrY}WJax7$Z&UCc=^28H!0e4>WE9U&x|GJXeTLW zg>Nm3XJ?4jT&L!!3I2tslvwJ(-MhzNpFWIDZfD~ZJBxdSc!(b7X(wdfLl7y@(NLyp z?L*C&n(eM-TX*#J-^WvuoKcgYzPRb#@UOZ$?7ubjKIpcP(V8M>C8s6?9xDx6i|IHx zWaQS^@z`|w7r)Vm(QYDiaT0}W(aKZ5V@N7DbsZ|X9<3aKGMmn5F}RLAW)@j-s#@4K zU`d`pb?`LN6fve)MRBKiWF~JW;^Y4~``COV?$#NxCZ(U3F>t|BFrYW`WqzfJ&pI@%C89A?1!@`56!=kx zp|Hfdx{=7?oxJRm5xgS(e--y0@KpVO{CF8zAuAENqU`Q)-Fqo}Z&?{h#%8x|%8^27 zJ7xR45+=oz^W@Cp=IeGTnQ1Eq4X83ib{NZX!?b8i-3;XTaEG1vO}7}9`frbFFAJiU zMOn&yBe4sk4hJYf2bulp1kR`^)SPiv7v}N(!GDk-b1}2+@rH*^T9@vq-o?5A?)NWN zS0vg(3a+m+%(kkjQmwng50;Bwn-DR-)Axxjr9lyUM!nf&MwOVM*}qV?jLk~aXQ3{9 zr8!7tX_>`HO;M8P26LHLy7jwcN(#magNG5bhL7!O>os|jXOApgPA;1CA?bdnum0>g z<%gk1;R0mnQG=_mZ+kOGA$n++oW?!}Fx`xKzCeB6XU2&oHcviywEA!u!q7Z_;L+7f z6oFiB%;Z>#ZtfQ!Za|ck`IPnJ+Rud-xhYvH-guy-$?(mlm!p&Sn~30tg21C$Fb@0N zW4#~K$(&uqYbQjolsuD-!&YhSSJ>gxiS7ZmSH{=BXD!FfUw)DO;i!4+i&h~v;rCh?8cp?5t!h?FFsxF3O{85`9_y6r|s9=E;#FSgkt-@W+w#qnnP z_|hO>+v@5FiTZ+3x9`Kj)~E6@{JJJBNeq4or(3eh=>jHR5@bh(FCO}8POcU4D*6V* zOJjT)Qp;pgssU5txgN`_>`dVtl&WEo#iF|MdGvJ^on>WI(X}(OQ_1ue>cL_aBhA-N zn%VTO@qist?0u~)UXR2t{^;ZRW_`Nc;cYds;)uYb`R`qk=S~+sEJ(SZ!gn^6KsDe? zP4Na3N%Df(`uB=qclpTNCzKZc?^3v|gcDDEKmE`y_oKDFcyBkoPiI2KH8R4|u$;Js zl)F;Kn&}TCBKnFq)aBW%5ARECOMO>04TDb^)!gug=NjQwjS#hJt_>^S52qf;g6g7UTu1nbzi0ERo-%c(=eiWaO#Dh_c>L}66{;R4+h~2% zlsz|kQ4y66uZ7nhskDtQ&rs0P9+!)_V_NT(aQ^CJ`i%p&@BJ?wQBqb?Optm?{B&uk z)-YL4M@k|BJL^1?F&Thtm6wDsJ>V1P#Ha&-%(dJTG zgUsx^!zBGgjHD_q3=C36T})E&LJY`D`U(qlFxsfP?*JGpX0QnaP-jU_NIM1pia)&9w~r4_sQ)9w@1&JzolUMwW?-JM(3IDTE>qd2<|lATNVlx{`o zh=AL2?JY7y_SHt1O+NtH2ywTH`5ExK-;E>n>*@ zsf#t$jJjO_dc6cTW4(uZF+- zaG_D|d5cddB0-h->|pN8ZWi9SnY$-7=C$b=q&&6g zcw$DCziAz~6$Z<=!fkd>94!^EsmU9ELyM3*3YI>T({f8#D0(L2z*(kS#IF@pGx>9^ zyD!?1o=86)7Rn>~Do)l%zAREM!c_L%%9U}tZcF8qho+S%jq|xZ>R?$+X}@xK!4O5u zwHtn&9A9M&8u(4$KqvLM${$bq*VOrRE!)i5&oO?T>=aM;lizsg`)2L%55BR5)Reau zGwXZ_gVRb(B0imHs69#vO+W`-xpzhFXc==gy#86DQ^fSiLHD($g==3odSyOx)(yqA z*lW21zZO-dDViJaQb2!Tjumprf71W){!GGq135Gw{cka6sdN_}Zh)&Yk96LACeKq6 zgLs9yiw)DAGHa8$Bx3G(%_(Gv@ajYBSDd~6&rW;4;;emH5Y2uWL(g*RZr#3Q#VdafY0R!aw(*PSj&`>7^*~ z$l-X?aG^K-9eI9T#&_sJ?%V3AkzD*&en{pI<~Mb+wS#$l9mF0s=V=!bN)1Z8nYWBN zYY>3yOqpLid5xmKcS299LFAyvBVA*H3{mRB`tz4`2o7GJIy>3k#Os@<)Xo(z$xlry zkOQ}lGjr6u2331~L>ba^Gwbu^5R`yIP!EquDQ(29EPER(t$8uGrt~7aiEUs~3F)J@OxNCrbdeXoHY^9azi7*l?P7ygL|^+- zRa9k0_o?KQ%7RlAyZRH-D-L2y`tzY2X>tO?&(jhD125%t#7{R~<_R!kVve#^G%ibk zzT%%?UB4L-o7>1tVfqYJknkp9%BF?1&Wtw!*?o_bEj*oZgnOw+>1=^PKGRc^D% z7@|CY-Abs~VSU z3_vr6`TKVfh!u8{wE5J>5H;P5vzj%}a8HATt$caLX&0~(tipWS!Q%9h!09r#+f+-s zQy8LH-Iw1+Ol#<4oO68a?a#W-I4?xHHRjWpDKx7*)$%(=&QX_|PV*H@3lr`dIkB9s z@Zh5Hv&zRDwo$jvn*oWV2TNKpQa3dJ@;SXpnX^R8}rY^Hog2qf8g zEf`$P@@#-U{?0K}ZNmW+>5AUXNJ6&L<9d+*>bU z-)Gmq#pn$OosiKvlVTW{pSk|zwT-Y?>i`Y2dtoHx75&jwN%@95t;R!gj<>85jXCtn z!?amVd)4j&%WP7(S88m=PHNwmf73XGxlodJs3dvTEUPuiXDy*@R%FpLNu>y$qFay1 z{AwxWQhoU5^Y@=q{c9pRCJV)!Cc2ZET~dPCZyHQPm}tIv@<~QkHf5D5Gb2s=$uc zWwAK5VTEbVL;XW;L;izrPmy9TjtjBmn(^-^c+Xe&cpgdjMZ)e876rCGPOYpWk8F)!o zpk38CrmFZNm6AkDrtrs+NrScTRq5j%UU%%r4npL}UHmqt1+#73KS*C}zwwl?r5+_7 zH|7u*@VrE^@s^XBPc)JpG3BdfV;gt1|QM& zpxKN#QHR}}XB*gv!R^ZWtbqqinoRt#&uLi14-qV1ZJCK6eK}pjGOF?jnHK45Uer4eeUQC*g|fT~pXiN%nCtwm=B~2+>+h3zxI^CA6qYQumlDyx(r_$Qi4Ijk<*3`<0Acr_UlOd?zK?SR~#b zLu9GU-?%_tt~bf#Cg0I~n#-=A=wqc`K(TP7^F`8Q6lZJ8bjn3R-_lKQ4T+enyi7do ztDXLpDZIHLD6J6qKH0J1!37ChS@~p@M~1rP(__;2Ei9e_U!fM0xBJ}sN=bNNB zjooZ3s6xdhrJYrFSgkw8y)yw`P4-4T7#ra@QBeOtmmxL8SjX2!Qm%WIs*uQTTx81p zvpu6B@=Ryt$yJ>g7J^}=45M1}6nz$p%b%SGHDfbJo*P36Rpn^BZ*-WiPdyE%90?yp zE>2z%W;r*x0HSTzNcOUa5o_EMt zJD^|0MkZj}Cc_H$@Ht*y78Ji2Z*X(i|7h7->h)Wf!2|KYBwyfceT~Yb+Y^i9K1-Jh znT*9~dIVq1>VB#@wZA0Wq0PhM?wc5=%A@OrWfK>*l2j5VPwWfmVzWLlcF6jqHeEz$ zPy2X%y|6L+gEWodhFgUjRpwl##@#xi(Y6Pf!d~C8`XD(LAScZyJ0(CCUu(@TtXI&D zsH{skrYuyTrOM7%>&YIXAoUU2sL3AY@-;HG_2BUAmm5%c`D?F>eEorNb_K&zOFf6` z5^WnLrGxKD4XjHoE1q8btkmM2(7mrnVS+MR?e+&ph7p=0YdNv*}}56fG+mu_JRzL|yV@J1KSMv|~=Dr5FnF^4D`JT;tus z)1e|aYTgtr(-xGfY+UNuFZ|xT+xJJ@9oh%{Vu~?Il`#7?yLq1KA8M~nh)vm2TEcFC z%``L}&OWipH`bo|a^nlTe(r2E8{hMXwT#Ov)gckeJ!r$@)aJ%gz>hs$C3$!wV*e`Y zR!J3vk4xC~<;cr0N)^;w$I2Ov9<@rFriDAy-_1Aj^GWX19mW%UQ=H#&M zl~p_9chH(+N;MdR`YJD$DOKTc=ki8C|m1v2%@q?p(3DRwC871Y#a0RlD^ zrz419NVq6ve+50sAgo21`9R$zNYm_zBJaE(>XuR2(L9%)XS#~Ky`i0Lo}unrb*Xgv zO*oMs(*%u3(7QWagM>kbzNE9qKi^Hl*iBrq(jUFu>*L$Z_}sV(6n6WKsOh>v?}btS z$P5?0stmf1O$$ucM$Ne)bBC3qU2i5dQk*doH;rFNY-gIrqS~L3p6|%@&MP0N)wTCq z_(m+RWqzQJNcBhL-h?J#0a>y<1AiMmXlOVeoA8&MU_gy@L8Tm+4-fS&yRjgU6=^kzUiGloOpF__0;Rbe9dPaY#E=Ktm)Ey-~U#`CXu17u(QBoWY zH;oopLHD!veO_h?U8NaITexol|J1j-WH!z+yheWgkpApU=J{9;p&=0EX>HTqI?T|6 zqdEz|Z>RDe{=)F7F4!*m2~BrPiZ#Qu!v|AeEw1eE%9uy<(&&+3WbA=;w{KDuFBiu8 zV$JeQ^DO)(uO&ur+*s_)4`P6hRqHcU=eo6hVr5{k^gGk(-#dTQM5|tF_`r!)R!g&Y zWE5-X21^1LwbO3piPlQ^#ICkyQbKMSxB6VnpmhFrBkvIv>qbI>sZ>v9yY$UInkz2+ zc8C>7?9vOaMx9l~&menfqvA=y#|PEBTZ{8L>AhUELnE3rx@`>71Cl;;J!+X|hzSUI zr*_UET0y*~@EX(P8NOFebC2IH*nY|IAmcN7?A@YRJDkyz;mJvQ)xcsO%%kj?)P&IrR`0Lx6ytofzhE2aGl9-7gjL5BCRQWG9y(3{C)Kz$Ik~pQM0b6pOL5` zE0KhD%_=lIkuI$Gw#KL4D>lp}|MX;WnX=g=^(M2jk0rW8EgIu*eeOcF?8DB!Ma-Js zU6I1~r6El79ch0q<0>Y|Gk$d0HuBMgu0R979Ty#2 z&odS3u&8*1!1DXGXI0MEhAJ+oFJExwxb!)w(~+yEGmn)OS@@NzCO~(pCrsB0<30OO zoQXcm->~5BJ%|0R2ade>{%l;m>+*4ut0X$vm=p}}n9P&w99DJeB@YLS4zMw(O~jJ)6E1jOmVub*D!KRBR;`XV4M9~*tKXZm`NvD?Rrm7$O7 z{f9K>H=GuMcR@5?eO7+sD7^P_frQ(*7WgxpnU-d>>~xX$7n%gIuvF^n&9^Ru54HX9 zx(ypUrC8k&pu3uaol=Zm3a_8LW~wLU!KL!xnd*jY@)Fkwd%|F(Q)0%|m#r6%g9*>2 z@ytbMgB*N&_>b!kxU1cnY#Zrn_~BI~C(LlEQsW7+PAB#42P$K-c?Xz4+ePQN*) ztTFbP$VAk^%u@wX9J-MN0iSC$VkAtZ2;vTb*iYYo-y9Pi%t)HrkTr0i0$e8ImgVx+ z+UQxXyd_mfcXEk&Ojm!C=X_#6XDa0F`puipvtQh6Cl}UyKe`JaaVL28$??K9oqMyH zpI4vS-kxcH{tauLY`}stZj`~s#nZ*s6dQ@V)h;csbA-8dYz}fI&`*-)v*6V{KFC@wo=#@y_x&U8}v`Sh`g&VSa zQTXs2YP(%2Y#Kbucvp{JAXZsWrf=r%`4-8u1{PT;!KsJet+6F44=(V=4iEEE$jq9K zME2`f!EK<+9$aS=ZWfAhD{1iFy6bT^_25ed)Q$@qA_j@B1q+-DWLu$oXi z!Ez$ydf(s^W@9Cky}IK)dgO;g?HdrLwk0xllnB=AK~5#ki3A;GWU?j{4R-Ipyw7`F zP_fSs^%648^Ae?aCfDCns``rU|j&ADDC~R^d!um2psK|+vIWDQJm!X+lUXeqwx27vTXDF3>;5? z({xdaaWIB4w8ythIjM9~kbR{L_>-e>zMA=p2krR-{0t&%dY781&ue^l z@=A=78#wXy!6~vI{_NLS3X7b)iPS9Z38#o=i^{e2371M)5PWCMFtQ^PpU|_jKHi6wK`|`=HHXMDl&MYsJ=KvtJE8M(#i?5T!}A^pBIS zKenFic&~bqqV97_EroGt+rT9hVaMh7aVz6+C81cq$>sG$^vlWWGLbLuZOyF|~xmYNoG2U6(Myjdf;I563d*yNLw7{d& zx77#&xQo@U#}zw=o;hr{kEh^t2Mee*aL*+I6SXl=rfi&WF$`V{E0JAq}Y(Eeeo z0ZJ$Oe1%BvfY+;9sSR)SUS(NF6Ou*8D(EN$&D|NV9?fXh@qTgX{g-bJ_KeA2Ydf)o zhq#>(&#AeV(=50x6hbn3hEgP{o@9v6tO$BXo+Y|+nE*vrL&lZAOmSMsBn2U$ujd!V z$ZvOLUrSTO0htO$<5m9a**>>XJy9o***sNn7AQY1!8tf&uh%jTyyBa)Ke6zAN-|$N zPdg$r5DqFjhh#u7i`dEMi9d25vxb-z_&H7~i-&p=^-O)wzRrEUn>bp}H`XW6sHFqV z(YwUIZpE6ogj9e(oY#7;c8?U?`XcDnE|{IX>scrFc}c=B3n?Zq`F;U(Nf6A#{gigCqVP%s^_445i$;#euG!VB zOh(!pU8j8F)ST)5jWzU)|JTvc(eXYnuayaYqt65;3bMvaCWD6(E%q z^qq7gdJvSUxBrp<(}`M=>AaDnRepT%j3e$D$9f5fntLTfzcwu)4u;Y_>9iEss3HmF z_*&A+1om{JRTDEwH(g{iR=8?hY3l0ozQ2@B)MN1*V|}VxOvCL%p?Sm04WBfd152V$ z2hPEiP*1oRbHAT*7QEML>;7nTERUtke*Pwn&apd$-82~wWk=51KF?$pJz?EmJSmA> zGoP=@xf+Xhym!H);6Y`6-DugHqyCqh)paqwF`s;mWv@>seeqJikU?ZcuCkI(a=g{` zwyuU!&f_W$2k+Yr(%1Xz=@?a!9G}!pdcSjVMMkyw)SnS)t1K6*J8L7@{nfVp^4Oh1 zgwf;}%+?_HWu~Jg=~V`~!xs;W9ZBK?TYx0RBsFR%+hnZH1SLOumdHNmeC?7KU1Q3dXFzqpEQrYW%`(Hq6phJN>h?z zH=2?JtJUMngj-Y}$RT4Wuy^vJI_I4`+fnn@%)jELMY8~L>U|Xth1>eES|HeYZoC%0*;4Nph>F znP`*XH#ON_qzOt=Y24`ozJ!llgM}`wF|Yf1JPPq#)V_Kxe74Rpk1!LZVKS7sYKYa;>{eGS)xZ}4k{|D%Td&Skx_fqM^P-xRx9&X|aI@lF+UjTTZ zb*IHa^pQcC!FQXdB;*Q``)SCzQxOvW60`(CQ*h8-5c2VmiN{F^vH%bd!y(U{r^gwH zJjoVwsEbEmeYas-p*-#Of=Z+3gWyPeyz^wzQq82_5j9)trT1iMEZhONgl1W5ef{8}3}}IN;nh<8Ey15Wf6Tu1Y-h z!9xfllHrcA31eYc zVbY>%yTQ=pW%JqoRa^g)DEOBIM8f(Vt@ijjR}Ts?hZxDnl6r?G>5OtZ0;-6-T75WW zEES)s3k)+~r^_69InLu(mYIRJ9a6Hm80ZdT%Mf z$m_LSkb2I^%~GJwXQnvU%=|5Rjfxnnbu>I8g4I9uv?HPDlQEfamZ7kZ7|jY|R;q{y z5ZYvaXwngP#G1c56WTeNd_?S#$w6m2u3(uq1#5p)KOw0c*@3L)gD7E1OqhhPhaVW_$@6=V#+p`1F?0SPQJyDA>wk9C7I@$i z`7yIsJ%aU2V7zD_+vsDT%(<$xn{X<(qeUAvSF)3_@e=P`V$!dSmy`zRGhsMtLLErQ zsB_9m#OzgTWsA}S6(>BG%l6+%F?<_wuZFfe#yT?6hSb3>fO3RNje^IoUvF%k(t)fH zhB^5P+A06J%B5)}iMmR8<)G0}Eb{G(Iq2APU}dF-c)tnswB?J#nopD`g=f%qfg91) zPC}hUbtJxq=P>$Tq$&J;kGhQ}UiG#2F5=1hbk5^_xA^;R?C@B~=|=K1uS6veGoE;B zM)!a?Y=Lzm6E#(aJN>P~e3D--78EUU+`$boIZF1hZo-#eM zc+;`8WbEyiF-q}^tX#x+f`1Lnp8L zJbwAnsrJbW;jm|Q%xCz-ZOKLWtW_%rnpu3A^Q4cI&``Tgk-HI@w$(+gc&SRdLG=;! zdA?`fxRZo^nyq{9XIIoqj_5A;ibTu0Y|V7N93mq<~MZR{K7?M zb51hN*VmCUdI#iztJ_T6l-lGEVS)^VxzyLzq_2q4X%o+0Un~g!ArCz5SbYC&CahSh z<&}N0&iLTxFPvGz#UZKs4Tu*-KaQMoC4Xi5W$saOvLBI{`{%BG4W6(beoVT4h{zx} zOCWr`JZ){`vC#R~*bAL~4qt^p6LdBUv=i{8&-G)r^B*Q?A9B18J?QF6H@Uz5Y`5o_ zjrGTGk>+N852xQI-ugCMSvu}>JW1+;)~T+@%5-gZbY0s^+ZjpagTm#07bowL&oL5( z%6JB{RV3fu$T$*dq?w|5iC;Y4y7eYcWjK%Sp;(ZrhWtITbAD7o(y3{J=WZ79fO>CcmsI9C~{6EN737;pK^LMs%jm?K0v5iMeh*LM?Wo zLGC459hDcwIThB32nz#?W9+jT_oPlr2Yw{1&6B(jCL4$gc#vti9;%hS_;B8+w*pwt zKg?edz{~WO=<>0$=lh#(jCu}3ZcZUXkY72O2h!3#{LF&XFIA0tz*~F{|6ufo@F{e2 zTIP~A);aUO&W?(aCT3GZ$5@QT3)+&*o{G_z%rlrg*Q0$_Q%`s1_DjgVkF>QD_Sqk4 zI=d)xydyrQ2T?4BH-RNxZ7L%M)NH9oc+&Gh+|wE^6=(G5Ywsu$-qVWG$UC4Xe&(Xq zNfp=phOtgqhunE3@L=y?D64S8VhrPAI0sXUW6)$5XvN@M>}?}XZl>E=$1LZ*$g`c| zZ+SIjg>6xccn*q@96Ph0KbtN4MQWs=@3r{H9bRX%Jt~Fb4Y)%N>ll8u27W8+MnUnx z{4dGJ){p0kjuVdP7G2geAAA(FGE{#5!h|jHD?KNVAirqCaf<`lER(~NWeKbK*cr1k zLZ4*_a!B8e?xB}tv<2=T(l==z$_oJhZQ(d|N#n&K98=EM7~qv)#LCW6GPJM^8+0 zk+DL)qLRynggFsNM;$8lrY?b$#*6Qt+m{(t-1#CWMV{>`-FKAAQU262FZvT|dQ|FZ z{khWAjLv?N0#-M&U-0`M2UT>tv(maVzpDyFlr7kfKJTKpjERmn=wFOdVkiH>!4k+w3yf&^h;6_cOGP#6?^&f46? z%Gr<{0fB&U+s@BU+V=6!{bqSw*{yrFukJkGI{tNqeCM@a)Xn?p%-{CAd-k)`U)sT|!-yO#>tKd4w|1}uSmz+=;B5Wtd>0fK6Wf*|bVs7` zmlP#sq_lOk`4rH0ZfF;4Gm}5c5sDkw|0qWo61N0$=SL8jF5osC4R;lHjN1bnz%L;o z#DCl%o8`Cf2kHRsLBep;65M~>hCm=e2w;#%pibQR?;fClmNrWPE#XRS-SeybW-Y>S zoaXQR06qHIFI=s-{%!AZy}%vgwyjohS8+!ul<@Wy^6e6W01bD2`!3uuu8+7qu>A{3 z!nbE*JMB^RoQ|5J2A`Ivy(z{H-xA?C+5bg?P?X>fQv^kX z{jjcRoSN;_lkJ!80Cw@OH4v-?mIX_KT^-EPSZ6Z~77dmGD}pt_&W>;TpVOM}s1JFp2@9c%^0f>pp8U^%cn*viw<3he+k$Jp7K zV8M{!5&}>;4XW66R;&%0qhRe0Xw;3T+o{hZ60kk z;Y~9?f%El&+FT@ZuWSGYX8%SwBvgwzf4+M@|>*7x!*_+ zUt2a`GWOrGI!y4FJ(K@NSlffbVVo_DCWL}-A|l)wt{kwD|3p07$mg&7pXEWgI<~h> zCBY#)VEa#qPY5@E0LtLn!pD8v$Z#j}!yV(W-zE)L|1V6pH9DZ4pD1v%_dxC2qrhGN zb&SKCz=mrbx5u^o^V+Xb<2bQ-efvJ3EN&z?+V-~1$A6+IxOQML=nhP4IGe?Nwrv-Gzvn8RuLa8g3#RM@-M^TkCwEp}N9nhz z3;cy8f}2lb{=3aXp{Q+^{K4k828R2;W%=9e`lB{(Y1Jk}aTbTu|KIm-Ssd;hXFtGx zvmCAruI%q}yN-Y|+b!YtTgShTw#wq$<5pj{t#Q--{sr?l^BX&7JiGHBn;urp#2)?E zT#1wv#=}qmuwelhL1>8}aKRDD!O|v<3TPZy+&aZ+ zHtrhkPI9oKi;11JnWTfI9U9;oSjz=%uL}|u1Zr@z+??Ft)RG*mYT~i;%-Y!*$RF&W z;4(8>Xcuk(yh?&SH_?eD7H#5!#{R^oz>BE>tfB@$T}J@1SXjHE0kkUvfKO*@4*>7V z0=U-_K*Uzy&7K0NSsp;g)&Qhd06@+TNWFz{wEhAr7T!gBnAw@wZ=>v=aCi$|d7-fwo=qXhS=*rnK~U)C1a`-S0jC`Q zM1FtIlKhk)43Gm<7~nXNihx76B?$i|L4deZf}5wmB?uM%iv*#9z!lY)TK_Nic!TsAF*>A6b>(Vcu0i67|Q2|AMc?%#B zvcp?!o$XS?T?5{n8t)n};L?Dp$M5lOW;*`Kc>kI<*)lXCoWBE7Y!EmIiGpp9d54{$ zU^_<*l=(ew+?{_Bs4#A{JIA-_Epgr)=Q&^?DBziQk7q{)?iZrKF?cKU{oC{Zbs~*7 z9>8xP1^+M}B;dn;OA#pZ|I>KzJmKb4@t?@&4>QiKkpLPk07c<)q?^%tdnmuv5eVTs zhq8IPt&+Gq|0Wv1)_$qw{}#k>-f=6CZKgoXO@X{3ka%$bn__`f&Q>Tf18)a7y(zb}+}~l5kPd!P)`+ z-$Et6>)jm6X1gZf&G4xUgwM_4;zGL}8W&1|w9|Gt{fmbN9>f6raJK!KgV>6!KV9`U z@3vD-4zBj5KxWL^(&1+s3>Rj>fDZ?o*aL3e*~Gzow=2N&=G$*Z*v`@Y4Kw|5zPhDr z03ZayEea$I6aH7>7V!9g^y~j5-2PFa{s%2G_>G#jIr~rb=mBSdqwb9MfcHth=h+nTdmU+_ZZ=Dh8n zxTgOy72HxC#80e^grNYu4gZ6if&tOwx5ov_?DDvO!`e_>Z26ad$^pm)<6!kBr2d7V zaUNj@Vm1NW?_$&D*9LY(*v+}zKVj2}t0@qbB=6}1SZ4LN-ZdGeDEXEmQ z;Q~5`!J2~vK&sjrf+o(6#?opkP$)1tMjGqLpEAdoZ8wI&a%*U9LI$Bz=5}@;-wVR850_)vO+zA3_`HV+;I)nK+0!l@f-g&8 znGAf7z5w+J;f(_#gb)(OqXAq-?Xd+U1d7Dt9~1_M?6nU#6pA+vpf3pAGK5`Y6G9;N z@BkqQMeMN|I24KBKVZGlUL6N)0k2&MP@ga!?*UUqK>twRUR#C3fVCLA`V5Ri7~fWL z_2KIu1c?Bm0p7hxK{$RnV6cF)?J0+Vl7=T{s+nyZ{Z~CqjXz5PReSw2SY@At+&B#CYw( z;6i)&2hjG~IY7kMHIy)NkFE&|{lO;!t628P9F7p&LxUmkbsPfJCxmCyz|V4{_V`ZV z`S{*g28Hjr7Y0Y{jZttwBKUj(94fwyAOM^3YyrTWf_rTSa1r?T!r*{J_Ov04Z@;+u zfEm?pU4semk~fi;^`!?Knl6X&H) -#include -#include -#include -#include -#include -#include - - -// Constans for M3UA, see rfc 3332 and 2/1056-FCPW 101 86/P-1 -// Constants for decoding M3UA common headers -#define M3UA_VER_OFFS 0 -#define M3UA_CLS_OFFS 2 -#define M3UA_TYP_OFFS 3 -#define M3UA_LGT_OFFS 4 -#define M3UA_MSG_OFFS 8 -#define M3UA_MSG_LENGTH_LENGTH 4 - -// Constants for M3UA protocol -//Msg classes -#define M3UA_MSG_CLS_MGMT 0x00 -#define M3UA_MSG_CLS_TRNSFM 0x01 -#define M3UA_MSG_CLS_SSNM 0x02 -#define M3UA_MSG_CLS_ASPSM 0x03 -#define M3UA_MSG_CLS_ASPTM 0x04 -#define M3UA_MSG_CLS_RKM 0x09 -//Msg types -#define M3UA_MSG_TYP_MGMT_ERR 0x00 -#define M3UA_MSG_TYP_MGMT_NTFY 0x01 - -#define M3UA_MSG_TYP_TRSNFM_DATA 0x01 - -#define M3UA_MSG_TYP_SSNM_DUNA 0x01 -#define M3UA_MSG_TYP_SSNM_DAVA 0x02 -#define M3UA_MSG_TYP_SSNM_DAUD 0x03 -#define M3UA_MSG_TYP_SSNM_SCON 0x04 -#define M3UA_MSG_TYP_SSNM_DUPU 0x05 -#define M3UA_MSG_TYP_SSNM_DRST 0x06 - -#define M3UA_MSG_TYP_ASPSM_ASPUP 0x01 -#define M3UA_MSG_TYP_ASPSM_ASPDN 0x02 -#define M3UA_MSG_TYP_ASPSM_BEAT 0x03 -#define M3UA_MSG_TYP_ASPSM_ASPUPAck 0x04 -#define M3UA_MSG_TYP_ASPSM_ASPDNAck 0x05 -#define M3UA_MSG_TYP_ASPSM_BEATAck 0x06 - -#define M3UA_MSG_TYP_ASPTM_ASPAC 0x01 -#define M3UA_MSG_TYP_ASPTM_ASPIA 0x02 -#define M3UA_MSG_TYP_ASPTM_ASPACAck 0x03 -#define M3UA_MSG_TYP_ASPTM_ASPIAAck 0x04 - -#define M3UA_MSG_TYP_RKM_REGREQ 0x01 -#define M3UA_MSG_TYP_RKM_REGRSP 0x02 -#define M3UA_MSG_TYP_RKM_DEREGREQ 0x03 -#define M3UA_MSG_TYP_RKM_DEREGRESP 0x04 - -//parameters -//common for all adaptation layer -#define PAR_PREFIX_COMMON 0x00 -#define PAR_INFO_STR 0x04 -#define PAR_ROUTING_CTX 0x06 -#define PAR_DIAG_INFO 0x07 -#define PAR_HEART_BEAT 0x09 -#define PAR_TRAFFMODE_T 0x0b -#define PAR_ERROR_CODE 0x0c -#define PAR_STATUS 0x0d -#define PAR_ASP_ID 0x11 -#define PAR_AFFECTED_PC 0x12 -#define PAR_CORREL_ID 0x13 - -//M3UA specific -#define PAR_PREFIX_M3UA 0x02 -#define PAR_NETW_APP 0x00 -#define PAR_USR_O_CAUSE 0x04 -#define PAR_CNGST_IND 0x05 -#define PAR_CNCRD_IND 0x06 -#define PAR_ROUTING_KEY 0x07 -#define PAR_REG_RSLT 0x08 -#define PAR_DEREG_RSLT 0x09 -#define PAR_LOC_RK_ID 0x0a -#define PAR_DPC 0x0b -#define PAR_SI 0x0c -#define PAR_OPC_LIST 0x0e -#define PAR_CIRC_RNG 0x0f -#define PAR_PROT_DATA 0x10 -#define PAR_REG_STAT 0x12 -#define PAR_DEREG_STAT 0x13 - -// error codes: -#define PAR_ERRC_IVER 0x01 -#define PAR_ERRC_UNSMC 0x03 -#define PAR_ERRC_UNSMT 0x04 -#define PAR_ERRC_UNTMT 0x05 -#define PAR_ERRC_UNEM 0x06 -#define PAR_ERRC_PERR 0x07 -#define PAR_ERRC_ISI 0x09 -#define PAR_ERRC_RMB 0x0D -#define PAR_ERRC_ASPIDR 0x0E -#define PAR_ERRC_IASPID 0x0F -#define PAR_ERRC_IPARV 0x11 -#define PAR_ERRC_PARFE 0x12 -#define PAR_ERRC_UPAR 0x13 -#define PAR_ERRC_DSU 0x14 -#define PAR_ERRC_INA 0x15 -#define PAR_ERRC_MP 0x16 -#define PAR_ERRC_IRC 0x19 -#define PAR_ERRC_NCFAS 0x1A - - -// -------------------------- -// Basic Test Port functions -// -------------------------- -using namespace MTP3asp__Types; -namespace MTP3asp__PortType { - -//external functions -//########################################################## - -//f__MTP3__SEA__connect (for MTP3asp_PT) -BOOLEAN f__MTP3__SEA__connect(MTP3asp__PT& portRef, - const CHARSTRING& Hostname,const INTEGER& Port,const CHARSTRING& EntityName,const BOOLEAN& Http) -{ - return f__MTP3__SEA__connect__extern(portRef,Hostname,Port,EntityName,Http); -} -//------------ - -//f__MTP3__SEA__disconnect (for MTP3asp_PT) -BOOLEAN f__MTP3__SEA__disconnect(MTP3asp__PT& portRef) -{ - return f__MTP3__SEA__disconnect__extern(portRef); -} -//------------ - -//f__MTP3__SEA__connect__extern -BOOLEAN f__MTP3__SEA__connect__extern(MTP3asp__PT_PROVIDER& portRef, - const CHARSTRING& Hostname,const INTEGER& Port,const CHARSTRING& EntityName,const BOOLEAN& Http) -{ -#ifndef TARGET_TEST - if (portRef.dynamicConnection && (!(portRef.connectionUp))) - { - delete [] portRef.hostname; - int len = strlen(Hostname); - portRef.hostname = new char[len + 1]; - memcpy(portRef.hostname, Hostname, len + 1); - - portRef.httpport = Port; - - delete [] portRef.entityname; - len = strlen(EntityName); - portRef.entityname = new char[len + 1]; - memcpy(portRef.entityname, EntityName, len + 1); - - if(Http) - portRef.MTP3_open_channel(TRUE); - else - portRef.MTP3_open_channel(FALSE); - - if(portRef.wait_for_open()) - { - portRef.user_connect(); - portRef.connectionUp = TRUE; - return TRUE; - } - } - else -#endif - portRef.log("Dynamic connection feature is not active or already connected."); - return FALSE; -} -//------------ - -//f__MTP3__SEA__disconnect__extern -BOOLEAN f__MTP3__SEA__disconnect__extern(MTP3asp__PT_PROVIDER& portRef) -{ -#ifndef TARGET_TEST - if (portRef.connectionUp) - { - portRef.MTP3_close_connection(); - portRef.connectionUp = FALSE; - return TRUE; - } -#endif - return FALSE; -} -//------------ - -// Test Port constructor -MTP3asp__PT_PROVIDER::MTP3asp__PT_PROVIDER(const char *par_port_name) - : PORT(par_port_name) -{ - MTP_fd=-1; - httpport=-1; - hostname=NULL; - destinationname = NULL; - dynamicConnection = FALSE; - - const char *str="b303d76a-266c-11d4-b8f5-08002090d3da"; - int len = strlen(str); - iid_string= new char[len + 1]; - memcpy(iid_string, str, len + 1); - - entityname=NULL; - Filter=Loop=-1; - Sut_Pc=Tester_Pc=-1; - Ni_is_set = FALSE; - MTPServiceType = MTP3itu; - M3UA_version = 1; - M3UAState = AssocDown; // unnecessary... - mtp3_ni=0; -#ifndef TARGET_TEST - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; -#endif - forward_pause = FALSE; - forward_resume = FALSE; - forward_status = FALSE; -} -//------------ - -// Test Port destructor -MTP3asp__PT_PROVIDER::~MTP3asp__PT_PROVIDER() -{ - delete [] hostname; - delete [] entityname; - delete [] iid_string; -} -//------------ - -// set_parameter -void MTP3asp__PT_PROVIDER::set_parameter(const char *parameter_name, - const char *parameter_value) -{ - log("set_parameter: %s = %s",parameter_name,parameter_value); - if (!strcmp(parameter_name,"Hostname")) - { - delete [] hostname; - int len = strlen(parameter_value); - hostname = new char[len + 1]; - memcpy(hostname, parameter_value, len + 1); - } - else if (!strcmp(parameter_name, "HttpPort")) - { - httpport = atoi(parameter_value); - } - else if (!strcmp(parameter_name,"EntityName")) - { - delete [] entityname; - int len = strlen(parameter_value); - entityname= new char[len + 1]; - memcpy(entityname, parameter_value, len + 1); - } - else if (!strcmp(parameter_name,"DestinationName")) - { - delete [] destinationname; - int len = strlen(parameter_value); - destinationname= new char[len + 1]; - memcpy(destinationname, parameter_value, len + 1); - } - else if (!strcmp(parameter_name,"Filter")) - { - if (!strcmp(parameter_value,"ON")) Filter = MTP3_ON; - else Filter = MTP3_OFF; - } - else if (!strcmp(parameter_name,"Loop")) - { - if (!strcmp(parameter_value,"ON")) Loop = MTP3_ON; - else Loop = MTP3_OFF; - } - else if (!strcmp(parameter_name,"NI")) - { - Ni_is_set = TRUE; - mtp3_ni = atoi(parameter_value); - debuglog("Network indicator is set to %i",mtp3_ni); - } - else if (!strcmp(parameter_name,"SUT_Pc")) - { - Sut_Pc = atoi(parameter_value); - } - else if (!strcmp(parameter_name,"TESTER_Pc")) - { - Tester_Pc = atoi(parameter_value); - } - else if (!strcmp(parameter_name,"M3UA_version")) - { - M3UA_version = atoi(parameter_value); - debuglog("%d",M3UA_version); - } -#ifndef TARGET_TEST - else if (!strcmp(parameter_name,"DynamicConnection")) - { - if (!strcasecmp(parameter_value,"ON")) - { - dynamicConnection = TRUE; - } - } -#endif - else if (!strcmp(parameter_name,"MTP3ServiceType")) - { - if (!strcmp(parameter_value,"TargetM3UA")) - { -#ifndef TARGET_TEST - error("TargetM3UA not supported, since TARGET_TEST not in Makefile"); -#else - log("MTP3ServiceType is set to TargetM3UA"); - user_map_p = &MTP3asp__PT_PROVIDER::Target_user_map; - user_unmap_p = &MTP3asp__PT_PROVIDER::Target_user_unmap; - MTPServiceType = TargetM3UA; -#endif - } - else if (!strcmp(parameter_value,"TargetSTC")) - { -#ifndef TARGET_TEST - error("TargetSTC not supported, since TARGET_TEST not in Makefile"); -#else - log("MTP3ServiceType is set to TargetSTC"); - user_map_p = &MTP3asp__PT_PROVIDER::TargetSTC_user_map; - user_unmap_p = &MTP3asp__PT_PROVIDER::Target_user_unmap; //Same as by Target M3UA - MTPServiceType = TargetSTC; -#endif - } -#ifndef TARGET_TEST - else if (!strcmp(parameter_value,"M3UA")) - { //M3UA - log("MTP3ServiceType is set to M3UA"); - interpreter = &MTP3asp__PT_PROVIDER::M3UA_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::M3UA_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::M3UA_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::M3UA_user_unmap; - MTPServiceType = M3UA; - } - else if (!strcmp(parameter_value,"MTP3itu")) - { - log("MTP3ServiceType is set to MTP3itu"); - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::MTP3_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - MTPServiceType = MTP3itu; - } - else if ( !strcmp(parameter_value,"MTP3ansi")) - { - log("MTP3ServiceType is set to MTP3ansi"); - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::MTP3_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - MTPServiceType = MTP3ansi; - } - else if ( !strcmp(parameter_value,"MTP3ttc")) - { - log("MTP3ServiceType is set to MTP3ttc"); - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::MTP3_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - MTPServiceType = MTP3ttc; - } - else if ( !strcmp(parameter_value,"MTP3mpt")) - { - log("MTP3ServiceType is set to MTP3mpt"); - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::MTP3_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - MTPServiceType = MTP3mpt; - } - else if ( !strcmp(parameter_value,"MTP3bttc")) - { - log("MTP3ServiceType is set to MTP3bttc"); - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::MTP3_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - MTPServiceType = MTP3bttc; - } - else if ( !strcmp(parameter_value,"MTP3iup")) - { - log("MTP3ServiceType is set to MTP3iup"); - interpreter = &MTP3asp__PT_PROVIDER::MTP3_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::MTP3_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::MTP3_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::MTP3_user_unmap; - MTPServiceType = MTP3iup; - } - else if ( !strcmp(parameter_value,"STC")) - { - log("MTP3ServiceType is set to STC"); - interpreter = &MTP3asp__PT_PROVIDER::STC_interpreter; - user_map_p = &MTP3asp__PT_PROVIDER::STC_user_map; - user_connect_p = &MTP3asp__PT_PROVIDER::STC_user_connect; - user_unmap_p = &MTP3asp__PT_PROVIDER::STC_user_unmap; - MTPServiceType = STC; - } -#endif - else - { - log("Unsupported MTP3ServiceType: %s, falling back to MTP3itu", - parameter_value); - } - } - else if(strcasecmp(parameter_name, "forward_pause") == 0) - { - if (strcasecmp(parameter_value,"forward") == 0) - forward_pause = TRUE; - else if(strcasecmp(parameter_value,"ignore") == 0) - forward_pause = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. Only forward and ignore can be used!" , - parameter_value, parameter_name); - } - else if(strcasecmp(parameter_name, "forward_resume") == 0) - { - if (strcasecmp(parameter_value,"forward") == 0) - forward_resume = TRUE; - else if(strcasecmp(parameter_value,"ignore") == 0) - forward_resume = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. Only forward and ignore can be used!" , - parameter_value, parameter_name); - } - else if(strcasecmp(parameter_name, "forward_status") == 0) - { - if (strcasecmp(parameter_value,"forward") == 0) - forward_status = TRUE; - else if(strcasecmp(parameter_value,"ignore") == 0) - forward_status = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. Only forward and ignore can be used!" , - parameter_value, parameter_name); - } - else -#ifdef TARGET_TEST - if(!parameter_set(parameter_name ,parameter_value)) //TCP parameters -#endif - log("Unsupported parameter: %s", parameter_name); -} -//------------ - -// User map -void MTP3asp__PT_PROVIDER::user_map(const char *system_port) -{ - if (user_map_p == NULL) - error("Parameter MTP3ServiceType should be set to TargetM3UA in TARGET_TEST mode!"); - - (this->*user_map_p)(system_port); -} -//------------ - -// User unmap -void MTP3asp__PT_PROVIDER::user_unmap(const char *system_port) -{ - (this->*user_unmap_p)(system_port); -} -//------------ - -#ifndef TARGET_TEST -// User connect -void MTP3asp__PT_PROVIDER::user_connect() -{ - (this->*user_connect_p)(); -} -//------------ -#endif - -//User start -void MTP3asp__PT_PROVIDER::user_start() -{ debuglog("user start ordered"); -} -//------------ - -//User stop -void MTP3asp__PT_PROVIDER::user_stop() -{ debuglog("User stop ordered"); -} -//------------ - -//Event Handler -void MTP3asp__PT_PROVIDER::Handle_Fd_Event(int fd, - boolean is_readable, boolean is_writable, boolean is_error) -{ - if (MTPServiceType == TargetM3UA ) - { -#ifdef TARGET_TEST - //In case of target Abstract Socket handles the received message - Handle_Socket_Event(fd, is_readable, is_writable, is_error); -#endif - } -#ifndef TARGET_TEST - else - { - int result; - - result = MPH_ProcessConnection(myConnection); - - if (result <= 0) - { - MPH_CloseConnection(myConnection); - if (result == 0) log("Connection closed by peer."); - else log("Error in incoming message."); - } - } -#endif -} - -void MTP3asp__PT_PROVIDER::Handle_Timeout(double time_since_last_call) -{ -#ifdef TARGET_TEST - Handle_Timeout_Event(time_since_last_call); -#endif -} -//------------ - -//Outgoing send -void MTP3asp__PT_PROVIDER::outgoing_send(const ASP__MTP3__TRANSFERreq& send_par) -{ - MTP3__Field__sio sio_field = send_par.sio(); -#ifndef TARGET_TEST - int si=bit2int(sio_field.si()); -#endif - - OCTETSTRING sio_oct = bit2oct(sio_field.ni()+sio_field.prio()+sio_field.si()); - OCTETSTRING bttc_oct = int2oct(stored_bttc_octet, 1); // additional octet for MTP3bttc - - //Message sending by testing on Target - if (MTPServiceType == TargetM3UA) - { -#ifdef TARGET_TEST - OCTETSTRING tcpData = int2oct(1,1); //Message type - tcpData = tcpData + int2oct(send_par.data().lengthof()+15,4); //Length - tcpData = tcpData + sio_oct; - tcpData = tcpData + int2oct(send_par.opc(),4); - tcpData = tcpData + int2oct(send_par.dpc(),4); - tcpData = tcpData + int2oct(send_par.sls(),1); - tcpData = tcpData + send_par.data(); - send_outgoing((const unsigned char*)tcpData,tcpData.lengthof()); - - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - TTCN_Logger::log_event_str("Transfer Req message sent: "); - tcpData.log(); - TTCN_Logger::end_event(); -#endif - return; - } - //Message sending by testing on Target - if (MTPServiceType == TargetSTC) - { -#ifdef TARGET_TEST - OCTETSTRING tcpData = int2oct(1,1); //Message type - tcpData = tcpData + int2oct(send_par.data().lengthof()+15,4); //Length - tcpData = tcpData + int2oct(0,1); - tcpData = tcpData + int2oct(0,4); - tcpData = tcpData + int2oct(0,4); - tcpData = tcpData + int2oct(0,1); - tcpData = tcpData + send_par.data(); - send_outgoing((const unsigned char*)tcpData,tcpData.lengthof()); - - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - TTCN_Logger::log_event_str("Transfer Req (STC) message sent: "); - tcpData.log(); - TTCN_Logger::end_event(); -#endif - return; - } -#ifndef TARGET_TEST - if (dynamicConnection &&(!connectionUp)) - { - warn("Connection was not activated via function f_M3UA_SEA_connect."); - return; - } - - unsigned int offset; - int MSU_length = send_par.data().lengthof(); - int M3UA_par_length; - int length; - int labellen; // sio+routinglabel length - - switch ( MTPServiceType) - { - case STC: - length = MSU_length; - memcpy(buffer, send_par.data(), send_par.data().lengthof()); - break; - case MTP3iup: - if(si==4) - { - offset = 0; - labellen=6; //ITU-T:sio(1byte) + standard telephony label(5byte) - length = MSU_length+labellen; - buffer[0] = *((const unsigned char*)sio_oct); - SetPointCodesIUP(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, send_par.data(), send_par.data().lengthof()); - } - else - { - offset = 0; - labellen=5; //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - length = MSU_length + labellen; //SIF+SIO ; - //append MTP3 MSU - buffer[offset] = *((const unsigned char*)sio_oct); - SetPointCodes(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, send_par.data(), send_par.data().lengthof()); - } - break; - case MTP3itu: - offset = 0; - labellen=5; //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - length = MSU_length + labellen; //SIF+SIO ; - //append MTP3 MSU - buffer[offset] = *((const unsigned char*)sio_oct); - SetPointCodes(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, send_par.data(), send_par.data().lengthof()); - break; - case MTP3ansi: - offset = 0; - labellen=8; //ANSI: sio(1byte) +routing label(7byte) see T1.111.4 - length = MSU_length + labellen; //SIF+SIO ; - //append MTP3 MSU - buffer[offset] = *((const unsigned char*)sio_oct); - SetPointCodes(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, send_par.data(), send_par.data().lengthof()); - break; - case MTP3ttc: - offset = 0; - //if (mtp3_ni==0){ labellen=5;} - //else { - labellen=6; - //} //TTC: sio(1byte) +routing label(6byte) see ... - length = MSU_length + labellen; //SIF+SIO ; - //append MTP3 MSU - buffer[offset] = *((const unsigned char*)sio_oct); - SetPointCodes(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, send_par.data(), send_par.data().lengthof()); - break; - case MTP3bttc: - offset = 0; - buffer[offset] = *((const unsigned char*)bttc_oct); - offset += 1; - labellen=7; //routing label(7byte) - length = 1 + MSU_length + labellen; //SIF+SIO ; - //append MTP3 MSU - buffer[offset] = *((const unsigned char*)sio_oct); - SetPointCodes(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, send_par.data(), send_par.data().lengthof()); - break; - case MTP3mpt: - offset = 0; - if (mtp3_ni==2) - { labellen=8;} //MPT national: sio(1byte) +routing label(7byte) - else - { labellen=5;} //MPT international: sio(1byte) +routing label(4byte) - length = MSU_length + labellen; //SIF+SIO ; - //append MTP3 MSU - buffer[offset] = *((const unsigned char*)sio_oct); - SetPointCodes(send_par.sls(), send_par.opc(), send_par.dpc(), - buffer + offset + 1); - memcpy(buffer + offset + labellen, - send_par.data(), send_par.data().lengthof()); - break; - case M3UA : - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 test port debug: Message to be encoded is: {"); - send_par.data().log(); - TTCN_Logger::log_event(" "); - if( M3UAState != AssocActive ) - { - TTCN_Logger::log_event(" M3UAState is not ready to send data. Its state code: %d",AssocActive); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - return; - } - //calculating lengths - M3UA_par_length = MSU_length + 16; // ProtocolData parameter - // header length=16 <== see f - TTCN_Logger::log_event(", Adjusted M3UA_par_length to %d to support 16 octets M3UA param header",M3UA_par_length); - length = 8 + M3UA_par_length; //msg length = header+par - TTCN_Logger::log_event(", M3UA MSU_length is %d ==> there should be %d padding octets", MSU_length, 4-(MSU_length%4)); - if (MSU_length%4) { //should be padded to be multiple of 4 octets - length += 4 - (MSU_length%4); //padding shall be counted in msg - //length, but not in par_length - } - TTCN_Logger::log_event(", Set msg length (which includes 8 octets M3UA hdr) to %d ",length); - - //filling the first part of the buffer - //common msg hdr ====================================== - buffer[0] = M3UA_version; - buffer[1] = 0x00; //spare - buffer[2] = M3UA_MSG_CLS_TRNSFM; // msg class - buffer[3] = M3UA_MSG_TYP_TRSNFM_DATA; // msg type - encode_32b_int(buffer+4, length); //msg length, 4 bytes - //ProtocolData parameter header========================= - //tag - buffer[M3UA_MSG_OFFS] = PAR_PREFIX_M3UA; //par. tag 1st octet - buffer[M3UA_MSG_OFFS+1] = PAR_PROT_DATA; // par tag 2nd octet - //length, NOTE: should not contain the padding bytes! - encode_16b_int(buffer+M3UA_MSG_OFFS+2,M3UA_par_length); - //OPC,DPC - encode_32b_int(buffer+M3UA_MSG_OFFS+4,send_par.opc()); - encode_32b_int(buffer+M3UA_MSG_OFFS+8,send_par.dpc()); - //SI, NI, MP, SLS - buffer[M3UA_MSG_OFFS+12] = bit2int(sio_field.si()); // SI LSb aligned - buffer[M3UA_MSG_OFFS+13] = bit2int(sio_field.ni()); // NI LSb aligned - buffer[M3UA_MSG_OFFS+14] = bit2int(sio_field.prio()); //MP LSb - //aligned - buffer[M3UA_MSG_OFFS+15] = 0xFF & send_par.sls(); //SLS - // finally the MTP3 MSU itself.... - offset = M3UA_MSG_OFFS + 16; - TTCN_Logger::log_event(", buffer offset is now set to %d", offset); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - //append MTP3 MSU - memcpy(buffer + offset, send_par.data(), send_par.data().lengthof()); - - //padding - for (int ii = 0; ii< (MSU_length%4); ++ii) buffer[offset+MSU_length+ii]= 0x00; - break; - default: - error("Invalid MTP3ServiceType setting!"); - } - if (TTCN_Logger::log_this_event(TTCN_DEBUG)) - { - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("The encoded buffer is: {"); - OCTETSTRING(length, buffer).log(); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - } - send_msg(buffer, length); -#endif -} -//------------ - -void MTP3asp__PT_PROVIDER::log(const char *msg, ...) -{ - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - va_list ap; - va_start(ap, msg); - TTCN_Logger::log_event_va_list(msg, ap); - va_end(ap); - TTCN_Logger::end_event(); -} -//------------ - -void MTP3asp__PT_PROVIDER::warn(const char *msg, ...) -{ - TTCN_Logger::begin_event(TTCN_WARNING); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - va_list ap; - va_start(ap, msg); - TTCN_Logger::log_event_va_list(msg, ap); - va_end(ap); - TTCN_Logger::end_event(); -} -//------------ - -void MTP3asp__PT_PROVIDER::debuglog(const char *msg, ...) -{ - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - va_list ap; - va_start(ap, msg); - TTCN_Logger::log_event_va_list(msg, ap); - va_end(ap); - TTCN_Logger::end_event(); -} -//------------ - -void MTP3asp__PT_PROVIDER::error(const char *msg, ...) -{ - TTCN_Logger::begin_event(TTCN_ERROR); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - va_list ap; - va_start(ap, msg); - TTCN_Logger::log_event_va_list(msg, ap); - va_end(ap); - TTCN_Logger::end_event(); - TTCN_error("Fatal error in MTP3 Test Port %s.", get_name()); -} -//------------ - -void MTP3asp__PT_PROVIDER::close_log_event() -{ - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); -} -//------------ - - -#ifndef TARGET_TEST -// -------------------------------------------- -// Functions and definitions for test with SEA -// -------------------------------------------- - -// Functions of MPH toolkit -// --------------------------- -void connectCallback(CONNECTION* con, int channel, void *clientData) -{ - ((MTP3asp__PT_PROVIDER *)clientData)->log("Opening channel succeeded " - "(channel number is %u)", channel); - ((MTP3asp__PT_PROVIDER *)clientData)->set_channel(channel); - if(((MTP3asp__PT_PROVIDER *)clientData)->dynamicConnection) - ((MTP3asp__PT_PROVIDER *)clientData)->conn_state = 1; -} - -void messageCallback(CONNECTION* con, int channel, int length, - unsigned char *msg, void *clientData) -{ - ((MTP3asp__PT_PROVIDER *)clientData)->log("Incoming message from channel: %d",channel); - ((MTP3asp__PT_PROVIDER *)clientData)->doInterpret(msg,length,channel,con); -} - -void closeCallback(CONNECTION* con, int channel, void *clientData) -{ - ((MTP3asp__PT_PROVIDER *)clientData)->log("Closed channel: %d", channel); -} - -void errorCallback(CONNECTION* con, char *name, char *errorMessage, - void *clientData) -{ - if(((MTP3asp__PT_PROVIDER *)clientData)->dynamicConnection) - { - ((MTP3asp__PT_PROVIDER *)clientData)->log("Opening channel %s failed: %s", name, errorMessage); - ((MTP3asp__PT_PROVIDER *)clientData)->conn_state = 2; - } - else - ((MTP3asp__PT_PROVIDER *)clientData)->error("Opening channel %s failed: %s", - name, errorMessage); -} -//------------ - -//MTP3_open_channel -void MTP3asp__PT_PROVIDER::MTP3_open_channel(boolean http) -{ - int result; - int Mphport; - char *perrorString; - if( Loop == MTP3_ON ) - { - MTP_fd=-1; - myConnection = NULL; - log("MTP3_open_channel finished for LOOP"); - return; - } - - if(http) - { - Mphport = MPH_GetMphPort(hostname,httpport,&perrorString); - } - else - { - Mphport = httpport; - } - - if (Mphport == -1) - error("GetMphPort failed: %s", *perrorString); - - result = MPH_StringToIid(iid_string, &iid); - if (result == -1) - error("Converting %s to MPH_IID failed.", iid_string); - - myConnection = MPH_OpenConnection(hostname, Mphport); - if (myConnection == NULL) - error("Opening connection to %s:%d failed.", hostname, Mphport); - - MPH_OpenChannel(myConnection, - entityname, - &iid, - connectCallback, - messageCallback, - closeCallback, - errorCallback, - this); - - MTP_fd = MPH_GetConnectionFd(myConnection); - if (MTP_fd != -1) - Handler_Add_Fd_Read(MTP_fd); - else - error("Incorrect file descriptor: %d.", MTP_fd); -} -//------------ - -// MTP3_close_connection -void MTP3asp__PT_PROVIDER::MTP3_close_connection() -{ - MPH_CloseConnection(myConnection); - Handler_Remove_Fd_Read(MTP_fd); - close( MTP_fd ); - //Uninstall_Handler(); // Unnecessary if only socket MTP_fd is in use -} -//------------ - -// wait_for_open -boolean MTP3asp__PT_PROVIDER::wait_for_open() -{ - conn_state = 0; - while(conn_state==0) - { - pollfd pollFd = { MTP_fd, POLLIN, 0 }; - int nEvents = poll(&pollFd, 1, 3000 /* ms */); - if (nEvents == 0) { - log("MPH channel opening time out"); - return FALSE; - } - if (nEvents < 0 || (pollFd.revents & (POLLIN | POLLHUP)) == 0) { - log("MPH channel opening error (%d)", (nEvents < 0) ? errno : 0); - return FALSE; - } - Handle_Fd_Event(MTP_fd, TRUE, FALSE, FALSE); - } - if(conn_state == 1) //connectCallback received - { - conn_state = 0; - return TRUE; - } - else //errorCallback received - { - conn_state = 0; - return FALSE; - } -} -//------------ - -//send msg -void MTP3asp__PT_PROVIDER::send_msg(unsigned char *outbuff, int length) -{ - OCTETSTRING buff(length,outbuff); - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3/M3UA Test Port (%s): {", get_name()); - TTCN_Logger::log_event("outgoing buffer= "); - buff.log(); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - if (Loop == MTP3_ON) - { - log("Message looped back"); - doInterpret(outbuff, length, channel, myConnection); - } else - { - MPH_SendMessage(myConnection,channel,length,outbuff); - log("Message sent on channel %d", channel); - } -} -//------------ - -//Check TestPortVariables -void MTP3asp__PT_PROVIDER::Check_TestPort_Variables() -{ - if(!dynamicConnection) - { - if (httpport==-1) error("Parameter HttpPort is not set."); - if (hostname==NULL) error("Parameter Hostname is not set."); - if (entityname==NULL) error("Parameter EntityName is not set."); - } - if (Filter==-1) error("Parameter Filter is not set."); - if (Loop==-1) error("Parameter Loop is not set."); - if (Sut_Pc==-1) error("Parameter SUT_Pc is not set."); - if (Tester_Pc==-1) error("Parameter TESTER_Pc is not set."); - if (!Ni_is_set) error("Parameter NI is not set."); -} -//------------ - -// ------------------------------------------------- -// STC Functions and definitions for test with SEA -// ------------------------------------------------- -void MTP3asp__PT_PROVIDER::Check_TestPort_Variables_STC() -{ - if(!dynamicConnection) - { - if (httpport==-1) error("Parameter HttpPort is not set."); - if (hostname==NULL) error("Parameter Hostname is not set."); - if (entityname==NULL) error("Parameter EntityName is not set."); - } -} -//------------ - -//STC user map -void MTP3asp__PT_PROVIDER::STC_user_map(const char *system_port) -{ - debuglog("Function STC_user_map started"); - Check_TestPort_Variables_STC(); - if(dynamicConnection) - { - connectionUp = FALSE; - } - else - { - MTP3_open_channel(TRUE); - STC_user_connect(); - } -} -//------------ - -//STC user connect -void MTP3asp__PT_PROVIDER::STC_user_connect() -{ -} - -//STC user unmap -void MTP3asp__PT_PROVIDER::STC_user_unmap(const char *system_port) -{ - MTP3_close_connection(); - dynamicConnection = FALSE; -} -//------------ - -//STC interpreter -void MTP3asp__PT_PROVIDER::STC_interpreter(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con) -{ - if ((length==0) || (inbuffer==NULL)) - { - log("0 byte long message received -> packet dropped."); - return; - } - - if (length==1) - { - log("1 byte long internal SEA message received -> packet dropped."); - return; - } - - if ( !strcmp((const char*)inbuffer,"start") ) - { - log("start message received from SEA"); - return; - } - else if (!strcmp((const char*)inbuffer,"stop")) - { - log("stop message received from SEA"); - return; - } - - // writing out the contents of the buffer - OCTETSTRING buff(length,inbuffer); - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("incoming buffer: "); - buff.log(); - TTCN_Logger::end_event(); - - ASP__MTP3__TRANSFERind recv_msg; - MTP3__Field__sio recv_sio; - recv_sio.ni()= int2bit(0,2); - recv_sio.prio()= int2bit(0,2); - recv_sio.si()= int2bit(0,4); - recv_msg.sio() = recv_sio; - recv_msg.sls() = 0; - recv_msg.opc() = 0; - recv_msg.dpc() = 0; - recv_msg.data() = OCTETSTRING(length, &inbuffer[0]); - incoming_message( recv_msg ); -} - -// ------------------------------------------------- -// MTP3 Functions and definitions for test with SEA -// ------------------------------------------------- - -// SLTM messages for MTP3 -// ----------------------- -unsigned char ttcn_in_sltm[] = { - 'T','T','C','N','-','3',' ','E','x','e','c','u','t','o','r'}; - -const int sizeof_ttcn_in_sltm=15; - -// ITU: -unsigned char sltm_msg_itu[] = -{ - 0x1, //SIO /'test & maint' see Q.704 /14.2.1 => 0x81 suggested !!! - 0x0, 0x0, 0x0, 0x0, //4 bytes for label (dpc, opc,sls) - 0x11, //Heading code ITU, see Q.707/5.4 - 0xF0, //spare+Length of the following string: - 'T', 'T', 'C', 'N', '-', '3', ' ', 'E', 'x', 'e', 'c', 'u', 't', 'o', 'r' -}; -const int sizeof_sltm_msg_itu=7+15; - -// ANSI: -unsigned char sltm_msg_ansi[]= -{ - 0xB1, //SIO - 0x0,0x0,0x0,0x0,0x0,0x0,0x0, // 7 bytes for label - 0x11, // Heading Code ANSI T1.111.7-2001 - 0xF0, // SLC(is 0 OK???)+Length in bytes of the following string: - 'T', 'T', 'C', 'N', '-', '3', ' ', 'E', 'x', 'e', 'c', 'u', 't', 'o', 'r' -}; -const int sizeof_sltm_ansi=10+15; - -// TTC: -unsigned char sltm_msg_ttc_national[]= -{ - 0x81, //SIO - 0x0,0x0,0x0,0x0,0x0,0x0, // 6 bytes for label TO BE CONT!!! - 0x11, // Heading Code - 0xF0, // SLC(is 0 OK???)+Length in bytes of the following string: - 'T', 'T', 'C', 'N', '-', '3', ' ', 'E', 'x', 'e', 'c', 'u', 't', 'o', 'r' -}; -const int sizeof_sltm_msg_ttc_national=9+15; - -// BTTC: -unsigned char sltm_msg_bttc_national[]= -{ - 0x0, // extra octet, ignored - 0x81, //SIO - 0x0,0x0,0x0,0x0,0x0,0x0, // 6 bytes for label TO BE CONT!!! - 0x23, // Heading Code - 'T', 'T' -}; -const int sizeof_sltm_msg_bttc_national=1+8+2; - -// MPT: -unsigned char sltm_msg_mpt_national[]= -{ - 0x81, //SIO - 0x0,0x0,0x0,0x0,0x0,0x0,0x0, // 7 bytes for label - 0x11, // Heading Code - 0xF0, // SLC(is 0 OK???)+Length in bytes of the following string: - 'T', 'T', 'C', 'N', '-', '3', ' ', 'E', 'x', 'e', 'c', 'u', 't', 'o', 'r' -}; -const int sizeof_sltm_msg_mpt_national=10+15; -//------------ - - -// coder functions for MTP3 -// ------------------------- -// unsigned int<-> unsigned char array -// Integer encode/decode functions that will encode/decode from/to -// Result: Least Significant Byte first (in lowest address) = LSB = Little Endian -void MTP3asp__PT_PROVIDER::encode_56bLSB_int(unsigned char *to, unsigned long long int from) -{ - to[0] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[2] = from & 0xFF; - from >>= 8; - to[3] = from & 0xFF; - from >>= 8; - to[4] = from & 0xFF; - from >>= 8; - to[5] = from & 0xFF; - from >>= 8; - to[6] = from & 0xFF; -} -//------------ - -unsigned long long int MTP3asp__PT_PROVIDER::decode_56bLSB_int(const unsigned char *from) -{ - typedef unsigned long long int ull; - return ((ull) from[0]) | - ((ull) from[1] <<8)| - ((ull) from[2] << 16)| - ((ull) from[3] << 24)| - ((ull) from[4] << 32)| - ((ull) from[5] << 40)| - ((ull) from[6] << 48); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_48bLSB_int(unsigned char *to, unsigned long long int from) -{ - to[0] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[2] = from & 0xFF; - from >>= 8; - to[3] = from & 0xFF; - from >>= 8; - to[4] = from & 0xFF; - from >>= 8; - to[5] = from & 0xFF; -} -//------------ - -unsigned long long int MTP3asp__PT_PROVIDER::decode_48bLSB_int(const unsigned char *from) -{ - typedef unsigned long long int ull; - return ((ull) from[0]) | - ((ull) from[1] <<8)| - ((ull) from[2] << 16)| - ((ull) from[3] << 24)| - ((ull) from[4] << 32)| - ((ull) from[5] << 40); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_40bLSB_int(unsigned char *to, unsigned long long int from) -{ - to[0] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[2] = from & 0xFF; - from >>= 8; - to[3] = from & 0xFF; - from >>= 8; - to[4] = from & 0xFF; -} -//------------ - -unsigned long long int MTP3asp__PT_PROVIDER::decode_40bLSB_int(const unsigned char *from) -{ - typedef unsigned long long int ull; - return ((ull) from[0]) | - ((ull) from[1] <<8)| - ((ull) from[2] << 16)| - ((ull) from[3] << 24)| - ((ull) from[4] << 32); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_32bLSB_int(unsigned char *to, unsigned int from) -{ - to[0] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[2] = from & 0xFF; - from >>= 8; - to[3] = from & 0xFF; -} -//------------ - -unsigned int MTP3asp__PT_PROVIDER::decode_32bLSB_int(const unsigned char *from) -{ - return from[0] | (from[1] << 8) | (from[2] << 16) | (from[3] << 24); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_24bLSB_int(unsigned char *to, int from) -{ - to[0] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[2] = from & 0xFF; -} -//------------ - -unsigned int MTP3asp__PT_PROVIDER::decode_24bLSB_int(const unsigned char *from) -{ - return from[0] | (from[1] << 8) | (from[2] << 16); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_16bLSB_int(unsigned char *to, int from) -{ - to[0] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; -} -//------------ - -unsigned int MTP3asp__PT_PROVIDER::decode_16bLSB_int(const unsigned char *from) -{ - return from[0] | (from[1] << 8); -} -//------------ - -//MTP3 user map -void MTP3asp__PT_PROVIDER::MTP3_user_map(const char *system_port) -{ - debuglog("Function MTP3_user_map started"); - Check_TestPort_Variables(); - if(dynamicConnection) - { - connectionUp = FALSE; - } - else - { - MTP3_open_channel(TRUE); - MTP3_user_connect(); - } - debuglog("Function MTP3_user_map finished"); -} -//------------ - -//MTP3 user connect -void MTP3asp__PT_PROVIDER::MTP3_user_connect() -{ - // Sending out an SLTM message: - unsigned char * sltm_msg; - unsigned int offset = 0; - int sizeof_msg; - switch( MTPServiceType) - { - case MTP3itu: - case MTP3iup: - sltm_msg=sltm_msg_itu; - sizeof_msg=sizeof_sltm_msg_itu; - break; - case MTP3ansi: - sltm_msg=sltm_msg_ansi; - sizeof_msg=sizeof_sltm_ansi; - break; - case MTP3ttc: - /* if (mtp3_ni == 0){ - sltm_msg=sltm_msg_itu; - sizeof_msg=sizeof_sltm_msg_itu; - } - else { - */ - sltm_msg=sltm_msg_ttc_national; - sizeof_msg=sizeof_sltm_msg_ttc_national; - // } - break; - case MTP3bttc: - sltm_msg=sltm_msg_bttc_national; - sizeof_msg=sizeof_sltm_msg_bttc_national; - offset = 1; - break; - case MTP3mpt: - if (mtp3_ni == 2) - { - sltm_msg = sltm_msg_mpt_national; - sizeof_msg = sizeof_sltm_msg_mpt_national; - } else - { - sltm_msg = sltm_msg_itu; - sizeof_msg = sizeof_sltm_msg_itu; - } - break; - default: - sltm_msg=sltm_msg_itu; - sizeof_msg=sizeof_sltm_msg_itu; - break; - } - stored_bttc_octet = 0; - unsigned char sio = ((unsigned char) mtp3_ni) << 6; - - if (Ni_is_set) - { sltm_msg[0+offset] = sio | 0x1; } - else - { sltm_msg[0+offset] = 0x1; };//SIO /'test & maint' see Q.704 /14.2.1 => 0x81 suggested !!! - - SetPointCodes(0, Tester_Pc, Sut_Pc, sltm_msg + 1 +offset); // common for ITU, ANSI and TTC - log("MTP3/SLTM message sending..."); - send_msg(sltm_msg, sizeof_msg); -} -//MTP3 user unmap -void MTP3asp__PT_PROVIDER::MTP3_user_unmap(const char *system_port) -{ - MTP3_close_connection(); - dynamicConnection = FALSE; -} - -//MTP3 interpreter -void MTP3asp__PT_PROVIDER::MTP3_interpreter(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con) -{ - if ((length==0) || (inbuffer==NULL)) - { - log("0 byte long message received -> packet dropped."); - return; - } - - if (length==1) - { - log("1 byte long internal SEA message received -> packet dropped."); - return; - } - - if ( !strcmp((const char*)inbuffer,"start") ) - { - log("start message received from SEA"); - return; - } - else if (!strcmp((const char*)inbuffer,"stop")) - { - log("stop message received from SEA"); - return; - } - - // writing out the contents of the buffer - OCTETSTRING buff(length,inbuffer); - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("incoming buffer: "); - buff.log(); - TTCN_Logger::end_event(); - - unsigned int offset = 0; - if ( MTPServiceType==MTP3bttc ) - { - stored_bttc_octet = inbuffer[0]; - offset = 1; - } - int labellen; // sio+routinglabel length - int rec_ni = (inbuffer[offset]) >> 6; //network indicator - if (rec_ni != mtp3_ni) - error("Received NI is different from sent NI."); - - unsigned char sio = inbuffer[offset]; - unsigned int si = sio&0x0F; - - if ( MTPServiceType==MTP3itu ) - { labellen=5; //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - } - else if ( MTPServiceType==MTP3iup ) - { - if(si==4) - labellen=6; //ITU-T:sio(1byte) + standard telephony label(5byte) - else - labellen=5; //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - } - else if ( MTPServiceType==MTP3ansi ) - { labellen=8; //ANSI: sio(1byte) +routing label(7byte) see T1.111.4 - } - else if (MTPServiceType==MTP3ttc) - { labellen=6; //new (2004-03-02): 6= sio(1byte)+ routing label(5bytes) - } - else if (MTPServiceType==MTP3mpt) - { - if ( mtp3_ni == 2) - {labellen=8;} //MPT national: sio(1byte) +routing label(7byte) - else - {labellen=5;} //MPT international: sio(1byte) +routing label(4byte) - } - else if (MTPServiceType==MTP3bttc) - { labellen=7; //7= sio(1byte)+ routing label(6bytes) - } - else - { log("incorrect MTPServiceType - programming error-> packet dropped"); - return; - } - - // checking SIO field (first incoming byte) - management or test message - switch (si) - { - case 0: processing_MTP3_management_msg(inbuffer+offset,length-offset); - return; - case 1: //MTP3itu - case 2: processing_MTP3_test_msg(inbuffer+offset,length-offset); //MTP3ansi - return; - default: - break; - } - - // filling up TTCN structure - if ((Loop==MTP3_ON) || (!Filter) || (Filter&&Check_PcMatch(Sut_Pc,Tester_Pc,&inbuffer[offset+1]))) - { - ASP__MTP3__TRANSFERind recv_msg; - MTP3__Field__sio recv_sio; - BITSTRING sio_bit = oct2bit(OCTETSTRING(1,inbuffer+offset)); - recv_sio.ni()= substr(sio_bit,0,2); - recv_sio.prio()= substr(sio_bit,2,2); - recv_sio.si()= substr(sio_bit,4,4); - recv_msg.sio() = recv_sio; - unsigned int sls,opc,dpc; - if ( (MTPServiceType==MTP3iup) && (si==4) ) - GetPointCodesIUP(sls,opc,dpc,&inbuffer[1]); - else - GetPointCodes(sls,opc,dpc,&inbuffer[offset+1]); - recv_msg.sls() = sls; - recv_msg.opc() = opc; - recv_msg.dpc() = dpc; - int len; - len= length-labellen-offset; //len= length-labellen; - recv_msg.data() = OCTETSTRING(len, &inbuffer[offset+labellen]); - incoming_message( recv_msg ); - } - else - { log("The rooting label (OPC, DPC) not matched with the filter setting -> packet dropped."); - return; - } -} - -void MTP3asp__PT_PROVIDER::processing_MTP3_management_msg(unsigned char* inbuff,int len) -{ - int outlen=0; - int labellen; // sio+routinglabel length - int chm_addlen; // (Changeback) additional length = Heading Code + SLC+ (changeback codes) - int mim_addlen; // (MIM) -"- - unsigned int offset = 0; - OCTETSTRING bttc_oct = int2oct(stored_bttc_octet, 1); // additional octet for MTP3bttc - - if ( MTPServiceType==MTP3itu || MTPServiceType==MTP3iup) - { labellen=5; //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - chm_addlen = 2; - mim_addlen = 1; - } - else if ( MTPServiceType==MTP3ansi ) - { labellen=8; //ANSI: sio(1byte) +routing label(7byte) see T.1.111.4 - chm_addlen = 3; - mim_addlen = 2; - } - else if (MTPServiceType==MTP3ttc) - { //if ( mtp3_ni == 0 ) { labellen=5;} //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - //else { - labellen=6; - //} //sio(1byte)+ routing label(6bytes) see 3/15517-FAY 112 011/2 or jt-q704. - } - else if (MTPServiceType==MTP3mpt) - { if ( mtp3_ni == 2 ) { labellen=8; } - else { labellen=5; } - chm_addlen = 2; - mim_addlen = 1; - } - else if (MTPServiceType==MTP3bttc) - { labellen=7;//sio(1byte)+routing label(6bytes) see 3/15517-FAY 112 011/2 or jt-q704 - offset = 1; - } - else - { log("incorrect MTPServiceType- programming error-> packet dropped"); - return; - } - - if (MTPServiceType==MTP3bttc) - { - buffer[0]=*((const unsigned char*)bttc_oct); //additional stored octet in front - buffer[1]=inbuff[0]; //SIO - if (!ChangePointCodes(&buffer[2],&inbuff[1],len)) - { log("incorrect incoming management message -> packet dropped."); - return; - } - } - else - { - buffer[0]=inbuff[0]; //SIO - if (!ChangePointCodes(&buffer[1],&inbuff[1],len)) - { log("incorrect incoming management message -> packet dropped."); - return; - } - } - - // Changeover & changeback(CHM) see ITU: Q.704/15.4.1 ANSI: T.1.111.4/15.2-4 - if (inbuff[labellen]==0x51) //CBD - { - outlen=labellen+chm_addlen; - if (len packet dropped."); - return; - } - else - { buffer[offset + labellen]= 0x61; // Heading Code <- CBA - memcpy(&buffer[offset + labellen+1],&inbuff[labellen+1],len-labellen-1); - outlen = len; - } - } - else if (inbuff[labellen]==0x16) //MIM H0=6=Mgmt inhibit msg, H1=1=LIN - { - outlen=labellen+mim_addlen; - if (len packet dropped."); - return; - } - else - { - buffer[offset + labellen]= 0x56; // LIN -> LID ; LID = link inhibit denied - memcpy(&buffer[offset + labellen+1],&inbuff[labellen+1],(len-labellen-1)); //SLC+spare+... - outlen = len; - } - } - else if (inbuff[labellen]==0x17 && (MTPServiceType==MTP3iup)) - { - if(forward_resume) incoming_message(ASP__MTP3__RESUME(NULL_VALUE)); - return; - } - -/* else if (inbuff[labellen]==0x17 && (MTPServiceType==MTP3iup)) //TRM H0=7, H1=1 : TRA - { - outlen=labellen+1; - if (len packet dropped."); - return; - } - else - { - outlen = len; - } - }*/ - else - { log("This management message type is not supported -> packet dropped."); - return; - } - - // send message - log("function processing_MTP3_management_msg sends a msg"); - send_msg(buffer, outlen+offset); -} - -// processing MTP3 test msg -// Signalling link test message handling according to Q.707 (ITU) and T1.111.7-2001 (ANSI) -void MTP3asp__PT_PROVIDER::processing_MTP3_test_msg(unsigned char* inbuff,int len) -{ - int outlen=0; - int labellen; // sio+routinglabel length - int addlen; //Heading Code+length indicator - //unsigned int ni; //network indicator - OCTETSTRING bttc_oct = int2oct(stored_bttc_octet, 1); // additional octet for MTP3bttc - unsigned int offset = 0; - if ( MTPServiceType==MTP3itu || MTPServiceType==MTP3iup) - { - labellen=5; //ITU-T:sio(1byte) + routing label(4byte) see /Q.704/15.4.1 - addlen = 2; //HC(1 byte)+length ind(1 byte) see Q.707/5.8 - } - else if ( MTPServiceType==MTP3ansi ) - { - labellen=8; //ANSI: sio(1byte) +routing label(7byte) see T1.111.4 - addlen = 2; //HC(1byte) +(length ind+SLC(1byte)) see T1.111.7-2001/5 - } - else if (MTPServiceType==MTP3ttc) - { - /* if (mtp3_ni == 0) { - debuglog("processing_MTP3_test_msg/TTC (Japanese) international"); - labellen=5; //TTC (Japanese) international - addlen=2; - } else { - */ - labellen=6; // previously 7 - // TTC national [ 56bits=sio(1byte)+routing label ] - // r.label= dpc(2bytes)+opc(2bytes)+sls(4bit)+12bits (?) - addlen=2; - //} - } - else if (MTPServiceType==MTP3mpt) - { - if (mtp3_ni == 2) - { labellen=8; //MPT national - addlen=2; - } - else - { labellen=5; // MPT international - addlen=2; - } - } - else if (MTPServiceType==MTP3bttc) - { - labellen=7; - addlen=2; - offset = 1; - } - else - { log("incorrect MTPServiceType - programming error-> packet dropped"); - return; - } - - if (MTPServiceType==MTP3bttc) - { - buffer[0]=*((const unsigned char*)bttc_oct); //additional stored octet in front - buffer[1]=inbuff[0]; //SIO - if (!ChangePointCodes(&buffer[2],&inbuff[1],len)) - { - log("incorrect incoming test message -> packet dropped."); - return; - } - } - else - { - buffer[0]=inbuff[0]; //SIO - if (!ChangePointCodes(&buffer[1],&inbuff[1],len)) - { - log("incorrect incoming test message -> packet dropped."); - return; - } - } - - // Test message handling: SLTM->SLTA, SRT->SRA, SLTA->TRA, others only logged - debuglog("\n==>Test message handling: msg type:%x\n", inbuff[labellen] ); // temporary - switch( inbuff[labellen] ) - { - case 0x11: //SLTM - log("MTP3/SLTM message received"); - outlen=labellen+addlen; - if (len packet dropped."); - return; - } - else - { buffer[offset + labellen]= 0x21; // SLTA - memcpy(&buffer[offset + labellen+1],&inbuff[labellen+1],(len-labellen-1)); - outlen = len; - } - break; - case 0x21: //SLTA - if(!strncmp((const char *)(inbuff+labellen+addlen),(const char *)ttcn_in_sltm,sizeof_ttcn_in_sltm)) - { - log("MTP3/SLTA message received for SLTM sent by Test Port-> TRA message sent"); - buffer[offset]--; - buffer[offset + labellen]= 0x17; // TRA - outlen = labellen+1; - return; -// if(forward_resume) incoming_message(ASP__MTP3__RESUME(NULL_VALUE)); - } - else - { - log("MTP3/SLTA message received -> packet dropped"); - return; - } - break; - case 0x23: // TTC (Japanese) SRT (Signalling Routing Test signal) - log("MTP3ttc/SRT message received"); - outlen=labellen+addlen; - if (len packet dropped."); - return; - } - else - { buffer[offset + labellen]= 0x84; // TTC (Japanese) SRA - memcpy(&buffer[offset + labellen+1],&inbuff[labellen+1],(len-labellen-1)); - outlen = len; - } - break; - case 0x84: // TTC (Japanese) SRA (Signalling Routing test Ack signal) - log("MTP3ttc/SRA message received -> packet dropped"); - return; - default: - log("This management message type is not supported -> packet dropped "); - return; - } - - // send message - log("function processing_MTP3_test_msg sends a message"); - send_msg( buffer,outlen+offset); -} - -// Point Code Manipulation (Get/Set/Change) -// ------------------------------------------------- -void MTP3asp__PT_PROVIDER::GetPointCodes(unsigned int &sls,unsigned int &opc,unsigned int &dpc, unsigned char* msg) -{ - unsigned int label; - sls=0; opc=0; dpc=0; - unsigned long long int Label; - - switch( MTPServiceType) - { - case MTP3itu: - label= decode_32bLSB_int(msg); - sls = (label>>28)&0xF; //sls = (label&0xF0000000)>>28; - opc = (label>>14)&0x3FFF; //opc = (label&0x0FFFC000)>>14; - dpc = label&0x3FFF; //dpc = (label&0x00003FFF); - debuglog("Function GetPointCodes called for service type MTP3itu"); - break; - case MTP3iup: - label= decode_32bLSB_int(msg); - sls = (label>>28)&0xF; //sls = (label&0xF0000000)>>28; - opc = (label>>14)&0x3FFF; //opc = (label&0x0FFFC000)>>14; - dpc = label&0x3FFF; //dpc = (label&0x00003FFF); - debuglog("Function GetPointCodes called for service type MTP3iup"); - break; - case MTP3ansi: - Label=decode_56bLSB_int(msg); - sls = (Label >> 48) & 0xFF; //sls = (Label&0x00FF000000000000)>>48; - opc = (Label >> 24) & 0xFFFFFF;//opc = (Label&0x0000FFFFFF000000)>>24; - dpc = Label & 0xFFFFFF; //dpc = (Label&0x0000000000FFFFFF); - debuglog("Function GetPointCodes called for service type MTP3ansi"); - break; - case MTP3ttc: - /* - if( mtp3_ni == 0) - { - label= decode_32bLSB_int(msg); - sls = (label>>28)&0xF; //sls = (label&0xF0000000)>>28; - opc = (label>>14)&0x3FFF; //opc = (label&0x0FFFC000)>>14; - dpc = label&0x3FFF; - debuglog("Function GetPointCodes called for service type MTP3ttc/international"); - } else - {*/ - Label=decode_48bLSB_int(msg); //0x010203040506 - sls = (Label>>32)&0xF; // sls = (Label&0x000F00000000)>>32; // only 4 bits!!! - opc = (Label>>16)&0xFFFF;//opc = (Label&0x0000FFFF0000)>>16; - dpc = Label&0xFFFF; //dpc = (Label&0x00000000FFFF); - debuglog("Function GetPointCodes called for service type MTP3ttc/national"); - //} - break; - case MTP3bttc: - Label=decode_48bLSB_int(msg); - sls = (Label>>32)&0xF; // sls = (Label&0x000F00000000)>>32; // only 4 bits!!! - opc = (Label>>16)&0xFFFF;//opc = (Label&0x0000FFFF0000)>>16; - dpc = Label&0xFFFF; //dpc = (Label&0x00000000FFFF); - debuglog("Function GetPointCodes called for service type MTP3bttc/national"); - break; - case MTP3mpt: - if( mtp3_ni == 2) - { - Label=decode_56bLSB_int(msg); - sls = (Label >> 48) & 0xFF; //sls = (Label&0x00FF000000000000)>>48; - opc = (Label >> 24) & 0xFFFFFF;//opc = (Label&0x0000FFFFFF000000)>>24; - dpc = Label & 0xFFFFFF; //dpc = (Label&0x0000000000FFFFFF); - debuglog("Function GetPointCodes called for service type MTP3mpt(nat)"); - } - else - { - label= decode_32bLSB_int(msg); - sls = (label>>28)&0xF; //sls = (label&0xF0000000)>>28; - opc = (label>>14)&0x3FFF; //opc = (label&0x0FFFC000)>>14; - dpc = label&0x3FFF; //dpc = (label&0x00003FFF); - debuglog("Function GetPointCodes called for service type MTP3mpt(int)"); - } - break; - default: - break; - } - debuglog("sls:%u opc:%u, dpc:%u",sls,opc,dpc); -} -//------------ - -void MTP3asp__PT_PROVIDER::GetPointCodesIUP(unsigned int &cic,unsigned int &opc,unsigned int &dpc, unsigned char* msg) -{ - debuglog("Function GetPointCodesIUP called"); - cic=0; opc=0; dpc=0; - unsigned long long int Label; - Label=decode_40bLSB_int(msg); //0x0102030405 - cic = (Label>>28)&0xFFF; //cic = (label&0xFFF0000000)>>28; - opc = (Label>>14)&0x3FFF; //opc = (label&0x000FFFC000)>>14; - dpc = Label&0x3FFF; //dpc = (label&0x0000003FFF); - debuglog("cic:%u opc:%u, dpc:%u",cic,opc,dpc); -} - -void MTP3asp__PT_PROVIDER::SetPointCodes(unsigned int sls,unsigned int opc,unsigned int dpc, unsigned char* msg) -{ - unsigned long long int Sls,Opc,Dpc; - - switch( MTPServiceType) - { - case MTP3itu: - encode_32bLSB_int( msg, ((sls<<28)|(opc<<14)|dpc )); - debuglog("Function SetPointCodes called for service type MTP3itu"); - break; - case MTP3iup: - encode_32bLSB_int( msg, ((sls<<28)|(opc<<14)|dpc )); - debuglog("Function SetPointCodes called for service type MTP3iup"); - break; - case MTP3ansi: - Sls=sls; Opc=opc; Dpc=dpc; - encode_56bLSB_int( msg, ((Sls<<48)|(Opc<<24)|Dpc)); - debuglog("Function SetPointCodes called for service type MTP3ansi"); - break; - case MTP3ttc: - /* if ( mtp3_ni == 0 ){ - encode_32bLSB_int( msg, ((sls<<28)|(opc<<14)|dpc )); - debuglog("Function SetPointCodes called for service type MTP3ttc/international"); - } else { - */ - Sls=sls; Opc=opc; Dpc=dpc; - encode_48bLSB_int( msg, ((Sls<<32)|(Opc<<16)|Dpc)); - debuglog("Function SetPointCodes called for service type MTP3ttc/national"); - //} - break; - case MTP3bttc: - Sls=sls; Opc=opc; Dpc=dpc; - encode_48bLSB_int( msg, ((Sls<<32)|(Opc<<16)|Dpc)); - debuglog("Function SetPointCodes called for service type MTP3bttc/national"); - break; - case MTP3mpt: - if ( mtp3_ni == 2 ) - { Sls=sls; Opc=opc; Dpc=dpc; - encode_56bLSB_int( msg, ((Sls<<48)|(Opc<<24)|Dpc)); - debuglog("Function SetPointCodes called for service type MTP3mpt(nat)"); - } - else - { encode_32bLSB_int( msg, ((sls<<28)|(opc<<14)|dpc )); - debuglog("Function SetPointCodes called for service type MTP3mpt(int)"); - } - break; - default: - break; - } -} -//------------ - -void MTP3asp__PT_PROVIDER::SetPointCodesIUP(unsigned int cic,unsigned int opc,unsigned int dpc, unsigned char* msg) -{ - unsigned long long int Cic,Opc,Dpc; - Cic=cic; Opc=opc; Dpc=dpc; - debuglog("Function SetPointCodesIUP called"); - encode_40bLSB_int( msg, ((Cic<<28)|(Opc<<14)|Dpc )); -} - -//Changes the Point codes: dpc<->opc ie. destination <->orig -// inbuff starts from dpc i.e doesn't contain sio !!!! -int MTP3asp__PT_PROVIDER::ChangePointCodes(unsigned char* outbuff, unsigned char *inbuff, int len) -{ - switch( MTPServiceType) - { - case MTP3itu: - case MTP3iup: - if (len<5) - { warn("MTP3itu:len<5. Too short message!"); return 0; }; - break; - case MTP3ansi: - if (len<9 ) return 0; - break; - case MTP3ttc: - //if ( mtp3_ni == 0 && len<5) - //{ warn("MTP3ttc:len<5. Too short message!"); return 0; } - //else - if (len<6) - { warn("MTP3ttc:len<6. Too short message!"); return 0; } - break; - case MTP3bttc: - if (len<7) - { warn("MTP3bttc:len<7. Too short message!"); return 0; } - break; - case MTP3mpt: - if ( mtp3_ni == 2 && len<8) - { warn("MTP3mpt:len<8. Too short message!"); return 0; } - else if (len<5) - { warn("MTP3mpt:len<5. Too short message!"); return 0; } - break; - default: - warn("Unknown MTPServiceType!!!"); - break; - } - unsigned int sls,opc,dpc; - GetPointCodes(sls,opc,dpc,inbuff); - SetPointCodes(sls,dpc,opc,outbuff); - return 1; -} -//------------ - -int MTP3asp__PT_PROVIDER::Check_PcMatch(unsigned int opc, unsigned int dpc, unsigned char *buff) -{ - unsigned int temp_opc,temp_dpc,temp_sls; - - GetPointCodes(temp_sls,temp_opc,temp_dpc,buff); - if ( (temp_opc == opc) && (temp_dpc == dpc) ) return 1; - return 0; -} -//------------ - - -// ------------------------------------------------- -// M3UA Functions and definitions for test with SEA -// ------------------------------------------------- - -// Structures for M3UA -static unsigned char aspup_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version - 0x00, //reserved - M3UA_MSG_CLS_ASPSM, //Msg class: ASPSM - M3UA_MSG_TYP_ASPSM_ASPUP, //Msg type: ASPUP - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x08 // length ends = 8 octets - // ,PAR_PREFIX_COMMON, //optional Info string tag, in included, then msg - // PAR_INFO_STR //msg length should be +20, that is 28=0x1c - // 0x00,0x0f, // length: "TTCN-3 Executor" is 15 chars - // 'T', 'T', 'C', 'N', - // '-', '3', ' ', 'E', - // 'x', 'e', 'c', 'u', - // 't', 'o', 'r', 0x00 //las octet is padding -}; -const int sizeof_aspup_msg = 8; - -static unsigned char aspupack_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version - 0x00, //reserved - M3UA_MSG_CLS_ASPSM, //Msg class: ASPSM - M3UA_MSG_TYP_ASPSM_ASPUPAck, //Msg type: ASPUP - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x08 // length ends = 8 octets -}; -const int sizeof_aspupack_msg = 8; - -static unsigned char aspac_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_ASPTM, //Msg class - M3UA_MSG_TYP_ASPTM_ASPAC, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x08 // length ends = 8 octets -}; -const int sizeof_aspac_msg = 8; - -// ASP Active Acknowledge msg: -static unsigned char aspac_ack_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_ASPTM, //Msg class - M3UA_MSG_TYP_ASPTM_ASPACAck, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x08 // length ends = 8 octets -}; -const int sizeof_aspac_ack_msg = 8; - -static unsigned char aspia_ack_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_ASPTM, //Msg class - M3UA_MSG_TYP_ASPTM_ASPIAAck, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x08 // length ends = 8 octets -}; -const int sizeof_aspia_ack_msg = 8; - -// ASP DOWN Acknowledge msg: -static unsigned char aspdn_ack_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_ASPSM, //Msg class - M3UA_MSG_TYP_ASPSM_ASPDNAck, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x08 // length ends = 8 octets -}; -const int sizeof_aspdn_ack_msg = 8; - -//ASP Destination Available msg: -static unsigned char dava_1apc_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - //or updated doc 2/1056-FCPW 101 86/P-1 - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_SSNM, //Msg class - M3UA_MSG_TYP_SSNM_DAVA, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x10, // length ends, 16 octets - //Affected point code - PAR_PREFIX_COMMON, - PAR_AFFECTED_PC, - 0x00, //par length begins (2 octets) - 0x08, //length ends, 8 octets - 0x00, // point code placeholder begins - 0x00, // - 0x00, // - 0x00 // point code placeholder ends -}; -const int sizeof_dava_1apc_msg = 16; - -static unsigned char duna_1apc_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_SSNM, //Msg class - M3UA_MSG_TYP_SSNM_DUNA, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x10, // length ends, 16 octets - //Affected point code - PAR_PREFIX_COMMON, - PAR_AFFECTED_PC, - 0x00, //par length begins (2 octets) - 0x08, //length ends, 8 octets - 0x00, // point code placeholder begins - 0x00, // - 0x00, // - 0x00 // point code placeholder ends -}; -const int sizeof_duna_1apc_msg = 16; - -static unsigned char error_msg[] = -{ - //common MsUA msg hdr, see M3UA PS - //Doc no. 1/1056-FCP 103 3571/F Uen, RevA - 0x01, //Release Version: 01 - 0x00, //reserved - M3UA_MSG_CLS_MGMT, //Msg class - M3UA_MSG_TYP_MGMT_ERR, //Msg type - 0x00, //Msg length begins (4 octets) - 0x00, // - 0x00, // - 0x18, // length ends, 16+8 octets - // Error code field: - PAR_PREFIX_COMMON, - PAR_ERROR_CODE, - 0x00, //par length begins (2 octets) - 0x08, //length ends, 8 octets - 0x00, // error code placeholder begins (M3UA_MSG_OFFS+4) - 0x00, // - 0x00, // - 0x00, // error code placeholder ends - // additional field: - 0x00, // M3UA_MSG_OFFS+8 - 0x00, // Routing context or Network Appearanance or APC or DI = error_code_id - 0x00, // par length begins (2 octets) - 0x08, // length ends, 8 octets - 0x00, // value placeholder begins M3UA_MSG_OFFS+12 - 0x00, // - 0x00, // - 0x00 // value place holder ends -}; -const int sizeof_error_msg = 24; - -void MTP3asp__PT_PROVIDER::M3UA_user_unmap(const char *system_port) -{ - MTP3_close_connection(); - dynamicConnection = FALSE; -} -//------------ - -void MTP3asp__PT_PROVIDER::M3UA_user_map(const char *system_port) -{ - M3UAState = AssocDown; - Check_TestPort_Variables(); - if(dynamicConnection) - { - connectionUp = FALSE; - } - else - { - MTP3_open_channel(TRUE); - M3UA_user_connect(); - } -} -//------------ - -void MTP3asp__PT_PROVIDER::M3UA_user_connect() -{ - M3UAState = AssocEstabl; - // Sending out an ASPUP message - log("Message ASPUP will be sent"); - send_msg(aspup_msg, sizeof_aspup_msg); - // NOTE: the ASPUPAck will be handled by M3UA_interpreter, which - // also will take care of sending ASPAC upon receiving the ASPUPAck -} -//------------ - -// M3UA_interpreter -void MTP3asp__PT_PROVIDER::M3UA_interpreter(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con) -{ - if ((length==0) || (inbuffer==NULL)) - { warn("0 byte long message received -> packet dropped."); - return; - } - - if (length==1) - { - log("1 byte long internal SEA message received -> packet dropped."); - return; - } - - if ( !strcmp((const char*)inbuffer,"start") ) - { log("start message received from SEA"); - return; - } - else if (!strcmp((const char*)inbuffer,"stop")) - { log("stop message received from SEA"); - return; - } - - // writing out the contents of the buffer - OCTETSTRING buff(length,inbuffer); - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("incoming buffer: "); - buff.log(); - TTCN_Logger::end_event(); - - // version checking - if ( inbuffer[M3UA_VER_OFFS] != M3UA_version ) - { warn("Incompatible M3UA protocol version in header -> packet dropped"); - return; - } - - //length checking - unsigned int indicated_length = decode_32b_int(inbuffer + M3UA_LGT_OFFS ); - if ( indicated_length != (unsigned)length) - warn("Length in common header (%d) mismatches received buffer length (%d)," - "Assuming that it is because of the omission of final parameter padding" - "in indicated length",indicated_length, length); - - // checking MSG class - int unprocessed_chars = 0; - switch (inbuffer[M3UA_CLS_OFFS]) - { - case M3UA_MSG_CLS_MGMT: - unprocessed_chars = processing_M3UA_MGMT_msg(inbuffer, length); - break; - case M3UA_MSG_CLS_TRNSFM : - unprocessed_chars = processing_M3UA_Transfer_msg(inbuffer, length); - break; - case M3UA_MSG_CLS_SSNM : - unprocessed_chars = processing_M3UA_SSNM_msg(inbuffer, length); - break; - case M3UA_MSG_CLS_ASPSM : - unprocessed_chars = processing_M3UA_ASPSM_msg(inbuffer, length); - break; - case M3UA_MSG_CLS_ASPTM : - unprocessed_chars = processing_M3UA_ASPTM_msg(inbuffer, length); - break; - case M3UA_MSG_CLS_RKM : - unprocessed_chars = processing_M3UA_RKM_msg(inbuffer, length); - break; - default: - unprocessed_chars = processing_M3UA_unsupported_msg_class(inbuffer, length); - break; - } - debuglog("%d chars remained unprocessed (might be due to padding)", unprocessed_chars); -} -//------------ - -//processing M3UA MGMT msg -int MTP3asp__PT_PROVIDER::processing_M3UA_MGMT_msg(unsigned char* inbuffer,int length) -{ - debuglog("Entering function:processing_MGMT_msg"); - int offset = M3UA_MSG_OFFS; //pointer for processing - - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): {", get_name()); - TTCN_Logger::log_event("decoded msg class: Mgmt, "); - switch (inbuffer[M3UA_TYP_OFFS])//msg type - { - case M3UA_MSG_TYP_MGMT_ERR: - TTCN_Logger::log_event("type: ERROR-> ignored"); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - break; - case M3UA_MSG_TYP_MGMT_NTFY: - TTCN_Logger::log_event("type: NOTIFY -> ignored"); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - break; - default: - send_M3UA_error_msg( PAR_ERRC_UNSMT, inbuffer[M3UA_TYP_OFFS]); - TTCN_Logger::log_event("Unsupported M3UA msg type %x of class MGMT -> packet dropped.", inbuffer[M3UA_TYP_OFFS]); - TTCN_Logger::log_event("}"); - TTCN_Logger::end_event(); - break; - } - return length - offset; -} -//------------ - -//processing M3UA SSNM msg -int MTP3asp__PT_PROVIDER::processing_M3UA_SSNM_msg(unsigned char* inbuffer,int length) -{ - debuglog("Entering function:processing_SSNM_msg"); - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("MTP3 Test Port (%s): {", get_name()); - TTCN_Logger::log_event("decoded msg class: SSNM, "); - int offset = M3UA_MSG_OFFS; //pointer for processing - - switch (inbuffer[M3UA_TYP_OFFS]) - { - case M3UA_MSG_TYP_SSNM_DAUD: - while (offset <= length-8 ) //processing potential params - { - switch (inbuffer[offset++]) //1st octet of tag - { - case PAR_PREFIX_COMMON: - TTCN_Logger::log_event (" DAUD: COMMON parameter "); - switch (inbuffer[offset++]) //2nd octet of COMMON tag - { - case PAR_ROUTING_CTX: - TTCN_Logger::log_event ("Routing Context (unsupported par) -> skipped), "); - skip_par_after_tag(inbuffer, offset); - break; - case PAR_INFO_STR: - TTCN_Logger::log_event ("Info String (unsupported par) -> skipped), "); - skip_par_after_tag(inbuffer, offset); - break; - case PAR_AFFECTED_PC: - TTCN_Logger::log_event ("Affected Point Code -> will send DUNA/DAVA, "); - TTCN_Logger::log_event("will ignore remainder parameters after APC}"); - TTCN_Logger::end_event(); - Send_DAVA_DUNA_to_APCinDAUD(Tester_Pc, inbuffer, offset); - return length-offset; - default: - TTCN_Logger::log_event ("invalid COMMON param tag:0x%02x%02x-> skipped", PAR_PREFIX_COMMON, inbuffer[offset-1]); - send_M3UA_error_msg( PAR_ERRC_PARFE, inbuffer[offset-1]); - skip_par_after_tag(inbuffer, offset); - break; - } - break; - case PAR_PREFIX_M3UA: - TTCN_Logger::log_event ("DAUD: M3UA parameter: "); - switch (inbuffer[offset++]) //2nd octet of M3UA tag - { - case PAR_NETW_APP: - TTCN_Logger::log_event ("Network Appearance (unsupported par) -> skipped), "); - skip_par_after_tag(inbuffer, offset); - break; - default: - TTCN_Logger::log_event ("invalid M3UA param tag:0x%02x%02x-> skipped", - PAR_PREFIX_M3UA, inbuffer[offset-1]); - send_M3UA_error_msg( PAR_ERRC_PARFE, inbuffer[offset-1]); - skip_par_after_tag(inbuffer, offset); - } - break; - default: //1st octet of tag - TTCN_Logger::log_event ("invalid 1st octet param tag:0x%02x in DATA (packet dropped)",inbuffer[offset-1]); - close_log_event(); - return length -offset; - break; - } - } - break; - case M3UA_MSG_TYP_SSNM_DAVA: // Destination Available // Notification to the user part ????? - TTCN_Logger::log_event("type: SSNM_DAVA -> ignored"); - close_log_event(); - break; - case M3UA_MSG_TYP_SSNM_DUNA: // Destination Unavailable // Notification to the user part ????? - TTCN_Logger::log_event("type: SSNM_DUNA -> ignored"); - close_log_event(); - break; - case M3UA_MSG_TYP_SSNM_SCON: // Signalling Congestion // Notification to the user part ????? - TTCN_Logger::log_event("type: SSNM_SCON -> ignored"); - close_log_event(); - break; - case M3UA_MSG_TYP_SSNM_DUPU: //Destinationn User Part Unavailable // Notification to the user part ????? - TTCN_Logger::log_event("type: SSNM_DUPU -> ignored"); - close_log_event(); - break; - case M3UA_MSG_TYP_SSNM_DRST: //Destination Restricted // Notification to the user part ????? - TTCN_Logger::log_event("type: SSNM_DRST -> ignored"); - close_log_event(); - break; - default: //msg type - send_M3UA_error_msg( PAR_ERRC_UNSMT, inbuffer[M3UA_TYP_OFFS]); - TTCN_Logger::log_event("Unsupported M3UA msg type -> packet dropped."); - close_log_event(); - break; - } - return length - offset; -} -//------------ - -//processing M3UA ASPSM msg -int MTP3asp__PT_PROVIDER::processing_M3UA_ASPSM_msg(unsigned char* inbuffer,int length) -{ - debuglog("Entering function:processing_ASPSM_msg"); - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("MTP3 Test Port (%s): {", get_name()); - TTCN_Logger::log_event("decoded msg class: ASPSM, "); - - int offset = M3UA_MSG_OFFS; //pointer for processing - switch (inbuffer[M3UA_TYP_OFFS]) - { - case M3UA_MSG_TYP_ASPSM_ASPUP: - TTCN_Logger::log_event("type: ASPSM_ASPUP -> ASPUPAck will be sent"); - close_log_event(); - send_msg(aspupack_msg, sizeof_aspupack_msg); - break; - case M3UA_MSG_TYP_ASPSM_ASPDN: - TTCN_Logger::log_event("type: ASPSM_ASPDN -> ASPDNAck will be sent"); - close_log_event(); - send_msg(aspdn_ack_msg, sizeof_aspdn_ack_msg); - break; - case M3UA_MSG_TYP_ASPSM_BEAT: - TTCN_Logger::log_event("type: ASPSM_BEAT -> ASPSM_BEATAck will be sent"); - close_log_event(); - //Sending back the packet as acknowledge: - inbuffer[M3UA_TYP_OFFS]= M3UA_MSG_TYP_ASPSM_BEATAck; - send_msg(inbuffer, length); - break; - case M3UA_MSG_TYP_ASPSM_ASPUPAck: - TTCN_Logger::log_event("type: ASPSM_ASPUPAck -> ASPAC will be sent"); - M3UAState = AssocInac; - TTCN_Logger::log_event(" M3UAState's been changed to AssocInac"); - close_log_event(); - send_msg(aspac_msg, sizeof_aspac_msg ); - break; - case M3UA_MSG_TYP_ASPSM_ASPDNAck: - M3UAState = AssocDown; - TTCN_Logger::log_event(" M3UAState's been changed to AssocDown"); - TTCN_Logger::log_event("type: ASPSM_ASPDNAck -> nothing will be sent"); - close_log_event(); - break; - case M3UA_MSG_TYP_ASPSM_BEATAck: - TTCN_Logger::log_event("type: ASPSM_BEATAck -> nothing will be sent"); - close_log_event(); - break; - default: - TTCN_Logger::log_event("Unsupported M3UA msg type %x of class ASPSM-> packet dropped.", (unsigned char)(inbuffer[M3UA_TYP_OFFS])); - close_log_event(); - send_M3UA_error_msg( PAR_ERRC_UNSMT, inbuffer[M3UA_TYP_OFFS]); - break; - } - return length - offset; -} -//------------ - -//processing M3UA ASPTM msg -int MTP3asp__PT_PROVIDER::processing_M3UA_ASPTM_msg(unsigned char* inbuffer,int length) -{ - debuglog("Entering function:processing_ASPTM_msg"); - TTCN_Logger::begin_event(TTCN_PORTEVENT); - TTCN_Logger::log_event("MTP3 Test Port (%s): {", get_name()); - TTCN_Logger::log_event("decoded msg class: ASPTM, "); - - int offset = M3UA_MSG_OFFS; //pointer for processing - switch (inbuffer[M3UA_TYP_OFFS]) - { - case M3UA_MSG_TYP_ASPTM_ASPAC: //ASP Active - M3UAState = AssocActive; - TTCN_Logger::log_event("type: ASPTM_ASPAC -> ASPACAck will be sent"); - close_log_event(); - send_msg(aspac_ack_msg, sizeof_aspac_ack_msg); - break; - case M3UA_MSG_TYP_ASPTM_ASPIA: //ASP InActive - TTCN_Logger::log_event("type: ASPTM_ASPIA -> ASPIAAck will be sent"); - close_log_event(); - send_msg(aspia_ack_msg, sizeof_aspia_ack_msg); - break; - case M3UA_MSG_TYP_ASPTM_ASPACAck: - M3UAState = AssocActive; - TTCN_Logger::log_event("type: ASPTM_ASPACAck -> nothing will be sent"); - TTCN_Logger::log_event("M3UAState's been changed to AssocActive."); - close_log_event(); - break; - case M3UA_MSG_TYP_ASPTM_ASPIAAck: - TTCN_Logger::log_event("type: ASPTM_ASPIAAck -> nothing will be sent"); - close_log_event(); - break; - default: - TTCN_Logger::log_event("Unsupported M3UA msg type %x of class ASPSM-> packet dropped.", (unsigned char)(inbuffer[M3UA_TYP_OFFS])); - close_log_event(); - send_M3UA_error_msg( PAR_ERRC_UNSMT, inbuffer[M3UA_TYP_OFFS]); - break; - } - return length - offset; -} -//------------ - -//processing M3UA RKM msg -int MTP3asp__PT_PROVIDER::processing_M3UA_RKM_msg(unsigned char* inbuffer,int length) -{ - debuglog("Entering function:processing_RKM_msg"); - int offset = M3UA_MSG_OFFS; //pointer for processing - warn("Unsupported M3UA msg class M3UA_RKM -> packet dropped."); - return length - offset; -} -//------------ - -//processing M3UA unsupported msg class -int MTP3asp__PT_PROVIDER::processing_M3UA_unsupported_msg_class(unsigned char* inbuffer,int length) -{ - warn("Unsupported M3UA msg class -> packet dropped."); - send_M3UA_error_msg( PAR_ERRC_UNSMC, inbuffer[M3UA_CLS_OFFS] ); - int offset = M3UA_MSG_OFFS; //pointer for processing - return length - offset; -} -//------------ - -// processing_M3UA_Transfer_msg - called if the msg class is "Transfer" i.e M3UA_MSG_CLS_TRNSFM: -int MTP3asp__PT_PROVIDER::processing_M3UA_Transfer_msg(unsigned char* inbuffer,int length) -{ - debuglog("Entering function:processing_M3UA_Transfer_msg"); - int offset = M3UA_MSG_OFFS; //pointer for processing - unsigned int recv_opc, recv_dpc,recv_si, recv_ni, recv_mp,recv_sls =0; - int param_length = 0; - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): {", get_name()); - TTCN_Logger::log_event("decoded msg class: DataTrnsf, "); - - switch (inbuffer[M3UA_TYP_OFFS]) //msg type - { - case M3UA_MSG_TYP_TRSNFM_DATA: - TTCN_Logger::log_event("msg type DATA, "); - while (offset <= length-8) //processing potential params - { - switch (inbuffer[offset++]) //1st octet of tag. Offset already incremented after the 'case' ! - { - case PAR_PREFIX_COMMON: - TTCN_Logger::log_event (" DATA: COMMON parameter, "); - switch (inbuffer[offset++]) //2nd octet of tag - { - case PAR_ROUTING_CTX: - TTCN_Logger::log_event ("Routing Context (unsupported par) -> skipped), "); - // Send back an error msg - skip_par_after_tag(inbuffer, offset); - break; - case PAR_CORREL_ID: - TTCN_Logger::log_event ("Correlation ID (unsupported par) -> skipped), "); - skip_par_after_tag(inbuffer, offset); - break; - default: - TTCN_Logger::log_event ("invalid COMMON param tag:0x%02x%02x -> skipped", PAR_PREFIX_COMMON, inbuffer[offset-1]); - skip_par_after_tag(inbuffer, offset); - break; - } - case PAR_PREFIX_M3UA: - TTCN_Logger::log_event ("DATA: M3UA parameter: "); - switch (inbuffer[offset++]) //2nd octet of M3UA tag - { - case PAR_PROT_DATA: - //--------------------------------------------- - TTCN_Logger::log_event ("Protocol Data"); - // retrieving length - param_length = decode_16b_int(inbuffer+offset); offset+=2; - TTCN_Logger::log_event(", DATA: Length of Protocol Data parameter is %d",param_length); - // retrieving M3UA protocol data paremeter opc, dpc, si, ni, mp, - // sls - recv_opc = decode_32b_int(inbuffer+offset); offset +=4; - recv_dpc = decode_32b_int(inbuffer+offset); offset +=4; - recv_si = (unsigned int)(inbuffer[offset++]); - recv_ni = (unsigned int)(inbuffer[offset++]); - recv_mp = (unsigned int)(inbuffer[offset++]); - recv_sls = (unsigned int)(inbuffer[offset++]); - TTCN_Logger::log_event(", DATA: decoded Protocol Data parameter:"); - // filling up TTCN structure - if ((Loop==MTP3_ON) || - (!Filter) || - (Filter && - (recv_opc == (unsigned)Sut_Pc) && (recv_dpc == (unsigned)Tester_Pc) && - (recv_ni == (unsigned)mtp3_ni) - )) - { - ASP__MTP3__TRANSFERind recv_msg; - MTP3__Field__sio recv_sio; - recv_sio.ni()= int2bit(recv_ni,2); - recv_sio.prio()= int2bit(recv_mp,2); - recv_sio.si()= int2bit(recv_si,4); - recv_msg.sio() = recv_sio; - recv_msg.sls() = recv_sls; - recv_msg.opc()= recv_opc; - recv_msg.dpc() = recv_dpc;; - recv_msg.data() = OCTETSTRING(param_length-16, // 16 octet paramheader + 5 routing label - &inbuffer[offset]); - recv_msg.log(); - close_log_event(); - incoming_message ( recv_msg ); - offset += param_length-16; - return length - offset; - } - else - { - close_log_event(); - log("Either the received M3UA(OPC, DPC, SI) fields, or the embedded MTP3 rooting label (OPC, DPC) not matched with the filter setting -> packet dropped."); - return length - offset; - } - break; - default: - TTCN_Logger::log_event ("invalid M3UA param tag:0x%02x%02x-> skipped", PAR_PREFIX_M3UA, inbuffer[offset-1]); - skip_par_after_tag(inbuffer, offset); - } - break; - default: - TTCN_Logger::log_event ("invalid 1st octet param tag:0x%02x in DATA (packet dropped)",inbuffer[offset-1]); - close_log_event(); - return length -offset; - break; - } - }// Checking parameter tag (offset packet dropped", - (unsigned int)(inbuffer[M3UA_TYP_OFFS])); - close_log_event(); - send_M3UA_error_msg( PAR_ERRC_UNSMT, inbuffer[M3UA_TYP_OFFS]); - break; - } - - return length -offset; -} - -// Set M3UA SingleAPC - Stores field Single Affected Point Code -void MTP3asp__PT_PROVIDER::Set_M3UA_SingleAPC(unsigned int pc, unsigned char* apc_par) -{ - //setting par type to APC - apc_par[0] = PAR_PREFIX_COMMON; - apc_par[1] = PAR_AFFECTED_PC; - //setting the length to 4+4 = 8 - apc_par[2] = 0x00; - apc_par[3] = 0x08; - //setting the mask - apc_par[4] = 0x00; - //setting the pc - encode_24b_int(apc_par+5,pc); -} - -// Send DAVA DUNA to APCinDAUD -void MTP3asp__PT_PROVIDER::Send_DAVA_DUNA_to_APCinDAUD(unsigned int dava_sep, unsigned char* inbuffer, int & offset) -{ - unsigned int length = decode_16b_int(inbuffer+offset); - offset +=2; - unsigned int current_pc; - - //checking the length - if ((length < 8) || (length%4)) - { warn("Invalid length in APC parameter -> not processed"); - return; - } - - for (unsigned int i = 4 ; i < length; i += 4) - { - if (inbuffer[offset++] == 0x00) // mask===>single pc - { - current_pc = decode_24b_int(inbuffer+offset); - offset +=3; - if (dava_sep == current_pc) //dava - { Set_M3UA_SingleAPC(dava_sep, dava_1apc_msg+M3UA_MSG_OFFS); - log("DAVA will be sent for pc=%d", dava_sep); - send_msg(dava_1apc_msg, sizeof_dava_1apc_msg); - } - else //duna - { Set_M3UA_SingleAPC(current_pc, duna_1apc_msg+M3UA_MSG_OFFS); - log("DUNA will be sent for pc=%d", current_pc); - send_msg(duna_1apc_msg, sizeof_duna_1apc_msg); - } - } - else //masked pc - { warn("Unsupported masking (mask=0x%02x) for PC=%d in APC parameter -> ignored", - inbuffer[offset-1], current_pc); - } - } - return; -} - -// send M3UA error msg -// send an eror msg with error_code. Additional parameter matches to the error code: -void MTP3asp__PT_PROVIDER::send_M3UA_error_msg(unsigned int error_code, unsigned int add_par ) -{ - encode_16b_int( error_msg+M3UA_MSG_OFFS+4, error_code); - encode_16b_int( error_msg+M3UA_MSG_OFFS+8, add_par); - send_msg(error_msg, sizeof_error_msg ); -}; - -// Coder functions for M3UA: int -> unsigned char array -//------------------------------------------------------ -// Result:Less significant byte in highest address -// Most Significant Byte first (in lowest address) = MSB = Big Endian = Network Byte Order -void MTP3asp__PT_PROVIDER::encode_32b_int(unsigned char *to, unsigned int from) -{ - to[3] = from & 0xFF; - from >>= 8; - to[2] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[0] = from & 0xFF; -} -//------------ - -unsigned int MTP3asp__PT_PROVIDER::decode_32b_int(const unsigned char *from) -{ - return from[3] | (from[2] << 8) | (from[1] << 16) | (from[0] << 24); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_24b_int(unsigned char *to, unsigned int from) -{ - to[2] = from & 0xFF; - from >>= 8; - to[1] = from & 0xFF; - from >>= 8; - to[0] = from & 0xFF; -} -//------------ - -unsigned int MTP3asp__PT_PROVIDER::decode_24b_int(const unsigned char *from) -{ - return from[2] | (from[1] << 8) | (from[0] << 16); -} -//------------ - -void MTP3asp__PT_PROVIDER::encode_16b_int(unsigned char *to, int from) -{ - to[1] = from & 0xFF; - from >>= 8; - to[0] = from & 0xFF; -} -//------------ - -unsigned int MTP3asp__PT_PROVIDER::decode_16b_int(const unsigned char *from) -{ - return from[1] | (from[0] << 8); -} -//------------ - -//skip par after tag -void MTP3asp__PT_PROVIDER::skip_par_after_tag(unsigned char* inbuffer, int &offset) -{ - offset += decode_16b_int(inbuffer+offset)-2; //the length contains - //the param hdr. itself - if (offset%4) offset += 4-(offset%4); //skipping padding -} -//------------ -#endif - - - -#ifdef TARGET_TEST -// -------------------------- -// Functions for Target testing -// -------------------------- -// In case of target this function handles the received message -void MTP3asp__PT_PROVIDER::message_incoming(const unsigned char* msg, int messageLength, int) -{ - OCTETSTRING rcvData = OCTETSTRING(messageLength, msg); - - int msgType = oct2int(substr(rcvData,0,1)); - switch (msgType) - { - case 0: //TRANSFERind message received - if(Tcp_is_up) //Registration was already performed - { - ASP__MTP3__TRANSFERind recv_msg; - MTP3__Field__sio recv_sio; - BITSTRING sio_bit = oct2bit(substr(rcvData,5,1)); - recv_sio.ni()= substr(sio_bit,0,2); - recv_sio.prio()= substr(sio_bit,2,2); - recv_sio.si()= substr(sio_bit,4,4); - recv_msg.sio() = recv_sio; - recv_msg.opc() = oct2int(substr(rcvData,6,4)); - recv_msg.dpc() = oct2int(substr(rcvData,10,4)); - recv_msg.sls() = oct2int(substr(rcvData,14,1)); - recv_msg.data() = substr(rcvData,15,rcvData.lengthof()-15); - if (Tcp_is_up == 1) //No unregistration ongoing - incoming_message(recv_msg); - else //Unregistration ongoing - log("Received ASP_MTP3_TRANSFERind is ignored since unregistration is started."); - } - else - error("Message was received before successful registration in M3UA server."); - break; - - case 4: //Status message received - { - int status = oct2int(substr(rcvData,5,1)); - if(Tcp_is_up == 2) // Unregistration ongoing - { - const char * rcvDat = oct2str(rcvData); - log("Message \"%s\" received. Status = %i", rcvDat, status); - if (status == 2) - { - log("Unregistration performed."); - Tcp_is_up = 0; - } - else if (status == 3) - error("Unsuccessful unregistration."); - else if (status == 5) { - if(forward_status) { - incoming_message(ASP__MTP3__STATUS(NULL_VALUE)); - } - else { - warn("Invalid STATUS message received from M3UA server with status code=%d.", status); - } - } - } - else if(Tcp_is_up == 1) // Active state - { - if (status == 5) { - if(forward_status) { - incoming_message(ASP__MTP3__STATUS(NULL_VALUE)); - } - } - else { - warn("Invalid STATUS message received from M3UA server with status code=%d.", status); - } - } - else // Registration ongoing - { - const char * rcvDat = oct2str(rcvData); - log("Message \"%s\" received. Status = %i", rcvDat, status); - if (status == 0) - { - log("Registration performed."); - Tcp_is_up = 1; - } - else { - error("Unsuccessful registration."); - } - } - } - break; - case 5: - { - if(forward_pause) incoming_message(ASP__MTP3__PAUSE(NULL_VALUE)); - } - break; - case 6: - { - if(forward_resume) incoming_message(ASP__MTP3__RESUME(NULL_VALUE)); - } - break; - - - default: //Unexpected message received - warn("Invalid message received from M3UA server."); - } -} - -void MTP3asp__PT_PROVIDER::Check_Target_TestPort_Variables() -{ - if (Sut_Pc==-1) error("Parameter SUT_Pc is not set."); - if (Tester_Pc==-1) error("Parameter TESTER_Pc is not set."); - if (!Ni_is_set) error("Parameter NI is not set."); - if (M3UA_version==0) error("Parameter M3UA_version cannot be set to 0 in TargetM3UA mode."); - -//packet header - header_descr = new PacketHeaderDescr( 1, 4, PacketHeaderDescr::Header_MSB); -} - -void MTP3asp__PT_PROVIDER::Check_Target_TestPort_Variables_STC() -{ - if( destinationname == NULL) error("Parameter DestinationName is not set in TargetSTC mode."); - - header_descr = new PacketHeaderDescr( 1, 4, PacketHeaderDescr::Header_MSB); -} - -void MTP3asp__PT_PROVIDER::Target_user_map(const char *system_port) -{ - Tcp_is_up = 0; - Check_Target_TestPort_Variables(); - map_user(); - - OCTETSTRING tcpData = int2oct(2,1); //Message type - if( destinationname == NULL) - tcpData = tcpData + int2oct(char2oct(system_port).lengthof()+15,4); //Length - else - tcpData = tcpData + int2oct(char2oct(destinationname).lengthof()+15,4); - tcpData = tcpData + int2oct(mtp3_ni,1); - tcpData = tcpData + int2oct(Sut_Pc,4); - tcpData = tcpData + int2oct(Tester_Pc,4); - tcpData = tcpData + int2oct(M3UA_version,1); - if( destinationname == NULL) - tcpData = tcpData + char2oct(system_port); - else - tcpData = tcpData + char2oct(destinationname); - - send_outgoing((const unsigned char*)tcpData,tcpData.lengthof()); - - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - TTCN_Logger::log_event_str("Registration message sent: "); - tcpData.log(); - TTCN_Logger::end_event(); - - int fd = get_socket_fd(); - pollfd pollFd = { fd, POLLIN, 0 }; - int nEvents = poll(&pollFd, 1, 3000 /* ms */); - if (nEvents == 0) - error("No response received for REGISTER message. Exiting after timeout."); - if (nEvents < 0 || (pollFd.revents & (POLLIN | POLLHUP)) == 0) - error("No response received for REGISTER message. Exiting after error (%d)", - (nEvents < 0) ? errno : 0); - Handle_Fd_Event(fd, TRUE, FALSE, FALSE); -} - -void MTP3asp__PT_PROVIDER::TargetSTC_user_map(const char *system_port) -{ - Tcp_is_up = 0; - Check_Target_TestPort_Variables_STC(); - map_user(); - - OCTETSTRING tcpData = int2oct(2,1); //Message type - tcpData = tcpData + int2oct(char2oct(destinationname).lengthof()+15,4); - tcpData = tcpData + int2oct(0,1); - tcpData = tcpData + int2oct(0,4); - tcpData = tcpData + int2oct(0,4); - tcpData = tcpData + int2oct(0,1); - tcpData = tcpData + char2oct(destinationname); - - send_outgoing((const unsigned char*)tcpData,tcpData.lengthof()); - - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - TTCN_Logger::log_event_str("Registration message sent: "); - tcpData.log(); - TTCN_Logger::end_event(); - - int fd = get_socket_fd(); - pollfd pollFd = { fd, POLLIN, 0 }; - int nEvents = poll(&pollFd, 1, 3000 /* ms */); - if (nEvents == 0) - error("No response received for REGISTER message. Exiting after timeout."); - if (nEvents < 0 || (pollFd.revents & (POLLIN | POLLHUP)) == 0) - error("No response received for REGISTER message. Exiting after error (%d)", - (nEvents < 0) ? errno : 0); - Handle_Fd_Event(fd, TRUE, FALSE, FALSE); -} - -void MTP3asp__PT_PROVIDER::Target_user_unmap(const char *system_port) -{ - OCTETSTRING tcpData = int2oct(3,1); //Message type - tcpData = tcpData + int2oct(6,4); //Length - tcpData = tcpData + int2oct(0,1); - send_outgoing((const unsigned char*)tcpData,tcpData.lengthof()); - - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("MTP3 Test Port (%s): ", get_name()); - TTCN_Logger::log_event_str("Unregistration message sent: "); - tcpData.log(); - TTCN_Logger::end_event(); - - Tcp_is_up = 2; //Unregistration ongoing - - while (Tcp_is_up == 2) - { - int fd = get_socket_fd(); - pollfd pollFd = { fd, POLLIN, 0 }; - int nEvents = poll(&pollFd, 1, 3000 /* ms */); - if (nEvents == 0) - error("No response received for UNREGISTER message. Exiting after timeout."); - if (nEvents < 0 || (pollFd.revents & (POLLIN | POLLHUP)) == 0) - error("No response received for UNREGISTER message. Exiting after error (%d)", - (nEvents < 0) ? errno : 0); - Handle_Fd_Event(fd, TRUE, FALSE, FALSE); - } - unmap_user(); -} -#endif -} diff --git a/MTP3asp_CNL113337/src/MTP3asp_PT.hh b/MTP3asp_CNL113337/src/MTP3asp_PT.hh deleted file mode 100644 index 340f24ffa..000000000 --- a/MTP3asp_CNL113337/src/MTP3asp_PT.hh +++ /dev/null @@ -1,249 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// // -// Copyright Test Competence Center (TCC) ETH 2009 // -// // -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied // -// // -/////////////////////////////////////////////////////////////////////////////// -// -// File: MTP3asp_PT.hh -// Description: Implementation of port MTP3asp_PT -// This test port is written to connect ttcn to SEA -// according to specification ITU-T SS7 MTP3, ANSI, TCC, MPT, IETF, -// Reference: ITU-T Recommendation Q.704, RFC3332 -// Rev: R11A01 -// Prodnr: CNL 113 337 -// Updated: 2009-04-03 -// Contact: http://ttcn.ericsson.se - - -#ifndef MTP3asp_PT_HH -#define MTP3asp_PT_HH - -#include - -#ifdef TARGET_TEST -#include "Abstract_Socket.hh" -#endif - -#ifndef TARGET_TEST -#include "mphclib.h" -#endif - - -#define MAXSIZE 1532 //+32 needed for M3UA -#define MTP3_ON 1 -#define MTP3_OFF 0 -namespace MTP3asp__Types { - class ASP__MTP3__TRANSFERind; - class ASP__MTP3__PAUSE; - class ASP__MTP3__RESUME; - class ASP__MTP3__STATUS; - class ASP__MTP3__TRANSFERreq; -} -namespace MTP3asp__PortType { - -class MTP3asp__PT_PROVIDER : public PORT -#ifdef TARGET_TEST - , public Abstract_Socket -#endif - { -protected: - // pointer to member: user_map/unmap methods - typedef void (MTP3asp__PT_PROVIDER::*usermap_t)(const char *system_port); - // pointer to member: user_connect methods - typedef void (MTP3asp__PT_PROVIDER::*userconnect_t)(); - // pointer to member: interpreter methods -#ifndef TARGET_TEST - typedef void (MTP3asp__PT_PROVIDER::*interpreter_t)(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con); - - void M3UA_interpreter(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con); - void M3UA_user_map(const char *system_port); - void M3UA_user_connect(); - void M3UA_user_unmap(const char *system_port); - void MTP3_interpreter(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con); - void MTP3_user_map(const char *system_port); // common for MTP3 ITU and MTP3 ANSI - void MTP3_user_connect(); - void MTP3_user_unmap(const char *system_port);// common for MTP3 ITU and MTP3 ANSI - void STC_user_connect(); - void STC_interpreter(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con); - void STC_user_map(const char *system_port); - void STC_user_unmap(const char *system_port); -#endif -#ifdef TARGET_TEST - //Map and unmap for target - void Target_user_map(const char *system_port); - void Target_user_unmap(const char *system_port); - void TargetSTC_user_map(const char *system_port); -#endif - -public: - MTP3asp__PT_PROVIDER(const char *par_port_name=NULL); - ~MTP3asp__PT_PROVIDER(); - - typedef enum { MTP3itu, MTP3ansi, MTP3ttc, MTP3mpt, M3UA, TargetM3UA, MTP3bttc,MTP3iup, STC, TargetSTC } MTPServiceType_t ; - - MTPServiceType_t MTPServiceType ; // ctor default is MTP3itu - void set_parameter(const char *parameter_name, const char *parameter_value); - void error(const char *msg, ...); - void log(const char *msg, ...); -#ifndef TARGET_TEST - void user_connect(); - - void set_channel(int chnl) {channel=chnl;}; - void MTP3_open_channel(boolean http); - void MTP3_close_connection(); - - boolean wait_for_open(); - int conn_state; - - interpreter_t interpreter; // pointer to interpreter members, ctor default is MTP3_ITU_interpreter - void doInterpret(unsigned char* inbuffer,int length,int from_channel,CONNECTION* con) - { (this->*interpreter)(inbuffer,length,from_channel, con); } -#endif - //parameter handling - boolean dynamicConnection, connectionUp; - char *hostname; - int httpport; - char *entityname; - int MTP_fd; - -protected: - void user_map(const char *system_port); - void user_unmap(const char *system_port); - - void debuglog(const char *msg, ...); - void warn(const char *msg, ...); - void close_log_event(); - - usermap_t user_map_p ; // pointer to user_map members, default is MTP3itu - usermap_t user_unmap_p; // pointer to user_unmap members, default is MTP3itu - userconnect_t user_connect_p; - - void user_start(); - void user_stop(); - - void outgoing_send(const MTP3asp__Types::ASP__MTP3__TRANSFERreq& send_par); - virtual void incoming_message - (const MTP3asp__Types::ASP__MTP3__TRANSFERind& incoming_par) = 0; - virtual void incoming_message - (const MTP3asp__Types::ASP__MTP3__PAUSE& incoming_par) = 0; - virtual void incoming_message - (const MTP3asp__Types::ASP__MTP3__RESUME& incoming_par) = 0; - virtual void incoming_message - (const MTP3asp__Types::ASP__MTP3__STATUS& incoming_par) = 0; -#ifndef TARGET_TEST - void encode_56bLSB_int(unsigned char *to, unsigned long long int from); - long long unsigned int decode_56bLSB_int(const unsigned char *from); - void encode_48bLSB_int(unsigned char *to, unsigned long long int from); - long long unsigned int decode_48bLSB_int(const unsigned char *from); - void encode_40bLSB_int(unsigned char *to, unsigned long long int from); - long long unsigned int decode_40bLSB_int(const unsigned char *from); - void encode_32bLSB_int(unsigned char *to, unsigned int from); - unsigned int decode_32bLSB_int(const unsigned char *from); - void encode_24bLSB_int(unsigned char *to, int from); - unsigned int decode_24bLSB_int(const unsigned char *from); - void encode_16bLSB_int(unsigned char *to, int from); - unsigned int decode_16bLSB_int(const unsigned char *from); - void encode_32b_int(unsigned char *to, unsigned int from); - unsigned int decode_32b_int(const unsigned char *from); - void encode_24b_int(unsigned char *to, unsigned int from); - unsigned int decode_24b_int(const unsigned char *from); - void encode_16b_int(unsigned char *to, int from); - unsigned int decode_16b_int(const unsigned char *from); - void skip_par_after_tag(unsigned char* inbuffer, int &offset); - - void GetPointCodes(unsigned int &sls,unsigned int &opc,unsigned int &dpc, unsigned char* msg); - void GetPointCodesIUP(unsigned int &cic,unsigned int &opc,unsigned int &dpc, unsigned char* msg); - void SetPointCodes(unsigned int sls, unsigned int opc, unsigned int dpc, unsigned char* msg); - void SetPointCodesIUP(unsigned int cic, unsigned int opc, unsigned int dpc, unsigned char* msg); - int ChangePointCodes(unsigned char* outbuff, unsigned char *inbuff, int len); - void Set_M3UA_SingleAPC(unsigned int pc, unsigned char* apc_par); //for ITU and ANSI - bool Check_M3UA_SingleITUAPC(unsigned int pc, unsigned char* apc_par); - void Send_DAVA_DUNA_to_APCinDAUD(unsigned int dava_sep, unsigned char* inbuffer, int &offset ); - void processing_MTP3_management_msg(unsigned char* inbuff,int len); - void processing_MTP3_test_msg(unsigned char* inbuff,int len); - int processing_M3UA_MGMT_msg(unsigned char* inbuff,int len); - int processing_M3UA_Transfer_msg(unsigned char* inbuff,int len); - int processing_M3UA_SSNM_msg(unsigned char* inbuff,int len); - int processing_M3UA_ASPSM_msg(unsigned char* inbuff,int len); - int processing_M3UA_ASPTM_msg(unsigned char* inbuff,int len); - int processing_M3UA_RKM_msg(unsigned char* inbuff,int len); - int processing_M3UA_unsupported_msg_class(unsigned char* inbuff,int len); - int Check_PcMatch(unsigned int opc, unsigned int dpc, unsigned char *buff); - void send_msg(unsigned char *outbuff, int length); - void send_M3UA_error_msg(unsigned int error_code, unsigned int add_par ); - void Check_TestPort_Variables(); - void Check_TestPort_Variables_STC(); -#endif -#ifdef TARGET_TEST - void Check_Target_TestPort_Variables(); - void Check_Target_TestPort_Variables_STC(); - - //Functions for abstract socket handling - void message_incoming(const unsigned char*, int length, int client_id = -1); - void Add_Fd_Read_Handler(int fd) { Handler_Add_Fd_Read(fd); } - void Add_Fd_Write_Handler(int fd) { Handler_Add_Fd_Write(fd); } - void Remove_Fd_Read_Handler(int fd) { Handler_Remove_Fd_Read(fd); } - void Remove_Fd_Write_Handler(int fd) { Handler_Remove_Fd_Write(fd); } - void Remove_Fd_All_Handlers(int fd) { Handler_Remove_Fd(fd); } - void Handler_Uninstall() { Uninstall_Handler(); } - void Timer_Set_Handler(double call_interval, boolean is_timeout = TRUE, - boolean call_anyway = TRUE, boolean is_periodic = TRUE) { - Handler_Set_Timer(call_interval, is_timeout, call_anyway, is_periodic); - } - const char* local_address_name() { return "localIPAddr";} - const char* local_port_name() { return "localPort";} - const char* remote_address_name(){ return "M3UAtarget_TCP_IPAddr";} - const char* remote_port_name() { return "M3UAtarget_TCP_Port";} - const char* halt_on_connection_reset_name(){ return "halt_on_connection_reset";} - const char* server_mode_name() { return "client_mode";} - const char* socket_debugging_name(){ return "socket_debugging";} - const char* nagling_name() { return "nagling";} - const char* server_backlog_name(){ return "server_backlog";} - const PacketHeaderDescr* Get_Header_Descriptor() const {return header_descr;} -#endif - -private: - void Handle_Fd_Event(int fd, boolean is_readable, boolean is_writable, boolean is_error); - void Handle_Timeout(double time_since_last_call); - - unsigned char M3UA_version; - int channel; - unsigned char buffer[MAXSIZE]; - char *destinationname; - char *iid_string; - boolean Ni_is_set; - int Loop,Filter,Sut_Pc,Tester_Pc; - typedef enum { AssocDown, AssocEstabl, AssocInac, AssocActive} M3UAStateType_t; - M3UAStateType_t M3UAState; - int mtp3_ni; // network indicator in case of MTP3 - int stored_bttc_octet; // used for storage of an additional first byte in MTP3bttc - -#ifndef TARGET_TEST - MPH_IID iid; - CONNECTION *myConnection; -#endif - bool forward_resume, forward_pause, forward_status; -#ifdef TARGET_TEST - int Tcp_is_up; - PacketHeaderDescr *header_descr; - bool is_packet_hdr_length_offset, is_packet_hdr_nr_bytes_in_length, - is_packet_hdr_byte_order; - int packet_hdr_length_offset, packet_hdr_nr_bytes_in_length; - PacketHeaderDescr::HeaderByteOrder packet_hdr_byte_order; -#endif -}; - -extern BOOLEAN f__MTP3__SEA__connect__extern - (MTP3asp__PT_PROVIDER& portRef, const CHARSTRING& Hostname, - const INTEGER& Port, const CHARSTRING& EntityName,const BOOLEAN& Http); - -extern BOOLEAN f__MTP3__SEA__disconnect__extern - (MTP3asp__PT_PROVIDER& portRef); - -} -#endif diff --git a/MTP3asp_CNL113337/src/MTP3asp_PortType.ttcn b/MTP3asp_CNL113337/src/MTP3asp_PortType.ttcn deleted file mode 100644 index 7c5a06b43..000000000 --- a/MTP3asp_CNL113337/src/MTP3asp_PortType.ttcn +++ /dev/null @@ -1,66 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// // -// Copyright Test Competence Center (TCC) ETH 2008 // -// // -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied // -// // -/////////////////////////////////////////////////////////////////////////////// -// -// File: MTP3asp_PortType.ttcn -// Reference: ITU-T Recommendation Q.704, RFC3332 -// Rev: R11A01 -// Prodnr: CNL 113 337 -// Updated: 2008-02-07 -// Contact: http://ttcn.ericsson.se - -module MTP3asp_PortType -{ - - import from MTP3asp_Types all; -// ************************************************************************* -// * MTP3 port type definitions * -// ************************************************************************* - - // MTP3 port type used by the component up to the MTP3 SAP - // (eg. any component connected to the MTP3 test port) - type port MTP3asp_PT message - { - in ASP_MTP3_TRANSFERind; - in ASP_MTP3_PAUSE; - in ASP_MTP3_RESUME; - in ASP_MTP3_STATUS; - out ASP_MTP3_TRANSFERreq; - } with {extension "provider internal"} //!!ethlel - - // MTP3 port type used by the component up to the MTP3 SAP - // (e.g. the distribution component) - type port MTP3asp_SP_PT message - { - in ASP_MTP3_TRANSFERreq; - out ASP_MTP3_TRANSFERind; - } - with {extension "internal"} - -//Connecting functions -//---------------------------- -/* -ethlel - -external function f_MTP3_SEA_connect - ( inout MTP3asp_PT portRef, - in charstring Hostname, - in integer Port, - in charstring EntityName, - in boolean Http //or MPH Port is provided - )return boolean; - -external function f_MTP3_SEA_disconnect - ( inout MTP3asp_PT portRef - )return boolean; -*/ - - -}//eof module diff --git a/MTP3asp_CNL113337/src/MTP3asp_Types.ttcn b/MTP3asp_CNL113337/src/MTP3asp_Types.ttcn deleted file mode 100644 index e96f42016..000000000 --- a/MTP3asp_CNL113337/src/MTP3asp_Types.ttcn +++ /dev/null @@ -1,324 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// // -// Copyright Test Competence Center (TCC) ETH 2006 // -// // -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied // -// // -/////////////////////////////////////////////////////////////////////////////// -// -// File: MTP3asp_Types.ttcn -// Description: CCSS7 Message Transfer Part primitive (ASP) definitions -// according to specification ITU-T SS7 MTP3, -// Reference: ITU-T Recommendation Q.704, RFC3332, ANSI T.1.111.1-2001, TCC -// Rev: R11A01 -// Prodnr: CNL 113 337 -// Updated: 2007-09-17 -// Contact: http://ttcn.ericsson.se -// -module MTP3asp_Types.objid - { - itu_t(0) identified_organization (4) etsi(0) reserved(127) - etsi_identified_organization(0) ericsson(5) testing (0) - generic(0) mtp3(0) v96(3) aspDefinitions(3) patchNo(0) - } - -{//start of the module - -// ************************************************************************* -// External encoding/decoding functions -// ************************************************************************* - -external function enc_MTP3_to_M3UAserver_msg (in MTP3_to_M3UAserver_msg pdu) - return octetstring - with { extension "prototype(convert)" - extension "encode(RAW)" - }; - -external function dec_MTP3_to_M3UAserver_msg(in octetstring stream) - return MTP3_to_M3UAserver_msg - with { extension "prototype(convert)" - extension "decode(RAW)" - }; - - -// ************************************************************************* -// * Type Definitions Part * -// ************************************************************************* -group Types -{ - group MessageTypes - { - group ASPs - { - //*********************************************************************** - //* ASP type definitions * - //* Note, that ASP types shall be TTCN-3 definitions to allow * - //* the use of anytype in the data field * - //*********************************************************************** - - type record MTP3_Field_sio - { - bitstring ni length(2), - bitstring prio length(2), - bitstring si length(4) - } with { variant "FIELDORDER(msb)"; - }; - - type record ASP_MTP3_TRANSFERind - { - MTP3_Field_sio sio, - integer opc, - integer dpc, - integer sls, - octetstring data - } with { variant (opc) "BYTEORDER(last), FIELDLENGTH(32)"; - variant (dpc) "BYTEORDER(last), FIELDLENGTH(32)"; - variant (sls) "FIELDLENGTH(8)" - }; - - type record ASP_MTP3_PAUSE {}; - - type record ASP_MTP3_RESUME {}; - - type record ASP_MTP3_STATUS {}; - - type record ASP_MTP3_TRANSFERreq - { - MTP3_Field_sio sio, - integer opc, - integer dpc, - integer sls, - octetstring data - } with { variant (opc) "BYTEORDER(last), FIELDLENGTH(32)"; - variant (dpc) "BYTEORDER(last), FIELDLENGTH(32)"; - variant (sls) "FIELDLENGTH(8)" - }; - }//end group ASPs - - //*********************************************************************** - //* Type definition of the message which is sent between MTP3 test port * - //* and SCTP server over TCP. * - //*********************************************************************** - group MTP3_SCTPserver - { - type record ASP_REGISTER_M3UA - { - integer ni (0..3), - integer sut_pc, - integer tester_pc, - integer m3ua_version, - charstring entity - } with { variant (ni) "FIELDLENGTH(8)"; - variant (sut_pc) "BYTEORDER(last), FIELDLENGTH(32)"; - variant (tester_pc) "BYTEORDER(last), FIELDLENGTH(32)"; - variant (m3ua_version) "FIELDLENGTH(8)" - }; - - - // Possible values: - // MTP3_to_SCTPserver_data/status: - const integer reg_ok_status := 0; - const integer reg_error_status := 1; - const integer unreg_ok_status := 2; - const integer unreg_error_status := 3; - - const integer send_error_status := 5; - const integer kill_status := 255; - - // MTP3_to_SCTPserver_data/pause: - const integer SCTP_COMLOST_pause := 0; - const integer M3UA_ASPDN_pause := 1; - const integer M3UA_ASPIA_pause := 2; - - // MTP3_to_SCTPserver_data/resume: - const integer ok_resume := 0; - - type union MTP3_to_SCTPserver_data - { - ASP_MTP3_TRANSFERind transfer_ind, - ASP_MTP3_TRANSFERreq transfer_req, - ASP_REGISTER_M3UA register, - integer unregister (0..255), - integer status (0..255), - integer pause (0..255), - integer resume (0..255) - } - - // MTP3_to_M3UAserver_msg/msgType: - const integer transfer_ind_msgType := 0; - const integer transfer_req_msgType := 1; - const integer register_msgType := 2; - const integer unregister_msgType := 3; - const integer status_msgType := 4; - const integer pause_msgType := 5; - const integer resume_msgType := 6; - - type record MTP3_to_M3UAserver_msg - { - integer msgType (0..255), - integer msgLength, - MTP3_to_SCTPserver_data data - } with { variant (data) "CROSSTAG( - transfer_ind, msgType = transfer_ind_msgType; - transfer_req, msgType = transfer_req_msgType; - register, msgType = register_msgType; - unregister, msgType = unregister_msgType; - status, msgType = status_msgType; - pause, msgType = pause_msgType; - resume, msgType = resume_msgType )"; - variant (msgLength) "FIELDLENGTH(32)"; - variant (msgLength) "LENGTHTO(msgType,msgLength,data)"; - variant (msgLength) "BYTEORDER(last)" - }; - }//end group MTP3_SCTPserver - }//end group Messagetypes -} with {encode "RAW"}//Types - -group Templates -{ - group MessageTemplates - { - group ASPtemplates - { - // ******************************************************************* - // * ASP template definitions * - // ******************************************************************* - - // Base templates - // These general templates can be used as an example or as a base - // template for other templates. - template ASP_MTP3_TRANSFERind t_ASP_MTP3_TRANSFERind - ( - template MTP3_Field_sio pl_SIO, - template integer pl_OPC, - template integer pl_DPC, - template integer pl_SLS, - template octetstring pl_data - ):= - { - sio := pl_SIO, - opc := pl_OPC, - dpc := pl_DPC, - sls := pl_SLS, - data := pl_data - } - - template ASP_MTP3_TRANSFERind tr_ASP_MTP3_TRANSFERind_sio - ( - template bitstring pl_NI, - template bitstring pl_PRIO, - template bitstring pl_SI, - template integer pl_OPC, - template integer pl_DPC, - template integer pl_SLS, - template octetstring pl_data - ):= - { - sio := - { - ni := pl_NI, - prio := pl_PRIO, - si := pl_SI - }, - opc := pl_OPC, - dpc := pl_DPC, - sls := pl_SLS, - data := pl_data - } - - template ASP_MTP3_TRANSFERind tr_ASP_MTP3_TRANSFERind := - { - sio := ?, - opc := ?, - dpc := ?, - sls := ?, - data := ? - } - - template ASP_MTP3_TRANSFERreq t_ASP_MTP3_TRANSFERreq - ( - MTP3_Field_sio pl_SIO, - integer pl_OPC, - integer pl_DPC, - integer pl_SLS, - octetstring pl_data - ):= - { - sio := pl_SIO, - opc := pl_OPC, - dpc := pl_DPC, - sls := pl_SLS, - data := pl_data - } - - template ASP_MTP3_TRANSFERreq tr_ASP_MTP3_TRANSFERreq_sio - ( - template bitstring pl_NI, - template bitstring pl_PRIO, - template bitstring pl_SI, - template integer pl_OPC, - template integer pl_DPC, - template integer pl_SLS, - template octetstring pl_data - ):= - { - sio := - { - ni := pl_NI, - prio := pl_PRIO, - si := pl_SI - }, - opc := pl_OPC, - dpc := pl_DPC, - sls := pl_SLS, - data := pl_data - } - - template ASP_MTP3_TRANSFERreq tr_ASP_MTP3_TRANSFERreq := - { - sio := ?, - opc := ?, - dpc := ?, - sls := ?, - data := ? - } - - template ASP_MTP3_TRANSFERind tr_ASP_MTP3_TRANSFERind_stc := - { - sio := - { - ni := '00'B, - prio := '00'B, - si := '0000'B - }, - opc := 0, - dpc := 0, - sls := 0, - data := ? - } - - template ASP_MTP3_TRANSFERreq t_ASP_MTP3_TRANSFERreq_stc - ( template octetstring pl_data ):= - { - sio := - { - ni := '00'B, - prio := '00'B, - si := '0000'B - }, - opc := 0, - dpc := 0, - sls := 0, - data := pl_data - } - - }//end group ASPtemplates - }//end group Messagetemplates -}//end group Templates - -}//end module - - diff --git a/SCCP_CNL113341/SCCP_CNL113341.tpd b/SCCP_CNL113341/SCCP_CNL113341.tpd deleted file mode 100644 index 31e515379..000000000 --- a/SCCP_CNL113341/SCCP_CNL113341.tpd +++ /dev/null @@ -1,87 +0,0 @@ - - - - SCCP_CNL113341 - - - - - - - - - - - - - - - - - - - USE_MTP3_DISTRIBUTOR - - - - - true - true - true - bin/SCCP_CNL113341 - Level 3 - Creating object files with dependency update - - - bin - - - - - - - true - true - true - bin/SCCP_CNL113341 - - USE_MTP3_DISTRIBUTOR - - Level 3 - Creating object files with dependency update - - - bin - - - - - - - true - true - true - bin/SCCP_CNL113341 - Level 3 - Creating object files with dependency update - - - bin - - - - - diff --git a/SCCP_CNL113341/demo/General_Types.ttcn b/SCCP_CNL113341/demo/General_Types.ttcn deleted file mode 120000 index 354ebf3fc..000000000 --- a/SCCP_CNL113341/demo/General_Types.ttcn +++ /dev/null @@ -1 +0,0 @@ -../../../ProtocolModules/COMMON/src/General_Types.ttcn \ No newline at end of file diff --git a/SCCP_CNL113341/demo/MTP3asp_PT.cc b/SCCP_CNL113341/demo/MTP3asp_PT.cc deleted file mode 120000 index 44d08bbf4..000000000 --- a/SCCP_CNL113341/demo/MTP3asp_PT.cc +++ /dev/null @@ -1 +0,0 @@ -../../../TestPorts/MTP3asp_CNL113337/src/MTP3asp_PT.cc \ No newline at end of file diff --git a/SCCP_CNL113341/demo/MTP3asp_PT.hh b/SCCP_CNL113341/demo/MTP3asp_PT.hh deleted file mode 120000 index 30dfc24c4..000000000 --- a/SCCP_CNL113341/demo/MTP3asp_PT.hh +++ /dev/null @@ -1 +0,0 @@ -../../../TestPorts/MTP3asp_CNL113337/src/MTP3asp_PT.hh \ No newline at end of file diff --git a/SCCP_CNL113341/demo/MTP3asp_PortType.ttcn b/SCCP_CNL113341/demo/MTP3asp_PortType.ttcn deleted file mode 120000 index 199486403..000000000 --- a/SCCP_CNL113341/demo/MTP3asp_PortType.ttcn +++ /dev/null @@ -1 +0,0 @@ -../../../TestPorts/MTP3asp_CNL113337/src/MTP3asp_PortType.ttcn \ No newline at end of file diff --git a/SCCP_CNL113341/demo/MTP3asp_Types.ttcn b/SCCP_CNL113341/demo/MTP3asp_Types.ttcn deleted file mode 120000 index 9f03c54ed..000000000 --- a/SCCP_CNL113341/demo/MTP3asp_Types.ttcn +++ /dev/null @@ -1 +0,0 @@ -../../../TestPorts/MTP3asp_CNL113337/src/MTP3asp_Types.ttcn \ No newline at end of file diff --git a/SCCP_CNL113341/demo/Makefile.ini b/SCCP_CNL113341/demo/Makefile.ini deleted file mode 100644 index 4e764a323..000000000 --- a/SCCP_CNL113341/demo/Makefile.ini +++ /dev/null @@ -1,737 +0,0 @@ -# This Makefile was generated by the Makefile Generator -# of the TTCN-3 Test Executor version 1.7.pl0 -# for Gabor Bettesch (ethgbh@mwux018) on Tue Apr 3 10:18:42 2007 - -# Copyright 2000-2007 Test Competence Center, Ericsson R & D, Hungary -# For trouble reporting use the tool MTTSMS. -# For TR writers guide please visit the web page: http://ttcn.ericsson.se - -# The following make commands are available: -# - make, make all Builds the executable test suite. -# - make archive Archives all source files. -# - make check Checks the semantics of TTCN-3 and ASN.1 modules. -# - make clean Removes all generated files. -# - make compile Translates TTCN-3 and ASN.1 modules to C++. -# - make dep Creates/updates dependency list. -# - make objects Builds the object files without linking the executable. -# - make preprocess Preprocess TTCN-3 files. -# - make tags Creates/updates tags file using ctags. - -# WARNING! This Makefile can be used with GNU make only. -# Other versions of make may report syntax errors in it. - -# -# Do NOT touch this line... -# -.PHONY: all archive check clean dep objects preprocess - -# -# Set these variables... -# - -# The path of your TTCN-3 Test Executor installation: -# Uncomment this line to override the environment variable. -# TTCN3_DIR = - -# Your platform: (SOLARIS, SOLARIS8, LINUX, FREEBSD or WIN32) -PLATFORM = SOLARIS8 - -# Your C++ compiler: -CXX = g++ - -# C preprocessor used for TTCN-3 files: -CPP = cpp - -# Flags for the C++ preprocessor (and makedepend as well): -CPPFLAGS = -D$(PLATFORM) -I$(TTCN3_DIR)/include -I$(SEA_DIR)/include - -# Flags for preprocessing TTCN-3 files: -CPPFLAGS_TTCN3 = - -# Flags for the C++ compiler: -CXXFLAGS = -Wall - -# Flags for the linker: -LDFLAGS = - -# Flags for the TTCN-3 and ASN.1 compiler: -COMPILER_FLAGS = -L - -# Execution mode: (either ttcn3 or ttcn3-parallel) -TTCN3_LIB = ttcn3-parallel - -# The path of your OpenSSL installation: -# If you do not have your own one, leave it unchanged. -OPENSSL_DIR = $(TTCN3_DIR) - -SEA_DIR = /vobs/ttcn/TCC_Releases/Other/SEA_LATEST -# Directory to store the archived source files: -ARCHIVE_DIR = backup - -# -# You may change these variables. Add your files if necessary... -# - -# TTCN-3 modules of this project: -TTCN3_MODULES = General_Types.ttcn MTP3asp_PortType.ttcn MTP3asp_Types.ttcn SCCP_Emulation.ttcn SCCP_Types.ttcn SCCPasp_Types.ttcn SCCP_selftest.ttcn SCCP_Testcases.ttcn - -# TTCN-3 modules to preprocess: -TTCN3_PP_MODULES = SCCP_Mapping.ttcnpp - -# Files to include in TTCN-3 preprocessed modules: -TTCN3_INCLUDES = - -# ASN.1 modules of this project: -ASN1_MODULES = - -# TTCN-3 source files generated by the C preprocessor: -PREPROCESSED_TTCN3_MODULES = SCCP_Mapping.ttcn - -# C++ source & header files generated from the TTCN-3 & ASN.1 modules of -# this project: -GENERATED_SOURCES = $(TTCN3_MODULES:.ttcn=.cc) $(TTCN3_PP_MODULES:.ttcnpp=.cc) $(ASN1_MODULES:.asn=.cc) -GENERATED_HEADERS = $(GENERATED_SOURCES:.cc=.hh) - -# C/C++ Source & header files of Test Ports, external functions and -# other modules: -USER_SOURCES = MTP3asp_PT.cc -USER_HEADERS = MTP3asp_PT.hh - -# Object files of this project that are needed for the executable test suite: -OBJECTS = $(GENERATED_SOURCES:.cc=.o) $(USER_SOURCES:.cc=.o) - -# Other files of the project (Makefile, configuration files, etc.) -# that will be added to the archived source files: -OTHER_FILES = Makefile SCCP_selftest.cfg - -# The name of the executable test suite: -TARGET = SCCP_selftest - -# -# Do not modify these unless you know what you are doing... -# Platform specific additional libraries: -# -SOLARIS_LIBS = -lsocket -lnsl -SOLARIS8_LIBS = -lsocket -lnsl -LINUX_LIBS = -FREEBSD_LIBS = -WIN32_LIBS = - -# -# Rules for building the executable... -# - -all: $(TARGET) ; - -objects: $(OBJECTS) ; - -$(TARGET): $(OBJECTS) - $(CXX) $(LDFLAGS) -o $@ $^ \ - -L$(TTCN3_DIR)/lib -l$(TTCN3_LIB) \ - -L$(OPENSSL_DIR)/lib -lcrypto $($(PLATFORM)_LIBS) \ - $(SEA_DIR)/lib/libmphclib.a - -.cc.o .c.o: - $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $< - -%.ttcn: %.ttcnpp $(TTCN3_INCLUDES) - $(CPP) -x c -nostdinc $(CPPFLAGS_TTCN3) $< $@ - -preprocess: $(PREPROCESSED_TTCN3_MODULES) ; - -$(GENERATED_SOURCES) $(GENERATED_HEADERS): compile - @if [ ! -f $@ ]; then $(RM) compile; $(MAKE) compile; fi - -check: $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES) - $(TTCN3_DIR)/bin/compiler -s $(COMPILER_FLAGS) $^ - -compile: $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES) - $(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) $^ - $? - touch $@ - -browserdata.dat: $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES) - $(TTCN3_DIR)/bin/compiler -B -s $(COMPILER_FLAGS) $^ - -tags: $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES) \ -$(USER_HEADERS) $(USER_SOURCES) - $(TTCN3_DIR)/bin/ctags_ttcn3 --line-directives=yes $^ - -clean: - -$(RM) $(TARGET) $(OBJECTS) $(GENERATED_HEADERS) \ - $(GENERATED_SOURCES) $(PREPROCESSED_TTCN3_MODULES) compile \ - browserdata.dat tags *.log - -dep: $(GENERATED_SOURCES) $(USER_SOURCES) - makedepend $(CPPFLAGS) $^ - -archive: - mkdir -p $(ARCHIVE_DIR) - tar -cvhf - $(TTCN3_MODULES) $(TTCN3_PP_MODULES) \ - $(TTCN3_INCLUDES) $(ASN1_MODULES) \ - $(USER_HEADERS) $(USER_SOURCES) $(OTHER_FILES) \ - | gzip >$(ARCHIVE_DIR)/`basename $(TARGET) .exe`-`date '+%y%m%d-%H%M'`.tgz - -# -# Add your rules here if necessary... -# - -# DO NOT DELETE - -General_Types.o: General_Types.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TTCN3.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/version.h -General_Types.o: /usr/include/string.h /usr/include/iso/string_iso.h -General_Types.o: /usr/include/sys/feature_tests.h /usr/include/sys/isa_defs.h -General_Types.o: /usr/include/stdio.h /usr/include/iso/stdio_iso.h -General_Types.o: /usr/include/sys/va_list.h /usr/include/stdio_tag.h -General_Types.o: /usr/include/stdio_impl.h -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Basetype.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Types.h -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Encdec.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Template.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Integer.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Optional.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/BER.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Logger.hh -General_Types.o: /usr/include/stdlib.h /usr/include/iso/stdlib_iso.h -General_Types.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -General_Types.o: /usr/include/sys/time.h /usr/include/sys/types.h -General_Types.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -General_Types.o: /usr/include/sys/select.h /usr/include/time.h -General_Types.o: /usr/include/iso/time_iso.h -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Textbuf.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Error.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Parameters.h -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Float.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Boolean.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Null.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Objid.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Verdicttype.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Component.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Bitstring.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/RAW.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Hexstring.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Octetstring.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Any.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Charstring.hh -General_Types.o: /usr/include/regex.h -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Universal_charstring.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Struct_of.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Array.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_CharacterString.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_External.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_EmbeddedPDV.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Addfunc.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Timer.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Port.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Module_list.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Snapshot.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Default.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Runtime.hh -General_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TEXT.hh -MTP3asp_PortType.o: MTP3asp_PortType.hh MTP3asp_Types.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TTCN3.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/version.h -MTP3asp_PortType.o: /usr/include/string.h /usr/include/iso/string_iso.h -MTP3asp_PortType.o: /usr/include/sys/feature_tests.h -MTP3asp_PortType.o: /usr/include/sys/isa_defs.h /usr/include/stdio.h -MTP3asp_PortType.o: /usr/include/iso/stdio_iso.h /usr/include/sys/va_list.h -MTP3asp_PortType.o: /usr/include/stdio_tag.h /usr/include/stdio_impl.h -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Basetype.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Types.h -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Encdec.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Template.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Integer.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Optional.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/BER.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Logger.hh -MTP3asp_PortType.o: /usr/include/stdlib.h /usr/include/iso/stdlib_iso.h -MTP3asp_PortType.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -MTP3asp_PortType.o: /usr/include/sys/time.h /usr/include/sys/types.h -MTP3asp_PortType.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -MTP3asp_PortType.o: /usr/include/sys/select.h /usr/include/time.h -MTP3asp_PortType.o: /usr/include/iso/time_iso.h -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Textbuf.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Error.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Parameters.h -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Float.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Boolean.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Null.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Objid.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Verdicttype.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Component.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Bitstring.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/RAW.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Hexstring.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Octetstring.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Any.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Charstring.hh -MTP3asp_PortType.o: /usr/include/regex.h -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Universal_charstring.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Struct_of.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Array.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_CharacterString.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_External.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_EmbeddedPDV.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Addfunc.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Timer.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Port.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Module_list.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Snapshot.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Default.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Runtime.hh -MTP3asp_PortType.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TEXT.hh -MTP3asp_PortType.o: MTP3asp_PT.hh -MTP3asp_PortType.o: /vobs/ttcn/TCC_Releases/Other/SEA_LATEST/include/mphclib.h -MTP3asp_Types.o: MTP3asp_Types.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TTCN3.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/version.h -MTP3asp_Types.o: /usr/include/string.h /usr/include/iso/string_iso.h -MTP3asp_Types.o: /usr/include/sys/feature_tests.h /usr/include/sys/isa_defs.h -MTP3asp_Types.o: /usr/include/stdio.h /usr/include/iso/stdio_iso.h -MTP3asp_Types.o: /usr/include/sys/va_list.h /usr/include/stdio_tag.h -MTP3asp_Types.o: /usr/include/stdio_impl.h -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Basetype.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Types.h -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Encdec.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Template.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Integer.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Optional.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/BER.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Logger.hh -MTP3asp_Types.o: /usr/include/stdlib.h /usr/include/iso/stdlib_iso.h -MTP3asp_Types.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -MTP3asp_Types.o: /usr/include/sys/time.h /usr/include/sys/types.h -MTP3asp_Types.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -MTP3asp_Types.o: /usr/include/sys/select.h /usr/include/time.h -MTP3asp_Types.o: /usr/include/iso/time_iso.h -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Textbuf.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Error.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Parameters.h -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Float.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Boolean.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Null.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Objid.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Verdicttype.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Component.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Bitstring.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/RAW.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Hexstring.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Octetstring.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Any.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Charstring.hh -MTP3asp_Types.o: /usr/include/regex.h -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Universal_charstring.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Struct_of.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Array.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_CharacterString.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_External.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_EmbeddedPDV.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Addfunc.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Timer.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Port.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Module_list.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Snapshot.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Default.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Runtime.hh -MTP3asp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TEXT.hh -SCCP_Emulation.o: SCCP_Emulation.hh SCCP_Mapping.hh SCCP_Types.hh -SCCP_Emulation.o: MTP3asp_PortType.hh MTP3asp_Types.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TTCN3.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/version.h -SCCP_Emulation.o: /usr/include/string.h /usr/include/iso/string_iso.h -SCCP_Emulation.o: /usr/include/sys/feature_tests.h -SCCP_Emulation.o: /usr/include/sys/isa_defs.h /usr/include/stdio.h -SCCP_Emulation.o: /usr/include/iso/stdio_iso.h /usr/include/sys/va_list.h -SCCP_Emulation.o: /usr/include/stdio_tag.h /usr/include/stdio_impl.h -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Basetype.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Types.h -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Encdec.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Template.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Integer.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Optional.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/BER.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Logger.hh -SCCP_Emulation.o: /usr/include/stdlib.h /usr/include/iso/stdlib_iso.h -SCCP_Emulation.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -SCCP_Emulation.o: /usr/include/sys/time.h /usr/include/sys/types.h -SCCP_Emulation.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -SCCP_Emulation.o: /usr/include/sys/select.h /usr/include/time.h -SCCP_Emulation.o: /usr/include/iso/time_iso.h -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Textbuf.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Error.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Parameters.h -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Float.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Boolean.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Null.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Objid.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Verdicttype.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Component.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Bitstring.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/RAW.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Hexstring.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Octetstring.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Any.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Charstring.hh -SCCP_Emulation.o: /usr/include/regex.h -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Universal_charstring.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Struct_of.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Array.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_CharacterString.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_External.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_EmbeddedPDV.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Addfunc.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Timer.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Port.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Module_list.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Snapshot.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Default.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Runtime.hh -SCCP_Emulation.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TEXT.hh -SCCP_Emulation.o: MTP3asp_PT.hh -SCCP_Emulation.o: /vobs/ttcn/TCC_Releases/Other/SEA_LATEST/include/mphclib.h -SCCP_Emulation.o: SCCPasp_Types.hh General_Types.hh -SCCP_Types.o: SCCP_Types.hh MTP3asp_PortType.hh MTP3asp_Types.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TTCN3.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/version.h -SCCP_Types.o: /usr/include/string.h /usr/include/iso/string_iso.h -SCCP_Types.o: /usr/include/sys/feature_tests.h /usr/include/sys/isa_defs.h -SCCP_Types.o: /usr/include/stdio.h /usr/include/iso/stdio_iso.h -SCCP_Types.o: /usr/include/sys/va_list.h /usr/include/stdio_tag.h -SCCP_Types.o: /usr/include/stdio_impl.h -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Basetype.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Types.h -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Encdec.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Template.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Integer.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Optional.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/BER.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Logger.hh -SCCP_Types.o: /usr/include/stdlib.h /usr/include/iso/stdlib_iso.h -SCCP_Types.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -SCCP_Types.o: /usr/include/sys/time.h /usr/include/sys/types.h -SCCP_Types.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -SCCP_Types.o: /usr/include/sys/select.h /usr/include/time.h -SCCP_Types.o: /usr/include/iso/time_iso.h -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Textbuf.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Error.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Parameters.h -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Float.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Boolean.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Null.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Objid.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Verdicttype.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Component.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Bitstring.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/RAW.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Hexstring.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Octetstring.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Any.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Charstring.hh -SCCP_Types.o: /usr/include/regex.h -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Universal_charstring.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Struct_of.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Array.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_CharacterString.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_External.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_EmbeddedPDV.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Addfunc.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Timer.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Port.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Module_list.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Snapshot.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Default.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Runtime.hh -SCCP_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TEXT.hh -SCCP_Types.o: MTP3asp_PT.hh -SCCP_Types.o: /vobs/ttcn/TCC_Releases/Other/SEA_LATEST/include/mphclib.h -SCCP_Types.o: SCCPasp_Types.hh General_Types.hh -SCCPasp_Types.o: SCCPasp_Types.hh General_Types.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TTCN3.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/version.h -SCCPasp_Types.o: /usr/include/string.h /usr/include/iso/string_iso.h -SCCPasp_Types.o: /usr/include/sys/feature_tests.h /usr/include/sys/isa_defs.h -SCCPasp_Types.o: /usr/include/stdio.h /usr/include/iso/stdio_iso.h -SCCPasp_Types.o: /usr/include/sys/va_list.h /usr/include/stdio_tag.h -SCCPasp_Types.o: /usr/include/stdio_impl.h -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Basetype.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Types.h -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Encdec.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Template.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Integer.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Optional.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/BER.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Logger.hh -SCCPasp_Types.o: /usr/include/stdlib.h /usr/include/iso/stdlib_iso.h -SCCPasp_Types.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -SCCPasp_Types.o: /usr/include/sys/time.h /usr/include/sys/types.h -SCCPasp_Types.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -SCCPasp_Types.o: /usr/include/sys/select.h /usr/include/time.h -SCCPasp_Types.o: /usr/include/iso/time_iso.h -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Textbuf.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Error.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Parameters.h -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Float.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Boolean.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Null.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Objid.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Verdicttype.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Component.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Bitstring.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/RAW.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Hexstring.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Octetstring.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Any.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Charstring.hh -SCCPasp_Types.o: /usr/include/regex.h -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Universal_charstring.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Struct_of.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Array.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_CharacterString.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_External.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_EmbeddedPDV.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Addfunc.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Timer.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Port.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Module_list.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Snapshot.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Default.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Runtime.hh -SCCPasp_Types.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TEXT.hh -SCCP_selftest.o: SCCP_selftest.hh SCCP_Emulation.hh SCCP_Mapping.hh -SCCP_selftest.o: SCCP_Types.hh MTP3asp_PortType.hh MTP3asp_Types.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TTCN3.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/version.h -SCCP_selftest.o: /usr/include/string.h /usr/include/iso/string_iso.h -SCCP_selftest.o: /usr/include/sys/feature_tests.h /usr/include/sys/isa_defs.h -SCCP_selftest.o: /usr/include/stdio.h /usr/include/iso/stdio_iso.h -SCCP_selftest.o: /usr/include/sys/va_list.h /usr/include/stdio_tag.h -SCCP_selftest.o: /usr/include/stdio_impl.h -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Basetype.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Types.h -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Encdec.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Template.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Integer.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Optional.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/BER.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Logger.hh -SCCP_selftest.o: /usr/include/stdlib.h /usr/include/iso/stdlib_iso.h -SCCP_selftest.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -SCCP_selftest.o: /usr/include/sys/time.h /usr/include/sys/types.h -SCCP_selftest.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -SCCP_selftest.o: /usr/include/sys/select.h /usr/include/time.h -SCCP_selftest.o: /usr/include/iso/time_iso.h -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Textbuf.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Error.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Parameters.h -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Float.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Boolean.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Null.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Objid.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Verdicttype.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Component.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Bitstring.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/RAW.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Hexstring.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Octetstring.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Any.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Charstring.hh -SCCP_selftest.o: /usr/include/regex.h -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Universal_charstring.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Struct_of.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Array.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_CharacterString.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_External.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_EmbeddedPDV.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Addfunc.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Timer.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Port.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Module_list.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Snapshot.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Default.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Runtime.hh -SCCP_selftest.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TEXT.hh -SCCP_selftest.o: MTP3asp_PT.hh -SCCP_selftest.o: /vobs/ttcn/TCC_Releases/Other/SEA_LATEST/include/mphclib.h -SCCP_selftest.o: SCCPasp_Types.hh General_Types.hh -SCCP_Testcases.o: SCCP_Testcases.hh SCCP_Emulation.hh SCCP_Mapping.hh -SCCP_Testcases.o: SCCP_Types.hh MTP3asp_PortType.hh MTP3asp_Types.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TTCN3.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/version.h -SCCP_Testcases.o: /usr/include/string.h /usr/include/iso/string_iso.h -SCCP_Testcases.o: /usr/include/sys/feature_tests.h -SCCP_Testcases.o: /usr/include/sys/isa_defs.h /usr/include/stdio.h -SCCP_Testcases.o: /usr/include/iso/stdio_iso.h /usr/include/sys/va_list.h -SCCP_Testcases.o: /usr/include/stdio_tag.h /usr/include/stdio_impl.h -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Basetype.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Types.h -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Encdec.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Template.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Integer.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Optional.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/BER.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Logger.hh -SCCP_Testcases.o: /usr/include/stdlib.h /usr/include/iso/stdlib_iso.h -SCCP_Testcases.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -SCCP_Testcases.o: /usr/include/sys/time.h /usr/include/sys/types.h -SCCP_Testcases.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -SCCP_Testcases.o: /usr/include/sys/select.h /usr/include/time.h -SCCP_Testcases.o: /usr/include/iso/time_iso.h -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Textbuf.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Error.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Parameters.h -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Float.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Boolean.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Null.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Objid.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Verdicttype.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Component.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Bitstring.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/RAW.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Hexstring.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Octetstring.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Any.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Charstring.hh -SCCP_Testcases.o: /usr/include/regex.h -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Universal_charstring.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Struct_of.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Array.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_CharacterString.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_External.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_EmbeddedPDV.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Addfunc.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Timer.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Port.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Module_list.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Snapshot.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Default.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Runtime.hh -SCCP_Testcases.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TEXT.hh -SCCP_Testcases.o: MTP3asp_PT.hh -SCCP_Testcases.o: /vobs/ttcn/TCC_Releases/Other/SEA_LATEST/include/mphclib.h -SCCP_Testcases.o: SCCPasp_Types.hh General_Types.hh -SCCP_Mapping.o: SCCP_Mapping.hh SCCP_Types.hh MTP3asp_PortType.hh -SCCP_Mapping.o: MTP3asp_Types.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TTCN3.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/version.h -SCCP_Mapping.o: /usr/include/string.h /usr/include/iso/string_iso.h -SCCP_Mapping.o: /usr/include/sys/feature_tests.h /usr/include/sys/isa_defs.h -SCCP_Mapping.o: /usr/include/stdio.h /usr/include/iso/stdio_iso.h -SCCP_Mapping.o: /usr/include/sys/va_list.h /usr/include/stdio_tag.h -SCCP_Mapping.o: /usr/include/stdio_impl.h -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Basetype.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Types.h -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Encdec.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Template.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Integer.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Optional.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/BER.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Logger.hh -SCCP_Mapping.o: /usr/include/stdlib.h /usr/include/iso/stdlib_iso.h -SCCP_Mapping.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -SCCP_Mapping.o: /usr/include/sys/time.h /usr/include/sys/types.h -SCCP_Mapping.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -SCCP_Mapping.o: /usr/include/sys/select.h /usr/include/time.h -SCCP_Mapping.o: /usr/include/iso/time_iso.h -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Textbuf.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Error.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Parameters.h -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Float.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Boolean.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Null.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Objid.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Verdicttype.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Component.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Bitstring.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/RAW.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Hexstring.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Octetstring.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Any.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Charstring.hh -SCCP_Mapping.o: /usr/include/regex.h -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Universal_charstring.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Struct_of.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Array.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_CharacterString.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_External.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_EmbeddedPDV.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Addfunc.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Timer.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Port.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Module_list.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Snapshot.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Default.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Runtime.hh -SCCP_Mapping.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TEXT.hh -SCCP_Mapping.o: MTP3asp_PT.hh -SCCP_Mapping.o: /vobs/ttcn/TCC_Releases/Other/SEA_LATEST/include/mphclib.h -SCCP_Mapping.o: SCCPasp_Types.hh General_Types.hh -MTP3asp_PT.o: /usr/include/stdio.h /usr/include/iso/stdio_iso.h -MTP3asp_PT.o: /usr/include/sys/feature_tests.h /usr/include/sys/isa_defs.h -MTP3asp_PT.o: /usr/include/sys/va_list.h /usr/include/stdio_tag.h -MTP3asp_PT.o: /usr/include/stdio_impl.h /usr/include/stdlib.h -MTP3asp_PT.o: /usr/include/iso/stdlib_iso.h /usr/include/sys/types.h -MTP3asp_PT.o: /usr/include/sys/machtypes.h /usr/include/sys/int_types.h -MTP3asp_PT.o: /usr/include/sys/select.h /usr/include/sys/time.h -MTP3asp_PT.o: /usr/include/time.h /usr/include/iso/time_iso.h -MTP3asp_PT.o: /usr/include/netinet/in.h /usr/include/sys/stream.h -MTP3asp_PT.o: /usr/include/sys/vnode.h /usr/include/sys/t_lock.h -MTP3asp_PT.o: /usr/include/sys/machlock.h /usr/include/sys/param.h -MTP3asp_PT.o: /usr/include/sys/unistd.h /usr/include/sys/mutex.h -MTP3asp_PT.o: /usr/include/sys/rwlock.h /usr/include/sys/semaphore.h -MTP3asp_PT.o: /usr/include/sys/condvar.h /usr/include/sys/time_impl.h -MTP3asp_PT.o: /usr/include/sys/cred.h /usr/include/sys/uio.h -MTP3asp_PT.o: /usr/include/sys/resource.h /usr/include/vm/seg_enum.h -MTP3asp_PT.o: /usr/include/sys/poll.h /usr/include/sys/strmdep.h -MTP3asp_PT.o: /usr/include/sys/model.h /usr/include/sys/strft.h -MTP3asp_PT.o: /usr/include/sys/byteorder.h /usr/include/netdb.h -MTP3asp_PT.o: /usr/include/sys/socket.h /usr/include/sys/netconfig.h -MTP3asp_PT.o: /usr/include/sys/un.h /usr/include/net/if_dl.h -MTP3asp_PT.o: /usr/include/sys/wait.h /usr/include/sys/siginfo.h -MTP3asp_PT.o: /usr/include/sys/machsig.h /usr/include/sys/procset.h -MTP3asp_PT.o: /usr/include/unistd.h /usr/include/arpa/inet.h -MTP3asp_PT.o: /usr/include/stdarg.h /usr/include/iso/stdarg_iso.h -MTP3asp_PT.o: /usr/include/string.h /usr/include/iso/string_iso.h -MTP3asp_PT.o: MTP3asp_PT.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TTCN3.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/version.h -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Basetype.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Types.h -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Encdec.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Template.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Integer.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Optional.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/BER.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Logger.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Textbuf.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Error.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Parameters.h -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Float.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Boolean.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Null.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Objid.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Verdicttype.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Component.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Bitstring.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/RAW.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Hexstring.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Octetstring.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_Any.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Charstring.hh -MTP3asp_PT.o: /usr/include/regex.h -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Universal_charstring.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Struct_of.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Array.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_CharacterString.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_External.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/ASN_EmbeddedPDV.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Addfunc.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Timer.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Port.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Module_list.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Snapshot.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Default.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/Runtime.hh -MTP3asp_PT.o: /mnt/projects/TTCN/Releases/TTCNv3-latest/include/TEXT.hh -MTP3asp_PT.o: /vobs/ttcn/TCC_Releases/Other/SEA_LATEST/include/mphclib.h -MTP3asp_PT.o: MTP3asp_Types.hh MTP3asp_PortType.hh diff --git a/SCCP_CNL113341/demo/N_UNITDATAtest_600longdata_xudt_ansi_log b/SCCP_CNL113341/demo/N_UNITDATAtest_600longdata_xudt_ansi_log deleted file mode 100644 index b8b30219a..000000000 --- a/SCCP_CNL113341/demo/N_UNITDATAtest_600longdata_xudt_ansi_log +++ /dev/null @@ -1,2141 +0,0 @@ -18:21:32.381643 hc TTCN-3 Host Controller started on duna199. -18:21:32.385186 hc The address of MC was set to duna199[159.107.196.57]:38400 -18:21:32.387940 hc Connected to MC. -18:21:41.084400 hc Processing configuration data received from MC. -18:21:41.161669 hc Module SCCP has the following parameters: tsp_maxLocalReference := 16777216.000000, tsp_max_ConnectionId := 16777216.000000, tsp_force_xudt := 1, tsp_SIF_MaxLength := 272 -18:21:41.162623 hc Module SCCP_selftest has the following parameters: tsp_own_GT := '14377760'H, tsp_remote_GT := '14375760'H, tsp_SSN := 2, tsp_SIO := '83'O, tsp_own_SPC := 16382, tsp_remote_SPC := 16383, tsp_SLS := 0, tsp_sccp_serviceType := "mtp3_ansi" -18:21:41.163400 hc Module SCCP_typedefs has the following parameters: tspc_timer_T_conn_est := 120.000000, tspc_timer_T_ias := 600.000000, tspc_timer_T_iar := 1260.000000, tspc_timer_T_rel := 20.000000, tspc_timer_T_repeat_rel := 20.000000, tspc_timer_T_int := 60.000000, tspc_timer_T_guard := 1500.000000, tspc_timer_T_reset := 20.000000, tspc_timer_T_internal_reset := 0.000000, tspc_timer_guard := 120.000000 -18:21:41.164026 hc Initializing module MTP3_ASPs. -18:21:41.164735 hc Initialization of module MTP3_ASPs finished. -18:21:41.165299 hc Initializing module SCCP. -18:21:41.166336 hc Initializing module general_typedefs. -18:21:41.166948 hc Initialization of module general_typedefs finished. -18:21:41.167549 hc Initializing module SCCP_typedefs. -18:21:41.168099 hc Initializing module SCCP_ASPs. -18:21:41.169077 hc Initialization of module SCCP_ASPs finished. -18:21:41.169895 hc Initialization of module SCCP_typedefs finished. -18:21:41.171837 hc Initialization of module SCCP finished. -18:21:41.172467 hc Initializing module SCCP_EncDec. -18:21:41.173044 hc Initialization of module SCCP_EncDec finished. -18:21:41.173588 hc Initializing module SCCP_selftest. -18:21:41.174158 hc Initialization of module SCCP_selftest finished. -18:21:41.175585 hc Configuration file was processed successfully. -18:21:41.191379 hc MTC was created. Process id: 25833. -18:21:41.236537 mtc TTCN-3 Main Test Component started on duna199. -18:21:41.242045 mtc Connected to MC. -18:21:45.199426 mtc Executing test case tc_ConnlessSendingShortASP in module SCCP_selftest. -18:21:45.200795 mtc Test case tc_ConnlessSendingShortASP started. -18:21:45.201500 mtc Ports of component type MTC_CT were initialized. -18:21:45.202177 mtc Port PCO_A was started. -18:21:45.202752 mtc Port PCO_B was started. -18:21:45.204047 mtc v_Boot: { - own_GT := '14377760'H, - remote_GT := '14375760'H, - SSN := 2, - SIO := '83'O, - own_SPC := 16382, - remote_SPC := 16383, - SLS := 0, - sccp_serviceType := "mtp3_ansi" -} -18:21:45.204729 mtc v_BootB: { - own_GT := '14375760'H, - remote_GT := '14377760'H, - SSN := 2, - SIO := '83'O, - own_SPC := 16383, - remote_SPC := 16382, - SLS := 0, - sccp_serviceType := "mtp3_ansi" -} -18:21:45.205333 mtc Creating new PTC with component type MTPsim_CT. -18:21:45.221298 hc PTC was created. Component reference: 3, component type: MTPsim_CT, process id: 25834. -18:21:45.264675 3 TTCN-3 Parallel Test Component started on duna199. Component reference: 3, component type: MTPsim_CT. -18:21:45.269726 3 Connected to MC. -18:21:45.270497 mtc PTC was created. Component reference: 3. -18:21:45.271118 mtc Creating new PTC with component type SCCP_EncDec_comptype. -18:21:45.272412 3 Ports of component type MTPsim_CT were initialized. -18:21:45.274405 3 Port MTP_portA was started. -18:21:45.275097 3 Port MTP_portB was started. -18:21:45.309134 hc PTC was created. Component reference: 4, component type: SCCP_EncDec_comptype, process id: 25835. -18:21:45.349568 4 TTCN-3 Parallel Test Component started on duna199. Component reference: 4, component type: SCCP_EncDec_comptype. -18:21:45.355068 4 Connected to MC. -18:21:45.356259 mtc PTC was created. Component reference: 4. -18:21:45.356923 mtc Creating new PTC with component type SCCP_comptype. -18:21:45.358309 4 Ports of component type SCCP_EncDec_comptype were initialized. -18:21:45.359056 4 Port MTP3sccpEncDec_PCO was started. -18:21:45.359861 4 MTP3 Test Port (MTP3user_sccp_PCO): user start ordered -18:21:45.360447 4 Port MTP3user_sccp_PCO was started. -18:21:45.392629 hc PTC was created. Component reference: 5, component type: SCCP_comptype, process id: 25836. -18:21:45.420667 5 TTCN-3 Parallel Test Component started on duna199. Component reference: 5, component type: SCCP_comptype. -18:21:45.426421 5 Connected to MC. -18:21:45.427258 mtc PTC was created. Component reference: 5. -18:21:45.427896 mtc Connecting ports 4:MTP3user_sccp_PCO and 3:MTP_portA. -18:21:45.431119 4 Port MTP3user_sccp_PCO is waiting for connection from 3:MTP_portA on TCP port 38406. -18:21:45.433281 3 Port MTP_portA has established the connection with 4:MTP3user_sccp_PCO. -18:21:45.435413 mtc Connect operation finished. -18:21:45.436566 mtc Connecting ports 5:MTP3sccp_PCO and 4:MTP3sccpEncDec_PCO. -18:21:45.437940 4 Port MTP3user_sccp_PCO has accepted the connection from 3:MTP_portA. -18:21:45.439013 5 Ports of component type SCCP_comptype were initialized. -18:21:45.439756 5 Port MTP3sccp_PCO was started. -18:21:45.440445 5 Port SCCP_PCO was started. -18:21:45.442861 5 Port MTP3sccp_PCO is waiting for connection from 4:MTP3sccpEncDec_PCO on TCP port 38408. -18:21:45.445256 4 Port MTP3sccpEncDec_PCO has established the connection with 5:MTP3sccp_PCO. -18:21:45.463598 mtc Connect operation finished. -18:21:45.464271 mtc Connecting ports mtc:PCO_A and 5:SCCP_PCO. -18:21:45.471897 mtc Port PCO_A is waiting for connection from 5:SCCP_PCO on TCP port 38410. -18:21:45.475092 5 Port MTP3sccp_PCO has accepted the connection from 4:MTP3sccpEncDec_PCO. -18:21:45.478859 mtc Port PCO_A has accepted the connection from 5:SCCP_PCO. -18:21:45.479620 mtc Connect operation finished. -18:21:45.480218 mtc Creating new PTC with component type SCCP_EncDec_comptype. -18:21:45.481484 5 Port SCCP_PCO has established the connection with mtc:PCO_A. -18:21:45.515409 hc PTC was created. Component reference: 6, component type: SCCP_EncDec_comptype, process id: 25837. -18:21:45.536738 6 TTCN-3 Parallel Test Component started on duna199. Component reference: 6, component type: SCCP_EncDec_comptype. -18:21:45.542075 6 Connected to MC. -18:21:45.542872 mtc PTC was created. Component reference: 6. -18:21:45.543505 mtc Creating new PTC with component type SCCP_comptype. -18:21:45.544857 6 Ports of component type SCCP_EncDec_comptype were initialized. -18:21:45.545594 6 Port MTP3sccpEncDec_PCO was started. -18:21:45.547107 6 MTP3 Test Port (MTP3user_sccp_PCO): user start ordered -18:21:45.547695 6 Port MTP3user_sccp_PCO was started. -18:21:45.563127 hc PTC was created. Component reference: 7, component type: SCCP_comptype, process id: 25838. -18:21:45.606608 7 TTCN-3 Parallel Test Component started on duna199. Component reference: 7, component type: SCCP_comptype. -18:21:45.611933 7 Connected to MC. -18:21:45.612740 mtc PTC was created. Component reference: 7. -18:21:45.613371 mtc Connecting ports 6:MTP3user_sccp_PCO and 3:MTP_portB. -18:21:45.622919 6 Port MTP3user_sccp_PCO is waiting for connection from 3:MTP_portB on TCP port 38414. -18:21:45.625194 3 Port MTP_portB has established the connection with 6:MTP3user_sccp_PCO. -18:21:45.628002 mtc Connect operation finished. -18:21:45.628661 mtc Connecting ports 7:MTP3sccp_PCO and 6:MTP3sccpEncDec_PCO. -18:21:45.630008 6 Port MTP3user_sccp_PCO has accepted the connection from 3:MTP_portB. -18:21:45.631064 7 Ports of component type SCCP_comptype were initialized. -18:21:45.631815 7 Port MTP3sccp_PCO was started. -18:21:45.632502 7 Port SCCP_PCO was started. -18:21:45.634990 7 Port MTP3sccp_PCO is waiting for connection from 6:MTP3sccpEncDec_PCO on TCP port 38416. -18:21:45.654225 6 Port MTP3sccpEncDec_PCO has established the connection with 7:MTP3sccp_PCO. -18:21:45.657305 mtc Connect operation finished. -18:21:45.657970 mtc Connecting ports mtc:PCO_B and 7:SCCP_PCO. -18:21:45.660027 mtc Port PCO_B is waiting for connection from 7:SCCP_PCO on TCP port 38418. -18:21:45.661448 7 Port MTP3sccp_PCO has accepted the connection from 6:MTP3sccpEncDec_PCO. -18:21:45.664441 mtc Port PCO_B has accepted the connection from 7:SCCP_PCO. -18:21:45.665199 mtc Connect operation finished. -18:21:45.666237 mtc Starting function MTPsim_EventHandler() on component 3. -18:21:45.667397 mtc Function MTPsim_EventHandler was started. -18:21:45.668124 mtc Starting function ScanRAWPorts() on component 4. -18:21:45.669265 mtc Function ScanRAWPorts was started. -18:21:45.669965 mtc Starting function SCCPStart( { - own_GT := '14377760'H, - remote_GT := '14375760'H, - SSN := 2, - SIO := '83'O, - own_SPC := 16382, - remote_SPC := 16383, - SLS := 0, - sccp_serviceType := "mtp3_ansi" -} ) on component 5. -18:21:45.671152 mtc Function SCCPStart was started. -18:21:45.671741 mtc Starting function ScanRAWPorts() on component 6. -18:21:45.672848 mtc Function ScanRAWPorts was started. -18:21:45.673470 mtc Starting function SCCPStart( { - own_GT := '14375760'H, - remote_GT := '14377760'H, - SSN := 2, - SIO := '83'O, - own_SPC := 16383, - remote_SPC := 16382, - SLS := 0, - sccp_serviceType := "mtp3_ansi" -} ) on component 7. -18:21:45.674608 mtc Function SCCPStart was started. -18:21:45.675177 mtc init() is done -18:21:45.677985 mtc Start timer: 120 s -18:21:45.679932 mtc Sent on PCO_A to 5 N_UNITDATA_req { - calledAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14375760'H - } - } - }, - callingAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14377760'H - } - } - }, - sequenceControl := '00000000'B, - returnOption := '00000000'B, - userData := '12345678901234567890'O, - importance := omit -} -18:21:45.696998 3 Starting function MTPsim_EventHandler() -18:21:45.698443 4 Starting function ScanRAWPorts() -18:21:45.701026 5 Received on SCCP_PCO from mtc N_UNITDATA_req { - calledAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14375760'H - } - } - }, - callingAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14377760'H - } - } - }, - sequenceControl := '00000000'B, - returnOption := '00000000'B, - userData := '12345678901234567890'O, - importance := omit -} id 1 -18:21:45.702391 5 Starting function SCCPStart( { - own_GT := '14377760'H, - remote_GT := '14375760'H, - SSN := 2, - SIO := '83'O, - own_SPC := 16382, - remote_SPC := 16383, - SLS := 0, - sccp_serviceType := "mtp3_ansi" -} ) -18:21:45.722883 5 v_sccp_pdu_maxlen:265 -18:21:45.725239 5 Receive operation on port SCCP_PCO failed: Type of the first message in the queue is not N_CONNECT_req. -18:21:45.726734 5 Receive operation on port SCCP_PCO failed: Type of the first message in the queue is not N_CONNECT_res. -18:21:45.727329 5 Receive operation on port SCCP_PCO failed: Type of the first message in the queue is not N_DATA_req. -18:21:45.727949 5 Receive operation on port SCCP_PCO failed: Type of the first message in the queue is not N_DISCONNECT_req. -18:21:45.728805 5 Message with id 1 was extracted from the queue of SCCP_PCO. -18:21:45.730071 5 Encoding PDU_SCCP_Address_ansi: { - addressIndicator := { - ssnIndicator := '1'B, - pointCodeIndic := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B, - reserved := '0'B - }, - signPointCode := { - present := '000000000011111111111111'B - }, - subsystemNumber := { - present := 2 - }, - globalTitle := { - gti0001 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14375760'H - } - } -} -18:21:45.731289 5 Encoded PDU_SCCP_Address_ansi: '07FF3F0002077241737506'O -18:21:45.732056 5 Encoding PDU_SCCP_Address_ansi: { - addressIndicator := { - ssnIndicator := '1'B, - pointCodeIndic := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B, - reserved := '0'B - }, - signPointCode := { - present := '000000000011111111111111'B - }, - subsystemNumber := { - present := 2 - }, - globalTitle := { - gti0001 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14377760'H - } - } -} -18:21:45.732925 5 Encoded PDU_SCCP_Address_ansi: '07FF3F0002077241737706'O -18:21:45.734284 5 Random generator was initialized with seed 13.733935. -18:21:45.735117 5 Function rnd() returned 0.227768. -18:21:45.737985 5 Sent on MTP3sccp_PCO to 4 ASP_MTP3_TRANSFERreq_sccp { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := { - extudata := { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 0, - pointer2 := 0, - pointer3 := 0, - pointer4 := 0, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 10, - data := '12345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0000'B, - reserved := '00'B, - class := '0'B, - firstSegm := '1'B, - segmLocalRef := '3A4F07'O - }, - importance := omit - }, - eop := omit - } - } -} -18:21:45.755078 5 Last remaining Segment:'0000'B -18:21:45.758317 4 Received on MTP3sccpEncDec_PCO from 5 ASP_MTP3_TRANSFERreq_sccp { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := { - extudata := { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 0, - pointer2 := 0, - pointer3 := 0, - pointer4 := 0, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 10, - data := '12345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0000'B, - reserved := '00'B, - class := '0'B, - firstSegm := '1'B, - segmLocalRef := '3A4F07'O - }, - importance := omit - }, - eop := omit - } - } -} id 1 -18:21:45.759685 4 Message with id 1 was extracted from the queue of MTP3sccpEncDec_PCO. -18:21:45.760414 4 Encoding PDU_SCCP: { - extudata := { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 0, - pointer2 := 0, - pointer3 := 0, - pointer4 := 0, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 10, - data := '12345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0000'B, - reserved := '00'B, - class := '0'B, - firstSegm := '1'B, - segmLocalRef := '3A4F07'O - }, - importance := omit - }, - eop := omit - } -} -18:21:45.782218 4 Encoded PDU_SCCP: '11000F040F1A240B07FF3F00020772417375060B07FF3F00020772417377060A123456789012345678901004803A4F07'O -18:21:45.783241 4 Sent on MTP3user_sccp_PCO to 3 ASP_MTP3_TRANSFERreq { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := '11000F040F1A240B07FF3F00020772417375060B07FF3F00020772417377060A123456789012345678901004803A4F07'O -} -18:21:45.784644 3 Received on MTP_portA from 4 ASP_MTP3_TRANSFERreq { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := '11000F040F1A240B07FF3F00020772417375060B07FF3F00020772417377060A123456789012345678901004803A4F07'O -} id 1 -18:21:45.785139 3 Message with id 1 was extracted from the queue of MTP_portA. -18:21:45.786161 3 Sent on MTP_portB to 6 ASP_MTP3_TRANSFERind { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := '11000F040F1A240B07FF3F00020772417375060B07FF3F00020772417377060A123456789012345678901004803A4F07'O -} -18:21:45.787838 6 Received on MTP3user_sccp_PCO from 3 ASP_MTP3_TRANSFERind { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := '11000F040F1A240B07FF3F00020772417375060B07FF3F00020772417377060A123456789012345678901004803A4F07'O -} id 1 -18:21:45.788900 6 Starting function ScanRAWPorts() -18:21:45.789920 6 Message with id 1 was extracted from the queue of MTP3user_sccp_PCO. -18:21:45.790662 6 Decoding PDU_SCCP: '11000F040F1A240B07FF3F00020772417375060B07FF3F00020772417377060A123456789012345678901004803A4F07'O -18:21:45.795388 6 Decoded PDU_SCCP: { - extudata := { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 4, - pointer2 := 15, - pointer3 := 26, - pointer4 := 36, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 10, - data := '12345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0000'B, - reserved := '00'B, - class := '0'B, - firstSegm := '1'B, - segmLocalRef := '3A4F07'O - }, - importance := omit - }, - eop := omit - } -} -18:21:45.821005 6 Sent on MTP3sccpEncDec_PCO to 7 PDU_SCCP_ExtUnitdata { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 4, - pointer2 := 15, - pointer3 := 26, - pointer4 := 36, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 10, - data := '12345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0000'B, - reserved := '00'B, - class := '0'B, - firstSegm := '1'B, - segmLocalRef := '3A4F07'O - }, - importance := omit - }, - eop := omit -} -18:21:45.822432 7 Port SCCP_PCO has established the connection with mtc:PCO_B. -18:21:45.824903 7 Received on MTP3sccp_PCO from 6 PDU_SCCP_ExtUnitdata { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 4, - pointer2 := 15, - pointer3 := 26, - pointer4 := 36, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 10, - data := '12345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0000'B, - reserved := '00'B, - class := '0'B, - firstSegm := '1'B, - segmLocalRef := '3A4F07'O - }, - importance := omit - }, - eop := omit -} id 1 -18:21:45.845099 7 Starting function SCCPStart( { - own_GT := '14375760'H, - remote_GT := '14377760'H, - SSN := 2, - SIO := '83'O, - own_SPC := 16383, - remote_SPC := 16382, - SLS := 0, - sccp_serviceType := "mtp3_ansi" -} ) -18:21:45.846866 7 v_sccp_pdu_maxlen:265 -18:21:45.849069 7 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_Unitdata. -18:21:45.849964 7 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_UnitdataService. -18:21:45.850594 7 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ConnectionRequest. -18:21:45.851248 7 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ConnectionConfirm. -18:21:45.851881 7 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_Released. -18:21:45.852527 7 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ProtDataUnitError. -18:21:45.853160 7 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ReleaseComplete. -18:21:45.853741 7 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_InactivityTest. -18:21:45.854352 7 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ResetRequest. -18:21:45.873504 7 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ResetConfirm. -18:21:45.874250 7 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ConnectionRefused. -18:21:45.874833 7 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_DataForm1. -18:21:45.876205 7 Message with id 1 was extracted from the queue of MTP3sccp_PCO. -18:21:45.877338 7 Decoding PDU_SCCP_Address_ansi: '07FF3F0002077241737506'O -18:21:45.878490 7 Decoded PDU_SCCP_Address_ansi: { - addressIndicator := { - ssnIndicator := '1'B, - pointCodeIndic := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B, - reserved := '0'B - }, - signPointCode := { - present := '000000000011111111111111'B - }, - subsystemNumber := { - present := 2 - }, - globalTitle := { - gti0001 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14375760'H - } - } -} -18:21:45.879493 7 Decoding PDU_SCCP_Address_ansi: '07FF3F0002077241737706'O -18:21:45.880295 7 Decoded PDU_SCCP_Address_ansi: { - addressIndicator := { - ssnIndicator := '1'B, - pointCodeIndic := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B, - reserved := '0'B - }, - signPointCode := { - present := '000000000011111111111111'B - }, - subsystemNumber := { - present := 2 - }, - globalTitle := { - gti0001 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14377760'H - } - } -} -18:21:45.881403 7 Sent on SCCP_PCO to mtc N_UNITDATA_ind { - calledAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14375760'H - } - } - }, - callingAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14377760'H - } - } - }, - sequenceControl := '00000000'B, - returnOption := '00000000'B, - userData := '12345678901234567890'O, - importance := omit -} -18:21:45.900251 mtc Received on PCO_B from 7 N_UNITDATA_ind { - calledAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14375760'H - } - } - }, - callingAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14377760'H - } - } - }, - sequenceControl := '00000000'B, - returnOption := '00000000'B, - userData := '12345678901234567890'O, - importance := omit -} id 1 -18:21:45.900917 mtc Message with id 1 was extracted from the queue of PCO_B. -18:21:45.901304 mtc Correct CalledAddress, CallingAddress and userData received, data are correct -18:21:45.901623 mtc setverdict(pass): none -> pass -18:21:45.901959 mtc Stop timer: 120 s -18:21:45.902282 mtc termitate() started -18:21:45.902595 mtc Stopping all components. -18:21:45.907581 3 Stop was requested from MC. -18:21:45.907937 3 Stopping test component execution. -18:21:45.940594 3 Function MTPsim_EventHandler was stopped. PTC terminates. -18:21:45.941545 3 Port MTP_portA was stopped. -18:21:45.942176 3 Port MTP_portB was stopped. -18:21:45.943023 3 Removing unterminated connection between ports MTP_portA and 4:MTP3user_sccp_PCO. -18:21:45.944438 3 Removing unterminated connection between ports MTP_portB and 6:MTP3user_sccp_PCO. -18:21:45.945612 3 Ports of component type MTPsim_CT were shut down. -18:21:45.963063 3 getverdict: none -18:21:45.965312 3 Disconnected from MC. -18:21:45.965518 3 TTCN-3 Parallel Test Component finished. -18:21:45.967406 4 Connection of port MTP3user_sccp_PCO to 3:MTP_portA is lost. -18:21:45.969323 4 Port MTP3user_sccp_PCO was disconnected from 3:MTP_portA. -18:21:45.970071 4 Stop was requested from MC. -18:21:45.970686 4 Stopping test component execution. -18:21:45.997674 4 Function ScanRAWPorts was stopped. PTC terminates. -18:21:45.998715 4 Port MTP3sccpEncDec_PCO was stopped. -18:21:45.999329 4 MTP3 Test Port (MTP3user_sccp_PCO): User stop ordered -18:21:45.999934 4 Port MTP3user_sccp_PCO was stopped. -18:21:46.000781 4 Removing unterminated connection between ports MTP3sccpEncDec_PCO and 5:MTP3sccp_PCO. -18:21:46.002220 4 Ports of component type SCCP_EncDec_comptype were shut down. -18:21:46.002866 4 getverdict: none -18:21:46.004760 4 Disconnected from MC. -18:21:46.004970 4 TTCN-3 Parallel Test Component finished. -18:21:46.032470 5 Connection of port MTP3sccp_PCO to 4:MTP3sccpEncDec_PCO is lost. -18:21:46.033807 5 Port MTP3sccp_PCO was disconnected from 4:MTP3sccpEncDec_PCO. -18:21:46.034467 5 Stop was requested from MC. -18:21:46.035074 5 Stopping test component execution. -18:21:46.051967 5 Function SCCPStart was stopped. PTC terminates. -18:21:46.052955 5 Port MTP3sccp_PCO was stopped. -18:21:46.053550 5 Port SCCP_PCO was stopped. -18:21:46.054596 5 Removing unterminated connection between ports SCCP_PCO and mtc:PCO_A. -18:21:46.056442 mtc Connection of port PCO_A to 5:SCCP_PCO is lost. -18:21:46.058014 mtc Port PCO_A was disconnected from 5:SCCP_PCO. -18:21:46.059058 5 Ports of component type SCCP_comptype were shut down. -18:21:46.059660 5 getverdict: none -18:21:46.061555 5 Disconnected from MC. -18:21:46.061761 5 TTCN-3 Parallel Test Component finished. -18:21:46.063188 6 Connection of port MTP3user_sccp_PCO to 3:MTP_portB is lost. -18:21:46.065270 6 Port MTP3user_sccp_PCO was disconnected from 3:MTP_portB. -18:21:46.067053 6 Stop was requested from MC. -18:21:46.068350 6 Stopping test component execution. -18:21:46.115081 6 Function ScanRAWPorts was stopped. PTC terminates. -18:21:46.116539 6 Port MTP3sccpEncDec_PCO was stopped. -18:21:46.117177 6 MTP3 Test Port (MTP3user_sccp_PCO): User stop ordered -18:21:46.117788 6 Port MTP3user_sccp_PCO was stopped. -18:21:46.118635 6 Removing unterminated connection between ports MTP3sccpEncDec_PCO and 7:MTP3sccp_PCO. -18:21:46.120040 6 Ports of component type SCCP_EncDec_comptype were shut down. -18:21:46.120672 6 getverdict: none -18:21:46.122539 6 Disconnected from MC. -18:21:46.122745 6 TTCN-3 Parallel Test Component finished. -18:21:46.124069 7 Connection of port MTP3sccp_PCO to 6:MTP3sccpEncDec_PCO is lost. -18:21:46.126591 7 Port MTP3sccp_PCO was disconnected from 6:MTP3sccpEncDec_PCO. -18:21:46.127348 7 Stop was requested from MC. -18:21:46.127955 7 Stopping test component execution. -18:21:46.152223 7 Function SCCPStart was stopped. PTC terminates. -18:21:46.153287 7 Port MTP3sccp_PCO was stopped. -18:21:46.153893 7 Port SCCP_PCO was stopped. -18:21:46.154936 7 Removing unterminated connection between ports SCCP_PCO and mtc:PCO_B. -18:21:46.156829 mtc Connection of port PCO_B to 7:SCCP_PCO is lost. -18:21:46.158368 mtc Port PCO_B was disconnected from 7:SCCP_PCO. -18:21:46.159390 7 Ports of component type SCCP_comptype were shut down. -18:21:46.159990 7 getverdict: none -18:21:46.161049 mtc All components were stopped. -18:21:46.161673 mtc Disconnecting ports 4:MTP3user_sccp_PCO and 3:MTP_portA. -18:21:46.162687 mtc Disconnect operation finished. -18:21:46.163293 mtc Disconnecting ports 5:MTP3sccp_PCO and 4:MTP3sccpEncDec_PCO. -18:21:46.164303 mtc Disconnect operation finished. -18:21:46.164908 mtc Disconnecting ports mtc:PCO_A and 5:SCCP_PCO. -18:21:46.179989 mtc Disconnect operation finished. -18:21:46.180736 mtc Disconnecting ports 6:MTP3user_sccp_PCO and 3:MTP_portB. -18:21:46.181756 mtc Disconnect operation finished. -18:21:46.182361 mtc Disconnecting ports 7:MTP3sccp_PCO and 6:MTP3sccpEncDec_PCO. -18:21:46.183375 mtc Disconnect operation finished. -18:21:46.183981 mtc Disconnecting ports mtc:PCO_B and 7:SCCP_PCO. -18:21:46.184989 mtc Disconnect operation finished. -18:21:46.185569 mtc all components stopped -18:21:46.186455 mtc Stopping test component execution. -18:21:46.201652 mtc Test case tc_ConnlessSendingShortASP was stopped. -18:21:46.202665 mtc Port PCO_A was stopped. -18:21:46.203282 mtc Port PCO_B was stopped. -18:21:46.205397 mtc Ports of component type MTC_CT were shut down. -18:21:46.207477 7 Disconnected from MC. -18:21:46.207705 7 TTCN-3 Parallel Test Component finished. -18:21:46.208587 mtc Waiting for PTCs to finish. -18:21:46.209933 mtc Setting final verdict of the test case. -18:21:46.211165 mtc Local verdict of MTC: pass -18:21:46.211855 mtc Local verdict of PTC with component reference 3: none (pass -> pass) -18:21:46.212456 mtc Local verdict of PTC with component reference 4: none (pass -> pass) -18:21:46.213073 mtc Local verdict of PTC with component reference 5: none (pass -> pass) -18:21:46.213661 mtc Local verdict of PTC with component reference 6: none (pass -> pass) -18:21:46.214802 mtc Local verdict of PTC with component reference 7: none (pass -> pass) -18:21:46.215478 mtc Test case tc_ConnlessSendingShortASP finished. Verdict: pass -18:21:46.217171 mtc Executing test case tc_ConnlessSendingLongASP in module SCCP_selftest. -18:21:46.240225 mtc Test case tc_ConnlessSendingLongASP started. -18:21:46.240961 mtc Ports of component type MTC_CT were initialized. -18:21:46.241578 mtc Port PCO_A was started. -18:21:46.242161 mtc Port PCO_B was started. -18:21:46.242817 mtc v_Boot: { - own_GT := '14377760'H, - remote_GT := '14375760'H, - SSN := 2, - SIO := '83'O, - own_SPC := 16382, - remote_SPC := 16383, - SLS := 0, - sccp_serviceType := "mtp3_ansi" -} -18:21:46.243457 mtc v_BootB: { - own_GT := '14375760'H, - remote_GT := '14377760'H, - SSN := 2, - SIO := '83'O, - own_SPC := 16383, - remote_SPC := 16382, - SLS := 0, - sccp_serviceType := "mtp3_ansi" -} -18:21:46.244084 mtc Creating new PTC with component type MTPsim_CT. -18:21:46.245603 hc Test component with component reference 7 finished. Process statistics: { - process id: 25838, - exit status: 0, - user time: 0.020000 s, - system time: 0.020000 s, - maximum resident set size: 0, - integral resident set size: 0, - page faults not requiring physical I/O: 0, - page faults requiring physical I/O: 0, - swaps: 0, - block input operations: 0, - block output operations 0, - messages sent: 0, - messages received: 0, - signals received: 0, - voluntary context switches: 0, - involuntary context switches: 0 -} -18:21:46.246717 hc Test component with component reference 6 finished. Process statistics: { - process id: 25837, - exit status: 0, - user time: 0.050000 s, - system time: 0.030000 s, - maximum resident set size: 0, - integral resident set size: 0, - page faults not requiring physical I/O: 0, - page faults requiring physical I/O: 0, - swaps: 0, - block input operations: 0, - block output operations 0, - messages sent: 0, - messages received: 0, - signals received: 0, - voluntary context switches: 0, - involuntary context switches: 0 -} -18:21:46.247491 hc Test component with component reference 5 finished. Process statistics: { - process id: 25836, - exit status: 0, - user time: 0.020000 s, - system time: 0.030000 s, - maximum resident set size: 0, - integral resident set size: 0, - page faults not requiring physical I/O: 0, - page faults requiring physical I/O: 0, - swaps: 0, - block input operations: 0, - block output operations 0, - messages sent: 0, - messages received: 0, - signals received: 0, - voluntary context switches: 0, - involuntary context switches: 0 -} -18:21:46.264668 hc Test component with component reference 4 finished. Process statistics: { - process id: 25835, - exit status: 0, - user time: 0.040000 s, - system time: 0.030000 s, - maximum resident set size: 0, - integral resident set size: 0, - page faults not requiring physical I/O: 0, - page faults requiring physical I/O: 0, - swaps: 0, - block input operations: 0, - block output operations 0, - messages sent: 0, - messages received: 0, - signals received: 0, - voluntary context switches: 0, - involuntary context switches: 0 -} -18:21:46.265568 hc Test component with component reference 3 finished. Process statistics: { - process id: 25834, - exit status: 0, - user time: 0.050000 s, - system time: 0.020000 s, - maximum resident set size: 0, - integral resident set size: 0, - page faults not requiring physical I/O: 0, - page faults requiring physical I/O: 0, - swaps: 0, - block input operations: 0, - block output operations 0, - messages sent: 0, - messages received: 0, - signals received: 0, - voluntary context switches: 0, - involuntary context switches: 0 -} -18:21:46.280706 hc PTC was created. Component reference: 8, component type: MTPsim_CT, process id: 25839. -18:21:46.327713 8 TTCN-3 Parallel Test Component started on duna199. Component reference: 8, component type: MTPsim_CT. -18:21:46.333051 8 Connected to MC. -18:21:46.333975 8 Ports of component type MTPsim_CT were initialized. -18:21:46.334733 8 Port MTP_portA was started. -18:21:46.335352 8 Port MTP_portB was started. -18:21:46.336555 mtc PTC was created. Component reference: 8. -18:21:46.337460 mtc Creating new PTC with component type SCCP_EncDec_comptype. -18:21:46.353606 hc PTC was created. Component reference: 9, component type: SCCP_EncDec_comptype, process id: 25840. -18:21:46.398779 9 TTCN-3 Parallel Test Component started on duna199. Component reference: 9, component type: SCCP_EncDec_comptype. -18:21:46.404037 9 Connected to MC. -18:21:46.404841 mtc PTC was created. Component reference: 9. -18:21:46.405504 mtc Creating new PTC with component type SCCP_comptype. -18:21:46.407469 9 Ports of component type SCCP_EncDec_comptype were initialized. -18:21:46.408208 9 Port MTP3sccpEncDec_PCO was started. -18:21:46.409009 9 MTP3 Test Port (MTP3user_sccp_PCO): user start ordered -18:21:46.409590 9 Port MTP3user_sccp_PCO was started. -18:21:46.424385 hc PTC was created. Component reference: 10, component type: SCCP_comptype, process id: 25841. -18:21:46.468205 10 TTCN-3 Parallel Test Component started on duna199. Component reference: 10, component type: SCCP_comptype. -18:21:46.473262 10 Connected to MC. -18:21:46.474045 mtc PTC was created. Component reference: 10. -18:21:46.474720 mtc Connecting ports 9:MTP3user_sccp_PCO and 8:MTP_portA. -18:21:46.478439 9 Port MTP3user_sccp_PCO is waiting for connection from 8:MTP_portA on TCP port 38423. -18:21:46.480561 8 Port MTP_portA has established the connection with 9:MTP3user_sccp_PCO. -18:21:46.482674 mtc Connect operation finished. -18:21:46.483347 mtc Connecting ports 10:MTP3sccp_PCO and 9:MTP3sccpEncDec_PCO. -18:21:46.484727 9 Port MTP3user_sccp_PCO has accepted the connection from 8:MTP_portA. -18:21:46.486409 10 Ports of component type SCCP_comptype were initialized. -18:21:46.487183 10 Port MTP3sccp_PCO was started. -18:21:46.487857 10 Port SCCP_PCO was started. -18:21:46.490270 10 Port MTP3sccp_PCO is waiting for connection from 9:MTP3sccpEncDec_PCO on TCP port 38425. -18:21:46.492618 9 Port MTP3sccpEncDec_PCO has established the connection with 10:MTP3sccp_PCO. -18:21:46.494771 mtc Connect operation finished. -18:21:46.495446 mtc Connecting ports mtc:PCO_A and 10:SCCP_PCO. -18:21:46.497895 mtc Port PCO_A is waiting for connection from 10:SCCP_PCO on TCP port 38427. -18:21:46.499342 10 Port MTP3sccp_PCO has accepted the connection from 9:MTP3sccpEncDec_PCO. -18:21:46.501885 mtc Port PCO_A has accepted the connection from 10:SCCP_PCO. -18:21:46.502633 mtc Connect operation finished. -18:21:46.503254 mtc Creating new PTC with component type SCCP_EncDec_comptype. -18:21:46.504536 10 Port SCCP_PCO has established the connection with mtc:PCO_A. -18:21:46.535166 hc PTC was created. Component reference: 11, component type: SCCP_EncDec_comptype, process id: 25842. -18:21:46.563650 11 TTCN-3 Parallel Test Component started on duna199. Component reference: 11, component type: SCCP_EncDec_comptype. -18:21:46.569136 11 Connected to MC. -18:21:46.569930 mtc PTC was created. Component reference: 11. -18:21:46.570585 mtc Creating new PTC with component type SCCP_comptype. -18:21:46.572003 11 Ports of component type SCCP_EncDec_comptype were initialized. -18:21:46.572757 11 Port MTP3sccpEncDec_PCO was started. -18:21:46.573568 11 MTP3 Test Port (MTP3user_sccp_PCO): user start ordered -18:21:46.574160 11 Port MTP3user_sccp_PCO was started. -18:21:46.607218 hc PTC was created. Component reference: 12, component type: SCCP_comptype, process id: 25843. -18:21:46.634527 12 TTCN-3 Parallel Test Component started on duna199. Component reference: 12, component type: SCCP_comptype. -18:21:46.640248 12 Connected to MC. -18:21:46.641259 mtc PTC was created. Component reference: 12. -18:21:46.641935 mtc Connecting ports 11:MTP3user_sccp_PCO and 8:MTP_portB. -18:21:46.645205 11 Port MTP3user_sccp_PCO is waiting for connection from 8:MTP_portB on TCP port 38431. -18:21:46.647813 8 Port MTP_portB has established the connection with 11:MTP3user_sccp_PCO. -18:21:46.650037 mtc Connect operation finished. -18:21:46.650705 mtc Connecting ports 12:MTP3sccp_PCO and 11:MTP3sccpEncDec_PCO. -18:21:46.652085 11 Port MTP3user_sccp_PCO has accepted the connection from 8:MTP_portB. -18:21:46.653166 12 Ports of component type SCCP_comptype were initialized. -18:21:46.653902 12 Port MTP3sccp_PCO was started. -18:21:46.654568 12 Port SCCP_PCO was started. -18:21:46.674133 12 Port MTP3sccp_PCO is waiting for connection from 11:MTP3sccpEncDec_PCO on TCP port 38433. -18:21:46.677229 11 Port MTP3sccpEncDec_PCO has established the connection with 12:MTP3sccp_PCO. -18:21:46.679496 mtc Connect operation finished. -18:21:46.680172 mtc Connecting ports mtc:PCO_B and 12:SCCP_PCO. -18:21:46.682231 mtc Port PCO_B is waiting for connection from 12:SCCP_PCO on TCP port 38435. -18:21:46.683671 12 Port MTP3sccp_PCO has accepted the connection from 11:MTP3sccpEncDec_PCO. -18:21:46.687028 mtc Port PCO_B has accepted the connection from 12:SCCP_PCO. -18:21:46.687831 mtc Connect operation finished. -18:21:46.688466 mtc Starting function MTPsim_EventHandler() on component 8. -18:21:46.689847 8 Starting function MTPsim_EventHandler() -18:21:46.690910 mtc Function MTPsim_EventHandler was started. -18:21:46.691559 mtc Starting function ScanRAWPorts() on component 9. -18:21:46.692675 mtc Function ScanRAWPorts was started. -18:21:46.693326 mtc Starting function SCCPStart( { - own_GT := '14377760'H, - remote_GT := '14375760'H, - SSN := 2, - SIO := '83'O, - own_SPC := 16382, - remote_SPC := 16383, - SLS := 0, - sccp_serviceType := "mtp3_ansi" -} ) on component 10. -18:21:46.694511 mtc Function SCCPStart was started. -18:21:46.695121 mtc Starting function ScanRAWPorts() on component 11. -18:21:46.696900 mtc Function ScanRAWPorts was started. -18:21:46.697568 mtc Starting function SCCPStart( { - own_GT := '14375760'H, - remote_GT := '14377760'H, - SSN := 2, - SIO := '83'O, - own_SPC := 16383, - remote_SPC := 16382, - SLS := 0, - sccp_serviceType := "mtp3_ansi" -} ) on component 12. -18:21:46.698723 mtc Function SCCPStart was started. -18:21:46.699310 mtc init() is done -18:21:46.700287 mtc Start timer: 120 s -18:21:46.701466 mtc Sent on PCO_A to 10 N_UNITDATA_req { - calledAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14375760'H - } - } - }, - callingAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14377760'H - } - } - }, - sequenceControl := '00000000'B, - returnOption := '00000000'B, - userData := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O, - importance := omit -} -18:21:46.718626 9 Starting function ScanRAWPorts() -18:21:46.721380 10 Received on SCCP_PCO from mtc N_UNITDATA_req { - calledAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14375760'H - } - } - }, - callingAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14377760'H - } - } - }, - sequenceControl := '00000000'B, - returnOption := '00000000'B, - userData := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O, - importance := omit -} id 1 -18:21:46.742310 10 Starting function SCCPStart( { - own_GT := '14377760'H, - remote_GT := '14375760'H, - SSN := 2, - SIO := '83'O, - own_SPC := 16382, - remote_SPC := 16383, - SLS := 0, - sccp_serviceType := "mtp3_ansi" -} ) -18:21:46.743647 10 v_sccp_pdu_maxlen:265 -18:21:46.746564 10 Receive operation on port SCCP_PCO failed: Type of the first message in the queue is not N_CONNECT_req. -18:21:46.747527 10 Receive operation on port SCCP_PCO failed: Type of the first message in the queue is not N_CONNECT_res. -18:21:46.748104 10 Receive operation on port SCCP_PCO failed: Type of the first message in the queue is not N_DATA_req. -18:21:46.766884 10 Receive operation on port SCCP_PCO failed: Type of the first message in the queue is not N_DISCONNECT_req. -18:21:46.767864 10 Message with id 1 was extracted from the queue of SCCP_PCO. -18:21:46.769126 10 Encoding PDU_SCCP_Address_ansi: { - addressIndicator := { - ssnIndicator := '1'B, - pointCodeIndic := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B, - reserved := '0'B - }, - signPointCode := { - present := '000000000011111111111111'B - }, - subsystemNumber := { - present := 2 - }, - globalTitle := { - gti0001 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14375760'H - } - } -} -18:21:46.770337 10 Encoded PDU_SCCP_Address_ansi: '07FF3F0002077241737506'O -18:21:46.771120 10 Encoding PDU_SCCP_Address_ansi: { - addressIndicator := { - ssnIndicator := '1'B, - pointCodeIndic := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B, - reserved := '0'B - }, - signPointCode := { - present := '000000000011111111111111'B - }, - subsystemNumber := { - present := 2 - }, - globalTitle := { - gti0001 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14377760'H - } - } -} -18:21:46.771979 10 Encoded PDU_SCCP_Address_ansi: '07FF3F0002077241737706'O -18:21:46.773573 10 Random generator was initialized with seed 14.773216. -18:21:46.774419 10 Function rnd() returned 0.171705. -18:21:46.777342 10 Sent on MTP3sccp_PCO to 9 ASP_MTP3_TRANSFERreq_sccp { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := { - extudata := { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 0, - pointer2 := 0, - pointer3 := 0, - pointer4 := 0, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 225, - data := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0001'B, - reserved := '00'B, - class := '0'B, - firstSegm := '1'B, - segmLocalRef := '2BF4DA'O - }, - importance := omit - }, - eop := omit - } - } -} -18:21:46.797926 9 Received on MTP3sccpEncDec_PCO from 10 ASP_MTP3_TRANSFERreq_sccp { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := { - extudata := { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 0, - pointer2 := 0, - pointer3 := 0, - pointer4 := 0, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 225, - data := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0001'B, - reserved := '00'B, - class := '0'B, - firstSegm := '1'B, - segmLocalRef := '2BF4DA'O - }, - importance := omit - }, - eop := omit - } - } -} id 1 -18:21:46.818423 9 Message with id 1 was extracted from the queue of MTP3sccpEncDec_PCO. -18:21:46.819292 9 Encoding PDU_SCCP: { - extudata := { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 0, - pointer2 := 0, - pointer3 := 0, - pointer4 := 0, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 225, - data := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0001'B, - reserved := '00'B, - class := '0'B, - firstSegm := '1'B, - segmLocalRef := '2BF4DA'O - }, - importance := omit - }, - eop := omit - } -} -18:21:46.840033 9 Encoded PDU_SCCP: '11000F040F1AFB0B07FF3F00020772417375060B07FF3F0002077241737706E11234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901004812BF4DA'O -18:21:46.841117 9 Sent on MTP3user_sccp_PCO to 8 ASP_MTP3_TRANSFERreq { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := '11000F040F1AFB0B07FF3F00020772417375060B07FF3F0002077241737706E11234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901004812BF4DA'O -} -18:21:46.860927 8 Received on MTP_portA from 9 ASP_MTP3_TRANSFERreq { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := '11000F040F1AFB0B07FF3F00020772417375060B07FF3F0002077241737706E11234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901004812BF4DA'O -} id 1 -18:21:46.861875 8 Message with id 1 was extracted from the queue of MTP_portA. -18:21:46.862805 8 Sent on MTP_portB to 11 ASP_MTP3_TRANSFERind { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := '11000F040F1AFB0B07FF3F00020772417375060B07FF3F0002077241737706E11234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901004812BF4DA'O -} -18:21:46.864468 10 Sent on MTP3sccp_PCO to 9 ASP_MTP3_TRANSFERreq_sccp { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := { - extudata := { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 0, - pointer2 := 0, - pointer3 := 0, - pointer4 := 0, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 75, - data := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0000'B, - reserved := '00'B, - class := '0'B, - firstSegm := '0'B, - segmLocalRef := '2BF4DA'O - }, - importance := omit - }, - eop := omit - } - } -} -18:21:46.884418 9 Received on MTP3sccpEncDec_PCO from 10 ASP_MTP3_TRANSFERreq_sccp { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := { - extudata := { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 0, - pointer2 := 0, - pointer3 := 0, - pointer4 := 0, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 75, - data := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0000'B, - reserved := '00'B, - class := '0'B, - firstSegm := '0'B, - segmLocalRef := '2BF4DA'O - }, - importance := omit - }, - eop := omit - } - } -} id 2 -18:21:46.885361 9 Message with id 2 was extracted from the queue of MTP3sccpEncDec_PCO. -18:21:46.886556 9 Encoding PDU_SCCP: { - extudata := { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 0, - pointer2 := 0, - pointer3 := 0, - pointer4 := 0, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 75, - data := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0000'B, - reserved := '00'B, - class := '0'B, - firstSegm := '0'B, - segmLocalRef := '2BF4DA'O - }, - importance := omit - }, - eop := omit - } -} -18:21:46.905406 9 Encoded PDU_SCCP: '11000F040F1A650B07FF3F00020772417375060B07FF3F00020772417377064B1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901004002BF4DA'O -18:21:46.906838 9 Sent on MTP3user_sccp_PCO to 8 ASP_MTP3_TRANSFERreq { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := '11000F040F1A650B07FF3F00020772417375060B07FF3F00020772417377064B1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901004002BF4DA'O -} -18:21:46.907795 8 Received on MTP_portA from 9 ASP_MTP3_TRANSFERreq { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := '11000F040F1A650B07FF3F00020772417375060B07FF3F00020772417377064B1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901004002BF4DA'O -} id 2 -18:21:46.908539 8 Message with id 2 was extracted from the queue of MTP_portA. -18:21:46.909214 8 Sent on MTP_portB to 11 ASP_MTP3_TRANSFERind { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := '11000F040F1A650B07FF3F00020772417375060B07FF3F00020772417377064B1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901004002BF4DA'O -} -18:21:46.928654 10 Last remaining Segment:'0000'B -18:21:46.930294 11 Received on MTP3user_sccp_PCO from 8 ASP_MTP3_TRANSFERind { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := '11000F040F1AFB0B07FF3F00020772417375060B07FF3F0002077241737706E11234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901004812BF4DA'O -} id 1 -18:21:46.931267 11 Received on MTP3user_sccp_PCO from 8 ASP_MTP3_TRANSFERind { - sio := '83'O, - opc := 16382, - dpc := 16383, - sls := 0, - data := '11000F040F1A650B07FF3F00020772417375060B07FF3F00020772417377064B1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901004002BF4DA'O -} id 2 -18:21:46.932508 11 Starting function ScanRAWPorts() -18:21:46.933526 11 Message with id 1 was extracted from the queue of MTP3user_sccp_PCO. -18:21:46.934374 11 Decoding PDU_SCCP: '11000F040F1AFB0B07FF3F00020772417375060B07FF3F0002077241737706E11234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901004812BF4DA'O -18:21:46.958297 11 Decoded PDU_SCCP: { - extudata := { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 4, - pointer2 := 15, - pointer3 := 26, - pointer4 := 251, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 225, - data := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0001'B, - reserved := '00'B, - class := '0'B, - firstSegm := '1'B, - segmLocalRef := '2BF4DA'O - }, - importance := omit - }, - eop := omit - } -} -18:21:46.960010 11 Sent on MTP3sccpEncDec_PCO to 12 PDU_SCCP_ExtUnitdata { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 4, - pointer2 := 15, - pointer3 := 26, - pointer4 := 251, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 225, - data := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0001'B, - reserved := '00'B, - class := '0'B, - firstSegm := '1'B, - segmLocalRef := '2BF4DA'O - }, - importance := omit - }, - eop := omit -} -18:21:46.979542 11 Message with id 2 was extracted from the queue of MTP3user_sccp_PCO. -18:21:46.980311 11 Decoding PDU_SCCP: '11000F040F1A650B07FF3F00020772417375060B07FF3F00020772417377064B1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901004002BF4DA'O -18:21:46.982225 11 Decoded PDU_SCCP: { - extudata := { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 4, - pointer2 := 15, - pointer3 := 26, - pointer4 := 101, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 75, - data := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0000'B, - reserved := '00'B, - class := '0'B, - firstSegm := '0'B, - segmLocalRef := '2BF4DA'O - }, - importance := omit - }, - eop := omit - } -} -18:21:47.002800 11 Sent on MTP3sccpEncDec_PCO to 12 PDU_SCCP_ExtUnitdata { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 4, - pointer2 := 15, - pointer3 := 26, - pointer4 := 101, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 75, - data := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0000'B, - reserved := '00'B, - class := '0'B, - firstSegm := '0'B, - segmLocalRef := '2BF4DA'O - }, - importance := omit - }, - eop := omit -} -18:21:47.004232 12 Port SCCP_PCO has established the connection with mtc:PCO_B. -18:21:47.007365 12 Received on MTP3sccp_PCO from 11 PDU_SCCP_ExtUnitdata { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 4, - pointer2 := 15, - pointer3 := 26, - pointer4 := 251, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 225, - data := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0001'B, - reserved := '00'B, - class := '0'B, - firstSegm := '1'B, - segmLocalRef := '2BF4DA'O - }, - importance := omit - }, - eop := omit -} id 1 -18:21:47.027803 12 Received on MTP3sccp_PCO from 11 PDU_SCCP_ExtUnitdata { - messageType := xudt (17), - protClass := { - class := '0000'B, - messageHandling := '0000'B - }, - hopCounter := 15, - pointer1 := 4, - pointer2 := 15, - pointer3 := 26, - pointer4 := 101, - calledPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737506'O - }, - callingPAddress := { - paramLength := 11, - addr := '07FF3F0002077241737706'O - }, - data := { - paramLength := 75, - data := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O - }, - optionalPart := { - segmentation := { - paramName := con_SCCP_segm (16), - paramLength := 4, - remainingSegment := '0000'B, - reserved := '00'B, - class := '0'B, - firstSegm := '0'B, - segmLocalRef := '2BF4DA'O - }, - importance := omit - }, - eop := omit -} id 2 -18:21:47.029096 12 Starting function SCCPStart( { - own_GT := '14375760'H, - remote_GT := '14377760'H, - SSN := 2, - SIO := '83'O, - own_SPC := 16383, - remote_SPC := 16382, - SLS := 0, - sccp_serviceType := "mtp3_ansi" -} ) -18:21:47.049950 12 v_sccp_pdu_maxlen:265 -18:21:47.052171 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_Unitdata. -18:21:47.053061 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_UnitdataService. -18:21:47.053634 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ConnectionRequest. -18:21:47.054301 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ConnectionConfirm. -18:21:47.054874 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_Released. -18:21:47.055523 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ProtDataUnitError. -18:21:47.056867 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ReleaseComplete. -18:21:47.057484 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_InactivityTest. -18:21:47.058038 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ResetRequest. -18:21:47.058620 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ResetConfirm. -18:21:47.059177 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ConnectionRefused. -18:21:47.059766 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_DataForm1. -18:21:47.060612 12 Message with id 1 was extracted from the queue of MTP3sccp_PCO. -18:21:47.061431 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_Unitdata. -18:21:47.062036 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_UnitdataService. -18:21:47.080392 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ConnectionRequest. -18:21:47.081093 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ConnectionConfirm. -18:21:47.081697 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_Released. -18:21:47.082255 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ProtDataUnitError. -18:21:47.082850 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ReleaseComplete. -18:21:47.083413 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_InactivityTest. -18:21:47.083998 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ResetRequest. -18:21:47.084553 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ResetConfirm. -18:21:47.085145 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_ConnectionRefused. -18:21:47.085972 12 Receive operation on port MTP3sccp_PCO failed: Type of the first message in the queue is not PDU_SCCP_DataForm1. -18:21:47.086667 12 Message with id 2 was extracted from the queue of MTP3sccp_PCO. -18:21:47.087691 12 Decoding PDU_SCCP_Address_ansi: '07FF3F0002077241737506'O -18:21:47.088831 12 Decoded PDU_SCCP_Address_ansi: { - addressIndicator := { - ssnIndicator := '1'B, - pointCodeIndic := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B, - reserved := '0'B - }, - signPointCode := { - present := '000000000011111111111111'B - }, - subsystemNumber := { - present := 2 - }, - globalTitle := { - gti0001 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14375760'H - } - } -} -18:21:47.089819 12 Decoding PDU_SCCP_Address_ansi: '07FF3F0002077241737706'O -18:21:47.096495 12 Decoded PDU_SCCP_Address_ansi: { - addressIndicator := { - ssnIndicator := '1'B, - pointCodeIndic := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B, - reserved := '0'B - }, - signPointCode := { - present := '000000000011111111111111'B - }, - subsystemNumber := { - present := 2 - }, - globalTitle := { - gti0001 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14377760'H - } - } -} -18:21:47.097820 12 Sent on SCCP_PCO to mtc N_UNITDATA_ind { - calledAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14375760'H - } - } - }, - callingAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14377760'H - } - } - }, - sequenceControl := '00000000'B, - returnOption := '00000000'B, - userData := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O, - importance := omit -} -18:21:47.099690 mtc Received on PCO_B from 12 N_UNITDATA_ind { - calledAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14375760'H - } - } - }, - callingAddress := { - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - }, - signPointCode := '000000000011111111111111'B, - subsystemNumber := 2, - globalTitle := { - gti0011 := { - translationType := '07'O, - encodingScheme := '0010'B, - numberingPlan := '0111'B, - globalTitleAddress := '14377760'H - } - } - }, - sequenceControl := '00000000'B, - returnOption := '00000000'B, - userData := '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'O, - importance := omit -} id 1 -18:21:47.101242 mtc Message with id 1 was extracted from the queue of PCO_B. -18:21:47.101965 mtc Correct CalledAddress, CallingAddress and userData received, data are correct -18:21:47.102580 mtc setverdict(pass): none -> pass -18:21:47.103230 mtc Stop timer: 120 s -18:21:47.103850 mtc termitate() started -18:21:47.104464 mtc Stopping all components. -18:21:47.106496 8 Stop was requested from MC. -18:21:47.107164 8 Stopping test component execution. -18:21:47.123129 8 Function MTPsim_EventHandler was stopped. PTC terminates. -18:21:47.124103 8 Port MTP_portA was stopped. -18:21:47.124749 8 Port MTP_portB was stopped. -18:21:47.125610 8 Removing unterminated connection between ports MTP_portA and 9:MTP3user_sccp_PCO. -18:21:47.127704 8 Removing unterminated connection between ports MTP_portB and 11:MTP3user_sccp_PCO. -18:21:47.128884 8 Ports of component type MTPsim_CT were shut down. -18:21:47.129510 8 getverdict: none -18:21:47.131756 8 Disconnected from MC. -18:21:47.131976 8 TTCN-3 Parallel Test Component finished. -18:21:47.133209 9 Connection of port MTP3user_sccp_PCO to 8:MTP_portA is lost. -18:21:47.135184 9 Port MTP3user_sccp_PCO was disconnected from 8:MTP_portA. -18:21:47.136358 9 Stop was requested from MC. -18:21:47.137032 9 Stopping test component execution. -18:21:47.162489 9 Function ScanRAWPorts was stopped. PTC terminates. -18:21:47.163557 9 Port MTP3sccpEncDec_PCO was stopped. -18:21:47.164160 9 MTP3 Test Port (MTP3user_sccp_PCO): User stop ordered -18:21:47.164766 9 Port MTP3user_sccp_PCO was stopped. -18:21:47.165617 9 Removing unterminated connection between ports MTP3sccpEncDec_PCO and 10:MTP3sccp_PCO. -18:21:47.167692 9 Ports of component type SCCP_EncDec_comptype were shut down. -18:21:47.168343 9 getverdict: none -18:21:47.170258 9 Disconnected from MC. -18:21:47.170470 9 TTCN-3 Parallel Test Component finished. -18:21:47.171868 10 Connection of port MTP3sccp_PCO to 9:MTP3sccpEncDec_PCO is lost. -18:21:47.173933 10 Port MTP3sccp_PCO was disconnected from 9:MTP3sccpEncDec_PCO. -18:21:47.174646 10 Stop was requested from MC. -18:21:47.175246 10 Stopping test component execution. -18:21:47.200504 10 Function SCCPStart was stopped. PTC terminates. -18:21:47.201545 10 Port MTP3sccp_PCO was stopped. -18:21:47.202136 10 Port SCCP_PCO was stopped. -18:21:47.203172 10 Removing unterminated connection between ports SCCP_PCO and mtc:PCO_A. -18:21:47.204521 mtc Connection of port PCO_A to 10:SCCP_PCO is lost. -18:21:47.206622 mtc Port PCO_A was disconnected from 10:SCCP_PCO. -18:21:47.207704 10 Ports of component type SCCP_comptype were shut down. -18:21:47.208293 10 getverdict: none -18:21:47.210197 10 Disconnected from MC. -18:21:47.210401 10 TTCN-3 Parallel Test Component finished. -18:21:47.211716 11 Connection of port MTP3user_sccp_PCO to 8:MTP_portB is lost. -18:21:47.213172 11 Port MTP3user_sccp_PCO was disconnected from 8:MTP_portB. -18:21:47.214488 11 Stop was requested from MC. -18:21:47.215141 11 Stopping test component execution. -18:21:47.240282 11 Function ScanRAWPorts was stopped. PTC terminates. -18:21:47.241361 11 Port MTP3sccpEncDec_PCO was stopped. -18:21:47.241973 11 MTP3 Test Port (MTP3user_sccp_PCO): User stop ordered -18:21:47.242584 11 Port MTP3user_sccp_PCO was stopped. -18:21:47.243436 11 Removing unterminated connection between ports MTP3sccpEncDec_PCO and 12:MTP3sccp_PCO. -18:21:47.244858 11 Ports of component type SCCP_EncDec_comptype were shut down. -18:21:47.245503 11 getverdict: none -18:21:47.247937 11 Disconnected from MC. -18:21:47.248146 11 TTCN-3 Parallel Test Component finished. -18:21:47.249639 12 Connection of port MTP3sccp_PCO to 11:MTP3sccpEncDec_PCO is lost. -18:21:47.251689 12 Port MTP3sccp_PCO was disconnected from 11:MTP3sccpEncDec_PCO. -18:21:47.252406 12 Stop was requested from MC. -18:21:47.252990 12 Stopping test component execution. -18:21:47.344052 12 Function SCCPStart was stopped. PTC terminates. -18:21:47.345109 12 Port MTP3sccp_PCO was stopped. -18:21:47.346393 12 Port SCCP_PCO was stopped. -18:21:47.347503 12 Removing unterminated connection between ports SCCP_PCO and mtc:PCO_B. -18:21:47.348853 mtc Connection of port PCO_B to 12:SCCP_PCO is lost. -18:21:47.350357 mtc Port PCO_B was disconnected from 12:SCCP_PCO. -18:21:47.351354 12 Ports of component type SCCP_comptype were shut down. -18:21:47.351934 12 getverdict: none -18:21:47.352955 mtc All components were stopped. -18:21:47.353582 mtc Disconnecting ports 9:MTP3user_sccp_PCO and 8:MTP_portA. -18:21:47.354590 mtc Disconnect operation finished. -18:21:47.355197 mtc Disconnecting ports 10:MTP3sccp_PCO and 9:MTP3sccpEncDec_PCO. -18:21:47.356662 mtc Disconnect operation finished. -18:21:47.357283 mtc Disconnecting ports mtc:PCO_A and 10:SCCP_PCO. -18:21:47.358282 mtc Disconnect operation finished. -18:21:47.358890 mtc Disconnecting ports 11:MTP3user_sccp_PCO and 8:MTP_portB. -18:21:47.359898 mtc Disconnect operation finished. -18:21:47.360508 mtc Disconnecting ports 12:MTP3sccp_PCO and 11:MTP3sccpEncDec_PCO. -18:21:47.361519 mtc Disconnect operation finished. -18:21:47.362127 mtc Disconnecting ports mtc:PCO_B and 12:SCCP_PCO. -18:21:47.363126 mtc Disconnect operation finished. -18:21:47.363708 mtc all components stopped -18:21:47.364307 mtc Stopping test component execution. -18:21:47.365131 mtc Test case tc_ConnlessSendingLongASP was stopped. -18:21:47.366208 mtc Port PCO_A was stopped. -18:21:47.366555 mtc Port PCO_B was stopped. -18:21:47.368393 mtc Ports of component type MTC_CT were shut down. -18:21:47.368667 mtc Waiting for PTCs to finish. -18:21:47.370662 mtc Setting final verdict of the test case. -18:21:47.371019 mtc Local verdict of MTC: pass -18:21:47.371339 mtc Local verdict of PTC with component reference 8: none (pass -> pass) -18:21:47.371635 mtc Local verdict of PTC with component reference 9: none (pass -> pass) -18:21:47.371948 mtc Local verdict of PTC with component reference 10: none (pass -> pass) -18:21:47.372245 mtc Local verdict of PTC with component reference 11: none (pass -> pass) -18:21:47.372560 mtc Local verdict of PTC with component reference 12: none (pass -> pass) -18:21:47.372855 mtc Test case tc_ConnlessSendingLongASP finished. Verdict: pass -18:21:47.402761 12 Disconnected from MC. -18:21:47.402997 12 TTCN-3 Parallel Test Component finished. -18:22:04.264666 mtc Verdict statistics: 0 none (0.00 %), 2 pass (100.00 %), 0 inconc (0.00 %), 0 fail (0.00 %), 0 error (0.00 %). -18:22:04.265451 mtc Test execution summary: 2 test cases were executed. Overall verdict: pass. -18:22:04.266260 mtc Exit was requested from MC. Terminating MTC. -18:22:04.269127 mtc Disconnected from MC. -18:22:04.269382 mtc TTCN-3 Main Test Component finished. -18:22:04.270509 hc Test component with component reference 12 finished. Process statistics: { - process id: 25843, - exit status: 0, - user time: 0.020000 s, - system time: 0.070000 s, - maximum resident set size: 0, - integral resident set size: 0, - page faults not requiring physical I/O: 0, - page faults requiring physical I/O: 0, - swaps: 0, - block input operations: 0, - block output operations 0, - messages sent: 0, - messages received: 0, - signals received: 0, - voluntary context switches: 0, - involuntary context switches: 0 -} -18:22:04.271775 hc Test component with component reference 11 finished. Process statistics: { - process id: 25842, - exit status: 0, - user time: 0.020000 s, - system time: 0.030000 s, - maximum resident set size: 0, - integral resident set size: 0, - page faults not requiring physical I/O: 0, - page faults requiring physical I/O: 0, - swaps: 0, - block input operations: 0, - block output operations 0, - messages sent: 0, - messages received: 0, - signals received: 0, - voluntary context switches: 0, - involuntary context switches: 0 -} -18:22:04.272732 hc Test component with component reference 10 finished. Process statistics: { - process id: 25841, - exit status: 0, - user time: 0.010000 s, - system time: 0.040000 s, - maximum resident set size: 0, - integral resident set size: 0, - page faults not requiring physical I/O: 0, - page faults requiring physical I/O: 0, - swaps: 0, - block input operations: 0, - block output operations 0, - messages sent: 0, - messages received: 0, - signals received: 0, - voluntary context switches: 0, - involuntary context switches: 0 -} -18:22:04.274094 hc Test component with component reference 9 finished. Process statistics: { - process id: 25840, - exit status: 0, - user time: 0.020000 s, - system time: 0.020000 s, - maximum resident set size: 0, - integral resident set size: 0, - page faults not requiring physical I/O: 0, - page faults requiring physical I/O: 0, - swaps: 0, - block input operations: 0, - block output operations 0, - messages sent: 0, - messages received: 0, - signals received: 0, - voluntary context switches: 0, - involuntary context switches: 0 -} -18:22:04.301155 hc Test component with component reference 1 finished. Process statistics: { - process id: 25833, - exit status: 0, - user time: 0.050000 s, - system time: 0.100000 s, - maximum resident set size: 0, - integral resident set size: 0, - page faults not requiring physical I/O: 0, - page faults requiring physical I/O: 0, - swaps: 0, - block input operations: 0, - block output operations 0, - messages sent: 0, - messages received: 0, - signals received: 0, - voluntary context switches: 0, - involuntary context switches: 0 -} -18:22:04.302181 hc Test component with component reference 8 finished. Process statistics: { - process id: 25839, - exit status: 0, - user time: 0.020000 s, - system time: 0.030000 s, - maximum resident set size: 0, - integral resident set size: 0, - page faults not requiring physical I/O: 0, - page faults requiring physical I/O: 0, - swaps: 0, - block input operations: 0, - block output operations 0, - messages sent: 0, - messages received: 0, - signals received: 0, - voluntary context switches: 0, - involuntary context switches: 0 -} -18:22:04.303133 hc Exit was requested from MC. Terminating HC. -18:22:04.314953 hc Disconnected from MC. -18:22:04.315230 hc TTCN-3 Host Controller finished on duna199. diff --git a/SCCP_CNL113341/demo/SCCP_Emulation.ttcn b/SCCP_CNL113341/demo/SCCP_Emulation.ttcn deleted file mode 120000 index fae960598..000000000 --- a/SCCP_CNL113341/demo/SCCP_Emulation.ttcn +++ /dev/null @@ -1 +0,0 @@ -../src/SCCP_Emulation.ttcn \ No newline at end of file diff --git a/SCCP_CNL113341/demo/SCCP_Mapping.ttcnpp b/SCCP_CNL113341/demo/SCCP_Mapping.ttcnpp deleted file mode 120000 index aabd0d400..000000000 --- a/SCCP_CNL113341/demo/SCCP_Mapping.ttcnpp +++ /dev/null @@ -1 +0,0 @@ -../src/SCCP_Mapping.ttcnpp \ No newline at end of file diff --git a/SCCP_CNL113341/demo/SCCP_Testcases.cfg b/SCCP_CNL113341/demo/SCCP_Testcases.cfg deleted file mode 100644 index ae1c4724c..000000000 --- a/SCCP_CNL113341/demo/SCCP_Testcases.cfg +++ /dev/null @@ -1,55 +0,0 @@ -[LOGGING] -#FileName := "SCCP_selftest.cfg" -FileMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING -#ConsoleMask := LOG_ALL -#ConsoleMask := TTCN_TESTCASE | TTCN_PORTEVENT | TTCN_DEBUG | TTCN_MATCHING -#ConsoleMask := TTCN_WARNING | TTCN_ERROR | TTCN_TESTCASE | TTCN_STATISTICS | TTCN_PORTEVENT -#ConsoleMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING -LogSourceInfo := Yes - -[EXECUTE] -#SCCP_selftest.tc_ConnlessSendingShortASP -#SCCP_selftest.tc_ConnlessSendingLongASP -#SCCP_selftest.tc_ConnOrientedShortASPSending -#SCCP_Testcases.tc_ConnlessSendingLongASP -SCCP_Testcases.tc_ConnOrientedShortASPSending - -[TESTPORT_PARAMETERS] -// ******************************************************* -// * DO NOT FORGET TO SET THE FOLLOWING TWO LINE TO YOUR SEA * -// ******************************************************* -system.*.Hostname := "karasea" //sea server name -system.*.HttpPort := "5001" //sea http port -system.*.IID_String := "b303d76a-266c-11d4-b8f5-08002090d3da" - //Device Type ID -system.*.Loop:= "OFF" -system.*.Filter:= "OFF" -system.*.MTP3ServiceType := "MTP3ttc" // ["MTP3itu" (default)|"MTP3ansi" | "M3UA" |"MTP3tcc] - -// CMGW6 -> SCTP_ASSOC_10.2.110.102 -// CMGW3 data: SCTP_ASSOC_10.2.110.2 -system.CMGW6.EntityName := "SAALH-0" //"S7ST-0" //device name to connect -system.CMGW6.NI := "2" -system.CMGW6.SUT_Pc := "2300" -system.CMGW6.TESTER_Pc := "2351" -system.CMGW6.M3UA_version:= "1" - -[MODULE_PARAMETERS] -tsp_own_GT := '14377760'H -tsp_remote_GT := '14375760'H -tsp_SSN := 8 //8:MSC 5:MAP see 3.4.2.2/Q.713 -tsp_SIO := '83'O //SCCP national -tsp_own_SPC := 2351 -tsp_remote_SPC := 2300// max value on 14 bits -tsp_SLS := 0 -#[tsp_sccp_serviceType := "mtp3_itu" |"mtp3b_itu"|"mtp3_ansi"|"mtp3b_ansi"| "mtp3b_tcc"] -tsp_sccp_serviceType := "mtp3_ttc" - -#for mtp3_itu/gti0011 or mtp3_ansi/gti0001 : -#tsp_translationType := 7 -tsp_SIF_MaxLength := 272 -tsp_force_xudt := 0 // 1:yes, 0:no - -[MAIN_CONTROLLER] -TCPPort := 7145 -NumHCs := 1 diff --git a/SCCP_CNL113341/demo/SCCP_Testcases.ttcn b/SCCP_CNL113341/demo/SCCP_Testcases.ttcn deleted file mode 100644 index 0f8ba47c3..000000000 --- a/SCCP_CNL113341/demo/SCCP_Testcases.ttcn +++ /dev/null @@ -1,468 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -// -// Copyright Test Competence Center (TCC) ETH 2007 -// -// -// -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied -// -// -// -/////////////////////////////////////////////////////////////////////////////// -// -// File: SCCP_TestCases.ttcn -// Description: SS7 SCCP basic SEA test -// according to specification ITU-T SS7 SCCP, ANSI ..., TCC ... -// References: ITU-T: Recommendation Q.711-Q.714, -// ANSI T1.112-2001, -// TCC -// Rev: -// Updated: 2007.04.12 -// Contact: http://ttcn.ericsson.se -// - -module SCCP_Testcases -{//startmodule - -modulepar -{ - hexstring tsp_own_GT := '0614377760'H; - hexstring tsp_remote_GT := '0614375760'H; - integer tsp_SSN := 2; //8:MSC 5:MAP see 3.4.2.2/Q.713 - octetstring tsp_SIO := '83'O;//SCCP national - integer tsp_own_SPC := 461087; // =0x07091E - integer tsp_remote_SPC := 461086; // =0x07091D - integer tsp_SLS := 0; - charstring tsp_sccp_serviceType := "mtp3_itu"; - - octetstring MTP3_UserPart_SIO; - integer MTP3_UserPart_OPC, - MTP3_UserPart_DPC, - MTP3_UserPart_SLS -}//modulepar - -import from General_Types all; - -import from MTP3asp_Types all; -import from MTP3asp_PortType all; - -import from SCCPasp_Types all; -import from SCCP_Types all; -import from SCCP_Emulation all; - -/************************************* -* Components -**************************************/ - - -// Model of MSC: -type component MSC_ST { - port MTP3asp_SP_PT CMGW6; - //port MTP3asp_PT CMGW6; -}; - - -// Main test component with behaviour SCCPuserA andSCCPuserB -type component MTC_CT { - var SCCP_PAR_Address v_CalledAddress, v_CallingAddress; - var integer v_testvalue; - var SCCP_CT vc_SCCP_A ; - var MSC_SCCP_MTP3_parameters v_BootA; - var SCCP_PAR_Connection_Id v_cid_A ; - - port SCCPasp_PT A_PORT; //SCCPuserA -} - -function initBootParams() runs on MTC_CT -{ - v_BootA := - { sio:= - { ni:= substr(oct2bit(tsp_SIO),0,2), - prio:= substr(oct2bit(tsp_SIO),2,2), - si:= substr(oct2bit(tsp_SIO),4,4) - }, - opc:=tsp_own_SPC, - dpc:=tsp_remote_SPC, - sls:=tsp_SLS, - sccp_serviceType:=tsp_sccp_serviceType, - ssn:= tsp_SSN - }; - return; -} //initBootParams - -function init() runs on MTC_CT //system MSC_ST -{ - initBootParams(); - log("v_BootA:",v_BootA); - - // Protocol Stack A creation & connections: - vc_SCCP_A:=SCCP_CT.create; - map(vc_SCCP_A:MTP3_SCCP_PORT,system:CMGW6); - connect(self:A_PORT,vc_SCCP_A:SCCP_SP_PORT); - - vc_SCCP_A.start( SCCPStart( v_BootA ) ); // Bootparameters - - - log( "init() is done"); - -}// init - -function terminate( ) runs on MTC_CT //system MSC_ST -{ - log( "termitate() started"); - /*while( all component.running != true ) - { - //waits - }*/ - all component.stop; - unmap(vc_SCCP_A:MTP3_SCCP_PORT,system:CMGW6); - disconnect(self:A_PORT,vc_SCCP_A:SCCP_SP_PORT); - - log(" all components stopped"); - self.stop; -} //terminate - -// function getOddEven returns '0' -// if even number of dec digit can be found in GT see Q.713 -function getOddEven( in hexstring pl_GT) return bitstring -{ - return int2bit( (lengthof(pl_GT) mod 2) ,1); -} - -function getOddEven_ansi( in hexstring pl_GT) return bitstring -{ - if( (lengthof(pl_GT) mod 2) == 0 ) { return '0010'B;} //even - else { return '0001'B;} //odd -} - -//****************************************************************** -//function setAddresses_gti0001() runs on MTC_CT -// Sets CalledAddress and CallingAddress as a gti001-type address -// according to the cfg file. -//****************************************************************** - -function setAddresses_gti0001() runs on MTC_CT -{ - if( (tsp_sccp_serviceType == "mtp3_itu") or - (tsp_sccp_serviceType == "mtp3b_itu") or - (tsp_sccp_serviceType == "mtp3_ttc") or - (tsp_sccp_serviceType == "mtp3b_ttc") - ) { - v_CalledAddress :={ - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - },//addressIndicator - signPointCode := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn - subsystemNumber := tsp_SSN, - globalTitle := { - gti0001:= { - natureOfAddress := '0000011'B, - oddeven := getOddEven( tsp_remote_GT ), - globalTitleAddress := tsp_remote_GT - } - }//globalTitle - } // v_CalledAddress - - v_CallingAddress :={ - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - },//addressIndicator - signPointCode := SCCP_SPC_int2bit(tsp_own_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn - subsystemNumber := tsp_SSN, - globalTitle:= { - gti0001 := { - natureOfAddress := '0000011'B, - oddeven := getOddEven( tsp_own_GT ), - globalTitleAddress := tsp_own_GT - } - }//globalTitle - } // v_CallingAddress - - } else if( - (tsp_sccp_serviceType == "mtp3_ansi") or - (tsp_sccp_serviceType == "mtp3b_ansi") - ) { - - v_CalledAddress :={ - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - },//addressIndicator - signPointCode := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn - subsystemNumber := tsp_SSN, - globalTitle := { - gti0011:= { - translationType := int2oct(7,1), - encodingScheme := getOddEven_ansi( tsp_remote_GT ), - numberingPlan := '0111'B, //ISDN/mobile numbering plan, see T1.112.3-2001/3.4.2.3.1 - globalTitleAddress:= tsp_remote_GT - } - }//globalTitle - } // v_CalledAddress - - v_CallingAddress :={ - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - },//addressIndicator - signPointCode := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn - subsystemNumber := tsp_SSN, - globalTitle := { - gti0011:= { - translationType := int2oct(7,1), - encodingScheme := getOddEven_ansi( tsp_own_GT ), - numberingPlan := '0111'B, //ISDN/mobile numbering plan, see T1.112.3-2001/3.4.2.3.1 - globalTitleAddress:= tsp_own_GT - } - }//globalTitle - } // v_CallingAddress - }//if - -}//setAddresses_gti001 - -function f_SendAndReceive1N_UNITDATA(in octetstring pl_userdata) runs on MTC_CT -{ - var ASP_SCCP_N_UNITDATA_ind vl_N_UNITDATA_ind; - timer TL_timer:= 120.0; - TL_timer.start; - A_PORT.send( t_ASP_N_UNITDATA_req( v_CalledAddress, - v_CallingAddress, - '00000001'B, //sequence control - '00000001'B, //return option - pl_userdata, - omit ) ); - alt { - [] A_PORT.receive( tr_ASP_N_UNITDATA_ind ) -> value vl_N_UNITDATA_ind - { - - if( (vl_N_UNITDATA_ind.calledAddress == v_CalledAddress ) and - (vl_N_UNITDATA_ind.callingAddress == v_CallingAddress) and - (vl_N_UNITDATA_ind.userData == pl_userdata) ) - { - log("Correct CalledAddress, CallingAddress and userData received, data are correct"); - setverdict(pass); - } - else - { - log("Some data corrupted"); - setverdict( fail ); - } - }; - [] TL_timer.timeout - { - setverdict( fail ); - log("Timeout...."); - }; - } //alt - TL_timer.stop; -}//f_SendAndReceive1N_UNITDATA - -/**************************************************** -Connection Oriented Part -****************************************************/ - -/**************************************************** -function f_connect -Establishes a connection -(Sends an ASP_SCCP_N_CONNECT_req on A_PORT and waits for -N_CONNECT_ind on B_PORT. If it is received, -it sends back an ASP_SCCP_N_CONNECT_res on B_PORT and waits for -N_CONNECT_cfm on A_PORT) -****************************************************/ -function f_connect() runs on MTC_CT return boolean -{ - var ASP_SCCP_N_CONNECT_ind vl_N_CONNECT_ind; - var ASP_SCCP_N_CONNECT_cfm vl_N_CONNECT_cfm; - setverdict(none); - v_cid_A := 13; - timer TL_timer:= 120.0; - TL_timer.start; - - A_PORT.send( t_ASP_N_CONNECT_req( v_CalledAddress, - v_CallingAddress, - omit, //expeditedDataSel - omit, //QoS - omit, //userData - v_cid_A, - omit //importance - ) ); - - alt { - [] A_PORT.receive( tr_ASP_N_CONNECT_cfm ) -> value vl_N_CONNECT_cfm - { - setverdict( pass ); - log("f_connect finished successfully"); - return true; - } - [] TL_timer.timeout - { - setverdict( fail ); - log("Timeout...."); - return false; - } - }// alt - log("f_connect finished"); - return false; -}//f_connect - -/**************************************************** -function f_send -Sends an ASP_SCCP_N_DATA_req on A_PORT and waits for answer in -A_PORT -****************************************************/ -function f_send(in octetstring pl_userdata) runs on MTC_CT -{ - timer TL_timer:= 120.0; - TL_timer.start; - A_PORT.send( t_ASP_N_DATA_req ( pl_userdata, v_cid_A, omit) ) ; - alt { - [] A_PORT.receive - { - setverdict( pass ); - log("f_connect finished successfully"); - - } - [] TL_timer.timeout - { - setverdict( fail ); - log("Timeout...."); - - } - - } //alt -}//f_send - -//f_disconnect with timeout - -function f_disconnect( ) runs on MTC_CT -{ - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - timer TL_timer:= 25.0; - TL_timer.start; - A_PORT.send( t_ASP_N_DISCONNECT_req( omit, // respondingAddress - 0, //reason : end user originated, see 3.11/Q.713 - omit, //userData - v_cid_A, - omit )) - alt { - - [] A_PORT.receive - { - repeat; - } - [] TL_timer.timeout - { - setverdict( pass ); - log("Timeout...."); - }; - }//alt - - -}//f_disconnect - -//=================================================== -// Testcases -//=================================================== - -/**************************************************** -tc_ConnlessSendingShortASP -Sends a 300 octet long userdata in one ASP_SCCP_N_UNITDATA_req -and receives it in one ASP_SCCP_N_UNITDATA_req. -SCCP transfers information -in udp or (forced) xudp packets. -****************************************************/ -testcase tc_ConnlessSendingShortASP() runs on MTC_CT -{ - var octetstring vl_userdata; - init(); - setAddresses_gti0001(); - vl_userdata :='12345678901234567890'O; - f_SendAndReceive1N_UNITDATA( vl_userdata ); - terminate(); - } //tc_ConnlessSendingShortASP - -/**************************************************** - tc_ConnlessSendingLongASP - Sends a 300 octet long userdata in one ASP_SCCP_N_UNITDATA_req - and receives it in one ASP_SCCP_N_UNITDATA_req. - It is used for segmentation and reassembly. - SCCP transfers information -in xudp packets -****************************************************/ -testcase tc_ConnlessSendingLongASP() runs on MTC_CT system MSC_ST -{ - var octetstring vl_userdata; - var integer vl_i; - init(); - setAddresses_gti0001(); - vl_userdata := ''O; - for(vl_i:=0;vl_i<30;vl_i:=vl_i+1) { - vl_userdata := vl_userdata &'12345678901234567890'O; - } - f_SendAndReceive1N_UNITDATA( vl_userdata ); - terminate(); -}//tc_ConnlessSendingLongASP - -/**************************************************** -tc_ConnOrientedShortASPSending -****************************************************/ -testcase tc_ConnOrientedShortASPSending() runs on MTC_CT system MSC_ST -{ - var octetstring vl_userdata; - init(); - setAddresses_gti0001(); - vl_userdata := '12345678901234567890'O; - if(f_connect()) - { - f_send(vl_userdata); - f_disconnect(); - } - terminate(); -} -/**************************************************** -tc_ConnOrientedLongASPSending -****************************************************/ -testcase tc_ConnOrientedLongASPSending() runs on MTC_CT -{ - var octetstring vl_userdata; - var integer vl_i; - init(); - setAddresses_gti0001(); - vl_userdata := ''O; - for(vl_i:=0;vl_i<30;vl_i:=vl_i+1) { - vl_userdata := vl_userdata &'12345678901234567890'O; - } - if(f_connect()) - { - f_send(vl_userdata); - //f_SendAndReceive1N_UNITDATA( vl_userdata ); - f_disconnect(); - } - terminate(); -} -/**************************************************** - CONTROL -****************************************************/ -control -{ - execute( tc_ConnlessSendingShortASP() ); - execute( tc_ConnlessSendingLongASP() ); - execute( tc_ConnOrientedShortASPSending()); - execute( tc_ConnOrientedLongASPSending()); -} - -}//module diff --git a/SCCP_CNL113341/demo/SCCP_Types.ttcn b/SCCP_CNL113341/demo/SCCP_Types.ttcn deleted file mode 120000 index 9aa343b89..000000000 --- a/SCCP_CNL113341/demo/SCCP_Types.ttcn +++ /dev/null @@ -1 +0,0 @@ -../src/SCCP_Types.ttcn \ No newline at end of file diff --git a/SCCP_CNL113341/demo/SCCP_selftest.cfg b/SCCP_CNL113341/demo/SCCP_selftest.cfg deleted file mode 100644 index 67e0762d1..000000000 --- a/SCCP_CNL113341/demo/SCCP_selftest.cfg +++ /dev/null @@ -1,52 +0,0 @@ -[LOGGING] -#FileName := "SCCP_selftest.cfg" -FileMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING -#ConsoleMask := LOG_ALL -ConsoleMask := TTCN_WARNING | TTCN_ERROR | TTCN_TESTCASE | TTCN_STATISTICS | TTCN_PORTEVENT -#ConsoleMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING -#LogFile := "My.log" -#TimeStampFormat := Time -LogSourceInfo := Yes - -[EXECUTE] -SCCP_selftest.tc_ConnlessSendingShortASP -#SCCP_selftest.tc_ConnlessSendingLongASP -[TESTPORT_PARAMETERS] -// ******************************************************* -// * DO NOT FORGET TO SET THE FOLLOWING TWO LINE TO YOUR SEA * -// ******************************************************* -system.*.Hostname := "karasea" //sea server name -system.*.HttpPort := "5000" //sea http port -system.*.IID_String := "b303d76a-266c-11d4-b8f5-08002090d3da" - //Device Type ID -system.*.Loop:= "ON" -system.*.Filter:= "OFF" -system.*.MTP3ServiceType := "MTP3ttc" //"MTP3itu" ["MTP3itu" (default)|"MTP3ansi" | "M3UA" | "MTP3ttc" ] - -// CMGW6 -> SCTP_ASSOC_10.2.110.102 -// CMGW3 data: SCTP_ASSOC_10.2.110.2 -system.CMGW6.EntityName := "S7ST-0" //device name to connect -system.CMGW6.NI := "2" -system.CMGW6.SUT_Pc:= "461086" // 07-09-30 =0x07091E see command: s7stp:st=s7stg-0&&-32; -system.CMGW6.TESTER_Pc:= "461087" //07-09-31=0x07091F -system.CMGW6.M3UA_version:= "1" - -[MODULE_PARAMETERS] -//for sccp: -tsp_own_GT := '14377760'H -tsp_remote_GT := '14375760'H -tsp_SSN := 2 //8:MSC 5:MAP see 3.4.2.2/Q.713 -tsp_SIO := '03'O //SCCP national -tsp_own_SPC := 2351 //16382 -tsp_remote_SPC := 2300 //16383 // max value on 14 bits -#tsp_own_SPC := 461087 // =0x07091E -#tsp_remote_SPC := 461086 // =0x07091D -tsp_SLS := 0 -#tsp_sccp_serviceType := "mtp3_itu" -#tsp_sccp_serviceType := "mtp3_ansi" -tsp_sccp_serviceType := "mtp3_ttc" - -#for mtp3_itu/gti0011 or mtp3_ansi/gti0001 : -#tsp_translationType := 7 -tsp_SIF_MaxLength := 272 -tsp_force_xudt := 1 // 1:yes, 0:no diff --git a/SCCP_CNL113341/demo/SCCP_selftest.ttcn b/SCCP_CNL113341/demo/SCCP_selftest.ttcn deleted file mode 100644 index c6497045f..000000000 --- a/SCCP_CNL113341/demo/SCCP_selftest.ttcn +++ /dev/null @@ -1,607 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// -// -// Copyright Test Competence Center (TCC) ETH 2007 -// -// -// -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied -// -// -// -/////////////////////////////////////////////////////////////////////////////// -// -// File: SCCP_selftest.ttcn -// Description: SS7 SCCP basic test -// according to specification ITU-T SS7 SCCP, ANSI ..., TCC ... -// References: ITU-T: Recommendation Q.711-Q.714, -// ANSI , -// TCC -// Rev: -// Updated: 2007-04.12 -// Contact: http://ttcn.ericsson.se -// - -module SCCP_selftest -{//startmodule - -modulepar -{ - hexstring tsp_own_GT := '0614377760'H; - hexstring tsp_remote_GT := '0614375760'H; - integer tsp_SSN := 2; //8:MSC 5:MAP see 3.4.2.2/Q.713 - octetstring tsp_SIO := '83'O;//SCCP national - integer tsp_own_SPC := 461087; // =0x07091E - integer tsp_remote_SPC := 461086; // =0x07091D - integer tsp_SLS := 0; - charstring tsp_sccp_serviceType := "mtp3_itu" -}//modulepar - -import from General_Types all; - -import from MTP3asp_Types all; -import from MTP3asp_PortType all; - -import from SCCPasp_Types all; -import from SCCP_Types all; -import from SCCP_Emulation all; - - -//================================================================== -// MTPsim component -// Description: Simulates two MTP stacks for two MTP3-User -// to implement this configuration: -// MTPsim includes MTP3/1 and MTP3/2 -// MTPsim only receives TRANSFER_req and sends TRANSFER_ind -// with the same content -// +----------+ +----------+ -// |SCCP-userA| <--->|SCCP-userB| = MTC -// +----------+ +----------+ -// | A | B -// +----------+ +----------+ -// | SCCP A | <--->| SCCP B | -// +----------+ +----------+ -// | A | B -// +-----------------------------+ -// | MTP3 1. | MTP3 2.| = MTP3sim -// +----------------------------+ -// -//================================================================== - -group MTPsim -{ - - -type component MTPsim_CT { - port MTP3asp_SP_PT MTP_A_PORT - port MTP3asp_SP_PT MTP_B_PORT -} - -function MTPsim_EventHandler( ) runs on MTPsim_CT -{ - var ASP_MTP3_TRANSFERreq vl_MTP3_TRANSFERreq; - var ASP_MTP3_TRANSFERind vl_MTP3_TRANSFERind - alt{ - [] MTP_A_PORT.receive( ASP_MTP3_TRANSFERreq:? ) -> value vl_MTP3_TRANSFERreq - - { - MTP_B_PORT.send( t_ASP_MTP3_TRANSFERind( - vl_MTP3_TRANSFERreq.sio, - vl_MTP3_TRANSFERreq.opc, - vl_MTP3_TRANSFERreq.dpc, - vl_MTP3_TRANSFERreq.sls, - vl_MTP3_TRANSFERreq.data ) ) ; - repeat; - }//A.receive - [] MTP_B_PORT.receive( ASP_MTP3_TRANSFERreq:? ) -> value vl_MTP3_TRANSFERreq - - { - MTP_A_PORT.send( t_ASP_MTP3_TRANSFERind ( - vl_MTP3_TRANSFERreq.sio, - vl_MTP3_TRANSFERreq.opc, - vl_MTP3_TRANSFERreq.dpc, - vl_MTP3_TRANSFERreq.sls, - vl_MTP3_TRANSFERreq.data )); - repeat; - }//B.receive - - }//alt - -} //MTPsim_EventHandler - -}//group MTPsim - -// Main test component with behaviour SCCPuserA andSCCPuserB -type component MTC_CT { - var SCCP_PAR_Address v_CalledAddress, v_CallingAddress; - var integer v_testvalue; - var MTPsim_CT vc_MTPsim; - var SCCP_CT vc_SCCP_A, vc_SCCP_B; - var MSC_SCCP_MTP3_parameters v_BootA; - var MSC_SCCP_MTP3_parameters v_BootB; - var SCCP_PAR_Connection_Id v_cid_A, v_cid_B; - - port SCCPasp_PT A_PORT; //SCCPuserA - port SCCPasp_PT B_PORT //SCCPuserB - -} - -function initBootParams() runs on MTC_CT -{ - v_BootA := - { sio:= - { ni:= substr(oct2bit(tsp_SIO),0,2), - prio:= substr(oct2bit(tsp_SIO),2,2), - si:= substr(oct2bit(tsp_SIO),4,4) - }, - opc:=tsp_own_SPC, - dpc:=tsp_remote_SPC, - sls:=tsp_SLS, - sccp_serviceType:=tsp_sccp_serviceType, - ssn:= tsp_SSN - }; - - v_BootB := - { sio:= - { ni:= substr(oct2bit(tsp_SIO),0,2), - prio:= substr(oct2bit(tsp_SIO),2,2), - si:= substr(oct2bit(tsp_SIO),4,4) - }, - opc:=tsp_remote_SPC, - dpc:=tsp_own_SPC, - sls:=tsp_SLS, - sccp_serviceType:=tsp_sccp_serviceType, - ssn:= tsp_SSN - }; - return; -} //initBootParams -function init() runs on MTC_CT -{ - - - initBootParams(); - log("v_BootA:",v_BootA); - log("v_BootB: ",v_BootB); - vc_MTPsim:= MTPsim_CT.create; - - // Protocol Stack A creation & connections: - vc_SCCP_A:=SCCP_CT.create; - connect(vc_SCCP_A:MTP3_SCCP_PORT,vc_MTPsim:MTP_A_PORT); - connect(self:A_PORT,vc_SCCP_A:SCCP_SP_PORT); - - // Protocol Stack B creation & connections: - vc_SCCP_B:=SCCP_CT.create; - connect(vc_SCCP_B:MTP3_SCCP_PORT,vc_MTPsim:MTP_B_PORT); - connect(self:B_PORT,vc_SCCP_B:SCCP_SP_PORT); - - // Start stacks: - vc_MTPsim.start( MTPsim_EventHandler() ); - - vc_SCCP_A.start( SCCPStart( v_BootA ) ); // Bootparameters !!! cont here!!! - - vc_SCCP_B.start( SCCPStart(v_BootB)); - log( "init() is done"); - -}// init - -function terminate( ) runs on MTC_CT -{ - log( "termitate() started"); - /*while( all component.running != true ) - { - //waits - }*/ - all component.stop; - disconnect(vc_SCCP_A:MTP3_SCCP_PORT, vc_MTPsim:MTP_A_PORT); - disconnect(self:A_PORT,vc_SCCP_A:SCCP_SP_PORT); - - disconnect(vc_SCCP_B:MTP3_SCCP_PORT,vc_MTPsim:MTP_B_PORT); - disconnect(self:B_PORT,vc_SCCP_B:SCCP_SP_PORT); - log(" all components stopped"); - self.stop; -} //terminate - -// function getOddEven returns '0' -// if even number of dec digit can be found in GT see Q.713 -function getOddEven( in hexstring pl_GT) return bitstring -{ - return int2bit( (lengthof(pl_GT) mod 2) ,1); -} - -function getOddEvenEnc( in hexstring pl_GT) return bitstring -{ - if( (lengthof(pl_GT) mod 2) == 0 ) { return '0010'B;} //even - else { return '0001'B;} //odd -} - -//****************************************************************** -//function setAddresses_gti0001() runs on MTC_CT -// Sets CalledAddress and CallingAddress as a gti001-type address -// according to the cfg file. -//****************************************************************** - -function setAddresses_gti0001() runs on MTC_CT -{ - if( (tsp_sccp_serviceType == "mtp3_itu") or - (tsp_sccp_serviceType == "mtp3b_itu") or - (tsp_sccp_serviceType == "mtp3_ttc") or - (tsp_sccp_serviceType == "mtp3b_ttc") - ) { - v_CalledAddress :={ - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - },//addressIndicator - signPointCode := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP_Emulation.ttcn - subsystemNumber := tsp_SSN, - globalTitle := { - gti0001:= { - natureOfAddress := '0000011'B, - oddeven := getOddEven( tsp_remote_GT ), - globalTitleAddress := tsp_remote_GT - } - }//globalTitle - } // v_CalledAddress - - v_CallingAddress :={ - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - },//addressIndicator - signPointCode := SCCP_SPC_int2bit(tsp_own_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP_Emulation.ttcn - subsystemNumber := tsp_SSN, - globalTitle:= { - gti0001 := { - natureOfAddress := '0000011'B, - oddeven := getOddEven( tsp_own_GT ), - globalTitleAddress := tsp_own_GT - } - }//globalTitle - } // v_CallingAddress - - } else if( - (tsp_sccp_serviceType == "mtp3_ansi") or - (tsp_sccp_serviceType == "mtp3b_ansi") ) - { - - v_CalledAddress :={ - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - },//addressIndicator - signPointCode := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP_Emulation.ttcn - subsystemNumber := tsp_SSN, - globalTitle := { - gti0011:= { - translationType := int2oct(7,1), - encodingScheme := getOddEvenEnc( tsp_remote_GT ), - numberingPlan := '0111'B, //ISDN/mobile numbering plan, see T1.112.3-2001/3.4.2.3.1 - globalTitleAddress:= tsp_remote_GT - } - }//globalTitle - } // v_CalledAddress - - v_CallingAddress :={ - addressIndicator := { - pointCodeIndic := '1'B, - ssnIndicator := '1'B, - globalTitleIndic := '0001'B, - routingIndicator := '0'B - },//addressIndicator - signPointCode := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP_Emulation.ttcn - subsystemNumber := tsp_SSN, - globalTitle := { - gti0011:= { - translationType := int2oct(7,1), - encodingScheme := getOddEvenEnc( tsp_own_GT ), - numberingPlan := '0111'B, //ISDN/mobile numbering plan, see T1.112.3-2001/3.4.2.3.1 - globalTitleAddress:= tsp_own_GT - } - }//globalTitle - } // v_CallingAddress - - }//if - else - { - log( "wrong tsp_sccp_serviceType ->exit "); - setverdict( fail ); - } -}//setAddresses_gti001 - -function f_SendAndReceive1N_UNITDATA(in octetstring pl_userdata) runs on MTC_CT -{ - var ASP_SCCP_N_UNITDATA_ind vl_N_UNITDATA_ind; - timer TL_timer:= 40.0; - TL_timer.start; - log("A_PORT.send follows"); - log("Addresses:",v_CalledAddress, v_CallingAddress); - A_PORT.send( t_ASP_N_UNITDATA_req( v_CalledAddress, - v_CallingAddress, - '00000001'B, //sequence control - '00000001'B, //return option - pl_userdata, - omit ) ); - log("A_PORT.send executed"); - alt { - [] B_PORT.receive( tr_ASP_N_UNITDATA_ind ) -> value vl_N_UNITDATA_ind - { - - if( (vl_N_UNITDATA_ind.calledAddress == v_CalledAddress ) and - (vl_N_UNITDATA_ind.callingAddress == v_CallingAddress) and - (vl_N_UNITDATA_ind.userData == pl_userdata) ) - { - log("Correct CalledAddress, CallingAddress and userData received, data are correct"); - setverdict(pass); - } - else - { - log("Some data corrupted"); - log("Original data:", v_CalledAddress, v_CallingAddress, pl_userdata); - setverdict( fail ); - } - }; - [] TL_timer.timeout - { - setverdict( fail ); - log("Timeout...."); - }; - } //alt - TL_timer.stop; -}//f_SendAndReceive1N_UNITDATA - -/**************************************************** -Connection Oriented Part -****************************************************/ - -/**************************************************** -function f_connect -Establishes a connection -(Sends an ASP_SCCP_N_CONNECT_req on A_PORT and waits for -N_CONNECT_ind on B_PORT. If it is received, -it sends back an ASP_SCCP_N_CONNECT_res on B_PORT and waits for -N_CONNECT_cfm on A_PORT) -****************************************************/ -function f_connect() runs on MTC_CT return boolean -{ - var ASP_SCCP_N_CONNECT_ind vl_N_CONNECT_ind; - var ASP_SCCP_N_CONNECT_cfm vl_N_CONNECT_cfm; - setverdict(none); - v_cid_A := 13; - timer TL_timer:= 40.0; - TL_timer.start; - // A Sends ASP_SCCP_N_CONNECT_req , receives - A_PORT.send( t_ASP_N_CONNECT_req( v_CalledAddress, - v_CallingAddress, - omit, //expeditedDataSel - omit, //QoS - omit, //userData - v_cid_A, - omit //importance - ) ); - alt { - [] B_PORT.receive( tr_ASP_N_CONNECT_ind ) -> value vl_N_CONNECT_ind - { - v_cid_B := vl_N_CONNECT_ind.connectionId; - B_PORT.send( t_ASP_N_CONNECT_res( omit,// respondingAddress - omit,//expeditedDataSel - omit,//qualityOfService - omit, //userData - v_cid_B, - omit //importance - )); - } - [] B_PORT.receive - { - log( "unexpected asp received for ASP_SCCP_N_CONNECT_req, failed"); - setverdict( fail ); - return false; - } - [] TL_timer.timeout - { - setverdict( pass ); - log("Timeout...."); - return false; - } - } - - // receives ASP_SCCP_N_CONNECT_cfm - alt { - [] A_PORT.receive( tr_ASP_N_CONNECT_cfm ) -> value vl_N_CONNECT_cfm - { - setverdict( pass ); - log("f_connect finished successfully"); - return true; - } - [] TL_timer.timeout - { - setverdict( pass ); - log("Timeout...."); - return false; - } - }// alt - log("f_connect finished"); - return false; -}//f_connect - -/**************************************************** -function f_send -Sends an ASP_SCCP_N_DATA_req on A_PORT and waits for answer in -B_PORT -****************************************************/ -function f_send(in octetstring pl_userdata) runs on MTC_CT -{ - var ASP_SCCP_N_DATA_ind vl_N_DATA_ind; - timer TL_timer:= 120.0; - TL_timer.start; - A_PORT.send( t_ASP_N_DATA_req ( pl_userdata, v_cid_A, omit) ) ; - alt { - [] B_PORT.receive( tr_ASP_N_DATA_ind ) -> value vl_N_DATA_ind - { - if( vl_N_DATA_ind.userData == pl_userdata ) - { - log( "userData received correctly" ); - setverdict( pass ); - } - else - { - log("user data mismatch error in f_send()") - setverdict(fail); - } - - }//B_PORT.receive( tr_ASP_N_DATA_ind ) - - [] B_PORT.receive - { - log( "unexpected asp received for ASP_SCCP_N_DATA_req, failed"); - setverdict( fail ); - } - [] TL_timer.timeout - { - setverdict( pass ); - log("Timeout...."); - } - - } //alt -}//f_send - -//f_disconnect with timeout - -function f_disconnect( ) runs on MTC_CT -{ - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - timer TL_timer:= 5.0; - TL_timer.start; - A_PORT.send(t_ASP_N_DISCONNECT_req( omit, // respondingAddress - 0, //reason : end user originated, see 3.11/Q.713 - omit, //userData - v_cid_A, - omit )) - alt { - [] B_PORT.receive(tr_ASP_N_DISCONNECT_ind) -> value vl_N_DISCONNECT_ind - { - setverdict( pass ); - } - [] B_PORT.receive - { - log("unexpected asp received on B_PORT instead of ASP_SCCP_N_DISCONNECT_ind"); - //repeat; - setverdict(fail); - } - [] TL_timer.timeout - { - setverdict( fail ); - log("Timeout...."); - }; - }//alt - - //give time for inner release complete (rlc): - alt { - [] TL_timer.timeout - { - setverdict( pass ); - log("Stopped with expected timeout"); - }; - } -}//f_disconnect - -//=================================================== -// Testcases -//=================================================== - -/**************************************************** -tc_ConnlessSendingShortASP -Sends a 300 octet long userdata in one ASP_SCCP_N_UNITDATA_req -and receives it in one ASP_SCCP_N_UNITDATA_req. -SCCP transfers information -in udp or (forced) xudp packets. -****************************************************/ -testcase tc_ConnlessSendingShortASP() runs on MTC_CT -{ - var octetstring vl_userdata; - init(); - setAddresses_gti0001(); - vl_userdata :='12345678901234567890'O; - f_SendAndReceive1N_UNITDATA( vl_userdata ); - terminate(); - } //tc_ConnlessSendingShortASP - -/**************************************************** - tc_ConnlessSendingLongASP - Sends a 300 octet long userdata in one ASP_SCCP_N_UNITDATA_req - and receives it in one ASP_SCCP_N_UNITDATA_req. - It is used for segmentation and reassembly. - SCCP transfers information -in xudp packets -****************************************************/ -testcase tc_ConnlessSendingLongASP() runs on MTC_CT -{ - var octetstring vl_userdata; - var integer vl_i; - init(); - setAddresses_gti0001(); - vl_userdata := ''O; - for(vl_i:=0;vl_i<30;vl_i:=vl_i+1) { - vl_userdata := vl_userdata &'12345678901234567890'O; - } - f_SendAndReceive1N_UNITDATA( vl_userdata ); - terminate(); -}//tc_ConnlessSendingLongASP - -/**************************************************** -tc_ConnOrientedShortASPSending -****************************************************/ -testcase tc_ConnOrientedShortASPSending() runs on MTC_CT -{ - var octetstring vl_userdata; - init(); - setAddresses_gti0001(); - vl_userdata := '12345678901234567890'O; - if(f_connect( )) - { - f_send(vl_userdata); - f_disconnect(); - } - terminate(); -} -/**************************************************** -tc_ConnOrientedLongASPSending -****************************************************/ -testcase tc_ConnOrientedLongASPSending() runs on MTC_CT -{ - var octetstring vl_userdata; - var integer vl_i; - init(); - setAddresses_gti0001(); - vl_userdata := ''O; - for(vl_i:=0;vl_i<30;vl_i:=vl_i+1) { - vl_userdata := vl_userdata &'12345678901234567890'O; - } - if(f_connect( )) - { - f_send(vl_userdata); - //f_SendAndReceive1N_UNITDATA( vl_userdata ); - f_disconnect(); - } - terminate(); -} -/**************************************************** - CONTROL -****************************************************/ -control -{ - execute( tc_ConnlessSendingShortASP() ); - execute( tc_ConnlessSendingLongASP() ); - execute( tc_ConnOrientedShortASPSending()); - execute( tc_ConnOrientedLongASPSending()); -} - -}//module diff --git a/SCCP_CNL113341/demo/SCCPasp_Types.ttcn b/SCCP_CNL113341/demo/SCCPasp_Types.ttcn deleted file mode 120000 index f7668d7f4..000000000 --- a/SCCP_CNL113341/demo/SCCPasp_Types.ttcn +++ /dev/null @@ -1 +0,0 @@ -../src/SCCPasp_Types.ttcn \ No newline at end of file diff --git a/SCCP_CNL113341/src/SCCP_Emulation.ttcn b/SCCP_CNL113341/src/SCCP_Emulation.ttcn deleted file mode 100644 index dbfa08c56..000000000 --- a/SCCP_CNL113341/src/SCCP_Emulation.ttcn +++ /dev/null @@ -1,6043 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// // -// Copyright Test Competence Center (TCC) ETH 2008 // -// // -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied // -// // -/////////////////////////////////////////////////////////////////////////////// -// File: SCCP_Emulation.ttcn -// Description: SS7 SCCP definitions and dynamic part according to -// specification ITU-T SS7 SCCP, ANSI ..., ttc ... -// References: ITU-T: Recommendation Q.711-Q.714, -// ANSI : T1.111-2001 (MTP) and T1.112-2001 (SCCP) -// TTC : JT-Q711 -// Rev: R6A05 -// Prodnr: CNL 113 341 -// Updated: 2009-01-26 -// Contact: http://ttcn.ericsson.se - -module SCCP_Emulation -{//startmodule - -modulepar -{ - float tsp_maxLocalReference := 16777216.0; //loc ref= 0...tsp_maxLocalReference-1 - float tsp_max_ConnectionId := 16777216.0; //max connection id = 0..tsp_max_ConnectionId -1 - integer tsp_force_xudt := 0; - integer tsp_SIF_MaxLength := 272 -} - -import from General_Types all; -import from MTP3asp_Types all; -import from MTP3asp_PortType all; -import from SCCP_Types all; -import from SCCPasp_Types all; -import from SCCP_Mapping all; - -group SCCPConstants -{//startgroup SCCPConstants - -//------------------------------------------------------------------------------ -// Subsystem Numbers -//------------------------------------------------------------------------------ - -const integer cg_SSN_notKnown:=0; -const integer cg_SSN_sCCPmanagement:=1; -const integer cg_SSN_reservedForITU:=2; -const integer cg_SSN_iSUP:=3; -const integer cg_SSN_oMAP:=4; -const integer cg_SSN_mAP:=5; -const integer cg_SSN_hLR:=6; -const integer cg_SSN_vLR:=7; -const integer cg_SSN_mSC:=8; -const integer cg_SSN_eIC:=9; -const integer cg_SSN_aUC:=10; -const integer cg_SSN_isdnSS:=11; -const integer cg_SSN_reservedForIntUse:=12; -const integer cg_SSN_bISDNe2e:=13; -const integer cg_SSN_tCtestResponder:=14; -const integer cg_SSN_rANAP:=142; -const integer cg_SSN_bSSAP:=254; -// TCAP has not SSN - -//------------------------------------------------------------------------------ -// Routing Indicator values ITU: 3.4.1/Q713. -//------------------------------------------------------------------------------ -const BIT1n cg_route_on_SSN := '1'B; -const BIT1n cg_route_on_GT := '0'B; - -//------------------------------------------------------------------------------ -// Release Cause -//------------------------------------------------------------------------------ - - -const integer cg_Rel_endUserOrig:=0; -const integer cg_Rel_endUserCong:=1; -const integer cg_Rel_endUserFailure:=2; -const integer cg_Rel_sCCPUserOrig:=3; -const integer cg_Rel_remProcError:=4; -const integer cg_Rel_inconsConnData:=5; -const integer cg_Rel_accessFailure:=6; -const integer cg_Rel_accessCongestion:=7; -const integer cg_Rel_subsystFailure:=8; -const integer cg_Rel_subsystCongest:=9; -const integer cg_Rel_mTPFailure:=10; -const integer cg_Rel_networkCongest:=11; -const integer cg_Rel_expResetTimer:=12; -const integer cg_Rel_expRecInacTimer:=13; -const integer cg_Rel_reserved:=14; -const integer cg_Rel_unqualified:=15; -const integer cg_Rel_sCCPFailure:=16; - -//------------------------------------------------------------------------------ -// Return Cause -//------------------------------------------------------------------------------ - -const integer cg_Ret_noTransl4AddrNature:=0; -const integer cg_Ret_noTransl4SpecifAddr:=1; -const integer cg_Ret_subsystemCongestion:=2; -const integer cg_Ret_subsystemFailure:=3; -const integer cg_Ret_unequippedUser:=4; -const integer cg_Ret_mTPFailure:=5; -const integer cg_Ret_networkCongestion:=6; -const integer cg_Ret_unqualified:=7; -const integer cg_Ret_errorMessageTransport:=8; -const integer cg_Ret_errorLocalProcessing:=9; -const integer cg_Ret_destNoReassembly:=10; -const integer cg_Ret_sCCPFailure:=11; -const integer cg_Ret_hopCounterViolation:=12; -const integer cg_Ret_segmeNotSupported:=13; -const integer cg_Ret_segmentationFailure:=14; - -//------------------------------------------------------------------------------ -// Reset Cause -//------------------------------------------------------------------------------ - - -const integer cg_Res_endUserOrig:=0; -const integer cg_Res_sCCPUserOrig:=1; -const integer cg_Res_messOutOfOrder_incPs:=2; -const integer cg_Res_messOutOfOrder_incPr:=3; -const integer cg_Res_remProcErr_messOutOfWindow:=4; -const integer cg_Res_remProcErr_IncPsAfterReinit:=5; -const integer cg_Res_remProcErr_general:=6; -const integer cg_Res_remEndUserOperational:=7; -const integer cg_Res_networkOperational:=8; -const integer cg_Res_accessOperational:=9; -const integer cg_Res_networkCongestion:=10; -const integer cg_Res_reserved:=11; -const integer cg_Res_unqualified:=12; - -//------------------------------------------------------------------------------ -//Error Cause -//------------------------------------------------------------------------------ - -const integer cg_Err_unassignedDestinationLRN:=0 ; -const integer cg_Err_inconsistentSourceLRN:=1 ; -const integer cg_Err_pointCodeMismatch:=2 ; -const integer cg_Err_serviceClassMismatch:=3 ; -const integer cg_Err_unqualified:=4 ; - -//------------------------------------------------------------------------------ -//Refusal Cause -//------------------------------------------------------------------------------ - -const integer cg_Ref_endUserOrigin:=0; -const integer cg_Ref_endUserConges:=1; -const integer cg_Ref_endUserFailure:=2; -const integer cg_Ref_sCCPUserOrigin:=3; -const integer cg_Ref_destAddrUnkn:=4; -const integer cg_Ref_destInaccess:=5; -const integer cg_Ref_qOSNotAvail_nonTransient:=6; -const integer cg_Ref_qOSNotAvail_transient:=7; -const integer cg_Ref_accessFailure:=8; -const integer cg_Ref_accessCongestion:=9; -const integer cg_Ref_subsystemFailure:=10; -const integer cg_Ref_subsystemCongest:=11; -const integer cg_Ref_expConnEstTimer:=12; -const integer cg_Ref_incomUserData:=13; -const integer cg_Ref_reserved:=14; -const integer cg_Ref_unqualified:=15; -const integer cg_Ref_hopCounterViol:=16; -const integer cg_Ref_sCCPFailure:=17; -const integer cg_Ref_noTransl4address:=18; -const integer cg_Ref_unequippedUser:=19; - -//------------------------------------------------------------------------------ -// Originator -//------------------------------------------------------------------------------ - -const integer cg_Undefined:=0; -const integer cg_NSU:=1; -const integer cg_NSP:=2; - - -//------------------------------------------------------------------------------ -// CREF Reason -//------------------------------------------------------------------------------ - -const integer cg_CREF_endUserOrig:=0; -const integer cg_CREF_endUserCong:=1; -const integer cg_CREF_endUserFailure:=2; -const integer cg_CREF_SCCPUserOrig:=3; -const integer cg_CREF_destAddrUnknwn_NT:=4; -const integer cg_CREF_destInaccg_T:=5; -const integer cg_CREF_QOSUnavail_NT:=6; -const integer cg_CREF_QOSUnavail_T:=7; -const integer cg_CREF_accessFailure:=8; -const integer cg_CREF_accessCong:=9; -const integer cg_CREF_destInaccg_NT:=10; -const integer cg_CREF_subsystCong:=11; -const integer cg_CREF_unspec_T:=12; -const integer cg_CREF_incompInfo:=13; -const integer cg_CREF_unspec_NT:=15; -const integer cg_CREF_undef:=16; -const integer cg_CREF_hopCntrViolation:=18; - -//------------------------------------------------------------------------------ -// DISC Reason -//------------------------------------------------------------------------------ - -const integer cg_DISC_normal:=20; -const integer cg_DISC_endUserCong:=21; -const integer cg_DISC_endUserFailure:=22; -const integer cg_DISC_SCCPUserOrig:=23; -const integer cg_DISC_abnormal_T:=24; -const integer cg_DISC_accessFailure:=28; -const integer cg_DISC_accessCong:=29; -const integer cg_DISC_abnormal_NT:=30; -const integer cg_DISC_subsystCong:=31; -const integer cg_DISC_undef:=32; -const integer cg_DISC_incompInfo:=33; -const integer cg_DISC_abnormal:=35; - -//------------------------------------------------------------------------------ -// RESET Reason -//------------------------------------------------------------------------------ -const integer cg_RESET_userSynch:= 40 ; -const integer cg_RESET_unspec:= 41 ; -const integer cg_RESET_netCong:= 42 ; -const integer cg_RESET_undef:= 43 ; - -//------------------------------------------------------------------------------ -//Mapping Refusal Cause to Reason and Originator A.1/Q.713 -//------------------------------------------------------------------------------ - -const integer cg_Mapping_RefCause_Orig[20]:= -{ - cg_NSU, - cg_NSU, - cg_NSU, - cg_NSU, - cg_NSP, - cg_NSP, - cg_NSP, - cg_NSP, - cg_NSU, - cg_NSU, - cg_NSP, - cg_NSU, - cg_NSP, - cg_NSU, - cg_NSP, - cg_Undefined, - cg_NSP, - cg_Undefined, - cg_NSP, - cg_NSP -}; - - -const integer cg_Mapping_RefCause_Reason[20]:= -{ - cg_CREF_endUserOrig, - cg_CREF_endUserCong, - cg_CREF_endUserFailure, - cg_CREF_SCCPUserOrig, - cg_CREF_destAddrUnknwn_NT, - cg_CREF_destInaccg_T, - cg_CREF_QOSUnavail_NT, - cg_CREF_QOSUnavail_T, - cg_CREF_accessFailure, - cg_CREF_accessCong, - cg_CREF_destInaccg_NT, - cg_CREF_subsystCong, - cg_CREF_unspec_T, - cg_CREF_incompInfo, - cg_CREF_unspec_T, - cg_CREF_undef, - cg_CREF_hopCntrViolation, - cg_CREF_undef, - cg_CREF_destAddrUnknwn_NT, - cg_CREF_destInaccg_NT -}; - -//------------------------------------------------------------------------------ -//Mapping Release Cause to Reason and Originator A.2/Q.713 -//------------------------------------------------------------------------------ - -const integer cg_Mapping_RelCause_Orig[17]:= -{ - cg_NSU, - cg_NSU, - cg_NSU, - cg_NSU, - cg_NSP, - cg_NSP, - cg_NSU, - cg_NSU, - cg_NSP, - cg_NSU, - cg_NSP, - cg_NSP, - cg_NSP, - cg_NSP, - cg_Undefined, - cg_Undefined, - cg_NSP -}; - -//mapping CREF-> ASP_SCCP_N_DISCONNECT_ind: -//Reason:=cg_Mapping_RefCause_Reason[RefCause]; -//Originator:=cg_Mapping_RefCause_Orig[RefCause]; - - -//mapping ASP_SCCP_N_DISCONNECT_req-> CREF: -// - -const integer cg_Mapping_RelCause_Reason[17]:= { - cg_DISC_normal, - cg_DISC_endUserCong, - cg_DISC_endUserFailure, - cg_DISC_SCCPUserOrig, - cg_DISC_abnormal_T, - cg_DISC_abnormal_T, - cg_DISC_accessFailure, - cg_DISC_accessCong, - cg_DISC_abnormal_NT, - cg_DISC_subsystCong, - cg_DISC_abnormal_NT, - cg_DISC_abnormal_T, - cg_DISC_abnormal_T, - cg_DISC_abnormal_T, - cg_DISC_undef, - cg_DISC_undef, - cg_DISC_abnormal_NT -}; - - - -//mapping RLSD-> ASP_SCCP_N_DISCONNECT_ind: -//Reason:=cg_Mapping_RelCause_Reason[RelCause]; -//Originator:=cg_Mapping_RelCause_Orig[RelCause]; - -//mapping ASP_SCCP_N_DISCONNECT_req-> RLSD: -// - - -//------------------------------------------------------------------------------ -//Mapping Reset Cause to Reason and Originator A.2/Q.713 -//------------------------------------------------------------------------------ - - -const integer cg_Mapping_ResCause_Orig[12]:= { - cg_NSU, - cg_NSU, - cg_NSP, - cg_NSP, - cg_NSP, - cg_NSP, - cg_NSP, - cg_NSU, - cg_NSP, - cg_NSU, - cg_NSP, - cg_Undefined -}; - - -const integer cg_Mapping_ResCause_Reason[12]:= { - cg_RESET_userSynch, - cg_RESET_userSynch, - cg_RESET_unspec, - cg_RESET_unspec, - cg_RESET_unspec, - cg_RESET_unspec, - cg_RESET_unspec, - cg_RESET_userSynch, - cg_RESET_unspec, - cg_RESET_userSynch, - cg_RESET_netCong, - cg_RESET_undef -}; - -//mapping RSR-> ASP_SCCP_N_DISCONNECT_ind: -//Reason:=cg_Mapping_ResCause_Reason[ResCause]; -//Originator:=cg_Mapping_ResCause_Orig[ResCause]; - -//mapping ASP_SCCP_N_DISCONNECT_req-> RSR: -// - -const integer cg_TimerArraySize := 16; - -}//endgroup SCCPConstants - -//****************************************************************************** -// PDU templates -//****************************************************************************** - - -group PDUTemplateDefinitionsSending -{ - - - -//****************************************************************************** -// Message Connection Request (CR) (Q713 $4.2) -//****************************************************************************** - -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_ConnectionRequest t_PDU_SCCP_ConnectionRequest -( - SCCP_param_SourceLocalReference pl_SLR, - SCCP_param_ProtocolClass pl_Proto_Class, - SCCP_param_CPartyAddressEnc pl_CalledAddress, -template SCCP_param_Credit_opt pl_credit, -template SCCP_param_CPartyAddressEnc_opt pl_CallingAddress , -template SCCP_param_Data_opt pl_Data, -template SCCP_param_HopCounter_opt pl_HopCntr, -template SCCP_param_Importance_opt pl_Imp, -template SCCP_param_EndOfOptionalParams pl_eop - -):= - { - messageType:=cr, - sourceLocRef:=pl_SLR, - protClass:=pl_Proto_Class, - pointer1:=2, - pointer2:=0, - calledPAddress:=pl_CalledAddress, - optionalPart:= { - credit:=pl_credit, - callingPAddress:=pl_CallingAddress, - data:=pl_Data, - hopCounter:=pl_HopCntr, - importance:=pl_Imp - }, - eop:=pl_eop - } - - - -//****************************************************************************** -// Message Connection Confirm (CC) (Q713 $4.3) -//****************************************************************************** - -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_ConnectionConfirm t_PDU_SCCP_ConnectionConfirm -( - SCCP_param_DestLocalReference pl_DLR, - SCCP_param_SourceLocalReference pl_SLR, - SCCP_param_ProtocolClass pl_Proto_Class, -template SCCP_param_Credit_opt pl_credit, -template SCCP_param_CPartyAddressEnc_opt pl_CalledAddress, -template SCCP_param_Data_opt pl_Data, -template SCCP_param_Importance_opt pl_Imp, -template SCCP_param_EndOfOptionalParams pl_eop -):= - { - messageType:=cc, - destLocRef:=pl_DLR, - sourceLocRef:=pl_SLR, - protClass:=pl_Proto_Class, - pointer1:=1, - optionalPart:= { - credit:=pl_credit, - calledPAddress:=pl_CalledAddress, - data:=pl_Data, - importance:=pl_Imp - }, - eop:=pl_eop - } - - -//****************************************************************************** -// Message Connection Refused (CREF) (Q713 $4.4) -//****************************************************************************** - -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_ConnectionRefused t_PDU_SCCP_ConnectionRefused -( - SCCP_param_DestLocalReference pl_DLR, - SCCP_param_RefusalCause pl_RefCause, -template SCCP_param_CPartyAddressEnc_opt pl_CalledAddress, -template SCCP_param_Data_opt pl_Data, -template SCCP_param_Importance_opt pl_Imp, -template SCCP_param_EndOfOptionalParams pl_eop -):= - { - messageType:=cref, - destLocRef:=pl_DLR, - refusalCause:=pl_RefCause, - pointer1:=1, - optionalPart:= { - calledPAddress:=pl_CalledAddress, - data:=pl_Data, - importance:=pl_Imp - }, - eop:=pl_eop - } - - -//****************************************************************************** -// Message Released (RLSD) (Q713 $4.5) -//****************************************************************************** - - -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_Released t_PDU_SCCP_Released -( - OCT3 pl_DLR, - OCT3 pl_SLR, - SCCP_param_ReleaseCause pl_RelCause, -template SCCP_param_Data_opt pl_Data, -template SCCP_param_Importance_opt pl_Imp, -template SCCP_param_EndOfOptionalParams pl_eop -):= - { - messageType:=rlsd, - destLocRef:=pl_DLR, - sourceLocRef:=pl_SLR, - releaseCause:=pl_RelCause, - pointer1:=1, - optionalPart:= { - data:=pl_Data, - importance:=pl_Imp - }, - eop:=pl_eop - } - -//****************************************************************************** -// Message Release Complete (RLC) (Q713 $4.6) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_ReleaseComplete t_PDU_SCCP_ReleaseComplete -( - OCT3 pl_DLR, - OCT3 pl_SLR -):= - { - messageType:=rlc, - destLocRef:=pl_DLR, - sourceLocRef:=pl_SLR - } - - - -//****************************************************************************** -// Message Data form 1 (DT1) (Q713 $4.7) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_DataForm1 t_PDU_SCCP_DataForm1 -( - OCT3 pl_DLR, - SCCP_param_SegmentingReassembl pl_SegmReasm, - SCCP_param_Data pl_Data -):= - { - messageType:=dt1, - destLocRef:=pl_DLR, - segmentingReassembl:=pl_SegmReasm, - pointer1:=1, - data:=pl_Data - } - - - -//****************************************************************************** -// Message Data form 2 (DT2) (Q713 $4.8) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - -//****************************************************************************** -// Message Data Acknowledgement (AK) (Q713 $4.9) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - - -//****************************************************************************** -// Message Unitdata (UDT) (Q713 $4.10) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_Unitdata t_PDU_SCCP_Unitdata -( - SCCP_param_ProtocolClass pl_Proto_Class, - SCCP_param_CPartyAddressEnc pl_CalledAddress, - SCCP_param_CPartyAddressEnc pl_CallingAddress, - SCCP_param_Data pl_Data -):= - { - messageType :=udt, - protClass :=pl_Proto_Class, - pointer1:=3, - pointer2:=0, - pointer3:=0, - calledPAddress := pl_CalledAddress, - callingPAddress := pl_CallingAddress, - data:=pl_Data - } - - - -//****************************************************************************** -// Message Unitdata service (UDTS) (Q713 $4.11) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_UnitdataService t_PDU_SCCP_UnitdataService -( - SCCP_param_ReturnCause pl_RetCause, - SCCP_param_CPartyAddressEnc pl_CalledAddress, - SCCP_param_CPartyAddressEnc pl_CallingAddress, - SCCP_param_Data pl_Data -):= - { - messageType:=udts, - returnCause:=pl_RetCause, - pointer1:=3, - pointer2:=0, - pointer3:=0, - calledPAddress:=pl_CalledAddress, - callingPAddress:=pl_CallingAddress, - data:=pl_Data - } - -//****************************************************************************** -// Message Expedited Data (ED) (Q713 $4.12) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - - -//****************************************************************************** -// Message Expedited Data Acknowledgement (EA) (Q713 $4.13) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - -//****************************************************************************** -// Message Reset Request (RSR) (Q713 $4.14) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_ResetRequest t_PDU_SCCP_ResetRequest -( - SCCP_param_DestLocalReference pl_DLR, - SCCP_param_SourceLocalReference pl_SLR, - SCCP_param_ResetCause pl_ResCause -):= - { - messageType:=rsr, - destLocRef:=pl_DLR, - sourceLocRef:=pl_SLR, - resetCause:=pl_ResCause - } - - -//****************************************************************************** -// Message Reset Confirmation (RSC) (Q713 $4.15) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ - template PDU_SCCP_ResetConfirm t_PDU_SCCP_ResetConfirm - ( - SCCP_param_DestLocalReference pl_DLR, - SCCP_param_SourceLocalReference pl_SLR - ):= - { - messageType:=rsr, - destLocRef:=pl_DLR, - sourceLocRef:=pl_SLR - } - -//****************************************************************************** -// Message Protocol data unit error (ERR) (Q713 $4.16) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_ProtDataUnitError t_PDU_SCCP_ProtDataUnitError -( - SCCP_param_DestLocalReference pl_DLR, - SCCP_param_ErrorCause pl_ErrCause -):= - { - messageType:=rsr, - destLocRef:=pl_DLR, - errorCause:=pl_ErrCause - } - - -//****************************************************************************** -// Message Inactivity test (IT) (Q713 $4.17) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_InactivityTest t_PDU_SCCP_InactivityTest -( - SCCP_param_DestLocalReference pl_DLR, - SCCP_param_SourceLocalReference pl_SLR, - SCCP_param_ProtocolClass pl_Proto_Class, - SCCP_param_SequencingSegmenting pl_SeqSegm, - SCCP_param_Credit pl_credit -):= - { - messageType:=it, - destLocRef:=pl_DLR, - sourceLocRef:=pl_SLR, - protClass:=pl_Proto_Class, - sequencingSegmenting:=pl_SeqSegm, - credit:=pl_credit - } - - -//****************************************************************************** -// Message Extended Unitdata (XUDT) (Q713 $4.18) -//****************************************************************************** -//------------------------------------------------------------------------------ - -template PDU_SCCP_ExtUnitdata t_PDU_SCCP_ExtUnitdata -( - SCCP_param_ProtocolClass pl_Proto_Class, - SCCP_param_HopCounter pl_hopCounter, - SCCP_param_CPartyAddressEnc pl_calledPAddress, - SCCP_param_CPartyAddressEnc pl_callingPAddress, - SCCP_param_Data pl_data, -template SCCP_param_Segmentation_opt pl_segm, -template SCCP_param_Importance_opt pl_imp -):= - { - messageType:= xudt, - protClass:=pl_Proto_Class, - hopCounter:=pl_hopCounter, - pointer1:=0, - pointer2:=0, - pointer3:=0, - pointer4:=0, - calledPAddress:=pl_calledPAddress, - callingPAddress:=pl_callingPAddress, - data := pl_data, - optionalPart:= { - segmentation:=pl_segm, - importance := pl_imp - }, - eop:= { paramName:=con_SCCP_eop } - } - - -//****************************************************************************** -// Message Extended Unitdata Service(XUDTS) (Q713 $4.19) -//****************************************************************************** -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - - - -//****************************************************************************** -// Message Long Unitdata (LUDT) (Q713 $4.20) -//****************************************************************************** -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - - -//****************************************************************************** -// Message Long Unitdata Service (LUDTS) (Q713 $4.21) -//****************************************************************************** - -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - - -//****************************************************************************** -// SCCP management messages (Q713 $5.3) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - - - -}//endgroup PDUTemplateDefinitionsSending - -//****************************************************************************** - -group PDUTemplateDefinitionsReceiving -{ - - - -//****************************************************************************** -// Message Connection Request (CR) (Q713 $4.2) -//****************************************************************************** - -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ - template PDU_SCCP_ConnectionRequest tr_PDU_SCCP_ConnectionRequest:= - { - messageType:=cr, - sourceLocRef:=?, - protClass:=?, - pointer1:=?, - pointer2:=?, - calledPAddress:=?, - optionalPart:= { - credit:=*, - callingPAddress:=*, - data:=*, - hopCounter:=*, - importance:=* - }, - eop:=* - } - - - -//****************************************************************************** -// Message Connection Confirm (CC) (Q713 $4.3) -//****************************************************************************** - - - -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_ConnectionConfirm tr_PDU_SCCP_ConnectionConfirm:= -{ - messageType:=cc, - destLocRef:=?, - sourceLocRef:=?, - protClass:=?, - pointer1:=?, - optionalPart:= { - credit:=*, - calledPAddress:=*, - data:=*, - importance:=* - }, - eop:=* -} - - -//****************************************************************************** -// Message Connection Refused (CREF) (Q713 $4.4) -//****************************************************************************** - -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_ConnectionRefused tr_PDU_SCCP_ConnectionRefused:= -{ - messageType:=cref, - destLocRef:=?, - refusalCause:=?, - pointer1:=?, - optionalPart:= { - calledPAddress:=*, - data:=*, - importance:=* - }, - eop:=* -} - - -//****************************************************************************** -// Message Released (RLSD) (Q713 $4.5) -//****************************************************************************** - -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_Released tr_PDU_SCCP_Released:= -{ - messageType:=rlsd, - destLocRef:=?, - sourceLocRef:=?, - releaseCause:=?, - pointer1:=?, - optionalPart:= { - data:=*, - importance:=* - }, - eop:=* -} - - - -//****************************************************************************** -// Message Release Complete (RLC) (Q713 $4.6) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ - -template PDU_SCCP_ReleaseComplete tr_PDU_SCCP_ReleaseComplete:= -{ - messageType:=rlc, - destLocRef:=?, - sourceLocRef:=? -} - - - -//****************************************************************************** -// Message Data form 1 (DT1) (Q713 $4.7) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ -template PDU_SCCP_DataForm1 tr_PDU_SCCP_DataForm1:= -{ - messageType:=dt1, - destLocRef:=?, - segmentingReassembl:=?, - pointer1:=?, - data:=? -} - -//****************************************************************************** -// Message Data form 2 (DT2) (Q713 $4.8) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - -//****************************************************************************** -// Message Data Acknowledgement (AK) (Q713 $4.9) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - - -//****************************************************************************** -// Message Unitdata (UDT) (Q713 $4.10) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ - -template PDU_SCCP_Unitdata tr_PDU_SCCP_Unitdata:= -{ - messageType:=udt, - protClass:=?, - pointer1:=?, - pointer2:=?, - pointer3:=?, - calledPAddress:=?, - callingPAddress:=?, - data:=? -} - -//****************************************************************************** -// Message Unitdata service (UDTS) (Q713 $4.11) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Message definition -//------------------------------------------------------------------------------ - -template PDU_SCCP_UnitdataService tr_PDU_SCCP_UnitdataService:= -{ - messageType:=udts, - returnCause:=?, - pointer1:=?, - pointer2:=?, - pointer3:=?, - calledPAddress:=?, - callingPAddress:=?, - data:=? -} - -//****************************************************************************** -// Message Expedited Data (ED) (Q713 $4.12) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - - -//****************************************************************************** -// Message Expedited Data Acknowledgement (EA) (Q713 $4.13) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - -//****************************************************************************** -// Message Reset Request (RSR) (Q713 $4.14) -//****************************************************************************** - -template PDU_SCCP_ResetRequest tr_PDU_SCCP_ResetRequest:= -{ - messageType:=rsr, - destLocRef:=?, - sourceLocRef:=?, - resetCause:=? -} - -//****************************************************************************** -// Message Reset Confirmation (RSC) (Q713 $4.15) -//****************************************************************************** - -template PDU_SCCP_ResetConfirm tr_PDU_SCCP_ResetConfirm:= -{ - messageType:=rsr, - destLocRef:=?, - sourceLocRef:=? -} - -//****************************************************************************** -// Message Protocol data unit error (ERR) (Q713 $4.16) -//****************************************************************************** - -template PDU_SCCP_ProtDataUnitError tr_PDU_SCCP_ProtDataUnitError:= -{ - messageType:=rsr, - destLocRef:=?, - errorCause:=? -} - -//****************************************************************************** -// Message Inactivity test (IT) (Q713 $4.17) -//****************************************************************************** - -template PDU_SCCP_InactivityTest tr_PDU_SCCP_InactivityTest:= -{ - messageType:=it, - destLocRef:=?, - sourceLocRef:=?, - protClass:=?, - sequencingSegmenting:=?, - credit:=? -} - -//****************************************************************************** -// Message Extended Unitdata (XUDT) (Q713 $4.18) -//****************************************************************************** - - -template PDU_SCCP_ExtUnitdata tr_PDU_SCCP_ExtUnitdata := -{ - messageType:=xudt, - protClass:= ?, //connection oriented but no flow control - hopCounter:=?, - pointer1:=?, - pointer2:=?, - pointer3:=?, - pointer4:=?, - calledPAddress:=?, - callingPAddress:=?, - data := ?, - optionalPart:= { - segmentation:=*, - importance := * - }, - eop:= * -} - -//------------------------------------------------------------------------------ - -//****************************************************************************** -// Message Extended Unitdata Service(XUDTS) (Q713 $4.19) -//****************************************************************************** -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - -//****************************************************************************** -// Message Long Unitdata (LUDT) (Q713 $4.20) -//****************************************************************************** -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - - -//****************************************************************************** -// Message Long Unitdata Service (LUDTS) (Q713 $4.21) -//****************************************************************************** - -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - - -//****************************************************************************** -// SCCP management messages (Q713 $5.3) -//****************************************************************************** -//------------------------------------------------------------------------------ -// Not supported -//------------------------------------------------------------------------------ - - - -}//endgroup PDUTemplateDefinitionsReceiving - -type record of boolean Timer_Snapshot; -type enumerated TimerIdentifierType {conn_est, ias, iar, rel, repeat_rel, int, reset,internal_reset, t_guard}; - - -type component SCCP_CT -{ //startcomponent SCCP_CT - - //Component variables - //*************************************************************** - // Connection Oriented Signalling: - // StateTransition-> ConnectionData; - var ConnectionData ConnectionTable[16]; //16 connections 0 to 15 - var integer v_session; // actual conn. oriented session index - - // Connectioenless Signalling: - //== sending == - var OCT3 segmLocRefTable[16]; - var integer v_segmLocRefIndex; // last index in segmLocRefTable, cyclical incremented - //==receiving== - var ClessRcvBuff ClessRcvBuffTable[16]; - - var integer v_reference; // not used ??? - - var hexstring v_own_GT; - var hexstring v_remote_GT; - var integer v_SSN; - var OCT1 v_SIO; - var integer v_NI; //network indicator, if NI<2 => international - var integer v_own_SPC; - var integer v_remote_SPC; - var integer v_SLS; - - var SCCP_ServiceType v_SCCPServiceType; //enum: itu, ansi, ttc or mpt - //var v_maxLocalReference; // Local Reference max. value, see in SCCP.ttcn - var integer v_PC_length; //length of point code, calculated at start! NOT USED - var integer v_RoutingLabelLen; //in bytes - var integer v_sccp_data_maxlen; // dt1 payload length upper limit - var integer v_sccp_pdu_maxlen; // SIF len -routing label len - - var Timer_Snapshot v_T_conn_est; - var Timer_Snapshot v_T_ias; - var Timer_Snapshot v_T_iar; - var Timer_Snapshot v_T_rel; - var Timer_Snapshot v_T_repeat_rel; - var Timer_Snapshot v_T_int; - var Timer_Snapshot v_T_reset; - var Timer_Snapshot v_T_internal_reset; - var Timer_Snapshot v_T_guard; - //var Timer_Snapshot v_T_T_guard; - //*************************************************************** - - port SCCPasp_SP_PT SCCP_SP_PORT;//port type defined in SCCP_ASPs - port MTP3asp_SCCP_PT MTP3_SCCP_PORT; - - //component timers - - timer T_conn_est[cg_TimerArraySize]:= { tspc_timer_T_conn_est,tspc_timer_T_conn_est, - tspc_timer_T_conn_est,tspc_timer_T_conn_est, - tspc_timer_T_conn_est,tspc_timer_T_conn_est, - tspc_timer_T_conn_est,tspc_timer_T_conn_est, - tspc_timer_T_conn_est,tspc_timer_T_conn_est, - tspc_timer_T_conn_est,tspc_timer_T_conn_est, - tspc_timer_T_conn_est,tspc_timer_T_conn_est, - tspc_timer_T_conn_est,tspc_timer_T_conn_est }; - - timer T_ias[cg_TimerArraySize]:= { tspc_timer_T_ias,tspc_timer_T_ias, - tspc_timer_T_ias,tspc_timer_T_ias, - tspc_timer_T_ias,tspc_timer_T_ias, - tspc_timer_T_ias,tspc_timer_T_ias, - tspc_timer_T_ias,tspc_timer_T_ias, - tspc_timer_T_ias,tspc_timer_T_ias, - tspc_timer_T_ias,tspc_timer_T_ias, - tspc_timer_T_ias,tspc_timer_T_ias }; - - timer T_iar[cg_TimerArraySize]:= { tspc_timer_T_iar,tspc_timer_T_iar, - tspc_timer_T_iar,tspc_timer_T_iar, - tspc_timer_T_iar,tspc_timer_T_iar, - tspc_timer_T_iar,tspc_timer_T_iar, - tspc_timer_T_iar,tspc_timer_T_iar, - tspc_timer_T_iar,tspc_timer_T_iar, - tspc_timer_T_iar,tspc_timer_T_iar, - tspc_timer_T_iar,tspc_timer_T_iar }; - - timer T_rel[cg_TimerArraySize]:= { tspc_timer_T_rel,tspc_timer_T_rel, - tspc_timer_T_rel,tspc_timer_T_rel, - tspc_timer_T_rel,tspc_timer_T_rel, - tspc_timer_T_rel,tspc_timer_T_rel, - tspc_timer_T_rel,tspc_timer_T_rel, - tspc_timer_T_rel,tspc_timer_T_rel, - tspc_timer_T_rel,tspc_timer_T_rel, - tspc_timer_T_rel,tspc_timer_T_rel }; - - timer T_repeat_rel[cg_TimerArraySize]:= { tspc_timer_T_repeat_rel,tspc_timer_T_repeat_rel, - tspc_timer_T_repeat_rel,tspc_timer_T_repeat_rel, - tspc_timer_T_repeat_rel,tspc_timer_T_repeat_rel, - tspc_timer_T_repeat_rel,tspc_timer_T_repeat_rel, - tspc_timer_T_repeat_rel,tspc_timer_T_repeat_rel, - tspc_timer_T_repeat_rel,tspc_timer_T_repeat_rel, - tspc_timer_T_repeat_rel,tspc_timer_T_repeat_rel, - tspc_timer_T_repeat_rel,tspc_timer_T_repeat_rel }; - - timer T_int[cg_TimerArraySize]:= { tspc_timer_T_int,tspc_timer_T_int, - tspc_timer_T_int,tspc_timer_T_int, - tspc_timer_T_int,tspc_timer_T_int, - tspc_timer_T_int,tspc_timer_T_int, - tspc_timer_T_int,tspc_timer_T_int, - tspc_timer_T_int,tspc_timer_T_int, - tspc_timer_T_int,tspc_timer_T_int, - tspc_timer_T_int,tspc_timer_T_int }; - - -/* timer T_T_guard[cg_TimerArraySize]:= { tspc_timer_T_guard,tspc_timer_T_guard, - tspc_timer_T_guard,tspc_timer_T_guard, - tspc_timer_T_guard,tspc_timer_T_guard, - tspc_timer_T_guard,tspc_timer_T_guard, - tspc_timer_T_guard,tspc_timer_T_guard, - tspc_timer_T_guard,tspc_timer_T_guard, - tspc_timer_T_guard,tspc_timer_T_guard, - tspc_timer_T_guard,tspc_timer_T_guard }; -*/ - - timer T_reset[cg_TimerArraySize]:= { tspc_timer_T_reset,tspc_timer_T_reset, - tspc_timer_T_reset,tspc_timer_T_reset, - tspc_timer_T_reset,tspc_timer_T_reset, - tspc_timer_T_reset,tspc_timer_T_reset, - tspc_timer_T_reset,tspc_timer_T_reset, - tspc_timer_T_reset,tspc_timer_T_reset, - tspc_timer_T_reset,tspc_timer_T_reset, - tspc_timer_T_reset,tspc_timer_T_reset }; - - - timer T_internal_reset[cg_TimerArraySize]:= { tspc_timer_T_internal_reset,tspc_timer_T_internal_reset, - tspc_timer_T_internal_reset,tspc_timer_T_internal_reset, - tspc_timer_T_internal_reset,tspc_timer_T_internal_reset, - tspc_timer_T_internal_reset,tspc_timer_T_internal_reset, - tspc_timer_T_internal_reset,tspc_timer_T_internal_reset, - tspc_timer_T_internal_reset,tspc_timer_T_internal_reset, - tspc_timer_T_internal_reset,tspc_timer_T_internal_reset, - tspc_timer_T_internal_reset,tspc_timer_T_internal_reset }; - - - timer T_guard[cg_TimerArraySize]:= { tspc_timer_guard,tspc_timer_guard, - tspc_timer_guard,tspc_timer_guard, - tspc_timer_guard,tspc_timer_guard, - tspc_timer_guard,tspc_timer_guard, - tspc_timer_guard,tspc_timer_guard, - tspc_timer_guard,tspc_timer_guard, - tspc_timer_guard,tspc_timer_guard, - tspc_timer_guard,tspc_timer_guard }; - -}//endcomponent SCCP_CT - - -group SCCPFunctions -{//startgroup SCCPFunctions - //****************************************************************** - function f_StartTimer(TimerIdentifierType pl_TimerIdentifier,integer pl_TimerIndex,float pl_duration := -1.0) runs on SCCP_CT - //****************************************************************** - { - select (pl_TimerIdentifier) - { - case(conn_est) - { - if(pl_duration < 0.0){ - T_conn_est[pl_TimerIndex].start; - v_T_conn_est[pl_TimerIndex] := true; - } - else{ - T_conn_est[pl_TimerIndex].start(pl_duration); - v_T_conn_est[pl_TimerIndex] := true; - } - } - case(ias) - { - if(pl_duration < 0.0){ - T_ias[pl_TimerIndex].start; - v_T_ias[pl_TimerIndex] := true; - } - else{ - T_ias[pl_TimerIndex].start(pl_duration); - v_T_ias[pl_TimerIndex] := true; - } - } - case(iar) - { - if(pl_duration < 0.0){ - T_iar[pl_TimerIndex].start; - v_T_iar[pl_TimerIndex] := true; - } - else{ - T_iar[pl_TimerIndex].start(pl_duration); - v_T_iar[pl_TimerIndex] := true; - } - } - case(rel) - { - if(pl_duration < 0.0){ - T_rel[pl_TimerIndex].start; - v_T_rel[pl_TimerIndex] := true; - } - else{ - T_rel[pl_TimerIndex].start(pl_duration); - v_T_rel[pl_TimerIndex] := true; - } - } - case(repeat_rel) - { - if(pl_duration < 0.0){ - T_repeat_rel[pl_TimerIndex].start; - v_T_repeat_rel[pl_TimerIndex] := true; - } - else{ - T_repeat_rel[pl_TimerIndex].start(pl_duration); - v_T_repeat_rel[pl_TimerIndex] := true; - } - } - case(int) - { - if(pl_duration < 0.0){ - T_int[pl_TimerIndex].start; - v_T_int[pl_TimerIndex] := true; - } - else{ - T_int[pl_TimerIndex].start(pl_duration); - v_T_int[pl_TimerIndex] := true; - } - } - case(reset) - { - if(pl_duration < 0.0){ - T_reset[pl_TimerIndex].start; - v_T_reset[pl_TimerIndex] := true; - } - else{ - T_reset[pl_TimerIndex].start(pl_duration); - v_T_reset[pl_TimerIndex] := true; - } - } - case(internal_reset) - { - if(pl_duration < 0.0){ - T_internal_reset[pl_TimerIndex].start; - v_T_internal_reset[pl_TimerIndex] := true; - } - else{ - T_internal_reset[pl_TimerIndex].start(pl_duration); - v_T_internal_reset[pl_TimerIndex] := true; - } - } - case(t_guard) - { - if(pl_duration < 0.0){ - T_guard[pl_TimerIndex].start; - v_T_guard[pl_TimerIndex] := true; - } - else{ - T_guard[pl_TimerIndex].start(pl_duration); - v_T_guard[pl_TimerIndex] := true; - } - } - case else - {log("Warning: Incorrect Timer!")} - } - } - //****************************************************************** - function f_StopTimer(TimerIdentifierType pl_TimerIdentifier,integer pl_TimerIndex) runs on SCCP_CT - //****************************************************************** - { - select (pl_TimerIdentifier) - { - case(conn_est) - { - T_conn_est[pl_TimerIndex].stop; - v_T_conn_est[pl_TimerIndex] := false; - } - case(ias) - { - T_ias[pl_TimerIndex].stop; - v_T_ias[pl_TimerIndex] := false; - } - case(iar) - { - T_iar[pl_TimerIndex].stop; - v_T_iar[pl_TimerIndex] := false; - } - case(rel) - { - T_rel[pl_TimerIndex].stop; - v_T_rel[pl_TimerIndex] := false; - } - case(repeat_rel) - { - T_repeat_rel[pl_TimerIndex].stop; - v_T_repeat_rel[pl_TimerIndex] := false; - } - case(int) - { - T_int[pl_TimerIndex].stop; - v_T_int[pl_TimerIndex] := false; - } - case(reset) - { - T_reset[pl_TimerIndex].stop; - v_T_reset[pl_TimerIndex] := false; - } - case(internal_reset) - { - T_internal_reset[pl_TimerIndex].stop; - v_T_internal_reset[pl_TimerIndex] := false; - } - case(t_guard) - { - T_guard[pl_TimerIndex].stop; - v_T_guard[pl_TimerIndex] := false; - } - case else - {log("Warning: Incorrect Timer!")} - } - } - - //****************************************************************** - function f_initialize_timer_states() runs on SCCP_CT - //****************************************************************** - { - var integer i; - for (i:=0; i= 2) { v_RoutingLabelLen := 5; } - else { v_RoutingLabelLen := 4; } - } - else if( v_SCCPServiceType == m3ua ) - { - v_RoutingLabelLen := 4; // not really... - //v_sccp_data_maxlen := 261; - } - else if ( (v_SCCPServiceType == mtp3_mpt)) - { - if(v_NI== 2) { v_RoutingLabelLen := 7; } - else { v_RoutingLabelLen := 4; } - } - else - { - log( "Wrong SCCPServiceType value was selected in the config file"); - log("Modified for default value 'mtp3_itu'."); - v_SCCPServiceType := mtp3_itu; - v_RoutingLabelLen := 4; //itu - - } - - // mtp3_itu_b i.e. itu mtp3b - // SCCP_ansi_b i.e ansi mtp3b settings ??? - //272= max length of SIF, see Fig3-3B/T1.111.4-2001 - //temp for test: 10 ? - //tsp_SIF_MaxLength = 272 - v_sccp_pdu_maxlen := tsp_SIF_MaxLength - v_RoutingLabelLen; // -; //7: msg_type+locref+ptr+len - log("v_sccp_pdu_maxlen:",v_sccp_pdu_maxlen); - v_sccp_data_maxlen := v_sccp_pdu_maxlen-7; // dt1 payload // -7: msg_type+locref+ptr+len - - for (vl_j:=0;vl_j<16;vl_j:=vl_j+1) - { - ConnectionTable[vl_j].localReference :='000000'O; - ConnectionTable[vl_j].remoteReference:='000000'O; - ConnectionTable[vl_j].state :=idle; - ConnectionTable[vl_j].connectionId :=0; - ConnectionTable[vl_j].reassembler_buffer.buffer :=''O; - ConnectionTable[vl_j].reassembler_buffer.actlen := 0; - ConnectionTable[vl_j].reassembler_buffer.maxlen := 16*v_sccp_data_maxlen; //???? - segmLocRefTable[vl_j] := '000000'O; - reallocate_ClessRcvBuff(vl_j); - - }//endfor - - //starts SCCP execution - ScanEvents(); - }//endfunction of SCCPStart - - - //****************************************************************** - function ReleaseResources(in integer pl_session) runs on SCCP_CT - //****************************************************************** - {//startfunction - - //release resources - ConnectionTable[pl_session].remoteReference:='000000'O; - ConnectionTable[pl_session].localReference:='000000'O; - ConnectionTable[pl_session].connectionId:=0; - Stop_sessionTimers(pl_session); - ConnectionTable[pl_session].state:=idle; - ConnectionTable[pl_session].reassembler_buffer.buffer:=''O; - ConnectionTable[pl_session].reassembler_buffer.actlen:=0; - }//endfunction ReleaseResources - - //****************************************************************** - function GuardTimer_Expired(in integer pl_session) runs on SCCP_CT - //no answer to ASP_SCCP_N_CONNECT_ind received - //****************************************************************** - {//startfunction - - //local declarations - var PDU_SCCP vl_PDU_SCCP; - - //Action Table follows - - if (ConnectionTable[pl_session].state==connection_pending_IC) - {//startif - - //send Released-this should disconnect the other end - vl_PDU_SCCP.released.messageType:=rlsd; - vl_PDU_SCCP.released.destLocRef:=ConnectionTable[pl_session].remoteReference; - vl_PDU_SCCP.released.sourceLocRef:=ConnectionTable[pl_session].localReference; - vl_PDU_SCCP.released.releaseCause:=cg_Rel_endUserOrig; - vl_PDU_SCCP.released.pointer1:=0; - vl_PDU_SCCP.released.optionalPart:=omit; - vl_PDU_SCCP.released.eop:=omit; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Released - - //release resources, return to idle - ReleaseResources(pl_session); - - }//endif - - }//endfunction GuardTimer_Expired - - - //****************************************************************** - function InternalResetTimer_Expired(integer pl_session) runs on SCCP_CT - //****************************************************************** - {//startfunction - - //local declarations - var PDU_SCCP vl_PDU_SCCP; - var ASP_SCCP_N_RESET_ind vl_N_RESET_ind; - - //Action Table follows - - if (ConnectionTable[pl_session].state==active) - {//startif - //send ASP_SCCP_N_RESET_ind - //assemble ASP_SCCP_N_ASP - vl_N_RESET_ind.originator:=cg_NSP; - vl_N_RESET_ind.reason:=cg_DISC_abnormal_T; - vl_N_RESET_ind.connectionId:=ConnectionTable[pl_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_RESET_ind( - vl_N_RESET_ind.originator, - vl_N_RESET_ind.reason, - vl_N_RESET_ind.connectionId - ));//send ASP_SCCP_N_RESET_ind - //send Reset Request - - vl_PDU_SCCP.resetreq.messageType:=rsr; - vl_PDU_SCCP.resetreq.destLocRef:=ConnectionTable[pl_session].remoteReference; - vl_PDU_SCCP.resetreq.sourceLocRef:=ConnectionTable[pl_session].localReference; - vl_PDU_SCCP.resetreq.resetCause:=cg_Res_endUserOrig; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Reset Request - - //start reset timer - - f_StartTimer(reset,pl_session); - //restart send inactivity timer - f_StopTimer(ias,pl_session);//to avoid warnings - f_StartTimer(ias,pl_session); - //reset variables etc. - //change state - ConnectionTable[pl_session].state:=reset_bothway; - - }//endif - }//InternalResetTimer_Expired - - //****************************************************************** - function Reset_Timer_Expired(integer pl_session) runs on SCCP_CT - //****************************************************************** - {//startfunction - - //local declarations - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - - //Action Table follows - if (ConnectionTable[pl_session].state==reset_bothway) - {//startif - - //assemble ASP_SCCP_N_ - vl_N_DISCONNECT_ind.originator:=cg_NSP; - vl_N_DISCONNECT_ind.reason:=cg_DISC_abnormal_T; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[pl_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - - //release resources, stop inactivity timers, change state to idle - ReleaseResources(pl_session); - }//endif - - }//Reset_Timer_Expired - - //****************************************************************** - function Interval_Timer_Expired(integer pl_session) runs on SCCP_CT - //****************************************************************** - {//startfunction - - //Action Table follows - if (ConnectionTable[pl_session].state==disconnect_pending) - { - log ("Interval timer expired"); - //release resources - ReleaseResources(pl_session); - } - - }//Interval_Timer_Expired - - - - //****************************************************************** - function RepeatRelease_Timer_Expired(integer pl_session) runs on SCCP_CT - //****************************************************************** - { - - //local declarations - var PDU_SCCP vl_PDU_SCCP; - - //Action Table follows - if (ConnectionTable[pl_session].state==disconnect_pending) - { - //assemble and route MTP3_ASP - vl_PDU_SCCP.released.messageType:=rlsd; - vl_PDU_SCCP.released.destLocRef:=ConnectionTable[pl_session].remoteReference; - vl_PDU_SCCP.released.sourceLocRef:=ConnectionTable[pl_session].localReference; - vl_PDU_SCCP.released.releaseCause:=cg_Res_endUserOrig; - vl_PDU_SCCP.released.pointer1:=0; - vl_PDU_SCCP.released.optionalPart:=omit; - vl_PDU_SCCP.released.eop:=omit; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Released - - //restart repeat release timer - f_StopTimer(repeat_rel,pl_session);//to avoid warnings - f_StartTimer(repeat_rel,pl_session); - //no state change, return - } - - }//RepeatRelease_Timer_Expired - - - //****************************************************************** - function Release_Timer_Expired(integer pl_session) runs on SCCP_CT - //****************************************************************** - { - - //local declarations - var PDU_SCCP vl_PDU_SCCP; - - //Action Table follows - if (ConnectionTable[pl_session].state==disconnect_pending) - { - //assemble and route MTP3_ASP - vl_PDU_SCCP.released.messageType:=rlsd; - vl_PDU_SCCP.released.destLocRef:=ConnectionTable[pl_session].remoteReference; - vl_PDU_SCCP.released.sourceLocRef:=ConnectionTable[pl_session].localReference; - vl_PDU_SCCP.released.releaseCause:=cg_Res_endUserOrig;//? - vl_PDU_SCCP.released.pointer1:=0; - vl_PDU_SCCP.released.optionalPart:=omit; - vl_PDU_SCCP.released.eop:=omit; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Released - - f_StartTimer(repeat_rel,pl_session); - f_StartTimer(int,pl_session); - //no state change, return - - }//endif - - }//Release_Timer_Expired - - - //****************************************************************** - function ReceiveInactivity_Timer_Expired(integer pl_session) runs on SCCP_CT - //****************************************************************** - { - //local declarations - var PDU_SCCP vl_PDU_SCCP; - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - - //Action Table follows - if (ConnectionTable[pl_session].state==idle){} - else if (ConnectionTable[pl_session].state==active) - { - //assemble ASP_SCCP_N_ - vl_N_DISCONNECT_ind.originator:=cg_NSP; - vl_N_DISCONNECT_ind.reason:=cg_DISC_endUserFailure;//? - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[pl_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - - //stop inactivity timers - f_StopTimer(ias,pl_session); - f_StopTimer(iar,pl_session); - - //assemble and route MTP3_ASP - - vl_PDU_SCCP.released.messageType:=rlsd; - vl_PDU_SCCP.released.destLocRef:=ConnectionTable[pl_session].remoteReference; - vl_PDU_SCCP.released.sourceLocRef:=ConnectionTable[pl_session].localReference; - vl_PDU_SCCP.released.releaseCause:=cg_Rel_expRecInacTimer; - vl_PDU_SCCP.released.pointer1:=0;// No options - vl_PDU_SCCP.released.optionalPart:=omit; - vl_PDU_SCCP.released.eop:=omit; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Released - - //start release timer - f_StartTimer(rel,pl_session); - ConnectionTable[pl_session].state:=disconnect_pending; - - }//endif - - }//ReceiveInactivity_Timer_Expired - - - //****************************************************************** - function SendInactivity_Timer_Expired(integer pl_session) runs on SCCP_CT - //****************************************************************** - { - - //local declarations - var PDU_SCCP vl_PDU_SCCP; - - //Action Table follows - - if (ConnectionTable[pl_session].state==active) - { - - //assemble and route MTP3_ASP - vl_PDU_SCCP.inacttest.messageType :=it; - vl_PDU_SCCP.inacttest.destLocRef :=ConnectionTable[pl_session].remoteReference; - vl_PDU_SCCP.inacttest.sourceLocRef:=ConnectionTable[pl_session].localReference; - - vl_PDU_SCCP.inacttest.protClass:={ - class:='0010'B, - messageHandling:='0000'B - };//protocol class 2 - - vl_PDU_SCCP.inacttest.sequencingSegmenting:={ - reserved:='0'B, - p_s:='0000000'B, - more:='0'B, - pr:='0000000'B - };//it will be ignored - - vl_PDU_SCCP.inacttest.credit:='00'O; - //Param name credit(9), length 1, credit 0 -it will be mercifully ignored anyhow - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send inactivity test - - //restart send inactivity timer - f_StopTimer(ias,pl_session);//to avoid warnings - f_StartTimer(ias,pl_session); - - }//endif - - }//endfunction - - //****************************************************************** - function Conn_Timer_Expired(integer pl_session) runs on SCCP_CT - //****************************************************************** - { - - //local declarations - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - - if (ConnectionTable[pl_session].state==connection_pending_OG) - { - //assemble ASP_SCCP_N_ - vl_N_DISCONNECT_ind.originator:=cg_NSP; - vl_N_DISCONNECT_ind.reason:=cg_DISC_abnormal_T; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[pl_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - - //release resources - ReleaseResources(pl_session); - } - else if (ConnectionTable[pl_session].state==wait_conn_confirm) - { - ReleaseResources(pl_session); - } - - }//Conn_Timer_Expired - - //****************************************************************** - function GenerateLocalReference() runs on SCCP_CT return OCT3 - //****************************************************************** - { - var OCT3 vl_LocalReference; - - do - { - vl_LocalReference := int2oct(float2int(rnd()*tsp_maxLocalReference), 3 ); - } - while ( Retrieve_session( vl_LocalReference ) != -1 ); - return vl_LocalReference; - - }//GenerateLocalReference - - //****************************************************************** - function GenerateConnectionId() runs on SCCP_CT return integer - //****************************************************************** - { - var integer vl_ConnectionId; - - do { vl_ConnectionId := float2int(rnd()*tsp_max_ConnectionId); } - while ( Retrieve_session_connectionId( vl_ConnectionId ) != -1 ); - - return vl_ConnectionId; - }//GenerateConnectionId - - //****************************************************************** - function Stop_sessionTimers ( integer pl_session) runs on SCCP_CT - //****************************************************************** - { - if (T_conn_est[pl_session].running) - { f_StopTimer(conn_est,pl_session);} - if (T_ias[pl_session].running) - { f_StopTimer(ias,pl_session);} - if (T_iar[pl_session].running) - { f_StopTimer(iar,pl_session);} - if (T_rel[pl_session].running) - { f_StopTimer(rel,pl_session);} - if (T_repeat_rel[pl_session].running) - { f_StopTimer(repeat_rel,pl_session);} - if (T_int[pl_session].running) - { f_StopTimer(int,pl_session);} - // if (T_T_guard[pl_session].running) - // { f_StopTimer(t_t_guard,pl_session);} - if (T_reset[pl_session].running) - { f_StopTimer(reset,pl_session);} - //T_reassembly[pl_session].stop; - - }//Stop_sessionTimers - - //****************************************************************** - function CheckIdleIndividuals() runs on SCCP_CT return integer - //****************************************************************** - { - var integer vl_j; - for (vl_j:=0;vl_j<16;vl_j:=vl_j+1) - { - if (ConnectionTable[vl_j].state==idle) - { - log("First idle individual index:",vl_j); - return vl_j; - } - } - - return -1; - - }//CheckIdleIndividuals - - //****************************************************************** - function ConnectionAlreadyEstablished( OCT3 pl_LocRef) runs on SCCP_CT return boolean - //****************************************************************** - { - var integer vl_j; - for (vl_j:=0;vl_j<16;vl_j:=vl_j+1) - { - if (ConnectionTable[vl_j].localReference==pl_LocRef) - { - return true; - } - } - return false; - - } //ConnectionAlreadyEstablished - - //****************************************************************** - function ConnectionAlreadyEstablished_remote( OCT3 pl_LocRef) runs on SCCP_CT return boolean - //****************************************************************** - { - var integer vl_j; - - for (vl_j:=0;vl_j<16;vl_j:=vl_j+1) - { - if (ConnectionTable[vl_j].remoteReference==pl_LocRef) - { - return true; - } - } - return false; - - } //ConnectionAlreadyEstablished_remote - - //****************************************************************** - function ConnectionAlreadyEstablished_connectionId(integer pl_ConnId) runs on SCCP_CT return boolean - //****************************************************************** - { - var integer vl_j; - for (vl_j:=0;vl_j<16;vl_j:=vl_j+1) - { - if (ConnectionTable[vl_j].connectionId==pl_ConnId) - { - return true; - } - } - - return false; - - } //ConnectionAlreadyEstablished_connectionId - - //****************************************************************** - function Retrieve_session( OCT3 pl_LocRef ) runs on SCCP_CT return integer - //****************************************************************** - { - var integer vl_j; - for (vl_j:=0;vl_j<16;vl_j:=vl_j+1) - { - - if (ConnectionTable[vl_j].localReference==pl_LocRef) - { - log("Session index based on local reference:",vl_j); - return vl_j; - } - } - - return -1; - - } //Retrieve_session - - //****************************************************************** - function Retrieve_session_remote( OCT3 pl_LocRef ) - runs on SCCP_CT return integer - //****************************************************************** - { - var integer vl_j; - for (vl_j:=0;vl_j<16;vl_j:=vl_j+1) - { - if (ConnectionTable[vl_j].remoteReference==pl_LocRef) - { - log("Session index based on remote reference:",vl_j); - return vl_j; - } - } - return -1; - - } //Retrieve_session_remote - - //****************************************************************** - function Retrieve_session_connectionId( integer pl_ConnId ) - runs on SCCP_CT return integer - //****************************************************************** - { - var integer vl_j; - for (vl_j:=0;vl_j<16;vl_j:=vl_j+1) - { - if (ConnectionTable[vl_j].connectionId==pl_ConnId) - { - log("Session index based on connection ID:",vl_j); - return vl_j; - } - } - return -1; - - } //Retrieve_session_connectionId - - //================================================================== - // Connectionless Segmented Data Handling/ - //================================================================== - //================================================================== - // SENDING: SCCP->MTP3 Segmentation Local Reference Handling - // Handles segmLocRefTable,v_segmLocRefIndex, - // which are defined in SCCP_typedefs.ttcn - //================================================================== - - //****************************************************************** - //function exist_segmLocalRef - //****************************************************************** - - function exist_segmLocalRef( in OCT3 pl_segLocRef) - runs on SCCP_CT return boolean - { - if( get_segmLocalRefIndex(pl_segLocRef) == -1 ) { return false;} - else { return true; }; - } //exist_segmLocalRef - - //****************************************************************** - //function get_segLocalRefIndex - //****************************************************************** - - function get_segmLocalRefIndex(in OCT3 pl_segmLocRef) - runs on SCCP_CT return integer - { - var integer vl_j; - for (vl_j:=0;vl_j<16;vl_j:=vl_j+1) - { - if( segmLocRefTable[vl_j] == pl_segmLocRef ) { return vl_j;} - } - return -1; - }//get_segLocalRefIndex - - //****************************************************************** - //function reset_segmLocalRef - //****************************************************************** - function reset_segmLocalRef(in OCT3 pl_segmLocRef) - runs on SCCP_CT - { - var integer vl_j; - vl_j:= get_segmLocalRefIndex( pl_segmLocRef ) - segmLocRefTable[vl_j] := '000000'O; - } - - //****************************************************************** - // function create_segmLocalRef - //****************************************************************** - - function create_segmLocalRef() - runs on SCCP_CT return OCT3 - { - var OCT3 vl_segmLocRef; - v_segmLocRefIndex := (v_segmLocRefIndex +1) mod 16; - do - { - vl_segmLocRef := int2oct(float2int( rnd() *tsp_maxLocalReference), 3 ); - } - while ( exist_segmLocalRef( vl_segmLocRef ) ); - - return vl_segmLocRef; - }//create_segmLocalRef - - //================================================================== - // RECEIVING CONNECTIONLESS PDUs BY SCCP - //================================================================== - - //****************************************************************** - //function exist_ClessRcvBuff - //****************************************************************** - function exist_ClessRcvBuff( in OCT3 pl_segmRemRef) - runs on SCCP_CT return boolean - { - if( get_ClessRcvBuffIndex(pl_segmRemRef) == -1 ) { return false;} - else { return true; }; - } //exist_ClessRcvBuff - - //****************************************************************** - //function get_segRemoteRefIndex - //****************************************************************** - function get_ClessRcvBuffIndex(in OCT3 pl_segmRemRef) - runs on SCCP_CT return integer - { - var integer vl_j; - for (vl_j:=0;vl_j<16;vl_j:=vl_j+1) - { - if( ClessRcvBuffTable[vl_j].segmRemoteRef == pl_segmRemRef ) - { return vl_j;} - } - return -1; - }//get_ClessRcvBuffIndex - - //****************************************************************** - //function get_idle_ClessRcvBuffIndex - //****************************************************************** - function get_idle_ClessRcvBuffIndex( ) - runs on SCCP_CT return integer - { - var integer vl_j; - for (vl_j:=0;vl_j<16;vl_j:=vl_j+1) - { - if( ClessRcvBuffTable[vl_j].state == segmLocRef_idle ) { return vl_j;} - } - return -1; - }//get_idle_ClessRcvBuffIndex - - //****************************************************************** - //function allocate_ClessRcvBuff - //****************************************************************** - function allocate_ClessRcvBuff(in OCT3 pl_segmRemRef) - runs on SCCP_CT return integer - { - var OCT3 vl_segmRemRef; - var integer vl_j; - - if( exist_ClessRcvBuff(pl_segmRemRef) ){ return -1;}; - - vl_j := get_idle_ClessRcvBuffIndex(); - ClessRcvBuffTable[vl_j].state := segmLocRef_busy; - ClessRcvBuffTable[vl_j].segmRemoteRef := pl_segmRemRef; - ClessRcvBuffTable[vl_j].reassembler_buffer.buffer:=''O; - ClessRcvBuffTable[vl_j].reassembler_buffer.actlen:=0; - return vl_j; - - }//allocate_ClessRcvBuff - //****************************************************************** - //function reallocate_ClessRcvBuff - //****************************************************************** - function reallocate_ClessRcvBuff(in integer pl_index ) - runs on SCCP_CT - { - ClessRcvBuffTable[pl_index].state := segmLocRef_idle; - // maybe unnecessaryy - ClessRcvBuffTable[pl_index].segmRemoteRef := '000000'O; - ClessRcvBuffTable[pl_index].reassembler_buffer.buffer:=''O; - ClessRcvBuffTable[pl_index].reassembler_buffer.actlen:=0; - return; - } - - //****************************************************************** - //function store_segmData - //****************************************************************** - function store_segmData(in integer pl_index, in PDU_SCCP_ExtUnitdata pl_PDU_SCCP_ExtUnitdata) - runs on SCCP_CT - { - ClessRcvBuffTable[pl_index].reassembler_buffer.buffer:= - ClessRcvBuffTable[pl_index].reassembler_buffer.buffer& - pl_PDU_SCCP_ExtUnitdata.data.data; - ClessRcvBuffTable[pl_index].reassembler_buffer.actlen:= - ClessRcvBuffTable[pl_index].reassembler_buffer.actlen+ - pl_PDU_SCCP_ExtUnitdata.data.paramLength; - } //store_segmData - - //****************************************************************** - //function send_ClessRcvBuff_in_N_UNITDATAind - //****************************************************************** - function send_ClessRcvBuff_in_N_UNITDATAind ( - in integer pl_index, - in PDU_SCCP_ExtUnitdata pl_PDU_SCCP_ExtUnitdata) - runs on SCCP_CT - { - var ASP_SCCP_N_UNITDATA_ind vl_N_UNITDATA_ind; - - vl_N_UNITDATA_ind.calledAddress := - ConvertPDUEncodedAddressToASPAddress( pl_PDU_SCCP_ExtUnitdata.calledPAddress ); - - vl_N_UNITDATA_ind.callingAddress := - ConvertPDUEncodedAddressToASPAddress( pl_PDU_SCCP_ExtUnitdata.callingPAddress ); - - vl_N_UNITDATA_ind.sequenceControl:= - '0000000'B&pl_PDU_SCCP_ExtUnitdata.protClass.class[3]; - if( pl_PDU_SCCP_ExtUnitdata.protClass.messageHandling == '1000'B ) - { vl_N_UNITDATA_ind.returnOption := '00000001'B; } - else - { vl_N_UNITDATA_ind.returnOption := '00000000'B; } - - vl_N_UNITDATA_ind.userData := ClessRcvBuffTable[pl_index].reassembler_buffer.buffer; - - vl_N_UNITDATA_ind.importance := omit; - - SCCP_SP_PORT.send( vl_N_UNITDATA_ind ); - - return; - }//send_ClessRcvBuff_in_N_UNITDATAind - - //****************************************************************** - //function send_ClessData_in_N_UNITDATAind - // unbuffered data sending - //****************************************************************** - - function send_ClessData_in_N_UNITDATAind ( - in PDU_SCCP_ExtUnitdata pl_PDU_SCCP_ExtUnitdata) - runs on SCCP_CT - { - var ASP_SCCP_N_UNITDATA_ind vl_N_UNITDATA_ind; - - vl_N_UNITDATA_ind.calledAddress := - ConvertPDUEncodedAddressToASPAddress( pl_PDU_SCCP_ExtUnitdata.calledPAddress ); - - vl_N_UNITDATA_ind.callingAddress := - ConvertPDUEncodedAddressToASPAddress( pl_PDU_SCCP_ExtUnitdata.callingPAddress ); - - vl_N_UNITDATA_ind.sequenceControl:= - '0000000'B&pl_PDU_SCCP_ExtUnitdata.protClass.class[3]; - if( pl_PDU_SCCP_ExtUnitdata.protClass.messageHandling == '1000'B ) - { vl_N_UNITDATA_ind.returnOption := '00000001'B; } - else - { vl_N_UNITDATA_ind.returnOption := '00000000'B; } - - vl_N_UNITDATA_ind.userData := pl_PDU_SCCP_ExtUnitdata.data.data; - - vl_N_UNITDATA_ind.importance := omit; - - SCCP_SP_PORT.send( vl_N_UNITDATA_ind ); - return; - }//send_ClessData_in_N_UNITDATAind - - //****************************************************************** - // CONN.ORIENTED SEGMENTING/REASSEMBLING - //****************************************************************** - - //****************************************************************** - // SEGMENTING - //****************************************************************** - - //****************************************************************** - // function sending_dataform1s_in_ASP_MTP_TRANSFERreqs - // segmentates data and sends segments in dataform1 messages - // included in asp_MTP3_TRANSFERreq PDUs - // == segmentation - connection oriented case == - // counterpair: buffered_sending_ASP_N_DATA_ind - //****************************************************************** - function sending_dataform1s_in_ASP_MTP_TRANSFERreqs( in ASP_SCCP_N_DATA_req pl_N_DATA_req ) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - var integer vl_len; - var integer vl_actdatalen; - var SCCP_PAR_UserData vl_data; - var integer vl_from; // first position in vl_data to be sent - vl_data := pl_N_DATA_req.userData; - vl_from := 0; - // fixed part of messages: - vl_PDU_SCCP.dataform1.messageType:=dt1; - vl_PDU_SCCP.dataform1.destLocRef:=ConnectionTable[v_session].remoteReference; - vl_PDU_SCCP.dataform1.segmentingReassembl:={ - more:='1'B, - reserved:='0000000'B - }; - vl_PDU_SCCP.dataform1.pointer1:=1; - // variable part of messages: - vl_len := lengthof(vl_data); - - while ( vl_len > 0 ) - { - - log("vl_len:",vl_len); - log("vl_from",vl_from); - if(vl_len > v_sccp_data_maxlen) - { - vl_actdatalen := v_sccp_data_maxlen; - vl_PDU_SCCP.dataform1.segmentingReassembl.more :='1'B; - } - else - { - vl_actdatalen := vl_len; - vl_PDU_SCCP.dataform1.segmentingReassembl.more :='0'B; - }; - - vl_PDU_SCCP.dataform1.data.data:= substr( vl_data, vl_from, vl_actdatalen); - vl_PDU_SCCP.dataform1.data.paramLength:= vl_actdatalen; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Data Form1 - - log( "data sent by MTP3_SCCP_PORT: ",vl_PDU_SCCP.dataform1.data.data); - - //restart send inactivity timer - f_StopTimer(ias,v_session);//to avoid warnings - f_StartTimer(ias,v_session); - - vl_from := vl_from + vl_actdatalen; - vl_len := vl_len - vl_actdatalen; - - }//while - } //sending_dataform1s_in_ASP_MTP_TRANSFERreqs - - //****************************************************************** - // REASSEMBLING - //****************************************************************** - - //****************************************************************** - // function buffered_sending_ASP_N_DATA_ind - // counterpair of sending_dataform1s_in_ASP_MTP_TRANSFERreqs - //****************************************************************** - - function buffered_sending_ASP_N_DATA_ind( in PDU_SCCP_DataForm1 pl_PDU_SCCP_DataForm1 ) - runs on SCCP_CT - { - // Investigate this shorcut (not implemented): - // if actlen==0 and more==0=> send immediately - - // DT1 should be put to the reassembly buffer - var integer vl_newbufflen; - log("DT1 will be put to the reassembly buffer"); - //log( ConnectionTable[v_session].connectionId ); - vl_newbufflen := ConnectionTable[v_session].reassembler_buffer.actlen + - pl_PDU_SCCP_DataForm1.data.paramLength; - - if( vl_newbufflen <= ConnectionTable[v_session].reassembler_buffer.maxlen) - { - ConnectionTable[v_session].reassembler_buffer.buffer := - ConnectionTable[v_session].reassembler_buffer.buffer & - pl_PDU_SCCP_DataForm1.data.data; - ConnectionTable[v_session].reassembler_buffer.actlen := vl_newbufflen; - log("DT1 data has been put to the reassembly buffer"); - } - else - { - //send as much as possible OR error ???? NOT READY YET !!!! - //CONT HERE, ask LAFA - log("Unexpected/unimplemented program branch"); - } - - // sending: - if( pl_PDU_SCCP_DataForm1.segmentingReassembl.more == '0'B ) - { - log("DT1/segmentingReassembl/more==0 received=> send ASP_SCCP_N_DATA comes"); - //send: - SCCP_SP_PORT.send( t_ASP_N_DATA_ind( - ConnectionTable[v_session].reassembler_buffer.buffer, - ConnectionTable[v_session].connectionId, - omit)); - - //restart send inactivity timer - f_StopTimer(ias,v_session);//to avoid warnings - f_StartTimer(ias,v_session); - - // clear the buffer: - ConnectionTable[v_session].reassembler_buffer.buffer :=''O; - ConnectionTable[v_session].reassembler_buffer.actlen := 0; - } - else - { - log("DT1/segmentingReassembl/more==1 received=> sent to buffer only"); - } - }//buffered_sending_ASP_N_DATA_ind - - - //****************************************************************** - // CONVERSIONS - //****************************************************************** - // - // Differences between standards are hidden here !!!! - // - // 3 different functions working on different structures with the - // virtually indentical code - - //****************************************************************** - // Functions coding ASP address into octetstream - //****************************************************************** - - // ITU - - function ConvertASPAddressToEncodedAddress_itu( in SCCP_PAR_Address pl_ASPAddress) - runs on SCCP_CT - return SCCP_param_CPartyAddressEnc - { - - var SCCP_param_CPartyAddress_itu vl_PDUAddress; //structured fit to encoding - var SCCP_param_CPartyAddressEnc vl_PDUAddressEncoded; - - vl_PDUAddress.addressIndicator.pointCodeIndic:= - pl_ASPAddress.addressIndicator.pointCodeIndic; - - vl_PDUAddress.addressIndicator.ssnIndicator:= - pl_ASPAddress.addressIndicator.ssnIndicator; - - vl_PDUAddress.addressIndicator.globalTitleIndic:= - pl_ASPAddress.addressIndicator.globalTitleIndic; - - vl_PDUAddress.addressIndicator.routingIndicator:= - pl_ASPAddress.addressIndicator.routingIndicator; - - vl_PDUAddress.addressIndicator.reserved:='0'B; - // if (ischosen(pl_ASPAddress.signPointCode) ) not used because it is mandatory field (???) - - //----signPointCode handling - if ( ispresent( pl_ASPAddress.signPointCode )) { - vl_PDUAddress.signPointCode := - '00'B&pl_ASPAddress.signPointCode; - } else { - vl_PDUAddress.signPointCode := omit; - }; - - //----subsystemNumber handling - if ( ispresent( pl_ASPAddress.subsystemNumber ) ){ - vl_PDUAddress.subsystemNumber := pl_ASPAddress.subsystemNumber; - } else { - vl_PDUAddress.subsystemNumber :=omit; - }; - - // --- globalTitle handling-- - if ( ispresent(pl_ASPAddress.globalTitle)) - {//startif1 - - var SCCP_ASPfield_GlobalTitle tmpGT ; - tmpGT := pl_ASPAddress.globalTitle; - - if (ischosen(tmpGT.gti0001)) - { - vl_PDUAddress.globalTitle.gti0001.natureOfAddress:=tmpGT.gti0001.natureOfAddress; - vl_PDUAddress.globalTitle.gti0001.oddeven:=tmpGT.gti0001.oddeven; - vl_PDUAddress.globalTitle.gti0001.globalTitleAddress:=tmpGT.gti0001.globalTitleAddress; - } - else if (ischosen(tmpGT.gti0010)) - { - vl_PDUAddress.globalTitle.gti0010.translationType:=tmpGT.gti0010.translationType; - vl_PDUAddress.globalTitle.gti0010.globalTitleAddress:=tmpGT.gti0010.globalTitleAddress; - } - else if (ischosen(tmpGT.gti0011)) - { - vl_PDUAddress.globalTitle.gti0011.translationType:=tmpGT.gti0011.translationType; - vl_PDUAddress.globalTitle.gti0011.encodingScheme:=tmpGT.gti0011.encodingScheme; - vl_PDUAddress.globalTitle.gti0011.numberingPlan:=tmpGT.gti0011.numberingPlan; - vl_PDUAddress.globalTitle.gti0011.globalTitleAddress:=tmpGT.gti0011.globalTitleAddress; - } - else if (ischosen(tmpGT.gti0100)) - { - vl_PDUAddress.globalTitle.gti0100.translationType:=tmpGT.gti0100.translationType; - vl_PDUAddress.globalTitle.gti0100.encodingScheme:=tmpGT.gti0100.encodingScheme; - vl_PDUAddress.globalTitle.gti0100.numberingPlan:=tmpGT.gti0100.numberingPlan; - vl_PDUAddress.globalTitle.gti0100.natureOfAddress:=tmpGT.gti0100.natureOfAddress; - vl_PDUAddress.globalTitle.gti0100.reserved:='0'B; - vl_PDUAddress.globalTitle.gti0100.globalTitleAddress:=tmpGT.gti0100.globalTitleAddress; - } - } - else - { - vl_PDUAddress.globalTitle := omit; - }; - - vl_PDUAddressEncoded.addr:= enc_PDU_SCCP_Address_itu( vl_PDUAddress); - vl_PDUAddressEncoded.paramLength:= lengthof(vl_PDUAddressEncoded.addr); - - return vl_PDUAddressEncoded; - - } //ConvertASPAddressToEncodedAddress_itu - - //****************************************************************** - - // ANSI - function ConvertASPAddressToEncodedAddress_ansi(in SCCP_PAR_Address pl_ASPAddress) - runs on SCCP_CT return SCCP_param_CPartyAddressEnc - { - - var SCCP_param_CPartyAddress_ansi vl_PDUAddress; //structured fit to encoding - var SCCP_param_CPartyAddressEnc vl_PDUAddressEncoded; - - vl_PDUAddress.addressIndicator.pointCodeIndic:= - pl_ASPAddress.addressIndicator.pointCodeIndic; - - vl_PDUAddress.addressIndicator.ssnIndicator:= - pl_ASPAddress.addressIndicator.ssnIndicator; - - vl_PDUAddress.addressIndicator.globalTitleIndic:= - pl_ASPAddress.addressIndicator.globalTitleIndic; - - vl_PDUAddress.addressIndicator.routingIndicator:= - pl_ASPAddress.addressIndicator.routingIndicator; - - vl_PDUAddress.addressIndicator.reserved:='1'B; - - //----signPointCode handling - if ( ispresent( pl_ASPAddress.signPointCode )){ - vl_PDUAddress.signPointCode := pl_ASPAddress.signPointCode; - } else { - vl_PDUAddress.signPointCode := omit; - }; - - //----subsystemNumber handling - if ( ispresent( pl_ASPAddress.subsystemNumber )) { - vl_PDUAddress.subsystemNumber:=pl_ASPAddress.subsystemNumber; - } else { - vl_PDUAddress.subsystemNumber :=omit; - }; - - if (ispresent(pl_ASPAddress.globalTitle)) - {//startif1 - - var SCCP_ASPfield_GlobalTitle tmpGT := pl_ASPAddress.globalTitle; - - - if (ischosen(tmpGT.gti0010)) - { - vl_PDUAddress.globalTitle.gti0010.translationType:=tmpGT.gti0010.translationType; - vl_PDUAddress.globalTitle.gti0010.globalTitleAddress:=tmpGT.gti0010.globalTitleAddress; - } - else if (ischosen(tmpGT.gti0011)) //ansi gti001, meaning: - //used GT: SCCP_field_GlobalTitle_TT_NP_ES - { - //the left side is ANSI!!!: - vl_PDUAddress.globalTitle.gti0001.translationType:=tmpGT.gti0011.translationType; - vl_PDUAddress.globalTitle.gti0001.encodingScheme:=tmpGT.gti0011.encodingScheme; - vl_PDUAddress.globalTitle.gti0001.numberingPlan:=tmpGT.gti0011.numberingPlan; - vl_PDUAddress.globalTitle.gti0001.globalTitleAddress:=tmpGT.gti0011.globalTitleAddress; - }; - - } - else - { - vl_PDUAddress.globalTitle := omit; - }; - - // SCCP_param_CPartyAddress_ansi -> octetstring - vl_PDUAddressEncoded.addr:= enc_PDU_SCCP_Address_ansi( vl_PDUAddress); - vl_PDUAddressEncoded.paramLength:= lengthof(vl_PDUAddressEncoded.addr); - - return vl_PDUAddressEncoded - - } //ConvertASPAddressToEncodedAddress_ansi - - // ttc national: - - function ConvertASPAddressToEncodedAddress_ttc( in SCCP_PAR_Address pl_ASPAddress) - runs on SCCP_CT - return SCCP_param_CPartyAddressEnc - { - - var SCCP_param_CPartyAddress_ttc vl_PDUAddress; //structured fit to encoding - var SCCP_param_CPartyAddressEnc vl_PDUAddressEncoded; - - vl_PDUAddress.addressIndicator.pointCodeIndic:= - pl_ASPAddress.addressIndicator.pointCodeIndic; - - vl_PDUAddress.addressIndicator.ssnIndicator:= - pl_ASPAddress.addressIndicator.ssnIndicator; - - vl_PDUAddress.addressIndicator.globalTitleIndic:= - pl_ASPAddress.addressIndicator.globalTitleIndic; - - vl_PDUAddress.addressIndicator.routingIndicator:= - pl_ASPAddress.addressIndicator.routingIndicator; - - vl_PDUAddress.addressIndicator.reserved:='1'B; - - //----signPointCode handling - if ( ispresent( pl_ASPAddress.signPointCode )) { - vl_PDUAddress.signPointCode := pl_ASPAddress.signPointCode; - } else { - vl_PDUAddress.signPointCode := omit; - }; - - //----subsystemNumber handling - if ( ispresent( pl_ASPAddress.subsystemNumber ) ){ - vl_PDUAddress.subsystemNumber:= pl_ASPAddress.subsystemNumber; - } else { - vl_PDUAddress.subsystemNumber :=omit; - }; - - // --- globalTitle handling-- - if ( ispresent(pl_ASPAddress.globalTitle)) - {//startif1 - - var SCCP_ASPfield_GlobalTitle tmpGT ; - tmpGT := pl_ASPAddress.globalTitle; - - if (ischosen(tmpGT.gti0001)) - { - vl_PDUAddress.globalTitle.gti0001.natureOfAddress:=tmpGT.gti0001.natureOfAddress; - vl_PDUAddress.globalTitle.gti0001.oddeven:=tmpGT.gti0001.oddeven; - vl_PDUAddress.globalTitle.gti0001.globalTitleAddress:=tmpGT.gti0001.globalTitleAddress; - } - else if (ischosen(tmpGT.gti0010)) - { - vl_PDUAddress.globalTitle.gti0010.translationType:=tmpGT.gti0010.translationType; - vl_PDUAddress.globalTitle.gti0010.globalTitleAddress:=tmpGT.gti0010.globalTitleAddress; - } - else if (ischosen(tmpGT.gti0011)) - { - vl_PDUAddress.globalTitle.gti0011.translationType:=tmpGT.gti0011.translationType; - vl_PDUAddress.globalTitle.gti0011.encodingScheme:=tmpGT.gti0011.encodingScheme; - vl_PDUAddress.globalTitle.gti0011.numberingPlan:=tmpGT.gti0011.numberingPlan; - vl_PDUAddress.globalTitle.gti0011.globalTitleAddress:=tmpGT.gti0011.globalTitleAddress; - } - else if (ischosen(tmpGT.gti0100)) - { - vl_PDUAddress.globalTitle.gti0100.translationType:=tmpGT.gti0100.translationType; - vl_PDUAddress.globalTitle.gti0100.encodingScheme:=tmpGT.gti0100.encodingScheme; - vl_PDUAddress.globalTitle.gti0100.numberingPlan:=tmpGT.gti0100.numberingPlan; - vl_PDUAddress.globalTitle.gti0100.natureOfAddress:=tmpGT.gti0100.natureOfAddress; - vl_PDUAddress.globalTitle.gti0100.reserved:='0'B; - vl_PDUAddress.globalTitle.gti0100.globalTitleAddress:=tmpGT.gti0100.globalTitleAddress; - }; - } - else - { - vl_PDUAddress.globalTitle := omit; - }; - - vl_PDUAddressEncoded.addr:= enc_PDU_SCCP_Address_ttc( vl_PDUAddress); - vl_PDUAddressEncoded.paramLength:= lengthof(vl_PDUAddressEncoded.addr); - - return vl_PDUAddressEncoded; - - } //ConvertASPAddressToEncodedAddress_ttc - - // mpt national: - - function ConvertASPAddressToEncodedAddress_mpt( in SCCP_PAR_Address pl_ASPAddress) - runs on SCCP_CT - return SCCP_param_CPartyAddressEnc - { - - var SCCP_param_CPartyAddress_mpt vl_PDUAddress; //structured fit to encoding - var SCCP_param_CPartyAddressEnc vl_PDUAddressEncoded; - - vl_PDUAddress.addressIndicator.pointCodeIndic:= - pl_ASPAddress.addressIndicator.pointCodeIndic; - - vl_PDUAddress.addressIndicator.ssnIndicator:= - pl_ASPAddress.addressIndicator.ssnIndicator; - - vl_PDUAddress.addressIndicator.globalTitleIndic:= - pl_ASPAddress.addressIndicator.globalTitleIndic; - - vl_PDUAddress.addressIndicator.routingIndicator:= - pl_ASPAddress.addressIndicator.routingIndicator; - - vl_PDUAddress.addressIndicator.reserved:='1'B; - - //----signPointCode handling - if ( ispresent( pl_ASPAddress.signPointCode )) { - vl_PDUAddress.signPointCode := pl_ASPAddress.signPointCode; - } else { - vl_PDUAddress.signPointCode := omit; - }; - - //----subsystemNumber handling - if ( ispresent( pl_ASPAddress.subsystemNumber ) ){ - vl_PDUAddress.subsystemNumber:= pl_ASPAddress.subsystemNumber; - } else { - vl_PDUAddress.subsystemNumber :=omit; - }; - - // --- globalTitle handling-- - if ( ispresent(pl_ASPAddress.globalTitle)) - {//startif1 - - var SCCP_ASPfield_GlobalTitle tmpGT ; - tmpGT := pl_ASPAddress.globalTitle; - - if (ischosen(tmpGT.gti0001)) - { - vl_PDUAddress.globalTitle.gti0001.natureOfAddress:=tmpGT.gti0001.natureOfAddress; - vl_PDUAddress.globalTitle.gti0001.oddeven:=tmpGT.gti0001.oddeven; - vl_PDUAddress.globalTitle.gti0001.globalTitleAddress:=tmpGT.gti0001.globalTitleAddress; - } - else if (ischosen(tmpGT.gti0010)) - { - vl_PDUAddress.globalTitle.gti0010.translationType:=tmpGT.gti0010.translationType; - vl_PDUAddress.globalTitle.gti0010.globalTitleAddress:=tmpGT.gti0010.globalTitleAddress; - } - else if (ischosen(tmpGT.gti0011)) - { - vl_PDUAddress.globalTitle.gti0011.translationType:=tmpGT.gti0011.translationType; - vl_PDUAddress.globalTitle.gti0011.encodingScheme:=tmpGT.gti0011.encodingScheme; - vl_PDUAddress.globalTitle.gti0011.numberingPlan:=tmpGT.gti0011.numberingPlan; - vl_PDUAddress.globalTitle.gti0011.globalTitleAddress:=tmpGT.gti0011.globalTitleAddress; - } - else if (ischosen(tmpGT.gti0100)) - { - vl_PDUAddress.globalTitle.gti0100.translationType:=tmpGT.gti0100.translationType; - vl_PDUAddress.globalTitle.gti0100.encodingScheme:=tmpGT.gti0100.encodingScheme; - vl_PDUAddress.globalTitle.gti0100.numberingPlan:=tmpGT.gti0100.numberingPlan; - vl_PDUAddress.globalTitle.gti0100.natureOfAddress:=tmpGT.gti0100.natureOfAddress; - vl_PDUAddress.globalTitle.gti0100.reserved:='0'B; - vl_PDUAddress.globalTitle.gti0100.globalTitleAddress:=tmpGT.gti0100.globalTitleAddress; - }; - } - else - { - vl_PDUAddress.globalTitle := omit; - }; - - vl_PDUAddressEncoded.addr:= enc_PDU_SCCP_Address_mpt( vl_PDUAddress); - vl_PDUAddressEncoded.paramLength:= lengthof(vl_PDUAddressEncoded.addr); - - return vl_PDUAddressEncoded; - - } //ConvertASPAddressToEncodedAddress_mpt - - //****************************************************************** - - //****************************************************************** - // CONVERSION / DECODING - //****************************************************************** - - //****************************************************************** - // function ConvertPDUEncodedAddressToASPAddress_itu - // converts Encoded PDU Address into sturctured ASP Address - // according to ITU - //****************************************************************** - function ConvertPDUEncodedAddressToASPAddress_itu( in SCCP_param_CPartyAddressEnc pl_PDUAddress) - runs on SCCP_CT return SCCP_PAR_Address - { - var SCCP_PAR_Address vl_ASPAddress; - var SCCP_ASPfield_GlobalTitle tmpGT; // the same for itu, ansi and ttc - var SCCP_param_CPartyAddress_itu vl_PDUAddress; - - //new code detail (ethbaat 2003.11.04: - // decoding from octetstring to structure "SCCP_param_CPartyAddress_itu": - vl_PDUAddress := dec_PDU_SCCP_Address_itu( pl_PDUAddress.addr ); - - vl_ASPAddress.addressIndicator.pointCodeIndic := - vl_PDUAddress.addressIndicator.pointCodeIndic; - - vl_ASPAddress.addressIndicator.ssnIndicator := - vl_PDUAddress.addressIndicator.ssnIndicator; - - vl_ASPAddress.addressIndicator.globalTitleIndic := - vl_PDUAddress.addressIndicator.globalTitleIndic; - - vl_ASPAddress.addressIndicator.routingIndicator := - vl_PDUAddress.addressIndicator.routingIndicator; - - if (ispresent ( vl_PDUAddress.signPointCode)) { - vl_ASPAddress.signPointCode:= substr(vl_PDUAddress.signPointCode,2,14); - } - else { - vl_ASPAddress.signPointCode := omit; //ethbaat 2003.11.04 - } - - if (ispresent (vl_PDUAddress.subsystemNumber )) { //always suggested ... - vl_ASPAddress.subsystemNumber:= vl_PDUAddress.subsystemNumber; - } - else { - vl_ASPAddress.subsystemNumber:=omit; //ethbaat 2003.11.04 - } - - if( ispresent( vl_PDUAddress.globalTitle ) ){ - if (ischosen (vl_PDUAddress.globalTitle.gti0001)) - { - tmpGT.gti0001.natureOfAddress:=vl_PDUAddress.globalTitle.gti0001.natureOfAddress; - tmpGT.gti0001.oddeven:=vl_PDUAddress.globalTitle.gti0001.oddeven; - tmpGT.gti0001.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0001.globalTitleAddress; - vl_ASPAddress.globalTitle:=tmpGT; - } - else if (ischosen (vl_PDUAddress.globalTitle.gti0010)) - { - tmpGT.gti0010.translationType:=vl_PDUAddress.globalTitle.gti0010.translationType; - tmpGT.gti0010.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0010.globalTitleAddress; - vl_ASPAddress.globalTitle:=tmpGT; - } - else if (ischosen (vl_PDUAddress.globalTitle.gti0011)) - { - tmpGT.gti0011.translationType :=vl_PDUAddress.globalTitle.gti0011.translationType; - tmpGT.gti0011.encodingScheme :=vl_PDUAddress.globalTitle.gti0011.encodingScheme; - tmpGT.gti0011.numberingPlan :=vl_PDUAddress.globalTitle.gti0011.numberingPlan; - tmpGT.gti0011.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0011.globalTitleAddress; - vl_ASPAddress.globalTitle :=tmpGT; - } - else if (ischosen (vl_PDUAddress.globalTitle.gti0100)) - { - tmpGT.gti0100.translationType :=vl_PDUAddress.globalTitle.gti0100.translationType; - tmpGT.gti0100.encodingScheme :=vl_PDUAddress.globalTitle.gti0100.encodingScheme; - tmpGT.gti0100.numberingPlan :=vl_PDUAddress.globalTitle.gti0100.numberingPlan; - tmpGT.gti0100.natureOfAddress :=vl_PDUAddress.globalTitle.gti0100.natureOfAddress - //tmpGT.gti0100.reserved:='00'B; - tmpGT.gti0100.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0100.globalTitleAddress; - vl_ASPAddress.globalTitle :=tmpGT; - } - } - else - { - vl_ASPAddress.globalTitle:= omit; - }; - - return vl_ASPAddress; - } //ConvertPDUEncodedAddressToASPAddress_itu - - //****************************************************************** - // function ConvertPDUEncodedAddressToASPAddress_ansi - // converts Encoded PDU Address into sturctured ASP Address - // according to ANSI - //****************************************************************** - - function ConvertPDUEncodedAddressToASPAddress_ansi( in SCCP_param_CPartyAddressEnc pl_PDUAddress) - runs on SCCP_CT return SCCP_PAR_Address - { - var SCCP_PAR_Address vl_ASPAddress; - var SCCP_ASPfield_GlobalTitle tmpGT; // the same for itu, ansi and ttc - var SCCP_param_CPartyAddress_ansi vl_PDUAddress; - - //new code detail (ethbaat 2003.11.04: - // decoding from octetstring to structure "SCCP_param_CPartyAddress_itu": - vl_PDUAddress := dec_PDU_SCCP_Address_ansi( pl_PDUAddress.addr ); - - vl_ASPAddress.addressIndicator.pointCodeIndic := - vl_PDUAddress.addressIndicator.pointCodeIndic; - - vl_ASPAddress.addressIndicator.ssnIndicator := - vl_PDUAddress.addressIndicator.ssnIndicator; - - vl_ASPAddress.addressIndicator.globalTitleIndic := - vl_PDUAddress.addressIndicator.globalTitleIndic; - - vl_ASPAddress.addressIndicator.routingIndicator := - vl_PDUAddress.addressIndicator.routingIndicator; - - if (ispresent (vl_PDUAddress.signPointCode )) { - vl_ASPAddress.signPointCode:= vl_PDUAddress.signPointCode; - } - else { - //vl_ASPAddress.signPointCode.pointCode:='0000000000000000'B; //or empty??? ( 16len bitstring - vl_ASPAddress.signPointCode:= omit; //ethbaat 2003.11.11 - } - - if (ispresent (vl_PDUAddress.subsystemNumber)) { //always suggested ... - vl_ASPAddress.subsystemNumber:= vl_PDUAddress.subsystemNumber; - } - else { - vl_ASPAddress.subsystemNumber:=omit; //ethbaat 2003.11.04 - //vl_ASPAddress.subsystemNumber:= 0; - }; - - if( ispresent( vl_PDUAddress.globalTitle ) ){ - if (ischosen (vl_PDUAddress.globalTitle.gti0001)) - { - tmpGT.gti0011.translationType :=vl_PDUAddress.globalTitle.gti0001.translationType; - tmpGT.gti0011.encodingScheme :=vl_PDUAddress.globalTitle.gti0001.encodingScheme; - tmpGT.gti0011.numberingPlan :=vl_PDUAddress.globalTitle.gti0001.numberingPlan; - tmpGT.gti0011.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0001.globalTitleAddress; - vl_ASPAddress.globalTitle :=tmpGT; - } - if (ischosen (vl_PDUAddress.globalTitle.gti0010)) - { - tmpGT.gti0010.translationType:=vl_PDUAddress.globalTitle.gti0010.translationType; - tmpGT.gti0010.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0010.globalTitleAddress; - vl_ASPAddress.globalTitle:=tmpGT; - }; - } - else - { - vl_ASPAddress.globalTitle:= omit; - }; - - return vl_ASPAddress; - } //ConvertPDUEncodedAddressToASPAddress_ansi - - //****************************************************************** - // function ConvertPDUEncodedAddressToASPAddress_ttc - // converts Encoded PDU Address into sturctured ASP Address - // according to ttc - //****************************************************************** - function ConvertPDUEncodedAddressToASPAddress_ttc( in SCCP_param_CPartyAddressEnc pl_PDUAddress) - runs on SCCP_CT return SCCP_PAR_Address - { - var SCCP_PAR_Address vl_ASPAddress; - var SCCP_ASPfield_GlobalTitle tmpGT; // the same for itu, ansi and ttc - var SCCP_param_CPartyAddress_ttc vl_PDUAddress; - - //new code detail (ethbaat 2003.11.04: - // decoding from octetstring to structure "SCCP_param_CPartyAddress_itu": - vl_PDUAddress := dec_PDU_SCCP_Address_ttc( pl_PDUAddress.addr ); - - vl_ASPAddress.addressIndicator.pointCodeIndic := - vl_PDUAddress.addressIndicator.pointCodeIndic; - - vl_ASPAddress.addressIndicator.ssnIndicator := - vl_PDUAddress.addressIndicator.ssnIndicator; - - vl_ASPAddress.addressIndicator.globalTitleIndic := - vl_PDUAddress.addressIndicator.globalTitleIndic; - - vl_ASPAddress.addressIndicator.routingIndicator := - vl_PDUAddress.addressIndicator.routingIndicator; - - if (ispresent ( vl_PDUAddress.signPointCode)) { - vl_ASPAddress.signPointCode:= vl_PDUAddress.signPointCode; //old:substr(vl_PDUAddress.signPointCode,2,16); - } - else { - vl_ASPAddress.signPointCode := omit; //ethbaat 2003.11.04 - } - - if (ispresent (vl_PDUAddress.subsystemNumber )) { //always suggested ... - vl_ASPAddress.subsystemNumber:= vl_PDUAddress.subsystemNumber; - } - else { - vl_ASPAddress.subsystemNumber:=omit; //ethbaat 2003.11.04 - } - - if( ispresent( vl_PDUAddress.globalTitle)){ - if (ischosen (vl_PDUAddress.globalTitle.gti0001)) - { - tmpGT.gti0001.natureOfAddress:=vl_PDUAddress.globalTitle.gti0001.natureOfAddress; - tmpGT.gti0001.oddeven:=vl_PDUAddress.globalTitle.gti0001.oddeven; - tmpGT.gti0001.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0001.globalTitleAddress; - vl_ASPAddress.globalTitle:=tmpGT; - } - else if (ischosen (vl_PDUAddress.globalTitle.gti0010)) - { - tmpGT.gti0010.translationType:=vl_PDUAddress.globalTitle.gti0010.translationType; - tmpGT.gti0010.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0010.globalTitleAddress; - vl_ASPAddress.globalTitle:=tmpGT; - } - else if (ischosen (vl_PDUAddress.globalTitle.gti0011)) - { - tmpGT.gti0011.translationType :=vl_PDUAddress.globalTitle.gti0011.translationType; - tmpGT.gti0011.encodingScheme :=vl_PDUAddress.globalTitle.gti0011.encodingScheme; - tmpGT.gti0011.numberingPlan :=vl_PDUAddress.globalTitle.gti0011.numberingPlan; - tmpGT.gti0011.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0011.globalTitleAddress; - vl_ASPAddress.globalTitle :=tmpGT; - } - else if (ischosen (vl_PDUAddress.globalTitle.gti0100)) - { - tmpGT.gti0100.translationType :=vl_PDUAddress.globalTitle.gti0100.translationType; - tmpGT.gti0100.encodingScheme :=vl_PDUAddress.globalTitle.gti0100.encodingScheme; - tmpGT.gti0100.numberingPlan :=vl_PDUAddress.globalTitle.gti0100.numberingPlan; - tmpGT.gti0100.natureOfAddress :=vl_PDUAddress.globalTitle.gti0100.natureOfAddress; - //tmpGT.gti0100.reserved:='00'B; - tmpGT.gti0100.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0100.globalTitleAddress; - vl_ASPAddress.globalTitle :=tmpGT; - }; - } - else - { - vl_ASPAddress.globalTitle:= omit; - }; - - return vl_ASPAddress; - } //ConvertPDUEncodedAddressToASPAddress_ttc - - //****************************************************************** - // function ConvertPDUEncodedAddressToASPAddress_mpt - // converts Encoded PDU Address into sturctured ASP Address - // according to mpt - //****************************************************************** - function ConvertPDUEncodedAddressToASPAddress_mpt( in SCCP_param_CPartyAddressEnc pl_PDUAddress) - runs on SCCP_CT return SCCP_PAR_Address - { - var SCCP_PAR_Address vl_ASPAddress; - var SCCP_ASPfield_GlobalTitle tmpGT; // the same for itu, ansi and ttc - var SCCP_param_CPartyAddress_mpt vl_PDUAddress; - - vl_PDUAddress := dec_PDU_SCCP_Address_mpt( pl_PDUAddress.addr ); - - vl_ASPAddress.addressIndicator.pointCodeIndic := - vl_PDUAddress.addressIndicator.pointCodeIndic; - - vl_ASPAddress.addressIndicator.ssnIndicator := - vl_PDUAddress.addressIndicator.ssnIndicator; - - vl_ASPAddress.addressIndicator.globalTitleIndic := - vl_PDUAddress.addressIndicator.globalTitleIndic; - - vl_ASPAddress.addressIndicator.routingIndicator := - vl_PDUAddress.addressIndicator.routingIndicator; - - if (ispresent ( vl_PDUAddress.signPointCode)) { - vl_ASPAddress.signPointCode:= vl_PDUAddress.signPointCode; - } - else { - vl_ASPAddress.signPointCode := omit; - } - - if (ispresent (vl_PDUAddress.subsystemNumber )) { //always suggested ... - vl_ASPAddress.subsystemNumber:= vl_PDUAddress.subsystemNumber; - } - else { - vl_ASPAddress.subsystemNumber:=omit; - } - - if( ispresent( vl_PDUAddress.globalTitle)){ - if (ischosen (vl_PDUAddress.globalTitle.gti0001)) - { - tmpGT.gti0001.natureOfAddress:=vl_PDUAddress.globalTitle.gti0001.natureOfAddress; - tmpGT.gti0001.oddeven:=vl_PDUAddress.globalTitle.gti0001.oddeven; - tmpGT.gti0001.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0001.globalTitleAddress; - vl_ASPAddress.globalTitle:=tmpGT; - } - else if (ischosen (vl_PDUAddress.globalTitle.gti0010)) - { - tmpGT.gti0010.translationType:=vl_PDUAddress.globalTitle.gti0010.translationType; - tmpGT.gti0010.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0010.globalTitleAddress; - vl_ASPAddress.globalTitle:=tmpGT; - } - else if (ischosen (vl_PDUAddress.globalTitle.gti0011)) - { - tmpGT.gti0011.translationType :=vl_PDUAddress.globalTitle.gti0011.translationType; - tmpGT.gti0011.encodingScheme :=vl_PDUAddress.globalTitle.gti0011.encodingScheme; - tmpGT.gti0011.numberingPlan :=vl_PDUAddress.globalTitle.gti0011.numberingPlan; - tmpGT.gti0011.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0011.globalTitleAddress; - vl_ASPAddress.globalTitle :=tmpGT; - } - else if (ischosen (vl_PDUAddress.globalTitle.gti0100)) - { - tmpGT.gti0100.translationType :=vl_PDUAddress.globalTitle.gti0100.translationType; - tmpGT.gti0100.encodingScheme :=vl_PDUAddress.globalTitle.gti0100.encodingScheme; - tmpGT.gti0100.numberingPlan :=vl_PDUAddress.globalTitle.gti0100.numberingPlan; - tmpGT.gti0100.natureOfAddress :=vl_PDUAddress.globalTitle.gti0100.natureOfAddress; - //tmpGT.gti0100.reserved:='00'B; - tmpGT.gti0100.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0100.globalTitleAddress; - vl_ASPAddress.globalTitle :=tmpGT; - }; - } - else - { - vl_ASPAddress.globalTitle:= omit; - }; - - return vl_ASPAddress; - } //ConvertPDUEncodedAddressToASPAddress_mpt - - //================================================================== - // MAIN CONVERSION FUNCTIONS: - //================================================================== - - //****************************************************************** - // function ConvertASPAddressToEncodedAddress - // converts ASP address structure to PDU address structure - // THIS IS THE MAIN ENCODE FUNCTION (coordinator) - //****************************************************************** - - function ConvertASPAddressToEncodedAddress( in SCCP_PAR_Address pl_ASPAddress) - runs on SCCP_CT return SCCP_param_CPartyAddressEnc - { - var SCCP_param_CPartyAddressEnc vl_PDUAddressEncoded; - if( ( v_SCCPServiceType == mtp3_itu) or - ( v_SCCPServiceType == mtp3b_itu)) - { - return ConvertASPAddressToEncodedAddress_itu( pl_ASPAddress ); - } - else if( (v_SCCPServiceType == mtp3_ansi) or - (v_SCCPServiceType == mtp3b_ansi)) - { - return ConvertASPAddressToEncodedAddress_ansi( pl_ASPAddress ); - } - else if((v_SCCPServiceType == mtp3_ttc) or - (v_SCCPServiceType == mtp3b_ttc)) - { - if( (v_SIO == '83'O) or (v_SIO == '43'O) or (v_SIO == 'C3'O) ) //ttc national - { - return ConvertASPAddressToEncodedAddress_ttc( pl_ASPAddress ); - } - else - { //international == itu - return ConvertASPAddressToEncodedAddress_itu( pl_ASPAddress ); - } - }//if1 - else if((v_SCCPServiceType == mtp3_mpt)) - { - if( v_NI == 2 ) //mpt national - { - return ConvertASPAddressToEncodedAddress_mpt( pl_ASPAddress ); - } - else - { //international == itu - return ConvertASPAddressToEncodedAddress_itu( pl_ASPAddress ); - } - }//if1 - else { - log("Error in ConvertASPAddressToEncodedAddress: Unknown SCCPServiceType"); - stop; - } - return vl_PDUAddressEncoded; // error!!! - } - - //****************************************************************** - // function ConvertPDUEncodedAddressToASPAddress - // converts Encoded PDU Address into sturctured ASP Address - // THIS IS THE MAIN DECODE FUNCTION (coordinator) - //****************************************************************** - - - function ConvertPDUEncodedAddressToASPAddress( in SCCP_param_CPartyAddressEnc pl_PDUAddress) - runs on SCCP_CT return SCCP_PAR_Address - { - var SCCP_PAR_Address vl_dummyretval; - - if( (v_SCCPServiceType == mtp3_itu) or - (v_SCCPServiceType == mtp3b_itu) ) - { - return ConvertPDUEncodedAddressToASPAddress_itu( pl_PDUAddress ); - } - else if( (v_SCCPServiceType == mtp3_ansi) or - (v_SCCPServiceType == mtp3b_ansi) ) - { - return ConvertPDUEncodedAddressToASPAddress_ansi( pl_PDUAddress ); - } - else if( (v_SCCPServiceType == mtp3_ttc) or - (v_SCCPServiceType == mtp3b_ttc)){ - if( (v_SIO == '83'O) or (v_SIO == '43'O) or (v_SIO == 'C3'O) ) - { - //ttc national - return ConvertPDUEncodedAddressToASPAddress_ttc( pl_PDUAddress ); - } - else { - return ConvertPDUEncodedAddressToASPAddress_itu( pl_PDUAddress ); - } - } - else if((v_SCCPServiceType == mtp3_mpt)) - { - if( v_NI == 2 ) //mpt national - { - return ConvertPDUEncodedAddressToASPAddress_mpt( pl_PDUAddress ); - } - else - { //international == itu - return ConvertPDUEncodedAddressToASPAddress_itu( pl_PDUAddress ); - } - } - else { - log("Error in function ConvertPDUEncodedAddressToASPAddress, Unknown SCCPSCCPType"); - stop; - } - return vl_dummyretval; - }//ConvertPDUEncodedAddressToASPAddress -/* -//************************************************************************* -//************************************************************************* -//EncDec ComponentBehaviour -//************************************************************************* -//************************************************************************* - - // TO DO:Desk check it! As I see, it's OK, but the meaning has been changed\ - // because structure of PDU_SCCP has been changed - - //************************************************************************* - function ScanRAWPorts() runs on SCCP_EncDec_CT - //************************************************************************* - { - //local declarations - var ASP_MTP3_TRANSFERind vl_ASP_MTP3_TRANSFERind; - var ASP_MTP3_TRANSFERreq vl_ASP_MTP3_TRANSFERreq; - var ASP_MTP3_TRANSFERreq_sccp vl_ASP_MTP3_TRANSFERreq_sccp - - var PDU_SCCP vl_PDU_SCCP; - var integer vl_msg_type; - - while (true) - { - alt - { - - //******************************************************************** - //message received from SCCP , containing a PDU to be encoded - //******************************************************************** - - []MTP3_SCCP_SP_PORT.receive( tr_ASP_MTP3_TRANSFERreq_sccp) -> value vl_ASP_MTP3_TRANSFERreq_sccp - { - var bitstring vl_sio_bit := oct2bit(vl_ASP_MTP3_TRANSFERreq_sccp.sio); - var MTP3_Field_sio vl_sio_struct; - vl_sio_struct.ni := substr(vl_sio_bit,0,2); - vl_sio_struct.prio := substr(vl_sio_bit,2,2); - vl_sio_struct.si := substr(vl_sio_bit,4,4); - - MTP3_PORT.send(t_ASP_MTP3_TRANSFERreq( - vl_sio_struct, - vl_ASP_MTP3_TRANSFERreq_sccp.opc, - vl_ASP_MTP3_TRANSFERreq_sccp.dpc, - vl_ASP_MTP3_TRANSFERreq_sccp.sls, - enc_PDU_SCCP(vl_ASP_MTP3_TRANSFERreq_sccp.data) - )); - } - - //******************************************************************** - //message received from MTP3 , containing an octetstring to be decoded: - //******************************************************************** - - []MTP3_PORT.receive(tr_ASP_MTP3_TRANSFERind) -> value vl_ASP_MTP3_TRANSFERind - {//startStatementBlock - if (vl_ASP_MTP3_TRANSFERind.sio.si != '0011'B) - { - log("The received message is not SCCP. Ignored."); - repeat; - } - vl_msg_type:= oct2int( vl_ASP_MTP3_TRANSFERind.data[0] ); - - select(vl_msg_type) - { - case (xudt) // '11'O - { - vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); - MTP3_SCCP_SP_PORT.send( vl_PDU_SCCP.extudata ); - } - case (udt) //'09'O - { - //decode octetstring - vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); - - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_Unitdata( - vl_PDU_SCCP.unitdata.protClass, - vl_PDU_SCCP.unitdata.calledPAddress, - vl_PDU_SCCP.unitdata.callingPAddress, - vl_PDU_SCCP.unitdata.data)); - - }//endif - case (dt1)//'06'O - { - vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); - - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_DataForm1( - vl_PDU_SCCP.dataform1.destLocRef, - vl_PDU_SCCP.dataform1.segmentingReassembl, - vl_PDU_SCCP.dataform1.data - )); - } - case (cr) //'01'O - {//startif - vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); - - if (ispresent(vl_PDU_SCCP.connrequest.eop)) - { - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ConnectionRequest( - vl_PDU_SCCP.connrequest.sourceLocRef, - vl_PDU_SCCP.connrequest.protClass, - vl_PDU_SCCP.connrequest.calledPAddress, - vl_PDU_SCCP.connrequest.optionalPart.credit, - vl_PDU_SCCP.connrequest.optionalPart.callingPAddress, - vl_PDU_SCCP.connrequest.optionalPart.data, - vl_PDU_SCCP.connrequest.optionalPart.hopCounter, - vl_PDU_SCCP.connrequest.optionalPart.importance, - vl_PDU_SCCP.connrequest.eop - )); - } - else - { - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ConnectionRequest( - vl_PDU_SCCP.connrequest.sourceLocRef, - vl_PDU_SCCP.connrequest.protClass, - vl_PDU_SCCP.connrequest.calledPAddress, - vl_PDU_SCCP.connrequest.optionalPart.credit, - vl_PDU_SCCP.connrequest.optionalPart.callingPAddress, - vl_PDU_SCCP.connrequest.optionalPart.data, - vl_PDU_SCCP.connrequest.optionalPart.hopCounter, - vl_PDU_SCCP.connrequest.optionalPart.importance, - omit - )); - } - - } - case (cc) //'02'O - { - vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); - - if (ispresent(vl_PDU_SCCP.connconfirm.eop)) - { - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ConnectionConfirm( - vl_PDU_SCCP.connconfirm.destLocRef, - vl_PDU_SCCP.connconfirm.sourceLocRef, - vl_PDU_SCCP.connconfirm.protClass, - vl_PDU_SCCP.connconfirm.optionalPart.credit, - vl_PDU_SCCP.connconfirm.optionalPart.calledPAddress, - vl_PDU_SCCP.connconfirm.optionalPart.data, - vl_PDU_SCCP.connconfirm.optionalPart.importance, - vl_PDU_SCCP.connconfirm.eop )); - } - else - { - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ConnectionConfirm( - vl_PDU_SCCP.connconfirm.destLocRef, - vl_PDU_SCCP.connconfirm.sourceLocRef, - vl_PDU_SCCP.connconfirm.protClass, - vl_PDU_SCCP.connconfirm.optionalPart.credit, - vl_PDU_SCCP.connconfirm.optionalPart.calledPAddress, - vl_PDU_SCCP.connconfirm.optionalPart.data, - vl_PDU_SCCP.connconfirm.optionalPart.importance, - omit)); - } - - } - case (udts) //'0A'O - {//startif - vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); - - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_UnitdataService( - vl_PDU_SCCP.udataserv.returnCause, - vl_PDU_SCCP.udataserv.calledPAddress, - vl_PDU_SCCP.udataserv.callingPAddress, - vl_PDU_SCCP.udataserv.data)); - - }//endif - case (rlsd) //'04'O - { - vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); - - if (ispresent(vl_PDU_SCCP.released.eop)) - { - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_Released( - vl_PDU_SCCP.released.destLocRef, - vl_PDU_SCCP.released.sourceLocRef, - vl_PDU_SCCP.released.releaseCause, - vl_PDU_SCCP.released.optionalPart.data, - vl_PDU_SCCP.released.optionalPart.importance, - vl_PDU_SCCP.released.eop - )); - } - else - { - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_Released( - vl_PDU_SCCP.released.destLocRef, - vl_PDU_SCCP.released.sourceLocRef, - vl_PDU_SCCP.released.releaseCause, - vl_PDU_SCCP.released.optionalPart.data, - vl_PDU_SCCP.released.optionalPart.importance, - omit - )); - } - - } - case (err)//'0F'O - { - vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); - - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ProtDataUnitError( - vl_PDU_SCCP.pduerror.destLocRef, - vl_PDU_SCCP.pduerror.errorCause - )); - } - case (rlc)//'05'O - { - vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); - - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ReleaseComplete( - vl_PDU_SCCP.relcomp.destLocRef, - vl_PDU_SCCP.relcomp.sourceLocRef - )); - } - case (it)//'10'O - { - vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); - - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_InactivityTest( - vl_PDU_SCCP.inacttest.destLocRef, - vl_PDU_SCCP.inacttest.sourceLocRef, - vl_PDU_SCCP.inacttest.protClass, - vl_PDU_SCCP.inacttest.sequencingSegmenting, - vl_PDU_SCCP.inacttest.credit - )); - } - case (rsr)//'0D'O - { - vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); - - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ResetRequest( - vl_PDU_SCCP.resetreq.destLocRef, - vl_PDU_SCCP.resetreq.sourceLocRef, - vl_PDU_SCCP.resetreq.resetCause - )); - } - case (rsc)//'0E'O - { - - vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); - - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ResetConfirm( - vl_PDU_SCCP.resconf.destLocRef, - vl_PDU_SCCP.resconf.sourceLocRef - )); - }//endif - case (cref)//'03'O - { - vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); - - if (ispresent(vl_PDU_SCCP.connrefused.eop)) - { - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ConnectionRefused( - vl_PDU_SCCP.connrefused.destLocRef, - vl_PDU_SCCP.connrefused.refusalCause, - vl_PDU_SCCP.connrefused.optionalPart.calledPAddress, - vl_PDU_SCCP.connrefused.optionalPart.data, - vl_PDU_SCCP.connrefused.optionalPart.importance, - vl_PDU_SCCP.connrefused.eop - )); - } - else - { - MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ConnectionRefused( - vl_PDU_SCCP.connrefused.destLocRef, - vl_PDU_SCCP.connrefused.refusalCause, - vl_PDU_SCCP.connrefused.optionalPart.calledPAddress, - vl_PDU_SCCP.connrefused.optionalPart.data, - vl_PDU_SCCP.connrefused.optionalPart.importance, - omit - )); - } - } - case (xudts,ludt,ludts) - { - log ("Unsupported connectionless message ((-XUDT or)) XUDTS or LUDT or LUDTS - received and discarded"); - } - case (dt2,ak,ed,ea ) - { - log ("Unsupported connection-oriented message -DT2 or AK or ED or EA - received and discarded"); - } - case else { log ("Unrecognized message received and discarded"); } - } - }//endStatementBlock - - }//endalt - - }//endwhile - - }//endfunction -*/ - -//****************************************************************** -// -// working functions for ScanEvents -// -//****************************************************************** - -//****************************************************************** -// Part 1 : Receiving msg on port "MTP3_SCCP_PORT" -//****************************************************************** - - - //****************************************************************** - // processing_PDU_SCCP_Unitdata - //****************************************************************** - function processing_PDU_SCCP_Unitdata( in PDU_SCCP_Unitdata pl_PDU_SCCP_Unitdata) - runs on SCCP_CT - { - //var PDU_SCCP_Unitdata vl_PDU_SCCP_Unitdata; - var PDU_SCCP vl_PDU_SCCP; - var ASP_SCCP_N_UNITDATA_ind vl_N_UNITDATA_ind; - - vl_PDU_SCCP.unitdata:= pl_PDU_SCCP_Unitdata; - - // it should be decoded to structure to read if it is a mgmt message or not - vl_N_UNITDATA_ind.calledAddress := - ConvertPDUEncodedAddressToASPAddress(pl_PDU_SCCP_Unitdata.calledPAddress); - - if ( ispresent(vl_N_UNITDATA_ind.calledAddress.subsystemNumber) and - vl_N_UNITDATA_ind.calledAddress.subsystemNumber != cg_SSN_sCCPmanagement) - //SCCP mgmt message - {//startif1 - - //no SCCP or node congestion assumed - //'route on SSN' assumed - - //subsystems are assumed equipped and available - //as the message is received from MTP3 , DPC is assumed to be matching the PC of the own node without - // any further checks - - //assemble ASP_SCCP_N_ - vl_N_UNITDATA_ind.callingAddress:= - ConvertPDUEncodedAddressToASPAddress(pl_PDU_SCCP_Unitdata.callingPAddress); - - // Wrong old: - //vl_N_UNITDATA_ind.sequenceControl:= - // '0000000'B&pl_PDU_SCCP_Unitdata.protClass.class[0]; // Q.713/3.6 0.bit=1=>seq msb??? - - vl_N_UNITDATA_ind.sequenceControl:= - '0000000'B&pl_PDU_SCCP_Unitdata.protClass.class[3]; - - if( pl_PDU_SCCP_Unitdata.protClass.messageHandling == '1000'B ) - { vl_N_UNITDATA_ind.returnOption := '00000001'B; } - else - { vl_N_UNITDATA_ind.returnOption := '00000000'B; } - - //connectionless-class 0 or 1 - //protocol class 0- SCCP_sequence_ctrl_off - //protocol class 1- SCCP_sequence_ctrl_on - // wrong: vl_N_UNITDATA_ind.returnOption :='0000000'B&pl_PDU_SCCP_Unitdata.protClass.messageHandling[3]; - - //only two values( '0000'B -no special options - //and '1000'B -return message on error) assumed - //octetstring vs. length+octetstring - vl_N_UNITDATA_ind.userData :=pl_PDU_SCCP_Unitdata.data.data; - vl_N_UNITDATA_ind.importance := omit; - SCCP_SP_PORT.send( vl_N_UNITDATA_ind ); - - - }//endif1 - else { //startelse1-SCCPmanagement message - - log ("SCCP management message received"); - var octetstring vl_data; - vl_data:=pl_PDU_SCCP_Unitdata.data.data; - - vl_PDU_SCCP.unitdata.messageType:=udt ; - vl_PDU_SCCP.unitdata.calledPAddress:=pl_PDU_SCCP_Unitdata.callingPAddress; - vl_PDU_SCCP.unitdata.callingPAddress:=pl_PDU_SCCP_Unitdata.calledPAddress; - - if ((vl_data[0]=='03'O) and //SST message - ((v_SSN==0) or (oct2int(vl_data[1])==v_SSN))) //right SSN - {//startif2 - - //send Unitdata with SSA - vl_PDU_SCCP.unitdata.data.data[0]:='01'O;//Change to SSA - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Unitdata_SSA - - }//endif2 - else if ((vl_data[0]=='02'O) and //SSP message - ((v_SSN==0) or (oct2int(vl_data[1])==v_SSN))) //right SSN - {//startif2 - - //send Unitdata with SST - vl_PDU_SCCP.unitdata.data.data[0]:='03'O;//Change to SST - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Unitdata_SST - - }//endif2 - else if ((vl_data[0]=='01'O) and //SSA message - ((v_SSN==0) or (oct2int(vl_data[1])==v_SSN))) //right SSN - {//startif2 - - //send Unitdata with SS - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP ));//send Unitdata_SSA - - }//endif2 - else - { - log("Unsupported (or containing inconsistent SSN)SCCP management message received and discarded") - } - }//endelse1 - return; - } // processing_PDU_SCCP_Unitdata() - - //****************************************************************** - // processing_PDU_SCCP_UnitdataService - //****************************************************************** - function processing_PDU_SCCP_UnitdataService( in PDU_SCCP_UnitdataService pl_PDU_SCCP_UnitdataService ) - runs on SCCP_CT - { - - var ASP_SCCP_N_NOTICE_ind vl_N_NOTICE_ind; - - //no SCCP or node congestion assumed - //'route on SSN' assumed - - //subsystems are assumed equipped and available - //as the message is received from MTP3 , DPC is assumed to be the PC of the own node without - // any further checks - - //assemble ASP_SCCP_N_ - - vl_N_NOTICE_ind.calledAddress :=ConvertPDUEncodedAddressToASPAddress(pl_PDU_SCCP_UnitdataService.calledPAddress ); - vl_N_NOTICE_ind.callingAddress:=ConvertPDUEncodedAddressToASPAddress(pl_PDU_SCCP_UnitdataService.callingPAddress); - //one to one mapping between reasonForReturn and returnCause -Q713 A5 - vl_N_NOTICE_ind.reasonForReturn := pl_PDU_SCCP_UnitdataService.returnCause ; - vl_N_NOTICE_ind.userData := pl_PDU_SCCP_UnitdataService.data.data ; - - SCCP_SP_PORT.send( t_ASP_N_NOTICE_ind( - vl_N_NOTICE_ind.calledAddress , - vl_N_NOTICE_ind.callingAddress, - vl_N_NOTICE_ind.reasonForReturn, - vl_N_NOTICE_ind.userData , - omit)); - - }// processing_PDU_SCCP_UnitdataService - - - //****************************************************************** - // processing_PDU_SCCP_ConnectionRequest - //****************************************************************** - function processing_PDU_SCCP_ConnectionRequest( in PDU_SCCP_ConnectionRequest pl_PDU_SCCP_ConnectionRequest) - runs on SCCP_CT - { - //no SCCP or node congestion assumed - //we assume that routing is done on SSN; we are in the dest.node - //SS is equipped and available - - //check if connection already established - //local reference not assigned yet; search has to be done based on remote reference, - // to prevent erroneous situations - //for all other MTP3_ASPs, search is done based on destLocRef, containing the local - //reference sent to the neighbouring node - - if (ConnectionAlreadyEstablished_remote(pl_PDU_SCCP_ConnectionRequest.sourceLocRef)) - {//startif3 - v_session :=Retrieve_session_remote(pl_PDU_SCCP_ConnectionRequest.sourceLocRef); - //Action Table follows - - if (ConnectionTable[v_session].state==idle) - { log("CR received with reference for an already established conn. in state:idle");}//no source ref known - else if (ConnectionTable[v_session].state==active) - { log("CR received with reference for an already established conn. in state:active");} - else if (ConnectionTable[v_session].state==reset_bothway) - { log("CR received with reference for an already established conn. in state:reset_bothway");} - else if (ConnectionTable[v_session].state==connection_pending_IC) - { log("CR received with reference for an already established conn. in state:connection_pending_IC");} - //discard message, return - else if (ConnectionTable[v_session].state==disconnect_pending) - { log("CR received with reference for an already established conn. in state:disconnect_pending");}//discard message, return - else if (ConnectionTable[v_session].state==reset_IC) {//startif4 - //discard received message - f_StartTimer(internal_reset,v_session,0.0);//the dummy timer times out immediately - //state changed to active - ConnectionTable[v_session].state:=active; - - }//endif4 - else if (ConnectionTable[v_session].state==wait_conn_confirm) - {//startif4 - //stop connection timer - f_StopTimer(conn_est,v_session); - //release resources - ReleaseResources(v_session); - }//endif4 - }//endif3 - else {//startelse - - //************************************************************************* - //connection not yet established - new v_session - //check if resources available - v_session:=CheckIdleIndividuals() - - //idle individual found , resources available, 0<=v_session<=15 - if ( v_session!=-1 ) - {//startif3 - // - ConnectionTable[v_session].localReference := GenerateLocalReference(); - ConnectionTable[v_session].remoteReference:= pl_PDU_SCCP_ConnectionRequest.sourceLocRef; - //local reference assigned here!!(see Fig. C.3/Q714) - - ConnectionTable[v_session].connectionId := GenerateConnectionId(); - - //once local reference is assigned , a session is considered established - //determine protocol class - //assemble ASP_SCCP_N_ - //start guard timer T_guard ;if no answer to ASP_SCCP_N_CONNECT_ind is received, timer will release - - var ASP_SCCP_N_CONNECT_ind vl_N_CONNECT_ind; - f_StartTimer(t_guard,v_session); - - vl_N_CONNECT_ind.calledAddress:=ConvertPDUEncodedAddressToASPAddress(pl_PDU_SCCP_ConnectionRequest.calledPAddress); - - if (ispresent(pl_PDU_SCCP_ConnectionRequest.optionalPart)) - { - if (ispresent(pl_PDU_SCCP_ConnectionRequest.optionalPart.callingPAddress)) - {//startif4 - - //temporary variable to avoid type conversion problems - var SCCP_param_CPartyAddressEnc vl_PDUAddress; - vl_PDUAddress.addr := pl_PDU_SCCP_ConnectionRequest.optionalPart.callingPAddress.addr; - vl_PDUAddress.paramLength := pl_PDU_SCCP_ConnectionRequest.optionalPart.callingPAddress.paramLength; - vl_N_CONNECT_ind.callingAddress:= ConvertPDUEncodedAddressToASPAddress(vl_PDUAddress); - - }//endif4 - else {vl_N_CONNECT_ind.callingAddress:=omit} - - if (ispresent(pl_PDU_SCCP_ConnectionRequest.optionalPart.data)) - {//startif4 - //temporary variable to avoid type conversion problems - var SCCP_param_Data_opt vl_SCCP_param_Data_opt; - - vl_SCCP_param_Data_opt:=pl_PDU_SCCP_ConnectionRequest.optionalPart.data; - vl_N_CONNECT_ind.userData:=vl_SCCP_param_Data_opt.data; - - }//endif4 - else {vl_N_CONNECT_ind.userData:=omit} - } - else - { - vl_N_CONNECT_ind.callingAddress:=omit; - vl_N_CONNECT_ind.userData:=omit; - } - - vl_N_CONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_CONNECT_ind( - vl_N_CONNECT_ind.calledAddress, - vl_N_CONNECT_ind.callingAddress, - omit, - vl_N_CONNECT_ind.userData, //ethcky - vl_N_CONNECT_ind.connectionId, - omit));//send ASP_SCCP_N_CONNECT_ind - - //restart send inactivity timer (baat) - f_StopTimer(ias,v_session);//to avoid warnings - f_StartTimer(ias,v_session); - ConnectionTable[v_session].state:=connection_pending_IC; - - }//endif3 - - //no idle individual found , no resources available , v_session=-1 - if (v_session==-1) - {//startif3 - - var PDU_SCCP vl_PDU_SCCP; - //assemble and route MTP3 ASP - vl_PDU_SCCP.connrefused.messageType:=cref; - vl_PDU_SCCP.connrefused.destLocRef:=pl_PDU_SCCP_ConnectionRequest.sourceLocRef; - vl_PDU_SCCP.connrefused.refusalCause:=1;//End user congestion - vl_PDU_SCCP.connrefused.pointer1:=0;// No options - vl_PDU_SCCP.connrefused.optionalPart:=omit; - vl_PDU_SCCP.connrefused.eop:=omit; - MTP3_SCCP_PORT.send ( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Connection refused, no idle individuals - //return to idle - }//endif3 - }//endelse - - }//processing_PDU_SCCP_ConnectionRequest - -//****************************************************************** -// processing_PDU_SCCP_ConnectionConfirm -//****************************************************************** - function processing_PDU_SCCP_ConnectionConfirm( in PDU_SCCP_ConnectionConfirm pl_PDU_SCCP_ConnectionConfirm) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - var ASP_SCCP_N_CONNECT_cfm vl_N_CONNECT_cfm; - - log(pl_PDU_SCCP_ConnectionConfirm); - - //Store data parameter - var template SCCP_PAR_UserData tl_data := omit; - if (ispresent(pl_PDU_SCCP_ConnectionConfirm.optionalPart)) - { - if (ispresent(pl_PDU_SCCP_ConnectionConfirm.optionalPart.data)) - { - tl_data := pl_PDU_SCCP_ConnectionConfirm.optionalPart.data.data; - } - } - - //check if connection already established - if (ConnectionAlreadyEstablished(pl_PDU_SCCP_ConnectionConfirm.destLocRef)) - {//startif2 - v_session :=Retrieve_session(pl_PDU_SCCP_ConnectionConfirm.destLocRef); - //Action Table follows - if (ConnectionTable[v_session].state==idle) - { - //assemble and route MTP3_ASP - - vl_PDU_SCCP.pduerror.messageType:=err; - vl_PDU_SCCP.pduerror.destLocRef:=ConnectionTable[v_session].remoteReference; - vl_PDU_SCCP.pduerror.errorCause:=cg_Err_unassignedDestinationLRN; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error - //then return to idle - } - else if (ConnectionTable[v_session].state==connection_pending_IC) - { log("CC received in state:connection_pending_IC"); }//discard message, return - else if (ConnectionTable[v_session].state==disconnect_pending) - { log("CC received in state:disconnect_pending"); }//discard message, return - else if (ConnectionTable[v_session].state==active) - { log("CC received in state:active"); }//do nothing, return - else if (ConnectionTable[v_session].state==reset_bothway) - { log("CC received in state:reset_bothway"); }// - else if (ConnectionTable[v_session].state==connection_pending_OG) - {//startif3 - //stop connection timer - f_StopTimer(conn_est,v_session); - //start inactivity timers - f_StartTimer(ias,v_session); - f_StartTimer(iar,v_session); - //assign protocol class:=2, associate remote reference - ConnectionTable[v_session].remoteReference:=pl_PDU_SCCP_ConnectionConfirm.sourceLocRef; - //assemble ASP_SCCP_N_ - vl_N_CONNECT_cfm.connectionId:=ConnectionTable[v_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_CONNECT_cfm( - omit, - omit, - tl_data, - vl_N_CONNECT_cfm.connectionId, - omit - ));//send ASP_SCCP_N_CONNECT_confirm - - ConnectionTable[v_session].state:=active; - }//endif3 - else if (ConnectionTable[v_session].state==wait_conn_confirm)//connection is confirmed , - // but it has meanwhile been disconnected by the user - {//startif3 - //stop connection timer - f_StopTimer(conn_est,v_session); - //associate remote reference to connection - ConnectionTable[v_session].remoteReference:=pl_PDU_SCCP_ConnectionConfirm.sourceLocRef; - //assemble and route MTP3_ASP - vl_PDU_SCCP.released.messageType:=rlsd; - vl_PDU_SCCP.released.destLocRef:=ConnectionTable[v_session].remoteReference; - vl_PDU_SCCP.released.sourceLocRef:=ConnectionTable[v_session].localReference; - vl_PDU_SCCP.released.releaseCause:=cg_DISC_normal; - vl_PDU_SCCP.released.pointer1:=0;//No options - vl_PDU_SCCP.released.optionalPart:=omit; - vl_PDU_SCCP.released.eop:=omit; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Released - //start release timer - f_StartTimer(rel,v_session); - ConnectionTable[v_session].state:=disconnect_pending; - }//endif3 - else if (ConnectionTable[v_session].state==reset_IC) - {//startif3 - //discard received message - f_StartTimer(internal_reset,v_session,0.0);//the timer times out immediately - //state changed to active - ConnectionTable[v_session].state:=active; - - }//endif3 - else { log("CC received in an unexpected state"); } - }//endif2 - else {//startelse -Connection confirm received with destLocRef not in ConnectionTable - //send ERR - - vl_PDU_SCCP.pduerror.messageType:=err; - vl_PDU_SCCP.pduerror.destLocRef:=pl_PDU_SCCP_ConnectionConfirm.sourceLocRef; - vl_PDU_SCCP.pduerror.errorCause:=cg_Err_unassignedDestinationLRN; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error - }//endelse - - }//processing_PDU_SCCP_ConnectionConfirm - - //****************************************************************** - // processing_PDU_SCCP_Released - //****************************************************************** - function processing_PDU_SCCP_Released( in PDU_SCCP_Released pl_PDU_SCCP_Released) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - - //Store data parameter - var template SCCP_PAR_UserData tl_data := omit; - if (ispresent(pl_PDU_SCCP_Released.optionalPart)) - { - if (ispresent(pl_PDU_SCCP_Released.optionalPart.data)) - { - tl_data := pl_PDU_SCCP_Released.optionalPart.data.data; - } - } - - //check if connection already established - if (ConnectionAlreadyEstablished(pl_PDU_SCCP_Released.destLocRef)) - {//startif1 - v_session :=Retrieve_session(pl_PDU_SCCP_Released.destLocRef); - //check if remote reference is correct -Table B.2 /Q.714 - if (ConnectionTable[v_session].remoteReference==pl_PDU_SCCP_Released.sourceLocRef) - {//startif2 - //Action Table follows - if (ConnectionTable[v_session].state==idle)//C.3- 1/6 ????nem valoszinu hogy ez eloallhat - {//startif3 - - //assemble and route MTP3_ASP - vl_PDU_SCCP.relcomp.messageType:=rlc; - vl_PDU_SCCP.relcomp.destLocRef:=ConnectionTable[v_session].remoteReference; - vl_PDU_SCCP.relcomp.sourceLocRef:=ConnectionTable[v_session].localReference; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Release complete - //then return to idle - }//endif3 - else if (ConnectionTable[v_session].state==connection_pending_IC) - { log("RLSD received in state:connection_pending_IC");}//discard message, return - else if (ConnectionTable[v_session].state==disconnect_pending) - { log("RLSD received in state:disconnect_pending");}//discard message, return - else if (ConnectionTable[v_session].state==active) - {//startif3 - //assemble ASP_SCCP_N_ - vl_N_DISCONNECT_ind.originator:=cg_Mapping_RelCause_Orig[pl_PDU_SCCP_Released.releaseCause]; - vl_N_DISCONNECT_ind.reason:=cg_Mapping_RelCause_Reason[pl_PDU_SCCP_Released.releaseCause]; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - tl_data, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - //assemble and route MTP3_ASP - - vl_PDU_SCCP.relcomp.messageType :=rlc; - vl_PDU_SCCP.relcomp.destLocRef :=pl_PDU_SCCP_Released.sourceLocRef; - vl_PDU_SCCP.relcomp.sourceLocRef:=pl_PDU_SCCP_Released.destLocRef; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Release complete - - //release resources - ReleaseResources(v_session); - }//endif3 - else if (ConnectionTable[v_session].state==connection_pending_OG) - {//startif3 - //assemble and route MTP3_ASP - vl_PDU_SCCP.relcomp.messageType :=rlc; - vl_PDU_SCCP.relcomp.destLocRef :=pl_PDU_SCCP_Released.sourceLocRef; - vl_PDU_SCCP.relcomp.sourceLocRef:=pl_PDU_SCCP_Released.destLocRef; - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Release complete - - //stop connection timer - f_StopTimer(conn_est,v_session); - //assemble ASP_SCCP_N_ - - vl_N_DISCONNECT_ind.originator :=cg_Mapping_RelCause_Orig[pl_PDU_SCCP_Released.releaseCause]; - vl_N_DISCONNECT_ind.reason :=cg_Mapping_RelCause_Reason[pl_PDU_SCCP_Released.releaseCause]; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - tl_data, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - //release resources - ReleaseResources(v_session); - - }//endif3 - else if (ConnectionTable[v_session].state==wait_conn_confirm) - {//startif3 - //assemble and route MTP3_ASP - vl_PDU_SCCP.relcomp.messageType :=rlc; - vl_PDU_SCCP.relcomp.destLocRef :=pl_PDU_SCCP_Released.sourceLocRef; - vl_PDU_SCCP.relcomp.sourceLocRef :=pl_PDU_SCCP_Released.destLocRef; - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Release complete - //stop connection timer - f_StopTimer(conn_est,v_session); - //release resources - ReleaseResources(v_session); - }//endif3 - else if (ConnectionTable[v_session].state==reset_IC) - {//startif3 - //assemble ASP_SCCP_N_ - vl_N_DISCONNECT_ind.originator:=cg_Mapping_RelCause_Orig[pl_PDU_SCCP_Released.releaseCause]; - vl_N_DISCONNECT_ind.reason :=cg_Mapping_RelCause_Reason[pl_PDU_SCCP_Released.releaseCause]; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - tl_data, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - - //release resources, stop inactivity timers, change state to idle - ReleaseResources(v_session); - }//endif3 - else if (ConnectionTable[v_session].state==reset_bothway) - {//startif3 - //assemble ASP_SCCP_N_ - - vl_N_DISCONNECT_ind.originator:=cg_Mapping_RelCause_Orig[pl_PDU_SCCP_Released.releaseCause]; - vl_N_DISCONNECT_ind.reason :=cg_Mapping_RelCause_Reason[pl_PDU_SCCP_Released.releaseCause]; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - tl_data, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - - //release resources, stop inactivity timers, change state to idle - ReleaseResources(v_session); - - }//endif3 - else { log("RLSD received in an unexpected state"); } - }//endif2 - else {//remote reference inconsistent, error action follows - - vl_PDU_SCCP.pduerror.messageType:=err; - vl_PDU_SCCP.pduerror.destLocRef :=pl_PDU_SCCP_Released.sourceLocRef; - vl_PDU_SCCP.pduerror.errorCause :=cg_Err_inconsistentSourceLRN; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error - }//endelse - }//endif1 - else {//Released(Y,X) received with destLocRef not in ConnectionTable - //send RLC(X,Y) - - vl_PDU_SCCP.relcomp.messageType :=rlc; - vl_PDU_SCCP.relcomp.destLocRef :=pl_PDU_SCCP_Released.sourceLocRef; - vl_PDU_SCCP.relcomp.sourceLocRef:=pl_PDU_SCCP_Released.destLocRef; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Release complete - - }//endelse - }//processing_PDU_SCCP_Released - - //****************************************************************** - // processing_PDU_SCCP_ProtDataUnitError - //****************************************************************** - function processing_PDU_SCCP_ProtDataUnitError( in PDU_SCCP_ProtDataUnitError pl_PDU_SCCP_ProtDataUnitError) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - - //check if connection already established - if (ConnectionAlreadyEstablished(pl_PDU_SCCP_ProtDataUnitError.destLocRef)) - {//startif2 - v_session :=Retrieve_session(pl_PDU_SCCP_ProtDataUnitError.destLocRef); - //Action Table follows - - if (ConnectionTable[v_session].state==idle) - {//startif3 - //assemble and route MTP3_ASP - - vl_PDU_SCCP.pduerror.messageType:=err; - vl_PDU_SCCP.pduerror.destLocRef:=ConnectionTable[v_session].remoteReference; - vl_PDU_SCCP.pduerror.errorCause:=cg_Err_unassignedDestinationLRN; - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error - //then return to idle - - }//endif3 - else if (ConnectionTable[v_session].state==disconnect_pending) - { log("PDUError received in state:disconnect_pending ");}//discard message, return - else if (ConnectionTable[v_session].state==connection_pending_IC) - { log("PDUError received in state:connection_pending_IC ");}//discard message, return - else if (ConnectionTable[v_session].state==reset_bothway) - {//startif3 - //assemble ASP_SCCP_N_ - vl_N_DISCONNECT_ind.originator :=cg_Undefined; - vl_N_DISCONNECT_ind.reason :=pl_PDU_SCCP_ProtDataUnitError.errorCause;//? - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - - //release resources, stop inactivity timers, change state to idle - ReleaseResources(v_session); - }//endif3 - else if (ConnectionTable[v_session].state==active) - {//startif3 - if (pl_PDU_SCCP_ProtDataUnitError.errorCause!=cg_Err_serviceClassMismatch) - {//startif4 - - //assemble ASP_SCCP_N_ - vl_N_DISCONNECT_ind.originator:=cg_Undefined; - vl_N_DISCONNECT_ind.reason:=pl_PDU_SCCP_ProtDataUnitError.errorCause;//? - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - //release resources - ReleaseResources(v_session); - - }//endif4 - else {//startelse -Service class mismatch - - //assemble ASP_SCCP_N_ - - vl_N_DISCONNECT_ind.originator :=cg_Undefined; - vl_N_DISCONNECT_ind.reason :=pl_PDU_SCCP_ProtDataUnitError.errorCause; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - - //stop inactivity timers - f_StopTimer(iar,v_session); - f_StopTimer(ias,v_session); - //send Released - //assemble and route MTP3_ASP - - vl_PDU_SCCP.released.messageType:=rlsd; - vl_PDU_SCCP.released.destLocRef:=ConnectionTable[v_session].remoteReference; - vl_PDU_SCCP.released.sourceLocRef:=ConnectionTable[v_session].localReference; - vl_PDU_SCCP.released.releaseCause:=cg_Rel_inconsConnData; - vl_PDU_SCCP.released.pointer1:=0;//No optional part - vl_PDU_SCCP.released.optionalPart:=omit; - vl_PDU_SCCP.released.eop:=omit; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Released - - //start release timer - f_StartTimer(rel,v_session); - //change state to diconnect pending - ConnectionTable[v_session].state:=disconnect_pending; - - }//endelse - - }//endif3 - else if (ConnectionTable[v_session].state==connection_pending_OG) - {//startif3 - //stop connection timer - f_StopTimer(conn_est,v_session); - //assemble ASP_SCCP_N_ - - vl_N_DISCONNECT_ind.originator :=cg_Undefined; - vl_N_DISCONNECT_ind.reason :=pl_PDU_SCCP_ProtDataUnitError.errorCause; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - //release resources - ReleaseResources(v_session); - }//endif3 - else if (ConnectionTable[v_session].state==wait_conn_confirm) - {//startif3 - - //stop connection timer - f_StopTimer(conn_est,v_session); - //release resources - ReleaseResources(v_session); - - - }//endif3 - else if (ConnectionTable[v_session].state==reset_IC) - {//startif3 - //assemble ASP_SCCP_N_ - vl_N_DISCONNECT_ind.originator:=cg_Undefined; - vl_N_DISCONNECT_ind.reason:=pl_PDU_SCCP_ProtDataUnitError.errorCause; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - - //release resources, stop inactivity timers, change state to idle - ReleaseResources(v_session); - - }//endif3 - else { log("PDUError received in an unexpected state"); } - }//endif2 - else {}//PDU_Error received with destLocRef not in ConnectionTable - - }//processing_PDU_SCCP_ProtDataUnitError - - //****************************************************************** - // processing_PDU_SCCP_ReleaseComplete - //****************************************************************** - function processing_PDU_SCCP_ReleaseComplete(in PDU_SCCP_ReleaseComplete pl_PDU_SCCP_ReleaseComplete) - runs on SCCP_CT - { - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - - //check if connection already established - if (ConnectionAlreadyEstablished(pl_PDU_SCCP_ReleaseComplete.destLocRef)) - {//startif1 - - v_session :=Retrieve_session(pl_PDU_SCCP_ReleaseComplete.destLocRef); - //check if remote reference is correct -Table B.2 /Q.714 - if (ConnectionTable[v_session].remoteReference==pl_PDU_SCCP_ReleaseComplete.sourceLocRef) - {//startif2 - - //Action Table follows - if (ConnectionTable[v_session].state==idle) - { log("RLC received in state: idle"); }//C.3 1/6-do nothing-return to idle state - else if (ConnectionTable[v_session].state==connection_pending_IC) - { log("RLC received in state: connection_pending_IC"); }//discard message, return - else if (ConnectionTable[v_session].state==active) - { log("RLC received in state: active"); }//do nothing, return - else if (ConnectionTable[v_session].state==reset_bothway) - { log("RLC received in state:reset_bothway "); }// - else if (ConnectionTable[v_session].state==disconnect_pending) - {//startif3 - log("RLC received in state:disconnect_pending "); - //log("release resources"); - ReleaseResources(v_session); - }//endif3 - else if (ConnectionTable[v_session].state==connection_pending_OG) - {//startif3 - f_StopTimer(conn_est,v_session); - //assemble ASP_SCCP_N_ - vl_N_DISCONNECT_ind.originator:=cg_NSU; - vl_N_DISCONNECT_ind.reason:=cg_DISC_normal; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - //release resources - ReleaseResources(v_session); - }//endif3 - else if (ConnectionTable[v_session].state==wait_conn_confirm) - {//startif3 - log("RLC received in state:wait_conn_confirm"); - //stop connection timer - f_StopTimer(conn_est,v_session); - //release resources - ReleaseResources(v_session); - }//endif3 - else if (ConnectionTable[v_session].state==reset_IC) - {//startif3 - log("RLC received in state:reset_IC"); - //discard received message - f_StartTimer(internal_reset,v_session,0.0);//the timer times out immediately - //state changed to active - ConnectionTable[v_session].state:=active; - }//endif3 - else { log("RLC received in an unexpected state"); } - - }//endif2 - else {}//remote reference inconsistent, discard - - }//endif1 - else {}//Release complete received with destLocRef not in ConnectionTable - //discard - - }//processing_PDU_SCCP_ReleaseComplete - - //****************************************************************** - // processing_PDU_SCCP_InactivityTest - //****************************************************************** - function processing_PDU_SCCP_InactivityTest( in PDU_SCCP_InactivityTest pl_PDU_SCCP_InactivityTest) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - - //check if connection already established - if (ConnectionAlreadyEstablished(pl_PDU_SCCP_InactivityTest.destLocRef)) - {//startif1 - v_session :=Retrieve_session(pl_PDU_SCCP_InactivityTest.destLocRef); - - //check if remote reference is correct -Table B.2 /Q.714 - if (ConnectionTable[v_session].remoteReference==pl_PDU_SCCP_InactivityTest.sourceLocRef) - {//startif2 - - //Action Table follows - if (ConnectionTable[v_session].state==idle) - { log("IT received in state :idle "); }//C.3 1/6-do nothing-return to idle state - else if (ConnectionTable[v_session].state==connection_pending_IC) - { log("IT received in state : connection_pending_IC"); }//discard message, return - else if (ConnectionTable[v_session].state==connection_pending_OG) - {//startif3 - - //stop connection timer - f_StopTimer(conn_est,v_session); - //assemble ASP_SCCP_N_ - vl_N_DISCONNECT_ind.originator := cg_NSU; - vl_N_DISCONNECT_ind.reason := cg_DISC_normal; - vl_N_DISCONNECT_ind.connectionId := ConnectionTable[v_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - //release resources - ReleaseResources(v_session); - - }//endif3 - else if (ConnectionTable[v_session].state==disconnect_pending) {} - else if (ConnectionTable[v_session].state==reset_bothway) {}// - else if (ConnectionTable[v_session].state==active) - {//startif3 - //source reference number assumed OK - //or: - //if (ConnectionTable[v_session].remoteReference!=pl_PDU_SCCP_InactivityTest.sourceLocRef) - // release connection - //protocol class assumed 2 - //restart receive inactivity timer - f_StopTimer(iar,v_session);//to avoid warnings - f_StartTimer(iar,v_session); - }//endif3 - else if (ConnectionTable[v_session].state==reset_IC) - {//startif3 - //discard received message - f_StartTimer(internal_reset,v_session,0.0);//the timer times out immediately - //state changed to active - ConnectionTable[v_session].state:=active; - }//endif3 - else if (ConnectionTable[v_session].state==wait_conn_confirm) - {//startif3 - - //stop connection timer - f_StopTimer(conn_est,v_session); - //release resources - ReleaseResources(v_session); - - }//endif3 - else { log("IT received in an unexpected state"); } - }//endif2 - else {//remote reference inconsistent, error action follows - //message received with remote reference not the same as stored - // two RLSD messages are sent back, one to the sored and to the received remote reference - //sent first RLSD-see B.2/Q.714 - - vl_PDU_SCCP.released.messageType :=rlsd; - vl_PDU_SCCP.released.destLocRef :=pl_PDU_SCCP_InactivityTest.sourceLocRef; - vl_PDU_SCCP.released.sourceLocRef:=pl_PDU_SCCP_InactivityTest.destLocRef; - vl_PDU_SCCP.released.releaseCause:=cg_Rel_inconsConnData; - vl_PDU_SCCP.released.pointer1:=0; - vl_PDU_SCCP.released.optionalPart:=omit; - vl_PDU_SCCP.released.eop:=omit; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Released - - //sent second RLSD-see B.2/Q.714 - vl_PDU_SCCP.released.destLocRef :=ConnectionTable[v_session].remoteReference; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Released - - }//endelse - - }//endif1 - else {}//Inactivity test received with destLocRef not in ConnectionTable - //discard - - }//processing_PDU_SCCP_InactivityTest - - //****************************************************************** - // processing_PDU_SCCP_ResetRequest - //****************************************************************** - function processing_PDU_SCCP_ResetRequest ( in PDU_SCCP_ResetRequest pl_PDU_SCCP_ResetRequest) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - - //check if connection already established - if (ConnectionAlreadyEstablished(pl_PDU_SCCP_ResetRequest.destLocRef)) - {//startif1 - v_session :=Retrieve_session(pl_PDU_SCCP_ResetRequest.destLocRef); - //check if remote reference is correct -Table B.2 /Q.714 - - if (ConnectionTable[v_session].remoteReference==pl_PDU_SCCP_ResetRequest.sourceLocRef) - {//startif2 - //Action Table follows - if (ConnectionTable[v_session].state==idle) - {//startif3 - - //assemble and route MTP3_ASP - vl_PDU_SCCP.pduerror.messageType:=err; - vl_PDU_SCCP.pduerror.destLocRef:=ConnectionTable[v_session].remoteReference; - vl_PDU_SCCP.pduerror.errorCause:=cg_Err_unassignedDestinationLRN; - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error - //then return to idle - - }//endif3 - else if (ConnectionTable[v_session].state==connection_pending_IC) {}//discard message, return - else if (ConnectionTable[v_session].state==connection_pending_OG) - {//startif3 - //stop connection timer - f_StopTimer(conn_est,v_session); - //assemble ASP_SCCP_N_ - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - vl_N_DISCONNECT_ind.originator:=cg_NSU; - vl_N_DISCONNECT_ind.reason:=cg_DISC_normal; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - //release resources - ReleaseResources(v_session); - }//endif3 - else if (ConnectionTable[v_session].state==disconnect_pending) {} - else if (ConnectionTable[v_session].state==reset_bothway) - {//startif3 - - //assemble ASP_SCCP_N_ - var ASP_SCCP_N_RESET_cfm vl_N_RESET_cfm; - vl_N_RESET_cfm.connectionId:=ConnectionTable[v_session].connectionId; - SCCP_SP_PORT.send( t_ASP_N_RESET_cfm(vl_N_RESET_cfm.connectionId));//send ASP_SCCP_N_RESET_cfm - - //stop reset timer - f_StopTimer(reset,v_session); - - //restart receive inactivity timer - f_StopTimer(iar,v_session);//to avoid warnings - f_StartTimer(iar,v_session); - //change state - ConnectionTable[v_session].state:=reset_IC; - }//endif3 - else if (ConnectionTable[v_session].state==active) - {//startif3 - //restart receive inactivity timer - f_StopTimer(iar,v_session);//to avoid warnings - f_StartTimer(iar,v_session); - //send ASP_SCCP_N_RESET_ind - //assemble ASP_SCCP_N_ - var ASP_SCCP_N_RESET_ind vl_N_RESET_ind; - vl_N_RESET_ind.originator:=cg_NSU; - vl_N_RESET_ind.reason:=cg_RESET_unspec; - vl_N_RESET_ind.connectionId:=ConnectionTable[v_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_RESET_ind( - vl_N_RESET_ind.originator, - vl_N_RESET_ind.reason, - vl_N_RESET_ind.connectionId - ));//send ASP_SCCP_N_RESET_ind - - //reset variables - ConnectionTable[v_session].state:=reset_IC; - }//endif3 - else if (ConnectionTable[v_session].state==wait_conn_confirm) - {//startif3 - - //stop connection timer - f_StopTimer(conn_est,v_session); - //release resources - ReleaseResources(v_session); - }//endif3 - else { log("RESREQ received in an unexpected state"); } - }//endif2 - else {//remote reference inconsistent, error action follows - - vl_PDU_SCCP.pduerror.messageType:=err; - vl_PDU_SCCP.pduerror.destLocRef:=pl_PDU_SCCP_ResetRequest.sourceLocRef; - vl_PDU_SCCP.pduerror.errorCause:=cg_Err_inconsistentSourceLRN; - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error - - }//endelse - }//endif1 - else {//startelse-Reset request received with destLocRef not in ConnectionTable - - //send ERR - vl_PDU_SCCP.pduerror.messageType:=err; - vl_PDU_SCCP.pduerror.destLocRef:=pl_PDU_SCCP_ResetRequest.sourceLocRef; - vl_PDU_SCCP.pduerror.errorCause:=cg_Err_unassignedDestinationLRN; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error - - }//endelse - - }//processing_PDU_SCCP_ResetRequest - - //****************************************************************** - // processing_PDU_SCCP_ResetConfirm - //****************************************************************** - function processing_PDU_SCCP_ResetConfirm ( in PDU_SCCP_ResetConfirm pl_PDU_SCCP_ResetConfirm) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - - //check if connection already established - if (ConnectionAlreadyEstablished(pl_PDU_SCCP_ResetConfirm.destLocRef)) - {//startif1 - v_session :=Retrieve_session(pl_PDU_SCCP_ResetConfirm.destLocRef); - - //check if remote reference is correct -Table B.2 /Q.714 - if (ConnectionTable[v_session].remoteReference==pl_PDU_SCCP_ResetConfirm.sourceLocRef) - {//startif2 - //Action Table follows - - if (ConnectionTable[v_session].state==idle) - { log("RSC received in state:idle ");}//do nothing-return to idle state, no source ref known - else if (ConnectionTable[v_session].state==connection_pending_IC) - { log("RSC received in state:connection_pending_IC ");}//discard message, return - else if (ConnectionTable[v_session].state==connection_pending_OG) - {//startif3 - - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - //stop connection timer - f_StopTimer(conn_est,v_session); - //assemble ASP_SCCP_N_ASP - - vl_N_DISCONNECT_ind.originator:=cg_NSU; - vl_N_DISCONNECT_ind.reason:=cg_DISC_normal; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - //release resources - ReleaseResources(v_session); - }//endif3 - else if (ConnectionTable[v_session].state==disconnect_pending) - { log("RSC received in state:disconnect_pending");} - else if (ConnectionTable[v_session].state==reset_bothway) - {//startif3 - //assemble ASP_SCCP_N_ - var ASP_SCCP_N_RESET_cfm vl_N_RESET_cfm; - vl_N_RESET_cfm.connectionId:=ConnectionTable[v_session].connectionId; - SCCP_SP_PORT.send( t_ASP_N_RESET_cfm( - vl_N_RESET_cfm.connectionId - ));//send ASP_SCCP_N_RESET_cfm - - //stop reset timer - f_StopTimer(reset,v_session); - - //restart receive inactivity timer - f_StopTimer(iar,v_session);//to avoid warnings - f_StartTimer(iar,v_session); - //change state - ConnectionTable[v_session].state:=reset_IC; - }//endif3 - else if (ConnectionTable[v_session].state==active) - {//startif3 - //do nothing-return to idle state - log("RSC received in state:active"); - }//endif3 - else if (ConnectionTable[v_session].state==reset_IC) - {//startif3 - //discard received message - f_StartTimer(internal_reset,v_session,0.0);//the timer times out immediately - //state changed to active - ConnectionTable[v_session].state:=active; - }//endif3 - else if (ConnectionTable[v_session].state==wait_conn_confirm) - {//startif3 - //stop connection timer - f_StopTimer(conn_est,v_session); - //release resources - ReleaseResources(v_session); - }//endif3 - else { log("ResConf received in an unexpected state"); } - }//endif2 - else {//remote reference inconsistent, error action follows - - vl_PDU_SCCP.pduerror.messageType:=err; - vl_PDU_SCCP.pduerror.destLocRef :=pl_PDU_SCCP_ResetConfirm.sourceLocRef; - vl_PDU_SCCP.pduerror.errorCause :=cg_Err_inconsistentSourceLRN; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error - - }//endelse - }//endif1 - else {//startelse-Reset confirm received with destLocRef not in ConnectionTable - - //send ERR - vl_PDU_SCCP.pduerror.messageType:=err; - vl_PDU_SCCP.pduerror.destLocRef :=pl_PDU_SCCP_ResetConfirm.sourceLocRef; - vl_PDU_SCCP.pduerror.errorCause :=cg_Err_unassignedDestinationLRN; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error - }//endelse - }//processing_PDU_SCCP_ResetConfirm - - //****************************************************************** - // processing_PDU_SCCP_ConnectionRefused - //****************************************************************** - function processing_PDU_SCCP_ConnectionRefused ( in PDU_SCCP_ConnectionRefused pl_PDU_SCCP_ConnectionRefused) - runs on SCCP_CT - { - //Store data parameter - var template SCCP_PAR_UserData tl_data := omit; - if (ispresent(pl_PDU_SCCP_ConnectionRefused.optionalPart)) - { - if (ispresent(pl_PDU_SCCP_ConnectionRefused.optionalPart.data)) - { - tl_data := pl_PDU_SCCP_ConnectionRefused.optionalPart.data.data; - } - } - - //check if connection already established - if (ConnectionAlreadyEstablished(pl_PDU_SCCP_ConnectionRefused.destLocRef)) - {//startif2 - v_session :=Retrieve_session(pl_PDU_SCCP_ConnectionRefused.destLocRef); - //Action Table follows - - if (ConnectionTable[v_session].state==idle) - { log ("CREF received in state:idle");} //do nothing , return to idle, source ref unknown - else if (ConnectionTable[v_session].state==connection_pending_IC) - { log ("CREF received in state:connection_pending_IC");} - else if (ConnectionTable[v_session].state==active) - { log ("CREF received in state:active");}//do nothing, return - else if (ConnectionTable[v_session].state==disconnect_pending) - { log ("CREF received in state:disconnect_pending");}//discard message, return - else if (ConnectionTable[v_session].state==reset_bothway) - { log ("CREF received in state:reset_bothway");}// - else if (ConnectionTable[v_session].state==connection_pending_OG) - {//startif3 - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - //stop connection timer - f_StopTimer(conn_est,v_session); - //assemble ASP_SCCP_N_ - vl_N_DISCONNECT_ind.originator:=cg_Mapping_RefCause_Orig[pl_PDU_SCCP_ConnectionRefused.refusalCause]; - vl_N_DISCONNECT_ind.reason:=cg_Mapping_RefCause_Reason[pl_PDU_SCCP_ConnectionRefused.refusalCause]; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - tl_data, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - //release resources - ReleaseResources(v_session); - }//endif3 - else if (ConnectionTable[v_session].state==wait_conn_confirm) - {//startif3 - - //stop connection timer - f_StopTimer(conn_est,v_session); - //release resources - ReleaseResources(v_session); - - }//endif3 - else if (ConnectionTable[v_session].state==reset_IC) - {//startif3 - - //discard received message - f_StartTimer(internal_reset,v_session,0.0);//the timer times out immediately - //state changed to active - ConnectionTable[v_session].state:=active; - - }//endif3 - else { log("CREF received in an unexpected state"); } - - }//endif2 - else { log("CREF received with destLocRef not in state table"); } - //Connection refused with destLocRef not in ConnectionTable - //discard - - } //processing_PDU_SCCP_ConnectionRefused - - //****************************************************************** - // processing_PDU_SCCP_DataForm1 - //****************************************************************** - function processing_PDU_SCCP_DataForm1 ( in PDU_SCCP_DataForm1 pl_PDU_SCCP_DataForm1) - runs on SCCP_CT - { - - //check if connection already established - if (ConnectionAlreadyEstablished(pl_PDU_SCCP_DataForm1.destLocRef)) - {//startif2 - v_session :=Retrieve_session(pl_PDU_SCCP_DataForm1.destLocRef); - //Action Table follows - - if (ConnectionTable[v_session].state==idle) - {//startif3 - var PDU_SCCP vl_PDU_SCCP; - //assemble and route MTP3_ASP - vl_PDU_SCCP.pduerror.messageType:=err; - vl_PDU_SCCP.pduerror.destLocRef:=ConnectionTable[v_session].remoteReference; - vl_PDU_SCCP.pduerror.errorCause:=cg_Err_unassignedDestinationLRN; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error - - //then return to idle - }//endif3 - else if (ConnectionTable[v_session].state==connection_pending_IC) - { log ("DT1 received in state:connection_pending_IC");}//discard message, return - else if (ConnectionTable[v_session].state==disconnect_pending) - { log ("DT1 received in state:disconnect_pending");}//discard message, return - else if (ConnectionTable[v_session].state==reset_bothway) - { log ("DT1 received in state:reset_bothway");}// - else if (ConnectionTable[v_session].state==connection_pending_OG) - {//startif3 - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - f_StopTimer(conn_est,v_session); - //assemble ASP_SCCP_N_ - vl_N_DISCONNECT_ind.originator:=cg_NSU; - vl_N_DISCONNECT_ind.reason:=cg_DISC_normal; - vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - //release resources - ReleaseResources(v_session); - }//endif3 - else if (ConnectionTable[v_session].state==wait_conn_confirm) - {//startif3 - - //stop connection timer - f_StopTimer(conn_est,v_session); - //release resources - ReleaseResources(v_session); - }//endif3 - else if (ConnectionTable[v_session].state==active) - {//startif3 - - var ASP_SCCP_N_DATA_ind vl_N_DATA_ind; - //restart receive inactivity timer - f_StopTimer(iar,v_session);//to avoid warnings - f_StartTimer(iar,v_session); - - buffered_sending_ASP_N_DATA_ind( pl_PDU_SCCP_DataForm1 ) - //MODIFY-> protocol class assumed 2; M bit assumed 0 (no segm/reassembly) - - }//endif3 - else if (ConnectionTable[v_session].state==reset_IC) - {//startif3 - - //discard received message - f_StartTimer(internal_reset,v_session,0.0);//the timer times out immediately - //state changed to active - ConnectionTable[v_session].state:=active; - - }//endif3 - else { log("DT1 received in an unexpected state"); } - - }//endif2 - else { log("DT1 received with destLocRef not in ConnectionTable"); } - //DT1 received with destLocRef not in ConnectionTable - //discard - - }//processing_PDU_SCCP_DataForm1 - - - //****************************************************************** - // processing_PDU_SCCP_ExtUnitdata - //****************************************************************** - function processing_PDU_SCCP_ExtUnitdata ( in PDU_SCCP_ExtUnitdata pl_PDU_SCCP_ExtUnitdata) - runs on SCCP_CT - { - var integer vl_index; - var OCT3 vl_segmRemoteRef; - if( ispresent( pl_PDU_SCCP_ExtUnitdata.optionalPart) and - ispresent( pl_PDU_SCCP_ExtUnitdata.optionalPart.segmentation) ) - { - vl_segmRemoteRef:= pl_PDU_SCCP_ExtUnitdata.optionalPart.segmentation.segmLocalRef; - if( pl_PDU_SCCP_ExtUnitdata.optionalPart.segmentation.firstSegm =='1'B ) - { - vl_index:=allocate_ClessRcvBuff( vl_segmRemoteRef); - } - else - { - vl_index:=get_ClessRcvBuffIndex( vl_segmRemoteRef ); - }; - if (vl_index == -1) - { - log("Buffer allocation failed, message ignored."); - return; - } - - store_segmData(vl_index,pl_PDU_SCCP_ExtUnitdata); - if( pl_PDU_SCCP_ExtUnitdata.optionalPart.segmentation.remainingSegment == '0000'B ) - { - send_ClessRcvBuff_in_N_UNITDATAind( vl_index,pl_PDU_SCCP_ExtUnitdata ); - reallocate_ClessRcvBuff( vl_index ); - } - } - else - { // not segmented case: - send_ClessData_in_N_UNITDATAind( pl_PDU_SCCP_ExtUnitdata ); - } - return; - - }//processing_PDU_SCCP_ExtUnitdata - -//****************************************************************** -// Part 2 Receiving msg on port "SCCP_PORT" (User Part) -//****************************************************************** - -//****************************************************************** -// processing_ASP_N_CONNECT_req -// / ASP_SCCP_N_CONNECT_req , originating node / -//****************************************************************** - function processing_ASP_N_CONNECT_req( in ASP_SCCP_N_CONNECT_req pl_N_CONNECT_req ) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - - if (ConnectionAlreadyEstablished_connectionId(pl_N_CONNECT_req.connectionId)) - // assume connectionId present - {//startif1 - - //something went wrong, we already have a session with the same connection Id - v_session :=Retrieve_session_connectionId(pl_N_CONNECT_req.connectionId); - //table of error actions - - }//endif1 - else - {//startelse1 - - //check if resources available - v_session:=CheckIdleIndividuals(); - if (v_session==-1) //No idle individual found - {//startif2 - - //assemble ASP_SCCP_N_ASP - vl_N_DISCONNECT_ind.originator:=cg_NSP; // network service provider - vl_N_DISCONNECT_ind.reason:=cg_CREF_unspec_T; - vl_N_DISCONNECT_ind.connectionId:=pl_N_CONNECT_req.connectionId; - - SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( - vl_N_DISCONNECT_ind.originator, - omit, - vl_N_DISCONNECT_ind.reason, - omit, - vl_N_DISCONNECT_ind.connectionId, - omit - ));//send ASP_SCCP_N_DISCONNECT_ind - //return to idle - }//endif2 - - if ((v_session<=15)and (v_session>=0)) - {//startif2 - - //assign local reference, SLS:=tsp_MTP3_SLS, protocol class:=2 - ConnectionTable[v_session].localReference:=int2oct(pl_N_CONNECT_req.connectionId,3); - ConnectionTable[v_session].connectionId :=pl_N_CONNECT_req.connectionId; - - //to simplify generation of local reference, connectionID received from user is sent as such - //only local reference is assigned at this point - //send connection request, no coupling - //DPC :remote node - //no coupling reqrd. - //compatibility OK - //no restriction - //assemble and route MTP3_ASP - vl_PDU_SCCP.connrequest.messageType:=cr; - vl_PDU_SCCP.connrequest.sourceLocRef:=ConnectionTable[v_session].localReference; - // send local reference just assigned! - vl_PDU_SCCP.connrequest.protClass:={ - class:='0010'B, - messageHandling:='0000'B - };//class 2 - vl_PDU_SCCP.connrequest.pointer1:=2; - vl_PDU_SCCP.connrequest.calledPAddress:=ConvertASPAddressToEncodedAddress(pl_N_CONNECT_req.calledAddress); //new! - vl_PDU_SCCP.connrequest.pointer2:=vl_PDU_SCCP.connrequest.calledPAddress.paramLength+2; //automatic? - - if(ispresent(pl_N_CONNECT_req.callingAddress)) - {//startif3 - - //temporary variable to avoid type conversion problems - var SCCP_param_CPartyAddressEnc_opt vl_SCCP_param_CPartyAddressEnc_opt; - var SCCP_param_CPartyAddressEnc vl_SCCP_param_CPartyAddressEnc; - - vl_SCCP_param_CPartyAddressEnc:= - ConvertASPAddressToEncodedAddress(pl_N_CONNECT_req.callingAddress); - - vl_SCCP_param_CPartyAddressEnc_opt.paramName :=con_SCCP_cgPA; - vl_SCCP_param_CPartyAddressEnc_opt.paramLength:=vl_SCCP_param_CPartyAddressEnc.paramLength; - vl_SCCP_param_CPartyAddressEnc_opt.addr :=vl_SCCP_param_CPartyAddressEnc.addr; - - vl_PDU_SCCP.connrequest.optionalPart.callingPAddress:=vl_SCCP_param_CPartyAddressEnc_opt; - - }//endif3 - else { vl_PDU_SCCP.connrequest.optionalPart.callingPAddress:=omit } - - if(ispresent(pl_N_CONNECT_req.userData)) - {//startif3 - - //temporary variable to avoid type conversion problems - var SCCP_param_Data_opt vl_SCCP_param_Data_opt; - - vl_SCCP_param_Data_opt.paramName:=con_SCCP_data; - vl_SCCP_param_Data_opt.data:=pl_N_CONNECT_req.userData; - vl_SCCP_param_Data_opt.paramLength:=lengthof(vl_SCCP_param_Data_opt.data); - vl_PDU_SCCP.connrequest.optionalPart.data:=vl_SCCP_param_Data_opt; - - }//endif3 - else { vl_PDU_SCCP.connrequest.optionalPart.data:=omit} - - if(ispresent(pl_N_CONNECT_req.callingAddress) or - ispresent(pl_N_CONNECT_req.userData)) - { - vl_PDU_SCCP.connrequest.optionalPart.credit:=omit; - vl_PDU_SCCP.connrequest.optionalPart.hopCounter:=omit; - vl_PDU_SCCP.connrequest.optionalPart.importance:=omit; - - vl_PDU_SCCP.connrequest.eop:= {paramName:=con_SCCP_eop}; - } - else - { - vl_PDU_SCCP.connrequest.optionalPart := omit; - vl_PDU_SCCP.connrequest.eop := omit; - } - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Connection request - - //start connection timer - f_StartTimer(conn_est,v_session); - ConnectionTable[v_session].state:=connection_pending_OG; - }//endif2 - - }//endelse - - }//processing_ASP_N_CONNECT_req - //****************************************************************** - //End ASP_SCCP_N_CONNECT_req , originating node - //****************************************************************** - - //****************************************************************** - // processing_ASP_N_CONNECT_resp - //****************************************************************** - function processing_ASP_N_CONNECT_res( in ASP_SCCP_N_CONNECT_res pl_N_CONNECT_res ) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - - // first see if session exists in the ConnectionTable - //search done based on Connection ID - - if (ConnectionAlreadyEstablished_connectionId(pl_N_CONNECT_res.connectionId)) - //assume connectionId present - {//startif1 - //retrieve session - v_session :=Retrieve_session_connectionId(pl_N_CONNECT_res.connectionId); - - //Action Table follows - - if (ConnectionTable[v_session].state==idle) - { - log("N_CONNECT_resp received in state:idle"); - //do nothing-return to idle state - } - else if (ConnectionTable[v_session].state==connection_pending_IC) - {//startif2 - - //assign SLS:=tsp_MTP3_SLS, assign protocol class=2 (CO, no flow ctrl.) - - //assemble and route MTP3_ASP - - vl_PDU_SCCP.connconfirm.messageType:=cc; - vl_PDU_SCCP.connconfirm.sourceLocRef:=ConnectionTable[v_session].localReference; - vl_PDU_SCCP.connconfirm.destLocRef:=ConnectionTable[v_session].remoteReference; - vl_PDU_SCCP.connconfirm.protClass.class:='0010'B;//protocol class 2 - vl_PDU_SCCP.connconfirm.protClass.messageHandling:='0000'B;//no special treatment - - if(ispresent(pl_N_CONNECT_res.respondingAddress)) - {//startif3 - - //temporary variable to avoid type conversion problems - var SCCP_param_CPartyAddressEnc_opt vl_SCCP_param_CPartyAddressEnc_opt; - var SCCP_param_CPartyAddressEnc vl_SCCP_param_CPartyAddressEnc; - - vl_SCCP_param_CPartyAddressEnc:= - ConvertASPAddressToEncodedAddress(pl_N_CONNECT_res.respondingAddress); - - vl_SCCP_param_CPartyAddressEnc_opt.paramName := con_SCCP_cdPA; // cgPA->cdPA ethbaat, 2003.11.06 - vl_SCCP_param_CPartyAddressEnc_opt.paramLength:= vl_SCCP_param_CPartyAddressEnc.paramLength; - vl_SCCP_param_CPartyAddressEnc_opt.addr := vl_SCCP_param_CPartyAddressEnc.addr; - - vl_PDU_SCCP.connconfirm.optionalPart.calledPAddress:= vl_SCCP_param_CPartyAddressEnc_opt; - }//endif3 - else { vl_PDU_SCCP.connconfirm.optionalPart.calledPAddress:=omit } - - if(ispresent(pl_N_CONNECT_res.userData)) - {//startif3 - - //temporary variable to avoid type conversion problems - var SCCP_param_Data_opt vl_SCCP_param_Data_opt; - - vl_SCCP_param_Data_opt.paramName:=con_SCCP_data; - vl_SCCP_param_Data_opt.data:=pl_N_CONNECT_res.userData; // corrected by ethbaat 2003.10.16 - vl_SCCP_param_Data_opt.paramLength:=lengthof(vl_SCCP_param_Data_opt.data); - - vl_PDU_SCCP.connconfirm.optionalPart.data:=vl_SCCP_param_Data_opt; - }//endif3 - else {vl_PDU_SCCP.connconfirm.optionalPart.data:=omit} - - if(ispresent(pl_N_CONNECT_res.respondingAddress) or - ispresent(pl_N_CONNECT_res.userData)) - { - vl_PDU_SCCP.connconfirm.pointer1:=1; - vl_PDU_SCCP.connconfirm.optionalPart.credit:=omit; - vl_PDU_SCCP.connconfirm.optionalPart.importance:=omit; - vl_PDU_SCCP.connconfirm.eop:= {paramName:=con_SCCP_eop}; - } - else - { - vl_PDU_SCCP.connconfirm.pointer1:=0; - vl_PDU_SCCP.connconfirm.optionalPart := omit; - vl_PDU_SCCP.connconfirm.eop:=omit; - } - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send connection confirm - - f_StartTimer(ias,v_session); // ??? check them!!! - f_StartTimer(iar,v_session); //start inactivity timers - ConnectionTable[v_session].state:=active;//state change - - }//endif2 - else { log("N_CONNECT_resp received in an unexpected state");} - - }//endif1 - - }//processing_ASP_N_CONNECT_resp - - //****************************************************************** - // processing_ASP_N_DATA_req - //****************************************************************** - - function processing_ASP_N_DATA_req( in ASP_SCCP_N_DATA_req pl_N_DATA_req ) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - - // first see if session exists in the ConnectionTable - - if (ConnectionAlreadyEstablished_connectionId(pl_N_DATA_req.connectionId)) - //assume connectionId present - {//startif1 - - //retrieve v_session - v_session :=Retrieve_session_connectionId(pl_N_DATA_req.connectionId); - - //Action Table follows - if (ConnectionTable[v_session].state==idle) - { log ("N_DATA_req received in idle state");} - else if (ConnectionTable[v_session].state==reset_bothway) - { log ("N_DATA_req received in reset_bothway state");} - else if (ConnectionTable[v_session].state==active) - {//startif2 - sending_dataform1s_in_ASP_MTP_TRANSFERreqs(pl_N_DATA_req); - //no change of state, remains active - }//endif2 - else { log ("N_DATA_req received in an unexpected state"); } - - }//endif1 - else { log("N_DATA_req with Connection ID not in the state table -- illegal request"); } - - }//processing_ASP_N_DATA_req - - //****************************************************************** - // processing_ASP_N_DISCONNECT_req - //****************************************************************** - - function processing_ASP_N_DISCONNECT_req( in ASP_SCCP_N_DISCONNECT_req pl_N_DISCONNECT_req ) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - var boolean vl_opt_part_present:=false; - - // first see if session exists in the ConnectionTable - - if (ConnectionAlreadyEstablished_connectionId(pl_N_DISCONNECT_req.connectionId)) - //assume connectionId present - {//startif1 - - //retrieve v_session - v_session :=Retrieve_session_connectionId(pl_N_DISCONNECT_req.connectionId); - - //Action Table follows - if (ConnectionTable[v_session].state==idle) - { log ("N_DISCONNECT_req received in state:idle");} - else if (ConnectionTable[v_session].state==connection_pending_IC) - {//startif2 - - //assemble and route MTP3_ASP - vl_PDU_SCCP.connrefused.messageType:=cref; - vl_PDU_SCCP.connrefused.destLocRef:=ConnectionTable[v_session].remoteReference; - vl_PDU_SCCP.connrefused.refusalCause:=pl_N_DISCONNECT_req.reason; - vl_PDU_SCCP.connrefused.pointer1:=0; //No optional part - vl_PDU_SCCP.connrefused.optionalPart:=omit; - vl_PDU_SCCP.connrefused.eop:=omit; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send connection refused - - //release resources - ReleaseResources(v_session); - - }//endif2 - else if (ConnectionTable[v_session].state==active) - {//startif2 - - //stop inactivity timers - f_StopTimer(ias,v_session); - f_StopTimer(iar,v_session); - - //assemble and route MTP3_ASP - - vl_PDU_SCCP.released.messageType:=rlsd; - vl_PDU_SCCP.released.destLocRef:=ConnectionTable[v_session].remoteReference; - vl_PDU_SCCP.released.sourceLocRef:=ConnectionTable[v_session].localReference; - vl_PDU_SCCP.released.releaseCause:=pl_N_DISCONNECT_req.reason; - if(ispresent(pl_N_DISCONNECT_req.userData)){ - vl_opt_part_present:=true; - vl_PDU_SCCP.released.optionalPart.data.paramName:=con_SCCP_data; - vl_PDU_SCCP.released.optionalPart.data.paramLength:=lengthof(pl_N_DISCONNECT_req.userData); - vl_PDU_SCCP.released.optionalPart.data.data:=pl_N_DISCONNECT_req.userData; - } else { - vl_PDU_SCCP.released.optionalPart.data:=omit; - } - if(ispresent(pl_N_DISCONNECT_req.importance)){ - vl_opt_part_present:=true; - vl_PDU_SCCP.released.optionalPart.importance.paramName:=con_SCCP_imp - vl_PDU_SCCP.released.optionalPart.importance.paramLength:=1 - vl_PDU_SCCP.released.optionalPart.importance.importance:=pl_N_DISCONNECT_req.importance - vl_PDU_SCCP.released.optionalPart.importance.reserved:='00000'B - } else { - vl_PDU_SCCP.released.optionalPart.importance:=omit; - } - if(vl_opt_part_present){ - vl_PDU_SCCP.released.pointer1:=1; - vl_PDU_SCCP.released.eop.paramName:=con_SCCP_eop; - } else { - vl_PDU_SCCP.released.pointer1:=0;//No optional part - vl_PDU_SCCP.released.optionalPart:=omit; - vl_PDU_SCCP.released.eop:=omit; - } - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send released - - //start release timer - f_StartTimer(rel,v_session); - - ConnectionTable[v_session].state:=disconnect_pending; - - }//endif2 - else if (ConnectionTable[v_session].state==connection_pending_OG) - {//startif2 - - //change state to "wait connection confirm " - ConnectionTable[v_session].state:=wait_conn_confirm; - //and return - - }//endif2 - else { log("N_DISCONNECT_req received in an unexpected state");} - - }//endif1 - - }//processing_ASP_N_DISCONNECT_req - - - //****************************************************************** - // function SCCP_SPC_int2bit - working function to processing_ASP_N_UNITDATA_req - // v_sio is local to SCCP_CT - // SCCPServiceType - //****************************************************************** - function SCCP_SPC_int2bit( in integer pl_SPC, in SCCP_ServiceType pl_SCCP_ServiceType, in octetstring pl_SIO ) - return SCCP_ASPfield_SignallingPointCode - { - var SCCP_ASPfield_SignallingPointCode vl_SPC; //bitstring - vl_SPC :='0000000000000000'B; - - if( (pl_SCCP_ServiceType == mtp3_itu) or (pl_SCCP_ServiceType == mtp3b_itu)) - { - //vl_SPC := '00'B&int2bit( pl_SPC, 14); - vl_SPC := int2bit( pl_SPC, 14); - } - else if ( (pl_SCCP_ServiceType == mtp3_ansi) or (pl_SCCP_ServiceType == mtp3b_ansi) ) - { - vl_SPC := int2bit( pl_SPC, 24); - } - else if( (pl_SCCP_ServiceType == mtp3_ttc) or (pl_SCCP_ServiceType == mtp3b_ttc) ) - { - if( (pl_SIO == '83'O) or (pl_SIO == '43'O) or (pl_SIO == 'C3'O) ) //ttc national - { - vl_SPC := int2bit( pl_SPC, 16); - } - else if( pl_SIO == '03'O ) //ttc international - { - //vl_SPC := '00'B&int2bit( pl_SPC, 14); - vl_SPC := int2bit( pl_SPC, 14); - } - else { log ( "SIO setting error"); } - } - else if( pl_SCCP_ServiceType == mtp3_mpt ) - { - var integer vl_NI := oct2int(pl_SIO)/64; - if( vl_NI == 2 ) //mpt national - { - vl_SPC := int2bit( pl_SPC, 24); - } - else //mpt international - { - vl_SPC := int2bit( pl_SPC, 14); - } - } - else - { log ( "ServiceType setting error. Use values", - "mtp3_itu, mtp3b_itu, mtp3_ansi, mtp3b_ansi,", - " mtp3_ttc, mtp3b_ttc, mtp3_mpt or m3ua"); - } - - return vl_SPC; - - }// SCCP_SPC_int2bit - - //****************************************************************** - // sending_udt_in_ASP_MTP_TRANSFERreqs - // sends data in one step - //****************************************************************** - function sending_udt_in_ASP_MTP_TRANSFERreqs( in SCCP_param_ProtocolClass pl_protClass, - in SCCP_param_CPartyAddressEnc pl_CalledPAddress, - in SCCP_param_CPartyAddressEnc pl_CallingPAddress, - in SCCP_param_Data pl_data) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - vl_PDU_SCCP.unitdata.messageType := udt ; - vl_PDU_SCCP.unitdata.protClass := pl_protClass; - vl_PDU_SCCP.unitdata.calledPAddress := pl_CalledPAddress; - vl_PDU_SCCP.unitdata.callingPAddress:= pl_CallingPAddress; - vl_PDU_SCCP.unitdata.data := pl_data; - vl_PDU_SCCP.unitdata.pointer1 := 0; - vl_PDU_SCCP.unitdata.pointer2 := 0; - vl_PDU_SCCP.unitdata.pointer3 := 0; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Unitdata - return; - - }//sending_udt_in_ASP_MTP_TRANSFERreqs - - //****************************************************************** - // sending_xudt_in_ASP_MTP_TRANSFERreqs - // segmentates and sends data to the encoder - //****************************************************************** - function sending_xudt_in_ASP_MTP_TRANSFERreqs(in SCCP_param_ProtocolClass pl_protClass, - in SCCP_param_CPartyAddressEnc pl_CalledPAddress, - in SCCP_param_CPartyAddressEnc pl_CallingPAddress, - in SCCP_param_Data pl_data) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - var integer vl_actdatalen; //without length of paramLength field - var integer vl_len; // remaining data length without length of paramLength field - var integer vl_from; - var integer vl_overhead; - var integer vl_maxdatalen; - var integer vl_numberofPDUs; // ... to be sent - - vl_PDU_SCCP.extudata.messageType := xudt ; //len:1 - vl_PDU_SCCP.extudata.hopCounter := 15; // check it in spec. //len:1 - vl_PDU_SCCP.extudata.protClass := pl_protClass; //len:1 - vl_PDU_SCCP.extudata.pointer1 := 0; //len:4 - vl_PDU_SCCP.extudata.pointer2 := 0; - vl_PDU_SCCP.extudata.pointer3 := 0; - vl_PDU_SCCP.extudata.pointer4 := 0; - vl_PDU_SCCP.extudata.calledPAddress := pl_CalledPAddress; - vl_PDU_SCCP.extudata.callingPAddress := pl_CallingPAddress; - - vl_overhead := 15 + - (vl_PDU_SCCP.extudata.calledPAddress.paramLength+1) + - (vl_PDU_SCCP.extudata.callingPAddress.paramLength+1); - - vl_len := pl_data.paramLength; - vl_maxdatalen := v_sccp_pdu_maxlen - vl_overhead -1; // -1:paramLength - vl_numberofPDUs := vl_len/vl_maxdatalen; // 0 if 1 PDU exists - - // init segmentation: - vl_PDU_SCCP.extudata.optionalPart.segmentation.segmLocalRef:= create_segmLocalRef(); - vl_PDU_SCCP.extudata.optionalPart.segmentation.firstSegm := '1'B; //'yes' - vl_PDU_SCCP.extudata.optionalPart.segmentation.paramName := con_SCCP_segm; - vl_PDU_SCCP.extudata.optionalPart.segmentation.paramLength := 4; - vl_PDU_SCCP.extudata.optionalPart.segmentation.remainingSegment := int2bit(vl_numberofPDUs,4); - vl_PDU_SCCP.extudata.optionalPart.segmentation.reserved := '00'B; - - if( pl_protClass.class == '0001'B ) - { vl_PDU_SCCP.extudata.optionalPart.segmentation.class := '1'B; } - else - { vl_PDU_SCCP.extudata.optionalPart.segmentation.class := '0'B; }; - - vl_PDU_SCCP.extudata.optionalPart.importance:= omit; //len:0 - vl_PDU_SCCP.extudata.eop.paramName := con_SCCP_eop; //len:0 - - vl_from := 0; - - while ( vl_len > 0 ) - { - vl_PDU_SCCP.extudata.optionalPart.segmentation.remainingSegment := int2bit(vl_numberofPDUs,4); - - if ( vl_len > vl_maxdatalen ) - { vl_actdatalen := vl_maxdatalen; } - else - { vl_actdatalen := vl_len; }; - - vl_PDU_SCCP.extudata.data.data := substr( pl_data.data, vl_from, vl_actdatalen ); - vl_PDU_SCCP.extudata.data.paramLength := vl_actdatalen; - - MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp - (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //send PDU_SCCP_ExtUnitdata - - vl_PDU_SCCP.extudata.optionalPart.segmentation.firstSegm := '0'B; //'no' - - vl_numberofPDUs := vl_numberofPDUs -1 ; - vl_from := vl_from + vl_actdatalen; - vl_len := vl_len - vl_actdatalen; - }//while - - log("Last remaining Segment:", vl_PDU_SCCP.extudata.optionalPart.segmentation.remainingSegment ); - - // not necessary, remove it: - //reset_segmLocalRef(vl_PDU_SCCP.extudata.optionalPart.segmentation.segmLocalRef); - return; - }//sending_xudt_in_ASP_MTP_TRANSFERreqs - - //****************************************************************** - // processing_ASP_N_UNITDATA_req - //****************************************************************** - - function processing_ASP_N_UNITDATA_req( in ASP_SCCP_N_UNITDATA_req pl_N_UNITDATA_req ) - runs on SCCP_CT - { - var PDU_SCCP vl_PDU_SCCP; - var SCCP_param_ProtocolClass vl_protClass; - var SCCP_param_CPartyAddressEnc vl_CalledPAddress, vl_CallingPAddress; - var integer vl_overhead_length; - var SCCP_param_Data vl_data; - - // Protocol class mapping : - // old: vl_protClass.messageHandling:='0000'B;//no special options - - // 3.6/ Q.713: bit1-4 - if ( ispresent(pl_N_UNITDATA_req.sequenceControl) and - (substr(pl_N_UNITDATA_req.sequenceControl,7,1) == '1'B) ) //least significant bit! - { vl_protClass.class:='0001'B; } - else - { vl_protClass.class:='0000'B; } //changed to 0000 from 0001 ethbaat 2003-11-13 - - // 3.6/ Q.713: bit 5-8: - if ( ispresent(pl_N_UNITDATA_req.returnOption) and - (substr(pl_N_UNITDATA_req.returnOption,7,1) == '1'B) ) //least significant bit! - { vl_protClass.messageHandling:='1000'B} - else - { vl_protClass.messageHandling:='0000'B} - - //Called Address mapping: - if (pl_N_UNITDATA_req.calledAddress.addressIndicator.pointCodeIndic=='1'B) //DPC included - {//startif1 - - if (bit2int(pl_N_UNITDATA_req.calledAddress.signPointCode) == v_remote_SPC ) // remote SPC - {//startif2 - vl_CalledPAddress:= - ConvertASPAddressToEncodedAddress(pl_N_UNITDATA_req.calledAddress); - } - else - { - log("The remote SPC in ASP_SCCP_N_UNITDATA_req is not the same as the one you called by StartSCCP.ASP dropped") - return; - } - - }//endif1 - else - { //DPC not present, use values local for component - - var SCCP_PAR_Address vl_SCCP_PAR_Address; - vl_SCCP_PAR_Address := pl_N_UNITDATA_req.calledAddress; - - if ( v_remote_SPC > 0) - { - vl_SCCP_PAR_Address.addressIndicator.pointCodeIndic :='1'B; // 3.4.1/Q713. - vl_SCCP_PAR_Address.addressIndicator.routingIndicator := cg_route_on_SSN; - // 14,24 or 16 bits: - vl_SCCP_PAR_Address.signPointCode := SCCP_SPC_int2bit( v_remote_SPC, v_SCCPServiceType, v_SIO); - } - // vl_SCCP_PAR_Address.addressIndicator.ssnIndicator unchanged - // vl_SCCP_PAR_Address.addressIndicator.globalTitleIndic unchanged - // vl_SCCP_PAR_Address.subsystemNumber unchanged - // vl_SCCP_PAR_Address.globalTitle unchanged - - vl_CalledPAddress := - ConvertASPAddressToEncodedAddress(vl_SCCP_PAR_Address); - - }//endif1 - - vl_CallingPAddress := - ConvertASPAddressToEncodedAddress(pl_N_UNITDATA_req.callingAddress); - - vl_data.data := pl_N_UNITDATA_req.userData; - vl_data.paramLength:= lengthof( pl_N_UNITDATA_req.userData); - - // unitdata overhead calculation: - // msg type: 1; prot class: 2; 3 pointers: 3=> total:6 - vl_overhead_length := (vl_CalledPAddress.paramLength+1) + - (vl_CallingPAddress.paramLength +1)+ 6 ; - - if( (tsp_force_xudt==0) and - (vl_overhead_length + vl_data.paramLength + 1) <= v_sccp_pdu_maxlen ) - { - sending_udt_in_ASP_MTP_TRANSFERreqs(vl_protClass, - vl_CalledPAddress, - vl_CallingPAddress, - vl_data ); - } - else - { - sending_xudt_in_ASP_MTP_TRANSFERreqs(vl_protClass, - vl_CalledPAddress, - vl_CallingPAddress, - vl_data ); - } - - }//processing_ASP_N_UNITDATA_req - -//****************************************************************** -//****************************************************************** -function ScanEvents() runs on SCCP_CT -//****************************************************************** -//****************************************************************** -{//startfunction - - var PDU_SCCP vl_PDU_SCCP; - - var ASP_SCCP_N_CONNECT_req vl_N_CONNECT_req; - var ASP_SCCP_N_CONNECT_ind vl_N_CONNECT_ind; - var ASP_SCCP_N_CONNECT_res vl_N_CONNECT_res; - var ASP_SCCP_N_CONNECT_cfm vl_N_CONNECT_cfm; - var ASP_SCCP_N_DATA_req vl_N_DATA_req; - var ASP_SCCP_N_DATA_ind vl_N_DATA_ind; - var ASP_SCCP_N_DISCONNECT_req vl_N_DISCONNECT_req; - var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; - var ASP_SCCP_N_UNITDATA_req vl_N_UNITDATA_req; - var ASP_SCCP_N_UNITDATA_ind vl_N_UNITDATA_ind; - var ASP_SCCP_N_NOTICE_ind vl_N_NOTICE_ind; - - var integer i; - //this function scans the MTP3 and user port for incoming messages and checks timers for timeout - - f_initialize_timer_states(); - - while (true) - {//startwhile - - alt - //****************************************************************** - {//startalt0 - //****************************************************************** - [] MTP3_SCCP_PORT.receive(PDU_SCCP : ? ) -> value vl_PDU_SCCP - { - //****************************************************************** - //Unitdata received at destination node - //****************************************************************** - if (ischosen(vl_PDU_SCCP.unitdata)) - { - // vl_PDU_SCCP.unitdata.pointer1 :=3; - // vl_PDU_SCCP.unitdata.pointer2 :=0; - // vl_PDU_SCCP.unitdata.pointer3 :=0; - processing_PDU_SCCP_Unitdata( vl_PDU_SCCP.unitdata ); - } - - //****************************************************************** - //Data received at destination node - //****************************************************************** - else if (ischosen(vl_PDU_SCCP.dataform1)) - { - // vl_PDU_SCCP.dataform1.pointer1 :=1; - processing_PDU_SCCP_DataForm1( vl_PDU_SCCP.dataform1 ); - } - - //****************************************************************** - //Extended unitdata received at destination node - //****************************************************************** - else if (ischosen(vl_PDU_SCCP.extudata)) - { - // vl_PDU_SCCP.extudata.pointer1 :=0; - // vl_PDU_SCCP.extudata.pointer2 :=0; - // vl_PDU_SCCP.extudata.pointer3 :=0; - // vl_PDU_SCCP.extudata.pointer4 :=0; - processing_PDU_SCCP_ExtUnitdata( vl_PDU_SCCP.extudata ); - } - - //****************************************************************** - //Connection request received - //****************************************************************** - else if (ischosen(vl_PDU_SCCP.connrequest)) - { - // vl_PDU_SCCP.connrequest.pointer1 :=2; - // vl_PDU_SCCP.connrequest.pointer2 :=0; - processing_PDU_SCCP_ConnectionRequest( vl_PDU_SCCP.connrequest ); - } - - //****************************************************************** - //Connection confirm received - //****************************************************************** - else if (ischosen(vl_PDU_SCCP.connconfirm)) - { - // vl_PDU_SCCP.connconfirm.pointer1 :=1; - processing_PDU_SCCP_ConnectionConfirm( vl_PDU_SCCP.connconfirm ); - } - - //****************************************************************** - //Released received - //****************************************************************** - else if (ischosen(vl_PDU_SCCP.released)) - { - // vl_PDU_SCCP.released.pointer1 :=1; - processing_PDU_SCCP_Released( vl_PDU_SCCP.released ); - } - - //****************************************************************** - //Release complete received - //****************************************************************** - else if (ischosen(vl_PDU_SCCP.relcomp)) - { - processing_PDU_SCCP_ReleaseComplete( vl_PDU_SCCP.relcomp ); - } - - //****************************************************************** - //Unitdata service received - //****************************************************************** - else if (ischosen(vl_PDU_SCCP.udataserv)) - { - // vl_PDU_SCCP.udataserv.pointer1 :=3; - // vl_PDU_SCCP.udataserv.pointer2 :=0; - // vl_PDU_SCCP.udataserv.pointer3 :=0; - processing_PDU_SCCP_UnitdataService( vl_PDU_SCCP.udataserv ); - } - - //****************************************************************** - //PDU_Error received - //****************************************************************** - else if (ischosen(vl_PDU_SCCP.pduerror)) - { - processing_PDU_SCCP_ProtDataUnitError( vl_PDU_SCCP.pduerror ); - } - - //****************************************************************** - //Inactivity test received - //****************************************************************** - else if (ischosen(vl_PDU_SCCP.inacttest)) - { - processing_PDU_SCCP_InactivityTest( vl_PDU_SCCP.inacttest ); - } - - //****************************************************************** - //Reset request received - //****************************************************************** - else if (ischosen(vl_PDU_SCCP.resetreq)) - { - processing_PDU_SCCP_ResetRequest( vl_PDU_SCCP.resetreq ); - } - - //****************************************************************** - //Reset confirm received - //****************************************************************** - else if (ischosen(vl_PDU_SCCP.resconf)) - { - processing_PDU_SCCP_ResetConfirm( vl_PDU_SCCP.resconf ); - } - - //****************************************************************** - //Connection refused received - //****************************************************************** - else if (ischosen(vl_PDU_SCCP.connrefused)) - { - // vl_PDU_SCCP.connrefused.pointer1 :=1; - processing_PDU_SCCP_ConnectionRefused( vl_PDU_SCCP.connrefused ); - } - else - { log ("Unsupported message received and discarded"); } - } - - []MTP3_SCCP_PORT.receive - { log("Unsupported or unrecognized message discarded after reception") } - - //****************************************************************** - //****************************************************************** - ////start second alternative-message received on user port - //****************************************************************** - //****************************************************************** - - [] SCCP_SP_PORT.check - {//start second alternative - - alt { //startalt1-subalternatives vill follow - - //****************************************************************** - //N_DATA_req - //****************************************************************** - [] SCCP_SP_PORT.receive( tr_ASP_N_DATA_req)-> value vl_N_DATA_req - { processing_ASP_N_DATA_req(vl_N_DATA_req); } - - //****************************************************************** - //N_UNITDATA_req at originating node - //****************************************************************** - [] SCCP_SP_PORT.receive( tr_ASP_N_UNITDATA_req ) -> value vl_N_UNITDATA_req - { processing_ASP_N_UNITDATA_req(vl_N_UNITDATA_req); } - - //****************************************************************** - //N_CONNECT_req , originating node - //****************************************************************** - [] SCCP_SP_PORT.receive( tr_ASP_N_CONNECT_req) -> value vl_N_CONNECT_req - { processing_ASP_N_CONNECT_req( vl_N_CONNECT_req);} - - //****************************************************************** - //N_CONNECT_resp - //****************************************************************** - [] SCCP_SP_PORT.receive( tr_ASP_N_CONNECT_res)-> value vl_N_CONNECT_res - { processing_ASP_N_CONNECT_res(vl_N_CONNECT_res); } - - //****************************************************************** - //N_DISCONNECT_req - //****************************************************************** - [] SCCP_SP_PORT.receive( tr_ASP_N_DISCONNECT_req)-> value vl_N_DISCONNECT_req - { processing_ASP_N_DISCONNECT_req(vl_N_DISCONNECT_req); } - - //****************************************************************** - //N_RESET_resp //will not be received!! - //****************************************************************** - //[] SCCP_SP_PORT.receive( tr_ASP_N_RESET_resp)-> value vl_N_RESET_resp; - - //****************************************************************** - //N_RESET_req //will not be received!! - //****************************************************************** - //[] SCCP_SP_PORT.receive( tr_ASP_N_RESET_req)-> value vl_N_RESET_req; - - //****************************************************************** - //If none of the above , then message is removed from the top of the - //stack and discarded - //****************************************************************** - [] SCCP_SP_PORT.receive - { } - - }//endalt1 - - }//end second alternative-message received on user port - - //****************************************************************** - //connection timer expired - //****************************************************************** - [v_T_conn_est[0]] T_conn_est[0].timeout {Conn_Timer_Expired(0); - v_T_conn_est[0] := false;} - [v_T_conn_est[1]] T_conn_est[1].timeout {Conn_Timer_Expired(1); - v_T_conn_est[1] := false;} - [v_T_conn_est[2]] T_conn_est[2].timeout {Conn_Timer_Expired(2); - v_T_conn_est[2] := false;} - [v_T_conn_est[3]] T_conn_est[3].timeout {Conn_Timer_Expired(3); - v_T_conn_est[3] := false;} - [v_T_conn_est[4]] T_conn_est[4].timeout {Conn_Timer_Expired(4); - v_T_conn_est[4] := false;} - [v_T_conn_est[5]] T_conn_est[5].timeout {Conn_Timer_Expired(5); - v_T_conn_est[5] := false;} - [v_T_conn_est[6]] T_conn_est[6].timeout {Conn_Timer_Expired(6); - v_T_conn_est[6] := false;} - [v_T_conn_est[7]] T_conn_est[7].timeout {Conn_Timer_Expired(7); - v_T_conn_est[7] := false;} - [v_T_conn_est[8]] T_conn_est[8].timeout {Conn_Timer_Expired(8); - v_T_conn_est[8] := false;} - [v_T_conn_est[9]] T_conn_est[9].timeout {Conn_Timer_Expired(9); - v_T_conn_est[9] := false;} - [v_T_conn_est[10]] T_conn_est[10].timeout {Conn_Timer_Expired(10); - v_T_conn_est[10] := false;} - [v_T_conn_est[11]] T_conn_est[11].timeout {Conn_Timer_Expired(11); - v_T_conn_est[11] := false;} - [v_T_conn_est[12]] T_conn_est[12].timeout {Conn_Timer_Expired(12); - v_T_conn_est[12] := false;} - [v_T_conn_est[13]] T_conn_est[13].timeout {Conn_Timer_Expired(13); - v_T_conn_est[13] := false;} - [v_T_conn_est[14]] T_conn_est[14].timeout {Conn_Timer_Expired(14); - v_T_conn_est[14] := false;} - [v_T_conn_est[15]] T_conn_est[15].timeout {Conn_Timer_Expired(15); - v_T_conn_est[15] := false;} - - //****************************************************************** - //send inactivity timer expired - //****************************************************************** - - [v_T_ias[0]] T_ias[0].timeout {SendInactivity_Timer_Expired(0); - v_T_ias[0] := false;} - [v_T_ias[1]] T_ias[1].timeout {SendInactivity_Timer_Expired(1); - v_T_ias[1] := false;} - [v_T_ias[2]] T_ias[2].timeout {SendInactivity_Timer_Expired(2); - v_T_ias[2] := false;} - [v_T_ias[3]] T_ias[3].timeout {SendInactivity_Timer_Expired(3); - v_T_ias[3] := false;} - [v_T_ias[4]] T_ias[4].timeout {SendInactivity_Timer_Expired(4); - v_T_ias[4] := false;} - [v_T_ias[5]] T_ias[5].timeout {SendInactivity_Timer_Expired(5); - v_T_ias[5] := false;} - [v_T_ias[6]] T_ias[6].timeout {SendInactivity_Timer_Expired(6); - v_T_ias[6] := false;} - [v_T_ias[7]] T_ias[7].timeout {SendInactivity_Timer_Expired(7); - v_T_ias[7] := false;} - [v_T_ias[8]] T_ias[8].timeout {SendInactivity_Timer_Expired(8); - v_T_ias[8] := false;} - [v_T_ias[9]] T_ias[9].timeout {SendInactivity_Timer_Expired(9); - v_T_ias[i] := false;} - [v_T_ias[10]] T_ias[10].timeout {SendInactivity_Timer_Expired(10); - v_T_ias[10] := false;} - [v_T_ias[11]] T_ias[11].timeout {SendInactivity_Timer_Expired(11); - v_T_ias[11] := false;} - [v_T_ias[12]] T_ias[12].timeout {SendInactivity_Timer_Expired(12); - v_T_ias[12] := false;} - [v_T_ias[13]] T_ias[13].timeout {SendInactivity_Timer_Expired(13); - v_T_ias[13] := false;} - [v_T_ias[14]] T_ias[14].timeout {SendInactivity_Timer_Expired(14); - v_T_ias[14] := false;} - [v_T_ias[15]] T_ias[15].timeout {SendInactivity_Timer_Expired(15); - v_T_ias[15] := false;} - - //****************************************************************** - //receive inactivity timer expired - //****************************************************************** - [v_T_iar[0]] T_iar[0].timeout {ReceiveInactivity_Timer_Expired(0); - v_T_iar[0] := false;} - [v_T_iar[1]] T_iar[1].timeout {ReceiveInactivity_Timer_Expired(1); - v_T_iar[1] := false;} - [v_T_iar[2]] T_iar[2].timeout {ReceiveInactivity_Timer_Expired(2); - v_T_iar[2] := false;} - [v_T_iar[3]] T_iar[3].timeout {ReceiveInactivity_Timer_Expired(3); - v_T_iar[3] := false;} - [v_T_iar[4]] T_iar[4].timeout {ReceiveInactivity_Timer_Expired(4); - v_T_iar[4] := false;} - [v_T_iar[5]] T_iar[5].timeout {ReceiveInactivity_Timer_Expired(5); - v_T_iar[5] := false;} - [v_T_iar[6]] T_iar[6].timeout {ReceiveInactivity_Timer_Expired(6); - v_T_iar[6] := false;} - [v_T_iar[7]] T_iar[7].timeout {ReceiveInactivity_Timer_Expired(7); - v_T_iar[7] := false;} - [v_T_iar[8]] T_iar[8].timeout {ReceiveInactivity_Timer_Expired(8); - v_T_iar[8] := false;} - [v_T_iar[9]] T_iar[9].timeout {ReceiveInactivity_Timer_Expired(9); - v_T_iar[9] := false;} - [v_T_iar[10]] T_iar[10].timeout {ReceiveInactivity_Timer_Expired(10); - v_T_iar[10] := false;} - [v_T_iar[11]] T_iar[11].timeout {ReceiveInactivity_Timer_Expired(11); - v_T_iar[11] := false;} - [v_T_iar[12]] T_iar[12].timeout {ReceiveInactivity_Timer_Expired(12); - v_T_iar[12] := false;} - [v_T_iar[13]] T_iar[13].timeout {ReceiveInactivity_Timer_Expired(13); - v_T_iar[13] := false;} - [v_T_iar[14]] T_iar[14].timeout {ReceiveInactivity_Timer_Expired(14); - v_T_iar[14] := false;} - [v_T_iar[15]] T_iar[15].timeout {ReceiveInactivity_Timer_Expired(15); - v_T_iar[15] := false;} - - //****************************************************************** - //release timer expired - //****************************************************************** - [v_T_rel[0]] T_rel[0].timeout {Release_Timer_Expired(0); - v_T_rel[0] := false;} - [v_T_rel[1]] T_rel[1].timeout {Release_Timer_Expired(1); - v_T_rel[1] := false;} - [v_T_rel[2]] T_rel[2].timeout {Release_Timer_Expired(2); - v_T_rel[2] := false;} - [v_T_rel[3]] T_rel[3].timeout {Release_Timer_Expired(3); - v_T_rel[3] := false;} - [v_T_rel[4]] T_rel[4].timeout {Release_Timer_Expired(4); - v_T_rel[4] := false;} - [v_T_rel[5]] T_rel[5].timeout {Release_Timer_Expired(5); - v_T_rel[5] := false;} - [v_T_rel[6]] T_rel[6].timeout {Release_Timer_Expired(6); - v_T_rel[6] := false;} - [v_T_rel[7]] T_rel[7].timeout {Release_Timer_Expired(7); - v_T_rel[7] := false;} - [v_T_rel[8]] T_rel[8].timeout {Release_Timer_Expired(8); - v_T_rel[8] := false;} - [v_T_rel[9]] T_rel[9].timeout {Release_Timer_Expired(9); - v_T_rel[9] := false;} - [v_T_rel[10]] T_rel[10].timeout {Release_Timer_Expired(10); - v_T_rel[10] := false;} - [v_T_rel[11]] T_rel[11].timeout {Release_Timer_Expired(11); - v_T_rel[11] := false;} - [v_T_rel[12]] T_rel[12].timeout {Release_Timer_Expired(12); - v_T_rel[12] := false;} - [v_T_rel[13]] T_rel[13].timeout {Release_Timer_Expired(13); - v_T_rel[13] := false;} - [v_T_rel[14]] T_rel[14].timeout {Release_Timer_Expired(14); - v_T_rel[14] := false;} - [v_T_rel[15]] T_rel[15].timeout {Release_Timer_Expired(15); - v_T_rel[15] := false;} - - //****************************************************************** - //repeat release timer expired - //****************************************************************** - - [v_T_repeat_rel[0]] T_repeat_rel[0].timeout {RepeatRelease_Timer_Expired(0); - v_T_repeat_rel[0] := false;} - [v_T_repeat_rel[1]] T_repeat_rel[1].timeout {RepeatRelease_Timer_Expired(1); - v_T_repeat_rel[1] := false;} - [v_T_repeat_rel[2]] T_repeat_rel[2].timeout {RepeatRelease_Timer_Expired(2); - v_T_repeat_rel[2] := false;} - [v_T_repeat_rel[3]] T_repeat_rel[3].timeout {RepeatRelease_Timer_Expired(3); - v_T_repeat_rel[3] := false;} - [v_T_repeat_rel[4]] T_repeat_rel[4].timeout {RepeatRelease_Timer_Expired(4); - v_T_repeat_rel[4] := false;} - [v_T_repeat_rel[5]] T_repeat_rel[5].timeout {RepeatRelease_Timer_Expired(5); - v_T_repeat_rel[5] := false;} - [v_T_repeat_rel[6]] T_repeat_rel[6].timeout {RepeatRelease_Timer_Expired(6); - v_T_repeat_rel[6] := false;} - [v_T_repeat_rel[7]] T_repeat_rel[7].timeout {RepeatRelease_Timer_Expired(7); - v_T_repeat_rel[7] := false;} - [v_T_repeat_rel[8]] T_repeat_rel[8].timeout {RepeatRelease_Timer_Expired(8); - v_T_repeat_rel[8] := false;} - [v_T_repeat_rel[9]] T_repeat_rel[9].timeout {RepeatRelease_Timer_Expired(9); - v_T_repeat_rel[9] := false;} - [v_T_repeat_rel[10]] T_repeat_rel[10].timeout {RepeatRelease_Timer_Expired(10); - v_T_repeat_rel[10] := false;} - [v_T_repeat_rel[11]] T_repeat_rel[11].timeout {RepeatRelease_Timer_Expired(11); - v_T_repeat_rel[11] := false;} - [v_T_repeat_rel[12]] T_repeat_rel[12].timeout {RepeatRelease_Timer_Expired(12); - v_T_repeat_rel[12] := false;} - [v_T_repeat_rel[13]] T_repeat_rel[13].timeout {RepeatRelease_Timer_Expired(13); - v_T_repeat_rel[13] := false;} - [v_T_repeat_rel[14]] T_repeat_rel[14].timeout {RepeatRelease_Timer_Expired(14); - v_T_repeat_rel[14] := false;} - [v_T_repeat_rel[15]] T_repeat_rel[15].timeout {RepeatRelease_Timer_Expired(15); - v_T_repeat_rel[15] := false;} - - //****************************************************************** - //interval timer expired - //****************************************************************** - [v_T_int[0]] T_int[0].timeout {Interval_Timer_Expired(0); - v_T_int[0] := false;} - [v_T_int[1]] T_int[1].timeout {Interval_Timer_Expired(1); - v_T_int[1] := false;} - [v_T_int[2]] T_int[2].timeout {Interval_Timer_Expired(2); - v_T_int[2] := false;} - [v_T_int[3]] T_int[3].timeout {Interval_Timer_Expired(3); - v_T_int[3] := false;} - [v_T_int[4]] T_int[4].timeout {Interval_Timer_Expired(4); - v_T_int[4] := false;} - [v_T_int[5]] T_int[5].timeout {Interval_Timer_Expired(5); - v_T_int[5] := false;} - [v_T_int[6]] T_int[6].timeout {Interval_Timer_Expired(6); - v_T_int[6] := false;} - [v_T_int[7]] T_int[7].timeout {Interval_Timer_Expired(7); - v_T_int[7] := false;} - [v_T_int[8]] T_int[8].timeout {Interval_Timer_Expired(8); - v_T_int[8] := false;} - [v_T_int[9]] T_int[9].timeout {Interval_Timer_Expired(9); - v_T_int[9] := false;} - [v_T_int[10]] T_int[10].timeout {Interval_Timer_Expired(10); - v_T_int[10] := false;} - [v_T_int[11]] T_int[11].timeout {Interval_Timer_Expired(11); - v_T_int[11] := false;} - [v_T_int[12]] T_int[12].timeout {Interval_Timer_Expired(12); - v_T_int[12] := false;} - [v_T_int[13]] T_int[13].timeout {Interval_Timer_Expired(13); - v_T_int[13] := false;} - [v_T_int[14]] T_int[14].timeout {Interval_Timer_Expired(14); - v_T_int[14] := false;} - [v_T_int[15]] T_int[15].timeout {Interval_Timer_Expired(15); - v_T_int[15] := false;} - - //****************************************************************** - //reset timer expired - //****************************************************************** - [v_T_reset[0]] T_reset[0].timeout {Reset_Timer_Expired(0); - v_T_reset[0] := false;} - [v_T_reset[1]] T_reset[1].timeout {Reset_Timer_Expired(1); - v_T_reset[1] := false;} - [v_T_reset[2]] T_reset[2].timeout {Reset_Timer_Expired(2); - v_T_reset[2] := false;} - [v_T_reset[3]] T_reset[3].timeout {Reset_Timer_Expired(3); - v_T_reset[3] := false;} - [v_T_reset[4]] T_reset[4].timeout {Reset_Timer_Expired(4); - v_T_reset[4] := false;} - [v_T_reset[5]] T_reset[5].timeout {Reset_Timer_Expired(5); - v_T_reset[5] := false;} - [v_T_reset[6]] T_reset[6].timeout {Reset_Timer_Expired(6); - v_T_reset[6] := false;} - [v_T_reset[7]] T_reset[7].timeout {Reset_Timer_Expired(7); - v_T_reset[7] := false;} - [v_T_reset[8]] T_reset[8].timeout {Reset_Timer_Expired(8); - v_T_reset[8] := false;} - [v_T_reset[9]] T_reset[9].timeout {Reset_Timer_Expired(9); - v_T_reset[9] := false;} - [v_T_reset[10]] T_reset[10].timeout {Reset_Timer_Expired(10); - v_T_reset[10] := false;} - [v_T_reset[11]] T_reset[11].timeout {Reset_Timer_Expired(11); - v_T_reset[11] := false;} - [v_T_reset[12]] T_reset[12].timeout {Reset_Timer_Expired(12); - v_T_reset[12] := false;} - [v_T_reset[13]] T_reset[13].timeout {Reset_Timer_Expired(13); - v_T_reset[13] := false;} - [v_T_reset[14]] T_reset[14].timeout {Reset_Timer_Expired(14); - v_T_reset[14] := false;} - [v_T_reset[15]] T_reset[15].timeout {Reset_Timer_Expired(15); - v_T_reset[15] := false;} - - //****************************************************************** - //internal_reset timer expired-sending internal signals! - //****************************************************************** - [v_T_internal_reset[0]] T_internal_reset[0].timeout {InternalResetTimer_Expired(0); - v_T_internal_reset[0] := false;} - [v_T_internal_reset[1]] T_internal_reset[1].timeout {InternalResetTimer_Expired(1); - v_T_internal_reset[1] := false;} - [v_T_internal_reset[2]] T_internal_reset[2].timeout {InternalResetTimer_Expired(2); - v_T_internal_reset[2] := false;} - [v_T_internal_reset[3]] T_internal_reset[3].timeout {InternalResetTimer_Expired(3); - v_T_internal_reset[3] := false;} - [v_T_internal_reset[4]] T_internal_reset[4].timeout {InternalResetTimer_Expired(4); - v_T_internal_reset[4] := false;} - [v_T_internal_reset[5]] T_internal_reset[5].timeout {InternalResetTimer_Expired(5); - v_T_internal_reset[5] := false;} - [v_T_internal_reset[6]] T_internal_reset[6].timeout {InternalResetTimer_Expired(6); - v_T_internal_reset[6] := false;} - [v_T_internal_reset[7]] T_internal_reset[7].timeout {InternalResetTimer_Expired(7); - v_T_internal_reset[7] := false;} - [v_T_internal_reset[8]] T_internal_reset[8].timeout {InternalResetTimer_Expired(8); - v_T_internal_reset[8] := false;} - [v_T_internal_reset[9]] T_internal_reset[9].timeout {InternalResetTimer_Expired(9); - v_T_internal_reset[9] := false;} - [v_T_internal_reset[10]] T_internal_reset[10].timeout {InternalResetTimer_Expired(10); - v_T_internal_reset[10] := false;} - [v_T_internal_reset[11]] T_internal_reset[11].timeout {InternalResetTimer_Expired(11); - v_T_internal_reset[11] := false;} - [v_T_internal_reset[12]] T_internal_reset[12].timeout {InternalResetTimer_Expired(12); - v_T_internal_reset[12] := false;} - [v_T_internal_reset[13]] T_internal_reset[13].timeout {InternalResetTimer_Expired(13); - v_T_internal_reset[13] := false;} - [v_T_internal_reset[14]] T_internal_reset[14].timeout {InternalResetTimer_Expired(14); - v_T_internal_reset[14] := false;} - [v_T_internal_reset[15]] T_internal_reset[15].timeout {InternalResetTimer_Expired(15); - v_T_internal_reset[15] := false;} - - //****************************************************************** - //guard timer expired - no answer to ASP_SCCP_N_CONNECT_ind received - //****************************************************************** - [v_T_guard[0]] T_guard[0].timeout {GuardTimer_Expired(0); - v_T_guard[0] := false;} - [v_T_guard[1]] T_guard[1].timeout {GuardTimer_Expired(1); - v_T_guard[1] := false;} - [v_T_guard[2]] T_guard[2].timeout {GuardTimer_Expired(2); - v_T_guard[2] := false;} - [v_T_guard[3]] T_guard[3].timeout {GuardTimer_Expired(3); - v_T_guard[3] := false;} - [v_T_guard[4]] T_guard[4].timeout {GuardTimer_Expired(4); - v_T_guard[4] := false;} - [v_T_guard[5]] T_guard[5].timeout {GuardTimer_Expired(5); - v_T_guard[5] := false;} - [v_T_guard[6]] T_guard[6].timeout {GuardTimer_Expired(6); - v_T_guard[6] := false;} - [v_T_guard[7]] T_guard[7].timeout {GuardTimer_Expired(7); - v_T_guard[7] := false;} - [v_T_guard[8]] T_guard[8].timeout {GuardTimer_Expired(8); - v_T_guard[8] := false;} - [v_T_guard[9]] T_guard[9].timeout {GuardTimer_Expired(9); - v_T_guard[9] := false;} - [v_T_guard[10]] T_guard[10].timeout {GuardTimer_Expired(10); - v_T_guard[10] := false;} - [v_T_guard[11]] T_guard[11].timeout {GuardTimer_Expired(11); - v_T_guard[11] := false;} - [v_T_guard[12]] T_guard[12].timeout {GuardTimer_Expired(12); - v_T_guard[12] := false;} - [v_T_guard[13]] T_guard[13].timeout {GuardTimer_Expired(13); - v_T_guard[13] := false;} - [v_T_guard[14]] T_guard[14].timeout {GuardTimer_Expired(14); - v_T_guard[14] := false;} - [v_T_guard[15]] T_guard[15].timeout {GuardTimer_Expired(15); - v_T_guard[15] := false;} - - - }//endalt0 - - //****************************************************************** - }//endwhile - //****************************************************************** - -}//endfunction ScanEvents - -//****************************************************************** -}//endgroup SCCPFunctions -//****************************************************************** - -}//endmodule diff --git a/SCCP_CNL113341/src/SCCP_EncDec.cc b/SCCP_CNL113341/src/SCCP_EncDec.cc deleted file mode 100644 index f00b08a9b..000000000 --- a/SCCP_CNL113341/src/SCCP_EncDec.cc +++ /dev/null @@ -1,19 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// // -// Copyright Test Competence Center (TCC) ETH 2007 // -// // -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied // -// // -/////////////////////////////////////////////////////////////////////////////// -// File: SCCP_EncDec.cc -// Rev: R6A05 -// Prodnr: CNL 113 341 -// Updated: 2007-09-17 -// Contact: http://ttcn.ericsson.se - -// Please note: Because the encoder/decoder functions are generated by the -// TITAN, the SCCP_EncDec.cc is kept only for compatibility issue and -// should be removed from the projects. diff --git a/SCCP_CNL113341/src/SCCP_Mapping.ttcnpp b/SCCP_CNL113341/src/SCCP_Mapping.ttcnpp deleted file mode 100644 index 0de496b72..000000000 --- a/SCCP_CNL113341/src/SCCP_Mapping.ttcnpp +++ /dev/null @@ -1,129 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// // -// Copyright Test Competence Center (TCC) ETH 2012 // -// // -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied // -// // -/////////////////////////////////////////////////////////////////////////////// -// File: SCCP_Mapping.ttcnpp -// Description: SCCP <-> MTP3 dual faced port definition -// Rev: R6A05 -// Prodnr: CNL 113 341 -// Updated: 2012-11-05 -// Contact: http://ttcn.ericsson.se -module SCCP_Mapping -{ -import from MTP3asp_Types all; -import from MTP3asp_PortType all; -import from SCCP_Types all; -import from SCCPasp_Types all; - -// ************************************************************************* -// ************************************************************************* -//SCCP Component related declarations -// ************************************************************************* -// ************************************************************************* - -type integer UnhandledProtocol; - -// SCCPasp_SP_PT SCCP_SP_PORT -//+-----------------+-----------------+ -//| SCCP_CT / -//| / -//+-----------------+-----------------+ -//MTP3asp_SCCP_PT MTP3_SCCP_PORT -// | -// - -//#ifdef USE_MTP3_DISTRIBUTOR -//Version to internal port -type port MTP3asp_SCCP_PT message -{ - in PDU_SCCP; - out ASP_MTP3_TRANSFERreq_sccp; -} -with -{ extension - "internal user MTP3asp_PT - out(ASP_MTP3_TRANSFERreq_sccp - -> ASP_MTP3_TRANSFERreq: function(f_enc_SCCP_to_MTP)) - in( ASP_MTP3_TRANSFERind - -> PDU_SCCP: function(f_dec_MTP_to_SCCP), - - : discard; - ASP_MTP3_PAUSE -> -: discard; - ASP_MTP3_RESUME -> -: discard; - ASP_MTP3_STATUS -> -: discard) - " -} -/*#else -//Version to external port -type port MTP3asp_SCCP_PT message -{ - in PDU_SCCP; - in UnhandledProtocol; - out ASP_MTP3_TRANSFERreq_sccp; -} -with -{ extension - "user MTP3asp_PT - out(ASP_MTP3_TRANSFERreq_sccp - -> ASP_MTP3_TRANSFERreq: function(f_enc_SCCP_to_MTP)) - in( ASP_MTP3_TRANSFERind -> - PDU_SCCP: function(f_dec_MTP_to_SCCP), - UnhandledProtocol: function(f_dec_MTP_to_UnhandledProtocol); - ASP_MTP3_PAUSE -> -: discard; - ASP_MTP3_RESUME -> -: discard; - ASP_MTP3_STATUS -> -: discard) - " -} - -function f_dec_MTP_to_UnhandledProtocol(in ASP_MTP3_TRANSFERind pl_in, out UnhandledProtocol pl_out) return integer -{ - pl_out := 1; - return 0; -} with {extension "prototype(backtrack)" } - -#endif -*/ - -function f_enc_SCCP_to_MTP - (in ASP_MTP3_TRANSFERreq_sccp pl_in, - out ASP_MTP3_TRANSFERreq pl_out) return integer -{ - var bitstring vl_sio_bit := oct2bit(pl_in.sio); - var MTP3_Field_sio vl_sio_struct; - vl_sio_struct.ni := substr(vl_sio_bit,0,2); - vl_sio_struct.prio := substr(vl_sio_bit,2,2); - vl_sio_struct.si := substr(vl_sio_bit,4,4); - - pl_out := - { - sio := vl_sio_struct, - opc := pl_in.opc, - dpc := pl_in.dpc, - sls := pl_in.sls, - data:= enc_PDU_SCCP(pl_in.data) - } - return 0; -} with {extension "prototype(backtrack)" } - -function f_dec_MTP_to_SCCP - (in ASP_MTP3_TRANSFERind pl_in, - out PDU_SCCP pl_out) return integer -{ - if (pl_in.sio.si != '0011'B) - { - log("The received message is not SCCP. Ignored."); - return 1; - } - pl_out := dec_PDU_SCCP(pl_in.data); - - return 0; -} with {extension "prototype(backtrack)" } - - - -} diff --git a/SCCP_CNL113341/src/SCCP_Types.ttcn b/SCCP_CNL113341/src/SCCP_Types.ttcn deleted file mode 100644 index 168c317a9..000000000 --- a/SCCP_CNL113341/src/SCCP_Types.ttcn +++ /dev/null @@ -1,1553 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// // -// Copyright Test Competence Center (TCC) ETH 2008 // -// // -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied // -// // -/////////////////////////////////////////////////////////////////////////////// -// File: SCCP_Types.ttcn -// Description: SS7 SCCP definitions according to specification -// ITU-T SS7 SCCP, ANSI ..., ttc ..., mpt -// Reference: ITU-T: Recommendation Q.711-Q.714 (07/96) -// ANSI: T1.112-2001 -// ttc: JT-Q711 -JT-Q714 (ver 2, 04/97) -// Rev: R6A05 -// Prodnr: CNL 113 341 -// Updated: 2008-05-08 -// Contact: http://ttcn.ericsson.se - -module SCCP_Types.objid { itu_t(0) identified_organization (4) etsi(0) - reserved(127) etsi_identified_organization(0) ericsson(5) - testing (0) generic(0) sccp(1) v3(3) typeDefinitions(2) patchNo(3)} - -{//start of the module - -modulepar -{//startparameters - -//------------------Protocol Timer Values---------------------------------- - -//Waiting for connection confirm message -1 to 2 minutes - - float tspc_timer_T_conn_est:=120.0; - - //Delay to send a message on a conn IT on a - //connection section when there are no - //messages to send - //5 to 10 minutes - - float tspc_timer_T_ias:=600.0; - //Waiting to receive a message on a connection - //section - //11 to 21 minutes - float tspc_timer_T_iar:=1260.0; - //Waiting for release complete message -10 to 20 seconds - - float tspc_timer_T_rel:=20.0; - //Waiting for release complete message; or to - //repeat sending released message after the - //initial T(rel) expiry - //10 to 20 seconds - float tspc_timer_T_repeat_rel:=20.0; - - //Waiting for release complete message; or to - //release connection resources, freeze the LRN - //and alert a maintenance function after the - //initial T(rel) expiry - //extending to 1 minute - float tspc_timer_T_int:=60.0; - - //Waiting to resume normal procedure for - //temporary connection sections during the - //restart procedure - //23 to 25 minutes - float tspc_timer_T_guard:=1500.0; - - //Waiting to release temporary connection - //section or alert maintenance function after - //reset request message is sent - //10 to 20 seconds - float tspc_timer_T_reset:=20.0; - //Waiting to receive all the segments of the - //remaining segments single segmented - //message after receiving the first segment - //10 to 20 seconds - - // float tspc_timer_T_reasssembly; - - float tspc_timer_T_internal_reset:=0.0; - //zero-only for sending internal signals!! - - - float tspc_timer_guard :=120.0 - //the same as tspc_timer_T_conn_est:1 or 2 minutes - -}//end parameters - - - -import from General_Types all; -import from MTP3asp_Types all; -//import from MTP3asp_PortType all; - -import from SCCPasp_Types all; - -external function enc_PDU_SCCP( in PDU_SCCP pdu) return octetstring - with { extension "prototype(convert)" - extension "encode(RAW)" - }; -external function dec_PDU_SCCP( in octetstring o) return PDU_SCCP - with { extension "prototype(convert)" - extension "decode(RAW)" - }; - -// Address encoder/decoder for itu: -external function enc_PDU_SCCP_Address_itu( in SCCP_param_CPartyAddress_itu pdu) return octetstring - with { extension "prototype(convert)" - extension "encode(RAW)" - }; -external function dec_PDU_SCCP_Address_itu( in octetstring o) return SCCP_param_CPartyAddress_itu - with { extension "prototype(convert)" - extension "decode(RAW)" - }; - -// Address encoder/decoder for ansi: -external function enc_PDU_SCCP_Address_ansi( in SCCP_param_CPartyAddress_ansi pdu) return octetstring - with { extension "prototype(convert)" - extension "encode(RAW)" - }; -external function dec_PDU_SCCP_Address_ansi( in octetstring o) return SCCP_param_CPartyAddress_ansi - with { extension "prototype(convert)" - extension "decode(RAW)" - }; - -// Address encoder/decoder for ttc: -external function enc_PDU_SCCP_Address_ttc( in SCCP_param_CPartyAddress_ttc pdu) return octetstring - with { extension "prototype(convert)" - extension "encode(RAW)" - }; -external function dec_PDU_SCCP_Address_ttc( in octetstring o) return SCCP_param_CPartyAddress_ttc - with { extension "prototype(convert)" - extension "decode(RAW)" - }; - -// Address encoder/decoder for mpt: -external function enc_PDU_SCCP_Address_mpt( in SCCP_param_CPartyAddress_mpt pdu) return octetstring - with { extension "prototype(convert)" - extension "encode(RAW)" - }; -external function dec_PDU_SCCP_Address_mpt( in octetstring o) return SCCP_param_CPartyAddress_mpt - with { extension "prototype(convert)" - extension "decode(RAW)" - }; - -group Types -{ - group FieldDefinitions - { - //--------------------------------------------------------------------------- - // Field Parameter Name (ITU:$3/Q713 $3, ANSI:Table 2/T1.112.3-2001 - //--------------------------------------------------------------------------- - type integer SCCP_field_ParameterName with { variant "FIELDLENGTH(8)"}; - const SCCP_field_ParameterName con_SCCP_eop :=0, con_SCCP_dLocRef:=1, - con_SCCP_sLocRef:=2, con_SCCP_cdPA:=3, - con_SCCP_cgPA:=4, con_SCCP_protclass:=5, - con_SCCP_segmReas:=6, con_SCCP_recSeqNum:=7, - con_SCCP_seqSegm:=8, con_SCCP_credit:=9, - con_SCCP_relCause:=10, con_SCCP_retCause:=11, - con_SCCP_resCause:=12, con_SCCP_errorCause:=13, - con_SCCP_refCause:=14, con_SCCP_data:=15, - con_SCCP_segm:=16, con_SCCP_hopCount:=17, - con_SCCP_imp:=18, con_SCCP_longData:=19, - con_SCCP_mti:=248, con_SCCP_ins:=249, - con_SCCP_isni:=250; - - - //EOP End of optional parameters, DLocRef Destination local reference, - //SLocRef Source local reference, CdPA Called party address, - //CgPA Calling party address, ProtClass Protocol class, - //SegmReas Segmenting/reassembling, RecSeqNum Receive sequence number, - //SeqSegm Sequencing/segmenting, Credit Credit, - //RelCause Release cause, RetCau Return cause, - //ResCau Reset cause, ErrCau Error cause, - //RefCau Refusal cause, Data Data, - //SEGM Segmentation, HopCount Hop counter, - //IMP Importance, LongData Long data, - // --- only in ANSI:--- - //MTI Message Type Interworking - //INS - //ISNI - //ISNI - - //--------------------------------------------------------------------------- - // Field Address Indicator (ITU: Q713 $3.4.1, ANSI: T1.112.3 $3.4.1) - //--------------------------------------------------------------------------- - type record SCCP_field_AddressIndicator_itu - { - BIT1 pointCodeIndic, - BIT1 ssnIndicator, - BIT4 globalTitleIndic, - BIT1 routingIndicator, - BIT1 reserved - } - with { variant "" } - - // field order is interesting at coding/decoding - type record SCCP_field_AddressIndicator_ansi - { - BIT1 ssnIndicator, - BIT1 pointCodeIndic, - BIT4 globalTitleIndic, - BIT1 routingIndicator, - BIT1 reserved - } - with { variant "" } - - //--------------------------------------------------------------------------- - // Subfield Signalling Point Code (Q713 $3.4.2.1) - //--------------------------------------------------------------------------- - // use functions SCCP_getSPC and SCCP_setSPC to handle it!!! - - type BIT16 SCCP_field_SignallingPointCode_itu; // TO BE DEFINED: msb or lsb ??? - type BIT24 SCCP_field_SignallingPointCode_ansi; // TO BE DEFINED: msb or lsb ??? - type BIT16 SCCP_field_SignallingPointCode_ttc; // TO BE DEFINED: msb or lsb ??? - type BIT24 SCCP_field_SignallingPointCode_mpt; // TO BE DEFINED: msb or lsb ??? - //--------------------------------------------------------------------------- - // Subfield Subsystem Number (Q713 $3.4.2.2) - //--------------------------------------------------------------------------- - //values declared in SCCPConstants in SCCP.ttcn - - type integer SCCP_field_SubsystemNumber - with { variant "FIELDLENGTH(8)" }; - - - //--------------------------------------------------------------------------- - // Subfield Global Title (ITU: Q713 $3.4.2.3, ANSI T1.112.3 $3.4.2.3 - //--------------------------------------------------------------------------- - - //--------------------------------------------------------------------------- - // Subfield Global Title, Nature of address only - //ITU: GTI=0001, Q713 $3.4.2.3.1 - //ANSI: - - - type record SCCP_field_GlobalTitle_NoA - { - BIT7 natureOfAddress, - BIT1 oddeven, - hexstring globalTitleAddress - //it should be hexstring, number digits are in BCD; - //hexstring is already supported yet by ETH compiler - } - with { variant "" } - - - //--------------------------------------------------------------------------- - // Global Title, Translation type only ( - // ITU: GTI=0010, Q713 $3.4.2.3.2 - // ANSI: GTI=0010, Figure6A/T1.112.3 - - type record SCCP_field_GlobalTitle_TT - { - OCT1 translationType, - hexstring globalTitleAddress - } - with { variant "" } - - - //--------------------------------------------------------------------------- - // Global Title, Translation type & numbering plan & encoding scheme - // ITU: GTI=0011, Q713 $3.4.2.3.3) - // ANSI GTI=0001, Figure6/T1.112.3 - - type record SCCP_field_GlobalTitle_TT_NP_ES - { - OCT1 translationType, - BIT4 encodingScheme, - BIT4 numberingPlan, - hexstring globalTitleAddress - } - with { variant "" } - - - //----------------------------------------------------------------------------- - // Global Title, Translation type & numbering plan & encoding scheme & nature of - // address - // GTI=0100, Q713 $3.4.2.3.4) - // ANSI: - - - // Suggested to change name to SCCP_field_GlobalTitle_TT_NP_ES_NoA - - type record SCCP_field_SignallingPointCode_TT_NP_ES_NoA - { - OCT1 translationType, - BIT4 encodingScheme, - BIT4 numberingPlan, - BIT7 natureOfAddress, - BIT1 reserved, - hexstring globalTitleAddress - } - with { variant "" } - - - type union SCCP_field_GlobalTitle_itu - { - SCCP_field_GlobalTitle_NoA gti0001, - SCCP_field_GlobalTitle_TT gti0010, - SCCP_field_GlobalTitle_TT_NP_ES gti0011, - SCCP_field_SignallingPointCode_TT_NP_ES_NoA gti0100 - } - with { variant "" } - // no TAG is added as alternatives depend on the gti field of the address indicator - - type union SCCP_field_GlobalTitle_ansi - { - SCCP_field_GlobalTitle_TT_NP_ES gti0001, - SCCP_field_GlobalTitle_TT gti0010 - } - with { variant "" } - -//--------------------------------------------------------------------------- -// Field Protocol Class (Q713 $3.6) -//--------------------------------------------------------------------------- -//type enumerated SCCP_field_ProtocolClass -// { class0 (0), class1(1), class2(2), class3(3) } -// with { variant "FIELDLENGTH(4)" } -//ethgry(2002-08-01): replaced by BIT4 - -//--------------------------------------------------------------------------- -// Field Importance (Q713 $3.19) -//--------------------------------------------------------------------------- - type integer SCCP_field_Importance - with { variant "FIELDLENGTH(3)" } - - -}//endgroup FieldDefinitions - - -group ParameterDefinitions -{ - //--------------------------------------------------------------------------- - // Parameter Message Type (Q713 $2.1) - //--------------------------------------------------------------------------- - type integer SCCP_param_MessageType with { variant "FIELDLENGTH(8)" } - const SCCP_param_MessageType cr:=1, cc:=2, cref:=3, - rlsd:=4, rlc:=5, dt1:=6, dt2:=7, - ak:=8, udt:=9, udts:=10, ed:=11, - ea:=12, rsr:=13, rsc:=14, err:=15, - it:=16, xudt:=17, xudts:=18, ludt:=19, - ludts:=20; - - - //CR Connection request, CC Connection confirm, CREF Connection refused, - //RLSD Released, RLC Release complete, DT1 Data form 1, - //DT2 Data form 2, AK Data acknowledgement, UDT Unitdata, - //UDTS Unitdata service, ED Expedited data, EA Expedited data acknowledgement, - //RSR Reset request, RSC Reset confirm, ERR Protocol data unit error, - //IT Inactivity test, XUDT Extended unitdata, XUDTS Extended unitdata service, - //LUDT Long unitdata, LUDTS Long unitdata service - - - //--------------------------------------------------------------------------- - // End of Optional Parameters (Q713 $3.1) - //--------------------------------------------------------------------------- - type record SCCP_param_EndOfOptionalParams - { - SCCP_field_ParameterName paramName (con_SCCP_eop) - } - with { variant "" } - - - //--------------------------------------------------------------------------- - // Parameter Destination Local Reference (Q713 $3.2) - //--------------------------------------------------------------------------- - type octetstring SCCP_param_DestLocalReference - with { variant "FIELDLENGTH(3)"} - - - //--------------------------------------------------------------------------- - // Parameter Source Local Reference (Q713 $3.3) - //--------------------------------------------------------------------------- - - type octetstring SCCP_param_SourceLocalReference - with { variant "FIELDLENGTH(3)" } - - - //--------------------------------------------------------------------------- - // Parameter Called/Calling Party Address (Q713 $3.4/$3.5) - //--------------------------------------------------------------------------- - /* Removed 2004.02.16 by ethbaat: - - type union SCCP_superfield_SignallingPointCode_itu - { - SCCP_field_SignallingPointCode_itu present, - Dummy absent - } with { variant "" } - - - type union SCCP_superfield_SignallingPointCode_ansi - { - SCCP_field_SignallingPointCode_ansi present, - Dummy absent - } with { variant "" } - - type union SCCP_superfield_SignallingPointCode_ttc - { - SCCP_field_SignallingPointCode_ttc present, - Dummy absent - } with { variant "" } - - type union SCCP_superfield_SubsystemNumber - { - SCCP_field_SubsystemNumber present, - Dummy absent - } with { variant "" } - - */ - - // Standard Independent Encoded Calling/Called Party Address: - // used in SCCP.ttcn/Convert - - // this address is used everywhere in SCCP inside: - type octetstring SCCP_CPartyAddressEnc_addr with { variant ""}; - - type record SCCP_param_CPartyAddressEnc - { - LIN1 paramLength, - SCCP_CPartyAddressEnc_addr addr - } with { variant (paramLength) "LENGTHTO( addr )"} - - // Structured, decoded versions: - - type record SCCP_param_CPartyAddress_itu { - - SCCP_field_AddressIndicator_itu addressIndicator, - SCCP_field_SignallingPointCode_itu signPointCode optional, - SCCP_field_SubsystemNumber subsystemNumber optional, - SCCP_field_GlobalTitle_itu globalTitle optional - } - with { variant (signPointCode) "PRESENCE( addressIndicator.pointCodeIndic = '1'B)"; - variant (subsystemNumber) "PRESENCE( addressIndicator.ssnIndicator = '1'B)"; - variant (globalTitle) "PRESENCE( {addressIndicator.globalTitleIndic = '0001'B, - addressIndicator.globalTitleIndic = '0010'B, - addressIndicator.globalTitleIndic = '0011'B, - addressIndicator.globalTitleIndic = '0100'B}), - CROSSTAG( - gti0001, addressIndicator.globalTitleIndic = '0001'B; - gti0010, addressIndicator.globalTitleIndic = '0010'B; - gti0011, addressIndicator.globalTitleIndic = '0011'B; - gti0100, addressIndicator.globalTitleIndic = '0100'B)" - } - - type record SCCP_param_CPartyAddress_ansi - { - SCCP_field_AddressIndicator_ansi addressIndicator, - SCCP_field_SubsystemNumber subsystemNumber optional, - SCCP_field_SignallingPointCode_ansi signPointCode optional, - SCCP_field_GlobalTitle_ansi globalTitle optional - } - with { - variant (subsystemNumber) "PRESENCE( addressIndicator.ssnIndicator = '1'B )"; - variant (signPointCode) "PRESENCE( addressIndicator.pointCodeIndic = '1'B )"; - variant (globalTitle) "PRESENCE( {addressIndicator.globalTitleIndic = '0001'B, - addressIndicator.globalTitleIndic = '0010'B}), - CROSSTAG( - gti0001, addressIndicator.globalTitleIndic = '0001'B; - gti0010, addressIndicator.globalTitleIndic = '0010'B)" - } - - type record SCCP_param_CPartyAddress_ttc { - - SCCP_field_AddressIndicator_itu addressIndicator, - SCCP_field_SignallingPointCode_ttc signPointCode optional, - SCCP_field_SubsystemNumber subsystemNumber optional, - SCCP_field_GlobalTitle_itu globalTitle optional - } - with { variant (signPointCode) "PRESENCE( addressIndicator.pointCodeIndic = '1'B)"; - variant (subsystemNumber) "PRESENCE( addressIndicator.ssnIndicator = '1'B)"; - variant (globalTitle) "PRESENCE( {addressIndicator.globalTitleIndic = '0001'B, - addressIndicator.globalTitleIndic = '0010'B, - addressIndicator.globalTitleIndic = '0011'B, - addressIndicator.globalTitleIndic = '0100'B}), - CROSSTAG( - gti0001, addressIndicator.globalTitleIndic = '0001'B; - gti0010, addressIndicator.globalTitleIndic = '0010'B; - gti0011, addressIndicator.globalTitleIndic = '0011'B; - gti0100, addressIndicator.globalTitleIndic = '0100'B)" - } - - type record SCCP_param_CPartyAddress_mpt { - - SCCP_field_AddressIndicator_itu addressIndicator, - SCCP_field_SignallingPointCode_mpt signPointCode optional, - SCCP_field_SubsystemNumber subsystemNumber optional, - SCCP_field_GlobalTitle_itu globalTitle optional - } - with { variant (signPointCode) "PRESENCE( addressIndicator.pointCodeIndic = '1'B)"; - variant (subsystemNumber) "PRESENCE( addressIndicator.ssnIndicator = '1'B)"; - variant (globalTitle) "PRESENCE( {addressIndicator.globalTitleIndic = '0001'B, - addressIndicator.globalTitleIndic = '0010'B, - addressIndicator.globalTitleIndic = '0011'B, - addressIndicator.globalTitleIndic = '0100'B}), - CROSSTAG( - gti0001, addressIndicator.globalTitleIndic = '0001'B; - gti0010, addressIndicator.globalTitleIndic = '0010'B; - gti0011, addressIndicator.globalTitleIndic = '0011'B; - gti0100, addressIndicator.globalTitleIndic = '0100'B)" - } - -// type record SCCP_param_CPartyAddress_opt_itu - type record SCCP_param_CPartyAddressEnc_opt - { - SCCP_field_ParameterName paramName(con_SCCP_cdPA, con_SCCP_cgPA), - LIN1 paramLength, - SCCP_CPartyAddressEnc_addr addr - } with { variant (paramLength) "LENGTHTO( addr )"} - - //--------------------------------------------------------------------------- - // Parameter Protocol Class (Q713 $3.6) - //--------------------------------------------------------------------------- - type record SCCP_param_ProtocolClass - { - BIT4 class, - BIT4 messageHandling - } - with { variant "" } - - - //--------------------------------------------------------------------------- - // Parameter Segmenting/reassembling (Q713 $3.7) - //--------------------------------------------------------------------------- - type record SCCP_param_SegmentingReassembl - { - BIT1 more, - BIT7 reserved - } - with { variant "" } - - - //--------------------------------------------------------------------------- - // Parameter Receive Sequence Number (Q713 $3.8) - //--------------------------------------------------------------------------- - type record SCCP_param_RecSeqNumber - { - BIT1 reserved, - BIT7 pr - } - with { variant "" } - - - //--------------------------------------------------------------------------- - // Parameter Sequencing/Segmenting (Q713 $3.9) - //--------------------------------------------------------------------------- - type record SCCP_param_SequencingSegmenting - { - BIT1 reserved, - BIT7 p_s, - BIT1 more, - BIT7 pr - } - with { variant "" } - - - //--------------------------------------------------------------------------- - // Parameter Credit(Q713 $3.10) - //--------------------------------------------------------------------------- - type octetstring SCCP_param_Credit - with { variant "FIELDLENGTH(1)" }//ethlel0813 - - - type record SCCP_param_Credit_opt - { - SCCP_field_ParameterName paramName(con_SCCP_credit), - LIN1 paramLength, // always 1! - OCT1 credit - } - with { variant "" } - - -//--------------------------------------------------------------------------- -// Parameter Release Cause(Q713 $3.11) -//--------------------------------------------------------------------------- -//type enumerated SCCP_param_ReleaseCause -// { endUserOrig(0), endUserCong(1), endUserFailure(2), sCCPUserOrig(3), -// remProcError(4), inconsConnData(5), accessFailure(6), accessCongestion(7), -// subsystFailure(8), subsystCongest(9), mTPFailure(10), networkCongest(11), -// expResetTimer(12), expRecInacTimer(13), reserved(14), unqualified(15), -// sCCPFailure(16) -// } -// with { variant "FIELDLENGTH(8)" } - -//values declared in SCCPConstants in SCCP.ttcn - - type integer SCCP_param_ReleaseCause - with { variant "FIELDLENGTH(8), COMP(nosign)" }; - - -//--------------------------------------------------------------------------- -// Parameter Return Cause(Q713 $3.12) -//--------------------------------------------------------------------------- -//type enumerated SCCP_param_ReturnCause -// { noTransl4AddrNature(0), noTransl4SpecifAddr(1), subsystemCongestion(2), -// subsystemFailure(3), unequippedUser(4), mTPFailure(5), -// networkCongestion(6), unqualified(7), errorMessageTransport(8), -// errorLocalProcessing(9), destNoReassembly(10), sCCPFailure(11), -// hopCounterViolation(12), segmeNotSupported(13), segmentationFailure(14) -// } -// with { variant "FIELDLENGTH(8)" } - - //values declared in SCCPConstants in SCCP.ttcn - type integer SCCP_param_ReturnCause - with { variant "FIELDLENGTH(8), COMP(nosign)" }; - - -//--------------------------------------------------------------------------- -// Parameter Reset Cause(Q713 $3.13) -//--------------------------------------------------------------------------- -//type enumerated SCCP_param_ResetCause -// { endUserOriginated(0), sCCPUserOriginated(1), -// messOutOfOrder_incPs(2), messOutOfOrder_incPr(3), -// remProcErr_messOutOfWindow(4), emProcErr_IncPsAfterReinit(5), -// remProcErr_general(6), remEndUserOperational(7), -// networkOperational(8), accessOperational(9), -// networkCongestion(10), reserved(11), -// unqualified(12) -// } -// with { variant "FIELDLENGTH(8)" } - - - //values declared in SCCPConstants in SCCP.ttcn - - type integer SCCP_param_ResetCause - with { variant "FIELDLENGTH(8), COMP(nosign)" }; - - - //--------------------------------------------------------------------------- - // Parameter Error Cause(Q713 $3.14) - //--------------------------------------------------------------------------- - //type enumerated SCCP_param_ErrorCause - // { unassignedDestinationLRN(0), inconsistentSourceLRN(1), - // pointCodeMismatch(2), serviceClassMismatch(3), - // unqualified(4) - // } - // with { variant "FIELDLENGTH(8)" } - - //values declared in SCCPConstants in SCCP.ttcn - - type integer SCCP_param_ErrorCause - with { variant "FIELDLENGTH(8), COMP(nosign)" }; - - - //--------------------------------------------------------------------------- - // Parameter Refusal Cause(Q713 $3.15) - //--------------------------------------------------------------------------- - //type enumerated SCCP_param_RefusalCause - // { endUserOrigin(0), endUserConges(1), endUserFailure(2), - // sCCPUserOrigin(3), destAddrUnkn(4), destInaccess(5), - // qOSNotAvail_nonTransient(6), qOSNotAvail_transient(7), accessFailure(8), - // accessCongestion(9), subsystemFailure(10), subsystemCongest(11), - // expConnEstTimer(12), incomUserData(13), reserved(14), - // unqualified(15), hopCounterViol(16), sCCPFailure(17), - // noTransl4address(18), unequippedUser(19) - // } - // with { variant "FIELDLENGTH(8)" } - - - //values declared in SCCPConstants in SCCP.ttcn - - type integer SCCP_param_RefusalCause - with { variant "FIELDLENGTH(8), COMP(nosign)" }; - - - //--------------------------------------------------------------------------- - // Parameter User data (Q713 $3.16) - //--------------------------------------------------------------------------- - type record SCCP_param_Data - { - LIN1 paramLength, - OCTN data - } - with { variant (paramLength) "LENGTHTO(data)" } - - - type record SCCP_param_Data_opt - { - SCCP_field_ParameterName paramName(con_SCCP_data), - LIN1 paramLength, - OCTN data - } - with { variant (paramLength) "LENGTHTO(data)" } - - - //--------------------------------------------------------------------------- - // Parameter Segmentation (Q713 $3.17) - //--------------------------------------------------------------------------- - - type record SCCP_param_Segmentation_opt - { - SCCP_field_ParameterName paramName(con_SCCP_segm), - LIN1 paramLength, //always 4! - BIT4 remainingSegment, - BIT2 reserved, - BIT1 class, - BIT1 firstSegm, - OCT3 segmLocalRef - } - with { variant "" } - - - //--------------------------------------------------------------------------- - // Parameter Hop counter (Q713 $3.18) - //--------------------------------------------------------------------------- - type integer SCCP_param_HopCounter - with { variant "FIELDLENGTH(8), COMP(nosign)" }; - - - type record SCCP_param_HopCounter_opt - { - SCCP_field_ParameterName paramName(con_SCCP_hopCount), - LIN1 paramLength, //always 1! - SCCP_param_HopCounter counter - } - with { variant (paramLength) "LENGTHTO(counter)" } - - - //--------------------------------------------------------------------------- - // Parameter Importance (Q713 $3.19) - //--------------------------------------------------------------------------- - - type record SCCP_param_Importance_opt - { - SCCP_field_ParameterName paramName(con_SCCP_imp), - LIN1 paramLength, //always 1! - SCCP_field_Importance importance, - BIT5 reserved - } - with { variant ""} - //with { variant (paramLength) "LENGTHTO(importance)" } //???? - - - //--------------------------------------------------------------------------- - // Parameter Long data (Q713 $3.20) - //--------------------------------------------------------------------------- - type record SCCP_param_LongData - { - LIN2 paramLength, - OCTN data - } - with { variant (paramLength) "LENGTHTO(data)" } - - - //******************************************************************************** - // SCCP management parameters (Q713 $5) - //******************************************************************************** - - //--------------------------------------------------------------------------- - // SCMG format identifier (Q713 $5.1) - //--------------------------------------------------------------------------- - type enumerated SCMG_param_FormatId - { - sSAallowed(1), // SSA subsystem-allowed - sSPprohib(2), // SSP subsystem-prohibited - sSTstaTest(3), // SST subsystem-status-test - sORoutReq(4), // SOR subsystem-out-of-service-request - sORoutGrant (5), // SOG subsystem-out-of-service-grant - sSCcongest(6) // SSC SCCP/subsystem-congested - } - with { variant "FIELDLENGTH(8)" } - - - //--------------------------------------------------------------------------- - // Affected SSN (Q713 $5.2.1) - //--------------------------------------------------------------------------- - /* not supported yet: - type SCCP_field_SubsystemNumber SCMG_param_AffectedSSN - with { variant "" } - */ - - //--------------------------------------------------------------------------- - // Affected Pointcode (Q713 $5.2.2) - //--------------------------------------------------------------------------- - /* not supported yet: - type SCCP_field_SignallingPointCode SCMG_param_AffectedPointCode - with { variant "" } - */ - - //--------------------------------------------------------------------------- - // Subsystem Multiplicity Indicator (Q713 $5.2.3) - //--------------------------------------------------------------------------- - /* not supported yet: - type record SCMG_param_MultiplIndicator - { - BIT2 smi, - BIT6 reserved - } - with { variant "" } - */ - - //--------------------------------------------------------------------------- - // SCCP congestion level (Q713 $5.2.4) - //--------------------------------------------------------------------------- - /* not supported yet: - type record SCMG_param_CongestionLevel - { - BIT4 congLevel, - BIT4 reserved - } - with { variant "" } - */ - -}//endgroup ParameterDefinitions - - -group PDUDefinitions -{ - //******************************************************************************** - // Message Connection Request (CR) (Q713 $4.2) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Optional part - type set SCCP_ConnReq_optionalPart - { - SCCP_param_Credit_opt credit optional, - SCCP_param_CPartyAddressEnc_opt callingPAddress optional, - SCCP_param_Data_opt data optional, - SCCP_param_HopCounter_opt hopCounter optional, - SCCP_param_Importance_opt importance optional - } - with { variant "TAG ( credit, paramName= con_SCCP_credit; - callingPAddress, paramName= con_SCCP_cgPA; - data, paramName= con_SCCP_data; - hopCounter, paramName= con_SCCP_hopCount; - importance , paramName= con_SCCP_imp)" - } - - - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_ConnectionRequest - { - SCCP_param_MessageType messageType, - SCCP_param_SourceLocalReference sourceLocRef, - SCCP_param_ProtocolClass protClass, - LIN1 pointer1, //will be 2 - LIN1 pointer2, - SCCP_param_CPartyAddressEnc calledPAddress, - SCCP_ConnReq_optionalPart optionalPart optional, - SCCP_param_EndOfOptionalParams eop optional - } - with { variant (pointer1) "POINTERTO(calledPAddress)"; - variant (pointer2) "POINTERTO(optionalPart)"; - variant "TAG (eop,paramName=con_SCCP_eop )" - //Note, that optional part itself is mandatory but it may be empty! - } - - - //******************************************************************************** - // Message Connection Confirm (CC) (Q713 $4.3) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Optional part - type set SCCP_ConnConfirm_optionalPart - { - SCCP_param_Credit_opt credit optional, - SCCP_param_CPartyAddressEnc_opt calledPAddress optional, - SCCP_param_Data_opt data optional, - SCCP_param_Importance_opt importance optional - } - with { variant "TAG ( credit, paramName= con_SCCP_credit; - calledPAddress, paramName= con_SCCP_cdPA; - data, paramName= con_SCCP_data; - importance, paramName= con_SCCP_imp)" - } - - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_ConnectionConfirm - { - SCCP_param_MessageType messageType, - SCCP_param_DestLocalReference destLocRef, - SCCP_param_SourceLocalReference sourceLocRef, - SCCP_param_ProtocolClass protClass, - LIN1 pointer1, - SCCP_ConnConfirm_optionalPart optionalPart optional, - SCCP_param_EndOfOptionalParams eop optional - } - with { variant (pointer1) "POINTERTO(optionalPart)"; - variant "TAG (eop,paramName=con_SCCP_eop )"} - - - //******************************************************************************** - // Message Connection Refused (CREF) (Q713 $4.4) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Optional part - type set SCCP_ConnRefused_optionalPart - { - SCCP_param_CPartyAddressEnc_opt calledPAddress optional, - SCCP_param_Data_opt data optional, - SCCP_param_Importance_opt importance optional - } - with { variant "TAG (calledPAddress, paramName= con_SCCP_cdPA; - data, paramName= con_SCCP_data; - importance, paramName= con_SCCP_imp)" - } - - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_ConnectionRefused - { - SCCP_param_MessageType messageType, - SCCP_param_DestLocalReference destLocRef, - SCCP_param_RefusalCause refusalCause, - LIN1 pointer1, - SCCP_ConnRefused_optionalPart optionalPart optional, - SCCP_param_EndOfOptionalParams eop optional - } - with { variant (pointer1) "POINTERTO(optionalPart)"; - variant "TAG (eop,paramName=con_SCCP_eop )"} - - - //******************************************************************************** - // Message Released (RLSD) (Q713 $4.5) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Optional part - type set SCCP_Released_optionalPart - { - SCCP_param_Data_opt data optional, - SCCP_param_Importance_opt importance optional - } - with { variant "TAG (data, paramName= con_SCCP_data; - importance, paramName= con_SCCP_imp)" - } - - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_Released - { - SCCP_param_MessageType messageType, - SCCP_param_DestLocalReference destLocRef, - SCCP_param_SourceLocalReference sourceLocRef, - SCCP_param_ReleaseCause releaseCause, - LIN1 pointer1, - SCCP_Released_optionalPart optionalPart optional, - SCCP_param_EndOfOptionalParams eop optional - } - with { variant (pointer1) "POINTERTO(optionalPart)"; - variant "TAG (eop,paramName=con_SCCP_eop )" } - - - //******************************************************************************** - // Message Release Complete (RLC) (Q713 $4.6) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_ReleaseComplete - { - SCCP_param_MessageType messageType, - SCCP_param_DestLocalReference destLocRef, - SCCP_param_SourceLocalReference sourceLocRef - } - with { variant "" } - - - //******************************************************************************** - // Message Data form 1 (DT1) (Q713 $4.7) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_DataForm1 - { - SCCP_param_MessageType messageType, - SCCP_param_DestLocalReference destLocRef, - SCCP_param_SegmentingReassembl segmentingReassembl, - LIN1 pointer1, //always 1! - SCCP_param_Data data - } - with { variant (pointer1) "POINTERTO(data)"; } - - - //******************************************************************************** - // Message Data form 2 (DT2) (Q713 $4.8) - //******************************************************************************** - - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_DataForm2 - { - SCCP_param_MessageType messageType, - SCCP_param_DestLocalReference destLocRef, - SCCP_param_SequencingSegmenting sequencingSegmenting, - LIN1 pointer1, //always 1! - SCCP_param_Data data - } - with { variant (pointer1) "POINTERTO(data)"; } - - - //******************************************************************************** - // Message Data Acknowledgement (AK) (Q713 $4.9) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_DataAcknowledgement - { - SCCP_param_MessageType messageType, - SCCP_param_DestLocalReference destLocRef, - SCCP_param_RecSeqNumber recSeqNumber, - SCCP_param_Credit credit - } - with { variant "" } - - - //******************************************************************************** - // Message Unitdata (UDT) (Q713 $4.10) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_Unitdata - { - SCCP_param_MessageType messageType, - SCCP_param_ProtocolClass protClass, - LIN1 pointer1, //will be 3 - LIN1 pointer2, - LIN1 pointer3, - SCCP_param_CPartyAddressEnc calledPAddress, - SCCP_param_CPartyAddressEnc callingPAddress, - SCCP_param_Data data - } - with { variant (pointer1) "POINTERTO(calledPAddress)"; - variant (pointer2) "POINTERTO(callingPAddress)"; - variant (pointer3) "POINTERTO(data)" - } - - - //******************************************************************************** - // Message Unitdata service (UDTS) (Q713 $4.11) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_UnitdataService - { - SCCP_param_MessageType messageType, - SCCP_param_ReturnCause returnCause, - LIN1 pointer1, //will be 3 - LIN1 pointer2, - LIN1 pointer3, - SCCP_param_CPartyAddressEnc calledPAddress, - SCCP_param_CPartyAddressEnc callingPAddress, - SCCP_param_Data data - } - with { variant (pointer1) "POINTERTO(calledPAddress)"; - variant (pointer2) "POINTERTO(callingPAddress)"; - variant (pointer3) "POINTERTO(data)" - } - - - //******************************************************************************** - // Message Expedited Data (ED) (Q713 $4.12) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_ExpeditedData - { - SCCP_param_MessageType messageType, - SCCP_param_DestLocalReference destLocRef, - LIN1 pointer1, //always 1! - SCCP_param_Data data - } - with { variant (pointer1) "POINTERTO(data)" } - - - //******************************************************************************** - // Message Expedited Data Acknowledgement (EA) (Q713 $4.13) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_ExpeditedDataAck - { - SCCP_param_MessageType messageType, - SCCP_param_DestLocalReference destLocRef - } - with { variant "" } - - - //******************************************************************************** - // Message Reset Request (RSR) (Q713 $4.14) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_ResetRequest - { - SCCP_param_MessageType messageType, - SCCP_param_DestLocalReference destLocRef, - SCCP_param_SourceLocalReference sourceLocRef, - SCCP_param_ResetCause resetCause - } - with { variant "" } - - - //******************************************************************************** - // Message Reset Confirmation (RSC) (Q713 $4.15) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_ResetConfirm - { - SCCP_param_MessageType messageType, - SCCP_param_DestLocalReference destLocRef, - SCCP_param_SourceLocalReference sourceLocRef - } - with { variant "" } - - - //******************************************************************************** - // Message Protocol data unit error (ERR) (Q713 $4.16) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_ProtDataUnitError - { - SCCP_param_MessageType messageType, - SCCP_param_DestLocalReference destLocRef, - SCCP_param_ErrorCause errorCause - } - with { variant "" } - - - //******************************************************************************** - // Message Inactivity test (IT) (Q713 $4.17) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_InactivityTest - { - SCCP_param_MessageType messageType, - SCCP_param_DestLocalReference destLocRef, - SCCP_param_SourceLocalReference sourceLocRef, - SCCP_param_ProtocolClass protClass, - SCCP_param_SequencingSegmenting sequencingSegmenting, - SCCP_param_Credit credit - } - with { variant "" } - - - //******************************************************************************** - // Message Extended Unitdata (XUDT) (Q713 $4.18) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Optional part - type record SCCP_ExtUnitdata_optionalPart - { - SCCP_param_Segmentation_opt segmentation optional, - SCCP_param_Importance_opt importance optional - } - with { variant "TAG (segmentation, paramName= con_SCCP_segm; - importance, paramName= con_SCCP_imp)" - } - - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_ExtUnitdata - { - SCCP_param_MessageType messageType, - SCCP_param_ProtocolClass protClass, - SCCP_param_HopCounter hopCounter, - LIN1 pointer1, //will be 4 - LIN1 pointer2, - LIN1 pointer3, - LIN1 pointer4, - SCCP_param_CPartyAddressEnc calledPAddress, - SCCP_param_CPartyAddressEnc callingPAddress, - SCCP_param_Data data, - SCCP_ExtUnitdata_optionalPart optionalPart optional, - SCCP_param_EndOfOptionalParams eop optional - } - with { variant (pointer1) "POINTERTO(calledPAddress)"; - variant (pointer2) "POINTERTO(callingPAddress)"; - variant (pointer3) "POINTERTO(data)"; - variant (pointer4) "POINTERTO(optionalPart)"; - variant "TAG (eop, paramName=con_SCCP_eop )" - } - - - //******************************************************************************** - // Message Extended Unitdata Service(XUDTS) (Q713 $4.19) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Optional part - // The same as SCCP_ExtUnitdata_optionalPart - - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_ExtUnitdataService - { - SCCP_param_MessageType messageType, - SCCP_param_ReturnCause returnCause, - SCCP_param_HopCounter hopCounter, - LIN1 pointer1, //will be 4 - LIN1 pointer2, - LIN1 pointer3, - LIN1 pointer4, - SCCP_param_CPartyAddressEnc calledPAddress, - SCCP_param_CPartyAddressEnc callingPAddress, - SCCP_param_Data data, - SCCP_ExtUnitdata_optionalPart optionalPart optional, - SCCP_param_EndOfOptionalParams eop optional - } - with { variant (pointer1) "POINTERTO(calledPAddress)"; - variant (pointer2) "POINTERTO(callingPAddress)"; - variant (pointer3) "POINTERTO(data)"; - variant (pointer4) "POINTERTO(optionalPart)"; - variant "TAG (eop,paramName=con_SCCP_eop )" - } - - - //******************************************************************************** - // Message Long Unitdata (LUDT) (Q713 $4.20) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Optional part - // The same as SCCP_ExtUnitdata_optionalPart - - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_LongUnitdata - { - SCCP_param_MessageType messageType, - SCCP_param_ProtocolClass protClass, - SCCP_param_HopCounter hopCounter, - LIN2 pointer1, - LIN2 pointer2, - LIN2 pointer3, - LIN2 pointer4, - SCCP_param_CPartyAddressEnc calledPAddress, - SCCP_param_CPartyAddressEnc callingPAddress, - SCCP_param_LongData longData, - SCCP_ExtUnitdata_optionalPart optionalPart optional, - SCCP_param_EndOfOptionalParams eop optional - } - with { variant (pointer1) "POINTERTO(calledPAddress)"; - variant (pointer2) "POINTERTO(callingPAddress)"; - variant (pointer3) "POINTERTO(longData)"; - variant (pointer4) "POINTERTO(optionalPart)"; - variant "TAG (eop,paramName=con_SCCP_eop) " - } - - - //******************************************************************************** - // Message Long Unitdata Service (LUDTS) (Q713 $4.21) - //******************************************************************************** - //--------------------------------------------------------------------------- - // Optional part - // The same as SCCP_ExtUnitdata_optionalPart - - //--------------------------------------------------------------------------- - // Message definition - //--------------------------------------------------------------------------- - type record PDU_SCCP_LongUnitdataService - { - SCCP_param_MessageType messageType, - SCCP_param_ReturnCause returnCause, - SCCP_param_HopCounter hopCounter, - LIN2 pointer1, //will be 5 - LIN2 pointer2, - LIN2 pointer3, - LIN2 pointer4, - SCCP_param_CPartyAddressEnc calledPAddress, - SCCP_param_CPartyAddressEnc callingPAddress, - SCCP_param_LongData longData, - SCCP_ExtUnitdata_optionalPart optionalPart optional, - SCCP_param_EndOfOptionalParams eop optional - } - with { variant (pointer1) "POINTERTO(calledPAddress)"; - variant (pointer2) "POINTERTO(callingPAddress)"; - variant (pointer3) "POINTERTO(longData)"; - variant (pointer4) "POINTERTO(optionalPart)"; - variant "TAG (eop,paramName=con_SCCP_eop) " - } - - - //******************************************************************************** - // SCCP management messages (Q713 $5.3) - //******************************************************************************** - /*type record PDU_SCMG_message - { - SCMG_param_FormatId messageType, - SCMG_param_AffectedSSN affectedSSN, - SCMG_param_AffectedPointCode affectedPC, - SCMG_param_MultiplIndicator smi, - SCMG_param_CongestionLevel congLevel optional - //shall be present in all messages except SSG - } - with { variant "" } - */ - - //******************************************************************************** - // SCCP Top Level PDU (Q713 $4.2) - //******************************************************************************** - - type union PDU_SCCP - { - PDU_SCCP_ConnectionRequest connrequest, - PDU_SCCP_ConnectionRefused connrefused, - PDU_SCCP_Released released, - PDU_SCCP_ReleaseComplete relcomp, - PDU_SCCP_DataForm1 dataform1, - PDU_SCCP_DataForm2 dataform2, - PDU_SCCP_DataAcknowledgement dataack, - PDU_SCCP_UnitdataService udataserv, - PDU_SCCP_ExpeditedData expdata, - PDU_SCCP_ExpeditedDataAck expdataack , - PDU_SCCP_ResetRequest resetreq, - PDU_SCCP_ResetConfirm resconf, - PDU_SCCP_ProtDataUnitError pduerror, - PDU_SCCP_InactivityTest inacttest, - PDU_SCCP_ExtUnitdata extudata, - PDU_SCCP_ExtUnitdataService extudataserv , - PDU_SCCP_LongUnitdata longudata, - PDU_SCCP_LongUnitdataService longudataserv, - PDU_SCCP_Unitdata unitdata, - PDU_SCCP_ConnectionConfirm connconfirm - // PDU_SCMG_message scmg - } - with { variant "TAG (connrequest, messageType = cr; - connconfirm, messageType = cc; - connrefused, messageType = cref; - released, messageType = rlsd; - relcomp, messageType = rlc; - dataform1, messageType = dt1; - dataform2, messageType = dt2; - dataack, messageType = ak; - unitdata, messageType = udt; - udataserv, messageType = udts; - expdata, messageType = ed; - expdataack, messageType = ea; - resetreq, messageType = rsr; - resconf, messageType = rsc; - pduerror, messageType = err; - inacttest, messageType = it; - extudata, messageType = xudt; - extudataserv, messageType = xudts; - longudata, messageType = ludt; - longudataserv, messageType = ludts)" - } - -}//endgroup PDUDefinitions - -}//endgroup Types - - - -group OtherTypedefinitions -{//startgroup OtherTypedefinitions - - // enum replaced with this solution: - type integer states; - const states - idle:=0, - connection_pending_OG:=1, - connection_pending_IC:=2, - active:=3, // ==data transfer, see 6.1.1.2.1/Q.711. - disconnect_pending:=4, // == - //reset_OG,- as N_RESET_req and N_RESET_resp will not be received, this state should never occur - reset_bothway:=5, - reset_IC:=5, - //frozen_reference, - wait_conn_confirm:=6; - - type record sccp_buffer - { - octetstring buffer, - integer actlen, - integer maxlen - } - - // === Connection Oriented Data: === - - // record holding all data of a connection - type record ConnectionData - { - OCT3 localReference, //segmLocReference????, - OCT3 remoteReference, //segmRemoteRef????, - states state, - integer connectionId, - //integer max_len, //maximal length of input buffer - sccp_buffer reassembler_buffer // data collected here before sending up to the User - } - - // === Connectionless Data: ======================= - // == sending:== - // Segmentation Local Reference - type integer segmLocRef_states; - const segmLocRef_states segmLocRef_idle :=0, segmLocRef_busy:=1; - - type record segmLocRef - { - OCT3 val, - segmLocRef_states state - } - - // == receiving: == - type record ClessRcvBuff - { - //OCT3 segmLocalRef, // not used ?? - OCT3 segmRemoteRef, - segmLocRef_states state, - sccp_buffer reassembler_buffer - } - - type charstring SCCP_ServiceType; - - const charstring mtp3_itu := "mtp3_itu"; // SCCP_itu - const charstring mtp3_ansi := "mtp3_ansi"; //SCCP_ansi - const charstring mtp3_ttc := "mtp3_ttc"; //SCCP_ttc - const charstring mtp3b_itu := "mtp3b_itu"; - const charstring mtp3b_ansi:= "mtp3b_ansi"; - const charstring mtp3b_ttc := "mtp3b_ttc"; - const charstring m3ua := "m3ua"; - const charstring mtp3_mpt := "mtp3_mpt"; - - type record MSC_SCCP_MTP3_parameters - { - MTP3_Field_sio sio, - integer opc, - integer dpc, - integer sls, - SCCP_ServiceType sccp_serviceType, - integer ssn optional //This should be set if you want only one - } //active subsystem on the link. - -}//endgroup OtherTypedefinitions - -group MessageTypes -{ - // ************************************************************************* - // * ASP_sccp type definitions * - // ************************************************************************* - - - // type record ASP_MTP3_TRANSFERind_sccp - // { - // octetstring sio length(1), // see values in Q.704 $14.2.1 - // integer opc, - // integer dpc, - // integer sls, - // PDU_SCCP data - // } - - - type record ASP_MTP3_TRANSFERreq_sccp - { - octetstring sio length(1), // see values in Q.704 $14.2.1 - integer opc, - integer dpc, - integer sls, - PDU_SCCP data - } - -}//end group Messagetypes - -group ASPTemplates -{ - -// ************************************************************************* -// * ASP template definitions sending -// ************************************************************************* - -// template ASP_MTP3_TRANSFERind_sccp t_ASP_MTP3_TRANSFERind_sccp -// ( -// -// octetstring pl_sio, -// integer pl_opc, -// integer pl_dpc, -// integer pl_sls, -// template PDU_SCCP pl_data) := -// { -// sio := pl_sio, -// opc := pl_opc, -// dpc := pl_dpc, -// sls := pl_sls, -// data := pl_data -// } - - - template ASP_MTP3_TRANSFERreq_sccp t_ASP_MTP3_TRANSFERreq_sccp - ( - - octetstring pl_sio, - integer pl_opc, - integer pl_dpc, - integer pl_sls, - template PDU_SCCP pl_data - ) := - { - sio := pl_sio, - opc := pl_opc, - dpc := pl_dpc, - sls := pl_sls, - data := pl_data - } - - -// ************************************************************************* -// * ASP template definitions receiving * -// ************************************************************************* - - -//template ASP_MTP3_TRANSFERind_sccp tr_ASP_MTP3_TRANSFERind_sccp -// ( -// -// PDU_SCCP pl_data) := -// { -// sio := ?, -// opc := ?, -// dpc := ?, -// sls := ?, -// data := pl_data -// } - - - template ASP_MTP3_TRANSFERreq_sccp tr_ASP_MTP3_TRANSFERreq_sccp - // ( - - // PDU_SCCP pl_data) - := - { - sio := ?, - opc := ?, - dpc := ?, - sls := ?, - data := ? //pl_data - } - - - - - - -}//endgroup ASPTemplates - - -} with { encode "RAW" } // end module diff --git a/SCCP_CNL113341/src/SCCPasp_Types.ttcn b/SCCP_CNL113341/src/SCCPasp_Types.ttcn deleted file mode 100644 index c66fa864a..000000000 --- a/SCCP_CNL113341/src/SCCPasp_Types.ttcn +++ /dev/null @@ -1,895 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// // -// Copyright Test Competence Center (TCC) ETH 2006 // -// // -// The copyright to the computer program(s) herein is the property of TCC. // -// The program(s) may be used and/or copied only with the written permission // -// of TCC or in accordance with the terms and conditions stipulated in the // -// agreement/contract under which the program(s) have been supplied // -// // -/////////////////////////////////////////////////////////////////////////////// -// File: SCCPasp_Types.ttcn -// Description: SS7 SCCP definitions according to specification -// ITU-T SS7 SCCP, ANSI ..., TCC ... -// References: ITU-T: Recommendation Q.711-Q.714, -// ANSI: T1.112-2001, -// TCC: JT-Q711 - JT-Q714 -// Rev: R6A05 -// Prodnr: CNL 113 341 -// Updated: 2006-01-26 -// Contact: http://ttcn.ericsson.se - -module SCCPasp_Types.objid -{ - itu_t(0) identified_organization (4) etsi(0) reserved(127) - etsi_identified_organization(0) ericsson(5) testing (0) - generic(0) sccp(1) v96(3) aspDefinitions(3) patchNo(0) -} - - -{//startmodule - -//content: the following groups: -//Field Definitions -//ASPParameters -//ASPTypes -//SCCPportTypeDefinitions -//ASPTemplateDefinitionsSending -//ASPTemplateDefinitionsReceiving -//ethlel: 08.23:"reserved" fields removed -//SCCP_PAR_Importance chenged from structure to integer -//type enumerated SCCP_ASPfield_ParameterName removed - -import from General_Types all; - -group FieldDefinitions -{ - -//-------------------------------------------------------------------------------- -// Field Address Indicator (Q713 $3.4.1) -//-------------------------------------------------------------------------------- -type record SCCP_ASPfield_AddressIndicator -{ - BIT1n pointCodeIndic, - BIT1n ssnIndicator, - BIT4n globalTitleIndic, - BIT1n routingIndicator -} - -//-------------------------------------------------------------------------------- -// Subfield Signalling Point Code (Q713 $3.4.2.1) -//-------------------------------------------------------------------------------- -// type changed from BIT14 to bitstring 2003.11.04 baat - - -// supposed that the leading zeros are filled in according to specification -// i.e.: length itu: 16 (2 reserved) -// ansi:24 -// ttc national: 16 (0 spare) - -type bitstring SCCP_ASPfield_SignallingPointCode; - -type union SCCP_ASPfield_GlobalTitle -{ - SCCP_ASPfield_GlobalTitle_NoA gti0001, - SCCP_ASPfield_GlobalTitle_TT gti0010, - SCCP_ASPfield_GlobalTitle_TT_NP_ES gti0011, //ansi: gti=0001 - SCCP_ASPfield_SignallingPointCode_TT_NP_ES_NoA gti0100 - //octetstring gti0000 -} - - -//-------------------------------------------------------------------------------- -// Subfield Global Title, Nature of address only - //ITU: GTI=0001, Q713 $3.4.2.3.1 - //ANSI: - - -type record SCCP_ASPfield_GlobalTitle_NoA -{ - BIT7n natureOfAddress, - BIT1n oddeven, - hexstring globalTitleAddress - //it should be hexstring, number digits are in BCD; - //hexstring already supported by ETH compiler -} - - -//-------------------------------------------------------------------------------- -// Global Title, Translation type only -// ITU: GTI=0010, Q713 $3.4.2.3.2 -// ANSI: GTI=0010, Figure6A/T1.112.3 - -type record SCCP_ASPfield_GlobalTitle_TT -{ - OCT1n translationType, - hexstring globalTitleAddress -} - - -//-------------------------------------------------------------------------------- -// Global Title, Translation type & numbering plan & encoding scheme -// ITU: GTI=0011, Q713 $3.4.2.3.3) -// ANSI GTI=0001, Figure6/T1.112.3 - -type record SCCP_ASPfield_GlobalTitle_TT_NP_ES -{ - OCT1n translationType, - BIT4n encodingScheme, - BIT4n numberingPlan, - hexstring globalTitleAddress -} - - -//-------------------------------------------------------------------------------- -// Global Title, Translation type & numbering plan & encoding scheme & nature of -// address - // GTI=0100, Q713 $3.4.2.3.4) - // ANSI: - - -type record SCCP_ASPfield_SignallingPointCode_TT_NP_ES_NoA -{ - OCT1n translationType, - BIT4n encodingScheme, - BIT4n numberingPlan, - BIT7n natureOfAddress, - hexstring globalTitleAddress -} - - -}//endgroup FieldDefinitions - - - - -//******************************************************************************** -//******************************************************************************** -// ASPDefinitions -//******************************************************************************** -//******************************************************************************** -group ASPParameters -{ -//-------------------------------------------------------------------------------- -// Parameter Address -//-------------------------------------------------------------------------------- - -type record SCCP_PAR_Address -{ - SCCP_ASPfield_AddressIndicator addressIndicator, - SCCP_ASPfield_SignallingPointCode signPointCode optional, - integer subsystemNumber optional, - SCCP_ASPfield_GlobalTitle globalTitle optional -} - -//-------------------------------------------------------------------------------- -// Parameter Quality of service -//-------------------------------------------------------------------------------- - - -type integer SCCP_PAR_Quality_Of_Service; - -//-------------------------------------------------------------------------------- -// Parameter Expedited data selection -//-------------------------------------------------------------------------------- - -type integer SCCP_PAR_Expedited_Data_Sel; - -//-------------------------------------------------------------------------------- -// Parameter User Data -//-------------------------------------------------------------------------------- - -//type SCCP_param_Data SCCP_PAR_UserData; - -type octetstring SCCP_PAR_UserData; -// ETHLAFA: type changed from RANAP_PDU to octetstring 020718 - -//-------------------------------------------------------------------------------- -// Parameter Connection Id -//-------------------------------------------------------------------------------- - -type integer SCCP_PAR_Connection_Id; - - -//-------------------------------------------------------------------------------- -// Parameter Importance -//-------------------------------------------------------------------------------- - - -type integer SCCP_PAR_Importance; - - -//-------------------------------------------------------------------------------- -// Parameter Originator -//-------------------------------------------------------------------------------- -//Undefined (0) -//SCCP User (or Network Service User-NSU)(1) -//SCCP itself (or Network Service Provider-NSP)(2) - -type integer SCCP_PAR_Originator; - -//-------------------------------------------------------------------------------- -// Parameter Reason -//-------------------------------------------------------------------------------- - -type integer SCCP_PAR_Reason; - - -//-------------------------------------------------------------------------------- -// Parameter Return Option -//-------------------------------------------------------------------------------- -//bit0==0-return option off -//bit0==1-return option on - -type BIT8n SCCP_PAR_Return_Option; - - -//-------------------------------------------------------------------------------- -// Parameter Sequence Control -//-------------------------------------------------------------------------------- -//bit0 == 0-sequence control off -//bit0 == 1-sequence control on - -type BIT8n SCCP_PAR_Sequence_Control; - -//-------------------------------------------------------------------------------- -// Parameter Reason For Return -//-------------------------------------------------------------------------------- - -type integer SCCP_PAR_Reason_For_Return; - - -//-------------------------------------------------------------------------------- -// Parameter Subsystem Number -//-------------------------------------------------------------------------------- - -type integer SCCP_PAR_SubSystemNumber; - -//-------------------------------------------------------------------------------- -// Parameter User Status -//-------------------------------------------------------------------------------- - -type integer SCCP_PAR_User_Status; - -//-------------------------------------------------------------------------------- -// Parameter Subsystem Multiplicity Indicator -//-------------------------------------------------------------------------------- - -type integer SCCP_PAR_Subsystem_multi_indicator; - -}//endgroup ASPParameters - -group ASPTypes -{ -//******************************************************************************** -// Network service primitives Q711 -//******************************************************************************** - - -type record ASP_SCCP_N_CONNECT_req -{ - SCCP_PAR_Address calledAddress, - SCCP_PAR_Address callingAddress optional, - SCCP_PAR_Expedited_Data_Sel expeditedDataSel optional, - SCCP_PAR_Quality_Of_Service qualityOfService optional, - SCCP_PAR_UserData userData optional, - SCCP_PAR_Connection_Id connectionId optional, - SCCP_PAR_Importance importance optional -} - - -type record ASP_SCCP_N_CONNECT_ind -{ - SCCP_PAR_Address calledAddress, - SCCP_PAR_Address callingAddress optional, - SCCP_PAR_Quality_Of_Service qualityOfService optional, - SCCP_PAR_UserData userData optional, - SCCP_PAR_Connection_Id connectionId optional, - SCCP_PAR_Importance importance optional -} - - -type record ASP_SCCP_N_CONNECT_res -{ - SCCP_PAR_Address respondingAddress optional, - SCCP_PAR_Expedited_Data_Sel expeditedDataSel optional, - SCCP_PAR_Quality_Of_Service qualityOfService optional, - SCCP_PAR_UserData userData optional, - SCCP_PAR_Connection_Id connectionId optional, - SCCP_PAR_Importance importance optional -} - - -type record ASP_SCCP_N_CONNECT_cfm -{ - SCCP_PAR_Address respondingAddress optional, - SCCP_PAR_Quality_Of_Service qualityOfService optional, - SCCP_PAR_UserData userData optional, - SCCP_PAR_Connection_Id connectionId optional, - SCCP_PAR_Importance importance optional -} - - -type record ASP_SCCP_N_DATA_req -{ - SCCP_PAR_UserData userData , - SCCP_PAR_Connection_Id connectionId optional , - SCCP_PAR_Importance importance optional -} - - -type record ASP_SCCP_N_DATA_ind -{ - SCCP_PAR_UserData userData , - SCCP_PAR_Connection_Id connectionId optional , - SCCP_PAR_Importance importance optional -} - - -type record ASP_SCCP_N_DISCONNECT_req -{ - SCCP_PAR_Address respondingAddress optional, - SCCP_PAR_Reason reason , - SCCP_PAR_UserData userData optional , - SCCP_PAR_Connection_Id connectionId optional , - SCCP_PAR_Importance importance optional -} - - -type record ASP_SCCP_N_DISCONNECT_ind -{ - SCCP_PAR_Originator originator , - SCCP_PAR_Address respondingAddress optional , - SCCP_PAR_Reason reason , - SCCP_PAR_UserData userData optional , - SCCP_PAR_Connection_Id connectionId optional , - SCCP_PAR_Importance importance optional -} - - -type record ASP_SCCP_N_UNITDATA_req -{ - SCCP_PAR_Address calledAddress , - SCCP_PAR_Address callingAddress , - SCCP_PAR_Sequence_Control sequenceControl optional , - SCCP_PAR_Return_Option returnOption optional , - SCCP_PAR_UserData userData , - SCCP_PAR_Importance importance optional - } - - -type record ASP_SCCP_N_UNITDATA_ind -{ - SCCP_PAR_Address calledAddress , - SCCP_PAR_Address callingAddress , - SCCP_PAR_Sequence_Control sequenceControl optional , - SCCP_PAR_Return_Option returnOption optional , - SCCP_PAR_UserData userData , - SCCP_PAR_Importance importance optional -} - - -type record ASP_SCCP_N_NOTICE_ind -{ - SCCP_PAR_Address calledAddress , - SCCP_PAR_Address callingAddress , - SCCP_PAR_Reason_For_Return reasonForReturn , - SCCP_PAR_UserData userData , - SCCP_PAR_Importance importance optional -} - - -type record ASP_SCCP_N_STATE_ind -{ - SCCP_PAR_SubSystemNumber affectedSubSystem , - SCCP_PAR_User_Status userStatus , - SCCP_PAR_Subsystem_multi_indicator subsystmultiindicator optional -} - - - -type record ASP_SCCP_N_RESET_req -{ - SCCP_PAR_Originator originator, //always NSU - SCCP_PAR_Reason reason, - SCCP_PAR_Connection_Id connectionId optional -} - -type record ASP_SCCP_N_RESET_ind -{ - SCCP_PAR_Originator originator, - SCCP_PAR_Reason reason, - SCCP_PAR_Connection_Id connectionId optional -} - -type record ASP_SCCP_N_RESET_resp -{ - SCCP_PAR_Connection_Id connectionId optional -} - -type record ASP_SCCP_N_RESET_cfm -{ - SCCP_PAR_Connection_Id connectionId optional -} - -} //endgroup ASPTypes - - -group SCCP_PT_Definitions -{ -//******************************************************************* -// Port Type definitions -//******************************************************************* - -type port SCCPasp_SP_PT -message -{ - - in ASP_SCCP_N_CONNECT_req, ASP_SCCP_N_CONNECT_res, - ASP_SCCP_N_DATA_req, ASP_SCCP_N_DISCONNECT_req, - ASP_SCCP_N_UNITDATA_req, ASP_SCCP_N_RESET_req, - ASP_SCCP_N_RESET_resp; - - out ASP_SCCP_N_CONNECT_ind, ASP_SCCP_N_CONNECT_cfm, - ASP_SCCP_N_DATA_ind, ASP_SCCP_N_DISCONNECT_ind, - ASP_SCCP_N_UNITDATA_ind, ASP_SCCP_N_NOTICE_ind, - ASP_SCCP_N_STATE_ind, ASP_SCCP_N_RESET_ind, - ASP_SCCP_N_RESET_cfm; - -} with {extension "internal"} - - -type port SCCPasp_PT -message -{ - - in ASP_SCCP_N_CONNECT_ind, ASP_SCCP_N_CONNECT_cfm, - ASP_SCCP_N_DATA_ind, ASP_SCCP_N_DISCONNECT_ind, - ASP_SCCP_N_UNITDATA_ind, ASP_SCCP_N_NOTICE_ind, - ASP_SCCP_N_STATE_ind, ASP_SCCP_N_RESET_ind, - ASP_SCCP_N_RESET_cfm; - - out ASP_SCCP_N_CONNECT_req, ASP_SCCP_N_CONNECT_res, - ASP_SCCP_N_DATA_req, ASP_SCCP_N_DISCONNECT_req, - ASP_SCCP_N_UNITDATA_req, ASP_SCCP_N_RESET_req, - ASP_SCCP_N_RESET_resp; - -} with {extension "internal"} - - - -}// endgroup SCCP_PT_Definitions - - - - -//******************************************************************************** -// ASP Template Definitions -//******************************************************************************** - - -group ASPTemplateDefinitionsSending - - -{ - - -template ASP_SCCP_N_CONNECT_req t_ASP_N_CONNECT_req -( - - template SCCP_PAR_Address PAR_CalledAddress , - template SCCP_PAR_Address PAR_CallingAddress , - template SCCP_PAR_Expedited_Data_Sel PAR_ExpDataSel , - template SCCP_PAR_Quality_Of_Service PAR_QoS , - template SCCP_PAR_UserData PAR_UserData , - template SCCP_PAR_Connection_Id PAR_ConnID , - template SCCP_PAR_Importance PAR_Imp -):= - { - calledAddress :=PAR_CalledAddress , - callingAddress :=PAR_CallingAddress , - expeditedDataSel :=PAR_ExpDataSel , - qualityOfService :=PAR_QoS , - userData :=PAR_UserData , - connectionId :=PAR_ConnID , - importance :=PAR_Imp - } - - -template ASP_SCCP_N_CONNECT_ind t_ASP_N_CONNECT_ind -( - template SCCP_PAR_Address PAR_CalledAddress , - template SCCP_PAR_Address PAR_CallingAddress , - template SCCP_PAR_Quality_Of_Service PAR_QoS , - template SCCP_PAR_UserData PAR_UserData , - template SCCP_PAR_Connection_Id PAR_ConnID , - template SCCP_PAR_Importance PAR_Imp -):= - { - calledAddress :=PAR_CalledAddress , - callingAddress :=PAR_CallingAddress, - qualityOfService :=PAR_QoS , - userData :=PAR_UserData , - connectionId :=PAR_ConnID , - importance := PAR_Imp - } - - -template ASP_SCCP_N_CONNECT_res t_ASP_N_CONNECT_res -( - - template SCCP_PAR_Address PAR_RespondingAddress , - template SCCP_PAR_Expedited_Data_Sel PAR_ExpDataSel , - template SCCP_PAR_Quality_Of_Service PAR_QoS , - template SCCP_PAR_UserData PAR_UserData , - template SCCP_PAR_Connection_Id PAR_ConnID , - template SCCP_PAR_Importance PAR_Imp - -):= - { - respondingAddress:= PAR_RespondingAddress , - expeditedDataSel := PAR_ExpDataSel , - qualityOfService := PAR_QoS , - userData := PAR_UserData , - connectionId := PAR_ConnID , - importance := PAR_Imp - } - - -template ASP_SCCP_N_CONNECT_cfm t_ASP_N_CONNECT_cfm -( - template SCCP_PAR_Address PAR_RespondingAddress , - template SCCP_PAR_Quality_Of_Service PAR_QoS , - template SCCP_PAR_UserData PAR_UserData , - template SCCP_PAR_Connection_Id PAR_ConnID , - template SCCP_PAR_Importance PAR_Imp -):= - { - respondingAddress:= PAR_RespondingAddress , - qualityOfService := PAR_QoS , - userData := PAR_UserData , - connectionId := PAR_ConnID , - importance := PAR_Imp - } - - -template ASP_SCCP_N_DATA_req t_ASP_N_DATA_req -( - template SCCP_PAR_UserData PAR_UserData , - template SCCP_PAR_Connection_Id PAR_ConnID , - template SCCP_PAR_Importance PAR_Imp -):= - { - userData := PAR_UserData , - connectionId := PAR_ConnID , - importance := PAR_Imp - } - - -template ASP_SCCP_N_DATA_ind t_ASP_N_DATA_ind -( - template SCCP_PAR_UserData PAR_UserData , - template SCCP_PAR_Connection_Id PAR_ConnID , - template SCCP_PAR_Importance PAR_Imp -):= - { - userData := PAR_UserData , - connectionId := PAR_ConnID , - importance := PAR_Imp - } - - -template ASP_SCCP_N_DISCONNECT_req t_ASP_N_DISCONNECT_req -( - template SCCP_PAR_Address PAR_RespondingAddress , - template SCCP_PAR_Reason PAR_Reason , - template SCCP_PAR_UserData PAR_UserData , - template SCCP_PAR_Connection_Id PAR_ConnID , - template SCCP_PAR_Importance PAR_Imp -):= - { - respondingAddress:= PAR_RespondingAddress , - reason := PAR_Reason , - userData := PAR_UserData , - connectionId := PAR_ConnID , - importance := PAR_Imp -} - - -template ASP_SCCP_N_DISCONNECT_ind t_ASP_N_DISCONNECT_ind -( - template SCCP_PAR_Originator PAR_Originator , - template SCCP_PAR_Address PAR_RespondingAddress , - template SCCP_PAR_Reason PAR_Reason , - template SCCP_PAR_UserData PAR_UserData , - template SCCP_PAR_Connection_Id PAR_ConnID , - template SCCP_PAR_Importance PAR_Imp - -):= - { - originator :=PAR_Originator , - respondingAddress:= PAR_RespondingAddress , - reason := PAR_Reason , - userData := PAR_UserData , - connectionId := PAR_ConnID , - importance := PAR_Imp - } - - - - -template ASP_SCCP_N_UNITDATA_req t_ASP_N_UNITDATA_req -( - -template SCCP_PAR_Address PAR_CalledAddress , -template SCCP_PAR_Address PAR_CallingAddress , -template SCCP_PAR_Sequence_Control PAR_SeqCtrl , -template SCCP_PAR_Return_Option PAR_RetOpt , -template SCCP_PAR_UserData PAR_UserData , -template SCCP_PAR_Importance PAR_Imp -):= - { - calledAddress :=PAR_CalledAddress , - callingAddress :=PAR_CallingAddress, - sequenceControl :=PAR_SeqCtrl , - returnOption :=PAR_RetOpt , - userData :=PAR_UserData , - importance :=PAR_Imp - } - - -template ASP_SCCP_N_UNITDATA_ind t_ASP_N_UNITDATA_ind -( - template SCCP_PAR_Address PAR_CalledAddress , - template SCCP_PAR_Address PAR_CallingAddress , - template SCCP_PAR_Sequence_Control PAR_SeqCtrl , - template SCCP_PAR_Return_Option PAR_RetOpt , - template SCCP_PAR_UserData PAR_UserData , - template SCCP_PAR_Importance PAR_Imp -):= - { - calledAddress :=PAR_CalledAddress , - callingAddress :=PAR_CallingAddress, - sequenceControl :=PAR_SeqCtrl , - returnOption :=PAR_RetOpt , - userData :=PAR_UserData , - importance :=PAR_Imp - } - - -template ASP_SCCP_N_NOTICE_ind t_ASP_N_NOTICE_ind -( - template SCCP_PAR_Address PAR_CalledAddress , - template SCCP_PAR_Address PAR_CallingAddress , - template SCCP_PAR_Reason_For_Return PAR_ReasForRet , - template SCCP_PAR_UserData PAR_UserData , - template SCCP_PAR_Importance PAR_Imp -):= - { - calledAddress :=PAR_CalledAddress , - callingAddress :=PAR_CallingAddress, - reasonForReturn :=PAR_ReasForRet , - userData :=PAR_UserData , - importance :=PAR_Imp - } - - -template ASP_SCCP_N_STATE_ind t_ASP_N_STATE_ind -( - template SCCP_PAR_SubSystemNumber PAR_SSN , - template SCCP_PAR_User_Status PAR_UserStatus , - template SCCP_PAR_Subsystem_multi_indicator PAR_Smi -):= - { - affectedSubSystem :=PAR_SSN , - userStatus :=PAR_UserStatus , - subsystmultiindicator :=PAR_Smi - } - -template ASP_SCCP_N_RESET_req t_ASP_N_RESET_req -( - template SCCP_PAR_Originator PAR_Originator, - template SCCP_PAR_Reason PAR_Reason, - template SCCP_PAR_Connection_Id PAR_Connection_Id -):= - { - originator :=PAR_Originator, - reason :=PAR_Reason, - connectionId :=PAR_Connection_Id - } - - -template ASP_SCCP_N_RESET_ind t_ASP_N_RESET_ind -( - template SCCP_PAR_Originator PAR_Originator, - template SCCP_PAR_Reason PAR_Reason, - template SCCP_PAR_Connection_Id PAR_Connection_Id -):= - { - originator :=PAR_Originator, - reason :=PAR_Reason, - connectionId :=PAR_Connection_Id - } - -template ASP_SCCP_N_RESET_resp t_ASP_N_RESET_resp -( - template SCCP_PAR_Connection_Id PAR_Connection_Id -):= - { - connectionId :=PAR_Connection_Id - } - -template ASP_SCCP_N_RESET_cfm t_ASP_N_RESET_cfm -( - template SCCP_PAR_Connection_Id PAR_Connection_Id -):= - { - connectionId :=PAR_Connection_Id - } - - - -}//endgroup ASPTemplateDefinitionsSending - -//******************************************************************************** - -group ASPTemplateDefinitionsReceiving - - -{ - - -template ASP_SCCP_N_CONNECT_req tr_ASP_N_CONNECT_req:= -{ - calledAddress :=?, - callingAddress :=*, - expeditedDataSel :=*, - qualityOfService :=*, - userData :=*, - connectionId :=*, - importance :=* -} - - -template ASP_SCCP_N_CONNECT_ind tr_ASP_N_CONNECT_ind:= -{ - calledAddress :=?, - callingAddress :=*, - qualityOfService :=*, - userData :=*, - connectionId :=*, - importance :=* -} - - -template ASP_SCCP_N_CONNECT_res tr_ASP_N_CONNECT_res:= -{ - respondingAddress:= *, - expeditedDataSel := *, - qualityOfService := *, - userData := *, - connectionId := *, - importance := * -} - - -template ASP_SCCP_N_CONNECT_cfm tr_ASP_N_CONNECT_cfm:= -{ - respondingAddress:= *, - qualityOfService := *, - userData := *, - connectionId := *, - importance := * -} - - -template ASP_SCCP_N_DATA_req tr_ASP_N_DATA_req := -{ - userData := ?, - connectionId := *, - importance := * -} - - -template ASP_SCCP_N_DATA_ind tr_ASP_N_DATA_ind:= -{ - userData := ?, - connectionId := *, - importance := * -} - - -template ASP_SCCP_N_DISCONNECT_req tr_ASP_N_DISCONNECT_req:= -{ - respondingAddress:= *, - reason := ?, - userData := *, - connectionId := *, - importance := * -} - - -template ASP_SCCP_N_DISCONNECT_ind tr_ASP_N_DISCONNECT_ind:= -{ - originator := ?, - respondingAddress:= *, - reason := ?, - userData := *, - connectionId := *, - importance := * -} - - - - -template ASP_SCCP_N_UNITDATA_req tr_ASP_N_UNITDATA_req:= -{ - calledAddress :=?, - callingAddress :=?, - sequenceControl :=*, - returnOption :=*, - userData :=?, - importance :=* -} - - -template ASP_SCCP_N_UNITDATA_ind tr_ASP_N_UNITDATA_ind:= -{ - calledAddress :=?, - callingAddress :=?, - sequenceControl :=*, - returnOption :=*, - userData :=?, - importance :=* -} - - -template ASP_SCCP_N_NOTICE_ind tr_ASP_N_NOTICE_ind:= -{ - calledAddress :=?, - callingAddress :=?, - reasonForReturn :=?, - userData :=?, - importance :=* -} - - -template ASP_SCCP_N_STATE_ind tr_ASP_N_STATE_ind:= -{ - affectedSubSystem :=?, - userStatus :=?, - subsystmultiindicator :=* -} - -template ASP_SCCP_N_RESET_req tr_ASP_N_RESET_req:= -{ - originator :=?, - reason :=?, - connectionId :=* -} - - -template ASP_SCCP_N_RESET_ind tr_ASP_N_RESET_ind:= -{ - originator :=?, - reason :=?, - connectionId :=* -} - -template ASP_SCCP_N_RESET_resp tr_ASP_N_RESET_resp:= -{ - connectionId :=* -} - -template ASP_SCCP_N_RESET_cfm tr_ASP_N_RESET_cfm:= -{ - connectionId :=* -} - - - -}//endgroup ASPTemplateDefinitionsReceiving - - - -} //with { encode "RAW"} -//endmodule SCCP ASP types - diff --git a/SCTPasp_CNL113469/SCTPasp_CNL113469.tpd b/SCTPasp_CNL113469/SCTPasp_CNL113469.tpd deleted file mode 100644 index 125ad9fc8..000000000 --- a/SCTPasp_CNL113469/SCTPasp_CNL113469.tpd +++ /dev/null @@ -1,50 +0,0 @@ - - - - SCTPasp_CNL113469 - - - - - - - - - - Default - - - - - true - true - true - bin/SCTPasp_CNL113469 - - USE_SCTP - - Level 3 - Creating object files with dependency update - - - bin - - - - - diff --git a/SCTPasp_CNL113469/doc/SCTPasp_CNL113469_PRI.doc b/SCTPasp_CNL113469/doc/SCTPasp_CNL113469_PRI.doc deleted file mode 100644 index 5923989c74195d75f2466e67206ae78c56dda6e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64512 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 z

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 ^B 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 diff --git a/SCTPasp_CNL113469/src/SCTPasp_PT.cc b/SCTPasp_CNL113469/src/SCTPasp_PT.cc deleted file mode 100644 index 6d7b02b4a..000000000 --- a/SCTPasp_CNL113469/src/SCTPasp_PT.cc +++ /dev/null @@ -1,1549 +0,0 @@ -/****************************************************************************** -* Copyright (c) 2005, 2014 Ericsson AB -* All rights reserved. This program and the accompanying materials -* are made available under the terms of the Eclipse Public License v1.0 -* which accompanies this distribution, and is available at -* http://www.eclipse.org/legal/epl-v10.html -* -* Contributors: -* Peter Dimitrov- initial implementation and initial documentation -* Adam Delic -* Eduard Czimbalmos -* Endre Kulcsar -* Gabor Bettesch -* Gabor Szalai -* Tamas Buti -* Zoltan Medve -******************************************************************************/ -// -// File: SCTPasp_PT.cc -// Description: SCTPasp test port source -// Rev: R11A -// Prodnr: CNL 113 469 -// - - -#include "SCTPasp_PT.hh" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define BUFLEN 1024 -#define MAP_LENGTH 10 -#ifdef SCTP_ADAPTION_LAYER - #ifdef LKSCTP_1_0_7 - #undef LKSCTP_1_0_7 - #error LKSCTP_1_0_7 defined but the lksctp older than 1.0.7. Use only -DUSE_SCTP, version is automatically selected - #endif - #ifdef LKSCTP_1_0_9 - #error LKSCTP_1_0_9 defined but the lksctp older than 1.0.7. Use only -DUSE_SCTP, version is automatically selected - #undef LKSCTP_1_0_9 - #endif -#else -// 1.0.7 or newer - #ifdef SCTP_AUTH_CHUNK - // 1.0.9 or newer - #ifdef LKSCTP_1_0_7 - #undef LKSCTP_1_0_7 - #error LKSCTP_1_0_7 defined but the lksctp newer than 1.0.7. Use only -DUSE_SCTP, version is automatically selected - #endif - #ifndef LKSCTP_1_0_9 - #define LKSCTP_1_0_9 - #endif - #else - // 1.0.7 - #ifdef LKSCTP_1_0_9 - #undef LKSCTP_1_0_9 - #error LKSCTP_1_0_9 defined but the lksctp older than 1.0.9. Use only -DUSE_SCTP, version is automatically selected - #endif - #ifndef LKSCTP_1_0_7 - #define LKSCTP_1_0_7 - #endif - - #endif - -#endif - -namespace SCTPasp__PortType { - -struct SCTPasp__PT_PROVIDER::fd_map_item -{ // used by map operations - int fd; // socket descriptor - boolean erased; - boolean processing_message; // if true only part of the message is received - boolean einprogress; // connection establishment is in progress - void * buf; // buffer - ssize_t buflen; // length of the buffer - ssize_t nr; // number of received bytes - struct sockaddr_in sin; // storing remote address -}; - - -struct SCTPasp__PT_PROVIDER::fd_map_server_item // server item -{ // used by map operations - int fd; // socket descriptor - boolean erased; - struct in_addr local_IP_address; - unsigned short local_port; -}; - - -SCTPasp__PT_PROVIDER::SCTPasp__PT_PROVIDER(const char *par_port_name) - : PORT(par_port_name) -{ - simple_mode = FALSE; - reconnect = FALSE; - reconnect_max_attempts = 6; - server_mode = FALSE; - debug = FALSE; - server_backlog = 1; - local_IP_address.s_addr = INADDR_ANY; - (void) memset(&initmsg, 0, sizeof(struct sctp_initmsg)); - initmsg.sinit_num_ostreams = 64; - initmsg.sinit_max_instreams = 64; - initmsg.sinit_max_attempts = 0; - initmsg.sinit_max_init_timeo = 0; - (void) memset(&events, 0, sizeof (events)); - events.sctp_data_io_event = TRUE; - events.sctp_association_event = TRUE; - events.sctp_address_event = TRUE; - events.sctp_send_failure_event = TRUE; - events.sctp_peer_error_event = TRUE; - events.sctp_shutdown_event = TRUE; - events.sctp_partial_delivery_event = TRUE; -#if defined(LKSCTP_1_0_7) || defined(LKSCTP_1_0_9) - events.sctp_adaptation_layer_event = TRUE; -#else - events.sctp_adaption_layer_event = TRUE; -#endif - local_port_is_present = FALSE; - peer_IP_address_is_present = FALSE; - peer_port_is_present = FALSE; - - fd_map=NULL; - list_len=0; - - fd_map_server=NULL; - list_len_server=0; - - fd = -1; - FD_ZERO(&readfds); - FD_ZERO(&writefds); - local_port=-1; - peer_port=-1; - receiving_fd=-1; -} - - -SCTPasp__PT_PROVIDER::~SCTPasp__PT_PROVIDER() -{ - for(int i=0;i=0) ) - reconnect_max_attempts = value; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be positive integer!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "server_mode") == 0) - { - if (strcasecmp(parameter_value,"yes") == 0) - server_mode = TRUE; - else if(strcasecmp(parameter_value,"no") == 0) - server_mode = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. Only yes and no can be used!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "debug") == 0) - { - if (strcasecmp(parameter_value,"yes") == 0) - debug = TRUE; - else if(strcasecmp(parameter_value,"no") == 0) - debug = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. Only yes and no can be used!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "server_backlog") == 0) - { - int value; - if ( (sscanf(parameter_value, "%d", &value) == 1) && (value>=0) ) - server_backlog = value; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be positive integer!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "local_IP_address") == 0) - { - local_IP_address = get_in_addr((const char *) parameter_value); - } - else if(strcmp(parameter_name, "local_port") == 0) - { - unsigned short value; - if (sscanf(parameter_value, "%hu", &value) == 1) - { - local_port = value; - local_port_is_present = TRUE; - } - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be positive integer!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "peer_IP_address") == 0) - { - peer_IP_address = get_in_addr((const char *) parameter_value); - peer_IP_address_is_present = TRUE; - } - else if(strcmp(parameter_name, "peer_port") == 0) - { - unsigned short value; - if (sscanf(parameter_value, "%hu", &value) == 1) - { - peer_port = value; - peer_port_is_present = TRUE; - } - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be positive integer!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "sinit_num_ostreams") == 0) - { - long value; - if ( (sscanf(parameter_value, "%ld", &value) == 1) && (value>=0) ) - initmsg.sinit_num_ostreams = value; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be positive integer!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "sinit_max_instreams") == 0) - { - long value; - if ( (sscanf(parameter_value, "%ld", &value) == 1) && (value>=0) ) - initmsg.sinit_max_instreams = value; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be positive integer!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "sinit_max_attempts") == 0) - { - long value; - if ( (sscanf(parameter_value, "%ld", &value) == 1) && (value>=0) ) - initmsg.sinit_max_attempts = value; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be positive integer!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "sinit_max_init_timeo") == 0) - { - long value; - if ( (sscanf(parameter_value, "%ld", &value) == 1) && (value>=0) ) - initmsg.sinit_max_init_timeo = value; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be positive integer!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "sctp_association_event") == 0) - { - if (strcasecmp(parameter_value,"enabled") == 0) - events.sctp_association_event = TRUE; - else if(strcasecmp(parameter_value,"disabled") == 0) - events.sctp_association_event = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be enabled or disabled!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "sctp_address_event") == 0) - { - if (strcasecmp(parameter_value,"enabled") == 0) - events.sctp_address_event = TRUE; - else if(strcasecmp(parameter_value,"disabled") == 0) - events.sctp_address_event = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be enabled or disabled!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "sctp_send_failure_event") == 0) - { - if (strcasecmp(parameter_value,"enabled") == 0) - events.sctp_send_failure_event = TRUE; - else if(strcasecmp(parameter_value,"disabled") == 0) - events.sctp_send_failure_event = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be enabled or disabled!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "sctp_peer_error_event") == 0) - { - if (strcasecmp(parameter_value,"enabled") == 0) - events.sctp_peer_error_event = TRUE; - else if(strcasecmp(parameter_value,"disabled") == 0) - events.sctp_peer_error_event = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be enabled or disabled!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "sctp_shutdown_event") == 0) - { - if (strcasecmp(parameter_value,"enabled") == 0) - events.sctp_shutdown_event = TRUE; - else if(strcasecmp(parameter_value,"disabled") == 0) - events.sctp_shutdown_event = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be enabled or disabled!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "sctp_partial_delivery_event") == 0) - { - if (strcasecmp(parameter_value,"enabled") == 0) - events.sctp_partial_delivery_event = TRUE; - else if(strcasecmp(parameter_value,"disabled") == 0) - events.sctp_partial_delivery_event = FALSE; - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be enabled or disabled!" , - parameter_value, parameter_name); - } - else if(strcmp(parameter_name, "sctp_adaption_layer_event") == 0) - { - if (strcasecmp(parameter_value,"enabled") == 0) -#if defined(LKSCTP_1_0_7) || defined(LKSCTP_1_0_9) - events.sctp_adaptation_layer_event = TRUE; -#else - events.sctp_adaption_layer_event = TRUE; -#endif - else if(strcasecmp(parameter_value,"disabled") == 0) -#if defined(LKSCTP_1_0_7) || defined(LKSCTP_1_0_9) - events.sctp_adaptation_layer_event = FALSE; -#else - events.sctp_adaption_layer_event = FALSE; -#endif - else - error("set_parameter(): Invalid parameter value: %s for parameter %s. It should be enabled or disabled!" , - parameter_value, parameter_name); - } - else - TTCN_warning("%s: unknown & unhandled parameter: %s", - get_name(), parameter_name); - errno = 0; -} - - -void SCTPasp__PT_PROVIDER::Event_Handler(const fd_set *read_fds, - const fd_set *write_fds, const fd_set */*error_fds*/, - double /*time_since_last_call*/) -{ - // Accepting new client - if(!simple_mode) - { - for(int i=0;isinfo_ppid); - INTEGER i_ppid; - if (ui <= (unsigned long)INT_MAX) - i_ppid = ui; - else { - char sbuf[16]; - sprintf(sbuf, "%u", ui); - i_ppid = INTEGER(sbuf); - } - incoming_message(SCTPasp__Types::ASP__SCTP( - INTEGER(receiving_fd), - INTEGER(sri->sinfo_stream), - i_ppid, - OCTETSTRING(fd_map[i].nr,(const unsigned char *)fd_map[i].buf))); - } - Free(fd_map[i].buf); - fd_map[i].buf = NULL; - break; - case PARTIAL_RECEIVE: - fd_map[i].processing_message = TRUE; - break; - case EOF_OR_ERROR: - if (!server_mode) fd = -1; // setting closed socket to -1 in client mode (and reconnect mode) - FD_CLR(receiving_fd, &readfds); - Install_Handler(&readfds, NULL, NULL, 0.0); - map_delete_item(i); - if (events.sctp_association_event) incoming_message(SCTPasp__Types::ASP__SCTP__ASSOC__CHANGE( - INTEGER(receiving_fd), - SCTPasp__Types::SAC__STATE(SCTP_COMM_LOST))); - log("getmsg() returned with NULL. Socket is closed."); - if (reconnect) forced_reconnect(reconnect_max_attempts); - - break; - }//endswitch - }// endif - }// endfor -} - - -void SCTPasp__PT_PROVIDER::user_map(const char *system_port) -{ - log("Calling user_map(%s).",system_port); - if(simple_mode) - { - if ( server_mode && reconnect ) - { - error("user_map(): server mode and reconnect mode are mutually exclusive!"); - } - if ( server_mode && !local_port_is_present ) - { - error("user_map(): in server mode local_port must be defined!"); - } - - // Server mode: turns on listening - if (server_mode) - { - log("Running in SERVER_MODE."); - create_socket(); - if (listen(fd, server_backlog) == -1) error("Listen error!"); - log("Listening @ (%s):(%d)", inet_ntoa(local_IP_address), local_port); - FD_SET(fd, &readfds); - Install_Handler(&readfds, NULL, NULL, 0.0); - } else if (reconnect) { - log("Running in RECONNECT MODE."); - forced_reconnect(reconnect_max_attempts+1); - } else { - log("Running in CLIENT MODE."); - } - } - else - { - log("Running in NORMAL MODE."); - } - log("Leaving user_map()."); -} - - -void SCTPasp__PT_PROVIDER::user_unmap(const char *system_port) -{ - log("Calling user_unmap(%s).",system_port); - Uninstall_Handler(); - FD_ZERO(&readfds); - FD_ZERO(&writefds); - if(!simple_mode) - { - for(int i=0;icmsg_len = sizeof (*cmsg) + sizeof (*sri); - cmsg->cmsg_level = IPPROTO_SCTP; - cmsg->cmsg_type = SCTP_SNDRCV; - - sri->sinfo_stream = (int) send_par.sinfo__stream(); - - int target; - if(!simple_mode) - { - if (!send_par.client__id().ispresent()) - error("In NORMAL mode the client_id field of ASP_SCTP should be set to a valid value and not to omit!"); - target = (int) (const INTEGER&) send_par.client__id(); - if ( (map_get_item(target)==-1) && (map_get_item_server(target)==-1)) error("Bad client id! %d",target); - } - else - { - if (server_mode) - { - if (!send_par.client__id().ispresent()) - error("In server mode the client_id field of ASP_SCTP should be set to a valid value and not to omit!"); - } - else // client mode - { - if (send_par.client__id().ispresent()) - error("In client mode the client_id field of ASP_SCTP should be set to OMIT!"); - } - target = fd; - if (server_mode) - target = (int) (const INTEGER&) send_par.client__id(); - if (map_get_item(target)==-1) error("Bad client id! %d",target); - } - - uint32_t ui; - if (send_par.sinfo__ppid().get_val().is_native() && send_par.sinfo__ppid() > 0) - ui = (int)send_par.sinfo__ppid(); - else { - OCTETSTRING os = int2oct(send_par.sinfo__ppid(), 4); - unsigned char* p = (unsigned char*)&ui; - *(p++) = os[3].get_octet(); - *(p++) = os[2].get_octet(); - *(p++) = os[1].get_octet(); - *(p++) = os[0].get_octet(); - } - sri->sinfo_ppid = htonl(ui); - - log("Sending SCTP message to file descriptor %d.", target); - if (sendmsg(target, &msg, 0) < 0) - { - SCTPasp__Types::ASP__SCTP__SENDMSG__ERROR asp_sctp_sendmsg_error; - if (server_mode) asp_sctp_sendmsg_error.client__id() = target; - else asp_sctp_sendmsg_error.client__id() = OMIT_VALUE; - asp_sctp_sendmsg_error.sinfo__stream() = send_par.sinfo__stream(); - asp_sctp_sendmsg_error.sinfo__ppid() = send_par.sinfo__ppid(); - asp_sctp_sendmsg_error.data() = send_par.data(); - incoming_message(asp_sctp_sendmsg_error); - TTCN_warning("Sendmsg error! Strerror=%s", strerror(errno)); - - errno = 0; - } - log("Leaving outgoing_send (ASP_SCTP)."); -} - - -SCTPasp__PT_PROVIDER::return_value_t SCTPasp__PT_PROVIDER::getmsg(int fd, struct msghdr *msg) -{ - log("Calling getmsg()."); - int index = map_get_item(fd); - if ( !fd_map[index].processing_message ) fd_map[index].nr = 0; - - ssize_t value = recvmsg(fd, msg, 0); - if (value <= 0) // EOF or error - { - log("Leaving getmsg(): EOF or error."); - errno = 0; - return EOF_OR_ERROR; - } - fd_map[index].nr += value; - log("getmsg(): [%d] bytes received. Receiving buffer now has [%d] bytes.", value, fd_map[index].nr); - // Whole message is received, return it. - if (msg->msg_flags & MSG_EOR) - { - log("Leaving getmsg(): whole message is received."); - return WHOLE_MESSAGE_RECEIVED; - } - - // Maybe we need a bigger buffer, do realloc(). - if (fd_map[index].buflen == fd_map[index].nr) - { - log("getmsg(): resizing receiving buffer: [%d] bytes -> [%d] bytes", - fd_map[index].buflen, (fd_map[index].buflen * 2)); - fd_map[index].buf = Realloc(fd_map[index].buf, fd_map[index].buflen * 2); - fd_map[index].buflen *= 2; - } - log("Leaving getmsg(): part of the message is received."); - return PARTIAL_RECEIVE; -} - - -void SCTPasp__PT_PROVIDER::handle_event(void *buf) -{ - union sctp_notification *snp; - snp = (sctp_notification *)buf; - switch (snp->sn_header.sn_type) - { - case SCTP_ASSOC_CHANGE: - { - log("incoming SCTP_ASSOC_CHANGE event."); - struct sctp_assoc_change *sac; - sac = &snp->sn_assoc_change; - -// #ifdef LKSCTP_1_0_7 - SCTPasp__Types::SAC__STATE sac_state_ttcn; - switch(sac->sac_state) - { - case SCTP_COMM_UP: - sac_state_ttcn = SCTPasp__Types::SAC__STATE::SCTP__COMM__UP; - break; - - case SCTP_COMM_LOST: - sac_state_ttcn = SCTPasp__Types::SAC__STATE::SCTP__COMM__LOST; - break; - - case SCTP_RESTART: - sac_state_ttcn = SCTPasp__Types::SAC__STATE::SCTP__RESTART; - break; - - case SCTP_SHUTDOWN_COMP: - sac_state_ttcn = SCTPasp__Types::SAC__STATE::SCTP__SHUTDOWN__COMP; - break; - - case SCTP_CANT_STR_ASSOC: - sac_state_ttcn = SCTPasp__Types::SAC__STATE::SCTP__CANT__STR__ASSOC; - break; - - default: - sac_state_ttcn = SCTPasp__Types::SAC__STATE::SCTP__UNKNOWN__SAC__STATE; - TTCN_warning("Unexpected sac_state value received %d", sac->sac_state); - break; - } -// #endif - - if(sac->sac_state == SCTP_COMM_LOST) - { - if(simple_mode) - { - if (!server_mode) fd = -1; // setting closed socket to -1 in client mode (and reconnect mode) - FD_CLR(receiving_fd, &readfds); - Install_Handler(&readfds, NULL, NULL, 0.0); - map_delete_item_fd(receiving_fd); - } - else - { - FD_CLR(receiving_fd, &readfds); - Install_Handler(&readfds, NULL, NULL, 0.0); - map_delete_item_fd(receiving_fd); - map_delete_item_fd_server(receiving_fd); - } - } - if (events.sctp_association_event) incoming_message(SCTPasp__Types::ASP__SCTP__ASSOC__CHANGE( - INTEGER(receiving_fd), - sac_state_ttcn - )); - - if(simple_mode) - { - if (reconnect && (sac->sac_state == SCTP_COMM_LOST) ) forced_reconnect(reconnect_max_attempts); - } - break; - } - case SCTP_PEER_ADDR_CHANGE:{ - log("incoming SCTP_PEER_ADDR_CHANGE event."); - struct sctp_paddr_change *spc; - spc = &snp->sn_paddr_change; -// #ifdef LKSCTP_1_0_7 - SCTPasp__Types::SPC__STATE spc_state_ttcn; - switch(spc->spc_state) - { - case SCTP_ADDR_AVAILABLE: - spc_state_ttcn = SCTPasp__Types::SPC__STATE::SCTP__ADDR__AVAILABLE; - break; - - case SCTP_ADDR_UNREACHABLE: - spc_state_ttcn = SCTPasp__Types::SPC__STATE::SCTP__ADDR__UNREACHABLE; - break; - - case SCTP_ADDR_REMOVED: - spc_state_ttcn = SCTPasp__Types::SPC__STATE::SCTP__ADDR__REMOVED; - break; - - case SCTP_ADDR_ADDED: - spc_state_ttcn = SCTPasp__Types::SPC__STATE::SCTP__ADDR__ADDED; - break; - - case SCTP_ADDR_MADE_PRIM: - spc_state_ttcn = SCTPasp__Types::SPC__STATE::SCTP__ADDR__MADE__PRIM; - break; -#if defined(LKSCTP_1_0_7) || defined(LKSCTP_1_0_9) - case SCTP_ADDR_CONFIRMED: - spc_state_ttcn = SCTPasp__Types::SPC__STATE::SCTP__ADDR__CONFIRMED; - break; -#endif - default: - spc_state_ttcn = SCTPasp__Types::SPC__STATE::SCTP__UNKNOWN__SPC__STATE; - TTCN_warning("Unexpected spc_state value received %d", spc->spc_state); - break; - } -// #endif - if (events.sctp_address_event) incoming_message(SCTPasp__Types::ASP__SCTP__PEER__ADDR__CHANGE( - INTEGER(receiving_fd), - spc_state_ttcn - )); - break; - } - case SCTP_REMOTE_ERROR: - log("incoming SCTP_REMOTE_ERROR event."); - //struct sctp_remote_error *sre; - //sre = &snp->sn_remote_error; - if (events.sctp_peer_error_event) incoming_message(SCTPasp__Types::ASP__SCTP__REMOTE__ERROR(INTEGER(receiving_fd))); - break; - case SCTP_SEND_FAILED: - log("incoming SCTP_SEND_FAILED event."); - //struct sctp_send_failed *ssf; - //ssf = &snp->sn_send_failed; - if (events.sctp_send_failure_event) incoming_message(SCTPasp__Types::ASP__SCTP__SEND__FAILED(INTEGER(receiving_fd))); - break; - case SCTP_SHUTDOWN_EVENT: - log("incoming SCTP_SHUTDOWN_EVENT event."); - //struct sctp_shutdown_event *sse; - //sse = &snp->sn_shutdown_event; - if (events.sctp_shutdown_event) incoming_message(SCTPasp__Types::ASP__SCTP__SHUTDOWN__EVENT(INTEGER(receiving_fd))); - break; -#if defined(LKSCTP_1_0_7) || defined(LKSCTP_1_0_9) - case SCTP_ADAPTATION_INDICATION: - log("incoming SCTP_ADAPTION_INDICATION event."); - //struct sctp_adaptation_event *sai; - //sai = &snp->sn_adaptation_event; - if (events.sctp_adaptation_layer_event) incoming_message(SCTPasp__Types::ASP__SCTP__ADAPTION__INDICATION(INTEGER(receiving_fd))); - break; -#else - case SCTP_ADAPTION_INDICATION: - log("incoming SCTP_ADAPTION_INDICATION event."); - //struct sctp_adaption_event *sai; - //sai = &snp->sn_adaption_event; - if (events.sctp_adaption_layer_event) incoming_message(SCTPasp__Types::ASP__SCTP__ADAPTION__INDICATION(INTEGER(receiving_fd))); - break; -#endif - case SCTP_PARTIAL_DELIVERY_EVENT: - log("incoming SCTP_PARTIAL_DELIVERY_EVENT event."); - //struct sctp_pdapi_event *pdapi; - //pdapi = &snp->sn_pdapi_event; - if (events.sctp_partial_delivery_event) incoming_message(SCTPasp__Types::ASP__SCTP__PARTIAL__DELIVERY__EVENT(INTEGER(receiving_fd))); - break; - default: - TTCN_warning("Unknown notification type!"); - break; - } -} - - -void SCTPasp__PT_PROVIDER::log(const char *fmt, ...) -{ - if(debug) - { - va_list ap; - va_start(ap, fmt); - TTCN_Logger::begin_event(TTCN_DEBUG); - TTCN_Logger::log_event("SCTPasp Test Port (%s): ", get_name()); - TTCN_Logger::log_event_va_list(fmt, ap); - TTCN_Logger::end_event(); - va_end(ap); - - } -} - - -void SCTPasp__PT_PROVIDER::error(const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - TTCN_Logger::begin_event(TTCN_ERROR); - TTCN_Logger::log_event("SCTPasp Test Port (%s): ", get_name()); - TTCN_Logger::log_event_va_list(fmt, ap); - TTCN_Logger::end_event(); - va_end(ap); - TTCN_error("Fatal error in SCTPasp Test Port %s (see above).", get_name()); -} - - -void SCTPasp__PT_PROVIDER::forced_reconnect(int attempts) -{ - struct sockaddr_in sin; - sin.sin_family = AF_INET; - sin.sin_port = htons(peer_port); - sin.sin_addr.s_addr = peer_IP_address.s_addr; - log("[reconnect] Connecting to (%s):(%d)", inet_ntoa(peer_IP_address), peer_port); - unsigned int sleep_interval = 1; - int i; - for(i = 0; i < attempts; i++) - { - create_socket(); - if (connect(fd, (struct sockaddr *)&sin, sizeof (sin)) == -1) - { - close(fd); - fd = -1; - TTCN_warning("Connect error!"); - errno = 0; - if( ((i % 2 ) == 0) && (i != 0)) sleep_interval *= 2; - sleep(sleep_interval); - - } - else - { - map_put_item(fd); - setNonBlocking(fd); - FD_SET(fd, &readfds); - Install_Handler(&readfds, NULL, NULL, 0.0); - log("[reconnect] Connection successfully established to (%s):(%d)", inet_ntoa(peer_IP_address), peer_port); - break; - } - } - if (i == attempts) error("Forced reconnect failed! Remote end is unreachable!"); - -} - - -void SCTPasp__PT_PROVIDER::map_put_item(int fd) -{ - int i=0; - while((i=list_len) || (index<0)) error("map_delete_item: index out of range (0-%d): %d",list_len-1,index); - - if(fd_map[index].fd!=-1) close(fd_map[index].fd); - fd_map[index].fd=-1; - fd_map[index].erased=TRUE; - fd_map[index].einprogress=FALSE; - if(fd_map[index].buf) Free(fd_map[index].buf); - fd_map[index].buf=NULL; - fd_map[index].buflen=0; - fd_map[index].processing_message=FALSE; - fd_map[index].nr=0; - fd_map[index].sin.sin_family=AF_INET; - fd_map[index].sin.sin_port=0; - fd_map[index].sin.sin_addr.s_addr=0; -} - - -void SCTPasp__PT_PROVIDER::map_put_item_server(int fd, struct in_addr local_IP_address, unsigned short local_port) -{ - int i=0; - while((i=list_len_server) || (index<0)) error("map_delete_item: index out of range (0-%d): %d",list_len_server-1,index); - - if(fd_map_server[index].fd!=-1) close(fd_map_server[index].fd); - fd_map_server[index].fd=-1; - fd_map_server[index].erased=TRUE; - fd_map_server[index].local_IP_address.s_addr = INADDR_ANY; - fd_map_server[index].local_port = 0; -} - - -void SCTPasp__PT_PROVIDER::create_socket() -{ - struct sockaddr_in sin; - - log("Creating SCTP socket."); - if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP)) == -1) - error("Socket error: cannot create socket!"); - - if ( local_port_is_present ) { - sin.sin_family = AF_INET; - sin.sin_port = htons(local_port); - sin.sin_addr.s_addr = local_IP_address.s_addr; - log("Binding SCTP socket: bind address (%s):(%d)", - inet_ntoa(local_IP_address),local_port); - if (bind(fd, (struct sockaddr *)&sin, sizeof (sin)) == -1) - { - close(fd); - fd = -1; - error("Bind error!"); - } - } - - log("Setting SCTP socket options (initmsg)."); - if (setsockopt(fd, IPPROTO_SCTP, SCTP_INITMSG, &initmsg, - sizeof(struct sctp_initmsg)) < 0) - { - TTCN_warning("Setsockopt error!"); - errno = 0; - } - - log("Setting SCTP socket options (events)."); - if (setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &events, sizeof (events)) < 0) - { - TTCN_warning("Setsockopt error!"); - errno = 0; - } -} - - -in_addr SCTPasp__PT_PROVIDER::get_in_addr(const char *hostname) -{ - struct hostent *h; - if ((h=gethostbyname(hostname)) == NULL) - error("Gethostbyname error!"); - if(h->h_addr == NULL) error("Gethostbyname error! h->h_addr is NULL!"); - return *((struct in_addr *)h->h_addr); -} - -void SCTPasp__PT_PROVIDER::setNonBlocking(int fd) -{ - int flags = fcntl(fd, F_GETFL); - flags |= O_NONBLOCK; - int result = fcntl(fd, F_SETFL, flags); - if (result==-1) error("SCTPasp__PT::setNonBlocking(): Fcntl() error!"); -} - - -} diff --git a/SCTPasp_CNL113469/src/SCTPasp_PT.hh b/SCTPasp_CNL113469/src/SCTPasp_PT.hh deleted file mode 100644 index 7d6311d3c..000000000 --- a/SCTPasp_CNL113469/src/SCTPasp_PT.hh +++ /dev/null @@ -1,157 +0,0 @@ -/****************************************************************************** -* Copyright (c) 2005, 2014 Ericsson AB -* All rights reserved. This program and the accompanying materials -* are made available under the terms of the Eclipse Public License v1.0 -* which accompanies this distribution, and is available at -* http://www.eclipse.org/legal/epl-v10.html -* -* Contributors: -* Peter Dimitrov- initial implementation and initial documentation -* Adam Delic -* Eduard Czimbalmos -* Endre Kulcsar -* Gabor Bettesch -* Gabor Szalai -* Tamas Buti -* Zoltan Medve -******************************************************************************/ -// -// File: SCTPasp_PT.hh -// Description: SCTPasp test port header -// Rev: R11A -// Prodnr: CNL 113 469 -// - - -#ifndef SCTPasp__PT_HH -#define SCTPasp__PT_HH - -#include -#include "SCTPasp_Types.hh" -#include -#include -#include - -namespace SCTPasp__Types { - class ASP__SCTP; - class ASP__SCTP__Connect; - class ASP__SCTP__ConnectFrom; - class ASP__SCTP__Listen; - - class SCTP__INIT; - class SCTP__EVENTS; - class SO__LINGER; - class SCTP__RTOINFO; - class SAC__STATE; - class SPC__STATE; - - class ASP__SCTP__SetSocketOptions; - class ASP__SCTP__Close; - class ASP__SCTP__ASSOC__CHANGE; - class ASP__SCTP__PEER__ADDR__CHANGE; - class ASP__SCTP__SEND__FAILED; - class ASP__SCTP__REMOTE__ERROR; - class ASP__SCTP__SHUTDOWN__EVENT; - class ASP__SCTP__PARTIAL__DELIVERY__EVENT; - class ASP__SCTP__ADAPTION__INDICATION; - class ASP__SCTP__Connected; - class ASP__SCTP__SENDMSG__ERROR; - class ASP__SCTP__RESULT; -} - -namespace SCTPasp__PortType { -class SCTPasp__PT_PROVIDER : public PORT { -public: - SCTPasp__PT_PROVIDER(const char *par_port_name = NULL); - ~SCTPasp__PT_PROVIDER(); - - void set_parameter(const char *parameter_name, - const char *parameter_value); - - void Event_Handler(const fd_set *read_fds, - const fd_set *write_fds, const fd_set *error_fds, - double time_since_last_call); - -protected: - void user_map(const char *system_port); - void user_unmap(const char *system_port); - - void user_start(); - void user_stop(); - - void outgoing_send(const SCTPasp__Types::ASP__SCTP__Connect& send_par); - void outgoing_send(const SCTPasp__Types::ASP__SCTP__ConnectFrom& send_par); - void outgoing_send(const SCTPasp__Types::ASP__SCTP__Listen& send_par); - void outgoing_send(const SCTPasp__Types::ASP__SCTP__SetSocketOptions& send_par); - void outgoing_send(const SCTPasp__Types::ASP__SCTP__Close& send_par); - void outgoing_send(const SCTPasp__Types::ASP__SCTP& send_par); - - virtual void incoming_message(const SCTPasp__Types::ASP__SCTP& incoming_par) = 0; - virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__ASSOC__CHANGE& incoming_par) = 0; - virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__PEER__ADDR__CHANGE& incoming_par) = 0; - virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__SEND__FAILED& incoming_par) = 0; - virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__REMOTE__ERROR& incoming_par) = 0; - virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__SHUTDOWN__EVENT& incoming_par) = 0; - virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__PARTIAL__DELIVERY__EVENT& incoming_par) = 0; - virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__ADAPTION__INDICATION& incoming_par) = 0; - virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__Connected& incoming_par) = 0; - virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__SENDMSG__ERROR& incoming_par) = 0; - virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__RESULT& incoming_par) = 0; - -private: - enum return_value_t { WHOLE_MESSAGE_RECEIVED, PARTIAL_RECEIVE, EOF_OR_ERROR }; - return_value_t getmsg(int fd, struct msghdr *msg); - void handle_event(void *buf); - void log(const char *fmt, ...); - void error(const char *fmt, ...); - void handle_event_reconnect(void *buf); - void forced_reconnect(int attempts); - // map operations - void map_put_item(int fd); - int map_get_item(int fd); - void map_delete_item_fd(int fd); - void map_delete_item(int index); - - void map_put_item_server(int fd, struct in_addr local_IP_address, unsigned short local_port); - int map_get_item_server(int fd); - void map_delete_item_fd_server(int fd); - void map_delete_item_server(int index); - - void create_socket(); - in_addr get_in_addr(const char *hostname); - void setNonBlocking(int fd); - - boolean simple_mode; - boolean reconnect; - int reconnect_max_attempts; - boolean server_mode; - boolean debug; - int server_backlog; - struct in_addr local_IP_address; - struct in_addr peer_IP_address; - unsigned short local_port; - unsigned short peer_port; - - struct sctp_event_subscribe events; - struct sctp_initmsg initmsg; - - boolean local_port_is_present; - boolean peer_IP_address_is_present; - boolean peer_port_is_present; - - int fd; - fd_set readfds, writefds; - int receiving_fd; - - struct fd_map_item; - fd_map_item *fd_map; - int list_len; - - struct fd_map_server_item; - fd_map_server_item *fd_map_server; - int list_len_server; - - -}; -} -#endif diff --git a/SCTPasp_CNL113469/src/SCTPasp_PortType.ttcn b/SCTPasp_CNL113469/src/SCTPasp_PortType.ttcn deleted file mode 100644 index 27aae086f..000000000 --- a/SCTPasp_CNL113469/src/SCTPasp_PortType.ttcn +++ /dev/null @@ -1,62 +0,0 @@ -/****************************************************************************** -* Copyright (c) 2005, 2014 Ericsson AB -* All rights reserved. This program and the accompanying materials -* are made available under the terms of the Eclipse Public License v1.0 -* which accompanies this distribution, and is available at -* http://www.eclipse.org/legal/epl-v10.html -* -* Contributors: -* Peter Dimitrov- initial implementation and initial documentation -* Adam Delic -* Eduard Czimbalmos -* Endre Kulcsar -* Gabor Bettesch -* Gabor Szalai -* Tamas Buti -* Zoltan Medve -******************************************************************************/ -// -// File: SCTPasp_PortType.ttcn -// Description: SCTPasp testport definition file -// Rev: R11A -// Prodnr: CNL 113 469 -// - -module SCTPasp_PortType -{ - -import from SCTPasp_Types all; - -//========================================================================= -//Port Types -//========================================================================= - -type port SCTPasp_PT message -{ - inout ASP_SCTP; - - out ASP_SCTP_Connect; - out ASP_SCTP_ConnectFrom; - out ASP_SCTP_Listen; - out ASP_SCTP_SetSocketOptions; - out ASP_SCTP_Close; - - in ASP_SCTP_ASSOC_CHANGE; - in ASP_SCTP_PEER_ADDR_CHANGE; - in ASP_SCTP_SEND_FAILED; - in ASP_SCTP_REMOTE_ERROR; - in ASP_SCTP_SHUTDOWN_EVENT; - in ASP_SCTP_PARTIAL_DELIVERY_EVENT; - in ASP_SCTP_ADAPTION_INDICATION; - - in ASP_SCTP_Connected; - in ASP_SCTP_SENDMSG_ERROR; - in ASP_SCTP_RESULT; - -} with { extension "provider" } - -}//end of module -with { -extension "version R11A" -} - diff --git a/SCTPasp_CNL113469/src/SCTPasp_Types.ttcn b/SCTPasp_CNL113469/src/SCTPasp_Types.ttcn deleted file mode 100644 index f10fc5881..000000000 --- a/SCTPasp_CNL113469/src/SCTPasp_Types.ttcn +++ /dev/null @@ -1,201 +0,0 @@ -/****************************************************************************** -* Copyright (c) 2005, 2014 Ericsson AB -* All rights reserved. This program and the accompanying materials -* are made available under the terms of the Eclipse Public License v1.0 -* which accompanies this distribution, and is available at -* http://www.eclipse.org/legal/epl-v10.html -* -* Contributors: -* Peter Dimitrov- initial implementation and initial documentation -* Adam Delic -* Eduard Czimbalmos -* Endre Kulcsar -* Gabor Bettesch -* Gabor Szalai -* Tamas Buti -* Zoltan Medve -******************************************************************************/ -// -// File: SCTPasp_Types.ttcn -// Description: SCTP ASP definition file -// Rev: R11A -// Prodnr: CNL 113 469 -// - - -module SCTPasp_Types -{ - -//========================================================================= -// Data Types -//========================================================================= - -type octetstring PDU_SCTP; - -type record ASP_SCTP -{ - integer client_id optional, - integer sinfo_stream, - integer sinfo_ppid, - PDU_SCTP data -} - - -type record ASP_SCTP_Connect -{ - charstring peer_hostname optional, - integer peer_portnumber (1..65535) optional -} - - -type record ASP_SCTP_ConnectFrom -{ - charstring local_hostname optional, - integer local_portnumber (1..65535), - charstring peer_hostname optional, - integer peer_portnumber (1..65535) optional -} - - -type record ASP_SCTP_Listen -{ - charstring local_hostname optional, - integer local_portnumber (1..65535) -} - - -type record SCTP_INIT -{ - integer sinit_num_ostreams, - integer sinit_max_instreams, - integer sinit_max_attempts, - integer sinit_max_init_timeo -} - -type record SCTP_EVENTS -{ - boolean sctp_data_io_event, - boolean sctp_association_event, - boolean sctp_address_event, - boolean sctp_send_failure_event, - boolean sctp_peer_error_event, - boolean sctp_shutdown_event, - boolean sctp_partial_delivery_event, - boolean sctp_adaption_layer_event -} - -type record SO_LINGER -{ - integer l_onoff, - integer l_linger -} - -type record SCTP_RTOINFO -{ - integer client_id, - integer srto_initial, - integer srto_max, - integer srto_min -} - -type union ASP_SCTP_SetSocketOptions -{ - SCTP_INIT Sctp_init, - SCTP_EVENTS Sctp_events, - SO_LINGER So_linger, - SCTP_RTOINFO Sctp_rtoinfo -} - - -type record ASP_SCTP_Close -{ - integer client_id optional -} - - -type enumerated SAC_STATE -{ - SCTP_COMM_UP, SCTP_COMM_LOST, SCTP_RESTART, - SCTP_SHUTDOWN_COMP, SCTP_CANT_STR_ASSOC, SCTP_UNKNOWN_SAC_STATE -} - -type record ASP_SCTP_ASSOC_CHANGE -{ - integer client_id, - SAC_STATE sac_state -} - - -type enumerated SPC_STATE -{ - SCTP_ADDR_AVAILABLE, SCTP_ADDR_UNREACHABLE, SCTP_ADDR_REMOVED, - SCTP_ADDR_ADDED, SCTP_ADDR_MADE_PRIM, SCTP_ADDR_CONFIRMED, SCTP_UNKNOWN_SPC_STATE -} - -type record ASP_SCTP_PEER_ADDR_CHANGE -{ - integer client_id, - SPC_STATE spc_state -} - - -type record ASP_SCTP_SEND_FAILED -{ - integer client_id -} - - -type record ASP_SCTP_REMOTE_ERROR -{ - integer client_id -} - - -type record ASP_SCTP_SHUTDOWN_EVENT -{ - integer client_id -} - - -type record ASP_SCTP_PARTIAL_DELIVERY_EVENT -{ - integer client_id -} - - -type record ASP_SCTP_ADAPTION_INDICATION -{ - integer client_id -} - - -type record ASP_SCTP_Connected -{ - integer client_id, - charstring local_hostname, - integer local_portnumber (1..65535), - charstring peer_hostname, - integer peer_portnumber (1..65535) -} - - -type record ASP_SCTP_SENDMSG_ERROR -{ - integer client_id optional, - integer sinfo_stream, - integer sinfo_ppid, - PDU_SCTP data -} - -type record ASP_SCTP_RESULT -{ - integer client_id optional, - boolean error_status, - charstring error_message optional -} - -}//end of module -with { -extension "version R11A" -} - diff --git a/bin/install.script b/bin/install.script index a55440809..799b1568c 100755 --- a/bin/install.script +++ b/bin/install.script @@ -5,26 +5,26 @@ SRC_BASE_DIR=~/projects/git/osmo-ttcn3-hacks ln -sf $SRC_BASE_DIR/COMMON/src/General_Types.ttcn . #M3UA protocol module -ln -sf $SRC_BASE_DIR/M3UA_CNL113536/src/M3UA_Types.ttcn . +ln -sf $SRC_BASE_DIR/deps/titan.ProtocolModules.M3UA/src/M3UA_Types.ttcn . #M3UA Emulator -ln -sf $SRC_BASE_DIR/M3UA_CNL113537/src/M3UA_Emulation.ttcn . +ln -sf $SRC_BASE_DIR/src/titan.ProtocolEmulations.M3UA/src/M3UA_Emulation.ttcn . #MTP3 test port (partly) -ln -sf $SRC_BASE_DIR/MTP3asp_CNL113337/src/MTP3asp_Types.ttcn . -ln -sf $SRC_BASE_DIR/MTP3asp_CNL113337/src/MTP3asp_PortType.ttcn . +ln -sf $SRC_BASE_DIR/deps/titan.TestPorts.MTP3asp/src/MTP3asp_Types.ttcn . +ln -sf $SRC_BASE_DIR/deps/titan.TestPorts.MTP3asp/src/MTP3asp_PortType.ttcn . #SCCP Emulator + protocol module -ln -sf $SRC_BASE_DIR/SCCP_CNL113341/src/SCCPasp_Types.ttcn . -ln -sf $SRC_BASE_DIR/SCCP_CNL113341/src/SCCP_Types.ttcn . -ln -sf $SRC_BASE_DIR/SCCP_CNL113341/src/SCCP_Mapping.ttcnpp . -ln -sf $SRC_BASE_DIR/SCCP_CNL113341/src/SCCP_Emulation.ttcn . +ln -sf $SRC_BASE_DIR/deps/titan.ProtocolEmulations.SCCP/src/SCCPasp_Types.ttcn . +ln -sf $SRC_BASE_DIR/deps/titan.ProtocolEmulations.SCCP/src/SCCP_Types.ttcn . +ln -sf $SRC_BASE_DIR/deps/titan.ProtocolEmulations.SCCP/src/SCCP_Mapping.ttcnpp . +ln -sf $SRC_BASE_DIR/deps/titan.ProtocolEmulations.SCCP/src/SCCP_Emulation.ttcn . #SCTP test port -ln -sf $SRC_BASE_DIR/SCTPasp_CNL113469/src/SCTPasp_Types.ttcn . -ln -sf $SRC_BASE_DIR/SCTPasp_CNL113469/src/SCTPasp_PortType.ttcn . -ln -sf $SRC_BASE_DIR/SCTPasp_CNL113469/src/SCTPasp_PT.hh . -ln -sf $SRC_BASE_DIR/SCTPasp_CNL113469/src/SCTPasp_PT.cc . +ln -sf $SRC_BASE_DIR/deps/titan.TestPorts.SCTPasp/src/SCTPasp_Types.ttcn . +ln -sf $SRC_BASE_DIR/deps/titan.TestPorts.SCTPasp/src/SCTPasp_PortType.ttcn . +ln -sf $SRC_BASE_DIR/deps/titan.TestPorts.SCTPasp/src/SCTPasp_PT.hh . +ln -sf $SRC_BASE_DIR/deps/titan.TestPorts.SCTPasp/src/SCTPasp_PT.cc . #Test cases diff --git a/bsc-nat/gen_links.sh b/bsc-nat/gen_links.sh index 77c9563f3..453d8caff 100755 --- a/bsc-nat/gen_links.sh +++ b/bsc-nat/gen_links.sh @@ -21,14 +21,13 @@ FILES="IPL4asp_Functions.ttcn IPL4asp_PT.cc IPL4asp_PT.hh IPL4asp_PortType.ttc gen_links $DIR $FILES # required by SCCP Emulation -DIR=../MTP3asp_CNL113337/src +DIR=$BASEDIR/titan.TestPorts.MTP3asp/src FILES="MTP3asp_PortType.ttcn MTP3asp_Types.ttcn" gen_links $DIR $FILES -DIR=../SCCP_CNL113341/src +DIR=$BASEDIR/titan.ProtocolEmulations.SCCP/src FILES="SCCP_Emulation.ttcn SCCP_EncDec.cc SCCP_Mapping.ttcnpp SCCP_Types.ttcn SCCPasp_Types.ttcn" gen_links $DIR $FILES -gen_link SCCP_Mapping.ttcnpp SCCP_Mapping.ttcn DIR=$BASEDIR/titan.ProtocolModules.BSSMAP_v11.2.0/src FILES="BSSAP_Types.ttcn" diff --git a/bsc-nat/regen_makefile.sh b/bsc-nat/regen_makefile.sh index 3d17cfe11..5c2536619 100755 --- a/bsc-nat/regen_makefile.sh +++ b/bsc-nat/regen_makefile.sh @@ -4,6 +4,6 @@ MAIN=IPA_Test.ttcn FILES="*.ttcn *.ttcnpp SCCP_EncDec.cc IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc RTP_EncDec.cc SDP_EncDec.cc *.c MGCP_CodecPort_CtrlFunctDef.cc" -export CPPFLAGS_TTCN3="-DIPA_EMULATION_SCCP -DIPA_EMULATION_MGCP" +export CPPFLAGS_TTCN3="-DIPA_EMULATION_SCCP -DIPA_EMULATION_MGCP -DUSE_MTP3_DISTRIBUTOR" ../regen-makefile.sh $MAIN $FILES diff --git a/bsc/gen_links.sh b/bsc/gen_links.sh index ee55c3e09..a6a1b0a6a 100755 --- a/bsc/gen_links.sh +++ b/bsc/gen_links.sh @@ -31,25 +31,19 @@ DIR=$BASEDIR/titan.TestPorts.SCTPasp/src FILES="SCTPasp_PT.cc SCTPasp_PT.hh SCTPasp_PortType.ttcn SCTPasp_Types.ttcn" gen_links $DIR $FILES -# required by M3UA Emulation -DIR=../MTP3asp_CNL113337/src -FILES="MTP3asp_PortType.ttcn MTP3asp_Types.ttcn" -gen_links $DIR $FILES - # required by SCCP Emulation -DIR=../M3UA_CNL113537/src +DIR=$BASEDIR/titan.ProtocolEmulations.M3UA/src FILES="M3UA_Emulation.ttcn" gen_links $DIR $FILES # required by SCCP Emulation -DIR=../MTP3asp_CNL113337/src +DIR=$BASEDIR/titan.TestPorts.MTP3asp/src FILES="MTP3asp_PortType.ttcn MTP3asp_Types.ttcn" gen_links $DIR $FILES -DIR=../SCCP_CNL113341/src +DIR=$BASEDIR/titan.ProtocolEmulations.SCCP/src FILES="SCCP_Emulation.ttcn SCCP_Mapping.ttcnpp SCCP_Types.ttcn SCCPasp_Types.ttcn" gen_links $DIR $FILES -gen_link SCCP_Mapping.ttcnpp SCCP_Mapping.ttcn DIR=$BASEDIR/titan.ProtocolModules.BSSMAP_v11.2.0/src FILES="BSSAP_Types.ttcn" diff --git a/bsc/regen_makefile.sh b/bsc/regen_makefile.sh index e9eb8084e..1e522523c 100755 --- a/bsc/regen_makefile.sh +++ b/bsc/regen_makefile.sh @@ -4,6 +4,6 @@ MAIN=BSC_Tests.ttcn FILES="*.ttcn *.ttcnpp IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc SCTPasp_PT.cc RTP_EncDec.cc SDP_EncDec.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc IuUP_EncDec.cc Native_FunctionDefs.cc TELNETasp_PT.cc *.c" -export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL -DIPA_EMULATION_MGCP" +export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL -DIPA_EMULATION_MGCP -DUSE_MTP3_DISTRIBUTOR" ../regen-makefile.sh $MAIN $FILES diff --git a/deps/Makefile b/deps/Makefile index d67e065df..c9c01ca19 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -37,10 +37,13 @@ ECLIPSEGIT2_REPOS= titan.ProtocolModules.GRE \ titan.ProtocolModules.LLC_v7.1.0 \ titan.ProtocolModules.MobileL3_v13.4.0 \ titan.ProtocolModules.NS_v7.3.0 \ - titan.ProtocolModules.SNDCP_v7.0.0 + titan.ProtocolModules.SNDCP_v7.0.0 \ + titan.ProtocolEmulations.M3UA OSMOGITHUB_REPOS= titan.TestPorts.SCTPasp \ - titan.TestPorts.UNIX_DOMAIN_SOCKETasp + titan.TestPorts.MTP3asp \ + titan.TestPorts.UNIX_DOMAIN_SOCKETasp \ + titan.ProtocolEmulations.SCCP ALL_REPOS=$(ECLIPSEGIT_REPOS) $(ECLIPSEGIT2_REPOS) $(OSMOGITHUB_REPOS) diff --git a/msc/gen_links.sh b/msc/gen_links.sh index a7144a69f..efb377039 100755 --- a/msc/gen_links.sh +++ b/msc/gen_links.sh @@ -32,19 +32,18 @@ FILES="SCTPasp_PT.cc SCTPasp_PT.hh SCTPasp_PortType.ttcn SCTPasp_Types.ttcn" gen_links $DIR $FILES # required by M3UA Emulation -DIR=../MTP3asp_CNL113337/src +DIR=$BASEDIR/titan.TestPorts.MTP3asp/src FILES="MTP3asp_PortType.ttcn MTP3asp_Types.ttcn" gen_links $DIR $FILES # required by SCCP Emulation -DIR=../M3UA_CNL113537/src +DIR=$BASEDIR/titan.ProtocolEmulations.M3UA/src FILES="M3UA_Emulation.ttcn" gen_links $DIR $FILES -DIR=../SCCP_CNL113341/src +DIR=$BASEDIR/titan.ProtocolEmulations.SCCP/src FILES="SCCP_Emulation.ttcn SCCP_EncDec.cc SCCP_Mapping.ttcnpp SCCP_Types.ttcn SCCPasp_Types.ttcn" gen_links $DIR $FILES -gen_link SCCP_Mapping.ttcnpp SCCP_Mapping.ttcn DIR=$BASEDIR/titan.ProtocolModules.BSSMAP_v11.2.0/src FILES="BSSAP_Types.ttcn" diff --git a/msc/regen_makefile.sh b/msc/regen_makefile.sh index 84b16f7ea..c3db4e747 100755 --- a/msc/regen_makefile.sh +++ b/msc/regen_makefile.sh @@ -2,6 +2,6 @@ FILES="*.ttcn *.ttcnpp SCCP_EncDec.cc SCTPasp_PT.cc TCCConversion.cc TCCInterface.cc UD_PT.cc MNCC_EncDec.cc IPL4asp_PT.cc IPL4asp_discovery.cc SDP_EncDec.cc RTP_EncDec.cc IPA_CodecPort_CtrlFunctDef.cc RTP_CodecPort_CtrlFunctDef.cc MGCP_CodecPort_CtrlFunctDef.cc TELNETasp_PT.cc Native_FunctionDefs.cc *.c" -export CPPFLAGS_TTCN3="-DIPA_EMULATION_MGCP -DIPA_EMULATION_GSUP" +export CPPFLAGS_TTCN3="-DIPA_EMULATION_MGCP -DIPA_EMULATION_GSUP -DUSE_MTP3_DISTRIBUTOR" ../regen-makefile.sh MSC_Tests.ttcn $FILES diff --git a/rmlinks.sh b/rmlinks.sh index 2b356a52f..cd04866de 100755 --- a/rmlinks.sh +++ b/rmlinks.sh @@ -1,2 +1,2 @@ #!/bin/sh -find . -type l -not -path "./bin/*" -not -path "./M3UA_CNL113537/*" -not -path "./SCCP_CNL113341/*" -exec rm \{\} \; +find . -type l -not -path "./bin/*" -exec rm \{\} \; diff --git a/selftest/gen_links.sh b/selftest/gen_links.sh index b5e86cb84..1b6171cad 100755 --- a/selftest/gen_links.sh +++ b/selftest/gen_links.sh @@ -22,14 +22,13 @@ FILES="IPL4asp_Functions.ttcn IPL4asp_PT.cc IPL4asp_PT.hh IPL4asp_PortType.ttc gen_links $DIR $FILES # required by IPA Emulation -DIR=../MTP3asp_CNL113337/src +DIR=$BASEDIR/titan.TestPorts.MTP3asp/src FILES="MTP3asp_PortType.ttcn MTP3asp_Types.ttcn" gen_links $DIR $FILES -DIR=../SCCP_CNL113341/src +DIR=$BASEDIR/titan.ProtocolEmulations.SCCP/src FILES="SCCP_Emulation.ttcn SCCP_Mapping.ttcnpp SCCP_Types.ttcn SCCPasp_Types.ttcn" gen_links $DIR $FILES -gen_link SCCP_Mapping.ttcnpp SCCP_Mapping.ttcn DIR=$BASEDIR/titan.ProtocolModules.BSSMAP_v11.2.0/src FILES="BSSAP_Types.ttcn" diff --git a/selftest/regen_makefile.sh b/selftest/regen_makefile.sh index d79b921be..2503fca05 100755 --- a/selftest/regen_makefile.sh +++ b/selftest/regen_makefile.sh @@ -4,6 +4,6 @@ MAIN=Selftest.ttcn FILES="*.ttcn *.ttcnpp IPA_CodecPort_CtrlFunctDef.cc IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc" -export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL" +export CPPFLAGS_TTCN3="-DIPA_EMULATION_RSL -DUSE_MTP3_DISTRIBUTOR" ../regen-makefile.sh $MAIN $FILES