/////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2000-2023 Ericsson Telecom AB // // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v2.0 // which accompanies this distribution, and is available at // https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html /////////////////////////////////////////////////////////////////////////////// // 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: R7A // 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 boolean tsp_override_called_address := true // if true and v_remote_SPC is exists, the CalledAddress is set route on SSN to v_remote_SPC } import from General_Types all; import from MTP3asp_Types all; import from MTP3asp_PortType all; import from SCCP_Types all; import from SCCPasp_Types all; import from SCCP_Mapping all; group SCCPConstants {//startgroup SCCPConstants //------------------------------------------------------------------------------ // Subsystem Numbers //------------------------------------------------------------------------------ const integer cg_SSN_notKnown:=0; const integer cg_SSN_sCCPmanagement:=1; const integer cg_SSN_reservedForITU:=2; const integer cg_SSN_iSUP:=3; const integer cg_SSN_oMAP:=4; const integer cg_SSN_mAP:=5; const integer cg_SSN_hLR:=6; const integer cg_SSN_vLR:=7; const integer cg_SSN_mSC:=8; const integer cg_SSN_eIC:=9; const integer cg_SSN_aUC:=10; const integer cg_SSN_isdnSS:=11; const integer cg_SSN_reservedForIntUse:=12; const integer cg_SSN_bISDNe2e:=13; const integer cg_SSN_tCtestResponder:=14; const integer cg_SSN_rANAP:=142; const integer cg_SSN_bSSAP:=254; // TCAP has not SSN //------------------------------------------------------------------------------ // Routing Indicator values ITU: 3.4.1/Q713. //------------------------------------------------------------------------------ const BIT1n cg_route_on_SSN := '1'B; const BIT1n cg_route_on_GT := '0'B; //------------------------------------------------------------------------------ // Release Cause //------------------------------------------------------------------------------ const integer cg_Rel_endUserOrig:=0; const integer cg_Rel_endUserCong:=1; const integer cg_Rel_endUserFailure:=2; const integer cg_Rel_sCCPUserOrig:=3; const integer cg_Rel_remProcError:=4; const integer cg_Rel_inconsConnData:=5; const integer cg_Rel_accessFailure:=6; const integer cg_Rel_accessCongestion:=7; const integer cg_Rel_subsystFailure:=8; const integer cg_Rel_subsystCongest:=9; const integer cg_Rel_mTPFailure:=10; const integer cg_Rel_networkCongest:=11; const integer cg_Rel_expResetTimer:=12; const integer cg_Rel_expRecInacTimer:=13; const integer cg_Rel_reserved:=14; const integer cg_Rel_unqualified:=15; const integer cg_Rel_sCCPFailure:=16; //------------------------------------------------------------------------------ // Return Cause //------------------------------------------------------------------------------ const integer cg_Ret_noTransl4AddrNature:=0; const integer cg_Ret_noTransl4SpecifAddr:=1; const integer cg_Ret_subsystemCongestion:=2; const integer cg_Ret_subsystemFailure:=3; const integer cg_Ret_unequippedUser:=4; const integer cg_Ret_mTPFailure:=5; const integer cg_Ret_networkCongestion:=6; const integer cg_Ret_unqualified:=7; const integer cg_Ret_errorMessageTransport:=8; const integer cg_Ret_errorLocalProcessing:=9; const integer cg_Ret_destNoReassembly:=10; const integer cg_Ret_sCCPFailure:=11; const integer cg_Ret_hopCounterViolation:=12; const integer cg_Ret_segmeNotSupported:=13; const integer cg_Ret_segmentationFailure:=14; //------------------------------------------------------------------------------ // Reset Cause //------------------------------------------------------------------------------ const integer cg_Res_endUserOrig:=0; const integer cg_Res_sCCPUserOrig:=1; const integer cg_Res_messOutOfOrder_incPs:=2; const integer cg_Res_messOutOfOrder_incPr:=3; const integer cg_Res_remProcErr_messOutOfWindow:=4; const integer cg_Res_remProcErr_IncPsAfterReinit:=5; const integer cg_Res_remProcErr_general:=6; const integer cg_Res_remEndUserOperational:=7; const integer cg_Res_networkOperational:=8; const integer cg_Res_accessOperational:=9; const integer cg_Res_networkCongestion:=10; const integer cg_Res_reserved:=11; const integer cg_Res_unqualified:=12; //------------------------------------------------------------------------------ //Error Cause //------------------------------------------------------------------------------ const integer cg_Err_unassignedDestinationLRN:=0 ; const integer cg_Err_inconsistentSourceLRN:=1 ; const integer cg_Err_pointCodeMismatch:=2 ; const integer cg_Err_serviceClassMismatch:=3 ; const integer cg_Err_unqualified:=4 ; //------------------------------------------------------------------------------ //Refusal Cause //------------------------------------------------------------------------------ const integer cg_Ref_endUserOrigin:=0; const integer cg_Ref_endUserConges:=1; const integer cg_Ref_endUserFailure:=2; const integer cg_Ref_sCCPUserOrigin:=3; const integer cg_Ref_destAddrUnkn:=4; const integer cg_Ref_destInaccess:=5; const integer cg_Ref_qOSNotAvail_nonTransient:=6; const integer cg_Ref_qOSNotAvail_transient:=7; const integer cg_Ref_accessFailure:=8; const integer cg_Ref_accessCongestion:=9; const integer cg_Ref_subsystemFailure:=10; const integer cg_Ref_subsystemCongest:=11; const integer cg_Ref_expConnEstTimer:=12; const integer cg_Ref_incomUserData:=13; const integer cg_Ref_reserved:=14; const integer cg_Ref_unqualified:=15; const integer cg_Ref_hopCounterViol:=16; const integer cg_Ref_sCCPFailure:=17; const integer cg_Ref_noTransl4address:=18; const integer cg_Ref_unequippedUser:=19; //------------------------------------------------------------------------------ // Originator //------------------------------------------------------------------------------ const integer cg_Undefined:=0; const integer cg_NSU:=1; const integer cg_NSP:=2; //------------------------------------------------------------------------------ // CREF Reason //------------------------------------------------------------------------------ const integer cg_CREF_endUserOrig:=0; const integer cg_CREF_endUserCong:=1; const integer cg_CREF_endUserFailure:=2; const integer cg_CREF_SCCPUserOrig:=3; const integer cg_CREF_destAddrUnknwn_NT:=4; const integer cg_CREF_destInaccg_T:=5; const integer cg_CREF_QOSUnavail_NT:=6; const integer cg_CREF_QOSUnavail_T:=7; const integer cg_CREF_accessFailure:=8; const integer cg_CREF_accessCong:=9; const integer cg_CREF_destInaccg_NT:=10; const integer cg_CREF_subsystCong:=11; const integer cg_CREF_unspec_T:=12; const integer cg_CREF_incompInfo:=13; const integer cg_CREF_unspec_NT:=15; const integer cg_CREF_undef:=16; const integer cg_CREF_hopCntrViolation:=18; //------------------------------------------------------------------------------ // DISC Reason //------------------------------------------------------------------------------ const integer cg_DISC_normal:=20; const integer cg_DISC_endUserCong:=21; const integer cg_DISC_endUserFailure:=22; const integer cg_DISC_SCCPUserOrig:=23; const integer cg_DISC_abnormal_T:=24; const integer cg_DISC_accessFailure:=28; const integer cg_DISC_accessCong:=29; const integer cg_DISC_abnormal_NT:=30; const integer cg_DISC_subsystCong:=31; const integer cg_DISC_undef:=32; const integer cg_DISC_incompInfo:=33; const integer cg_DISC_abnormal:=35; //------------------------------------------------------------------------------ // RESET Reason //------------------------------------------------------------------------------ const integer cg_RESET_userSynch:= 40 ; const integer cg_RESET_unspec:= 41 ; const integer cg_RESET_netCong:= 42 ; const integer cg_RESET_undef:= 43 ; //------------------------------------------------------------------------------ //Mapping Refusal Cause to Reason and Originator A.1/Q.713 //------------------------------------------------------------------------------ const integer cg_Mapping_RefCause_Orig[20]:= { cg_NSU, cg_NSU, cg_NSU, cg_NSU, cg_NSP, cg_NSP, cg_NSP, cg_NSP, cg_NSU, cg_NSU, cg_NSP, cg_NSU, cg_NSP, cg_NSU, cg_NSP, cg_Undefined, cg_NSP, cg_Undefined, cg_NSP, cg_NSP }; const integer cg_Mapping_RefCause_Reason[20]:= { cg_CREF_endUserOrig, cg_CREF_endUserCong, cg_CREF_endUserFailure, cg_CREF_SCCPUserOrig, cg_CREF_destAddrUnknwn_NT, cg_CREF_destInaccg_T, cg_CREF_QOSUnavail_NT, cg_CREF_QOSUnavail_T, cg_CREF_accessFailure, cg_CREF_accessCong, cg_CREF_destInaccg_NT, cg_CREF_subsystCong, cg_CREF_unspec_T, cg_CREF_incompInfo, cg_CREF_unspec_T, cg_CREF_undef, cg_CREF_hopCntrViolation, cg_CREF_undef, cg_CREF_destAddrUnknwn_NT, cg_CREF_destInaccg_NT }; //------------------------------------------------------------------------------ //Mapping Release Cause to Reason and Originator A.2/Q.713 //------------------------------------------------------------------------------ const integer cg_Mapping_RelCause_Orig[17]:= { cg_NSU, cg_NSU, cg_NSU, cg_NSU, cg_NSP, cg_NSP, cg_NSU, cg_NSU, cg_NSP, cg_NSU, cg_NSP, cg_NSP, cg_NSP, cg_NSP, cg_Undefined, cg_Undefined, cg_NSP }; //mapping CREF-> ASP_SCCP_N_DISCONNECT_ind: //Reason:=cg_Mapping_RefCause_Reason[RefCause]; //Originator:=cg_Mapping_RefCause_Orig[RefCause]; //mapping ASP_SCCP_N_DISCONNECT_req-> CREF: // const integer cg_Mapping_RelCause_Reason[17]:= { cg_DISC_normal, cg_DISC_endUserCong, cg_DISC_endUserFailure, cg_DISC_SCCPUserOrig, cg_DISC_abnormal_T, cg_DISC_abnormal_T, cg_DISC_accessFailure, cg_DISC_accessCong, cg_DISC_abnormal_NT, cg_DISC_subsystCong, cg_DISC_abnormal_NT, cg_DISC_abnormal_T, cg_DISC_abnormal_T, cg_DISC_abnormal_T, cg_DISC_undef, cg_DISC_undef, cg_DISC_abnormal_NT }; //mapping RLSD-> ASP_SCCP_N_DISCONNECT_ind: //Reason:=cg_Mapping_RelCause_Reason[RelCause]; //Originator:=cg_Mapping_RelCause_Orig[RelCause]; //mapping ASP_SCCP_N_DISCONNECT_req-> RLSD: // //------------------------------------------------------------------------------ //Mapping Reset Cause to Reason and Originator A.2/Q.713 //------------------------------------------------------------------------------ const integer cg_Mapping_ResCause_Orig[12]:= { cg_NSU, cg_NSU, cg_NSP, cg_NSP, cg_NSP, cg_NSP, cg_NSP, cg_NSU, cg_NSP, cg_NSU, cg_NSP, cg_Undefined }; const integer cg_Mapping_ResCause_Reason[12]:= { cg_RESET_userSynch, cg_RESET_userSynch, cg_RESET_unspec, cg_RESET_unspec, cg_RESET_unspec, cg_RESET_unspec, cg_RESET_unspec, cg_RESET_userSynch, cg_RESET_unspec, cg_RESET_userSynch, cg_RESET_netCong, cg_RESET_undef }; //mapping RSR-> ASP_SCCP_N_DISCONNECT_ind: //Reason:=cg_Mapping_ResCause_Reason[ResCause]; //Originator:=cg_Mapping_ResCause_Orig[ResCause]; //mapping ASP_SCCP_N_DISCONNECT_req-> RSR: // const integer cg_TimerArraySize := 16; }//endgroup SCCPConstants //****************************************************************************** // PDU templates //****************************************************************************** group PDUTemplateDefinitionsSending { //****************************************************************************** // Message Connection Request (CR) (Q713 $4.2) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_ConnectionRequest t_PDU_SCCP_ConnectionRequest ( SCCP_param_SourceLocalReference pl_SLR, SCCP_param_ProtocolClass pl_Proto_Class, SCCP_param_CPartyAddressEnc pl_CalledAddress, template SCCP_param_Credit_opt pl_credit, template SCCP_param_CPartyAddressEnc_opt pl_CallingAddress , template SCCP_param_Data_opt pl_Data, template SCCP_param_HopCounter_opt pl_HopCntr, template SCCP_param_Importance_opt pl_Imp, template SCCP_param_EndOfOptionalParams pl_eop ):= { messageType:=cr, sourceLocRef:=pl_SLR, protClass:=pl_Proto_Class, pointer1:=2, pointer2:=0, calledPAddress:=pl_CalledAddress, optionalPart:= { credit:=pl_credit, callingPAddress:=pl_CallingAddress, data:=pl_Data, hopCounter:=pl_HopCntr, importance:=pl_Imp }, eop:=pl_eop } //****************************************************************************** // Message Connection Confirm (CC) (Q713 $4.3) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_ConnectionConfirm t_PDU_SCCP_ConnectionConfirm ( SCCP_param_DestLocalReference pl_DLR, SCCP_param_SourceLocalReference pl_SLR, SCCP_param_ProtocolClass pl_Proto_Class, template SCCP_param_Credit_opt pl_credit, template SCCP_param_CPartyAddressEnc_opt pl_CalledAddress, template SCCP_param_Data_opt pl_Data, template SCCP_param_Importance_opt pl_Imp, template SCCP_param_EndOfOptionalParams pl_eop ):= { messageType:=cc, destLocRef:=pl_DLR, sourceLocRef:=pl_SLR, protClass:=pl_Proto_Class, pointer1:=1, optionalPart:= { credit:=pl_credit, calledPAddress:=pl_CalledAddress, data:=pl_Data, importance:=pl_Imp }, eop:=pl_eop } //****************************************************************************** // Message Connection Refused (CREF) (Q713 $4.4) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_ConnectionRefused t_PDU_SCCP_ConnectionRefused ( SCCP_param_DestLocalReference pl_DLR, SCCP_param_RefusalCause pl_RefCause, template SCCP_param_CPartyAddressEnc_opt pl_CalledAddress, template SCCP_param_Data_opt pl_Data, template SCCP_param_Importance_opt pl_Imp, template SCCP_param_EndOfOptionalParams pl_eop ):= { messageType:=cref, destLocRef:=pl_DLR, refusalCause:=pl_RefCause, pointer1:=1, optionalPart:= { calledPAddress:=pl_CalledAddress, data:=pl_Data, importance:=pl_Imp }, eop:=pl_eop } //****************************************************************************** // Message Released (RLSD) (Q713 $4.5) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_Released t_PDU_SCCP_Released ( OCT3 pl_DLR, OCT3 pl_SLR, SCCP_param_ReleaseCause pl_RelCause, template SCCP_param_Data_opt pl_Data, template SCCP_param_Importance_opt pl_Imp, template SCCP_param_EndOfOptionalParams pl_eop ):= { messageType:=rlsd, destLocRef:=pl_DLR, sourceLocRef:=pl_SLR, releaseCause:=pl_RelCause, pointer1:=1, optionalPart:= { data:=pl_Data, importance:=pl_Imp }, eop:=pl_eop } //****************************************************************************** // Message Release Complete (RLC) (Q713 $4.6) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_ReleaseComplete t_PDU_SCCP_ReleaseComplete ( OCT3 pl_DLR, OCT3 pl_SLR ):= { messageType:=rlc, destLocRef:=pl_DLR, sourceLocRef:=pl_SLR } //****************************************************************************** // Message Data form 1 (DT1) (Q713 $4.7) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_DataForm1 t_PDU_SCCP_DataForm1 ( OCT3 pl_DLR, SCCP_param_SegmentingReassembl pl_SegmReasm, SCCP_param_Data pl_Data ):= { messageType:=dt1, destLocRef:=pl_DLR, segmentingReassembl:=pl_SegmReasm, pointer1:=1, data:=pl_Data } //****************************************************************************** // Message Data form 2 (DT2) (Q713 $4.8) //****************************************************************************** //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // Message Data Acknowledgement (AK) (Q713 $4.9) //****************************************************************************** //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // Message Unitdata (UDT) (Q713 $4.10) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_Unitdata t_PDU_SCCP_Unitdata ( SCCP_param_ProtocolClass pl_Proto_Class, SCCP_param_CPartyAddressEnc pl_CalledAddress, SCCP_param_CPartyAddressEnc pl_CallingAddress, SCCP_param_Data pl_Data ):= { messageType :=udt, protClass :=pl_Proto_Class, pointer1:=3, pointer2:=0, pointer3:=0, calledPAddress := pl_CalledAddress, callingPAddress := pl_CallingAddress, data:=pl_Data } //****************************************************************************** // Message Unitdata service (UDTS) (Q713 $4.11) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_UnitdataService t_PDU_SCCP_UnitdataService ( SCCP_param_ReturnCause pl_RetCause, SCCP_param_CPartyAddressEnc pl_CalledAddress, SCCP_param_CPartyAddressEnc pl_CallingAddress, SCCP_param_Data pl_Data ):= { messageType:=udts, returnCause:=pl_RetCause, pointer1:=3, pointer2:=0, pointer3:=0, calledPAddress:=pl_CalledAddress, callingPAddress:=pl_CallingAddress, data:=pl_Data } //****************************************************************************** // Message Expedited Data (ED) (Q713 $4.12) //****************************************************************************** //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // Message Expedited Data Acknowledgement (EA) (Q713 $4.13) //****************************************************************************** //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // Message Reset Request (RSR) (Q713 $4.14) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_ResetRequest t_PDU_SCCP_ResetRequest ( SCCP_param_DestLocalReference pl_DLR, SCCP_param_SourceLocalReference pl_SLR, SCCP_param_ResetCause pl_ResCause ):= { messageType:=rsr, destLocRef:=pl_DLR, sourceLocRef:=pl_SLR, resetCause:=pl_ResCause } //****************************************************************************** // Message Reset Confirmation (RSC) (Q713 $4.15) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_ResetConfirm t_PDU_SCCP_ResetConfirm ( SCCP_param_DestLocalReference pl_DLR, SCCP_param_SourceLocalReference pl_SLR ):= { messageType:=rsr, destLocRef:=pl_DLR, sourceLocRef:=pl_SLR } //****************************************************************************** // Message Protocol data unit error (ERR) (Q713 $4.16) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_ProtDataUnitError t_PDU_SCCP_ProtDataUnitError ( SCCP_param_DestLocalReference pl_DLR, SCCP_param_ErrorCause pl_ErrCause ):= { messageType:=rsr, destLocRef:=pl_DLR, errorCause:=pl_ErrCause } //****************************************************************************** // Message Inactivity test (IT) (Q713 $4.17) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_InactivityTest t_PDU_SCCP_InactivityTest ( SCCP_param_DestLocalReference pl_DLR, SCCP_param_SourceLocalReference pl_SLR, SCCP_param_ProtocolClass pl_Proto_Class, SCCP_param_SequencingSegmenting pl_SeqSegm, SCCP_param_Credit pl_credit ):= { messageType:=it, destLocRef:=pl_DLR, sourceLocRef:=pl_SLR, protClass:=pl_Proto_Class, sequencingSegmenting:=pl_SeqSegm, credit:=pl_credit } //****************************************************************************** // Message Extended Unitdata (XUDT) (Q713 $4.18) //****************************************************************************** //------------------------------------------------------------------------------ template PDU_SCCP_ExtUnitdata t_PDU_SCCP_ExtUnitdata ( SCCP_param_ProtocolClass pl_Proto_Class, SCCP_param_HopCounter pl_hopCounter, SCCP_param_CPartyAddressEnc pl_calledPAddress, SCCP_param_CPartyAddressEnc pl_callingPAddress, SCCP_param_Data pl_data, template SCCP_param_Segmentation_opt pl_segm, template SCCP_param_Importance_opt pl_imp ):= { messageType:= xudt, protClass:=pl_Proto_Class, hopCounter:=pl_hopCounter, pointer1:=0, pointer2:=0, pointer3:=0, pointer4:=0, calledPAddress:=pl_calledPAddress, callingPAddress:=pl_callingPAddress, data := pl_data, optionalPart:= { segmentation:=pl_segm, importance := pl_imp }, eop:= { paramName:=con_SCCP_eop } } //****************************************************************************** // Message Extended Unitdata Service(XUDTS) (Q713 $4.19) //****************************************************************************** //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // Message Long Unitdata (LUDT) (Q713 $4.20) //****************************************************************************** //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // Message Long Unitdata Service (LUDTS) (Q713 $4.21) //****************************************************************************** //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // SCCP management messages (Q713 $5.3) //****************************************************************************** //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ }//endgroup PDUTemplateDefinitionsSending //****************************************************************************** group PDUTemplateDefinitionsReceiving { //****************************************************************************** // Message Connection Request (CR) (Q713 $4.2) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_ConnectionRequest tr_PDU_SCCP_ConnectionRequest:= { messageType:=cr, sourceLocRef:=?, protClass:=?, pointer1:=?, pointer2:=?, calledPAddress:=?, optionalPart:= { credit:=*, callingPAddress:=*, data:=*, hopCounter:=*, importance:=* }, eop:=* } //****************************************************************************** // Message Connection Confirm (CC) (Q713 $4.3) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_ConnectionConfirm tr_PDU_SCCP_ConnectionConfirm:= { messageType:=cc, destLocRef:=?, sourceLocRef:=?, protClass:=?, pointer1:=?, optionalPart:= { credit:=*, calledPAddress:=*, data:=*, importance:=* }, eop:=* } //****************************************************************************** // Message Connection Refused (CREF) (Q713 $4.4) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_ConnectionRefused tr_PDU_SCCP_ConnectionRefused:= { messageType:=cref, destLocRef:=?, refusalCause:=?, pointer1:=?, optionalPart:= { calledPAddress:=*, data:=*, importance:=* }, eop:=* } //****************************************************************************** // Message Released (RLSD) (Q713 $4.5) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_Released tr_PDU_SCCP_Released:= { messageType:=rlsd, destLocRef:=?, sourceLocRef:=?, releaseCause:=?, pointer1:=?, optionalPart:= { data:=*, importance:=* }, eop:=* } //****************************************************************************** // Message Release Complete (RLC) (Q713 $4.6) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_ReleaseComplete tr_PDU_SCCP_ReleaseComplete:= { messageType:=rlc, destLocRef:=?, sourceLocRef:=? } //****************************************************************************** // Message Data form 1 (DT1) (Q713 $4.7) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_DataForm1 tr_PDU_SCCP_DataForm1:= { messageType:=dt1, destLocRef:=?, segmentingReassembl:=?, pointer1:=?, data:=? } //****************************************************************************** // Message Data form 2 (DT2) (Q713 $4.8) //****************************************************************************** //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // Message Data Acknowledgement (AK) (Q713 $4.9) //****************************************************************************** //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // Message Unitdata (UDT) (Q713 $4.10) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_Unitdata tr_PDU_SCCP_Unitdata:= { messageType:=udt, protClass:=?, pointer1:=?, pointer2:=?, pointer3:=?, calledPAddress:=?, callingPAddress:=?, data:=? } //****************************************************************************** // Message Unitdata service (UDTS) (Q713 $4.11) //****************************************************************************** //------------------------------------------------------------------------------ // Message definition //------------------------------------------------------------------------------ template PDU_SCCP_UnitdataService tr_PDU_SCCP_UnitdataService:= { messageType:=udts, returnCause:=?, pointer1:=?, pointer2:=?, pointer3:=?, calledPAddress:=?, callingPAddress:=?, data:=? } //****************************************************************************** // Message Expedited Data (ED) (Q713 $4.12) //****************************************************************************** //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // Message Expedited Data Acknowledgement (EA) (Q713 $4.13) //****************************************************************************** //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // Message Reset Request (RSR) (Q713 $4.14) //****************************************************************************** template PDU_SCCP_ResetRequest tr_PDU_SCCP_ResetRequest:= { messageType:=rsr, destLocRef:=?, sourceLocRef:=?, resetCause:=? } //****************************************************************************** // Message Reset Confirmation (RSC) (Q713 $4.15) //****************************************************************************** template PDU_SCCP_ResetConfirm tr_PDU_SCCP_ResetConfirm:= { messageType:=rsr, destLocRef:=?, sourceLocRef:=? } //****************************************************************************** // Message Protocol data unit error (ERR) (Q713 $4.16) //****************************************************************************** template PDU_SCCP_ProtDataUnitError tr_PDU_SCCP_ProtDataUnitError:= { messageType:=rsr, destLocRef:=?, errorCause:=? } //****************************************************************************** // Message Inactivity test (IT) (Q713 $4.17) //****************************************************************************** template PDU_SCCP_InactivityTest tr_PDU_SCCP_InactivityTest:= { messageType:=it, destLocRef:=?, sourceLocRef:=?, protClass:=?, sequencingSegmenting:=?, credit:=? } //****************************************************************************** // Message Extended Unitdata (XUDT) (Q713 $4.18) //****************************************************************************** template PDU_SCCP_ExtUnitdata tr_PDU_SCCP_ExtUnitdata := { messageType:=xudt, protClass:= ?, //connection oriented but no flow control hopCounter:=?, pointer1:=?, pointer2:=?, pointer3:=?, pointer4:=?, calledPAddress:=?, callingPAddress:=?, data := ?, optionalPart:= { segmentation:=*, importance := * }, eop:= * } //------------------------------------------------------------------------------ //****************************************************************************** // Message Extended Unitdata Service(XUDTS) (Q713 $4.19) //****************************************************************************** //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // Message Long Unitdata (LUDT) (Q713 $4.20) //****************************************************************************** //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // Message Long Unitdata Service (LUDTS) (Q713 $4.21) //****************************************************************************** //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ //****************************************************************************** // SCCP management messages (Q713 $5.3) //****************************************************************************** //------------------------------------------------------------------------------ // Not supported //------------------------------------------------------------------------------ }//endgroup PDUTemplateDefinitionsReceiving type record of boolean Timer_Snapshot; type enumerated TimerIdentifierType {conn_est, ias, iar, rel, repeat_rel, int, reset,internal_reset, t_guard}; type component SCCP_CT { //startcomponent SCCP_CT //Component variables //*************************************************************** // Connection Oriented Signalling: // StateTransition-> ConnectionData; var ConnectionData ConnectionTable[16]; //16 connections 0 to 15 var integer v_session; // actual conn. oriented session index // Connectioenless Signalling: //== sending == var OCT3 segmLocRefTable[16]; var integer v_segmLocRefIndex; // last index in segmLocRefTable, cyclical incremented //==receiving== var ClessRcvBuff ClessRcvBuffTable[16]; var integer v_reference; // not used ??? var hexstring v_own_GT; var hexstring v_remote_GT; var integer v_SSN; var OCT1 v_SIO; var integer v_NI; //network indicator, if NI<2 => international var integer v_own_SPC; var integer v_remote_SPC; var integer v_SLS; var SCCP_ServiceType v_SCCPServiceType; //enum: itu, ansi, ttc or mpt //var v_maxLocalReference; // Local Reference max. value, see in SCCP.ttcn var integer v_PC_length; //length of point code, calculated at start! NOT USED var integer v_RoutingLabelLen; //in bytes var integer v_sccp_data_maxlen; // dt1 payload length upper limit var integer v_sccp_pdu_maxlen; // SIF len -routing label len var Timer_Snapshot v_T_conn_est; var Timer_Snapshot v_T_ias; var Timer_Snapshot v_T_iar; var Timer_Snapshot v_T_rel; var Timer_Snapshot v_T_repeat_rel; var Timer_Snapshot v_T_int; var Timer_Snapshot v_T_reset; var Timer_Snapshot v_T_internal_reset; var Timer_Snapshot v_T_guard; //var Timer_Snapshot v_T_T_guard; //*************************************************************** port SCCPasp_SP_PT SCCP_SP_PORT;//port type defined in SCCP_ASPs port MTP3asp_SCCP_PT MTP3_SCCP_PORT; //component timers timer T_conn_est[cg_TimerArraySize]; timer T_ias[cg_TimerArraySize]; timer T_iar[cg_TimerArraySize]; timer T_rel[cg_TimerArraySize]; timer T_repeat_rel[cg_TimerArraySize]; timer T_int[cg_TimerArraySize]; /* timer T_T_guard[cg_TimerArraySize]; */ timer T_reset[cg_TimerArraySize]; timer T_internal_reset[cg_TimerArraySize]; timer T_guard[cg_TimerArraySize]; }//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(tspc_timer_T_conn_est); 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(tspc_timer_T_ias); 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(tspc_timer_T_iar); 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(tspc_timer_T_rel); 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(tspc_timer_T_repeat_rel); 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(tspc_timer_T_int); 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(tspc_timer_T_reset); 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(tspc_timer_T_internal_reset); 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(tspc_timer_guard); v_T_guard[pl_TimerIndex] := true; } else{ T_guard[pl_TimerIndex].start(pl_duration); v_T_guard[pl_TimerIndex] := true; } } case else {log("Warning: Incorrect Timer!")} } } //****************************************************************** function f_StopTimer(TimerIdentifierType pl_TimerIdentifier,integer pl_TimerIndex) runs on SCCP_CT //****************************************************************** { select (pl_TimerIdentifier) { case(conn_est) { T_conn_est[pl_TimerIndex].stop; v_T_conn_est[pl_TimerIndex] := false; } case(ias) { T_ias[pl_TimerIndex].stop; v_T_ias[pl_TimerIndex] := false; } case(iar) { T_iar[pl_TimerIndex].stop; v_T_iar[pl_TimerIndex] := false; } case(rel) { T_rel[pl_TimerIndex].stop; v_T_rel[pl_TimerIndex] := false; } case(repeat_rel) { T_repeat_rel[pl_TimerIndex].stop; v_T_repeat_rel[pl_TimerIndex] := false; } case(int) { T_int[pl_TimerIndex].stop; v_T_int[pl_TimerIndex] := false; } case(reset) { T_reset[pl_TimerIndex].stop; v_T_reset[pl_TimerIndex] := false; } case(internal_reset) { T_internal_reset[pl_TimerIndex].stop; v_T_internal_reset[pl_TimerIndex] := false; } case(t_guard) { T_guard[pl_TimerIndex].stop; v_T_guard[pl_TimerIndex] := false; } case else {log("Warning: Incorrect Timer!")} } } //****************************************************************** function f_initialize_timer_states() runs on SCCP_CT //****************************************************************** { var integer i; for (i:=0; i= 2) { v_RoutingLabelLen := 5; } else { v_RoutingLabelLen := 4; } } else if( v_SCCPServiceType == m3ua ) { v_RoutingLabelLen := 4; // not really... //v_sccp_data_maxlen := 261; } else if ( (v_SCCPServiceType == mtp3_mpt)) { if(v_NI== 2) { v_RoutingLabelLen := 7; } else { v_RoutingLabelLen := 4; } } else { log( "Wrong SCCPServiceType value was selected in the config file"); log("Modified for default value 'mtp3_itu'."); v_SCCPServiceType := mtp3_itu; v_RoutingLabelLen := 4; //itu } // mtp3_itu_b i.e. itu mtp3b // SCCP_ansi_b i.e ansi mtp3b settings ??? //272= max length of SIF, see Fig3-3B/T1.111.4-2001 //temp for test: 10 ? //tsp_SIF_MaxLength = 272 v_sccp_pdu_maxlen := tsp_SIF_MaxLength - v_RoutingLabelLen; // -; //7: msg_type+locref+ptr+len log("v_sccp_pdu_maxlen:",v_sccp_pdu_maxlen); v_sccp_data_maxlen := v_sccp_pdu_maxlen-7; // dt1 payload // -7: msg_type+locref+ptr+len for (vl_j:=0;vl_jMTP3 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 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) 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) 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) 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) 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) return SCCP_PAR_Address { var SCCP_PAR_Address vl_ASPAddress; var SCCP_ASPfield_GlobalTitle tmpGT; // the same for itu, ansi and ttc var SCCP_param_CPartyAddress_mpt vl_PDUAddress; vl_PDUAddress := dec_PDU_SCCP_Address_mpt( pl_PDUAddress.addr ); vl_ASPAddress.addressIndicator.pointCodeIndic := vl_PDUAddress.addressIndicator.pointCodeIndic; vl_ASPAddress.addressIndicator.ssnIndicator := vl_PDUAddress.addressIndicator.ssnIndicator; vl_ASPAddress.addressIndicator.globalTitleIndic := vl_PDUAddress.addressIndicator.globalTitleIndic; vl_ASPAddress.addressIndicator.routingIndicator := vl_PDUAddress.addressIndicator.routingIndicator; if (ispresent ( vl_PDUAddress.signPointCode)) { vl_ASPAddress.signPointCode:= vl_PDUAddress.signPointCode; } else { vl_ASPAddress.signPointCode := omit; } if (ispresent (vl_PDUAddress.subsystemNumber )) { //always suggested ... vl_ASPAddress.subsystemNumber:= vl_PDUAddress.subsystemNumber; } else { vl_ASPAddress.subsystemNumber:=omit; } if( ispresent( vl_PDUAddress.globalTitle)){ if (ischosen (vl_PDUAddress.globalTitle.gti0001)) { tmpGT.gti0001.natureOfAddress:=vl_PDUAddress.globalTitle.gti0001.natureOfAddress; tmpGT.gti0001.oddeven:=vl_PDUAddress.globalTitle.gti0001.oddeven; tmpGT.gti0001.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0001.globalTitleAddress; vl_ASPAddress.globalTitle:=tmpGT; } else if (ischosen (vl_PDUAddress.globalTitle.gti0010)) { tmpGT.gti0010.translationType:=vl_PDUAddress.globalTitle.gti0010.translationType; tmpGT.gti0010.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0010.globalTitleAddress; vl_ASPAddress.globalTitle:=tmpGT; } else if (ischosen (vl_PDUAddress.globalTitle.gti0011)) { tmpGT.gti0011.translationType :=vl_PDUAddress.globalTitle.gti0011.translationType; tmpGT.gti0011.encodingScheme :=vl_PDUAddress.globalTitle.gti0011.encodingScheme; tmpGT.gti0011.numberingPlan :=vl_PDUAddress.globalTitle.gti0011.numberingPlan; tmpGT.gti0011.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0011.globalTitleAddress; vl_ASPAddress.globalTitle :=tmpGT; } else if (ischosen (vl_PDUAddress.globalTitle.gti0100)) { tmpGT.gti0100.translationType :=vl_PDUAddress.globalTitle.gti0100.translationType; tmpGT.gti0100.encodingScheme :=vl_PDUAddress.globalTitle.gti0100.encodingScheme; tmpGT.gti0100.numberingPlan :=vl_PDUAddress.globalTitle.gti0100.numberingPlan; tmpGT.gti0100.natureOfAddress :=vl_PDUAddress.globalTitle.gti0100.natureOfAddress; //tmpGT.gti0100.reserved:='00'B; tmpGT.gti0100.globalTitleAddress:=vl_PDUAddress.globalTitle.gti0100.globalTitleAddress; vl_ASPAddress.globalTitle :=tmpGT; }; } else { vl_ASPAddress.globalTitle:= omit; }; return vl_ASPAddress; } //ConvertPDUEncodedAddressToASPAddress_mpt //================================================================== // MAIN CONVERSION FUNCTIONS: //================================================================== //****************************************************************** // function ConvertASPAddressToEncodedAddress // converts ASP address structure to PDU address structure // THIS IS THE MAIN ENCODE FUNCTION (coordinator) //****************************************************************** function ConvertASPAddressToEncodedAddress( in SCCP_PAR_Address pl_ASPAddress) runs on SCCP_CT return SCCP_param_CPartyAddressEnc { var SCCP_param_CPartyAddressEnc vl_PDUAddressEncoded; if( ( v_SCCPServiceType == mtp3_itu) or ( v_SCCPServiceType == mtp3b_itu)) { return ConvertASPAddressToEncodedAddress_itu( pl_ASPAddress ); } else if( (v_SCCPServiceType == mtp3_ansi) or (v_SCCPServiceType == mtp3b_ansi)) { return ConvertASPAddressToEncodedAddress_ansi( pl_ASPAddress ); } else if((v_SCCPServiceType == mtp3_ttc) or (v_SCCPServiceType == mtp3b_ttc)) { if( (v_SIO == '83'O) or (v_SIO == '43'O) or (v_SIO == 'C3'O) ) //ttc national { return ConvertASPAddressToEncodedAddress_ttc( pl_ASPAddress ); } else { //international == itu return ConvertASPAddressToEncodedAddress_itu( pl_ASPAddress ); } }//if1 else if((v_SCCPServiceType == mtp3_mpt)) { if( v_NI == 2 ) //mpt national { return ConvertASPAddressToEncodedAddress_mpt( pl_ASPAddress ); } else { //international == itu return ConvertASPAddressToEncodedAddress_itu( pl_ASPAddress ); } }//if1 else { log("Error in ConvertASPAddressToEncodedAddress: Unknown SCCPServiceType"); stop; } return vl_PDUAddressEncoded; // error!!! } //****************************************************************** // function ConvertPDUEncodedAddressToASPAddress // converts Encoded PDU Address into sturctured ASP Address // THIS IS THE MAIN DECODE FUNCTION (coordinator) //****************************************************************** function ConvertPDUEncodedAddressToASPAddress( in SCCP_param_CPartyAddressEnc pl_PDUAddress) runs on SCCP_CT return SCCP_PAR_Address { var SCCP_PAR_Address vl_dummyretval; if( (v_SCCPServiceType == mtp3_itu) or (v_SCCPServiceType == mtp3b_itu) ) { return ConvertPDUEncodedAddressToASPAddress_itu( pl_PDUAddress ); } else if( (v_SCCPServiceType == mtp3_ansi) or (v_SCCPServiceType == mtp3b_ansi) ) { return ConvertPDUEncodedAddressToASPAddress_ansi( pl_PDUAddress ); } else if( (v_SCCPServiceType == mtp3_ttc) or (v_SCCPServiceType == mtp3b_ttc)){ if( (v_SIO == '83'O) or (v_SIO == '43'O) or (v_SIO == 'C3'O) ) { //ttc national return ConvertPDUEncodedAddressToASPAddress_ttc( pl_PDUAddress ); } else { return ConvertPDUEncodedAddressToASPAddress_itu( pl_PDUAddress ); } } else if((v_SCCPServiceType == mtp3_mpt)) { if( v_NI == 2 ) //mpt national { return ConvertPDUEncodedAddressToASPAddress_mpt( pl_PDUAddress ); } else { //international == itu return ConvertPDUEncodedAddressToASPAddress_itu( pl_PDUAddress ); } } else { log("Error in function ConvertPDUEncodedAddressToASPAddress, Unknown SCCPSCCPType"); stop; } return vl_dummyretval; }//ConvertPDUEncodedAddressToASPAddress /* //************************************************************************* //************************************************************************* //EncDec ComponentBehaviour //************************************************************************* //************************************************************************* // TO DO:Desk check it! As I see, it's OK, but the meaning has been changed\ // because structure of PDU_SCCP has been changed //************************************************************************* function ScanRAWPorts() runs on SCCP_EncDec_CT //************************************************************************* { //local declarations var ASP_MTP3_TRANSFERind vl_ASP_MTP3_TRANSFERind; var ASP_MTP3_TRANSFERreq vl_ASP_MTP3_TRANSFERreq; var ASP_MTP3_TRANSFERreq_sccp vl_ASP_MTP3_TRANSFERreq_sccp var PDU_SCCP vl_PDU_SCCP; var integer vl_msg_type; while (true) { alt { //******************************************************************** //message received from SCCP , containing a PDU to be encoded //******************************************************************** []MTP3_SCCP_SP_PORT.receive( tr_ASP_MTP3_TRANSFERreq_sccp) -> value vl_ASP_MTP3_TRANSFERreq_sccp { var bitstring vl_sio_bit := oct2bit(vl_ASP_MTP3_TRANSFERreq_sccp.sio); var MTP3_Field_sio vl_sio_struct; vl_sio_struct.ni := substr(vl_sio_bit,0,2); vl_sio_struct.prio := substr(vl_sio_bit,2,2); vl_sio_struct.si := substr(vl_sio_bit,4,4); MTP3_PORT.send(t_ASP_MTP3_TRANSFERreq( vl_sio_struct, vl_ASP_MTP3_TRANSFERreq_sccp.opc, vl_ASP_MTP3_TRANSFERreq_sccp.dpc, vl_ASP_MTP3_TRANSFERreq_sccp.sls, enc_PDU_SCCP(vl_ASP_MTP3_TRANSFERreq_sccp.data) )); } //******************************************************************** //message received from MTP3 , containing an octetstring to be decoded: //******************************************************************** []MTP3_PORT.receive(tr_ASP_MTP3_TRANSFERind) -> value vl_ASP_MTP3_TRANSFERind {//startStatementBlock if (vl_ASP_MTP3_TRANSFERind.sio.si != '0011'B) { log("The received message is not SCCP. Ignored."); repeat; } vl_msg_type:= oct2int( vl_ASP_MTP3_TRANSFERind.data[0] ); select(vl_msg_type) { case (xudt) // '11'O { vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); MTP3_SCCP_SP_PORT.send( vl_PDU_SCCP.extudata ); } case (udt) //'09'O { //decode octetstring vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_Unitdata( vl_PDU_SCCP.unitdata.protClass, vl_PDU_SCCP.unitdata.calledPAddress, vl_PDU_SCCP.unitdata.callingPAddress, vl_PDU_SCCP.unitdata.data)); }//endif case (dt1)//'06'O { vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_DataForm1( vl_PDU_SCCP.dataform1.destLocRef, vl_PDU_SCCP.dataform1.segmentingReassembl, vl_PDU_SCCP.dataform1.data )); } case (cr) //'01'O {//startif vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); if (ispresent(vl_PDU_SCCP.connrequest.eop)) { MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ConnectionRequest( vl_PDU_SCCP.connrequest.sourceLocRef, vl_PDU_SCCP.connrequest.protClass, vl_PDU_SCCP.connrequest.calledPAddress, vl_PDU_SCCP.connrequest.optionalPart.credit, vl_PDU_SCCP.connrequest.optionalPart.callingPAddress, vl_PDU_SCCP.connrequest.optionalPart.data, vl_PDU_SCCP.connrequest.optionalPart.hopCounter, vl_PDU_SCCP.connrequest.optionalPart.importance, vl_PDU_SCCP.connrequest.eop )); } else { MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ConnectionRequest( vl_PDU_SCCP.connrequest.sourceLocRef, vl_PDU_SCCP.connrequest.protClass, vl_PDU_SCCP.connrequest.calledPAddress, vl_PDU_SCCP.connrequest.optionalPart.credit, vl_PDU_SCCP.connrequest.optionalPart.callingPAddress, vl_PDU_SCCP.connrequest.optionalPart.data, vl_PDU_SCCP.connrequest.optionalPart.hopCounter, vl_PDU_SCCP.connrequest.optionalPart.importance, omit )); } } case (cc) //'02'O { vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); if (ispresent(vl_PDU_SCCP.connconfirm.eop)) { MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ConnectionConfirm( vl_PDU_SCCP.connconfirm.destLocRef, vl_PDU_SCCP.connconfirm.sourceLocRef, vl_PDU_SCCP.connconfirm.protClass, vl_PDU_SCCP.connconfirm.optionalPart.credit, vl_PDU_SCCP.connconfirm.optionalPart.calledPAddress, vl_PDU_SCCP.connconfirm.optionalPart.data, vl_PDU_SCCP.connconfirm.optionalPart.importance, vl_PDU_SCCP.connconfirm.eop )); } else { MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ConnectionConfirm( vl_PDU_SCCP.connconfirm.destLocRef, vl_PDU_SCCP.connconfirm.sourceLocRef, vl_PDU_SCCP.connconfirm.protClass, vl_PDU_SCCP.connconfirm.optionalPart.credit, vl_PDU_SCCP.connconfirm.optionalPart.calledPAddress, vl_PDU_SCCP.connconfirm.optionalPart.data, vl_PDU_SCCP.connconfirm.optionalPart.importance, omit)); } } case (udts) //'0A'O {//startif vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_UnitdataService( vl_PDU_SCCP.udataserv.returnCause, vl_PDU_SCCP.udataserv.calledPAddress, vl_PDU_SCCP.udataserv.callingPAddress, vl_PDU_SCCP.udataserv.data)); }//endif case (rlsd) //'04'O { vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); if (ispresent(vl_PDU_SCCP.released.eop)) { MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_Released( vl_PDU_SCCP.released.destLocRef, vl_PDU_SCCP.released.sourceLocRef, vl_PDU_SCCP.released.releaseCause, vl_PDU_SCCP.released.optionalPart.data, vl_PDU_SCCP.released.optionalPart.importance, vl_PDU_SCCP.released.eop )); } else { MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_Released( vl_PDU_SCCP.released.destLocRef, vl_PDU_SCCP.released.sourceLocRef, vl_PDU_SCCP.released.releaseCause, vl_PDU_SCCP.released.optionalPart.data, vl_PDU_SCCP.released.optionalPart.importance, omit )); } } case (err)//'0F'O { vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ProtDataUnitError( vl_PDU_SCCP.pduerror.destLocRef, vl_PDU_SCCP.pduerror.errorCause )); } case (rlc)//'05'O { vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ReleaseComplete( vl_PDU_SCCP.relcomp.destLocRef, vl_PDU_SCCP.relcomp.sourceLocRef )); } case (it)//'10'O { vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_InactivityTest( vl_PDU_SCCP.inacttest.destLocRef, vl_PDU_SCCP.inacttest.sourceLocRef, vl_PDU_SCCP.inacttest.protClass, vl_PDU_SCCP.inacttest.sequencingSegmenting, vl_PDU_SCCP.inacttest.credit )); } case (rsr)//'0D'O { vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ResetRequest( vl_PDU_SCCP.resetreq.destLocRef, vl_PDU_SCCP.resetreq.sourceLocRef, vl_PDU_SCCP.resetreq.resetCause )); } case (rsc)//'0E'O { vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ResetConfirm( vl_PDU_SCCP.resconf.destLocRef, vl_PDU_SCCP.resconf.sourceLocRef )); }//endif case (cref)//'03'O { vl_PDU_SCCP:=dec_PDU_SCCP(vl_ASP_MTP3_TRANSFERind.data); if (ispresent(vl_PDU_SCCP.connrefused.eop)) { MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ConnectionRefused( vl_PDU_SCCP.connrefused.destLocRef, vl_PDU_SCCP.connrefused.refusalCause, vl_PDU_SCCP.connrefused.optionalPart.calledPAddress, vl_PDU_SCCP.connrefused.optionalPart.data, vl_PDU_SCCP.connrefused.optionalPart.importance, vl_PDU_SCCP.connrefused.eop )); } else { MTP3_SCCP_SP_PORT.send( t_PDU_SCCP_ConnectionRefused( vl_PDU_SCCP.connrefused.destLocRef, vl_PDU_SCCP.connrefused.refusalCause, vl_PDU_SCCP.connrefused.optionalPart.calledPAddress, vl_PDU_SCCP.connrefused.optionalPart.data, vl_PDU_SCCP.connrefused.optionalPart.importance, omit )); } } case (xudts,ludt,ludts) { log ("Unsupported connectionless message ((-XUDT or)) XUDTS or LUDT or LUDTS - received and discarded"); } case (dt2,ak,ed,ea ) { log ("Unsupported connection-oriented message -DT2 or AK or ED or EA - received and discarded"); } case else { log ("Unrecognized message received and discarded"); } } }//endStatementBlock }//endalt }//endwhile }//endfunction */ //****************************************************************** // // working functions for ScanEvents // //****************************************************************** //****************************************************************** // Part 1 : Receiving msg on port "MTP3_SCCP_PORT" //****************************************************************** //****************************************************************** // processing_PDU_SCCP_Unitdata //****************************************************************** function processing_PDU_SCCP_Unitdata( in PDU_SCCP_Unitdata pl_PDU_SCCP_Unitdata) runs on SCCP_CT { //var PDU_SCCP_Unitdata vl_PDU_SCCP_Unitdata; var PDU_SCCP vl_PDU_SCCP; var ASP_SCCP_N_UNITDATA_ind vl_N_UNITDATA_ind; vl_PDU_SCCP.unitdata:= pl_PDU_SCCP_Unitdata; // it should be decoded to structure to read if it is a mgmt message or not vl_N_UNITDATA_ind.calledAddress := ConvertPDUEncodedAddressToASPAddress(pl_PDU_SCCP_Unitdata.calledPAddress); if ( ispresent(vl_N_UNITDATA_ind.calledAddress.subsystemNumber) and vl_N_UNITDATA_ind.calledAddress.subsystemNumber != cg_SSN_sCCPmanagement) //SCCP mgmt message {//startif1 //no SCCP or node congestion assumed //'route on SSN' assumed //subsystems are assumed equipped and available //as the message is received from MTP3 , DPC is assumed to be matching the PC of the own node without // any further checks //assemble ASP_SCCP_N_ vl_N_UNITDATA_ind.callingAddress:= ConvertPDUEncodedAddressToASPAddress(pl_PDU_SCCP_Unitdata.callingPAddress); // Wrong old: //vl_N_UNITDATA_ind.sequenceControl:= // '0000000'B&pl_PDU_SCCP_Unitdata.protClass.class[0]; // Q.713/3.6 0.bit=1=>seq msb??? vl_N_UNITDATA_ind.sequenceControl:= '0000000'B&pl_PDU_SCCP_Unitdata.protClass.class[3]; if( pl_PDU_SCCP_Unitdata.protClass.messageHandling == '1000'B ) { vl_N_UNITDATA_ind.returnOption := '00000001'B; } else { vl_N_UNITDATA_ind.returnOption := '00000000'B; } //connectionless-class 0 or 1 //protocol class 0- SCCP_sequence_ctrl_off //protocol class 1- SCCP_sequence_ctrl_on // wrong: vl_N_UNITDATA_ind.returnOption :='0000000'B&pl_PDU_SCCP_Unitdata.protClass.messageHandling[3]; //only two values( '0000'B -no special options //and '1000'B -return message on error) assumed //octetstring vs. length+octetstring vl_N_UNITDATA_ind.userData :=pl_PDU_SCCP_Unitdata.data.data; vl_N_UNITDATA_ind.importance := omit; SCCP_SP_PORT.send( vl_N_UNITDATA_ind ); }//endif1 else { //startelse1-SCCPmanagement message log ("SCCP management message received"); var octetstring vl_data; vl_data:=pl_PDU_SCCP_Unitdata.data.data; vl_PDU_SCCP.unitdata.messageType:=udt ; vl_PDU_SCCP.unitdata.calledPAddress:=pl_PDU_SCCP_Unitdata.callingPAddress; vl_PDU_SCCP.unitdata.callingPAddress:=pl_PDU_SCCP_Unitdata.calledPAddress; if ((vl_data[0]=='03'O) and //SST message ((v_SSN==0) or (oct2int(vl_data[1])==v_SSN))) //right SSN {//startif2 //send Unitdata with SSA vl_PDU_SCCP.unitdata.data.data[0]:='01'O;//Change to SSA MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Unitdata_SSA }//endif2 else if ((vl_data[0]=='02'O) and //SSP message ((v_SSN==0) or (oct2int(vl_data[1])==v_SSN))) //right SSN {//startif2 //send Unitdata with SST vl_PDU_SCCP.unitdata.data.data[0]:='03'O;//Change to SST MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Unitdata_SST }//endif2 else if ((vl_data[0]=='01'O) and //SSA message ((v_SSN==0) or (oct2int(vl_data[1])==v_SSN))) //right SSN {//startif2 //send Unitdata with SS MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP ));//send Unitdata_SSA }//endif2 else { log("Unsupported (or containing inconsistent SSN)SCCP management message received and discarded") } }//endelse1 return; } // processing_PDU_SCCP_Unitdata() //****************************************************************** // processing_PDU_SCCP_UnitdataService //****************************************************************** function processing_PDU_SCCP_UnitdataService( in PDU_SCCP_UnitdataService pl_PDU_SCCP_UnitdataService ) runs on SCCP_CT { var ASP_SCCP_N_NOTICE_ind vl_N_NOTICE_ind; //no SCCP or node congestion assumed //'route on SSN' assumed //subsystems are assumed equipped and available //as the message is received from MTP3 , DPC is assumed to be the PC of the own node without // any further checks //assemble ASP_SCCP_N_ vl_N_NOTICE_ind.calledAddress :=ConvertPDUEncodedAddressToASPAddress(pl_PDU_SCCP_UnitdataService.calledPAddress ); vl_N_NOTICE_ind.callingAddress:=ConvertPDUEncodedAddressToASPAddress(pl_PDU_SCCP_UnitdataService.callingPAddress); //one to one mapping between reasonForReturn and returnCause -Q713 A5 vl_N_NOTICE_ind.reasonForReturn := pl_PDU_SCCP_UnitdataService.returnCause ; vl_N_NOTICE_ind.userData := pl_PDU_SCCP_UnitdataService.data.data ; SCCP_SP_PORT.send( t_ASP_N_NOTICE_ind( vl_N_NOTICE_ind.calledAddress , vl_N_NOTICE_ind.callingAddress, vl_N_NOTICE_ind.reasonForReturn, vl_N_NOTICE_ind.userData , omit)); }// processing_PDU_SCCP_UnitdataService //****************************************************************** // processing_PDU_SCCP_ConnectionRequest //****************************************************************** function processing_PDU_SCCP_ConnectionRequest( in PDU_SCCP_ConnectionRequest pl_PDU_SCCP_ConnectionRequest) runs on SCCP_CT { //no SCCP or node congestion assumed //we assume that routing is done on SSN; we are in the dest.node //SS is equipped and available //check if connection already established //local reference not assigned yet; search has to be done based on remote reference, // to prevent erroneous situations //for all other MTP3_ASPs, search is done based on destLocRef, containing the local //reference sent to the neighbouring node if (ConnectionAlreadyEstablished_remote(pl_PDU_SCCP_ConnectionRequest.sourceLocRef)) {//startif3 v_session :=Retrieve_session_remote(pl_PDU_SCCP_ConnectionRequest.sourceLocRef); //Action Table follows if (ConnectionTable[v_session].state==idle) { log("CR received with reference for an already established conn. in state:idle");}//no source ref known else if (ConnectionTable[v_session].state==active) { log("CR received with reference for an already established conn. in state:active");} else if (ConnectionTable[v_session].state==reset_bothway) { log("CR received with reference for an already established conn. in state:reset_bothway");} else if (ConnectionTable[v_session].state==connection_pending_IC) { log("CR received with reference for an already established conn. in state:connection_pending_IC");} //discard message, return else if (ConnectionTable[v_session].state==disconnect_pending) { log("CR received with reference for an already established conn. in state:disconnect_pending");}//discard message, return else if (ConnectionTable[v_session].state==reset_IC) {//startif4 //discard received message f_StartTimer(internal_reset,v_session,0.0);//the dummy timer times out immediately //state changed to active ConnectionTable[v_session].state:=active; }//endif4 else if (ConnectionTable[v_session].state==wait_conn_confirm) {//startif4 //stop connection timer f_StopTimer(conn_est,v_session); //release resources ReleaseResources(v_session); }//endif4 }//endif3 else {//startelse //************************************************************************* //connection not yet established - new v_session //check if resources available v_session:=CheckIdleIndividuals() //idle individual found , resources available, 0<=v_session<=15 if ( v_session!=-1 ) {//startif3 // ConnectionTable[v_session].localReference := GenerateLocalReference(); ConnectionTable[v_session].remoteReference:= pl_PDU_SCCP_ConnectionRequest.sourceLocRef; //local reference assigned here!!(see Fig. C.3/Q714) ConnectionTable[v_session].connectionId := GenerateConnectionId(); //once local reference is assigned , a session is considered established //determine protocol class //assemble ASP_SCCP_N_ //start guard timer T_guard ;if no answer to ASP_SCCP_N_CONNECT_ind is received, timer will release var ASP_SCCP_N_CONNECT_ind vl_N_CONNECT_ind; f_StartTimer(t_guard,v_session); vl_N_CONNECT_ind.calledAddress:=ConvertPDUEncodedAddressToASPAddress(pl_PDU_SCCP_ConnectionRequest.calledPAddress); if (ispresent(pl_PDU_SCCP_ConnectionRequest.optionalPart)) { if (ispresent(pl_PDU_SCCP_ConnectionRequest.optionalPart.callingPAddress)) {//startif4 //temporary variable to avoid type conversion problems var SCCP_param_CPartyAddressEnc vl_PDUAddress; vl_PDUAddress.addr := pl_PDU_SCCP_ConnectionRequest.optionalPart.callingPAddress.addr; vl_PDUAddress.paramLength := pl_PDU_SCCP_ConnectionRequest.optionalPart.callingPAddress.paramLength; vl_N_CONNECT_ind.callingAddress:= ConvertPDUEncodedAddressToASPAddress(vl_PDUAddress); }//endif4 else {vl_N_CONNECT_ind.callingAddress:=omit} if (ispresent(pl_PDU_SCCP_ConnectionRequest.optionalPart.data)) {//startif4 //temporary variable to avoid type conversion problems var SCCP_param_Data_opt vl_SCCP_param_Data_opt; vl_SCCP_param_Data_opt:=pl_PDU_SCCP_ConnectionRequest.optionalPart.data; vl_N_CONNECT_ind.userData:=vl_SCCP_param_Data_opt.data; }//endif4 else {vl_N_CONNECT_ind.userData:=omit} } else { vl_N_CONNECT_ind.callingAddress:=omit; vl_N_CONNECT_ind.userData:=omit; } vl_N_CONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_CONNECT_ind( vl_N_CONNECT_ind.calledAddress, vl_N_CONNECT_ind.callingAddress, omit, vl_N_CONNECT_ind.userData, //ethcky vl_N_CONNECT_ind.connectionId, omit));//send ASP_SCCP_N_CONNECT_ind //restart send inactivity timer (baat) f_StopTimer(ias,v_session);//to avoid warnings f_StartTimer(ias,v_session); ConnectionTable[v_session].state:=connection_pending_IC; }//endif3 //no idle individual found , no resources available , v_session=-1 if (v_session==-1) {//startif3 var PDU_SCCP vl_PDU_SCCP; //assemble and route MTP3 ASP vl_PDU_SCCP.connrefused.messageType:=cref; vl_PDU_SCCP.connrefused.destLocRef:=pl_PDU_SCCP_ConnectionRequest.sourceLocRef; vl_PDU_SCCP.connrefused.refusalCause:=1;//End user congestion vl_PDU_SCCP.connrefused.pointer1:=0;// No options vl_PDU_SCCP.connrefused.optionalPart:=omit; vl_PDU_SCCP.connrefused.eop:=omit; MTP3_SCCP_PORT.send ( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Connection refused, no idle individuals //return to idle }//endif3 }//endelse }//processing_PDU_SCCP_ConnectionRequest //****************************************************************** // processing_PDU_SCCP_ConnectionConfirm //****************************************************************** function processing_PDU_SCCP_ConnectionConfirm( in PDU_SCCP_ConnectionConfirm pl_PDU_SCCP_ConnectionConfirm) runs on SCCP_CT { var PDU_SCCP vl_PDU_SCCP; var ASP_SCCP_N_CONNECT_cfm vl_N_CONNECT_cfm; log(pl_PDU_SCCP_ConnectionConfirm); //Store data parameter var template SCCP_PAR_UserData tl_data := omit; if (ispresent(pl_PDU_SCCP_ConnectionConfirm.optionalPart)) { if (ispresent(pl_PDU_SCCP_ConnectionConfirm.optionalPart.data)) { tl_data := pl_PDU_SCCP_ConnectionConfirm.optionalPart.data.data; } } //check if connection already established if (ConnectionAlreadyEstablished(pl_PDU_SCCP_ConnectionConfirm.destLocRef)) {//startif2 v_session :=Retrieve_session(pl_PDU_SCCP_ConnectionConfirm.destLocRef); //Action Table follows if (ConnectionTable[v_session].state==idle) { //assemble and route MTP3_ASP vl_PDU_SCCP.pduerror.messageType:=err; vl_PDU_SCCP.pduerror.destLocRef:=ConnectionTable[v_session].remoteReference; vl_PDU_SCCP.pduerror.errorCause:=cg_Err_unassignedDestinationLRN; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error //then return to idle } else if (ConnectionTable[v_session].state==connection_pending_IC) { log("CC received in state:connection_pending_IC"); }//discard message, return else if (ConnectionTable[v_session].state==disconnect_pending) { log("CC received in state:disconnect_pending"); }//discard message, return else if (ConnectionTable[v_session].state==active) { log("CC received in state:active"); }//do nothing, return else if (ConnectionTable[v_session].state==reset_bothway) { log("CC received in state:reset_bothway"); }// else if (ConnectionTable[v_session].state==connection_pending_OG) {//startif3 //stop connection timer f_StopTimer(conn_est,v_session); //start inactivity timers f_StartTimer(ias,v_session); f_StartTimer(iar,v_session); //assign protocol class:=2, associate remote reference ConnectionTable[v_session].remoteReference:=pl_PDU_SCCP_ConnectionConfirm.sourceLocRef; //assemble ASP_SCCP_N_ vl_N_CONNECT_cfm.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_CONNECT_cfm( omit, omit, tl_data, vl_N_CONNECT_cfm.connectionId, omit ));//send ASP_SCCP_N_CONNECT_confirm ConnectionTable[v_session].state:=active; }//endif3 else if (ConnectionTable[v_session].state==wait_conn_confirm)//connection is confirmed , // but it has meanwhile been disconnected by the user {//startif3 //stop connection timer f_StopTimer(conn_est,v_session); //associate remote reference to connection ConnectionTable[v_session].remoteReference:=pl_PDU_SCCP_ConnectionConfirm.sourceLocRef; //assemble and route MTP3_ASP vl_PDU_SCCP.released.messageType:=rlsd; vl_PDU_SCCP.released.destLocRef:=ConnectionTable[v_session].remoteReference; vl_PDU_SCCP.released.sourceLocRef:=ConnectionTable[v_session].localReference; vl_PDU_SCCP.released.releaseCause:=cg_DISC_normal; vl_PDU_SCCP.released.pointer1:=0;//No options vl_PDU_SCCP.released.optionalPart:=omit; vl_PDU_SCCP.released.eop:=omit; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Released //start release timer f_StartTimer(rel,v_session); ConnectionTable[v_session].state:=disconnect_pending; }//endif3 else if (ConnectionTable[v_session].state==reset_IC) {//startif3 //discard received message f_StartTimer(internal_reset,v_session,0.0);//the timer times out immediately //state changed to active ConnectionTable[v_session].state:=active; }//endif3 else { log("CC received in an unexpected state"); } }//endif2 else {//startelse -Connection confirm received with destLocRef not in ConnectionTable //send ERR vl_PDU_SCCP.pduerror.messageType:=err; vl_PDU_SCCP.pduerror.destLocRef:=pl_PDU_SCCP_ConnectionConfirm.sourceLocRef; vl_PDU_SCCP.pduerror.errorCause:=cg_Err_unassignedDestinationLRN; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error }//endelse }//processing_PDU_SCCP_ConnectionConfirm //****************************************************************** // processing_PDU_SCCP_Released //****************************************************************** function processing_PDU_SCCP_Released( in PDU_SCCP_Released pl_PDU_SCCP_Released) runs on SCCP_CT { var PDU_SCCP vl_PDU_SCCP; var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; //Store data parameter var template SCCP_PAR_UserData tl_data := omit; if (ispresent(pl_PDU_SCCP_Released.optionalPart)) { if (ispresent(pl_PDU_SCCP_Released.optionalPart.data)) { tl_data := pl_PDU_SCCP_Released.optionalPart.data.data; } } //check if connection already established if (ConnectionAlreadyEstablished(pl_PDU_SCCP_Released.destLocRef)) {//startif1 v_session :=Retrieve_session(pl_PDU_SCCP_Released.destLocRef); //check if remote reference is correct -Table B.2 /Q.714 if (ConnectionTable[v_session].remoteReference==pl_PDU_SCCP_Released.sourceLocRef) {//startif2 //Action Table follows if (ConnectionTable[v_session].state==idle)//C.3- 1/6 ????nem valoszinu hogy ez eloallhat {//startif3 //assemble and route MTP3_ASP vl_PDU_SCCP.relcomp.messageType:=rlc; vl_PDU_SCCP.relcomp.destLocRef:=ConnectionTable[v_session].remoteReference; vl_PDU_SCCP.relcomp.sourceLocRef:=ConnectionTable[v_session].localReference; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Release complete //then return to idle }//endif3 else if (ConnectionTable[v_session].state==connection_pending_IC) { log("RLSD received in state:connection_pending_IC");}//discard message, return else if (ConnectionTable[v_session].state==disconnect_pending) { log("RLSD received in state:disconnect_pending");}//discard message, return else if (ConnectionTable[v_session].state==active) {//startif3 //assemble ASP_SCCP_N_ vl_N_DISCONNECT_ind.originator:=cg_Mapping_RelCause_Orig[pl_PDU_SCCP_Released.releaseCause]; vl_N_DISCONNECT_ind.reason:=cg_Mapping_RelCause_Reason[pl_PDU_SCCP_Released.releaseCause]; vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, tl_data, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //assemble and route MTP3_ASP vl_PDU_SCCP.relcomp.messageType :=rlc; vl_PDU_SCCP.relcomp.destLocRef :=pl_PDU_SCCP_Released.sourceLocRef; vl_PDU_SCCP.relcomp.sourceLocRef:=pl_PDU_SCCP_Released.destLocRef; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Release complete //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==connection_pending_OG) {//startif3 //assemble and route MTP3_ASP vl_PDU_SCCP.relcomp.messageType :=rlc; vl_PDU_SCCP.relcomp.destLocRef :=pl_PDU_SCCP_Released.sourceLocRef; vl_PDU_SCCP.relcomp.sourceLocRef:=pl_PDU_SCCP_Released.destLocRef; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Release complete //stop connection timer f_StopTimer(conn_est,v_session); //assemble ASP_SCCP_N_ vl_N_DISCONNECT_ind.originator :=cg_Mapping_RelCause_Orig[pl_PDU_SCCP_Released.releaseCause]; vl_N_DISCONNECT_ind.reason :=cg_Mapping_RelCause_Reason[pl_PDU_SCCP_Released.releaseCause]; vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, tl_data, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==wait_conn_confirm) {//startif3 //assemble and route MTP3_ASP vl_PDU_SCCP.relcomp.messageType :=rlc; vl_PDU_SCCP.relcomp.destLocRef :=pl_PDU_SCCP_Released.sourceLocRef; vl_PDU_SCCP.relcomp.sourceLocRef :=pl_PDU_SCCP_Released.destLocRef; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Release complete //stop connection timer f_StopTimer(conn_est,v_session); //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==reset_IC) {//startif3 //assemble ASP_SCCP_N_ vl_N_DISCONNECT_ind.originator:=cg_Mapping_RelCause_Orig[pl_PDU_SCCP_Released.releaseCause]; vl_N_DISCONNECT_ind.reason :=cg_Mapping_RelCause_Reason[pl_PDU_SCCP_Released.releaseCause]; vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, tl_data, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //release resources, stop inactivity timers, change state to idle ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==reset_bothway) {//startif3 //assemble ASP_SCCP_N_ vl_N_DISCONNECT_ind.originator:=cg_Mapping_RelCause_Orig[pl_PDU_SCCP_Released.releaseCause]; vl_N_DISCONNECT_ind.reason :=cg_Mapping_RelCause_Reason[pl_PDU_SCCP_Released.releaseCause]; vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, tl_data, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //release resources, stop inactivity timers, change state to idle ReleaseResources(v_session); }//endif3 else { log("RLSD received in an unexpected state"); } }//endif2 else {//remote reference inconsistent, error action follows vl_PDU_SCCP.pduerror.messageType:=err; vl_PDU_SCCP.pduerror.destLocRef :=pl_PDU_SCCP_Released.sourceLocRef; vl_PDU_SCCP.pduerror.errorCause :=cg_Err_inconsistentSourceLRN; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error }//endelse }//endif1 else {//Released(Y,X) received with destLocRef not in ConnectionTable //send RLC(X,Y) vl_PDU_SCCP.relcomp.messageType :=rlc; vl_PDU_SCCP.relcomp.destLocRef :=pl_PDU_SCCP_Released.sourceLocRef; vl_PDU_SCCP.relcomp.sourceLocRef:=pl_PDU_SCCP_Released.destLocRef; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Release complete }//endelse }//processing_PDU_SCCP_Released //****************************************************************** // processing_PDU_SCCP_ProtDataUnitError //****************************************************************** function processing_PDU_SCCP_ProtDataUnitError( in PDU_SCCP_ProtDataUnitError pl_PDU_SCCP_ProtDataUnitError) runs on SCCP_CT { var PDU_SCCP vl_PDU_SCCP; var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; //check if connection already established if (ConnectionAlreadyEstablished(pl_PDU_SCCP_ProtDataUnitError.destLocRef)) {//startif2 v_session :=Retrieve_session(pl_PDU_SCCP_ProtDataUnitError.destLocRef); //Action Table follows if (ConnectionTable[v_session].state==idle) {//startif3 //assemble and route MTP3_ASP vl_PDU_SCCP.pduerror.messageType:=err; vl_PDU_SCCP.pduerror.destLocRef:=ConnectionTable[v_session].remoteReference; vl_PDU_SCCP.pduerror.errorCause:=cg_Err_unassignedDestinationLRN; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error //then return to idle }//endif3 else if (ConnectionTable[v_session].state==disconnect_pending) { log("PDUError received in state:disconnect_pending ");}//discard message, return else if (ConnectionTable[v_session].state==connection_pending_IC) { log("PDUError received in state:connection_pending_IC ");}//discard message, return else if (ConnectionTable[v_session].state==reset_bothway) {//startif3 //assemble ASP_SCCP_N_ vl_N_DISCONNECT_ind.originator :=cg_Undefined; vl_N_DISCONNECT_ind.reason :=pl_PDU_SCCP_ProtDataUnitError.errorCause;//? vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, omit, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //release resources, stop inactivity timers, change state to idle ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==active) {//startif3 if (pl_PDU_SCCP_ProtDataUnitError.errorCause!=cg_Err_serviceClassMismatch) {//startif4 //assemble ASP_SCCP_N_ vl_N_DISCONNECT_ind.originator:=cg_Undefined; vl_N_DISCONNECT_ind.reason:=pl_PDU_SCCP_ProtDataUnitError.errorCause;//? vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, omit, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //release resources ReleaseResources(v_session); }//endif4 else {//startelse -Service class mismatch //assemble ASP_SCCP_N_ vl_N_DISCONNECT_ind.originator :=cg_Undefined; vl_N_DISCONNECT_ind.reason :=pl_PDU_SCCP_ProtDataUnitError.errorCause; vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, omit, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //stop inactivity timers f_StopTimer(iar,v_session); f_StopTimer(ias,v_session); //send Released //assemble and route MTP3_ASP vl_PDU_SCCP.released.messageType:=rlsd; vl_PDU_SCCP.released.destLocRef:=ConnectionTable[v_session].remoteReference; vl_PDU_SCCP.released.sourceLocRef:=ConnectionTable[v_session].localReference; vl_PDU_SCCP.released.releaseCause:=cg_Rel_inconsConnData; vl_PDU_SCCP.released.pointer1:=0;//No optional part vl_PDU_SCCP.released.optionalPart:=omit; vl_PDU_SCCP.released.eop:=omit; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Released //start release timer f_StartTimer(rel,v_session); //change state to diconnect pending ConnectionTable[v_session].state:=disconnect_pending; }//endelse }//endif3 else if (ConnectionTable[v_session].state==connection_pending_OG) {//startif3 //stop connection timer f_StopTimer(conn_est,v_session); //assemble ASP_SCCP_N_ vl_N_DISCONNECT_ind.originator :=cg_Undefined; vl_N_DISCONNECT_ind.reason :=pl_PDU_SCCP_ProtDataUnitError.errorCause; vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, omit, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==wait_conn_confirm) {//startif3 //stop connection timer f_StopTimer(conn_est,v_session); //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==reset_IC) {//startif3 //assemble ASP_SCCP_N_ vl_N_DISCONNECT_ind.originator:=cg_Undefined; vl_N_DISCONNECT_ind.reason:=pl_PDU_SCCP_ProtDataUnitError.errorCause; vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, omit, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //release resources, stop inactivity timers, change state to idle ReleaseResources(v_session); }//endif3 else { log("PDUError received in an unexpected state"); } }//endif2 else {}//PDU_Error received with destLocRef not in ConnectionTable }//processing_PDU_SCCP_ProtDataUnitError //****************************************************************** // processing_PDU_SCCP_ReleaseComplete //****************************************************************** function processing_PDU_SCCP_ReleaseComplete(in PDU_SCCP_ReleaseComplete pl_PDU_SCCP_ReleaseComplete) runs on SCCP_CT { var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; //check if connection already established if (ConnectionAlreadyEstablished(pl_PDU_SCCP_ReleaseComplete.destLocRef)) {//startif1 v_session :=Retrieve_session(pl_PDU_SCCP_ReleaseComplete.destLocRef); //check if remote reference is correct -Table B.2 /Q.714 if (ConnectionTable[v_session].remoteReference==pl_PDU_SCCP_ReleaseComplete.sourceLocRef) {//startif2 //Action Table follows if (ConnectionTable[v_session].state==idle) { log("RLC received in state: idle"); }//C.3 1/6-do nothing-return to idle state else if (ConnectionTable[v_session].state==connection_pending_IC) { log("RLC received in state: connection_pending_IC"); }//discard message, return else if (ConnectionTable[v_session].state==active) { log("RLC received in state: active"); }//do nothing, return else if (ConnectionTable[v_session].state==reset_bothway) { log("RLC received in state:reset_bothway "); }// else if (ConnectionTable[v_session].state==disconnect_pending) {//startif3 log("RLC received in state:disconnect_pending "); //log("release resources"); ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==connection_pending_OG) {//startif3 f_StopTimer(conn_est,v_session); //assemble ASP_SCCP_N_ vl_N_DISCONNECT_ind.originator:=cg_NSU; vl_N_DISCONNECT_ind.reason:=cg_DISC_normal; vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, omit, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==wait_conn_confirm) {//startif3 log("RLC received in state:wait_conn_confirm"); //stop connection timer f_StopTimer(conn_est,v_session); //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==reset_IC) {//startif3 log("RLC received in state:reset_IC"); //discard received message f_StartTimer(internal_reset,v_session,0.0);//the timer times out immediately //state changed to active ConnectionTable[v_session].state:=active; }//endif3 else { log("RLC received in an unexpected state"); } }//endif2 else {}//remote reference inconsistent, discard }//endif1 else {}//Release complete received with destLocRef not in ConnectionTable //discard }//processing_PDU_SCCP_ReleaseComplete //****************************************************************** // processing_PDU_SCCP_InactivityTest //****************************************************************** function processing_PDU_SCCP_InactivityTest( in PDU_SCCP_InactivityTest pl_PDU_SCCP_InactivityTest) runs on SCCP_CT { var PDU_SCCP vl_PDU_SCCP; var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; //check if connection already established if (ConnectionAlreadyEstablished(pl_PDU_SCCP_InactivityTest.destLocRef)) {//startif1 v_session :=Retrieve_session(pl_PDU_SCCP_InactivityTest.destLocRef); //check if remote reference is correct -Table B.2 /Q.714 if (ConnectionTable[v_session].remoteReference==pl_PDU_SCCP_InactivityTest.sourceLocRef) {//startif2 //Action Table follows if (ConnectionTable[v_session].state==idle) { log("IT received in state :idle "); }//C.3 1/6-do nothing-return to idle state else if (ConnectionTable[v_session].state==connection_pending_IC) { log("IT received in state : connection_pending_IC"); }//discard message, return else if (ConnectionTable[v_session].state==connection_pending_OG) {//startif3 //stop connection timer f_StopTimer(conn_est,v_session); //assemble ASP_SCCP_N_ vl_N_DISCONNECT_ind.originator := cg_NSU; vl_N_DISCONNECT_ind.reason := cg_DISC_normal; vl_N_DISCONNECT_ind.connectionId := ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, omit, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==disconnect_pending) {} else if (ConnectionTable[v_session].state==reset_bothway) {}// else if (ConnectionTable[v_session].state==active) {//startif3 //source reference number assumed OK //or: //if (ConnectionTable[v_session].remoteReference!=pl_PDU_SCCP_InactivityTest.sourceLocRef) // release connection //protocol class assumed 2 //restart receive inactivity timer f_StopTimer(iar,v_session);//to avoid warnings f_StartTimer(iar,v_session); }//endif3 else if (ConnectionTable[v_session].state==reset_IC) {//startif3 //discard received message f_StartTimer(internal_reset,v_session,0.0);//the timer times out immediately //state changed to active ConnectionTable[v_session].state:=active; }//endif3 else if (ConnectionTable[v_session].state==wait_conn_confirm) {//startif3 //stop connection timer f_StopTimer(conn_est,v_session); //release resources ReleaseResources(v_session); }//endif3 else { log("IT received in an unexpected state"); } }//endif2 else {//remote reference inconsistent, error action follows //message received with remote reference not the same as stored // two RLSD messages are sent back, one to the sored and to the received remote reference //sent first RLSD-see B.2/Q.714 vl_PDU_SCCP.released.messageType :=rlsd; vl_PDU_SCCP.released.destLocRef :=pl_PDU_SCCP_InactivityTest.sourceLocRef; vl_PDU_SCCP.released.sourceLocRef:=pl_PDU_SCCP_InactivityTest.destLocRef; vl_PDU_SCCP.released.releaseCause:=cg_Rel_inconsConnData; vl_PDU_SCCP.released.pointer1:=0; vl_PDU_SCCP.released.optionalPart:=omit; vl_PDU_SCCP.released.eop:=omit; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Released //sent second RLSD-see B.2/Q.714 vl_PDU_SCCP.released.destLocRef :=ConnectionTable[v_session].remoteReference; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Released }//endelse }//endif1 else {}//Inactivity test received with destLocRef not in ConnectionTable //discard }//processing_PDU_SCCP_InactivityTest //****************************************************************** // processing_PDU_SCCP_ResetRequest //****************************************************************** function processing_PDU_SCCP_ResetRequest ( in PDU_SCCP_ResetRequest pl_PDU_SCCP_ResetRequest) runs on SCCP_CT { var PDU_SCCP vl_PDU_SCCP; //check if connection already established if (ConnectionAlreadyEstablished(pl_PDU_SCCP_ResetRequest.destLocRef)) {//startif1 v_session :=Retrieve_session(pl_PDU_SCCP_ResetRequest.destLocRef); //check if remote reference is correct -Table B.2 /Q.714 if (ConnectionTable[v_session].remoteReference==pl_PDU_SCCP_ResetRequest.sourceLocRef) {//startif2 //Action Table follows if (ConnectionTable[v_session].state==idle) {//startif3 //assemble and route MTP3_ASP vl_PDU_SCCP.pduerror.messageType:=err; vl_PDU_SCCP.pduerror.destLocRef:=ConnectionTable[v_session].remoteReference; vl_PDU_SCCP.pduerror.errorCause:=cg_Err_unassignedDestinationLRN; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error //then return to idle }//endif3 else if (ConnectionTable[v_session].state==connection_pending_IC) {}//discard message, return else if (ConnectionTable[v_session].state==connection_pending_OG) {//startif3 //stop connection timer f_StopTimer(conn_est,v_session); //assemble ASP_SCCP_N_ var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; vl_N_DISCONNECT_ind.originator:=cg_NSU; vl_N_DISCONNECT_ind.reason:=cg_DISC_normal; vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, omit, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==disconnect_pending) {} else if (ConnectionTable[v_session].state==reset_bothway) {//startif3 //assemble ASP_SCCP_N_ var ASP_SCCP_N_RESET_cfm vl_N_RESET_cfm; vl_N_RESET_cfm.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_RESET_cfm(vl_N_RESET_cfm.connectionId));//send ASP_SCCP_N_RESET_cfm //stop reset timer f_StopTimer(reset,v_session); //restart receive inactivity timer f_StopTimer(iar,v_session);//to avoid warnings f_StartTimer(iar,v_session); //change state ConnectionTable[v_session].state:=reset_IC; }//endif3 else if (ConnectionTable[v_session].state==active) {//startif3 //restart receive inactivity timer f_StopTimer(iar,v_session);//to avoid warnings f_StartTimer(iar,v_session); //send ASP_SCCP_N_RESET_ind //assemble ASP_SCCP_N_ var ASP_SCCP_N_RESET_ind vl_N_RESET_ind; vl_N_RESET_ind.originator:=cg_NSU; vl_N_RESET_ind.reason:=cg_RESET_unspec; vl_N_RESET_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_RESET_ind( vl_N_RESET_ind.originator, vl_N_RESET_ind.reason, vl_N_RESET_ind.connectionId ));//send ASP_SCCP_N_RESET_ind //reset variables ConnectionTable[v_session].state:=reset_IC; }//endif3 else if (ConnectionTable[v_session].state==wait_conn_confirm) {//startif3 //stop connection timer f_StopTimer(conn_est,v_session); //release resources ReleaseResources(v_session); }//endif3 else { log("RESREQ received in an unexpected state"); } }//endif2 else {//remote reference inconsistent, error action follows vl_PDU_SCCP.pduerror.messageType:=err; vl_PDU_SCCP.pduerror.destLocRef:=pl_PDU_SCCP_ResetRequest.sourceLocRef; vl_PDU_SCCP.pduerror.errorCause:=cg_Err_inconsistentSourceLRN; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error }//endelse }//endif1 else {//startelse-Reset request received with destLocRef not in ConnectionTable //send ERR vl_PDU_SCCP.pduerror.messageType:=err; vl_PDU_SCCP.pduerror.destLocRef:=pl_PDU_SCCP_ResetRequest.sourceLocRef; vl_PDU_SCCP.pduerror.errorCause:=cg_Err_unassignedDestinationLRN; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error }//endelse }//processing_PDU_SCCP_ResetRequest //****************************************************************** // processing_PDU_SCCP_ResetConfirm //****************************************************************** function processing_PDU_SCCP_ResetConfirm ( in PDU_SCCP_ResetConfirm pl_PDU_SCCP_ResetConfirm) runs on SCCP_CT { var PDU_SCCP vl_PDU_SCCP; //check if connection already established if (ConnectionAlreadyEstablished(pl_PDU_SCCP_ResetConfirm.destLocRef)) {//startif1 v_session :=Retrieve_session(pl_PDU_SCCP_ResetConfirm.destLocRef); //check if remote reference is correct -Table B.2 /Q.714 if (ConnectionTable[v_session].remoteReference==pl_PDU_SCCP_ResetConfirm.sourceLocRef) {//startif2 //Action Table follows if (ConnectionTable[v_session].state==idle) { log("RSC received in state:idle ");}//do nothing-return to idle state, no source ref known else if (ConnectionTable[v_session].state==connection_pending_IC) { log("RSC received in state:connection_pending_IC ");}//discard message, return else if (ConnectionTable[v_session].state==connection_pending_OG) {//startif3 var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; //stop connection timer f_StopTimer(conn_est,v_session); //assemble ASP_SCCP_N_ASP vl_N_DISCONNECT_ind.originator:=cg_NSU; vl_N_DISCONNECT_ind.reason:=cg_DISC_normal; vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, omit, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==disconnect_pending) { log("RSC received in state:disconnect_pending");} else if (ConnectionTable[v_session].state==reset_bothway) {//startif3 //assemble ASP_SCCP_N_ var ASP_SCCP_N_RESET_cfm vl_N_RESET_cfm; vl_N_RESET_cfm.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_RESET_cfm( vl_N_RESET_cfm.connectionId ));//send ASP_SCCP_N_RESET_cfm //stop reset timer f_StopTimer(reset,v_session); //restart receive inactivity timer f_StopTimer(iar,v_session);//to avoid warnings f_StartTimer(iar,v_session); //change state ConnectionTable[v_session].state:=reset_IC; }//endif3 else if (ConnectionTable[v_session].state==active) {//startif3 //do nothing-return to idle state log("RSC received in state:active"); }//endif3 else if (ConnectionTable[v_session].state==reset_IC) {//startif3 //discard received message f_StartTimer(internal_reset,v_session,0.0);//the timer times out immediately //state changed to active ConnectionTable[v_session].state:=active; }//endif3 else if (ConnectionTable[v_session].state==wait_conn_confirm) {//startif3 //stop connection timer f_StopTimer(conn_est,v_session); //release resources ReleaseResources(v_session); }//endif3 else { log("ResConf received in an unexpected state"); } }//endif2 else {//remote reference inconsistent, error action follows vl_PDU_SCCP.pduerror.messageType:=err; vl_PDU_SCCP.pduerror.destLocRef :=pl_PDU_SCCP_ResetConfirm.sourceLocRef; vl_PDU_SCCP.pduerror.errorCause :=cg_Err_inconsistentSourceLRN; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error }//endelse }//endif1 else {//startelse-Reset confirm received with destLocRef not in ConnectionTable //send ERR vl_PDU_SCCP.pduerror.messageType:=err; vl_PDU_SCCP.pduerror.destLocRef :=pl_PDU_SCCP_ResetConfirm.sourceLocRef; vl_PDU_SCCP.pduerror.errorCause :=cg_Err_unassignedDestinationLRN; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error }//endelse }//processing_PDU_SCCP_ResetConfirm //****************************************************************** // processing_PDU_SCCP_ConnectionRefused //****************************************************************** function processing_PDU_SCCP_ConnectionRefused ( in PDU_SCCP_ConnectionRefused pl_PDU_SCCP_ConnectionRefused) runs on SCCP_CT { //Store data parameter var template SCCP_PAR_UserData tl_data := omit; if (ispresent(pl_PDU_SCCP_ConnectionRefused.optionalPart)) { if (ispresent(pl_PDU_SCCP_ConnectionRefused.optionalPart.data)) { tl_data := pl_PDU_SCCP_ConnectionRefused.optionalPart.data.data; } } //check if connection already established if (ConnectionAlreadyEstablished(pl_PDU_SCCP_ConnectionRefused.destLocRef)) {//startif2 v_session :=Retrieve_session(pl_PDU_SCCP_ConnectionRefused.destLocRef); //Action Table follows if (ConnectionTable[v_session].state==idle) { log ("CREF received in state:idle");} //do nothing , return to idle, source ref unknown else if (ConnectionTable[v_session].state==connection_pending_IC) { log ("CREF received in state:connection_pending_IC");} else if (ConnectionTable[v_session].state==active) { log ("CREF received in state:active");}//do nothing, return else if (ConnectionTable[v_session].state==disconnect_pending) { log ("CREF received in state:disconnect_pending");}//discard message, return else if (ConnectionTable[v_session].state==reset_bothway) { log ("CREF received in state:reset_bothway");}// else if (ConnectionTable[v_session].state==connection_pending_OG) {//startif3 var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; //stop connection timer f_StopTimer(conn_est,v_session); //assemble ASP_SCCP_N_ vl_N_DISCONNECT_ind.originator:=cg_Mapping_RefCause_Orig[pl_PDU_SCCP_ConnectionRefused.refusalCause]; vl_N_DISCONNECT_ind.reason:=cg_Mapping_RefCause_Reason[pl_PDU_SCCP_ConnectionRefused.refusalCause]; vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, tl_data, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==wait_conn_confirm) {//startif3 //stop connection timer f_StopTimer(conn_est,v_session); //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==reset_IC) {//startif3 //discard received message f_StartTimer(internal_reset,v_session,0.0);//the timer times out immediately //state changed to active ConnectionTable[v_session].state:=active; }//endif3 else { log("CREF received in an unexpected state"); } }//endif2 else { log("CREF received with destLocRef not in state table"); } //Connection refused with destLocRef not in ConnectionTable //discard } //processing_PDU_SCCP_ConnectionRefused //****************************************************************** // processing_PDU_SCCP_DataForm1 //****************************************************************** function processing_PDU_SCCP_DataForm1 ( in PDU_SCCP_DataForm1 pl_PDU_SCCP_DataForm1) runs on SCCP_CT { //check if connection already established if (ConnectionAlreadyEstablished(pl_PDU_SCCP_DataForm1.destLocRef)) {//startif2 v_session :=Retrieve_session(pl_PDU_SCCP_DataForm1.destLocRef); //Action Table follows if (ConnectionTable[v_session].state==idle) {//startif3 var PDU_SCCP vl_PDU_SCCP; //assemble and route MTP3_ASP vl_PDU_SCCP.pduerror.messageType:=err; vl_PDU_SCCP.pduerror.destLocRef:=ConnectionTable[v_session].remoteReference; vl_PDU_SCCP.pduerror.errorCause:=cg_Err_unassignedDestinationLRN; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //Send Error //then return to idle }//endif3 else if (ConnectionTable[v_session].state==connection_pending_IC) { log ("DT1 received in state:connection_pending_IC");}//discard message, return else if (ConnectionTable[v_session].state==disconnect_pending) { log ("DT1 received in state:disconnect_pending");}//discard message, return else if (ConnectionTable[v_session].state==reset_bothway) { log ("DT1 received in state:reset_bothway");}// else if (ConnectionTable[v_session].state==connection_pending_OG) {//startif3 var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; f_StopTimer(conn_est,v_session); //assemble ASP_SCCP_N_ vl_N_DISCONNECT_ind.originator:=cg_NSU; vl_N_DISCONNECT_ind.reason:=cg_DISC_normal; vl_N_DISCONNECT_ind.connectionId:=ConnectionTable[v_session].connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, omit, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==wait_conn_confirm) {//startif3 //stop connection timer f_StopTimer(conn_est,v_session); //release resources ReleaseResources(v_session); }//endif3 else if (ConnectionTable[v_session].state==active) {//startif3 var ASP_SCCP_N_DATA_ind vl_N_DATA_ind; //restart receive inactivity timer f_StopTimer(iar,v_session);//to avoid warnings f_StartTimer(iar,v_session); buffered_sending_ASP_N_DATA_ind( pl_PDU_SCCP_DataForm1 ) //MODIFY-> protocol class assumed 2; M bit assumed 0 (no segm/reassembly) }//endif3 else if (ConnectionTable[v_session].state==reset_IC) {//startif3 //discard received message f_StartTimer(internal_reset,v_session,0.0);//the timer times out immediately //state changed to active ConnectionTable[v_session].state:=active; }//endif3 else { log("DT1 received in an unexpected state"); } }//endif2 else { log("DT1 received with destLocRef not in ConnectionTable"); } //DT1 received with destLocRef not in ConnectionTable //discard }//processing_PDU_SCCP_DataForm1 //****************************************************************** // processing_PDU_SCCP_ExtUnitdata //****************************************************************** function processing_PDU_SCCP_ExtUnitdata ( in PDU_SCCP_ExtUnitdata pl_PDU_SCCP_ExtUnitdata) runs on SCCP_CT { var integer vl_index; var OCT3 vl_segmRemoteRef; if( ispresent( pl_PDU_SCCP_ExtUnitdata.optionalPart) and ispresent( pl_PDU_SCCP_ExtUnitdata.optionalPart.segmentation) ) { vl_segmRemoteRef:= pl_PDU_SCCP_ExtUnitdata.optionalPart.segmentation.segmLocalRef; if( pl_PDU_SCCP_ExtUnitdata.optionalPart.segmentation.firstSegm =='1'B ) { vl_index:=allocate_ClessRcvBuff( vl_segmRemoteRef); } else { vl_index:=get_ClessRcvBuffIndex( vl_segmRemoteRef ); }; if (vl_index == -1) { log("Buffer allocation failed, message ignored."); return; } store_segmData(vl_index,pl_PDU_SCCP_ExtUnitdata); if( pl_PDU_SCCP_ExtUnitdata.optionalPart.segmentation.remainingSegment == '0000'B ) { send_ClessRcvBuff_in_N_UNITDATAind( vl_index,pl_PDU_SCCP_ExtUnitdata ); reallocate_ClessRcvBuff( vl_index ); } } else { // not segmented case: send_ClessData_in_N_UNITDATAind( pl_PDU_SCCP_ExtUnitdata ); } return; }//processing_PDU_SCCP_ExtUnitdata //****************************************************************** // Part 2 Receiving msg on port "SCCP_PORT" (User Part) //****************************************************************** //****************************************************************** // processing_ASP_N_CONNECT_req // / ASP_SCCP_N_CONNECT_req , originating node / //****************************************************************** function processing_ASP_N_CONNECT_req( in ASP_SCCP_N_CONNECT_req pl_N_CONNECT_req ) runs on SCCP_CT { var PDU_SCCP vl_PDU_SCCP; var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind; if (ConnectionAlreadyEstablished_connectionId(pl_N_CONNECT_req.connectionId)) // assume connectionId present {//startif1 //something went wrong, we already have a session with the same connection Id v_session :=Retrieve_session_connectionId(pl_N_CONNECT_req.connectionId); //table of error actions }//endif1 else {//startelse1 //check if resources available v_session:=CheckIdleIndividuals(); if (v_session==-1) //No idle individual found {//startif2 //assemble ASP_SCCP_N_ASP vl_N_DISCONNECT_ind.originator:=cg_NSP; // network service provider vl_N_DISCONNECT_ind.reason:=cg_CREF_unspec_T; vl_N_DISCONNECT_ind.connectionId:=pl_N_CONNECT_req.connectionId; SCCP_SP_PORT.send( t_ASP_N_DISCONNECT_ind( vl_N_DISCONNECT_ind.originator, omit, vl_N_DISCONNECT_ind.reason, omit, vl_N_DISCONNECT_ind.connectionId, omit ));//send ASP_SCCP_N_DISCONNECT_ind //return to idle }//endif2 if ((v_session<=15)and (v_session>=0)) {//startif2 //assign local reference, SLS:=tsp_MTP3_SLS, protocol class:=2 ConnectionTable[v_session].localReference:=int2oct(pl_N_CONNECT_req.connectionId,3); ConnectionTable[v_session].connectionId :=pl_N_CONNECT_req.connectionId; //to simplify generation of local reference, connectionID received from user is sent as such //only local reference is assigned at this point //send connection request, no coupling //DPC :remote node //no coupling reqrd. //compatibility OK //no restriction //assemble and route MTP3_ASP vl_PDU_SCCP.connrequest.messageType:=cr; vl_PDU_SCCP.connrequest.sourceLocRef:=ConnectionTable[v_session].localReference; // send local reference just assigned! vl_PDU_SCCP.connrequest.protClass:={ class:='0010'B, messageHandling:='0000'B };//class 2 vl_PDU_SCCP.connrequest.pointer1:=2; vl_PDU_SCCP.connrequest.calledPAddress:=ConvertASPAddressToEncodedAddress(pl_N_CONNECT_req.calledAddress); //new! vl_PDU_SCCP.connrequest.pointer2:=vl_PDU_SCCP.connrequest.calledPAddress.paramLength+2; //automatic? if(ispresent(pl_N_CONNECT_req.callingAddress)) {//startif3 //temporary variable to avoid type conversion problems var SCCP_param_CPartyAddressEnc_opt vl_SCCP_param_CPartyAddressEnc_opt; var SCCP_param_CPartyAddressEnc vl_SCCP_param_CPartyAddressEnc; vl_SCCP_param_CPartyAddressEnc:= ConvertASPAddressToEncodedAddress(pl_N_CONNECT_req.callingAddress); vl_SCCP_param_CPartyAddressEnc_opt.paramName :=con_SCCP_cgPA; vl_SCCP_param_CPartyAddressEnc_opt.paramLength:=vl_SCCP_param_CPartyAddressEnc.paramLength; vl_SCCP_param_CPartyAddressEnc_opt.addr :=vl_SCCP_param_CPartyAddressEnc.addr; vl_PDU_SCCP.connrequest.optionalPart.callingPAddress:=vl_SCCP_param_CPartyAddressEnc_opt; }//endif3 else { vl_PDU_SCCP.connrequest.optionalPart.callingPAddress:=omit } if(ispresent(pl_N_CONNECT_req.userData)) {//startif3 //temporary variable to avoid type conversion problems var SCCP_param_Data_opt vl_SCCP_param_Data_opt; vl_SCCP_param_Data_opt.paramName:=con_SCCP_data; vl_SCCP_param_Data_opt.data:=pl_N_CONNECT_req.userData; vl_SCCP_param_Data_opt.paramLength:=lengthof(vl_SCCP_param_Data_opt.data); vl_PDU_SCCP.connrequest.optionalPart.data:=vl_SCCP_param_Data_opt; }//endif3 else { vl_PDU_SCCP.connrequest.optionalPart.data:=omit} if(ispresent(pl_N_CONNECT_req.callingAddress) or ispresent(pl_N_CONNECT_req.userData)) { vl_PDU_SCCP.connrequest.optionalPart.credit:=omit; vl_PDU_SCCP.connrequest.optionalPart.hopCounter:=omit; vl_PDU_SCCP.connrequest.optionalPart.importance:=omit; vl_PDU_SCCP.connrequest.eop:= {paramName:=con_SCCP_eop}; } else { vl_PDU_SCCP.connrequest.optionalPart := omit; vl_PDU_SCCP.connrequest.eop := omit; } MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Connection request //start connection timer f_StartTimer(conn_est,v_session); ConnectionTable[v_session].state:=connection_pending_OG; }//endif2 }//endelse }//processing_ASP_N_CONNECT_req //****************************************************************** //End ASP_SCCP_N_CONNECT_req , originating node //****************************************************************** //****************************************************************** // processing_ASP_N_CONNECT_resp //****************************************************************** function processing_ASP_N_CONNECT_res( in ASP_SCCP_N_CONNECT_res pl_N_CONNECT_res ) runs on SCCP_CT { var PDU_SCCP vl_PDU_SCCP; // first see if session exists in the ConnectionTable //search done based on Connection ID if (ConnectionAlreadyEstablished_connectionId(pl_N_CONNECT_res.connectionId)) //assume connectionId present {//startif1 //retrieve session v_session :=Retrieve_session_connectionId(pl_N_CONNECT_res.connectionId); //Action Table follows if (ConnectionTable[v_session].state==idle) { log("N_CONNECT_resp received in state:idle"); //do nothing-return to idle state } else if (ConnectionTable[v_session].state==connection_pending_IC) {//startif2 //assign SLS:=tsp_MTP3_SLS, assign protocol class=2 (CO, no flow ctrl.) //assemble and route MTP3_ASP vl_PDU_SCCP.connconfirm.messageType:=cc; vl_PDU_SCCP.connconfirm.sourceLocRef:=ConnectionTable[v_session].localReference; vl_PDU_SCCP.connconfirm.destLocRef:=ConnectionTable[v_session].remoteReference; vl_PDU_SCCP.connconfirm.protClass.class:='0010'B;//protocol class 2 vl_PDU_SCCP.connconfirm.protClass.messageHandling:='0000'B;//no special treatment if(ispresent(pl_N_CONNECT_res.respondingAddress)) {//startif3 //temporary variable to avoid type conversion problems var SCCP_param_CPartyAddressEnc_opt vl_SCCP_param_CPartyAddressEnc_opt; var SCCP_param_CPartyAddressEnc vl_SCCP_param_CPartyAddressEnc; vl_SCCP_param_CPartyAddressEnc:= ConvertASPAddressToEncodedAddress(pl_N_CONNECT_res.respondingAddress); vl_SCCP_param_CPartyAddressEnc_opt.paramName := con_SCCP_cdPA; // cgPA->cdPA ethbaat, 2003.11.06 vl_SCCP_param_CPartyAddressEnc_opt.paramLength:= vl_SCCP_param_CPartyAddressEnc.paramLength; vl_SCCP_param_CPartyAddressEnc_opt.addr := vl_SCCP_param_CPartyAddressEnc.addr; vl_PDU_SCCP.connconfirm.optionalPart.calledPAddress:= vl_SCCP_param_CPartyAddressEnc_opt; }//endif3 else { vl_PDU_SCCP.connconfirm.optionalPart.calledPAddress:=omit } if(ispresent(pl_N_CONNECT_res.userData)) {//startif3 //temporary variable to avoid type conversion problems var SCCP_param_Data_opt vl_SCCP_param_Data_opt; vl_SCCP_param_Data_opt.paramName:=con_SCCP_data; vl_SCCP_param_Data_opt.data:=pl_N_CONNECT_res.userData; // corrected by ethbaat 2003.10.16 vl_SCCP_param_Data_opt.paramLength:=lengthof(vl_SCCP_param_Data_opt.data); vl_PDU_SCCP.connconfirm.optionalPart.data:=vl_SCCP_param_Data_opt; }//endif3 else {vl_PDU_SCCP.connconfirm.optionalPart.data:=omit} if(ispresent(pl_N_CONNECT_res.respondingAddress) or ispresent(pl_N_CONNECT_res.userData)) { vl_PDU_SCCP.connconfirm.pointer1:=1; vl_PDU_SCCP.connconfirm.optionalPart.credit:=omit; vl_PDU_SCCP.connconfirm.optionalPart.importance:=omit; vl_PDU_SCCP.connconfirm.eop:= {paramName:=con_SCCP_eop}; } else { vl_PDU_SCCP.connconfirm.pointer1:=0; vl_PDU_SCCP.connconfirm.optionalPart := omit; vl_PDU_SCCP.connconfirm.eop:=omit; } MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send connection confirm f_StartTimer(ias,v_session); // ??? check them!!! f_StartTimer(iar,v_session); //start inactivity timers ConnectionTable[v_session].state:=active;//state change }//endif2 else { log("N_CONNECT_resp received in an unexpected state");} }//endif1 }//processing_ASP_N_CONNECT_resp //****************************************************************** // processing_ASP_N_DATA_req //****************************************************************** function processing_ASP_N_DATA_req( in ASP_SCCP_N_DATA_req pl_N_DATA_req ) runs on SCCP_CT { var PDU_SCCP vl_PDU_SCCP; // first see if session exists in the ConnectionTable if (ConnectionAlreadyEstablished_connectionId(pl_N_DATA_req.connectionId)) //assume connectionId present {//startif1 //retrieve v_session v_session :=Retrieve_session_connectionId(pl_N_DATA_req.connectionId); //Action Table follows if (ConnectionTable[v_session].state==idle) { log ("N_DATA_req received in idle state");} else if (ConnectionTable[v_session].state==reset_bothway) { log ("N_DATA_req received in reset_bothway state");} else if (ConnectionTable[v_session].state==active) {//startif2 sending_dataform1s_in_ASP_MTP_TRANSFERreqs(pl_N_DATA_req); //no change of state, remains active }//endif2 else { log ("N_DATA_req received in an unexpected state"); } }//endif1 else { log("N_DATA_req with Connection ID not in the state table -- illegal request"); } }//processing_ASP_N_DATA_req //****************************************************************** // processing_ASP_N_DISCONNECT_req //****************************************************************** function processing_ASP_N_DISCONNECT_req( in ASP_SCCP_N_DISCONNECT_req pl_N_DISCONNECT_req ) runs on SCCP_CT { var PDU_SCCP vl_PDU_SCCP; var boolean vl_opt_part_present:=false; // first see if session exists in the ConnectionTable if (ConnectionAlreadyEstablished_connectionId(pl_N_DISCONNECT_req.connectionId)) //assume connectionId present {//startif1 //retrieve v_session v_session :=Retrieve_session_connectionId(pl_N_DISCONNECT_req.connectionId); //Action Table follows if (ConnectionTable[v_session].state==idle) { log ("N_DISCONNECT_req received in state:idle");} else if (ConnectionTable[v_session].state==connection_pending_IC) {//startif2 //assemble and route MTP3_ASP vl_PDU_SCCP.connrefused.messageType:=cref; vl_PDU_SCCP.connrefused.destLocRef:=ConnectionTable[v_session].remoteReference; vl_PDU_SCCP.connrefused.refusalCause:=pl_N_DISCONNECT_req.reason; vl_PDU_SCCP.connrefused.pointer1:=0; //No optional part vl_PDU_SCCP.connrefused.optionalPart:=omit; vl_PDU_SCCP.connrefused.eop:=omit; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send connection refused //release resources ReleaseResources(v_session); }//endif2 else if (ConnectionTable[v_session].state==active) {//startif2 //stop inactivity timers f_StopTimer(ias,v_session); f_StopTimer(iar,v_session); //assemble and route MTP3_ASP vl_PDU_SCCP.released.messageType:=rlsd; vl_PDU_SCCP.released.destLocRef:=ConnectionTable[v_session].remoteReference; vl_PDU_SCCP.released.sourceLocRef:=ConnectionTable[v_session].localReference; vl_PDU_SCCP.released.releaseCause:=pl_N_DISCONNECT_req.reason; if(ispresent(pl_N_DISCONNECT_req.userData)){ vl_opt_part_present:=true; vl_PDU_SCCP.released.optionalPart.data.paramName:=con_SCCP_data; vl_PDU_SCCP.released.optionalPart.data.paramLength:=lengthof(pl_N_DISCONNECT_req.userData); vl_PDU_SCCP.released.optionalPart.data.data:=pl_N_DISCONNECT_req.userData; } else { vl_PDU_SCCP.released.optionalPart.data:=omit; } if(ispresent(pl_N_DISCONNECT_req.importance)){ vl_opt_part_present:=true; vl_PDU_SCCP.released.optionalPart.importance.paramName:=con_SCCP_imp vl_PDU_SCCP.released.optionalPart.importance.paramLength:=1 vl_PDU_SCCP.released.optionalPart.importance.importance:=pl_N_DISCONNECT_req.importance vl_PDU_SCCP.released.optionalPart.importance.reserved:='00000'B } else { vl_PDU_SCCP.released.optionalPart.importance:=omit; } if(vl_opt_part_present){ vl_PDU_SCCP.released.pointer1:=1; vl_PDU_SCCP.released.eop.paramName:=con_SCCP_eop; } else { vl_PDU_SCCP.released.pointer1:=0;//No optional part vl_PDU_SCCP.released.optionalPart:=omit; vl_PDU_SCCP.released.eop:=omit; } MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send released //start release timer f_StartTimer(rel,v_session); ConnectionTable[v_session].state:=disconnect_pending; }//endif2 else if (ConnectionTable[v_session].state==connection_pending_OG) {//startif2 //change state to "wait connection confirm " ConnectionTable[v_session].state:=wait_conn_confirm; //and return }//endif2 else { log("N_DISCONNECT_req received in an unexpected state");} }//endif1 }//processing_ASP_N_DISCONNECT_req //****************************************************************** // function SCCP_SPC_int2bit - working function to processing_ASP_N_UNITDATA_req // v_sio is local to SCCP_CT // SCCPServiceType //****************************************************************** function SCCP_SPC_int2bit( in integer pl_SPC, in SCCP_ServiceType pl_SCCP_ServiceType, in octetstring pl_SIO ) return SCCP_ASPfield_SignallingPointCode { var SCCP_ASPfield_SignallingPointCode vl_SPC; //bitstring vl_SPC :='0000000000000000'B; if( (pl_SCCP_ServiceType == mtp3_itu) or (pl_SCCP_ServiceType == mtp3b_itu)) { //vl_SPC := '00'B&int2bit( pl_SPC, 14); vl_SPC := int2bit( pl_SPC, 14); } else if ( (pl_SCCP_ServiceType == mtp3_ansi) or (pl_SCCP_ServiceType == mtp3b_ansi) ) { vl_SPC := int2bit( pl_SPC, 24); } else if( (pl_SCCP_ServiceType == mtp3_ttc) or (pl_SCCP_ServiceType == mtp3b_ttc) ) { if( (pl_SIO == '83'O) or (pl_SIO == '43'O) or (pl_SIO == 'C3'O) ) //ttc national { vl_SPC := int2bit( pl_SPC, 16); } else if( pl_SIO == '03'O ) //ttc international { //vl_SPC := '00'B&int2bit( pl_SPC, 14); vl_SPC := int2bit( pl_SPC, 14); } else { log ( "SIO setting error"); } } else if( pl_SCCP_ServiceType == mtp3_mpt ) { var integer vl_NI := oct2int(pl_SIO)/64; if( vl_NI == 2 ) //mpt national { vl_SPC := int2bit( pl_SPC, 24); } else //mpt international { vl_SPC := int2bit( pl_SPC, 14); } } else { log ( "ServiceType setting error. Use values", "mtp3_itu, mtp3b_itu, mtp3_ansi, mtp3b_ansi,", " mtp3_ttc, mtp3b_ttc, mtp3_mpt or m3ua"); } return vl_SPC; }// SCCP_SPC_int2bit //****************************************************************** // sending_udt_in_ASP_MTP_TRANSFERreqs // sends data in one step //****************************************************************** function sending_udt_in_ASP_MTP_TRANSFERreqs( in SCCP_param_ProtocolClass pl_protClass, in SCCP_param_CPartyAddressEnc pl_CalledPAddress, in SCCP_param_CPartyAddressEnc pl_CallingPAddress, in SCCP_param_Data pl_data) runs on SCCP_CT { var PDU_SCCP vl_PDU_SCCP; vl_PDU_SCCP.unitdata.messageType := udt ; vl_PDU_SCCP.unitdata.protClass := pl_protClass; vl_PDU_SCCP.unitdata.calledPAddress := pl_CalledPAddress; vl_PDU_SCCP.unitdata.callingPAddress:= pl_CallingPAddress; vl_PDU_SCCP.unitdata.data := pl_data; vl_PDU_SCCP.unitdata.pointer1 := 0; vl_PDU_SCCP.unitdata.pointer2 := 0; vl_PDU_SCCP.unitdata.pointer3 := 0; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP));//send Unitdata return; }//sending_udt_in_ASP_MTP_TRANSFERreqs //****************************************************************** // sending_xudt_in_ASP_MTP_TRANSFERreqs // segmentates and sends data to the encoder //****************************************************************** function sending_xudt_in_ASP_MTP_TRANSFERreqs(in SCCP_param_ProtocolClass pl_protClass, in SCCP_param_CPartyAddressEnc pl_CalledPAddress, in SCCP_param_CPartyAddressEnc pl_CallingPAddress, in SCCP_param_Data pl_data) runs on SCCP_CT { var PDU_SCCP vl_PDU_SCCP; var integer vl_actdatalen; //without length of paramLength field var integer vl_len; // remaining data length without length of paramLength field var integer vl_from; var integer vl_overhead; var integer vl_maxdatalen; var integer vl_numberofPDUs; // ... to be sent vl_PDU_SCCP.extudata.messageType := xudt ; //len:1 vl_PDU_SCCP.extudata.hopCounter := 15; // check it in spec. //len:1 vl_PDU_SCCP.extudata.protClass := pl_protClass; //len:1 vl_PDU_SCCP.extudata.pointer1 := 0; //len:4 vl_PDU_SCCP.extudata.pointer2 := 0; vl_PDU_SCCP.extudata.pointer3 := 0; vl_PDU_SCCP.extudata.pointer4 := 0; vl_PDU_SCCP.extudata.calledPAddress := pl_CalledPAddress; vl_PDU_SCCP.extudata.callingPAddress := pl_CallingPAddress; vl_overhead := 15 + (vl_PDU_SCCP.extudata.calledPAddress.paramLength+1) + (vl_PDU_SCCP.extudata.callingPAddress.paramLength+1); vl_len := pl_data.paramLength; vl_maxdatalen := v_sccp_pdu_maxlen - vl_overhead -1; // -1:paramLength vl_numberofPDUs := vl_len/vl_maxdatalen; // 0 if 1 PDU exists // init segmentation: vl_PDU_SCCP.extudata.optionalPart.segmentation.segmLocalRef:= create_segmLocalRef(); vl_PDU_SCCP.extudata.optionalPart.segmentation.firstSegm := '1'B; //'yes' vl_PDU_SCCP.extudata.optionalPart.segmentation.paramName := con_SCCP_segm; vl_PDU_SCCP.extudata.optionalPart.segmentation.paramLength := 4; vl_PDU_SCCP.extudata.optionalPart.segmentation.remainingSegment := int2bit(vl_numberofPDUs,4); vl_PDU_SCCP.extudata.optionalPart.segmentation.reserved := '00'B; if( pl_protClass.class == '0001'B ) { vl_PDU_SCCP.extudata.optionalPart.segmentation.class := '1'B; } else { vl_PDU_SCCP.extudata.optionalPart.segmentation.class := '0'B; }; vl_PDU_SCCP.extudata.optionalPart.importance:= omit; //len:0 vl_PDU_SCCP.extudata.eop.paramName := con_SCCP_eop; //len:0 vl_from := 0; while ( vl_len > 0 ) { vl_PDU_SCCP.extudata.optionalPart.segmentation.remainingSegment := int2bit(vl_numberofPDUs,4); if ( vl_len > vl_maxdatalen ) { vl_actdatalen := vl_maxdatalen; } else { vl_actdatalen := vl_len; }; vl_PDU_SCCP.extudata.data.data := substr( pl_data.data, vl_from, vl_actdatalen ); vl_PDU_SCCP.extudata.data.paramLength := vl_actdatalen; MTP3_SCCP_PORT.send( t_ASP_MTP3_TRANSFERreq_sccp (v_SIO,v_own_SPC,v_remote_SPC,v_SLS,vl_PDU_SCCP)); //send PDU_SCCP_ExtUnitdata vl_PDU_SCCP.extudata.optionalPart.segmentation.firstSegm := '0'B; //'no' vl_numberofPDUs := vl_numberofPDUs -1 ; vl_from := vl_from + vl_actdatalen; vl_len := vl_len - vl_actdatalen; }//while log("Last remaining Segment:", vl_PDU_SCCP.extudata.optionalPart.segmentation.remainingSegment ); // not necessary, remove it: //reset_segmLocalRef(vl_PDU_SCCP.extudata.optionalPart.segmentation.segmLocalRef); return; }//sending_xudt_in_ASP_MTP_TRANSFERreqs //****************************************************************** // processing_ASP_N_UNITDATA_req //****************************************************************** function processing_ASP_N_UNITDATA_req( in ASP_SCCP_N_UNITDATA_req pl_N_UNITDATA_req ) runs on SCCP_CT { var PDU_SCCP vl_PDU_SCCP; var SCCP_param_ProtocolClass vl_protClass; var SCCP_param_CPartyAddressEnc vl_CalledPAddress, vl_CallingPAddress; var integer vl_overhead_length; var SCCP_param_Data vl_data; // Protocol class mapping : // old: vl_protClass.messageHandling:='0000'B;//no special options // 3.6/ Q.713: bit1-4 if ( ispresent(pl_N_UNITDATA_req.sequenceControl) and (substr(pl_N_UNITDATA_req.sequenceControl,7,1) == '1'B) ) //least significant bit! { vl_protClass.class:='0001'B; } else { vl_protClass.class:='0000'B; } //changed to 0000 from 0001 ethbaat 2003-11-13 // 3.6/ Q.713: bit 5-8: if ( ispresent(pl_N_UNITDATA_req.returnOption) and (substr(pl_N_UNITDATA_req.returnOption,7,1) == '1'B) ) //least significant bit! { vl_protClass.messageHandling:='1000'B} else { vl_protClass.messageHandling:='0000'B} //Called Address mapping: if (pl_N_UNITDATA_req.calledAddress.addressIndicator.pointCodeIndic=='1'B) //DPC included {//startif1 if (bit2int(pl_N_UNITDATA_req.calledAddress.signPointCode) == v_remote_SPC ) // remote SPC {//startif2 vl_CalledPAddress:= ConvertASPAddressToEncodedAddress(pl_N_UNITDATA_req.calledAddress); } else { log("The remote SPC in ASP_SCCP_N_UNITDATA_req is not the same as the one you called by StartSCCP.ASP dropped") return; } }//endif1 else { //DPC not present, use values local for component var SCCP_PAR_Address vl_SCCP_PAR_Address; vl_SCCP_PAR_Address := pl_N_UNITDATA_req.calledAddress; if ( tsp_override_called_address and (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