336 lines
10 KiB
C
336 lines
10 KiB
C
/******************************************************************************
|
|
*
|
|
* File: h245recv.c
|
|
*
|
|
* INTEL Corporation Proprietary Information
|
|
* Copyright (c) 1994, 1995, 1996 Intel Corporation.
|
|
*
|
|
* This listing is supplied under the terms of a license agreement
|
|
* with INTEL Corporation and may not be used, copied, nor disclosed
|
|
* except in accordance with the terms of that agreement.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* $Workfile: h245recv.c $
|
|
* $Revision: 1.13 $
|
|
* $Modtime: 06 Feb 1997 18:17:22 $
|
|
* $Log: S:\sturgeon\src\h245\src\vcs\h245recv.c_v $
|
|
*
|
|
* Fixed warnings.
|
|
*
|
|
* Rev 1.11 01 Nov 1996 15:24:56 EHOWARDX
|
|
*
|
|
* Added check for link not disconnected before re-posting receive buffer
|
|
* to link layer to eliminate annoying error message from link layer.
|
|
*
|
|
* Rev 1.10 22 Jul 1996 17:33:42 EHOWARDX
|
|
* Updated to latest Interop API.
|
|
*
|
|
* Rev 1.9 01 Jul 1996 16:14:32 EHOWARDX
|
|
* locks
|
|
* Added FunctionNotSupported if ossDecode fails.
|
|
*
|
|
* Rev 1.8 10 Jun 1996 16:53:46 EHOWARDX
|
|
* Removed special handling of EndSession since shutdown moved to InstanceUnlo
|
|
*
|
|
* Rev 1.7 05 Jun 1996 17:14:28 EHOWARDX
|
|
* Further work on converting to HRESULT; added PrintOssError to eliminate
|
|
* pErrorString from instance structure.
|
|
*
|
|
* Rev 1.6 04 Jun 1996 18:18:16 EHOWARDX
|
|
* Interop Logging changes inside #if defined(PCS_COMPLIANCE) conditionals.
|
|
*
|
|
* Rev 1.5 30 May 1996 23:39:10 EHOWARDX
|
|
* Cleanup.
|
|
*
|
|
* Rev 1.4 28 May 1996 14:25:08 EHOWARDX
|
|
* Tel Aviv update.
|
|
*
|
|
* Rev 1.3 21 May 1996 13:40:46 EHOWARDX
|
|
* Added LOGGING switch to log PDUs to the file H245.OUT.
|
|
* Add /D "LOGGING" to project options to enable this feature.
|
|
*
|
|
* Rev 1.2 17 May 1996 16:44:22 EHOWARDX
|
|
* Changed to use LINK_RECV_CLOSED to signal link layer close.
|
|
*
|
|
* Rev 1.1 17 May 1996 16:20:32 EHOWARDX
|
|
* Added code to change API state if zero-length buffer received
|
|
* signalling link layer closed.
|
|
*
|
|
* Rev 1.0 09 May 1996 21:06:24 EHOWARDX
|
|
* Initial revision.
|
|
*
|
|
* Rev 1.8.1.5 09 May 1996 19:33:58 EHOWARDX
|
|
* Redesigned locking logic.
|
|
* Simplified link API.
|
|
*
|
|
* Rev 1.17 29 Apr 1996 16:05:12 EHOWARDX
|
|
* Added special case handling of EndSessionCommand to ReceiveComplete().
|
|
*
|
|
* Rev 1.16 27 Apr 1996 21:13:14 EHOWARDX
|
|
* Hope we finally got ossDecode() failure handling right...
|
|
*
|
|
* Rev 1.15 27 Apr 1996 13:08:54 EHOWARDX
|
|
* Also need to terminate while loop if ossDecode fails!
|
|
*
|
|
* Rev 1.8.1.4 27 Apr 1996 11:25:36 EHOWARDX
|
|
* Changed to not call FsmIncoming if ossDecode fails...
|
|
*
|
|
*
|
|
* Rev 1.8.1.3 25 Apr 1996 21:26:46 EHOWARDX
|
|
* Changed to use pInstance->p_ossWorld instead of bAsnInitialized.
|
|
*
|
|
* Rev 1.8.1.2 23 Apr 1996 14:44:30 EHOWARDX
|
|
* Updated.
|
|
*
|
|
* Rev 1.8.1.1 15 Apr 1996 15:12:00 EHOWARDX
|
|
* Updated.
|
|
*
|
|
* Rev 1.8.1.0 26 Mar 1996 19:15:24 EHOWARDX
|
|
*
|
|
* Commented out hTraceFile for H.323
|
|
*
|
|
* Rev 1.8 21 Mar 1996 17:21:36 dabrown1
|
|
*
|
|
* - put in test1/2 trace fdwrite
|
|
*
|
|
* Rev 1.7 13 Mar 1996 11:31:56 DABROWN1
|
|
*
|
|
* Enable logging for ring0
|
|
*
|
|
* Rev 1.6 06 Mar 1996 13:13:04 DABROWN1
|
|
*
|
|
* flush receive buffer functionality
|
|
*
|
|
* Rev 1.5 01 Mar 1996 17:25:54 DABROWN1
|
|
*
|
|
* moved oss 'world' context to h245instance
|
|
* changed oss delete from ossFreeBuf to ossFreePDU
|
|
*
|
|
* Rev 1.4 23 Feb 1996 13:56:04 DABROWN1
|
|
*
|
|
* added H245TRACE / ASSERT calls
|
|
*
|
|
* Rev 1.3 21 Feb 1996 12:09:56 EHOWARDX
|
|
* Eliminated unused local variables.
|
|
*
|
|
* Rev 1.2 21 Feb 1996 08:25:08 DABROWN1
|
|
*
|
|
* Provide multiple buffers receiving > 1 message (ie., link ACKs).
|
|
*
|
|
* Rev 1.1 13 Feb 1996 14:46:06 DABROWN1
|
|
*
|
|
* changed asnexp.h (no longer there) to fsmexp.h
|
|
*
|
|
* Rev 1.0 09 Feb 1996 17:36:20 cjutzi
|
|
* Initial revision.
|
|
*
|
|
*****************************************************************************/
|
|
#ifndef STRICT
|
|
#define STRICT
|
|
#endif
|
|
|
|
/***********************/
|
|
/* SYSTEM INCLUDES */
|
|
/***********************/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stddef.h>
|
|
#include <limits.h>
|
|
|
|
#include "precomp.h"
|
|
|
|
|
|
|
|
/***********************/
|
|
/* H245 INCLUDES */
|
|
/***********************/
|
|
#ifdef _IA_SPOX_
|
|
# define _DLL
|
|
#endif //_IA_SPOX_
|
|
|
|
#include "h245com.h"
|
|
#include "sr_api.h"
|
|
|
|
#if defined(_DEBUG) || defined(PCS_COMPLIANCE)
|
|
#include "interop.h"
|
|
#include "h245plog.h"
|
|
extern LPInteropLogger H245Logger;
|
|
#endif // (PCS_COMPLIANCE)
|
|
|
|
#ifdef _IA_SPOX_
|
|
# undef _DLL
|
|
#endif //_IA_SPOX_
|
|
|
|
|
|
|
|
/**************************************************************************
|
|
** Function : h245ReceiveComplete
|
|
** Description : Receive Completion Callback routine from link layer
|
|
***************************************************************************/
|
|
|
|
HRESULT
|
|
H245FunctionNotSupported(struct InstanceStruct *pInstance, unsigned short wChoice, unsigned char *pBuf, unsigned uLength)
|
|
{
|
|
HRESULT status = H245_ERROR_OK;
|
|
MltmdSystmCntrlMssg *pPdu = NULL;
|
|
|
|
pPdu = (MltmdSystmCntrlMssg *) MemAlloc(sizeof(MltmdSystmCntrlMssg));
|
|
if(NULL != pPdu)
|
|
{
|
|
memset(pPdu, 0, sizeof(MltmdSystmCntrlMssg));
|
|
|
|
pPdu->choice = indication_chosen;
|
|
pPdu->u.indication.choice = IndicationMessage_functionNotSupported_chosen;
|
|
pPdu->u.indication.u.functionNotSupported.cause.choice = wChoice;
|
|
if (pBuf != NULL && uLength != 0)
|
|
{
|
|
pPdu->u.indication.u.functionNotSupported.bit_mask = returnedFunction_present;
|
|
pPdu->u.indication.u.functionNotSupported.returnedFunction.length = (WORD)uLength;
|
|
pPdu->u.indication.u.functionNotSupported.returnedFunction.value = pBuf;
|
|
}
|
|
else
|
|
{
|
|
pPdu->u.indication.u.functionNotSupported.bit_mask = 0;
|
|
}
|
|
|
|
status = sendPDU(pInstance, pPdu);
|
|
|
|
MemFree(pPdu);
|
|
pPdu = NULL;
|
|
}
|
|
else
|
|
{
|
|
status = H245_ERROR_NOMEM;
|
|
}
|
|
|
|
return status;
|
|
} // H245FunctionNotSupported()
|
|
|
|
void h245ReceiveComplete(DWORD_PTR h245Inst,
|
|
HRESULT dwMessage,
|
|
PBYTE pbDataBuf,
|
|
DWORD dwLength)
|
|
{
|
|
struct InstanceStruct *pInstance;
|
|
int pduNum = MltmdSystmCntrlMssg_PDU;
|
|
ASN1_BUF Asn1Buf;
|
|
MltmdSystmCntrlMssg *pPdu;
|
|
int nRet;
|
|
|
|
// Validate the instance handle
|
|
pInstance = InstanceLock(h245Inst);
|
|
if (pInstance == NULL) {
|
|
H245TRACE(h245Inst, 1, "h245ReceiveComplete: Instance not found");
|
|
return;
|
|
}
|
|
|
|
// ONLY submit buffers to the decoder if it's for data received,
|
|
// skip for flushes
|
|
switch (dwMessage) {
|
|
case LINK_RECV_CLOSED:
|
|
H245TRACE(h245Inst, 3, "h245ReceiveComplete: Link Layer closed");
|
|
pInstance->API.SystemState = APIST_Disconnected;
|
|
InstanceUnlock(pInstance);
|
|
return;
|
|
|
|
case LINK_RECV_DATA:
|
|
|
|
if (pInstance->pWorld == NULL) {
|
|
H245TRACE(h245Inst, 1, "h245ReceiveComplete: ASN.1 Decoder not initialized");
|
|
InstanceUnlock(pInstance);
|
|
return;
|
|
}
|
|
|
|
|
|
switch (pInstance->Configuration) {
|
|
case H245_CONF_H324:
|
|
Asn1Buf.value = &pbDataBuf[2];
|
|
Asn1Buf.length = dwLength;
|
|
break;
|
|
|
|
default:
|
|
Asn1Buf.value = pbDataBuf;
|
|
Asn1Buf.length = dwLength;
|
|
} // switch
|
|
|
|
// Loop around as long as the length field is positive.
|
|
// ASN.1 decoder will update the length for each PDU it decodes until
|
|
// a 0 length is achieved.
|
|
while (Asn1Buf.length > 0)
|
|
{
|
|
int savePduLength = Asn1Buf.length;
|
|
PBYTE savePdu = Asn1Buf.value;
|
|
pPdu = NULL;
|
|
|
|
#if defined(_DEBUG) || defined(PCS_COMPLIANCE)
|
|
if (H245Logger)
|
|
InteropOutput(H245Logger,
|
|
(BYTE FAR *)Asn1Buf.value,
|
|
(int)Asn1Buf.length,
|
|
H245LOG_RECEIVED_PDU);
|
|
#endif // (PCS_COMPLIANCE)
|
|
|
|
nRet = H245_Decode(pInstance->pWorld,
|
|
(void **)&pPdu,
|
|
pduNum,
|
|
&Asn1Buf);
|
|
|
|
if (ASN1_SUCCEEDED(nRet))
|
|
{
|
|
// Decode succeeded
|
|
|
|
H245TRACE(h245Inst, 3, "H.245 Msg decode successful");
|
|
|
|
// Pass on data to finite state machine
|
|
FsmIncoming(pInstance, pPdu);
|
|
}
|
|
else
|
|
{
|
|
// Decode failed
|
|
H245FunctionNotSupported(pInstance, syntaxError_chosen, savePdu, savePduLength);
|
|
Asn1Buf.length = 0; // Terminate loop!
|
|
}
|
|
|
|
if (pPdu != NULL)
|
|
{
|
|
// Free the memory used by the ASN.1 library
|
|
if (freePDU(pInstance->pWorld, pduNum, pPdu, H245ASN_Module))
|
|
{
|
|
H245TRACE(h245Inst, 1, "SR: FREE FAILURE");
|
|
}
|
|
}
|
|
} // while (Asn1Buf.length > 0)
|
|
|
|
if (pInstance->API.SystemState != APIST_Disconnected)
|
|
{
|
|
// Repost the buffer to the data link layer
|
|
pInstance->SendReceive.hLinkReceiveReq(pInstance->SendReceive.hLinkLayerInstance,
|
|
pbDataBuf,
|
|
pInstance->SendReceive.dwPDUSize);
|
|
}
|
|
break; // case LINK_RECV_DATA
|
|
|
|
case LINK_RECV_ABORT:
|
|
// Receive buffer flush in process
|
|
ASSERT(pbDataBuf != NULL);
|
|
H245TRACE(h245Inst, 3, "SR: RX Flush Buffer");
|
|
break;
|
|
|
|
case LINK_FLUSH_COMPLETE:
|
|
// Receive buffer flush done
|
|
ASSERT(pbDataBuf == NULL);
|
|
H245TRACE(h245Inst, 3, "SR: RX Flush Complete");
|
|
pInstance->SendReceive.dwFlushMap &= ~DATALINK_RECEIVE;
|
|
break;
|
|
|
|
default:
|
|
H245TRACE(h245Inst, 1, "SR: RX COMPLETE Error %d", dwMessage);
|
|
break;
|
|
} // switch
|
|
InstanceUnlock(pInstance);
|
|
}
|
|
|