1009 lines
32 KiB
C
1009 lines
32 KiB
C
/***********************************************************************
|
|
* *
|
|
* Filename: pduparse.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: PDUPARSE.C $
|
|
* $Revision: 1.6 $
|
|
* $Modtime: 09 Dec 1996 13:36:34 $
|
|
* $Log: S:/STURGEON/SRC/H245/SRC/VCS/PDUPARSE.C_v $
|
|
*
|
|
* Rev 1.6 09 Dec 1996 13:36:56 EHOWARDX
|
|
* Updated copyright notice.
|
|
*
|
|
* Rev 1.5 29 Jul 1996 16:58:08 EHOWARDX
|
|
*
|
|
* Missed some Geneva update PDU types.
|
|
*
|
|
* Rev 1.4 05 Jun 1996 17:15:02 EHOWARDX
|
|
* MaintenanceLoop fix.
|
|
*
|
|
* Rev 1.3 04 Jun 1996 13:58:06 EHOWARDX
|
|
* Fixed Release build warnings.
|
|
*
|
|
* Rev 1.2 29 May 1996 15:20:24 EHOWARDX
|
|
* Change to use HRESULT.
|
|
*
|
|
* Rev 1.1 28 May 1996 14:25:26 EHOWARDX
|
|
* Tel Aviv update.
|
|
*
|
|
* Rev 1.0 09 May 1996 21:06:40 EHOWARDX
|
|
* Initial revision.
|
|
*
|
|
* Rev 1.8.1.4 09 May 1996 19:48:40 EHOWARDX
|
|
* Change TimerExpiryF function arguements.
|
|
*
|
|
* Rev 1.8.1.3 25 Apr 1996 17:00:16 EHOWARDX
|
|
* Minor fixes.
|
|
*
|
|
* Rev 1.8.1.2 15 Apr 1996 10:48:00 EHOWARDX
|
|
* Update.
|
|
*
|
|
* Rev 1.8.1.1 10 Apr 1996 21:15:54 EHOWARDX
|
|
* Check-in for safety in middle of re-design.
|
|
*
|
|
* Rev 1.8.1.0 05 Apr 1996 20:53:06 EHOWARDX
|
|
* Branched.
|
|
* *
|
|
***********************************************************************/
|
|
|
|
#include "precomp.h"
|
|
|
|
#include "h245api.h"
|
|
#include "h245com.h"
|
|
#include "h245fsm.h"
|
|
|
|
/*
|
|
* NAME
|
|
* PduParseIncoming - parse an inbound PDU and determine Entity, Event, etc.
|
|
*
|
|
*
|
|
* PARAMETERS
|
|
* INPUT pInst Pointer to FSM Instance structure
|
|
* INPUT pPdu Pointer to an incoming PDU structure
|
|
* OUTPUT pEntity Pointer to variable to return PDU state entity in
|
|
* OUTPUT pEvent Pointer to variable to return PDU event in
|
|
* OUTPUT pKey Pointer to variable to return lookup key in
|
|
* OUTPUT pbCreate Pointer to variable to return create flag in
|
|
*
|
|
* RETURN VALUE
|
|
* SUCCESS or FAIL
|
|
*/
|
|
|
|
|
|
HRESULT
|
|
PduParseIncoming(struct InstanceStruct *pInstance, PDU_t *pPdu,
|
|
Entity_t *pEntity, Event_t *pEvent, Key_t *pKey, int *pbCreate)
|
|
{
|
|
ASSERT(pInstance != NULL);
|
|
ASSERT(pPdu != NULL);
|
|
ASSERT(pEntity != NULL);
|
|
ASSERT(pEvent != NULL);
|
|
ASSERT(pKey != NULL);
|
|
ASSERT(pbCreate != NULL);
|
|
|
|
// Set default value for key
|
|
*pKey = 0;
|
|
|
|
switch (pPdu->choice)
|
|
{
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// REQUEST
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
case MltmdSystmCntrlMssg_rqst_chosen:
|
|
*pbCreate = TRUE;
|
|
switch (pPdu->u.MltmdSystmCntrlMssg_rqst.choice)
|
|
{
|
|
case RqstMssg_nonStandard_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = NonStandardRequestPDU;
|
|
break;
|
|
|
|
case masterSlaveDetermination_chosen:
|
|
*pEntity = MSDSE;
|
|
*pEvent = MSDetPDU;
|
|
break;
|
|
|
|
case terminalCapabilitySet_chosen:
|
|
*pEntity = CESE_IN;
|
|
*pEvent = TermCapSetPDU;
|
|
break;
|
|
|
|
case openLogicalChannel_chosen:
|
|
if (pPdu->u.MltmdSystmCntrlMssg_rqst.u.openLogicalChannel.bit_mask & OLCl_rLCPs_present)
|
|
{
|
|
*pEntity = BLCSE_IN;
|
|
*pEvent = OpenBChPDU;
|
|
}
|
|
else
|
|
{
|
|
*pEntity = LCSE_IN;
|
|
*pEvent = OpenUChPDU;
|
|
}
|
|
*pKey = pPdu->u.MltmdSystmCntrlMssg_rqst.u.openLogicalChannel.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
case closeLogicalChannel_chosen:
|
|
*pKey = pPdu->u.MltmdSystmCntrlMssg_rqst.u.closeLogicalChannel.forwardLogicalChannelNumber;
|
|
if (ObjectFind(pInstance, BLCSE_IN, *pKey) != NULL)
|
|
{
|
|
*pEntity = BLCSE_IN;
|
|
*pEvent = CloseBChPDU;
|
|
}
|
|
else
|
|
{
|
|
*pEntity = LCSE_IN;
|
|
*pEvent = CloseUChPDU;
|
|
}
|
|
break;
|
|
|
|
case requestChannelClose_chosen:
|
|
*pEntity = CLCSE_IN;
|
|
*pEvent = ReqChClosePDU;
|
|
*pKey = pPdu->u.MltmdSystmCntrlMssg_rqst.u.requestChannelClose.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
case multiplexEntrySend_chosen:
|
|
*pEntity = MTSE_IN;
|
|
*pEvent = MultiplexEntrySendPDU;
|
|
break;
|
|
|
|
case requestMultiplexEntry_chosen:
|
|
*pEntity = RMESE_IN;
|
|
*pEvent = RequestMultiplexEntryPDU;
|
|
break;
|
|
|
|
case requestMode_chosen:
|
|
*pEntity = MRSE_IN;
|
|
*pEvent = RequestModePDU;
|
|
break;
|
|
|
|
case roundTripDelayRequest_chosen:
|
|
*pEntity = RTDSE;
|
|
*pEvent = RoundTripDelayRequestPDU;
|
|
break;
|
|
|
|
case maintenanceLoopRequest_chosen:
|
|
*pEntity = MLSE_IN;
|
|
*pEvent = MaintenanceLoopRequestPDU;
|
|
switch (pPdu->u.MltmdSystmCntrlMssg_rqst.u.maintenanceLoopRequest.type.choice)
|
|
{
|
|
case systemLoop_chosen:
|
|
break;
|
|
case mediaLoop_chosen:
|
|
*pKey = pPdu->u.MltmdSystmCntrlMssg_rqst.u.maintenanceLoopRequest.type.u.mediaLoop;
|
|
break;
|
|
case logicalChannelLoop_chosen:
|
|
*pKey = pPdu->u.MltmdSystmCntrlMssg_rqst.u.maintenanceLoopRequest.type.u.logicalChannelLoop;
|
|
break;
|
|
default:
|
|
return H245_ERROR_PARAM;
|
|
} // switch
|
|
break;
|
|
|
|
case communicationModeRequest_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = CommunicationModeRequestPDU;
|
|
break;
|
|
|
|
case conferenceRequest_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = ConferenceRequestPDU;
|
|
break;
|
|
#if(0) // this is not part of H.245 version 3
|
|
case h223AnnxARcnfgrtn_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = H223ReconfigPDU;
|
|
break;
|
|
#endif // if (0)
|
|
default:
|
|
H245TRACE(pInstance->dwInst, 1, "PduParseIncoming: Invalid Request %d",
|
|
pPdu->u.MltmdSystmCntrlMssg_rqst.choice);
|
|
return H245_ERROR_PARAM;
|
|
}
|
|
break;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// RESPONSE
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
case MSCMg_rspns_chosen:
|
|
*pbCreate = FALSE;
|
|
switch (pPdu->u.MSCMg_rspns.choice)
|
|
{
|
|
case RspnsMssg_nonStandard_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = NonStandardResponsePDU;
|
|
break;
|
|
|
|
case mstrSlvDtrmntnAck_chosen:
|
|
*pEntity = MSDSE;
|
|
*pEvent = MSDetAckPDU;
|
|
break;
|
|
|
|
case mstrSlvDtrmntnRjct_chosen:
|
|
*pEntity = MSDSE;
|
|
*pEvent = MSDetRejectPDU;
|
|
break;
|
|
|
|
case terminalCapabilitySetAck_chosen:
|
|
*pEntity = CESE_OUT;
|
|
*pEvent = TermCapSetAckPDU;
|
|
break;
|
|
|
|
case trmnlCpbltyStRjct_chosen:
|
|
*pEntity = CESE_OUT;
|
|
*pEvent = TermCapSetRejectPDU;
|
|
break;
|
|
|
|
case openLogicalChannelAck_chosen:
|
|
if (pPdu->u.MSCMg_rspns.u.openLogicalChannelAck.bit_mask & OLCAk_rLCPs_present)
|
|
{
|
|
*pEntity = BLCSE_OUT;
|
|
*pEvent = OpenBChAckPDU;
|
|
}
|
|
else
|
|
{
|
|
*pEntity = LCSE_OUT;
|
|
*pEvent = OpenUChAckPDU;
|
|
}
|
|
*pKey = pPdu->u.MSCMg_rspns.u.openLogicalChannelAck.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
case openLogicalChannelReject_chosen:
|
|
*pKey = pPdu->u.MSCMg_rspns.u.openLogicalChannelReject.forwardLogicalChannelNumber;
|
|
if (ObjectFind(pInstance, BLCSE_OUT, *pKey) != NULL)
|
|
{
|
|
*pEntity = BLCSE_OUT;
|
|
*pEvent = OpenBChRejectPDU;
|
|
}
|
|
else
|
|
{
|
|
*pEntity = LCSE_OUT;
|
|
*pEvent = OpenUChRejectPDU;
|
|
}
|
|
break;
|
|
|
|
case closeLogicalChannelAck_chosen:
|
|
*pKey = pPdu->u.MSCMg_rspns.u.closeLogicalChannelAck.forwardLogicalChannelNumber;
|
|
if (ObjectFind(pInstance, BLCSE_OUT, *pKey) != NULL)
|
|
{
|
|
*pEntity = BLCSE_OUT;
|
|
*pEvent = CloseBChAckPDU;
|
|
}
|
|
else
|
|
{
|
|
*pEntity = LCSE_OUT;
|
|
*pEvent = CloseUChAckPDU;
|
|
}
|
|
break;
|
|
|
|
case requestChannelCloseAck_chosen:
|
|
*pEntity = CLCSE_OUT;
|
|
*pEvent = ReqChCloseAckPDU;
|
|
*pKey = pPdu->u.MSCMg_rspns.u.requestChannelCloseAck.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
case rqstChnnlClsRjct_chosen:
|
|
*pEntity = CLCSE_OUT;
|
|
*pEvent = ReqChCloseRejectPDU;
|
|
*pKey = pPdu->u.MSCMg_rspns.u.rqstChnnlClsRjct.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
case multiplexEntrySendAck_chosen:
|
|
*pEntity = MTSE_OUT;
|
|
*pEvent = MultiplexEntrySendAckPDU;
|
|
break;
|
|
|
|
case multiplexEntrySendReject_chosen:
|
|
*pEntity = MTSE_OUT;
|
|
*pEvent = MultiplexEntrySendRejectPDU;
|
|
break;
|
|
|
|
case requestMultiplexEntryAck_chosen:
|
|
*pEntity = RMESE_OUT;
|
|
*pEvent = RequestMultiplexEntryAckPDU;
|
|
break;
|
|
|
|
case rqstMltplxEntryRjct_chosen:
|
|
*pEntity = RMESE_OUT;
|
|
*pEvent = RequestMultiplexEntryRejectPDU;
|
|
break;
|
|
|
|
case requestModeAck_chosen:
|
|
*pEntity = MRSE_OUT;
|
|
*pEvent = RequestModeAckPDU;
|
|
break;
|
|
|
|
case requestModeReject_chosen:
|
|
*pEntity = MRSE_OUT;
|
|
*pEvent = RequestModeRejectPDU;
|
|
break;
|
|
|
|
case roundTripDelayResponse_chosen:
|
|
*pEntity = RTDSE;
|
|
*pEvent = RoundTripDelayResponsePDU;
|
|
break;
|
|
|
|
case maintenanceLoopAck_chosen:
|
|
*pEntity = MLSE_OUT;
|
|
*pEvent = MaintenanceLoopAckPDU;
|
|
switch (pPdu->u.MSCMg_rspns.u.maintenanceLoopAck.type.choice)
|
|
{
|
|
case systemLoop_chosen:
|
|
break;
|
|
case mediaLoop_chosen:
|
|
*pKey = pPdu->u.MSCMg_rspns.u.maintenanceLoopAck.type.u.mediaLoop;
|
|
break;
|
|
case logicalChannelLoop_chosen:
|
|
*pKey = pPdu->u.MSCMg_rspns.u.maintenanceLoopAck.type.u.logicalChannelLoop;
|
|
break;
|
|
default:
|
|
return H245_ERROR_PARAM;
|
|
} // switch
|
|
break;
|
|
|
|
case maintenanceLoopReject_chosen:
|
|
*pEntity = MLSE_OUT;
|
|
*pEvent = MaintenanceLoopRejectPDU;
|
|
switch (pPdu->u.MSCMg_rspns.u.maintenanceLoopReject.type.choice)
|
|
{
|
|
case systemLoop_chosen:
|
|
break;
|
|
case mediaLoop_chosen:
|
|
*pKey = pPdu->u.MSCMg_rspns.u.maintenanceLoopReject.type.u.mediaLoop;
|
|
break;
|
|
case logicalChannelLoop_chosen:
|
|
*pKey = pPdu->u.MSCMg_rspns.u.maintenanceLoopReject.type.u.logicalChannelLoop;
|
|
break;
|
|
default:
|
|
return H245_ERROR_PARAM;
|
|
} // switch
|
|
break;
|
|
|
|
case cmmnctnMdRspns_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = CommunicationModeResponsePDU;
|
|
break;
|
|
|
|
case conferenceResponse_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = ConferenceResponsePDU;
|
|
break;
|
|
#if(0) // this is not part of H.245 version 3
|
|
case h223AnnxARcnfgrtnAck_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = H223ReconfigAckPDU;
|
|
break;
|
|
|
|
case h223AnnxARcnfgrtnRjct_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = H223ReconfigRejectPDU;
|
|
break;
|
|
#endif // if(0)
|
|
default:
|
|
H245TRACE(pInstance->dwInst, 1, "PduParseIncoming: Invalid Response %d",
|
|
pPdu->u.MSCMg_rspns.choice);
|
|
return H245_ERROR_PARAM;
|
|
}
|
|
break;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// COMMAND
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
case MSCMg_cmmnd_chosen:
|
|
*pbCreate = FALSE;
|
|
switch (pPdu->u.MSCMg_cmmnd.choice)
|
|
{
|
|
case CmmndMssg_nonStandard_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = NonStandardCommandPDU;
|
|
break;
|
|
|
|
case mntnncLpOffCmmnd_chosen:
|
|
*pEntity = MLSE_IN;
|
|
*pEvent = MaintenanceLoopOffCommandPDU;
|
|
break;
|
|
|
|
case sndTrmnlCpbltySt_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = SendTerminalCapabilitySetPDU;
|
|
*pbCreate = TRUE;
|
|
break;
|
|
|
|
case encryptionCommand_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = EncryptionCommandPDU;
|
|
break;
|
|
|
|
case flowControlCommand_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = FlowControlCommandPDU;
|
|
break;
|
|
|
|
case endSessionCommand_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = EndSessionCommandPDU;
|
|
break;
|
|
|
|
case miscellaneousCommand_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = MiscellaneousCommandPDU;
|
|
break;
|
|
|
|
case communicationModeCommand_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = CommunicationModeCommandPDU;
|
|
break;
|
|
|
|
case conferenceCommand_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = ConferenceCommandPDU;
|
|
break;
|
|
|
|
default:
|
|
H245TRACE(pInstance->dwInst, 1, "PduParseIncoming: Invalid Command %d",
|
|
pPdu->u.MSCMg_cmmnd.choice);
|
|
return H245_ERROR_PARAM;
|
|
} // switch
|
|
break;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// INDICATION
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
case indication_chosen:
|
|
*pbCreate = FALSE;
|
|
switch (pPdu->u.indication.choice)
|
|
{
|
|
case IndctnMssg_nonStandard_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = NonStandardIndicationPDU;
|
|
break;
|
|
|
|
case functionNotUnderstood_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = FunctionNotUnderstoodPDU;
|
|
break;
|
|
|
|
case mstrSlvDtrmntnRls_chosen:
|
|
*pEntity = MSDSE;
|
|
*pEvent = MSDetReleasePDU;
|
|
break;
|
|
|
|
case trmnlCpbltyStRls_chosen:
|
|
*pEntity = CESE_IN;
|
|
*pEvent = TermCapSetReleasePDU;
|
|
break;
|
|
|
|
case opnLgclChnnlCnfrm_chosen:
|
|
*pEntity = BLCSE_IN;
|
|
*pEvent = OpenBChConfirmPDU;
|
|
*pKey = pPdu->u.indication.u.opnLgclChnnlCnfrm.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
case rqstChnnlClsRls_chosen:
|
|
*pEntity = CLCSE_IN;
|
|
*pEvent = ReqChCloseReleasePDU;
|
|
*pKey = pPdu->u.indication.u.rqstChnnlClsRls.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
case mltplxEntrySndRls_chosen:
|
|
*pEntity = MTSE_IN;
|
|
*pEvent = MultiplexEntrySendReleasePDU;
|
|
break;
|
|
|
|
case rqstMltplxEntryRls_chosen:
|
|
*pEntity = RMESE_IN;
|
|
*pEvent = RequestMultiplexEntryReleasePDU;
|
|
break;
|
|
|
|
case requestModeRelease_chosen:
|
|
*pEntity = MRSE_IN;
|
|
*pEvent = RequestModeReleasePDU;
|
|
break;
|
|
|
|
case miscellaneousIndication_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = MiscellaneousIndicationPDU;
|
|
break;
|
|
|
|
case jitterIndication_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = JitterIndicationPDU;
|
|
break;
|
|
|
|
case h223SkewIndication_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = H223SkewIndicationPDU;
|
|
break;
|
|
|
|
case newATMVCIndication_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = NewATMVCIndicationPDU;
|
|
break;
|
|
|
|
case userInput_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = UserInputIndicationPDU;
|
|
break;
|
|
|
|
case h2250MxmmSkwIndctn_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = H2250MaximumSkewIndicationPDU;
|
|
break;
|
|
|
|
case mcLocationIndication_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = MCLocationIndicationPDU;
|
|
break;
|
|
|
|
case conferenceIndication_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = ConferenceIndicationPDU;
|
|
break;
|
|
|
|
case vendorIdentification_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = VendorIdentificationPDU;
|
|
break;
|
|
|
|
case IndicationMessage_functionNotSupported_chosen:
|
|
*pEntity = STATELESS;
|
|
*pEvent = FunctionNotSupportedPDU;
|
|
break;
|
|
|
|
default:
|
|
H245TRACE(pInstance->dwInst, 1, "PduParseIncoming: Invalid Indication %d",
|
|
pPdu->u.indication.choice);
|
|
return H245_ERROR_PARAM;
|
|
} // switch
|
|
break;
|
|
|
|
default:
|
|
H245TRACE(pInstance->dwInst, 1, "PduParseIncoming: Invalid Message Type %d",
|
|
pPdu->choice);
|
|
return H245_ERROR_PARAM;
|
|
} // switch
|
|
|
|
return H245_ERROR_OK;
|
|
} // PduParseIncoming()
|
|
|
|
|
|
|
|
/*
|
|
* NAME
|
|
* PduParseOutgoing - parse an outbound PDU and determine Entity, Event, etc.
|
|
*
|
|
* PARAMETERS
|
|
* INPUT pInst Pointer to FSM Instance structure
|
|
* INPUT pPdu Pointer to an incoming PDU structure
|
|
* OUTPUT pEntity Pointer to variable to return PDU state entity in
|
|
* OUTPUT pEvent Pointer to variable to return PDU event in
|
|
* OUTPUT pKey Pointer to variable to return lookup key in
|
|
* OUTPUT pbCreate Pointer to variable to return create flag in
|
|
*
|
|
* RETURN VALUE
|
|
* SUCCESS or FAIL
|
|
*/
|
|
|
|
HRESULT
|
|
PduParseOutgoing(struct InstanceStruct *pInstance, PDU_t *pPdu,
|
|
Entity_t *pEntity, Event_t *pEvent, Key_t *pKey, int *pbCreate)
|
|
{
|
|
ASSERT(pInstance != NULL);
|
|
ASSERT(pPdu != NULL);
|
|
ASSERT(pEntity != NULL);
|
|
ASSERT(pEvent != NULL);
|
|
ASSERT(pKey != NULL);
|
|
ASSERT(pbCreate != NULL);
|
|
|
|
// Set default value for key
|
|
*pKey = 0;
|
|
|
|
switch (pPdu->choice)
|
|
{
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// REQUEST
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
case MltmdSystmCntrlMssg_rqst_chosen:
|
|
*pbCreate = TRUE;
|
|
switch (pPdu->u.MltmdSystmCntrlMssg_rqst.choice)
|
|
{
|
|
case RqstMssg_nonStandard_chosen:
|
|
*pEntity = STATELESS;
|
|
break;
|
|
|
|
case masterSlaveDetermination_chosen:
|
|
*pEntity = MSDSE;
|
|
*pEvent = MSDetReq;
|
|
break;
|
|
|
|
case terminalCapabilitySet_chosen:
|
|
*pEntity = CESE_OUT;
|
|
*pEvent = TransferCapRequest;
|
|
break;
|
|
|
|
case openLogicalChannel_chosen:
|
|
if (pPdu->u.MltmdSystmCntrlMssg_rqst.u.openLogicalChannel.bit_mask & OLCl_rLCPs_present)
|
|
{
|
|
*pEntity = BLCSE_OUT;
|
|
*pEvent = ReqBEstablish;
|
|
}
|
|
else
|
|
{
|
|
*pEntity = LCSE_OUT;
|
|
*pEvent = ReqUEstablish;
|
|
}
|
|
*pKey = pPdu->u.MltmdSystmCntrlMssg_rqst.u.openLogicalChannel.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
case closeLogicalChannel_chosen:
|
|
*pKey = pPdu->u.MltmdSystmCntrlMssg_rqst.u.closeLogicalChannel.forwardLogicalChannelNumber;
|
|
if (ObjectFind(pInstance, BLCSE_OUT, *pKey) != NULL)
|
|
{
|
|
*pEntity = BLCSE_OUT;
|
|
*pEvent = ReqClsBLCSE;
|
|
}
|
|
else
|
|
{
|
|
*pEntity = LCSE_OUT;
|
|
*pEvent = ReqURelease;
|
|
}
|
|
break;
|
|
|
|
case requestChannelClose_chosen:
|
|
*pEntity = CLCSE_OUT;
|
|
*pEvent = ReqClose;
|
|
*pKey = pPdu->u.MltmdSystmCntrlMssg_rqst.u.requestChannelClose.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
case multiplexEntrySend_chosen:
|
|
*pEntity = MTSE_OUT;
|
|
*pEvent = MTSE_TRANSFER_request;
|
|
break;
|
|
|
|
case requestMultiplexEntry_chosen:
|
|
*pEntity = RMESE_OUT;
|
|
*pEvent = RMESE_SEND_request;
|
|
break;
|
|
|
|
case requestMode_chosen:
|
|
*pEntity = MRSE_OUT;
|
|
*pEvent = MRSE_TRANSFER_request;
|
|
break;
|
|
|
|
case roundTripDelayRequest_chosen:
|
|
*pEntity = RTDSE;
|
|
*pEvent = RTDSE_TRANSFER_request;
|
|
break;
|
|
|
|
case maintenanceLoopRequest_chosen:
|
|
*pEntity = MLSE_OUT;
|
|
*pEvent = MLSE_LOOP_request;
|
|
switch (pPdu->u.MltmdSystmCntrlMssg_rqst.u.maintenanceLoopRequest.type.choice)
|
|
{
|
|
case systemLoop_chosen:
|
|
break;
|
|
case mediaLoop_chosen:
|
|
*pKey = pPdu->u.MltmdSystmCntrlMssg_rqst.u.maintenanceLoopRequest.type.u.mediaLoop;
|
|
break;
|
|
case logicalChannelLoop_chosen:
|
|
*pKey = pPdu->u.MltmdSystmCntrlMssg_rqst.u.maintenanceLoopRequest.type.u.logicalChannelLoop;
|
|
break;
|
|
default:
|
|
return H245_ERROR_PARAM;
|
|
} // switch
|
|
break;
|
|
|
|
case communicationModeRequest_chosen:
|
|
case conferenceRequest_chosen:
|
|
// case h223AnnxARcnfgrtn_chosen:
|
|
*pEntity = STATELESS;
|
|
break;
|
|
|
|
default:
|
|
H245TRACE(pInstance->dwInst, 1, "PduParseOutgoing: Invalid Request %d",
|
|
pPdu->u.MltmdSystmCntrlMssg_rqst.choice);
|
|
return H245_ERROR_PARAM;
|
|
}
|
|
break;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// RESPONSE
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
case MSCMg_rspns_chosen:
|
|
*pbCreate = FALSE;
|
|
switch (pPdu->u.MSCMg_rspns.choice)
|
|
{
|
|
case RspnsMssg_nonStandard_chosen:
|
|
*pEntity = STATELESS;
|
|
break;
|
|
|
|
#if 0
|
|
// Master Slave Determination Ack is generated by State Machine only
|
|
case mstrSlvDtrmntnAck_chosen:
|
|
*pEntity = MSDSE;
|
|
break;
|
|
|
|
// Master Slave Determination Reject is generated by State Machine only
|
|
case mstrSlvDtrmntnRjct_chosen:
|
|
*pEntity = MSDSE;
|
|
break;
|
|
#endif
|
|
|
|
case terminalCapabilitySetAck_chosen:
|
|
*pEntity = CESE_IN;
|
|
*pEvent = CESE_TRANSFER_response;
|
|
break;
|
|
|
|
case trmnlCpbltyStRjct_chosen:
|
|
*pEntity = CESE_IN;
|
|
*pEvent = CESE_REJECT_request;
|
|
break;
|
|
|
|
case openLogicalChannelAck_chosen:
|
|
if (pPdu->u.MSCMg_rspns.u.openLogicalChannelAck.bit_mask & OLCAk_rLCPs_present)
|
|
{
|
|
*pEntity = BLCSE_IN;
|
|
*pEvent = ResponseBEstablish;
|
|
}
|
|
else
|
|
{
|
|
*pEntity = LCSE_IN;
|
|
*pEvent = ResponseUEstablish;
|
|
}
|
|
*pKey = pPdu->u.MSCMg_rspns.u.openLogicalChannelAck.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
case openLogicalChannelReject_chosen:
|
|
*pKey = pPdu->u.MSCMg_rspns.u.openLogicalChannelReject.forwardLogicalChannelNumber;
|
|
if (ObjectFind(pInstance, BLCSE_IN, *pKey) != NULL)
|
|
{
|
|
*pEntity = BLCSE_IN;
|
|
*pEvent = OpenRejectBLCSE;
|
|
}
|
|
else
|
|
{
|
|
*pEntity = LCSE_IN;
|
|
*pEvent = EstablishUReject;
|
|
}
|
|
break;
|
|
|
|
#if 0
|
|
// Close Logical Channel Ack is generated by State Machine only
|
|
case closeLogicalChannelAck_chosen:
|
|
*pKey = pPdu->u.MSCMg_rspns.u.closeLogicalChannelAck.forwardLogicalChannelNumber;
|
|
if (ObjectFind(pInstance, BLCSE_IN, *pKey) != NULL)
|
|
{
|
|
*pEntity = BLCSE_IN;
|
|
}
|
|
else
|
|
{
|
|
*pEntity = LCSE_IN;
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
case requestChannelCloseAck_chosen:
|
|
*pEntity = CLCSE_IN;
|
|
*pEvent = CLCSE_CLOSE_response;
|
|
*pKey = pPdu->u.MSCMg_rspns.u.requestChannelCloseAck.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
case rqstChnnlClsRjct_chosen:
|
|
*pEntity = CLCSE_IN;
|
|
*pEvent = CLCSE_REJECT_request;
|
|
*pKey = pPdu->u.MSCMg_rspns.u.rqstChnnlClsRjct.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
case multiplexEntrySendAck_chosen:
|
|
*pEntity = MTSE_IN;
|
|
*pEvent = MTSE_TRANSFER_response;
|
|
break;
|
|
|
|
case multiplexEntrySendReject_chosen:
|
|
*pEntity = MTSE_IN;
|
|
*pEvent = MTSE_REJECT_request;
|
|
break;
|
|
|
|
case requestMultiplexEntryAck_chosen:
|
|
*pEntity = RMESE_IN;
|
|
*pEvent = RMESE_SEND_response;
|
|
break;
|
|
|
|
case rqstMltplxEntryRjct_chosen:
|
|
*pEntity = RMESE_IN;
|
|
*pEvent = RMESE_REJECT_request;
|
|
break;
|
|
|
|
case requestModeAck_chosen:
|
|
*pEntity = MRSE_IN;
|
|
*pEvent = MRSE_TRANSFER_response;
|
|
break;
|
|
|
|
case requestModeReject_chosen:
|
|
*pEntity = MRSE_IN;
|
|
*pEvent = MRSE_REJECT_request;
|
|
break;
|
|
|
|
#if 0
|
|
// Round Trip Delay Response sent by State Machine only
|
|
case roundTripDelayResponse_chosen:
|
|
*pEntity = RTDSE;
|
|
*pEvent = RoundTripDelayResponse;
|
|
break;
|
|
#endif
|
|
|
|
case maintenanceLoopAck_chosen:
|
|
*pEntity = MLSE_IN;
|
|
*pEvent = MLSE_LOOP_response;
|
|
// Caveat: Channel number must be zero if system loop!
|
|
*pKey = pPdu->u.MSCMg_rspns.u.maintenanceLoopAck.type.u.mediaLoop;
|
|
break;
|
|
|
|
case maintenanceLoopReject_chosen:
|
|
*pEntity = MLSE_IN;
|
|
*pEvent = MLSE_IN_RELEASE_request;
|
|
// Caveat: Channel number must be zero if system loop!
|
|
*pKey = pPdu->u.MSCMg_rspns.u.maintenanceLoopReject.type.u.mediaLoop;
|
|
break;
|
|
|
|
case cmmnctnMdRspns_chosen:
|
|
case conferenceResponse_chosen:
|
|
// case h223AnnxARcnfgrtnAck_chosen:
|
|
// case h223AnnxARcnfgrtnRjct_chosen:
|
|
*pEntity = STATELESS;
|
|
break;
|
|
|
|
default:
|
|
H245TRACE(pInstance->dwInst, 1, "PduParseOutgoing: Invalid Response %d",
|
|
pPdu->u.MSCMg_rspns.choice);
|
|
return H245_ERROR_PARAM;
|
|
}
|
|
break;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// COMMAND
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
case MSCMg_cmmnd_chosen:
|
|
*pbCreate = FALSE;
|
|
switch (pPdu->u.MSCMg_cmmnd.choice)
|
|
{
|
|
case CmmndMssg_nonStandard_chosen:
|
|
*pEntity = STATELESS;
|
|
break;
|
|
|
|
case mntnncLpOffCmmnd_chosen:
|
|
*pEntity = MLSE_OUT;
|
|
*pEvent = MLSE_OUT_RELEASE_request;
|
|
break;
|
|
|
|
case sndTrmnlCpbltySt_chosen:
|
|
case encryptionCommand_chosen:
|
|
case flowControlCommand_chosen:
|
|
case endSessionCommand_chosen:
|
|
case miscellaneousCommand_chosen:
|
|
case communicationModeCommand_chosen:
|
|
case conferenceCommand_chosen:
|
|
*pEntity = STATELESS;
|
|
break;
|
|
|
|
default:
|
|
H245TRACE(pInstance->dwInst, 1, "PduParseOutgoing: Invalid Command %d",
|
|
pPdu->u.MSCMg_cmmnd.choice);
|
|
return H245_ERROR_PARAM;
|
|
} // switch
|
|
break;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// INDICATION
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
case indication_chosen:
|
|
*pbCreate = FALSE;
|
|
switch (pPdu->u.indication.choice)
|
|
{
|
|
case IndctnMssg_nonStandard_chosen:
|
|
*pEntity = STATELESS;
|
|
break;
|
|
|
|
case functionNotUnderstood_chosen:
|
|
*pEntity = STATELESS;
|
|
break;
|
|
|
|
#if 0
|
|
// Master Slave Determination Release is sent by State Machine Only
|
|
case mstrSlvDtrmntnRls_chosen:
|
|
*pEntity = MSDSE;
|
|
break;
|
|
|
|
// Terminal Capability Set Release is sent by State Machine Only
|
|
case trmnlCpbltyStRls_chosen:
|
|
*pEntity = CESE_OUT
|
|
break;
|
|
#endif
|
|
|
|
case opnLgclChnnlCnfrm_chosen:
|
|
*pEntity = BLCSE_OUT;
|
|
*pEvent = RspConfirmBLCSE;
|
|
*pKey = pPdu->u.indication.u.opnLgclChnnlCnfrm.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
#if 0
|
|
// Request Channel Close Release is sent by State Machine Only
|
|
case rqstChnnlClsRls_chosen:
|
|
*pEntity = CLCSE_OUT;
|
|
*pKey = pPdu->u.indication.u.rqstChnnlClsRls.forwardLogicalChannelNumber;
|
|
break;
|
|
|
|
// Multiplex Entry Send Release is sent by State Machine Only
|
|
case mltplxEntrySndRls_chosen:
|
|
*pEntity = MTSE_OUT;
|
|
break;
|
|
|
|
// Request Multiplex Entry Release is sent by State Machine Only
|
|
case rqstMltplxEntryRls_chosen:
|
|
*pEntity = RMESE_OUT;
|
|
break;
|
|
|
|
// Request Mode Release is sent by State Machine Only
|
|
case requestModeRelease_chosen:
|
|
*pEntity = MRSE_OUT;
|
|
break;
|
|
#endif
|
|
|
|
case miscellaneousIndication_chosen:
|
|
case jitterIndication_chosen:
|
|
case h223SkewIndication_chosen:
|
|
case newATMVCIndication_chosen:
|
|
case userInput_chosen:
|
|
case h2250MxmmSkwIndctn_chosen:
|
|
case mcLocationIndication_chosen:
|
|
case conferenceIndication_chosen:
|
|
case vendorIdentification_chosen:
|
|
case IndicationMessage_functionNotSupported_chosen:
|
|
*pEntity = STATELESS;
|
|
break;
|
|
|
|
default:
|
|
H245TRACE(pInstance->dwInst, 1, "PduParseOutgoing: Invalid Indication %d",
|
|
pPdu->u.indication.choice);
|
|
return H245_ERROR_PARAM;
|
|
} // switch
|
|
break;
|
|
|
|
default:
|
|
H245TRACE(pInstance->dwInst, 1, "PduParseOutgoing: Invalid Message Type %d",
|
|
pPdu->choice);
|
|
return H245_ERROR_PARAM;
|
|
} // switch
|
|
|
|
return H245_ERROR_OK;
|
|
} // PduParseOutgoing()
|