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.
293 lines
8.9 KiB
293 lines
8.9 KiB
/******************************************************************************
|
|
*
|
|
* File: h245send.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: h245send.c $
|
|
* $Revision: 1.8 $
|
|
* $Modtime: 22 Jul 1996 17:24:18 $
|
|
* $Log: S:/STURGEON/SRC/H245/SRC/VCS/h245send.c_v $
|
|
*
|
|
* Rev 1.8 22 Jul 1996 17:33:28 EHOWARDX
|
|
* Updated to latest Interop API.
|
|
*
|
|
* Rev 1.7 05 Jun 1996 17:14:30 EHOWARDX
|
|
* Further work on converting to HRESULT; added PrintOssError to eliminate
|
|
* pErrorString from instance structure.
|
|
*
|
|
* Rev 1.6 04 Jun 1996 18:18:18 EHOWARDX
|
|
* Interop Logging changes inside #if defined(PCS_COMPLIANCE) conditionals.
|
|
*
|
|
* Rev 1.5 30 May 1996 23:39:12 EHOWARDX
|
|
* Cleanup.
|
|
*
|
|
* Rev 1.4 28 May 1996 14:25:18 EHOWARDX
|
|
* Tel Aviv update.
|
|
*
|
|
* Rev 1.3 21 May 1996 13:40:48 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 20 May 1996 14:35:14 EHOWARDX
|
|
* Got rid of asynchronous H245EndConnection/H245ShutDown stuff...
|
|
*
|
|
* Rev 1.1 17 May 1996 16:19:46 EHOWARDX
|
|
* Changed sendPDU to return an error if link layer send fails.
|
|
* (Probably should define a new error code for this...)
|
|
*
|
|
* Rev 1.0 09 May 1996 21:06:26 EHOWARDX
|
|
* Initial revision.
|
|
*
|
|
* Rev 1.11.1.4 09 May 1996 19:34:46 EHOWARDX
|
|
* Redesigned locking logic.
|
|
* Simplified link API.
|
|
*
|
|
* Rev 1.11.1.3 25 Apr 1996 21:27:14 EHOWARDX
|
|
* Changed to use pInstance->p_ossWorld instead of bAsnInitialized.
|
|
*
|
|
* Rev 1.11.1.2 23 Apr 1996 14:44:34 EHOWARDX
|
|
* Updated.
|
|
*
|
|
* Rev 1.11.1.1 15 Apr 1996 15:12:04 EHOWARDX
|
|
* Updated.
|
|
*
|
|
* Rev 1.11.1.0 26 Mar 1996 19:14:46 EHOWARDX
|
|
*
|
|
* Commented out hTraceFile for H.323
|
|
*
|
|
* Rev 1.11 21 Mar 1996 17:20:40 dabrown1
|
|
* - put in test1/2 trace fdwrite
|
|
* .
|
|
*
|
|
* .
|
|
*
|
|
*
|
|
*
|
|
*
|
|
* Rev 1.10 13 Mar 1996 11:31:14 DABROWN1
|
|
*
|
|
* Enable logging for ring0
|
|
*
|
|
* Rev 1.9 11 Mar 1996 15:32:06 DABROWN1
|
|
*
|
|
* Defined/Undefined _DLL for _IA_SPOX_ environment
|
|
*
|
|
* Rev 1.8 06 Mar 1996 13:11:44 DABROWN1
|
|
*
|
|
* enable flush buffers
|
|
*
|
|
* Rev 1.7 02 Mar 1996 22:10:26 DABROWN1
|
|
* updated to new MemFree
|
|
*
|
|
* Rev 1.6 01 Mar 1996 17:25:14 DABROWN1
|
|
*
|
|
* moved oss 'world' context to h245instance
|
|
* delete buffer returned in sendcomplete instead of what was held in context
|
|
*
|
|
* Rev 1.5 28 Feb 1996 14:52:18 DABROWN1
|
|
* Put oss errors in range of SR (10000)
|
|
*
|
|
* Rev 1.4 23 Feb 1996 13:56:30 DABROWN1
|
|
*
|
|
* added H245TRACE / ASSERT calls
|
|
*
|
|
* Rev 1.3 21 Feb 1996 16:52:52 DABROWN1
|
|
*
|
|
* correct pointer passed to SRP for transmits
|
|
*
|
|
* Rev 1.2 21 Feb 1996 10:50:42 EHOWARDX
|
|
* Got rid of unreferenced local variable.
|
|
*
|
|
* Rev 1.1 21 Feb 1996 08:24:20 DABROWN1
|
|
* allocate/deallocate send buffers per message. Enable sendComplete functiot
|
|
*
|
|
* Rev 1.0 09 Feb 1996 17:37:42 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 : sendPDU
|
|
** Description : Convert struct to ASN.1 PDU and forward to datalink layer
|
|
***************************************************************************/
|
|
HRESULT sendPDU(struct InstanceStruct *pInstance,
|
|
MltmdSystmCntrlMssg *lp245MsgStruct)
|
|
{
|
|
HRESULT lError;
|
|
ASN1_BUF Asn1Buf;
|
|
PBYTE pEncoded_pdu;
|
|
int nRet;
|
|
|
|
// Set up the oss struct for passing a pre-allocated buffer
|
|
switch (pInstance->Configuration) {
|
|
case H245_CONF_H324:
|
|
// Allocate a buffer to transmit
|
|
pEncoded_pdu = MemAlloc(pInstance->SendReceive.dwPDUSize);
|
|
if (pEncoded_pdu == NULL) {
|
|
H245TRACE(pInstance->dwInst, 1, "H245Send: No memory");
|
|
return H245_ERROR_NOMEM;
|
|
}
|
|
Asn1Buf.value = &pEncoded_pdu[2];
|
|
Asn1Buf.length = pInstance->SendReceive.dwPDUSize - 4;
|
|
break;
|
|
|
|
case H245_CONF_H323:
|
|
// Allocate a buffer to transmit
|
|
pEncoded_pdu = MemAlloc(pInstance->SendReceive.dwPDUSize);
|
|
if (pEncoded_pdu == NULL) {
|
|
H245TRACE(pInstance->dwInst, 1, "H245Send: No memory");
|
|
return H245_ERROR_NOMEM;
|
|
}
|
|
Asn1Buf.value = pEncoded_pdu;
|
|
Asn1Buf.length = pInstance->SendReceive.dwPDUSize;
|
|
break;
|
|
|
|
default:
|
|
H245TRACE(pInstance->dwInst,
|
|
1,
|
|
"SR: Unknown Configuration %d",
|
|
pInstance->Configuration);
|
|
return H245_ERROR_SUBSYS;
|
|
}
|
|
|
|
nRet = H245_Encode(pInstance->pWorld,
|
|
(void *)lp245MsgStruct,
|
|
MltmdSystmCntrlMssg_PDU,
|
|
&Asn1Buf);
|
|
|
|
if (ASN1_SUCCEEDED(nRet))
|
|
{
|
|
H245TRACE(pInstance->dwInst, 3, "H245: Msg Encode Successful");
|
|
|
|
#if defined(_DEBUG) || defined(PCS_COMPLIANCE)
|
|
if (H245Logger)
|
|
InteropOutput(H245Logger,
|
|
(BYTE FAR*)(pEncoded_pdu),
|
|
(int)Asn1Buf.length,
|
|
H245LOG_SENT_PDU);
|
|
#endif // (PCS_COMPLIANCE)
|
|
|
|
lError = pInstance->SendReceive.hLinkSendReq(pInstance->SendReceive.hLinkLayerInstance,
|
|
pEncoded_pdu,
|
|
Asn1Buf.length);
|
|
}
|
|
else
|
|
{
|
|
MemFree(pEncoded_pdu);
|
|
lError = H245_ERROR_ASN1;
|
|
}
|
|
|
|
return lError;
|
|
}
|
|
|
|
|
|
/**************************************************************************
|
|
** Function : h245SendComplete
|
|
** Description : Send Completion Callback routine from link layer
|
|
***************************************************************************/
|
|
|
|
void h245SendComplete( DWORD_PTR h245Inst,
|
|
HRESULT dwMessage,
|
|
PBYTE pbDataBuf,
|
|
DWORD dwLength)
|
|
{
|
|
struct InstanceStruct *pInstance;
|
|
|
|
pInstance = InstanceLock(h245Inst);
|
|
if (pInstance == NULL) {
|
|
H245TRACE(h245Inst, 1, "SR: h245SendComplete - invalid instance");
|
|
return;
|
|
}
|
|
|
|
// Return the buffer
|
|
if (pbDataBuf) {
|
|
MemFree(pbDataBuf);
|
|
}
|
|
|
|
switch (dwMessage) {
|
|
case LINK_SEND_COMPLETE:
|
|
if (pInstance->SendReceive.dwFlushMap & SHUTDOWN_PENDING) {
|
|
H245TRACE(h245Inst, 10, "SR: Shutdown Complete");
|
|
}
|
|
break;
|
|
case LINK_SEND_ABORT:
|
|
H245TRACE(h245Inst, 10, "SR: TX Abort Buffer");
|
|
break;
|
|
case LINK_FLUSH_COMPLETE:
|
|
// If we are in the process of abort, then the next and
|
|
// last mesage out will be the endSession
|
|
H245TRACE(h245Inst, 10, "SR: TX Flush Complete");
|
|
|
|
// Indicate Transmit buffer flush is complete
|
|
pInstance->SendReceive.dwFlushMap ^= DATALINK_TRANSMIT;
|
|
|
|
// If all requested queues have been flushed, call the
|
|
// appropriate callback routing
|
|
switch (pInstance->SendReceive.dwFlushMap & SHUTDOWN_MASK) {
|
|
case 0:
|
|
// TBD: Who is interested in callback if not in connection
|
|
// with shutdown?
|
|
break;
|
|
case SHUTDOWN_PENDING:
|
|
// Flush buffers completed, and shutdown in progress
|
|
// notify the API
|
|
H245TRACE(h245Inst, 20, "SR: SHUTDOWN CALLBACK");
|
|
break;
|
|
default:
|
|
// Still waiting for buffers to be flushed. No action now
|
|
break;
|
|
} // switch (pInstance->SendReceive.dwFlushMap & SHUTDOWN_MASK) {
|
|
break;
|
|
default:
|
|
H245TRACE(h245Inst, 10, "SR: SendComplete");
|
|
break;
|
|
}
|
|
InstanceUnlock(pInstance);
|
|
}
|
|
|