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