/*********************************************************************** * * * Filename: fsm.c * * Module: H245 Finite State Machine Subsystem * * * *********************************************************************** * INTEL Corporation Proprietary Information * * * * This listing is supplied under the terms of a license agreement * * with INTEL Corporation and may not be copied nor disclosed except * * in accordance with the terms of that agreement. * * * * Copyright (c) 1996 Intel Corporation. All rights reserved. * *********************************************************************** * * * $Workfile: FSM.C $ * $Revision: 1.5 $ * $Modtime: 09 Dec 1996 13:34:24 $ * $Log: S:/STURGEON/SRC/H245/SRC/VCS/FSM.C_v $ * * Rev 1.5 09 Dec 1996 13:34:28 EHOWARDX * Updated copyright notice. * * Rev 1.4 02 Jul 1996 00:09:24 EHOWARDX * * Added trace of state after state machine function called. * * Rev 1.3 30 May 1996 23:39:04 EHOWARDX * Cleanup. * * Rev 1.2 29 May 1996 15:20:12 EHOWARDX * Change to use HRESULT. * * Rev 1.1 28 May 1996 14:25:48 EHOWARDX * Tel Aviv update. * * Rev 1.0 09 May 1996 21:06:12 EHOWARDX * Initial revision. * * Rev 1.16.1.4 09 May 1996 19:48:34 EHOWARDX * Change TimerExpiryF function arguements. * * Rev 1.16.1.3 25 Apr 1996 17:00:18 EHOWARDX * Minor fixes. * * Rev 1.16.1.2 15 Apr 1996 10:45:38 EHOWARDX * Update. * * Rev 1.16.1.1 10 Apr 1996 21:16:06 EHOWARDX * Check-in for safety in middle of re-design. * * Rev 1.16.1.0 05 Apr 1996 12:21:16 EHOWARDX * Branched. * * ***********************************************************************/ #include "precomp.h" #include "h245api.h" #include "h245com.h" #include "h245fsm.h" #include "openu.h" #include "openb.h" #include "rqstcls.h" #include "termcap.h" #include "muxentry.h" #include "rmese.h" #include "mrse.h" #include "mlse.h" #include "mstrslv.h" #include "rtdse.h" #if defined(_DEBUG) // Signalling Entity definitions char * EntityName[NUM_ENTITYS] = { // Per-channel Signalling Entities "LCSE_OUT", // 0 Uni-directional Logical Channel signalling Signalling Entity - Outbound "LCSE_IN", // 1 Uni-directional Logical Channel signalling Signalling Entity - Inbound "BLCSE_OUT", // 2 Bi-directional Logical Channel signalling Signalling Entity - Outbound "BLCSE_IN", // 3 Bi-directional Logical Channel signalling Signalling Entity - Inbound "CLCSE_OUT", // 4 Close Logical Channel signalling Signalling Entity - Outbound "CLCSE_IN", // 5 Close Logical Channel signalling Signalling Entity - Inbound // Per H.245 Instance Signalling Entities "CESE_OUT", // 6 Capability Exchange Signalling Entity - Out-going "CESE_IN", // 7 Capability Exchange Signalling Entity - In-coming "MTSE_OUT", // 8 Multiplex Table Signalling Entity - Out-going "MTSE_IN", // 9 Multiplex Table Signalling Entity - In-coming "RMESE_OUT", // 10 Request Multiplex Entry Signalling Entity - Out-going "RMESE_IN", // 11 Request Multiplex Entry Signalling Entity - In-coming "MRSE_OUT", // 12 Mode Request Signalling Entity - Out-going "MRSE_IN", // 13 Mode Request Signalling Entity - In-coming "MLSE_OUT", // 14 Maintenance Loop Signalling Entity - Out-going "MLSE_IN", // 15 Maintenance Loop Signalling Entity - In-coming "MSDSE", // 16 Master Slave Determination Signalling Entity "RTDSE", // 17 Round Trip Delay Signalling Entity "STATELESS", // 18 No state machine associated with PDU }; // Event definitions char * EventName[NUM_EVENTS] = { // Out-going Uni-directional Logical Channel (LCSE_OUT) events "ReqUEstablish", // 0 "OpenUChAckPDU", // 1 "OpenUChRejectPDU", // 2 "CloseUChAckPDU", // 3 "ReqURelease", // 4 "T103Expiry", // 5 // In-coming Uni-directional Logical Channel (LCSE_IN) events "OpenUChPDU", // 6 "CloseUChPDU", // 7 "ResponseUEstablish", // 8 "EstablishUReject", // 9 // Out-going Bi-directional Logical Channel (BLCSE_OUT) events "ReqBEstablish", // 10 "OpenBChAckPDU", // 11 "OpenBChRejectPDU", // 12 "CloseBChAckPDU", // 13 "ReqClsBLCSE", // 14 "RspConfirmBLCSE", // 15 "T103OutExpiry", // 16 // In-coming Bi-directional Logical Channel (BLCSE_IN) events "OpenBChPDU", // 17 "CloseBChPDU", // 18 "ResponseBEstablish", // 19 "OpenBChConfirmPDU", // 20 "OpenRejectBLCSE", // 21 "T103InExpiry", // 22 // Out-going Request Close Logical Channel (CLCSE_OUT) events "ReqClose", // 23 "ReqChCloseAckPDU", // 24 "ReqChCloseRejectPDU", // 25 "T108Expiry", // 26 // In-coming Request Close Logical Channel (CLCSE_IN) events "ReqChClosePDU", // 27 "ReqChCloseReleasePDU", // 28 "CLCSE_CLOSE_response", // 29 "CLCSE_REJECT_request", // 30 // Out-going Terminal Capablity Exchange (CESE_OUT) events "TransferCapRequest", // 31 "TermCapSetAckPDU", // 32 "TermCapSetRejectPDU", // 33 "T101Expiry", // 34 // In-coming Terminal Capablity Exchange (CESE_IN) events "TermCapSetPDU", // 35 "TermCapSetReleasePDU", // 36 "CESE_TRANSFER_response", // 37 "CESE_REJECT_request", // 38 // Out-going Multiplex Table (MTSE_OUT) events "MTSE_TRANSFER_request", // 39 "MultiplexEntrySendAckPDU", // 40 "MultiplexEntrySendRejectPDU", // 41 "T104Expiry", // 42 // In-coming Multiplex Table (MTSE_IN) events "MultiplexEntrySendPDU", // 43 "MultiplexEntrySendReleasePDU", // 44 "MTSE_TRANSFER_response", // 45 "MTSE_REJECT_request", // 46 // Out-going Request Multiplex Entry (RMESE_OUT) events "RMESE_SEND_request", // 47 "RequestMultiplexEntryAckPDU", // 48 "RequestMultiplexEntryRejectPDU",// 49 "T107Expiry", // 50 // In-coming Request Multiplex Entry (RMESE_IN) events "RequestMultiplexEntryPDU", // 51 "RequestMultiplexEntryReleasePDU",// 52 "RMESE_SEND_response", // 53 "RMESE_REJECT_request", // 54 // Out-going Mode Request (MRSE_OUT) events "MRSE_TRANSFER_request", // 55 "RequestModeAckPDU", // 56 "RequestModeRejectPDU", // 57 "T109Expiry", // 58 // In-coming Mode Request (MRSE_IN) events "RequestModePDU", // 59 "RequestModeReleasePDU", // 60 "MRSE_TRANSFER_response", // 61 "MRSE_REJECT_request", // 62 // Out-going Maintenance Loop (MLSE_OUT) events "MLSE_LOOP_request", // 63 "MLSE_OUT_RELEASE_request", // 64 "MaintenanceLoopAckPDU", // 65 "MaintenanceLoopRejectPDU", // 66 "T102Expiry", // 67 // In-coming Maintenance Loop (MLSE_IN) events "MaintenanceLoopRequestPDU", // 68 "MaintenanceLoopOffCommandPDU", // 69 "MLSE_LOOP_response", // 70 "MLSE_IN_RELEASE_request", // 71 // Master Slave Determination (MSDSE) events "MSDetReq", // 72 "MSDetPDU", // 73 "MSDetAckPDU", // 74 "MSDetRejectPDU", // 75 "MSDetReleasePDU", // 76 "T106Expiry", // 77 // Round Trip Delay Delay (RTDSE) events "RTDSE_TRANSFER_request", // 78 "RoundTripDelayRequestPDU", // 79 "RoundTripDelayResponsePDU", // 80 "T105Expiry", // 81 // Events with no associated state entity "NonStandardRequestPDU", // 82 "NonStandardResponsePDU", // 83 "NonStandardCommandPDU", // 84 "NonStandardIndicationPDU", // 85 "MiscellaneousRequestPDU", // 86 "MiscellaneousResponsePDU", // 87 "MiscellaneousCommandPDU", // 88 "MiscellaneousIndicationPDU", // 89 "CommunicationModeRequestPDU", // 90 "CommunicationModeResponsePDU", // 91 "CommunicationModeCommandPDU", // 92 "SendTerminalCapabilitySetPDU", // 93 "EncryptionCommandPDU", // 94 "FlowControlCommandPDU", // 95 "EndSessionCommandPDU", // 96 "FunctionNotSupportedIndicationPDU",// 97 "JitterIndicationPDU", // 98 "H223SkewIndicationPDU", // 99 "NewATMVCIndicationPDU", // 100 "UserInputIndicationPDU", // 101 "H2250MaximumSkewIndicationPDU", // 102 "MCLocationIndicationPDU", // 103 }; // Output function definitions char * OutputName[NUM_OUTPUTS] = { // Out-going Open Uni-directional Logical Channel (LCSE_OUT) state functions "EstablishReleased", // 0 "OpenAckAwaitingE", // 1 "OpenRejAwaitingE", // 2 "ReleaseAwaitingE", // 3 "T103AwaitingE", // 4 "ReleaseEstablished", // 5 "OpenRejEstablished", // 6 "CloseAckEstablished", // 7 "CloseAckAwaitingR", // 8 "OpenRejAwaitingR", // 9 "T103AwaitingR", // 10 "EstablishAwaitingR", // 11 // In-coming Open Uni-directional Logical Channel (LCSE_IN) state functions "OpenReleased", // 12 "CloseReleased", // 13 "ResponseAwaiting", // 14 "ReleaseAwaiting", // 15 "CloseAwaiting", // 16 "OpenAwaiting", // 17 "CloseEstablished", // 18 "OpenEstablished", // 19 // Out-going Open Bi-directional Logical Channel (BLCSE_OUT) state functions "EstablishReqBReleased", // 20 "OpenChannelAckBAwaitingE", // 21 "OpenChannelRejBAwaitingE", // 22 "ReleaseReqBOutAwaitingE", // 23 "T103ExpiryBAwaitingE", // 24 "ReleaseReqBEstablished", // 25 "OpenChannelRejBEstablished", // 26 "CloseChannelAckBEstablished", // 27 "CloseChannelAckAwaitingR", // 28 "OpenChannelRejBAwaitingR", // 29 "T103ExpiryBAwaitingR", // 30 "EstablishReqAwaitingR", // 31 // In-coming Open Bi-directional Logical Channel (BLCSE_IN) state functions "OpenChannelBReleased", // 32 "CloseChannelBReleased", // 33 "EstablishResBAwaitingE", // 34 "ReleaseReqBInAwaitingE", // 35 "CloseChannelBAwaitingE", // 36 "OpenChannelBAwaitingE", // 37 "OpenChannelConfirmBAwaitingE", // 38 "T103ExpiryBAwaitingC", // 39 "OpenChannelConfirmBAwaitingC", // 40 "CloseChannelBAwaitingC", // 41 "OpenChannelBAwaitingC", // 42 "CloseChannelBEstablished", // 43 "OpenChannelBEstablished", // 44 // Out-going Request Close Logical Channel (CLCSE_OUT) state functions "CloseRequestIdle", // 45 "RequestCloseAckAwaitingR", // 46 "RequestCloseRejAwaitingR", // 47 "T108ExpiryAwaitingR", // 48 // In-coming Request Close Logical Channel (CLCSE_IN) state functions "RequestCloseIdle", // 49 "CloseResponseAwaitingR", // 50 "RejectRequestAwaitingR", // 51 "RequestCloseReleaseAwaitingR", // 52 "RequestCloseAwaitingR", // 53 // Out-going Terminal Capability Exchange (CESE_OUT) state functions "RequestCapIdle", // 54 "TermCapAckAwaiting", // 55 "TermCapRejAwaiting", // 56 "T101ExpiryAwaiting", // 57 // In-coming Terminal Capability Exchange (CESE_IN) state functions "TermCapSetIdle", // 58 "ResponseCapAwaiting", // 59 "RejectCapAwaiting", // 60 "TermCapReleaseAwaiting", // 61 "TermCapSetAwaiting", // 62 // Out-going Multiplex Table (MTSE_OUT) state functions "MTSE0_TRANSFER_request", // 63 "MTSE1_TRANSFER_request", // 64 "MTSE1_MultiplexEntrySendAck", // 65 "MTSE1_MultiplexEntrySendRej", // 66 "MTSE1_T104Expiry", // 67 // In-coming Multiplex Table (MTSE_IN) state functions "MTSE0_MultiplexEntrySend", // 68 "MTSE1_MultiplexEntrySend", // 69 "MTSE1_MultiplexEntrySendRelease",// 70 "MTSE1_TRANSFER_response", // 71 "MTSE1_REJECT_request", // 72 // Out-going Request Multiplex Entry (RMESE_OUT) state functions "RMESE0_SEND_request", // 73 "RMESE1_SEND_request", // 74 "RMESE1_RequestMuxEntryAck", // 75 "RMESE1_RequestMuxEntryRej", // 76 "RMESE1_T107Expiry", // 77 // In-coming Request Multiplex Entry (RMESE_IN) state functions "RMESE0_RequestMuxEntry", // 78 "RMESE1_RequestMuxEntry", // 79 "RMESE1_RequestMuxEntryRelease", // 80 "RMESE1_SEND_response", // 81 "RMESE1_REJECT_request", // 82 // Out-going Request Mode (MRSE_OUT) state functions "MRSE0_TRANSFER_request", // 83 "MRSE1_TRANSFER_request", // 84 "MRSE1_RequestModeAck", // 85 "MRSE1_RequestModeRej", // 86 "MRSE1_T109Expiry", // 87 // In-coming Request Mode (MRSE_IN) state functions "MRSE0_RequestMode", // 88 "MRSE1_RequestMode", // 89 "MRSE1_RequestModeRelease", // 90 "MRSE1_TRANSFER_response", // 91 "MRSE1_REJECT_request", // 92 // Out-going Request Mode (MLSE_OUT) state functions "MLSE0_LOOP_request", // 93 "MLSE1_MaintenanceLoopAck", // 94 "MLSE1_MaintenanceLoopRej", // 95 "MLSE1_OUT_RELEASE_request", // 96 "MLSE1_T102Expiry", // 97 "MLSE2_MaintenanceLoopRej", // 98 "MLSE2_OUT_RELEASE_request", // 99 // In-coming Request Mode (MLSE_IN) state functions "MLSE0_MaintenanceLoopRequest", // 100 "MLSE1_MaintenanceLoopRequest", // 101 "MLSE1_MaintenanceLoopOffCommand",// 102 "MLSE1_LOOP_response", // 103 "MLSE1_IN_RELEASE_request", // 104 "MLSE2_MaintenanceLoopRequest", // 105 "MLSE2_MaintenanceLoopOffCommand",// 106 // Master Slave Determination (MSDSE) state functions "DetRequestIdle", // 107 "MSDetIdle", // 108 "MSDetAckOutgoing", // 109 "MSDetOutgoing", // 110 "MSDetRejOutgoing", // 111 "MSDetReleaseOutgoing", // 112 "T106ExpiryOutgoing", // 113 "MSDetAckIncoming", // 114 "MSDetIncoming", // 115 "MSDetRejIncoming", // 116 "MSDetReleaseIncoming", // 117 "T106ExpiryIncoming", // 118 // Round Trip Delay (RTDSE) state functions "RTDSE0_TRANSFER_request", // 119 "RTDSE0_RoundTripDelayRequest", // 120 "RTDSE1_TRANSFER_request", // 121 "RTDSE1_RoundTripDelayRequest", // 122 "RTDSE1_RoundTripDelayResponse", // 123 "RTDSE1_T105Expiry", // 124 }; #endif // (_DEBUG) typedef HRESULT (*STATE_FUNCTION)(Object_t *pObject, PDU_t *pPdu); // Output function defintions static STATE_FUNCTION StateFun[] = { // Out-going Open Uni-directional Logical Channel (LCSE_OUT) state functions establishReleased, // 0 openAckAwaitingE, // 1 openRejAwaitingE, // 2 releaseAwaitingE, // 3 t103AwaitingE, // 4 releaseEstablished, // 5 openRejEstablished, // 6 closeAckEstablished, // 7 closeAckAwaitingR, // 8 openRejAwaitingR, // 9 t103AwaitingR, // 10 establishAwaitingR, // 11 // In-coming Open Uni-directional Logical Channel (LCSE_IN) state functions openReleased, // 12 closeReleased, // 13 responseAwaiting, // 14 releaseAwaiting, // 15 closeAwaiting, // 16 openAwaiting, // 17 closeEstablished, // 18 openEstablished, // 19 // Out-going Open Bi-directional Logical Channel (BLCSE_OUT) state functions establishReqBReleased, // 20 openChannelAckBAwaitingE, // 21 openChannelRejBAwaitingE, // 22 releaseReqBOutAwaitingE, // 23 t103ExpiryBAwaitingE, // 24 releaseReqBEstablished, // 25 openChannelRejBEstablished, // 26 closeChannelAckBEstablished, // 27 closeChannelAckAwaitingR, // 28 openChannelRejBAwaitingR, // 29 t103ExpiryBAwaitingR, // 30 establishReqAwaitingR, // 31 // In-coming Open Bi-directional Logical Channel (BLCSE_IN) state functions openChannelBReleased, // 32 closeChannelBReleased, // 33 establishResBAwaitingE, // 34 releaseReqBInAwaitingE, // 35 closeChannelBAwaitingE, // 36 openChannelBAwaitingE, // 37 openChannelConfirmBAwaitingE, // 38 t103ExpiryBAwaitingC, // 39 openChannelConfirmBAwaitingC, // 40 closeChannelBAwaitingC, // 41 openChannelBAwaitingC, // 42 closeChannelBEstablished, // 43 openChannelBEstablished, // 44 // Out-going Request Close Logical Channel (CLCSE_OUT) state functions closeRequestIdle, // 45 requestCloseAckAwaitingR, // 46 requestCloseRejAwaitingR, // 47 t108ExpiryAwaitingR, // 48 // In-coming Request Close Logical Channel (CLCSE_IN) state functions requestCloseIdle, // 49 closeResponseAwaitingR, // 50 rejectRequestAwaitingR, // 51 requestCloseReleaseAwaitingR, // 52 requestCloseAwaitingR, // 53 // Out-going Terminal Capability Exchange (CESE_OUT) state functions requestCapIdle, // 54 termCapAckAwaiting, // 55 termCapRejAwaiting, // 56 t101ExpiryAwaiting, // 57 // In-coming Terminal Capability Exchange (CESE_IN) state functions termCapSetIdle, // 58 responseCapAwaiting, // 59 rejectCapAwaiting, // 60 termCapReleaseAwaiting, // 61 termCapSetAwaiting, // 62 // Out-going Multiplex Table (MTSE_OUT) state functions MTSE0_TRANSFER_requestF, // 63 MTSE1_TRANSFER_requestF, // 64 MTSE1_MultiplexEntrySendAckF, // 65 MTSE1_MultiplexEntrySendRejF, // 66 MTSE1_T104ExpiryF, // 67 // In-coming Multiplex Table (MTSE_IN) state functions MTSE0_MultiplexEntrySendF, // 68 MTSE1_MultiplexEntrySendF, // 69 MTSE1_MultiplexEntrySendReleaseF,// 70 MTSE1_TRANSFER_responseF, // 71 MTSE1_REJECT_requestF, // 72 // Out-going Request Multiplex Entry (RMESE_OUT) state functions RMESE0_SEND_requestF, // 73 RMESE1_SEND_requestF, // 74 RMESE1_RequestMuxEntryAckF, // 75 RMESE1_RequestMuxEntryRejF, // 76 RMESE1_T107ExpiryF, // 77 // In-coming Request Multiplex Entry (RMESE_IN) state functions RMESE0_RequestMuxEntryF, // 78 RMESE1_RequestMuxEntryF, // 79 RMESE1_RequestMuxEntryReleaseF, // 80 RMESE1_SEND_responseF, // 81 RMESE1_REJECT_requestF, // 82 // Out-going Request Mode (MRSE_OUT) state functions MRSE0_TRANSFER_requestF, // 83 MRSE1_TRANSFER_requestF, // 84 MRSE1_RequestModeAckF, // 85 MRSE1_RequestModeRejF, // 86 MRSE1_T109ExpiryF, // 87 // In-coming Request Mode (MRSE_OUT) state functions MRSE0_RequestModeF, // 88 MRSE1_RequestModeF, // 89 MRSE1_RequestModeReleaseF, // 90 MRSE1_TRANSFER_responseF, // 91 MRSE1_REJECT_requestF, // 92 // Out-going Request Mode (MLSE_OUT) state functions MLSE0_LOOP_requestF, // 93 MLSE1_MaintenanceLoopAckF, // 94 MLSE1_MaintenanceLoopRejF, // 95 MLSE1_OUT_RELEASE_requestF, // 96 MLSE1_T102ExpiryF, // 97 MLSE2_MaintenanceLoopRejF, // 98 MLSE2_OUT_RELEASE_requestF, // 99 // In-coming Request Mode (MLSE_IN) state functions MLSE0_MaintenanceLoopRequestF, // 100 MLSE1_MaintenanceLoopRequestF, // 101 MLSE1_MaintenanceLoopOffCommandF,// 102 MLSE1_LOOP_responseF, // 103 MLSE1_IN_RELEASE_requestF, // 104 MLSE2_MaintenanceLoopRequestF, // 105 MLSE2_MaintenanceLoopOffCommandF,// 106 // Master Slave Determination (MSDSE) state functions detRequestIdle, // 107 msDetIdle, // 108 msDetAckOutgoing, // 109 msDetOutgoing, // 110 msDetRejOutgoing, // 111 msDetReleaseOutgoing, // 112 t106ExpiryOutgoing, // 113 msDetAckIncoming, // 114 msDetIncoming, // 115 msDetRejIncoming, // 116 msDetReleaseIncoming, // 117 t106ExpiryIncoming, // 118 // Round Trip Delay (RTDSE) state functions RTDSE0_TRANSFER_requestF, // 119 RTDSE0_RoundTripDelayRequestF, // 120 RTDSE1_TRANSFER_requestF, // 121 RTDSE1_RoundTripDelayRequestF, // 122 RTDSE1_RoundTripDelayResponseF, // 123 RTDSE1_T105ExpiryF, // 124 }; /********************************************* * * State table for the finite state machine * *********************************************/ Output_t StateTable[NUM_STATE_EVENTS][MAXSTATES] = { // Out-going Uni-directional Logical Channel (LCSE_OUT) events {EstablishReleased,IGNORE, IGNORE, EstablishAwaitingR}, // ReqUEstablish {IGNORE, OpenAckAwaitingE, IGNORE, IGNORE }, // OpenUChAckPDU {IGNORE, OpenRejAwaitingE, OpenRejEstablished, OpenRejAwaitingR }, // OpenUChRejectPDU {IGNORE, IGNORE, CloseAckEstablished,CloseAckAwaitingR }, // CloseUChAckPDU {IGNORE, ReleaseAwaitingE, ReleaseEstablished, IGNORE }, // ReqURelease {BAD, T103AwaitingE, BAD, T103AwaitingR }, // T103Expiry // In-coming Uni-directional Logical Channel (LCSE_IN) events {OpenReleased, OpenAwaiting, OpenEstablished, BAD }, // OpenUChPDU {CloseReleased, CloseAwaiting, CloseEstablished, BAD }, // CloseUChPDU {IGNORE, ResponseAwaiting, IGNORE, BAD }, // ResponseUEstablish {IGNORE, ReleaseAwaiting, IGNORE, BAD }, // EstablishUReject // Out-going Bi-directional Logical Channel (BLCSE_OUT) events {EstablishReqBReleased,IGNORE, IGNORE, EstablishReqAwaitingR },// ReqBEstablish {IGNORE, OpenChannelAckBAwaitingE, IGNORE, IGNORE },// OpenBChAckPDU {IGNORE, OpenChannelRejBAwaitingE, OpenChannelRejBEstablished, OpenChannelRejBAwaitingR},// OpenBChRejectPDU {IGNORE, IGNORE, CloseChannelAckBEstablished, CloseChannelAckAwaitingR},// CloseBChAckPDU {IGNORE, ReleaseReqBOutAwaitingE, ReleaseReqBEstablished, IGNORE },// ReqClsBLCSE {IGNORE, IGNORE, IGNORE, IGNORE },// RspConfirmBLCSE {BAD, T103ExpiryBAwaitingE, BAD, T103ExpiryBAwaitingR },// T103OutExpiry // In-coming Bi-directional Logical Channel (BLCSE_IN) events {OpenChannelBReleased, OpenChannelBAwaitingE, OpenChannelBAwaitingC, OpenChannelBEstablished },// OpenBChPDU {CloseChannelBReleased,CloseChannelBAwaitingE, CloseChannelBAwaitingC, CloseChannelBEstablished},// CloseBChPDU {IGNORE, EstablishResBAwaitingE, IGNORE, IGNORE },// ResponseBEstablish {IGNORE, OpenChannelConfirmBAwaitingE,OpenChannelConfirmBAwaitingC,IGNORE },// OpenBChConfirmPDU {IGNORE, ReleaseReqBInAwaitingE, IGNORE, IGNORE },// OpenRejectBLCSE {BAD, BAD, T103ExpiryBAwaitingC, BAD },// T103InExpiry // Out-going Request Close Logical Channel (CLCSE_OUT) events {CloseRequestIdle, IGNORE, BAD,BAD}, // ReqClose {IGNORE, RequestCloseAckAwaitingR, BAD,BAD}, // ReqChCloseAckPDU {IGNORE, RequestCloseRejAwaitingR, BAD,BAD}, // ReqChCloseRejectPDU {BAD, T108ExpiryAwaitingR, BAD,BAD}, // T108Expiry // In-coming Request Close Logical Channel (CLCSE_IN) events {RequestCloseIdle, RequestCloseAwaitingR, BAD,BAD}, // ReqChClosePDU {IGNORE, RequestCloseReleaseAwaitingR, BAD,BAD}, // ReqChCloseReleasePDU {IGNORE, CloseResponseAwaitingR, BAD,BAD}, // CLCSE_CLOSE_response {IGNORE, RejectRequestAwaitingR, BAD,BAD}, // CLCSE_REJECT_request // Out-going Terminal Capablity Exchange (CESE_OUT) events {RequestCapIdle, IGNORE, BAD,BAD}, // TransferCapRequest {IGNORE, TermCapAckAwaiting, BAD,BAD}, // TermCapSetAckPDU {IGNORE, TermCapRejAwaiting, BAD,BAD}, // TermCapSetRejectPDU {BAD, T101ExpiryAwaiting, BAD,BAD}, // T101Expiry // In-coming Terminal Capablity Exchange (CESE_IN) events {TermCapSetIdle, TermCapSetAwaiting, BAD,BAD}, // TermCapSetPDU {IGNORE, TermCapReleaseAwaiting, BAD,BAD}, // TermCapSetRelPDU {IGNORE, ResponseCapAwaiting, BAD,BAD}, // CESE_TRANSFER_response {IGNORE, RejectCapAwaiting, BAD,BAD}, // CESE_REJECT_request // Out-going Multiplex Table (MTSE_OUT) events {MTSE0_TRANSFER_request, MTSE1_TRANSFER_request, BAD,BAD}, // TRANSFER_request {IGNORE, MTSE1_MultiplexEntrySendAck, BAD,BAD}, // MultiplexEntrySendAck {IGNORE, MTSE1_MultiplexEntrySendRej, BAD,BAD}, // MultiplexEntrySendReject {BAD, MTSE1_T104Expiry, BAD,BAD}, // T104Expiry // In-coming Multiplex Table (MTSE_IN) events {MTSE0_MultiplexEntrySend, MTSE1_MultiplexEntrySend, BAD,BAD}, // MultiplexEntrySend {IGNORE, MTSE1_MultiplexEntrySendRelease,BAD,BAD}, // MultiplexEntrySendRelease {IGNORE, MTSE1_TRANSFER_response, BAD,BAD}, // MTSE_TRANSFER_response {IGNORE, MTSE1_REJECT_request, BAD,BAD}, // MTSE_REJECT_request // Out-going Request Multiplex Entry (RMESE_OUT) events {RMESE0_SEND_request, RMESE1_SEND_request, BAD,BAD}, // RMESE_SEND_request {IGNORE, RMESE1_RequestMuxEntryAck, BAD,BAD}, // RequestMultiplexEntryAck {IGNORE, RMESE1_RequestMuxEntryRej, BAD,BAD}, // RequestMultiplexEntryReject {BAD, RMESE1_T107Expiry, BAD,BAD}, // T107Expiry // In-coming Request Multiplex Entry (RMESE_IN) events {RMESE0_RequestMuxEntry, RMESE1_RequestMuxEntry, BAD,BAD}, // RequestMultiplexEntry {IGNORE, RMESE1_RequestMuxEntryRelease, BAD,BAD}, // RequestMultiplexEntryRelease {BAD, RMESE1_SEND_response, BAD,BAD}, // RMESE_SEND_response {BAD, RMESE1_REJECT_request, BAD,BAD}, // RMESE_REJECT_request // Out-going Mode Request (MRSE_OUT) events {MRSE0_TRANSFER_request, MRSE1_TRANSFER_request, BAD,BAD}, // MRSE_TRANSFER_request {IGNORE, MRSE1_RequestModeAck, BAD,BAD}, // RequestModeAck {IGNORE, MRSE1_RequestModeRej, BAD,BAD}, // RequestModeReject {BAD, MRSE1_T109Expiry, BAD,BAD}, // T109Expiry // In-coming Mode Request (MRSE_IN) events {MRSE0_RequestMode, MRSE1_RequestMode, BAD,BAD}, // RequestMode {IGNORE, MRSE1_RequestModeRelease, BAD,BAD}, // RequestModeRelease {BAD, MRSE1_TRANSFER_response, BAD,BAD}, // MRSE_TRANSFER_response {BAD, MRSE1_REJECT_request, BAD,BAD}, // MRSE_REJECT_request // Out-going Maintenance Loop (MLSE_OUT) events {MLSE0_LOOP_request, BAD, BAD, BAD}, // MLSE_LOOP_request {BAD, MLSE1_OUT_RELEASE_request, MLSE2_OUT_RELEASE_request, BAD}, // MLSE_OUT_RELEASE_request {IGNORE, MLSE1_MaintenanceLoopAck, IGNORE, BAD}, // MaintenanceLoopAck {IGNORE, MLSE1_MaintenanceLoopRej, MLSE2_MaintenanceLoopRej, BAD}, // MaintenanceLoopReject {BAD, MLSE1_T102Expiry, BAD, BAD}, // T102Expiry // In-coming Maintenance Loop (MLSE_IN) events {MLSE0_MaintenanceLoopRequest, MLSE1_MaintenanceLoopRequest, MLSE2_MaintenanceLoopRequest, BAD}, // MaintenanceLoopRequest {IGNORE, MLSE1_MaintenanceLoopOffCommand,MLSE2_MaintenanceLoopOffCommand,BAD}, // MaintenanceLoopOffCommand {BAD, MLSE1_LOOP_response, BAD, BAD}, // MLSE_LOOP_response {BAD, MLSE1_IN_RELEASE_request, BAD, BAD}, // MLSE_IN_RELEASE_request // Master Slave Determination (MSDSE) events {DetRequestIdle, IGNORE, IGNORE, BAD}, // MSDetReq {MSDetIdle, MSDetOutgoing, MSDetIncoming, BAD}, // MSDetPDU {IGNORE, MSDetAckOutgoing, MSDetAckIncoming, BAD}, // MSDetAckPDU {IGNORE, MSDetRejOutgoing, MSDetRejIncoming, BAD}, // MSDetRejectPDU {IGNORE, MSDetReleaseOutgoing, MSDetReleaseIncoming,BAD}, // MSDetReleasePDU {BAD, T106ExpiryOutgoing, T106ExpiryIncoming, BAD}, // T106Expiry // Round Trip Delay Delay (RTDSE) events {RTDSE0_TRANSFER_request, RTDSE1_TRANSFER_request, BAD,BAD}, // RTDSE_TRANSFER_request {RTDSE0_RoundTripDelayRequest, RTDSE0_RoundTripDelayRequest, BAD,BAD}, // RoundTripDelayRequest {IGNORE, RTDSE1_RoundTripDelayResponse, BAD,BAD}, // RoundTripDelayResponse {BAD, RTDSE1_T105Expiry, BAD,BAD}, // T105Expiry }; /* * NAME * StateMachine() - engine for finite state machine * * * PARAMETERS * INPUT pObject pointer to an FSM object structure * INTPUT event input to the finite state machine * * RETURN VALUE * error codes defined in h245api.h */ HRESULT StateMachine(Object_t *pObject, PDU_t *pPdu, Event_t Event) { UINT uFunction; HRESULT lError; ASSERT(pObject != NULL); if (Event > NUM_EVENTS) { H245TRACE(pObject->dwInst, 1, "StateMachine: Invalid Event %d", Event); return H245_ERROR_PARAM; } if (pObject->State > MAXSTATES) { H245TRACE(pObject->dwInst, 1, "StateMachine: Invalid State %d", pObject->State); return H245_ERROR_INVALID_STATE; } ++(pObject->uNestLevel); #if defined(_DEBUG) H245TRACE(pObject->dwInst, 2, "StateMachine: Entity=%s(%d) State=%d Event=%s(%d)", EntityName[pObject->Entity], pObject->Entity, pObject->State, EventName[Event], Event); #else H245TRACE(pObject->dwInst, 2, "StateMachine: Entity=%d State=%d Event=%d", pObject->Entity, pObject->State, Event); #endif uFunction = StateTable[Event][pObject->State]; if (uFunction < (sizeof (StateFun) / sizeof(StateFun[0]))) { /* indicating a valid transition */ #if defined(_DEBUG) H245TRACE(pObject->dwInst, 2, "StateMachine: Function=%s(%d)", OutputName[uFunction], uFunction); #else // (_DEBUG) H245TRACE(pObject->dwInst, 2, "StateMachine: Function=%d", uFunction); #endif // (_DEBUG) lError = (*StateFun[uFunction])(pObject, pPdu); #if defined(_DEBUG) H245TRACE(pObject->dwInst, 2, "StateMachine: Entity=%s(%d) New State=%d", EntityName[pObject->Entity], pObject->Entity, pObject->State); #else H245TRACE(pObject->dwInst, 2, "StateMachine: Entity=%d New State=%d", pObject->Entity, pObject->State); #endif } else if (uFunction == IGNORE) { H245TRACE(pObject->dwInst, 2, "StateMachine: Event ignored"); #if defined(_DEBUG) H245TRACE(pObject->dwInst, 2, "StateMachine: Event Ignored; Entity=%s(%d) State=%d Event=%s(%d)", EntityName[pObject->Entity], pObject->Entity, pObject->State, EventName[Event], Event); #else H245TRACE(pObject->dwInst, 2, "StateMachine: Entity=%d State=%d Event=%d", pObject->Entity, pObject->State, Event); #endif lError = H245_ERROR_OK; } else { #if defined(_DEBUG) H245TRACE(pObject->dwInst, 2, "StateMachine: Event Invalid; Entity=%s(%d) State=%d Event=%s(%d)", EntityName[pObject->Entity], pObject->Entity, pObject->State, EventName[Event], Event); #else H245TRACE(pObject->dwInst, 2, "StateMachine: Event Invalid; Entity=%d State=%d Event=%d", pObject->Entity, pObject->State, Event); #endif lError = H245_ERROR_INVALID_STATE; } if (--(pObject->uNestLevel) == 0 && pObject->State == 0) { ObjectDestroy(pObject); } return lError; } // StateMachine()