You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
418 lines
12 KiB
418 lines
12 KiB
/***********************************************************************
|
|
* *
|
|
* Filename: rmese.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: RMESE.C $
|
|
* $Revision: 1.3 $
|
|
* $Modtime: 09 Dec 1996 13:36:34 $
|
|
* $Log: S:/STURGEON/SRC/H245/SRC/VCS/RMESE.C_v $
|
|
*
|
|
* Rev 1.3 09 Dec 1996 13:37:00 EHOWARDX
|
|
* Updated copyright notice.
|
|
*
|
|
* Rev 1.2 04 Jun 1996 13:57:38 EHOWARDX
|
|
* Fixed Release build warnings.
|
|
*
|
|
* Rev 1.1 30 May 1996 23:39:26 EHOWARDX
|
|
* Cleanup.
|
|
*
|
|
* Rev 1.0 09 May 1996 21:06:40 EHOWARDX
|
|
* Initial revision.
|
|
*
|
|
* Rev 1.1 09 May 1996 19:48:50 EHOWARDX
|
|
* Change TimerExpiryF function arguements.
|
|
*
|
|
* Rev 1.0 15 Apr 1996 10:45:20 EHOWARDX
|
|
* Initial revision.
|
|
* *
|
|
***********************************************************************/
|
|
|
|
#include "precomp.h"
|
|
|
|
#include "h245api.h"
|
|
#include "h245com.h"
|
|
#include "h245fsm.h"
|
|
#include "rmese.h"
|
|
|
|
|
|
|
|
// Out-going/In-coming RMESE states
|
|
#define RMESE_IDLE 0 // IDLE
|
|
#define RMESE_WAIT 1 // AWAITING_RESPONSE
|
|
|
|
|
|
|
|
extern unsigned int uT107;
|
|
|
|
/***********************************************************************
|
|
*
|
|
* LOCAL FUNCTIONS
|
|
*
|
|
***********************************************************************/
|
|
|
|
/*
|
|
* NAME
|
|
* T107ExpiryF - Callback function called by the timer
|
|
*
|
|
*
|
|
* PARAMETERS
|
|
* INPUT dwInst current instance of H245
|
|
* INPUT id timer id
|
|
* INPUT pObject pointer to a State Entity
|
|
*
|
|
*
|
|
* RETURN VALUE
|
|
* OK
|
|
*/
|
|
|
|
int T107ExpiryF(struct InstanceStruct *pInstance, DWORD_PTR dwTimerId, void *pObject)
|
|
{
|
|
return FsmTimerEvent(pInstance, dwTimerId, pObject, T107Expiry);
|
|
} // T107ExpiryF()
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
*
|
|
* OUT-GOING FINITE STATE MACHINE FUNCTIONS
|
|
*
|
|
***********************************************************************/
|
|
|
|
/*
|
|
* NAME
|
|
* RMESE0_SEND_requestF - SEND.request from API in IDLE state
|
|
*
|
|
*
|
|
* PARAMETERS
|
|
* INPUT pObject pointer to State Entity
|
|
* INPUT pPdu pointer to PDU
|
|
*
|
|
* RETURN VALUE
|
|
* Error return codes defined in h245com.h
|
|
*/
|
|
|
|
HRESULT RMESE0_SEND_requestF (Object_t *pObject, PDU_t *pPdu)
|
|
{
|
|
HRESULT lError;
|
|
|
|
ASSERT(pObject->Entity == RMESE_OUT);
|
|
ASSERT(pObject->State == RMESE_IDLE);
|
|
H245TRACE(pObject->dwInst, 2, "RMESE0_SEND_request:%d", pObject->Key);
|
|
|
|
// Save information for release
|
|
pObject->u.rmese = pPdu->u.indication.u.rqstMltplxEntryRls;
|
|
|
|
// Send RequestMultiplexEntry PDU to remote peer
|
|
lError = sendPDU(pObject->pInstance, pPdu);
|
|
|
|
// Set timer T107
|
|
pObject->State = RMESE_WAIT;
|
|
FsmStartTimer(pObject, T107ExpiryF, uT107);
|
|
|
|
return lError;
|
|
} // RMESE0_SEND_request
|
|
|
|
|
|
|
|
/*
|
|
* NAME
|
|
* RMESE1_SEND_requestF - SEND.request from API in AWAITING RESPONSE state
|
|
*
|
|
*
|
|
* PARAMETERS
|
|
* INPUT pObject pointer to State Entity
|
|
* INPUT pPdu pointer to PDU
|
|
*
|
|
* RETURN VALUE
|
|
* Error return codes defined in h245com.h
|
|
*/
|
|
|
|
HRESULT RMESE1_SEND_requestF (Object_t *pObject, PDU_t *pPdu)
|
|
{
|
|
HRESULT lError;
|
|
|
|
ASSERT(pObject->Entity == RMESE_OUT);
|
|
ASSERT(pObject->State == RMESE_WAIT);
|
|
H245TRACE(pObject->dwInst, 2, "RMESE1_SEND_request:%d", pObject->Key);
|
|
|
|
// Reset timer T107
|
|
FsmStopTimer(pObject);
|
|
|
|
// Save information for release
|
|
pObject->u.rmese = pPdu->u.indication.u.rqstMltplxEntryRls;
|
|
|
|
// Send RequestMultiplexEntry PDU to remote peer
|
|
lError = sendPDU(pObject->pInstance, pPdu);
|
|
|
|
// Set timer T107
|
|
FsmStartTimer(pObject, T107ExpiryF, uT107);
|
|
|
|
return lError;
|
|
} // RMESE1_SEND_request
|
|
|
|
|
|
|
|
/*
|
|
* NAME
|
|
* RMESE1_RequestMuxEntryAckF - RequestMultiplexEntryAck in AWAITING RESPONSE state
|
|
*
|
|
*
|
|
* PARAMETERS
|
|
* INPUT pObject pointer to State Entity
|
|
* INPUT pPdu pointer to PDU
|
|
*
|
|
* RETURN VALUE
|
|
* Error return codes defined in h245com.h
|
|
*/
|
|
|
|
HRESULT RMESE1_RequestMuxEntryAckF (Object_t *pObject, PDU_t *pPdu)
|
|
{
|
|
ASSERT(pObject->Entity == RMESE_OUT);
|
|
ASSERT(pObject->State == RMESE_WAIT);
|
|
H245TRACE(pObject->dwInst, 2, "RMESE1_RequestMuxEntryAck:%d", pObject->Key);
|
|
|
|
// Reset timer T107
|
|
FsmStopTimer(pObject);
|
|
|
|
// Send SEND.confirm to H.245 user
|
|
pObject->State = RMESE_IDLE;
|
|
H245FsmConfirm(pPdu, H245_CONF_RMESE, pObject->pInstance, pObject->dwTransId, FSM_OK);
|
|
|
|
return 0;
|
|
} // RMESE1_RequestMuxEntryAck
|
|
|
|
|
|
|
|
/*
|
|
* NAME
|
|
* RMESE1_RequestMuxEntryRejF - RequestMultiplexEntryReject in AWAITING RESPONSE state
|
|
*
|
|
*
|
|
* PARAMETERS
|
|
* INPUT pObject pointer to State Entity
|
|
* INPUT pPdu pointer to PDU
|
|
*
|
|
* RETURN VALUE
|
|
* Error return codes defined in h245com.h
|
|
*/
|
|
|
|
HRESULT RMESE1_RequestMuxEntryRejF (Object_t *pObject, PDU_t *pPdu)
|
|
{
|
|
ASSERT(pObject->Entity == RMESE_OUT);
|
|
ASSERT(pObject->State == RMESE_WAIT);
|
|
H245TRACE(pObject->dwInst, 2, "RMESE0_RequestMuxEntryRej:%d", pObject->Key);
|
|
|
|
// Reset timer T107
|
|
FsmStopTimer(pObject);
|
|
|
|
// Send REJECT.indication to H.245 user
|
|
pObject->State = RMESE_IDLE;
|
|
H245FsmConfirm(pPdu, H245_CONF_RMESE_REJECT, pObject->pInstance, pObject->dwTransId, FSM_OK);
|
|
|
|
return 0;
|
|
} // RMESE1_RequestMuxEntryRej
|
|
|
|
|
|
|
|
/*
|
|
* NAME
|
|
* RMESE1_T107ExpiryF - timer T107 Expiry
|
|
*
|
|
*
|
|
* PARAMETERS
|
|
* INPUT pObject pointer to State Entity
|
|
* INPUT pPdu pointer to PDU
|
|
*
|
|
* RETURN VALUE
|
|
* Error return codes defined in h245com.h
|
|
*/
|
|
|
|
HRESULT RMESE1_T107ExpiryF (Object_t *pObject, PDU_t *pPdu)
|
|
{
|
|
HRESULT lError;
|
|
PDU_t * pOut;
|
|
unsigned short wNumber = (unsigned short) pObject->Key;
|
|
|
|
ASSERT(pObject->Entity == RMESE_OUT);
|
|
ASSERT(pObject->State == RMESE_WAIT);
|
|
ASSERT(pPdu == NULL);
|
|
H245TRACE(pObject->dwInst, 2, "RMESE1_T107Expiry:%d", pObject->Key);
|
|
|
|
// Send RequestMultiplexEntryRelease PDU to remote peer
|
|
pOut = MemAlloc(sizeof(*pOut));
|
|
if (pOut == NULL)
|
|
{
|
|
H245TRACE(pObject->dwInst, 2,
|
|
"RMESE1_T107ExpiryF: memory allocation failed");
|
|
return H245_ERROR_NOMEM;
|
|
}
|
|
pOut->choice = indication_chosen;
|
|
pOut->u.indication.choice = rqstMltplxEntryRls_chosen;
|
|
pOut->u.indication.u.rqstMltplxEntryRls = pObject->u.rmese;
|
|
lError = sendPDU(pObject->pInstance, pOut);
|
|
MemFree(pOut);
|
|
|
|
// Send REJECT.indication to H.245 user
|
|
// SOURCE := PROTOCOL
|
|
pObject->State = RMESE_IDLE;
|
|
H245FsmConfirm(NULL, H245_CONF_RMESE_EXPIRED, pObject->pInstance, pObject->dwTransId, FSM_OK);
|
|
|
|
return lError;
|
|
} // RMESE1_T107Expiry
|
|
|
|
/***********************************************************************
|
|
*
|
|
* IN-COMING FINITE STATE MACHINE FUNCTIONS
|
|
*
|
|
***********************************************************************/
|
|
|
|
/*
|
|
* NAME
|
|
* RMESE0_RequestMuxEntryF - RequestMultiplexEntry received in IDLE state
|
|
*
|
|
*
|
|
* PARAMETERS
|
|
* INPUT pObject pointer to State Entity
|
|
* INPUT pPdu pointer to PDU
|
|
*
|
|
* RETURN VALUE
|
|
* Error return codes defined in h245com.h
|
|
*/
|
|
|
|
HRESULT RMESE0_RequestMuxEntryF (Object_t *pObject, PDU_t *pPdu)
|
|
{
|
|
ASSERT(pObject->Entity == RMESE_IN);
|
|
ASSERT(pObject->State == RMESE_IDLE);
|
|
H245TRACE(pObject->dwInst, 2, "RMESE0_RequestMuxEntry:%d", pObject->Key);
|
|
|
|
// Send SEND.indication to H.245 user
|
|
pObject->State = RMESE_WAIT;
|
|
H245FsmIndication(pPdu, H245_IND_RMESE, pObject->pInstance, pObject->dwTransId, FSM_OK);
|
|
|
|
return 0;
|
|
} // RMESE0_RequestMuxEntry
|
|
|
|
|
|
|
|
/*
|
|
* NAME
|
|
* RMESE1_RequestMuxEntryF - RequestMultiplexEntry received in AWAITING RESPONSE state
|
|
*
|
|
*
|
|
* PARAMETERS
|
|
* INPUT pObject pointer to State Entity
|
|
* INPUT pPdu pointer to PDU
|
|
*
|
|
* RETURN VALUE
|
|
* Error return codes defined in h245com.h
|
|
*/
|
|
|
|
HRESULT RMESE1_RequestMuxEntryF (Object_t *pObject, PDU_t *pPdu)
|
|
{
|
|
ASSERT(pObject->Entity == RMESE_IN);
|
|
ASSERT(pObject->State == RMESE_WAIT);
|
|
H245TRACE(pObject->dwInst, 2, "RMESE1_RequestMuxEntry:%d", pObject->Key);
|
|
|
|
#if defined(SDL_COMPLIANT)
|
|
// Send REJECT.indication to H.245 user
|
|
H245FsmIndication(pPdu, H245_IND_RMESE_RELEASE, pObject->pInstance, pObject->dwTransId, FSM_OK);
|
|
#endif
|
|
|
|
// Send SEND.indication to H.245 user
|
|
H245FsmIndication(pPdu, H245_IND_RMESE, pObject->pInstance, pObject->dwTransId, FSM_OK);
|
|
|
|
return 0;
|
|
} // RMESE1_RequestMuxEntry
|
|
|
|
|
|
|
|
/*
|
|
* NAME
|
|
* RMESE1_RequestMuxEntryReleaseF - RequestMultiplexEntryRelease received in AWAITING RESPONSE state
|
|
*
|
|
*
|
|
* PARAMETERS
|
|
* INPUT pObject pointer to State Entity
|
|
* INPUT pPdu pointer to PDU
|
|
*
|
|
* RETURN VALUE
|
|
* Error return codes defined in h245com.h
|
|
*/
|
|
|
|
HRESULT RMESE1_RequestMuxEntryReleaseF (Object_t *pObject, PDU_t *pPdu)
|
|
{
|
|
ASSERT(pObject->Entity == RMESE_IN);
|
|
ASSERT(pObject->State == RMESE_WAIT);
|
|
H245TRACE(pObject->dwInst, 2, "RMESE1_RequestMuxEntryRelease:%d", pObject->Key);
|
|
|
|
// Send REJECT.indication to H.245 user
|
|
// SOURCE := PROTOCOL
|
|
pObject->State = RMESE_IDLE;
|
|
H245FsmIndication(pPdu, H245_IND_RMESE_RELEASE, pObject->pInstance, pObject->dwTransId, FSM_OK);
|
|
|
|
return 0;
|
|
} // RMESE1_RequestMuxEntryRelease
|
|
|
|
|
|
|
|
/*
|
|
* NAME
|
|
* RMESE1_SEND_responseF - SEND.response from API in AWAITING RESPONSE state
|
|
*
|
|
*
|
|
* PARAMETERS
|
|
* INPUT pObject pointer to State Entity
|
|
* INPUT pPdu pointer to PDU
|
|
*
|
|
* RETURN VALUE
|
|
* Error return codes defined in h245com.h
|
|
*/
|
|
|
|
HRESULT RMESE1_SEND_responseF (Object_t *pObject, PDU_t *pPdu)
|
|
{
|
|
ASSERT(pObject->Entity == RMESE_IN);
|
|
ASSERT(pObject->State == RMESE_WAIT);
|
|
H245TRACE(pObject->dwInst, 2, "RMESE1_SEND_response:%d", pObject->Key);
|
|
|
|
// Send RequestMultiplexEntryAck PDU to remote peer
|
|
pObject->State = RMESE_IDLE;
|
|
return sendPDU(pObject->pInstance, pPdu);
|
|
} // RMESE1_SEND_response
|
|
|
|
|
|
|
|
/*
|
|
* NAME
|
|
* RMESE1_REJECT_requestF - REJECT.request from API in AWAITING RESPONSE state
|
|
*
|
|
*
|
|
* PARAMETERS
|
|
* INPUT pObject pointer to State Entity
|
|
* INPUT pPdu pointer to PDU
|
|
*
|
|
* RETURN VALUE
|
|
* Error return codes defined in h245com.h
|
|
*/
|
|
|
|
HRESULT RMESE1_REJECT_requestF (Object_t *pObject, PDU_t *pPdu)
|
|
{
|
|
ASSERT(pObject->Entity == RMESE_IN);
|
|
ASSERT(pObject->State == RMESE_WAIT);
|
|
H245TRACE(pObject->dwInst, 2, "RMESE1_REJECT_request:%d", pObject->Key);
|
|
|
|
// Send RequestMultiplexEntryReject PDU to remote
|
|
pObject->State = RMESE_IDLE;
|
|
return sendPDU(pObject->pInstance, pPdu);
|
|
} // RMESE1_REJECT_request
|
|
|