From ac3598008390c5185f6b71feffe31cb7fa61b9a7 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 12 Apr 2017 12:13:44 +0200 Subject: [PATCH] initial chekin of code received by Ericsson on 20170410 --- COMMON/ProtocolModules_Common.tpd | 45 + COMMON/doc/documentation_note.txt | 13 + COMMON/src/General_Types.ttcn | 382 ++ COMMON/src/MobileDomainDefinitions.asn | 54 + COMMON/src/ProtocolModules_Common.grp | 39 + COMMON/src/UsefulTtcn3Types.ttcn | 99 + COMMON/src/XSD.ttcn | 339 + COMMON/src/general_typedefs.ttcn | 236 + .../http_www_w3_org_XML_1998_namespace.ttcn | 150 + 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 0 -> 143496 bytes .../doc/MTP3asp_CNL113337_PRI.pdf | Bin 0 -> 131894 bytes .../doc/MTP3asp_CNL113337_UG.pdf | Bin 0 -> 178705 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 | 6031 +++++++++++++++++ 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 +++ SCCP_Test/SCCP_Testcases.cfg | 54 + SCCP_Test/SCCP_Testcases.ttcn | 505 ++ SCTPasp_CNL113469/SCTPasp_CNL113469.tpd | 50 + .../doc/SCTPasp_CNL113469_PRI.doc | Bin 0 -> 64512 bytes .../doc/SCTPasp_CNL113469_UG.doc | Bin 0 -> 162816 bytes SCTPasp_CNL113469/doc/SCTPasp_FS.pdf | Bin 0 -> 167590 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/General_Types.ttcn | 1 + bin/M3UA_Emulation.ttcn | 1 + bin/M3UA_Types.ttcn | 1 + bin/MTP3asp_PortType.ttcn | 1 + bin/MTP3asp_Types.ttcn | 1 + bin/Makefile | 190 + bin/SCCP_Emulation.ttcn | 1 + bin/SCCP_Mapping.ttcn | 1 + bin/SCCP_Mapping.ttcnpp | 1 + bin/SCCP_Testcases.cfg | 1 + bin/SCCP_Testcases.ttcn | 1 + bin/SCCP_Types.ttcn | 1 + bin/SCCPasp_Types.ttcn | 1 + bin/SCTPasp_PT.cc | 1 + bin/SCTPasp_PT.hh | 1 + bin/SCTPasp_PortType.ttcn | 1 + bin/SCTPasp_Types.ttcn | 1 + bin/install.script | 34 + 94 files changed, 28239 insertions(+) create mode 100644 COMMON/ProtocolModules_Common.tpd create mode 100644 COMMON/doc/documentation_note.txt create mode 100644 COMMON/src/General_Types.ttcn create mode 100644 COMMON/src/MobileDomainDefinitions.asn create mode 100644 COMMON/src/ProtocolModules_Common.grp create mode 100644 COMMON/src/UsefulTtcn3Types.ttcn create mode 100644 COMMON/src/XSD.ttcn create mode 100644 COMMON/src/general_typedefs.ttcn create mode 100644 COMMON/src/http_www_w3_org_XML_1998_namespace.ttcn create mode 100644 M3UA_CNL113536/M3UA_CNL113536.tpd create mode 100644 M3UA_CNL113536/doc/documentation_note.txt create mode 100644 M3UA_CNL113536/src/M3UA_Types.ttcn create mode 120000 M3UA_CNL113537/demo/Abstract_Socket.cc create mode 120000 M3UA_CNL113537/demo/Abstract_Socket.hh create mode 120000 M3UA_CNL113537/demo/BICC_EncDec.cc create mode 120000 M3UA_CNL113537/demo/BICC_Types.ttcn create mode 120000 M3UA_CNL113537/demo/General_Types.ttcn create mode 120000 M3UA_CNL113537/demo/M3UA_Emulation.ttcn create mode 100644 M3UA_CNL113537/demo/M3UA_Emulation_Test.ttcn create mode 120000 M3UA_CNL113537/demo/M3UA_Types.ttcn create mode 120000 M3UA_CNL113537/demo/MTP3asp_EncDec.cc create mode 120000 M3UA_CNL113537/demo/MTP3asp_Types.ttcn create mode 100644 M3UA_CNL113537/demo/Makefile create mode 120000 M3UA_CNL113537/demo/SCTPasp_PT.cc create mode 120000 M3UA_CNL113537/demo/SCTPasp_PT.hh create mode 120000 M3UA_CNL113537/demo/SCTPasp_PortType.ttcn create mode 120000 M3UA_CNL113537/demo/SCTPasp_Types.ttcn create mode 100644 M3UA_CNL113537/demo/m3ua_emu.cfg create mode 100644 M3UA_CNL113537/src/M3UA_Emulation.ttcn create mode 100644 MTP3asp_CNL113337/MTP3asp_CNL113337.tpd create mode 100644 MTP3asp_CNL113337/demo/MTP3asp_PT.cc create mode 100644 MTP3asp_CNL113337/demo/MTP3asp_PT.hh create mode 100644 MTP3asp_CNL113337/demo/MTP3asp_PortType.ttcn create mode 100644 MTP3asp_CNL113337/demo/MTP3asp_Types.ttcn create mode 100644 MTP3asp_CNL113337/demo/Makefile create mode 100644 MTP3asp_CNL113337/demo/mtp3test.ttcn create mode 100644 MTP3asp_CNL113337/demo/mtp3test_MTP3_ansi2.cfg create mode 100644 MTP3asp_CNL113337/doc/MTP3asp_CNL113337_FS.pdf create mode 100644 MTP3asp_CNL113337/doc/MTP3asp_CNL113337_PRI.pdf create mode 100644 MTP3asp_CNL113337/doc/MTP3asp_CNL113337_UG.pdf create mode 100644 MTP3asp_CNL113337/src/MTP3asp_EncDec.cc create mode 100644 MTP3asp_CNL113337/src/MTP3asp_PT.cc create mode 100644 MTP3asp_CNL113337/src/MTP3asp_PT.hh create mode 100644 MTP3asp_CNL113337/src/MTP3asp_PortType.ttcn create mode 100644 MTP3asp_CNL113337/src/MTP3asp_Types.ttcn create mode 100644 SCCP_CNL113341/SCCP_CNL113341.tpd create mode 120000 SCCP_CNL113341/demo/General_Types.ttcn create mode 120000 SCCP_CNL113341/demo/MTP3asp_PT.cc create mode 120000 SCCP_CNL113341/demo/MTP3asp_PT.hh create mode 120000 SCCP_CNL113341/demo/MTP3asp_PortType.ttcn create mode 120000 SCCP_CNL113341/demo/MTP3asp_Types.ttcn create mode 100644 SCCP_CNL113341/demo/Makefile.ini create mode 100644 SCCP_CNL113341/demo/N_UNITDATAtest_600longdata_xudt_ansi_log create mode 120000 SCCP_CNL113341/demo/SCCP_Emulation.ttcn create mode 120000 SCCP_CNL113341/demo/SCCP_Mapping.ttcnpp create mode 100644 SCCP_CNL113341/demo/SCCP_Testcases.cfg create mode 100644 SCCP_CNL113341/demo/SCCP_Testcases.ttcn create mode 120000 SCCP_CNL113341/demo/SCCP_Types.ttcn create mode 100644 SCCP_CNL113341/demo/SCCP_selftest.cfg create mode 100644 SCCP_CNL113341/demo/SCCP_selftest.ttcn create mode 120000 SCCP_CNL113341/demo/SCCPasp_Types.ttcn create mode 100644 SCCP_CNL113341/src/SCCP_Emulation.ttcn create mode 100644 SCCP_CNL113341/src/SCCP_EncDec.cc create mode 100644 SCCP_CNL113341/src/SCCP_Mapping.ttcnpp create mode 100644 SCCP_CNL113341/src/SCCP_Types.ttcn create mode 100644 SCCP_CNL113341/src/SCCPasp_Types.ttcn create mode 100644 SCCP_Test/SCCP_Testcases.cfg create mode 100644 SCCP_Test/SCCP_Testcases.ttcn create mode 100644 SCTPasp_CNL113469/SCTPasp_CNL113469.tpd create mode 100644 SCTPasp_CNL113469/doc/SCTPasp_CNL113469_PRI.doc create mode 100644 SCTPasp_CNL113469/doc/SCTPasp_CNL113469_UG.doc create mode 100644 SCTPasp_CNL113469/doc/SCTPasp_FS.pdf create mode 100644 SCTPasp_CNL113469/src/SCTPasp_PT.cc create mode 100644 SCTPasp_CNL113469/src/SCTPasp_PT.hh create mode 100644 SCTPasp_CNL113469/src/SCTPasp_PortType.ttcn create mode 100644 SCTPasp_CNL113469/src/SCTPasp_Types.ttcn create mode 120000 bin/General_Types.ttcn create mode 120000 bin/M3UA_Emulation.ttcn create mode 120000 bin/M3UA_Types.ttcn create mode 120000 bin/MTP3asp_PortType.ttcn create mode 120000 bin/MTP3asp_Types.ttcn create mode 100644 bin/Makefile create mode 120000 bin/SCCP_Emulation.ttcn create mode 120000 bin/SCCP_Mapping.ttcn create mode 120000 bin/SCCP_Mapping.ttcnpp create mode 120000 bin/SCCP_Testcases.cfg create mode 120000 bin/SCCP_Testcases.ttcn create mode 120000 bin/SCCP_Types.ttcn create mode 120000 bin/SCCPasp_Types.ttcn create mode 120000 bin/SCTPasp_PT.cc create mode 120000 bin/SCTPasp_PT.hh create mode 120000 bin/SCTPasp_PortType.ttcn create mode 120000 bin/SCTPasp_Types.ttcn create mode 100755 bin/install.script diff --git a/COMMON/ProtocolModules_Common.tpd b/COMMON/ProtocolModules_Common.tpd new file mode 100644 index 000000000..f861d7b4a --- /dev/null +++ b/COMMON/ProtocolModules_Common.tpd @@ -0,0 +1,45 @@ + + + + ProtocolModules_Common + + + + + + + + + Default + + + + + true + true + true + bin/ProtocolModules_Common + true + Level3-Creatingobjectfileswithdependencyupdate + + + bin + + + + + diff --git a/COMMON/doc/documentation_note.txt b/COMMON/doc/documentation_note.txt new file mode 100644 index 000000000..615d81888 --- /dev/null +++ b/COMMON/doc/documentation_note.txt @@ -0,0 +1,13 @@ +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 R9A revision of the product +can be found here: +http://document.internal.ericsson.com/Download?DocNo=1095-CNL113368&Rev=K&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-CNL113368&Rev=HIGHEST&Lang=EN&Status=FREE&PRev=Y + diff --git a/COMMON/src/General_Types.ttcn b/COMMON/src/General_Types.ttcn new file mode 100644 index 000000000..bd2dc54e7 --- /dev/null +++ b/COMMON/src/General_Types.ttcn @@ -0,0 +1,382 @@ +/****************************************************************************** +* Copyright (c) 2004, 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: +* Zoltan Jasz - initial implementation and initial documentation +* Abhishek Gupta +* Attila Balasko +* Endre Kulcsar +* Gabor Bettesch +* Gabor Szalai +* Janos Kovesdi +* Sandor Palugyai +* Tibor Csondes +******************************************************************************/ +// +// File: General_Types.ttcn +// Rev: R9A +// Prodnr: CNL 113 368 +// Reference: + +module General_Types +{ + +group SimpleNativeTypes { + + //**************************************************** + // Bitstrings + //**************************************************** + + //bitstring with fixed length + type bitstring BIT1n length(1) with { variant "" }; + type bitstring BIT2n length(2) with { variant "" }; + type bitstring BIT3n length(3) with { variant "" }; + type bitstring BIT4n length(4) with { variant "" }; + type bitstring BIT5n length(5) with { variant "" }; + type bitstring BIT6n length(6) with { variant "" }; + type bitstring BIT7n length(7) with { variant "" }; + type bitstring BIT8n length(8) with { variant "" }; + type bitstring BIT9n length(9) with { variant "" }; + type bitstring BIT12n length(12) with { variant "" }; + type bitstring BIT14n length(14) with { variant "" }; + type bitstring BIT15n length(15) with { variant "" }; + type bitstring BIT16n length(16) with { variant "" }; + type bitstring BIT56n length(56) with { variant "" }; + + //bitstring with length interval + type bitstring BIT14_24n length(14..24) with { variant "" }; + + //bitstring to be padded with fixed length + type bitstring BIT1np length(1) with { variant "" }; + type bitstring BIT2np length(2) with { variant "" }; + type bitstring BIT3np length(3) with { variant "" }; + type bitstring BIT4np length(4) with { variant "" }; + type bitstring BIT5np length(5) with { variant "" }; + type bitstring BIT6np length(6) with { variant "" }; + type bitstring BIT7np length(7) with { variant "" }; + type bitstring BIT15np length(15) with { variant "" }; + + //bitstring with fixed length + type bitstring BIT1 length(1) with { variant "FIELDLENGTH(1)" }; + type bitstring BIT2 length(2) with { variant "FIELDLENGTH(2)" }; + type bitstring BIT3 length(3) with { variant "FIELDLENGTH(3)" }; + type bitstring BIT4 length(4) with { variant "FIELDLENGTH(4)" }; + type bitstring BIT5 length(5) with { variant "FIELDLENGTH(5)" }; + type bitstring BIT6 length(6) with { variant "FIELDLENGTH(6)" }; + type bitstring BIT7 length(7) with { variant "FIELDLENGTH(7)" }; + type bitstring BIT8 length(8) with { variant "FIELDLENGTH(8)" }; + type bitstring BIT9 length(9) with { variant "FIELDLENGTH(9)" }; + type bitstring BIT10 length(10) with { variant "FIELDLENGTH(10)" }; + type bitstring BIT11 length(11) with { variant "FIELDLENGTH(11)" }; + type bitstring BIT12 length(12) with { variant "FIELDLENGTH(12)" }; + type bitstring BIT14 length(14) with { variant "FIELDLENGTH(14)" }; + type bitstring BIT15 length(15) with { variant "FIELDLENGTH(15)" }; + type bitstring BIT16 length(16) with { variant "FIELDLENGTH(16)" }; + type bitstring BIT24 length(24) with { variant "FIELDLENGTH(24)" }; + type bitstring BIT31 length(31) with { variant "FIELDLENGTH(31)" }; + type bitstring BIT56 length(56) with { variant "FIELDLENGTH(56)" }; + + type record of bitstring Bitstrings with { variant "" }; + type Bitstrings BitstringList; + type set of bitstring BitstringSet with { variant "" }; + + //**************************************************** + // Octetstrings + //**************************************************** + + //octetstring with fixed length + type octetstring OCT0n length(0) with { variant "" }; + type octetstring OCT1n length(1) with { variant "" }; + type octetstring OCT2n length(2) with { variant "" }; + type octetstring OCT3n length(3) with { variant "" }; + type octetstring OCT4n length(4) with { variant "" }; + type octetstring OCT5n length(5) with { variant "" }; + type octetstring OCT6n length(6) with { variant "" }; + type octetstring OCT7n length(7) with { variant "" }; + type octetstring OCT8n length(8) with { variant "" }; + type octetstring OCT9n length(9) with { variant "" }; + type octetstring OCT10n length(10) with { variant "" }; + type octetstring OCT11n length(11) with { variant "" }; + type octetstring OCT12n length(12) with { variant "" }; + type octetstring OCT13n length(13) with { variant "" }; + type octetstring OCT14n length(14) with { variant "" }; + type octetstring OCT15n length(15) with { variant "" }; + type octetstring OCT16n length(16) with { variant "" }; + type octetstring OCT17n length(17) with { variant "" }; + type octetstring OCT18n length(18) with { variant "" }; + type octetstring OCT19n length(19) with { variant "" }; + type octetstring OCT20n length(20) with { variant "" }; + type octetstring OCT28n length(28) with { variant "" }; + type octetstring OCT32n length(32) with { variant "" }; + type octetstring OCT34n length(34) with { variant "" }; + type octetstring OCT46n length(46) with { variant "" }; + type octetstring OCT50n length(50) with { variant "" }; + type octetstring OCT69n length(69) with { variant "" }; + type octetstring OCT100n length(100) with { variant "" }; + type octetstring OCT128n length(128) with { variant "" }; + type octetstring OCT500n length(500) with { variant "" }; + type octetstring OCTNn with { variant "" }; + + //octetstring with length interval + type octetstring OCT1_3n length(1..3) with { variant "" }; + type octetstring OCT1_4n length(1..4) with { variant "" }; + type octetstring OCT1_5n length(1..5) with { variant "" }; + type octetstring OCT1_6n length(1..6) with { variant "" }; + type octetstring OCT1_7n length(1..7) with { variant "" }; + type octetstring OCT1_8n length(1..8) with { variant "" }; + type octetstring OCT1_12n length(1..12) with { variant "" }; + type octetstring OCT1_15n length(1..15) with { variant "" }; + type octetstring OCT1_16n length(1..16) with { variant "" }; + type octetstring OCT1_18n length(1..18) with { variant "" }; + type octetstring OCT1_20n length(1..20) with { variant "" }; + type octetstring OCT1_24n length(1..24) with { variant "" }; + type octetstring OCT1_32n length(1..32) with { variant "" }; + type octetstring OCT1_34n length(1..34) with { variant "" }; + type octetstring OCT1_46n length(1..46) with { variant "" }; + type octetstring OCT1_50n length(1..50) with { variant "" }; + type octetstring OCT1_112n length(1..112) with { variant "" }; + type octetstring OCT1_127n length(1..127) with { variant "" }; + type octetstring OCT1_128n length(1..128) with { variant "" }; + type octetstring OCT1_172n length(1..172) with { variant "" }; + type octetstring OCT3_5n length(3..5) with { variant "" }; + type octetstring OCT3_7n length(3..7) with { variant "" }; + type octetstring OCT3_8n length(3..8) with { variant "" }; + type octetstring OCT3_14n length(3..14) with { variant "" }; + type octetstring OCT3_17n length(3..17) with { variant "" }; + type octetstring OCT4_8n length(4..8) with { variant "" }; + + type record of octetstring Octetstrings with { variant "" }; + type Octetstrings OctetstringList; + type set of octetstring OctetstringSet with { variant "" }; + + //**************************************************** + // Charstrings + //**************************************************** + + //charstring with fixed length + type charstring CHAR4 length (4); + + type record of charstring Charstrings with { variant "" }; + type Charstrings CharstringList; + type set of charstring CharstringSet with { variant "" }; + + //**************************************************** + // Hexstrings + //**************************************************** + + //hexstring with fixed length + type hexstring HEX4n length(4) with { variant "" }; + type hexstring HEX6n length(6) with { variant "" }; + type hexstring HEX8n length(8) with { variant "" }; + type hexstring HEX15n length(15) with { variant "" }; + type hexstring HEX16n length(16) with { variant "" }; + type hexstring HEX24n length(24) with { variant "" }; + + //hexstring with length interval + type hexstring HEX0_18n length(0..18) with { variant "" }; + type hexstring HEX1_20n length(1..20) with { variant "" }; + type hexstring HEX1_34n length(1..34) with { variant "" }; + + type record of hexstring Hexstrings with { variant "" }; + type Hexstrings HexstringList; + type set of hexstring HexstringSet with { variant "" }; + + //**************************************************** + // Integers + //**************************************************** + + //integer with fixed bit number + type integer INT3nb (0..7) with { variant "" }; + type integer INT4nb (0..15) with { variant "" }; + type integer INT5nb (0..31) with { variant "" }; + type integer INT8nb (0..255) with { variant "" }; + + //integer with fixed bit number and with padding + type integer INT2nbp (0..3) with { variant "" }; + type integer INT1nbp (0..1) with { variant "" }; + type integer INT3nbp (0..7) with { variant "" }; + type integer INT5nbp (0..31) with { variant "" }; + type integer INT9nbp (0..511) with { variant "" }; + type integer INT13nbp (0..8191) with { variant "" }; + type integer INT15nbp (0..32767) with { variant "" }; + + //**************************************************** + // Structures + //**************************************************** + + //integer record + type record of integer Integers with { variant "" }; + type Integers IntegerList; + type record of Integers Integer_array with { variant "" }; + type set of integer IntegerSet with { variant "" }; + + //**************************************************** + // Floats + //**************************************************** + + type record of float Floats with { variant "" }; + type Floats FloatList; + type set of float FloatSet with { variant "" }; + + //**************************************************** + // Universal Charstrings + //**************************************************** + + type record of universal charstring UniversalCharstrings with { variant "" }; + type UniversalCharstrings UniversalCharstringList; + type set of universal charstring UniversalCharstringSet with { variant "" }; + + //**************************************************** + // Booleans + //**************************************************** + + type record of boolean Booleans with { variant "" }; + type Booleans BooleanList; + type set of boolean BooleanSet with { variant "" }; + + //**************************************************** + // Verdicttypes + //**************************************************** + + type record of verdicttype Verdicttypes with { variant "" }; + type Verdicttypes VerdicttypeList; + type set of verdicttype VerdicttypeSet with { variant "" }; + + //**************************************************** + // Anytypes + //**************************************************** + + type record of anytype Anytypes with { variant "" }; + type Anytypes AnytypeList; + type set of anytype AnytypeSet with { variant "" }; + +} // end group NativeTypes + +//**************************************************** +//**************************************************** +// RAW Encoded Types +//**************************************************** +//**************************************************** + +group SimpleRAWEncodedTypes { + + //**************************************************** + // Bitstrings + //**************************************************** + + //bitstring with fixed length + type bitstring BIT6_BO_LAST length (6) with {variant "BYTEORDER(last)"}; + type bitstring BIT16_BO_LAST length (16) with {variant "BYTEORDER(last)"}; + type bitstring BIT32_BO_LAST length (32) with {variant "BYTEORDER(last)"}; + + //**************************************************** + // Octetstrings + //**************************************************** + //octetstring with fixed length + type octetstring Dummy length(0) with { variant "FIELDLENGTH(0)" }; + type octetstring OCT0 length(0) with { variant "FIELDLENGTH(0)" }; + type octetstring OCT1 length(1) with { variant "FIELDLENGTH(1)" }; + type octetstring OCT2 length(2) with { variant "FIELDLENGTH(2)" }; + type octetstring OCT3 length(3) with { variant "FIELDLENGTH(3)" }; + type octetstring OCT4 length(4) with { variant "FIELDLENGTH(4)" }; + type octetstring OCT5 length(5) with { variant "FIELDLENGTH(5)" }; + type octetstring OCT6 length(6) with { variant "FIELDLENGTH(6)" }; + type octetstring OCT7 length(7) with { variant "FIELDLENGTH(7)" }; + type octetstring OCT8 length(8) with { variant "FIELDLENGTH(8)" }; + type octetstring OCT9 length(9) with { variant "FIELDLENGTH(9)" }; + type octetstring OCT10 length(10) with { variant "FIELDLENGTH(10)" }; + type octetstring OCT11 length(11) with { variant "FIELDLENGTH(11)" }; + type octetstring OCT12 length(12) with { variant "FIELDLENGTH(12)" }; + type octetstring OCT13 length(13) with { variant "FIELDLENGTH(13)" }; + type octetstring OCT14 length(14) with { variant "FIELDLENGTH(14)" }; + type octetstring OCT15 length(15) with { variant "FIELDLENGTH(15)" }; + type octetstring OCT16 length(16) with { variant "FIELDLENGTH(16)" }; + type octetstring OCT17 length(17) with { variant "FIELDLENGTH(17)" }; + type octetstring OCT18 length(18) with { variant "FIELDLENGTH(18)" }; + type octetstring OCT19 length(19) with { variant "FIELDLENGTH(19)" }; + type octetstring OCT20 length(20) with { variant "FIELDLENGTH(20)" }; + type octetstring OCT32 length(32) with { variant "FIELDLENGTH(32)" }; + type octetstring OCT34 length(34) with { variant "FIELDLENGTH(34)" }; + type octetstring OCT46 length(46) with { variant "FIELDLENGTH(46)" }; + + //octetstring with length interval + type octetstring OCT1_260 length(1..260) with { variant "" }; + type octetstring OCT1_8 length(1..8) with { variant "" }; + type octetstring OCT1_12 length(1..12) with { variant "" }; + type octetstring OCT1_32 length(1..32) with { variant "" }; + type octetstring OCT1_50 length(1..50) with { variant "" }; + type octetstring OCT3_8 length(3..8) with { variant "" }; + + type octetstring OCTN with { variant "" }; + + //**************************************************** + // Hexstrings + //**************************************************** + + //hexstring with fixed length + type hexstring HEX1 length(1) with {variant "FIELDLENGTH(1)"}; + + //hexstring with length interval + type hexstring HEX0_16 length(0..16) with { variant "" }; + type hexstring HEX5_16 length(5..16) with { variant "" }; + type hexstring HEX1_32 length(1..32) with { variant "" }; + + + //**************************************************** + // Integers + //**************************************************** + + //integer with fixed octet number + type integer INT1 (0..255) with { variant "FIELDLENGTH(8)" }; + type integer LIN1 (0..255) with { variant "FIELDLENGTH(8)" }; + type integer LIN2 (0..65535) with { variant "FIELDLENGTH(16)" }; + type integer LIN2_BO_LAST (0..65535) with { variant "FIELDLENGTH(16), COMP(nosign), BYTEORDER(last)" }; + type integer LIN3_BO_LAST (0..16777215) with { variant "FIELDLENGTH(24), COMP(nosign), BYTEORDER(last)" }; + type integer LIN4_BO_LAST (0..4294967295) with { variant "FIELDLENGTH(32), COMP(nosign), BYTEORDER(last)" }; + + //integer with fixed bit number + type integer INT1b (0..1) with { variant "FIELDLENGTH(1)" }; + type integer INT2b (0..3) with { variant "FIELDLENGTH(2)" }; + type integer INT3b (0..7) with { variant "FIELDLENGTH(3)" }; + type integer INT4b (0..15) with { variant "FIELDLENGTH(4)" }; + type integer INT5b (0..31) with { variant "FIELDLENGTH(5)" }; + type integer INT6b (0..63) with { variant "FIELDLENGTH(6)" }; + type integer INT7b (0..127) with { variant "FIELDLENGTH(7)" }; + type integer INT11b_BO_LAST ( 0 .. 2047 ) with { variant "FIELDLENGTH(11), COMP(nosign), BYTEORDER(last)" }; + type integer INT12b_BO_LAST ( 0 .. 4095 ) with { variant "FIELDLENGTH(12), COMP(nosign), BYTEORDER(last)" }; + type integer INT13b_BO_LAST ( 0 .. 8191 ) with { variant "FIELDLENGTH(13), COMP(nosign), BYTEORDER(last)" }; + type integer INT14b_BO_LAST ( 0 .. 16383 ) with { variant "FIELDLENGTH(14), COMP(nosign), BYTEORDER(last)" }; + type integer INT18b_BO_LAST ( 0 .. 262143 ) with { variant "FIELDLENGTH(18), COMP(nosign), BYTEORDER(last)" }; + type integer INT20b_BO_LAST ( 0 .. 1048575 ) with { variant "FIELDLENGTH(20), COMP(nosign), BYTEORDER(last)" }; + type integer INT31b_BO_LAST ( 0 .. 2147483647 ) with { variant "FIELDLENGTH(31), COMP(nosign), BYTEORDER(last)" }; + +} // end group SimpleRAWEncodedTypes + +group ComponentTypes { + type component Dummy_comptype {} + type component Dummy_CT {} +} // end group ComponentTypes + +group CompositeTypes { + type enumerated Protocols + { mtp3, sccp, isup, bicc, qaal2, gcp, bssap, bssmap, ranap, dtap } + + type record of OCT1 OCT1List with { variant "" }; + type record of OCT2 OCT2List with { variant "" }; + type record of OCT3 OCT3List with { variant "" }; + type record of OCT4 OCT4List with { variant "" }; + type record of OCT5 OCT5List with { variant "" }; + type record of OCT6 OCT6List with { variant "" }; + type record of OCT7 OCT7List with { variant "" }; + + type record of Dummy_comptype ListOfDummy_comptype with { variant "" }; + type record of Dummy_CT ListOfDummy_CT with { variant "" }; + type record of Protocols ProtocolList with { variant "" }; +} // end group CompositeTypes + +} with { encode "RAW" } /* End of module General_Types */ + diff --git a/COMMON/src/MobileDomainDefinitions.asn b/COMMON/src/MobileDomainDefinitions.asn new file mode 100644 index 000000000..0685484c9 --- /dev/null +++ b/COMMON/src/MobileDomainDefinitions.asn @@ -0,0 +1,54 @@ +-- ******************************************************************************* +-- * Copyright (c) 2004, 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: +-- * Zoltan Jasz - initial implementation and initial documentation +-- * Abhishek Gupta +-- * Attila Balasko +-- * Endre Kulcsar +-- * Gabor Bettesch +-- * Gabor Szalai +-- * Janos Kovesdi +-- * Sandor Palugyai +-- * Tibor Csondes +-- ******************************************************************************* +-- +-- File: MobileDomainDefinitions.asn +-- Rev: R9A +-- Prodnr: CNL 113 368 +-- Reference: + +MobileDomainDefinitions {ccitt (0) identified-organization (4) etsi (0) + mobileDomain (0) mobileDomainDefinitions (0) version1 (1)} + +DEFINITIONS ::= +BEGIN + +IMPORTS ; + +-- Mobile DomainId + +mobileDomainId OBJECT IDENTIFIER ::= {ccitt (0) identified-organization (4) etsi (0) mobileDomain (0)} + +-- Mobile Subdomains + +gsm-NetworkId OBJECT IDENTIFIER ::= {mobileDomainId gsm-Network (1)} +gsm-AccessId OBJECT IDENTIFIER ::= {mobileDomainId gsm-Access (2)} +gsm-OperationAndMaintenanceId OBJECT IDENTIFIER ::= {mobileDomainId gsm-Operation-Maintenance (3)} +gsm-MessagingId OBJECT IDENTIFIER ::= {mobileDomainId gsm-Messaging (4)} + +-- Common Component Ids for structuring Mobile Subdomains + +CommonComponentId ::= INTEGER (0..9) + +ac-Id CommonComponentId ::= 0 +as-Id CommonComponentId ::= 1 +ase-Id CommonComponentId ::= 2 +moduleId CommonComponentId ::= 3 +er-Id CommonComponentId ::= 4 + +END -- MobileDomainDefinitions diff --git a/COMMON/src/ProtocolModules_Common.grp b/COMMON/src/ProtocolModules_Common.grp new file mode 100644 index 000000000..90214d52c --- /dev/null +++ b/COMMON/src/ProtocolModules_Common.grp @@ -0,0 +1,39 @@ + + + + + + + + + + + + diff --git a/COMMON/src/UsefulTtcn3Types.ttcn b/COMMON/src/UsefulTtcn3Types.ttcn new file mode 100644 index 000000000..911e1a5ad --- /dev/null +++ b/COMMON/src/UsefulTtcn3Types.ttcn @@ -0,0 +1,99 @@ +/****************************************************************************** +* Copyright (c) 2004, 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: +* Zoltan Jasz - initial implementation and initial documentation +* Abhishek Gupta +* Attila Balasko +* Endre Kulcsar +* Gabor Bettesch +* Gabor Szalai +* Janos Kovesdi +* Sandor Palugyai +* Tibor Csondes +******************************************************************************/ +// +// File: UsefulTtcn3Types.ttcn +// Rev: R9A +// Prodnr: CNL 113 368 +// +//////////////////////////////////////////////////////////////////////////////// +module UsefulTtcn3Types { + + + type integer byte (-128 .. 127) with { variant "/* 8 bit */" }; + + type integer unsignedbyte (0 .. 255) with { variant "/*unsigned 8 bit*/" }; + + type integer short (-32768 .. 32767) with { variant "/*16 bit*/" }; + + type integer unsignedshort (0 .. 65535) with { variant "/*unsigned 16 bit*/" }; + + type integer long (-2147483648 .. 2147483647) with { variant "/*32 bit*/" }; + + type integer unsignedlong (0 .. 4294967295) with { variant "/*unsigned 32 bit*/" }; + + type integer longlong /* ( -9223372036854775808 .. 9223372036854775807 ) */ with { variant "/*64 bit*/" }; + + type integer unsignedlonglong /* ( 0 .. 18446744073709551615 ) */ with { variant "/*unsigned 64 bit*/" }; + + type float IEEE754float with { variant "/*IEEE754 float*/" }; + + type float IEEE754double with { variant "/*IEEE754 double*/" }; + + type float IEEE754extfloat with { variant "/*IEEE754 extended float*/" }; + + type float IEEE754extdouble with { variant "/*IEEE754 extended double*/" }; + + type universal charstring utf8string with { variant "/*UTF-8*/" }; + + type universal charstring bmpstring ( char ( 0,0,0,0 ) .. char ( 0,0,255,255) ) with { variant "/*UCS-2*/" }; + + type universal charstring utf16string ( char ( 0,0,0,0 ) .. char ( 0,16,255,255) ) with { variant "/*UTF-16*/" }; + + type universal charstring iso8859string ( char ( 0,0,0,0 ) .. char ( 0,0,0,255) ) with { variant "/*8 bit*/" }; + + type record IDLfixed + { + unsignedshort digits, + short scale, + charstring value_ + } + with { + variant "/*IDL:fixed FORMAL/01-12-01 v.2.6*/"; + }; + + /* + type charstring char length (1); + + NOTE 1: The name of this useful type is the same as the TTCN-3 keyword used to denote universal + charstring values in the quadraple form. In general it is disallowed to use TTCN-3 keywords as + identifiers. The "char" useful type is a solitary exception and allowed only for backward compatibility + with previous versions of the TTCN-3 standard. (except Titan doesn't) + + NOTE 2: The special string "8 bit" defined in clause 28.2.3 may be used with this type to specify a given encoding + for its values. Also, other properties of the base type can be changed by using attribute mechanisms. + */ + + type universal charstring uchar length (1); + + /* + NOTE: Special strings defined in clause 28.2.3 except "8 bit" may be used with this type to specify a given + encoding for its values. Also, other properties of the base type can be changed by using attribute + mechanisms. + */ + + type bitstring bit length (1); + + type hexstring hex length (1); + + type octetstring octet length (1); + +} +with { +encode "XML"; +} diff --git a/COMMON/src/XSD.ttcn b/COMMON/src/XSD.ttcn new file mode 100644 index 000000000..64157a048 --- /dev/null +++ b/COMMON/src/XSD.ttcn @@ -0,0 +1,339 @@ +/****************************************************************************** +* Copyright (c) 2004, 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: +* Zoltan Jasz - initial implementation and initial documentation +* Abhishek Gupta +* Attila Balasko +* Endre Kulcsar +* Gabor Bettesch +* Gabor Szalai +* Janos Kovesdi +* Sandor Palugyai +* Tibor Csondes +******************************************************************************/ +// +// File: XSD.ttcn +// Rev: R9A +// Prodnr: CNL 113 368 +// +//////////////////////////////////////////////////////////////////////////////// +module XSD { + +import from UsefulTtcn3Types all; + +//These constants are used in the XSD date/time type definitions +const charstring + dash := "-", + cln := ":", + year := "(0(0(0[1-9]|[1-9][0-9])|[1-9][0-9][0-9])|[1-9][0-9][0-9][0-9])", + yearExpansion := "(-([1-9][0-9]#(0,))#(,1))#(,1)", + month := "(0[1-9]|1[0-2])", + dayOfMonth := "(0[1-9]|[12][0-9]|3[01])", + hour := "([01][0-9]|2[0-3])", + minute := "([0-5][0-9])", + second := "([0-5][0-9])", + sFraction := "(.[0-9]#(1,))#(,1)", + endOfDayExt := "24:00:00(.0#(1,))#(,1)", + nums := "[0-9]#(1,)", + ZorTimeZoneExt := "(Z|[+-]((0[0-9]|1[0-3]):[0-5][0-9]|14:00))#(,1)", + durTime := "(T[0-9]#(1,)"& + "(H([0-9]#(1,)(M([0-9]#(1,)(S|.[0-9]#(1,)S))#(,1)|.[0-9]#(1,)S|S))#(,1)|"& + "M([0-9]#(1,)(S|.[0-9]#(1,)S)|.[0-9]#(1,)M)#(,1)|"& + "S|"& + ".[0-9]#(1,)S))" + +//anySimpleType + +type XMLCompatibleString AnySimpleType +with { +variant "XSD:anySimpleType"; +}; + +//anyType; + +type record AnyType +{ + record of String attr, + record of String elem_list +} +with { +variant "XSD:anyType"; +variant (attr) "anyAttributes"; +variant (elem_list) "anyElement"; +}; +// String types + +type XMLCompatibleString String +with { +variant "XSD:string"; +}; + +type XMLStringWithNoCRLFHT NormalizedString +with { +variant "XSD:normalizedString"; +}; + +type NormalizedString Token +with { +variant "XSD:token"; +}; + +type XMLStringWithNoWhitespace Name +with { +variant "XSD:Name"; +}; + +type XMLStringWithNoWhitespace NMTOKEN +with { +variant "XSD:NMTOKEN"; +}; + +type Name NCName +with { +variant "XSD:NCName"; +}; + +type NCName ID +with { +variant "XSD:ID"; +}; + +type NCName IDREF +with { +variant "XSD:IDREF"; +}; + +type NCName ENTITY +with { +variant "XSD:ENTITY"; +}; + +type octetstring HexBinary +with { +variant "XSD:hexBinary"; +}; + +type octetstring Base64Binary +with { +variant "XSD:base64Binary"; +}; + +type XMLStringWithNoCRLFHT AnyURI +with { +variant "XSD:anyURI"; +}; + +type charstring Language (pattern "[a-zA-Z]#(1,8)(-\w#(1,8))#(0,)") +with { +variant "XSD:language"; +}; +// Integer types + +type integer Integer +with { +variant "XSD:integer"; +}; + +type integer PositiveInteger (1 .. infinity) +with { +variant "XSD:positiveInteger"; +}; + +type integer NonPositiveInteger (-infinity .. 0) +with { +variant "XSD:nonPositiveInteger"; +}; + +type integer NegativeInteger (-infinity .. -1) +with { +variant "XSD:negativeInteger"; +}; + +type integer NonNegativeInteger (0 .. infinity) +with { +variant "XSD:nonNegativeInteger"; +}; + +type longlong Long +with { +variant "XSD:long"; +}; + +type unsignedlonglong UnsignedLong +with { +variant "XSD:unsignedLong"; +}; + +type long Int +with { +variant "XSD:int"; +}; + +type unsignedlong UnsignedInt +with { +variant "XSD:unsignedInt"; +}; + +type short Short +with { +variant "XSD:short"; +}; + +type unsignedshort UnsignedShort +with { +variant "XSD:unsignedShort"; +}; + +type byte Byte +with { +variant "XSD:byte"; +}; + +type unsignedbyte UnsignedByte +with { +variant "XSD:unsignedByte"; +}; + +// Float types + +type float Decimal +with { +variant "XSD:decimal"; +}; + +type IEEE754float Float +with { +variant "XSD:float"; +}; + +type IEEE754double Double +with { +variant "XSD:double"; +}; + +// Time types + +type charstring Duration (pattern + "{dash}#(,1)P({nums}(Y({nums}(M({nums}D{durTime}#(,1)|{durTime}#(,1))|D{durTime}#(,1))|" & + "{durTime}#(,1))|M({nums}D{durTime}#(,1)|{durTime}#(,1))|D{durTime}#(,1))|{durTime})") +with { +variant "XSD:duration"; +}; + +type charstring DateTime (pattern + "{yearExpansion}{year}{dash}{month}{dash}{dayOfMonth}T({hour}{cln}{minute}{cln}{second}" & + "{sFraction}|{endOfDayExt}){ZorTimeZoneExt}" ) +with { +variant "XSD:dateTime"; +}; + +type charstring Time (pattern + "({hour}{cln}{minute}{cln}{second}{sFraction}|{endOfDayExt}){ZorTimeZoneExt}" ) +with { +variant "XSD:time"; +}; + +type charstring Date (pattern + "{yearExpansion}{year}{dash}{month}{dash}{dayOfMonth}{ZorTimeZoneExt}" ) +with { +variant "XSD:date"; +}; + +type charstring GYearMonth (pattern + "{yearExpansion}{year}{dash}{month}{ZorTimeZoneExt}" ) +with { +variant "XSD:gYearMonth"; +}; + +type charstring GYear (pattern + "{yearExpansion}{year}{ZorTimeZoneExt}" ) +with { +variant "XSD:gYear"; +}; + +type charstring GMonthDay (pattern + "{dash}{dash}{month}{dash}{dayOfMonth}{ZorTimeZoneExt}" ) +with { +variant "XSD:gMonthDay"; +}; + +type charstring GDay (pattern + "{dash}{dash}{dash}{dayOfMonth}{ZorTimeZoneExt}" ) +with { +variant "XSD:gDay"; +}; + +type charstring GMonth (pattern + "{dash}{dash}{month}{ZorTimeZoneExt}" ) +with { +variant "XSD:gMonth"; +}; + +// Sequence types + +type record of NMTOKEN NMTOKENS +with { +variant "XSD:NMTOKENS"; +}; + +type record of IDREF IDREFS +with { +variant "XSD:IDREFS"; +}; + +type record of ENTITY ENTITIES +with { +variant "XSD:ENTITIES"; +}; + +type record QName +{ + AnyURI uri optional, + NCName name +} +with { +variant "XSD:QName"; +}; + +// Boolean type + +type boolean Boolean +with { +variant "XSD:boolean"; +}; + +//TTCN-3 type definitions supporting the mapping of W3C XML Schema built-in datatypes + +type utf8string XMLCompatibleString +( + char(0,0,0,9)..char(0,0,0,9), + char(0,0,0,10)..char(0,0,0,10), + char(0,0,0,12)..char(0,0,0,12), + char(0,0,0,32)..char(0,0,215,255), + char(0,0,224,0)..char(0,0,255,253), + char(0,1,0,0)..char(0,16,255,253) +) + +type utf8string XMLStringWithNoWhitespace +( + char(0,0,0,33)..char(0,0,215,255), + char(0,0,224,0)..char(0,0,255,253), + char(0,1,0,0)..char(0,16,255,253) +) + +type utf8string XMLStringWithNoCRLFHT +( + char(0,0,0,32)..char(0,0,215,255), + char(0,0,224,0)..char(0,0,255,253), + char(0,1,0,0)..char(0,16,255,253) +) + +} +with{ +encode "XML" +} diff --git a/COMMON/src/general_typedefs.ttcn b/COMMON/src/general_typedefs.ttcn new file mode 100644 index 000000000..6432e5339 --- /dev/null +++ b/COMMON/src/general_typedefs.ttcn @@ -0,0 +1,236 @@ +/****************************************************************************** +* Copyright (c) 2004, 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: +* Zoltan Jasz - initial implementation and initial documentation +* Abhishek Gupta +* Attila Balasko +* Endre Kulcsar +* Gabor Bettesch +* Gabor Szalai +* Janos Kovesdi +* Sandor Palugyai +* Tibor Csondes +******************************************************************************/ +// +// File: general_typedefs.ttcn +// Rev: R9A +// Prodnr: CNL 113 368 +// Reference: + +module general_typedefs +{ + +group SimpleNativeTypes +{ +//octetstring with fixed length +type octetstring OCT0n length(0); +type octetstring OCT1n length(1); +type octetstring OCT2n length(2); +type octetstring OCT3n length(3); +type octetstring OCT4n length(4); +type octetstring OCT5n length(5); +type octetstring OCT6n length(6); +type octetstring OCT7n length(7); +type octetstring OCT8n length(8); +type octetstring OCT9n length(9); +type octetstring OCT10n length(10); +type octetstring OCT11n length(11); +type octetstring OCT12n length(12); +type octetstring OCT13n length(13); +type octetstring OCT14n length(14); +type octetstring OCT15n length(15); +type octetstring OCT16n length(16); +type octetstring OCT17n length(17); +type octetstring OCT18n length(18); +type octetstring OCT19n length(19); +type octetstring OCT20n length(20); +type octetstring OCT28n length(28); +type octetstring OCT32n length(32); +type octetstring OCT34n length(34); +type octetstring OCT46n length(46); +type octetstring OCT50n length(50); +type octetstring OCT69n length(69); +type octetstring OCT100n length(100); +type octetstring OCT128n length(128); +type octetstring OCT500n length(500); +type octetstring OCTNn; + +//octetstring with length interval +type octetstring OCT1_3n length(1..3); +type octetstring OCT1_4n length(1..4); +type octetstring OCT1_5n length(1..5); +type octetstring OCT1_6n length(1..6); +type octetstring OCT1_7n length(1..7); +type octetstring OCT1_8n length(1..8); +type octetstring OCT1_12n length(1..12); +type octetstring OCT1_15n length(1..15); +type octetstring OCT1_16n length(1..16); +type octetstring OCT1_18n length(1..18); +type octetstring OCT1_20n length(1..20); +type octetstring OCT1_24n length(1..24); +type octetstring OCT1_34n length(1..34); +type octetstring OCT1_46n length(1..46); +type octetstring OCT1_50n length(1..50); +type octetstring OCT1_112n length(1..112); +type octetstring OCT1_127n length(1..127); +type octetstring OCT1_128n length(1..128); +type octetstring OCT1_172n length(1..172); +type octetstring OCT3_5n length(3..5); +type octetstring OCT3_7n length(3..7); +type octetstring OCT3_8n length(3..8); +type octetstring OCT3_17n length(3..17); +type octetstring OCT4_8n length(4..8); + +//hexstring with fixed length +type hexstring HEX24n length(24); + +//hexstring with length interval +type hexstring HEX0_18n length(0..18); +type hexstring HEX1_20n length(1..20); + + +//bitstring with fixed length +type bitstring BIT1n length(1); +type bitstring BIT2n length(2); +type bitstring BIT3n length(3); +type bitstring BIT4n length(4); +type bitstring BIT5n length(5); +type bitstring BIT6n length(6); +type bitstring BIT7n length(7); +type bitstring BIT8n length(8); +type bitstring BIT9n length(9); +type bitstring BIT12n length(12); +type bitstring BIT14n length(14); +type bitstring BIT15n length(15); +type bitstring BIT16n length(16); +type bitstring BIT56n length(56); + +//bitstring with length interval +type bitstring BIT14_24n length(14..24); + +//bitstring to be padded with fixed length +type bitstring BIT1np length(1); +type bitstring BIT2np length(2); +type bitstring BIT3np length(3); +type bitstring BIT4np length(4); +type bitstring BIT5np length(5); +type bitstring BIT6np length(6); +type bitstring BIT7np length(7); +type bitstring BIT15np length(15); + +//integer with fixed bit number +type integer INT3nb (0..7); +type integer INT4nb (0..15); +type integer INT5nb (0..31); +type integer INT8nb (0..255); + +//integer with fixed bit number and with padding +type integer INT2nbp (0..3); +type integer INT1nbp (0..1); +type integer INT3nbp (0..7); +type integer INT5nbp (0..31); +type integer INT9nbp (0..511); +type integer INT13nbp (0..8095); +type integer INT15nbp (0..32767); + +}// end group NativeTypes + +group SimpleRAWEncodedTypes +{ +//octetstring with fixed length +type octetstring Dummy length(0) with { variant "FIELDLENGTH(0)" }; +type octetstring OCT0 length(0) with { variant "FIELDLENGTH(0)" }; +type octetstring OCT1 length(1) with { variant "FIELDLENGTH(1)" }; +type octetstring OCT2 length(2) with { variant "FIELDLENGTH(2)" }; +type octetstring OCT3 length(3) with { variant "FIELDLENGTH(3)" }; +type octetstring OCT4 length(4) with { variant "FIELDLENGTH(4)" }; +type octetstring OCT5 length(5) with { variant "FIELDLENGTH(5)" }; +type octetstring OCT6 length(6) with { variant "FIELDLENGTH(6)" }; +type octetstring OCT7 length(7) with { variant "FIELDLENGTH(7)" }; +type octetstring OCT8 length(8) with { variant "FIELDLENGTH(8)" }; +type octetstring OCT9 length(9) with { variant "FIELDLENGTH(9)" }; +type octetstring OCT10 length(10) with { variant "FIELDLENGTH(10)" }; +type octetstring OCT11 length(11) with { variant "FIELDLENGTH(11)" }; +type octetstring OCT12 length(12) with { variant "FIELDLENGTH(12)" }; +type octetstring OCT13 length(13) with { variant "FIELDLENGTH(13)" }; +type octetstring OCT14 length(14) with { variant "FIELDLENGTH(14)" }; +type octetstring OCT15 length(15) with { variant "FIELDLENGTH(15)" }; +type octetstring OCT16 length(16) with { variant "FIELDLENGTH(16)" }; +type octetstring OCT17 length(17) with { variant "FIELDLENGTH(17)" }; +type octetstring OCT18 length(18) with { variant "FIELDLENGTH(18)" }; +type octetstring OCT19 length(19) with { variant "FIELDLENGTH(19)" }; +type octetstring OCT20 length(20) with { variant "FIELDLENGTH(20)" }; +type octetstring OCT32 length(32) with { variant "FIELDLENGTH(32)" }; +type octetstring OCT34 length(34) with { variant "FIELDLENGTH(34)" }; +type octetstring OCT46 length(46) with { variant "FIELDLENGTH(46)" }; + +//octetstring with length interval +type octetstring OCT1_12 length(1..12) with { variant "" }; +type octetstring OCT1_8 length(1..8) with { variant "" }; +type octetstring OCT3_8 length(3..8) with { variant "" }; +type octetstring OCT1_50 length(1..50) with { variant "" }; +type octetstring OCTN with { variant "" }; + +//bitstring with fixed length +type bitstring BIT1 length(1) with { variant "FIELDLENGTH (1)" }; +type bitstring BIT2 length(2) with { variant "FIELDLENGTH(2)" }; +type bitstring BIT3 length(3) with { variant "FIELDLENGTH(3)" }; +type bitstring BIT4 length(4) with { variant "FIELDLENGTH(4)" }; +type bitstring BIT5 length(5) with { variant "FIELDLENGTH(5)" }; +type bitstring BIT6 length(6) with { variant "FIELDLENGTH(6)" }; +type bitstring BIT7 length(7) with { variant "FIELDLENGTH(7)" }; +type bitstring BIT8 length(8) with { variant "FIELDLENGTH(8)" }; +type bitstring BIT9 length(9) with { variant "FIELDLENGTH(9)" }; +type bitstring BIT12 length(12) with { variant "FIELDLENGTH(12)" }; +type bitstring BIT14 length(14) with { variant "FIELDLENGTH(14)" }; +type bitstring BIT15 length(15) with { variant "FIELDLENGTH(15)" }; +type bitstring BIT16 length(16) with { variant "FIELDLENGTH(16)" }; +type bitstring BIT24 length(24) with { variant "FIELDLENGTH(24)" }; +type bitstring BIT31 length(31) with { variant "FIELDLENGTH(31)" }; +type bitstring BIT56 length(56) with { variant "FIELDLENGTH(56)" }; + +type hexstring HEX1 length(1) with {variant "FIELDLENGTH(1)"}; + +//integer with fixed octet number +type integer INT1 (0..255) with { variant "FIELDLENGTH(8)" }; +type integer LIN1 (0..255) with { variant "FIELDLENGTH(8)" } +type integer LIN2 (0..65535) with { variant "FIELDLENGTH(16)" } + +//integer with fixed bit number +type integer INT7b (0..127) with { variant "FIELDLENGTH(7)" }; + +//integer record +type record of integer Integers; +type record of Integers Integer_array; + +} with {encode "RAW"} // end group SimpleRAWEncodedTypes + + group ComponentTypes + { + type component Dummy_comptype {} + } + + group CompositeTypes + { + type enumerated Protocols + { mtp3, sccp, isup, bicc, qaal2, gcp, bssap, bssmap, ranap, dtap } + + type record of OCT1 OCT1List; + type record of OCT2 OCT2List; + type record of OCT3 OCT3List; + type record of OCT4 OCT4List; + type record of OCT5 OCT5List; + type record of OCT6 OCT6List; + type record of OCT7 OCT7List; + + type record of Dummy_comptype ListOfDummy_comptype; + + type record of Protocols ProtocolList; + } + +}with { encode "RAW"} /* End of module general_typedefs */ diff --git a/COMMON/src/http_www_w3_org_XML_1998_namespace.ttcn b/COMMON/src/http_www_w3_org_XML_1998_namespace.ttcn new file mode 100644 index 000000000..99f570ad8 --- /dev/null +++ b/COMMON/src/http_www_w3_org_XML_1998_namespace.ttcn @@ -0,0 +1,150 @@ +/****************************************************************************** +* Copyright (c) 2004, 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: +* Zoltan Jasz - initial implementation and initial documentation +* Abhishek Gupta +* Attila Balasko +* Endre Kulcsar +* Gabor Bettesch +* Gabor Szalai +* Janos Kovesdi +* Sandor Palugyai +* Tibor Csondes +******************************************************************************/ +// +// File: http_www_w3_org_XML_1998_namespace.ttcn +// Rev: R9A +// Prodnr: CNL 113 368 +// Reference: + +module http_www_w3_org_XML_1998_namespace { + + +import from XSD all; + + +/* See http://www.w3.org/XML/1998/namespace.html and + http://www.w3.org/TR/REC-xml for information about this namespace. + + This schema document describes the XML namespace, in a form + suitable for import by other schema documents. + + Note that local names in this namespace are intended to be defined + only by the World Wide Web Consortium or its subgroups. The + following names are currently defined in this namespace and should + not be used with conflicting semantics by any Working Group, + specification, or document instance: + + base (as an attribute name): denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification. + + lang (as an attribute name): denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification. + + space (as an attribute name): denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification. + + Father (in any context at all): denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups: + + In appreciation for his vision, leadership and dedication + the W3C XML Plenary on this 10th day of February, 2000 + reserves for Jon Bosak in perpetuity the XML name + xml:Father */ + + +/* This schema defines attributes and an attribute group + suitable for use by + schemas wishing to allow xml:base, xml:lang or xml:space attributes + on elements they define. + + To enable this, such a schema must import this schema + for the XML namespace, e.g. as follows: */ +/* < */ +/* schema . . . */ +/* > */ +/* . . . */ +/* < */ +/* import namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="http://www.w3.org/2001/03/xml.xsd"/ */ +/* > */ +/* Subsequently, qualified reference to any of the attributes + or the group defined below will have the desired effect, e.g. */ +/* < */ +/* type . . . */ +/* > */ +/* . . . */ +/* < */ +/* attributeGroup ref="xml:specialAttrs"/ */ +/* > */ +/* will define a type which will schema-validate an instance + element with any of those attributes */ + + +/* In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + http://www.w3.org/2001/03/xml.xsd. + At the date of issue it can also be found at + http://www.w3.org/2001/xml.xsd. + The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML Schema + itself. In other words, if the XML Schema namespace changes, the version + of this document at + http://www.w3.org/2001/xml.xsd will change + accordingly; the version at + http://www.w3.org/2001/03/xml.xsd will not change. */ + + +/* In due course, we should install the relevant ISO 2- and 3-letter + codes as the enumerated possible values . . . */ +type XSD.Language Lang +with { +variant "name as uncapitalized"; +variant "attribute"; +}; + + +type enumerated Space +{ + default_, + preserve +} +with { +variant "text 'default_' as 'default'"; +variant "name as uncapitalized"; +variant "defaultForEmpty as 'preserve'"; +variant "attribute"; +}; + + +/* See http://www.w3.org/TR/xmlbase/ for + information about this attribute. */ +type XSD.AnyURI Base +with { +variant "name as uncapitalized"; +variant "attribute"; +}; + + +} +with { +encode "XML"; +variant "namespace as 'http://www.w3.org/XML/1998/namespace'"; +variant "controlNamespace 'http://www.w3.org/2001/XMLSchema-instance' prefix 'xsi'"; +extension "version R9A" +} diff --git a/M3UA_CNL113536/M3UA_CNL113536.tpd b/M3UA_CNL113536/M3UA_CNL113536.tpd new file mode 100644 index 000000000..c67290231 --- /dev/null +++ b/M3UA_CNL113536/M3UA_CNL113536.tpd @@ -0,0 +1,44 @@ + + + + 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 new file mode 100644 index 000000000..eb68bfba8 --- /dev/null +++ b/M3UA_CNL113536/doc/documentation_note.txt @@ -0,0 +1,13 @@ +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 new file mode 100644 index 000000000..d79d8327a --- /dev/null +++ b/M3UA_CNL113536/src/M3UA_Types.ttcn @@ -0,0 +1,805 @@ +/****************************************************************************** +* 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 new file mode 120000 index 000000000..6d1b3f35b --- /dev/null +++ b/M3UA_CNL113537/demo/Abstract_Socket.cc @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..ecb6c0369 --- /dev/null +++ b/M3UA_CNL113537/demo/Abstract_Socket.hh @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..f3f7144d2 --- /dev/null +++ b/M3UA_CNL113537/demo/BICC_EncDec.cc @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..de200f7a4 --- /dev/null +++ b/M3UA_CNL113537/demo/BICC_Types.ttcn @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..354ebf3fc --- /dev/null +++ b/M3UA_CNL113537/demo/General_Types.ttcn @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..bf12ab9e9 --- /dev/null +++ b/M3UA_CNL113537/demo/M3UA_Emulation.ttcn @@ -0,0 +1 @@ +../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 new file mode 100644 index 000000000..4c1e86af6 --- /dev/null +++ b/M3UA_CNL113537/demo/M3UA_Emulation_Test.ttcn @@ -0,0 +1,152 @@ +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 new file mode 120000 index 000000000..ca43cb342 --- /dev/null +++ b/M3UA_CNL113537/demo/M3UA_Types.ttcn @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..88f108395 --- /dev/null +++ b/M3UA_CNL113537/demo/MTP3asp_EncDec.cc @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..9f03c54ed --- /dev/null +++ b/M3UA_CNL113537/demo/MTP3asp_Types.ttcn @@ -0,0 +1 @@ +../../../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 new file mode 100644 index 000000000..ffc0aeb09 --- /dev/null +++ b/M3UA_CNL113537/demo/Makefile @@ -0,0 +1,920 @@ +# 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 new file mode 120000 index 000000000..2b931e952 --- /dev/null +++ b/M3UA_CNL113537/demo/SCTPasp_PT.cc @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..e37473f5a --- /dev/null +++ b/M3UA_CNL113537/demo/SCTPasp_PT.hh @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..4394e347f --- /dev/null +++ b/M3UA_CNL113537/demo/SCTPasp_PortType.ttcn @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..71876a06e --- /dev/null +++ b/M3UA_CNL113537/demo/SCTPasp_Types.ttcn @@ -0,0 +1 @@ +../../../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 new file mode 100644 index 000000000..9533515d1 --- /dev/null +++ b/M3UA_CNL113537/demo/m3ua_emu.cfg @@ -0,0 +1,21 @@ +[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 new file mode 100644 index 000000000..7a4a7e9b2 --- /dev/null +++ b/M3UA_CNL113537/src/M3UA_Emulation.ttcn @@ -0,0 +1,1307 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// 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 new file mode 100644 index 000000000..bc2b89eec --- /dev/null +++ b/MTP3asp_CNL113337/MTP3asp_CNL113337.tpd @@ -0,0 +1,89 @@ + + + + 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 new file mode 100644 index 000000000..37bab8f04 --- /dev/null +++ b/MTP3asp_CNL113337/demo/MTP3asp_PT.cc @@ -0,0 +1,2952 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// 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 new file mode 100644 index 000000000..340f24ffa --- /dev/null +++ b/MTP3asp_CNL113337/demo/MTP3asp_PT.hh @@ -0,0 +1,249 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// 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 new file mode 100644 index 000000000..86b7a83e7 --- /dev/null +++ b/MTP3asp_CNL113337/demo/MTP3asp_PortType.ttcn @@ -0,0 +1,61 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// 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 new file mode 100644 index 000000000..e96f42016 --- /dev/null +++ b/MTP3asp_CNL113337/demo/MTP3asp_Types.ttcn @@ -0,0 +1,324 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// 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 new file mode 100644 index 000000000..53b19d35b --- /dev/null +++ b/MTP3asp_CNL113337/demo/Makefile @@ -0,0 +1,353 @@ +# 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 new file mode 100644 index 000000000..1c842503a --- /dev/null +++ b/MTP3asp_CNL113337/demo/mtp3test.ttcn @@ -0,0 +1,292 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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 new file mode 100644 index 000000000..35b3e09ad --- /dev/null +++ b/MTP3asp_CNL113337/demo/mtp3test_MTP3_ansi2.cfg @@ -0,0 +1,75 @@ +[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 new file mode 100644 index 0000000000000000000000000000000000000000..b6cf46f115f8c80b00a05439c6b430ad0c880093 GIT binary patch literal 143496 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 z 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 +#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 new file mode 100644 index 000000000..340f24ffa --- /dev/null +++ b/MTP3asp_CNL113337/src/MTP3asp_PT.hh @@ -0,0 +1,249 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// 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 new file mode 100644 index 000000000..7c5a06b43 --- /dev/null +++ b/MTP3asp_CNL113337/src/MTP3asp_PortType.ttcn @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// 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 new file mode 100644 index 000000000..e96f42016 --- /dev/null +++ b/MTP3asp_CNL113337/src/MTP3asp_Types.ttcn @@ -0,0 +1,324 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// 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 new file mode 100644 index 000000000..31e515379 --- /dev/null +++ b/SCCP_CNL113341/SCCP_CNL113341.tpd @@ -0,0 +1,87 @@ + + + + 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 new file mode 120000 index 000000000..354ebf3fc --- /dev/null +++ b/SCCP_CNL113341/demo/General_Types.ttcn @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..44d08bbf4 --- /dev/null +++ b/SCCP_CNL113341/demo/MTP3asp_PT.cc @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..30dfc24c4 --- /dev/null +++ b/SCCP_CNL113341/demo/MTP3asp_PT.hh @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..199486403 --- /dev/null +++ b/SCCP_CNL113341/demo/MTP3asp_PortType.ttcn @@ -0,0 +1 @@ +../../../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 new file mode 120000 index 000000000..9f03c54ed --- /dev/null +++ b/SCCP_CNL113341/demo/MTP3asp_Types.ttcn @@ -0,0 +1 @@ +../../../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 new file mode 100644 index 000000000..4e764a323 --- /dev/null +++ b/SCCP_CNL113341/demo/Makefile.ini @@ -0,0 +1,737 @@ +# 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 new file mode 100644 index 000000000..b8b30219a --- /dev/null +++ b/SCCP_CNL113341/demo/N_UNITDATAtest_600longdata_xudt_ansi_log @@ -0,0 +1,2141 @@ +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 new file mode 120000 index 000000000..fae960598 --- /dev/null +++ b/SCCP_CNL113341/demo/SCCP_Emulation.ttcn @@ -0,0 +1 @@ +../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 new file mode 120000 index 000000000..aabd0d400 --- /dev/null +++ b/SCCP_CNL113341/demo/SCCP_Mapping.ttcnpp @@ -0,0 +1 @@ +../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 new file mode 100644 index 000000000..ae1c4724c --- /dev/null +++ b/SCCP_CNL113341/demo/SCCP_Testcases.cfg @@ -0,0 +1,55 @@ +[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 new file mode 100644 index 000000000..0f8ba47c3 --- /dev/null +++ b/SCCP_CNL113341/demo/SCCP_Testcases.ttcn @@ -0,0 +1,468 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// +// 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 new file mode 120000 index 000000000..9aa343b89 --- /dev/null +++ b/SCCP_CNL113341/demo/SCCP_Types.ttcn @@ -0,0 +1 @@ +../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 new file mode 100644 index 000000000..67e0762d1 --- /dev/null +++ b/SCCP_CNL113341/demo/SCCP_selftest.cfg @@ -0,0 +1,52 @@ +[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 new file mode 100644 index 000000000..c6497045f --- /dev/null +++ b/SCCP_CNL113341/demo/SCCP_selftest.ttcn @@ -0,0 +1,607 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// +// 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 new file mode 120000 index 000000000..f7668d7f4 --- /dev/null +++ b/SCCP_CNL113341/demo/SCCPasp_Types.ttcn @@ -0,0 +1 @@ +../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 new file mode 100644 index 000000000..5e269cc51 --- /dev/null +++ b/SCCP_CNL113341/src/SCCP_Emulation.ttcn @@ -0,0 +1,6031 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// 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[19]:= +{ + 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_NSP, + cg_NSP +}; + + +const integer cg_Mapping_RefCause_Reason[19]:= +{ + 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_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); + + //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, + omit, + 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 new file mode 100644 index 000000000..f00b08a9b --- /dev/null +++ b/SCCP_CNL113341/src/SCCP_EncDec.cc @@ -0,0 +1,19 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// 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 new file mode 100644 index 000000000..0de496b72 --- /dev/null +++ b/SCCP_CNL113341/src/SCCP_Mapping.ttcnpp @@ -0,0 +1,129 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// 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 new file mode 100644 index 000000000..168c317a9 --- /dev/null +++ b/SCCP_CNL113341/src/SCCP_Types.ttcn @@ -0,0 +1,1553 @@ +//////////////////////////////////////////////////////////////////////////////// +// // +// 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 new file mode 100644 index 000000000..c66fa864a --- /dev/null +++ b/SCCP_CNL113341/src/SCCPasp_Types.ttcn @@ -0,0 +1,895 @@ +/////////////////////////////////////////////////////////////////////////////// +// // +// 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/SCCP_Test/SCCP_Testcases.cfg b/SCCP_Test/SCCP_Testcases.cfg new file mode 100644 index 000000000..ce3548622 --- /dev/null +++ b/SCCP_Test/SCCP_Testcases.cfg @@ -0,0 +1,54 @@ +[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] + +system.sctp.debug := "yes" + +//see documentation (User guide) for the parameters) + + +[MODULE_PARAMETERS] + +M3UA_Emulation.tsp_logVerbose := true; +M3UA_Emulation.tsp_M3UA_Server_Mode := false; +SCCP_Testcases.tsp_address := +{ + local_sctp_port := 2905, + local_ip_addr := "10.6.70.19", + remote_sctp_port := 2905, + remote_ip_addr := "159.107.193.33" +} + + +SCCP_Testcases.tsp_own_GT := '14377760'H +SCCP_Testcases.tsp_remote_GT := '14375760'H +SCCP_Testcases.tsp_SSN := 8 //8:MSC 5:MAP see 3.4.2.2/Q.713 +SCCP_Testcases.tsp_SIO := '83'O //SCCP national +SCCP_Testcases.tsp_own_SPC := 2351 +SCCP_Testcases.tsp_remote_SPC := 2300// max value on 14 bits +SCCP_Testcases.tsp_SLS := 0 +#[tsp_sccp_serviceType := "mtp3_itu" |"mtp3b_itu"|"mtp3_ansi"|"mtp3b_ansi"| "mtp3b_tcc"] +SCCP_Testcases.tsp_sccp_serviceType := "mtp3_ttc" + +#for mtp3_itu/gti0011 or mtp3_ansi/gti0001 : +#tsp_translationType := 7 +SCCP_Emulation.tsp_SIF_MaxLength := 272 +SCCP_Emulation.tsp_force_xudt := 0 // 1:yes, 0:no + +[MAIN_CONTROLLER] +//TCPPort := 7145 +//NumHCs := 1 diff --git a/SCCP_Test/SCCP_Testcases.ttcn b/SCCP_Test/SCCP_Testcases.ttcn new file mode 100644 index 000000000..0cf1c7a04 --- /dev/null +++ b/SCCP_Test/SCCP_Testcases.ttcn @@ -0,0 +1,505 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// +// 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 +// + + + + +//Note : this has been modified to include M3UA Emulation and SCTP Test port +//Elemer Lelik 12.04.2017 + + + +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 + + + SCTP_Association_Address tsp_address := { 0, "", 0, "" }; + +}//modulepar + +import from General_Types all; + +import from M3UA_Types all; +import from M3UA_Emulation 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; + + +import from SCTPasp_Types all; +import from SCTPasp_PortType all; + + + + +/************************************* +* Components +**************************************/ + + +// Model of MSC: +type component system_CT { + + port SCTPasp_PT sctp; + + +}; + + + + +// 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 M3UA_CT vc_M3UA ; + + 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 system_CT +{ + initBootParams(); + log("v_BootA:",v_BootA); + + // Protocol Stack creation & connections: + vc_SCCP_A:=SCCP_CT.create; + vc_M3UA:=M3UA_CT.create; + + connect(self:A_PORT,vc_SCCP_A:SCCP_SP_PORT); + connect(vc_M3UA:MTP3_SP_PORT,vc_SCCP_A:MTP3_SCCP_PORT); + map(vc_M3UA:SCTP_PORT,system:sctp); + + vc_M3UA.start(f_M3UA_Emulation(tsp_address)); + vc_SCCP_A.start( SCCPStart( v_BootA ) ); // Bootparameters + + + log( "init() is done"); + +}// init + +function terminate( ) runs on MTC_CT //system system_CT +{ + log( "terminate() started"); + /*while( all component.running != true ) + { + //waits + }*/ + all component.stop; + + unmap(vc_M3UA:SCTP_PORT,system:sctp); + disconnect(vc_M3UA:MTP3_SP_PORT,vc_SCCP_A:MTP3_SCCP_PORT); + 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 system_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 system system_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/SCTPasp_CNL113469/SCTPasp_CNL113469.tpd b/SCTPasp_CNL113469/SCTPasp_CNL113469.tpd new file mode 100644 index 000000000..125ad9fc8 --- /dev/null +++ b/SCTPasp_CNL113469/SCTPasp_CNL113469.tpd @@ -0,0 +1,50 @@ + + + + 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 new file mode 100644 index 0000000000000000000000000000000000000000..5923989c74195d75f2466e67206ae78c56dda6e5 GIT binary patch literal 64512 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 z

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 ^B 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 literal 0 HcmV?d00001 diff --git a/SCTPasp_CNL113469/src/SCTPasp_PT.cc b/SCTPasp_CNL113469/src/SCTPasp_PT.cc new file mode 100644 index 000000000..6d7b02b4a --- /dev/null +++ b/SCTPasp_CNL113469/src/SCTPasp_PT.cc @@ -0,0 +1,1549 @@ +/****************************************************************************** +* 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 new file mode 100644 index 000000000..7d6311d3c --- /dev/null +++ b/SCTPasp_CNL113469/src/SCTPasp_PT.hh @@ -0,0 +1,157 @@ +/****************************************************************************** +* 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 new file mode 100644 index 000000000..27aae086f --- /dev/null +++ b/SCTPasp_CNL113469/src/SCTPasp_PortType.ttcn @@ -0,0 +1,62 @@ +/****************************************************************************** +* 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 new file mode 100644 index 000000000..f10fc5881 --- /dev/null +++ b/SCTPasp_CNL113469/src/SCTPasp_Types.ttcn @@ -0,0 +1,201 @@ +/****************************************************************************** +* 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/General_Types.ttcn b/bin/General_Types.ttcn new file mode 120000 index 000000000..206f0e354 --- /dev/null +++ b/bin/General_Types.ttcn @@ -0,0 +1 @@ +../COMMON/src/General_Types.ttcn \ No newline at end of file diff --git a/bin/M3UA_Emulation.ttcn b/bin/M3UA_Emulation.ttcn new file mode 120000 index 000000000..920cdcf91 --- /dev/null +++ b/bin/M3UA_Emulation.ttcn @@ -0,0 +1 @@ +../M3UA_CNL113537/src/M3UA_Emulation.ttcn \ No newline at end of file diff --git a/bin/M3UA_Types.ttcn b/bin/M3UA_Types.ttcn new file mode 120000 index 000000000..3b60f723f --- /dev/null +++ b/bin/M3UA_Types.ttcn @@ -0,0 +1 @@ +../M3UA_CNL113536/src/M3UA_Types.ttcn \ No newline at end of file diff --git a/bin/MTP3asp_PortType.ttcn b/bin/MTP3asp_PortType.ttcn new file mode 120000 index 000000000..9f2cae65f --- /dev/null +++ b/bin/MTP3asp_PortType.ttcn @@ -0,0 +1 @@ +../MTP3asp_CNL113337/src/MTP3asp_PortType.ttcn \ No newline at end of file diff --git a/bin/MTP3asp_Types.ttcn b/bin/MTP3asp_Types.ttcn new file mode 120000 index 000000000..ef67545f5 --- /dev/null +++ b/bin/MTP3asp_Types.ttcn @@ -0,0 +1 @@ +../MTP3asp_CNL113337/src/MTP3asp_Types.ttcn \ No newline at end of file diff --git a/bin/Makefile b/bin/Makefile new file mode 100644 index 000000000..120c4ec45 --- /dev/null +++ b/bin/Makefile @@ -0,0 +1,190 @@ +# This Makefile was generated by the Makefile Generator +# of the TTCN-3 Test Executor version CRL 113 200/6 R1A +# for Elemer Lelik (ethlel@esekilxxen1846) on Wed Apr 12 09:00:44 2017 + +# Copyright (c) 2000-2017 Ericsson Telecom AB + +# 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.1modules. +# - make port Generates port skeletons. +# - make clean Removes all generated files. +# - make compile Translates TTCN-3 and ASN.1 modules to C++. +# - make dep Creates/updates dependency list. +# - make executable Builds the executable test suite. +# - make library Builds the library archive. +# - make objects Builds the object files without linking the executable. +# +# 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: +# (if you change the platform, you may need to change the compiler) +CXX = g++ + +# Flags for the C++ preprocessor (and makedepend as well): +CPPFLAGS = -D$(PLATFORM) -I$(TTCN3_DIR)/include + +# Flags for the C++ compiler: +CXXFLAGS = -Wall + +# Flags for the linker: +LDFLAGS = + +ifeq ($(PLATFORM), WIN32) +# Silence linker warnings. +LDFLAGS += -Wl,--enable-auto-import,--enable-runtime-pseudo-reloc +endif + +# Utility to create library files +AR = ar +ARFLAGS = + +# 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) + +# The path of your libxml2 installation: +# If you do not have your own one, leave it unchanged. +XMLDIR = $(TTCN3_DIR) + +# Directory to store the archived source files: +# Note: you can set any directory except ./archive +ARCHIVE_DIR = backup + +# +# You may change these variables. Add your files if necessary... +# + +# TTCN-3 modules of this project: +TTCN3_MODULES = General_Types.ttcn M3UA_Emulation.ttcn M3UA_Types.ttcn MTP3asp_PortType.ttcn MTP3asp_Types.ttcn SCCP_Emulation.ttcn SCCP_Mapping.ttcn SCCP_Testcases.ttcn SCCP_Types.ttcn SCCPasp_Types.ttcn SCTPasp_PortType.ttcn SCTPasp_Types.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 = General_Types.cc M3UA_Emulation.cc M3UA_Types.cc MTP3asp_PortType.cc MTP3asp_Types.cc SCCP_Emulation.cc SCCP_Mapping.cc SCCP_Testcases.cc SCCP_Types.cc SCCPasp_Types.cc SCTPasp_PortType.cc SCTPasp_Types.cc +GENERATED_HEADERS = General_Types.hh M3UA_Emulation.hh M3UA_Types.hh MTP3asp_PortType.hh MTP3asp_Types.hh SCCP_Emulation.hh SCCP_Mapping.hh SCCP_Testcases.hh SCCP_Types.hh SCCPasp_Types.hh SCTPasp_PortType.hh SCTPasp_Types.hh + +# C/C++ Source & header files of Test Ports, external functions and +# other modules: +USER_SOURCES = SCTPasp_PT.cc +USER_HEADERS = SCTPasp_PT.hh + +# Object files of this project that are needed for the executable test suite: +OBJECTS = $(GENERATED_OBJECTS) $(USER_OBJECTS) + +GENERATED_OBJECTS = General_Types.o M3UA_Emulation.o M3UA_Types.o MTP3asp_PortType.o MTP3asp_Types.o SCCP_Emulation.o SCCP_Mapping.o SCCP_Testcases.o SCCP_Types.o SCCPasp_Types.o SCTPasp_PortType.o SCTPasp_Types.o + +USER_OBJECTS = SCTPasp_PT.o + +# Other files of the project (Makefile, configuration files, etc.) +# that will be added to the archived source files: +OTHER_FILES = Makefile + +# The name of the executable test suite: +EXECUTABLE = SCCP_Test + + + +LIBRARY = lib$(EXECUTABLE).a + +TARGET = $(EXECUTABLE) + +# +# Do not modify these unless you know what you are doing... +# Platform specific additional libraries: +# +SOLARIS_LIBS = -lsocket -lnsl -lxml2 -lresolv +SOLARIS8_LIBS = -lsocket -lnsl -lxml2 -lresolv +LINUX_LIBS = -lxml2 -lpthread -lrt +FREEBSD_LIBS = -lxml2 +WIN32_LIBS = -lxml2 + +# +# Rules for building the executable... +# + +all: $(TARGET) ; + +executable: $(EXECUTABLE) ; + +library: $(LIBRARY) ; + +objects: $(OBJECTS) compile; + +$(EXECUTABLE): $(OBJECTS) + if $(CXX) $(LDFLAGS) -o $@ $(OBJECTS) \ + -L$(TTCN3_DIR)/lib -l$(TTCN3_LIB) \ + -L$(OPENSSL_DIR)/lib -lcrypto \ + -L$(XMLDIR)/lib $($(PLATFORM)_LIBS); \ + then : ; else $(TTCN3_DIR)/bin/titanver $(OBJECTS); exit 1; fi + +$(LIBRARY): $(OBJECTS) + $(AR) -r $(ARFLAGS) $(LIBRARY) $(OBJECTS) + +%.o: %.c $(GENERATED_HEADERS) + $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $< + +%.o: %.cc $(GENERATED_HEADERS) + $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $< + +$(GENERATED_SOURCES) $(GENERATED_HEADERS): compile + @if [ ! -f $@ ]; then rm -f compile; $(MAKE) compile; fi + +check: $(TTCN3_MODULES) $(ASN1_MODULES) + $(TTCN3_DIR)/bin/compiler -s $(COMPILER_FLAGS) \ + $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES) + +port: $(TTCN3_MODULES) $(ASN1_MODULES) + $(TTCN3_DIR)/bin/compiler -t $(COMPILER_FLAGS) \ + $(TTCN3_MODULES) $(PREPROCESSED_TTCN3_MODULES) $(ASN1_MODULES) + +compile: $(TTCN3_MODULES) $(ASN1_MODULES) + $(TTCN3_DIR)/bin/compiler $(COMPILER_FLAGS) \ + $(TTCN3_MODULES) $(ASN1_MODULES) - $? + touch $@ + +clean: + -rm -f $(EXECUTABLE) $(LIBRARY) $(OBJECTS) $(GENERATED_HEADERS) \ + $(GENERATED_SOURCES) compile \ + tags *.log + +dep: $(GENERATED_SOURCES) $(USER_SOURCES) ; + makedepend $(CPPFLAGS) -DMAKEDEPEND_RUN $(GENERATED_SOURCES) $(USER_SOURCES) + +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 + +diag: + $(TTCN3_DIR)/bin/compiler -v 2>&1 + $(TTCN3_DIR)/bin/mctr_cli -v 2>&1 + $(CXX) -v 2>&1 + $(AR) -V 2>&1 + @echo TTCN3_DIR=$(TTCN3_DIR) + @echo OPENSSL_DIR=$(OPENSSL_DIR) + @echo XMLDIR=$(XMLDIR) + @echo PLATFORM=$(PLATFORM) + +# +# Add your rules here if necessary... +# + diff --git a/bin/SCCP_Emulation.ttcn b/bin/SCCP_Emulation.ttcn new file mode 120000 index 000000000..56f954879 --- /dev/null +++ b/bin/SCCP_Emulation.ttcn @@ -0,0 +1 @@ +../SCCP_CNL113341/src/SCCP_Emulation.ttcn \ No newline at end of file diff --git a/bin/SCCP_Mapping.ttcn b/bin/SCCP_Mapping.ttcn new file mode 120000 index 000000000..49e5098d4 --- /dev/null +++ b/bin/SCCP_Mapping.ttcn @@ -0,0 +1 @@ +../SCCP_CNL113341/src/SCCP_Mapping.ttcnpp \ No newline at end of file diff --git a/bin/SCCP_Mapping.ttcnpp b/bin/SCCP_Mapping.ttcnpp new file mode 120000 index 000000000..49e5098d4 --- /dev/null +++ b/bin/SCCP_Mapping.ttcnpp @@ -0,0 +1 @@ +../SCCP_CNL113341/src/SCCP_Mapping.ttcnpp \ No newline at end of file diff --git a/bin/SCCP_Testcases.cfg b/bin/SCCP_Testcases.cfg new file mode 120000 index 000000000..34a3574a4 --- /dev/null +++ b/bin/SCCP_Testcases.cfg @@ -0,0 +1 @@ +../SCCP_Test/SCCP_Testcases.cfg \ No newline at end of file diff --git a/bin/SCCP_Testcases.ttcn b/bin/SCCP_Testcases.ttcn new file mode 120000 index 000000000..044b425c5 --- /dev/null +++ b/bin/SCCP_Testcases.ttcn @@ -0,0 +1 @@ +../SCCP_Test/SCCP_Testcases.ttcn \ No newline at end of file diff --git a/bin/SCCP_Types.ttcn b/bin/SCCP_Types.ttcn new file mode 120000 index 000000000..79ab3ba0f --- /dev/null +++ b/bin/SCCP_Types.ttcn @@ -0,0 +1 @@ +../SCCP_CNL113341/src/SCCP_Types.ttcn \ No newline at end of file diff --git a/bin/SCCPasp_Types.ttcn b/bin/SCCPasp_Types.ttcn new file mode 120000 index 000000000..1d80a1d6d --- /dev/null +++ b/bin/SCCPasp_Types.ttcn @@ -0,0 +1 @@ +../SCCP_CNL113341/src/SCCPasp_Types.ttcn \ No newline at end of file diff --git a/bin/SCTPasp_PT.cc b/bin/SCTPasp_PT.cc new file mode 120000 index 000000000..233448492 --- /dev/null +++ b/bin/SCTPasp_PT.cc @@ -0,0 +1 @@ +../SCTPasp_CNL113469/src/SCTPasp_PT.cc \ No newline at end of file diff --git a/bin/SCTPasp_PT.hh b/bin/SCTPasp_PT.hh new file mode 120000 index 000000000..5ba6a79ed --- /dev/null +++ b/bin/SCTPasp_PT.hh @@ -0,0 +1 @@ +../SCTPasp_CNL113469/src/SCTPasp_PT.hh \ No newline at end of file diff --git a/bin/SCTPasp_PortType.ttcn b/bin/SCTPasp_PortType.ttcn new file mode 120000 index 000000000..798fd7bd1 --- /dev/null +++ b/bin/SCTPasp_PortType.ttcn @@ -0,0 +1 @@ +../SCTPasp_CNL113469/src/SCTPasp_PortType.ttcn \ No newline at end of file diff --git a/bin/SCTPasp_Types.ttcn b/bin/SCTPasp_Types.ttcn new file mode 120000 index 000000000..e067b9475 --- /dev/null +++ b/bin/SCTPasp_Types.ttcn @@ -0,0 +1 @@ +../SCTPasp_CNL113469/src/SCTPasp_Types.ttcn \ No newline at end of file diff --git a/bin/install.script b/bin/install.script new file mode 100755 index 000000000..d6808cc34 --- /dev/null +++ b/bin/install.script @@ -0,0 +1,34 @@ +#!/bin/sh + + + +ln -sf ../COMMON/src/General_Types.ttcn . + +#M3UA protocol module +ln -sf ../M3UA_CNL113536/src/M3UA_Types.ttcn . +#M3UA Emulator +ln -sf ../M3UA_CNL113537/src/M3UA_Emulation.ttcn . + + +#MTP3 test port (partly) + +ln -sf ../MTP3asp_CNL113337/src/MTP3asp_Types.ttcn . +ln -sf ../MTP3asp_CNL113337/src/MTP3asp_PortType.ttcn . + +#SCCP Emulator + protocol module + +ln -sf ../SCCP_CNL113341/src/SCCPasp_Types.ttcn . +ln -sf ../SCCP_CNL113341/src/SCCP_Types.ttcn . +ln -sf ../SCCP_CNL113341/src/SCCP_Mapping.ttcnpp . +ln -sf ../SCCP_CNL113341/src/SCCP_Emulation.ttcn . + +#SCTP test port +ln -sf ../SCTPasp_CNL113469/src/SCTPasp_Types.ttcn . +ln -sf ../SCTPasp_CNL113469/src/SCTPasp_PortType.ttcn . +ln -sf ../SCTPasp_CNL113469/src/SCTPasp_PT.hh . +ln -sf ../SCTPasp_CNL113469/src/SCTPasp_PT.cc . + + +#Test cases +ln -sf ../SCCP_Test/SCCP_Testcases.ttcn . +ln -sf ../SCCP_Test/SCCP_Testcases.cfg .