forked from ttcn3/osmo-ttcn3-hacks
6032 lines
239 KiB
Plaintext
6032 lines
239 KiB
Plaintext
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// 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<cg_TimerArraySize;i:=i+1) {
|
|
v_T_conn_est[i] := false;
|
|
v_T_ias[i] := false;
|
|
v_T_iar[i] := false;
|
|
v_T_rel[i] := false;
|
|
v_T_repeat_rel[i] := false;
|
|
v_T_int[i] := false;
|
|
v_T_reset[i] := false;
|
|
v_T_internal_reset[i] := false;
|
|
v_T_guard[i] := false;
|
|
}
|
|
}
|
|
|
|
//******************************************************************
|
|
function SCCPStart(MSC_SCCP_MTP3_parameters pl_Boot) runs on SCCP_CT
|
|
//******************************************************************
|
|
{
|
|
//local declarations
|
|
var integer vl_j;
|
|
|
|
//initializes variables with 'SCCP_CT' visibility/scope
|
|
v_segmLocRefIndex := 0;
|
|
v_reference:=0;
|
|
v_SIO:= bit2oct(pl_Boot.sio.ni & pl_Boot.sio.prio & pl_Boot.sio.si);
|
|
v_NI := oct2int(v_SIO)/64;
|
|
v_own_SPC:=pl_Boot.opc;
|
|
v_remote_SPC:=pl_Boot.dpc;
|
|
v_SLS:=pl_Boot.sls;
|
|
v_SCCPServiceType := pl_Boot.sccp_serviceType;
|
|
|
|
if (ispresent(pl_Boot.ssn))
|
|
{
|
|
v_SSN:=pl_Boot.ssn;
|
|
}
|
|
else
|
|
{
|
|
v_SSN:=0;
|
|
}
|
|
if( (v_SCCPServiceType == mtp3_itu) or
|
|
(v_SCCPServiceType == mtp3b_itu) )
|
|
{
|
|
v_RoutingLabelLen := 4;
|
|
}
|
|
else if( (v_SCCPServiceType == mtp3_ansi) or
|
|
(v_SCCPServiceType == mtp3b_ansi) )
|
|
{
|
|
v_RoutingLabelLen := 7;
|
|
}
|
|
else if ( (v_SCCPServiceType == mtp3_ttc) or
|
|
(v_SCCPServiceType == mtp3b_ttc) )
|
|
{
|
|
if(v_NI>= 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
|