|
|
/******************************************************************************
* * File: h245_sr.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: h245_sr.c $ * $Revision: 1.10 $ * $Modtime: Mar 04 1997 17:30:56 $ * $Log: S:/STURGEON/SRC/H245/SRC/VCS/h245_sr.c_v $ * * Rev 1.11 Jun 25 1998 00:00:00 mikev@microsoft.com * STRIPPED PLUGIN LINK LAYER AND COMBINED THE SEPARATE DLLs * * Rev 1.10 Mar 04 1997 17:51:22 tomitowx * process detach fix * * Rev 1.9 11 Dec 1996 13:55:20 SBELL1 * Changed linkLayerInit parameters * * Rev 1.8 14 Oct 1996 14:05:52 EHOWARDX * * Used cast to get rid of warning. * * Rev 1.7 14 Oct 1996 14:01:30 EHOWARDX * Unicode changes. * * Rev 1.6 23 Jul 1996 08:57:08 EHOWARDX * * Moved H245 interop logger init/deinit from H245_SR.C (per-instance) * to H245MAIN.C (per-DLL). With multiple instances and a global variable, * per-instance init/deinit is fundamentally brain-dead. * * Rev 1.5 22 Jul 1996 17:33:44 EHOWARDX * Updated to latest Interop API. * * Rev 1.4 05 Jun 1996 17:13:50 EHOWARDX * Further work on converting to HRESULT; added PrintOssError to eliminate * pErrorString from instance structure. * * Rev 1.3 04 Jun 1996 18:17:32 EHOWARDX * Interop Logging changes inside #if defined(PCS_COMPLIANCE) conditionals. * * Rev 1.2 29 May 1996 15:20:20 EHOWARDX * Change to use HRESULT. * * Rev 1.1 28 May 1996 14:25:32 EHOWARDX * Tel Aviv update. * * Rev 1.0 09 May 1996 21:06:28 EHOWARDX * Initial revision. * * Rev 1.17.1.6 09 May 1996 19:34:40 EHOWARDX * Redesigned locking logic. * Simplified link API. * * Rev 1.17.1.5 29 Apr 1996 19:42:42 EHOWARDX * Commented out linkLayerFlushAll() call and synchronized with Rev 1.30. * * Rev 1.26 29 Apr 1996 12:53:16 EHOWARDX * Commented out receive thread/receive queue code. * * Rev 1.17.1.4 25 Apr 1996 21:27:04 EHOWARDX * Changed to use h245Instance->p_ossWorld instead of bAsnInitialized. * * Rev 1.17.1.3 23 Apr 1996 14:44:22 EHOWARDX * Updated. * * Rev 1.17.1.2 15 Apr 1996 15:11:54 EHOWARDX * Updated. * * Rev 1.17.1.1 26 Mar 1996 19:13:50 EHOWARDX * * Commented out hTraceFile. * * Rev 1.17.1.0 26 Mar 1996 13:11:22 EHOWARDX * Branced and added H245_CONF_H323 to sendRecvInit * * Rev 1.17 19 Mar 1996 18:09:04 helgebax * removed old timer code * * Rev 1.16 13 Mar 1996 11:30:44 DABROWN1 * * Enable logging for ring 0 * * Rev 1.15 11 Mar 1996 15:39:18 DABROWN1 * * modifications required for ring0/ring3 compatiblity * * Rev 1.13 06 Mar 1996 13:12:24 DABROWN1 * * flush link layer buffers at shutdown * * Rev 1.12 02 Mar 1996 22:11:10 DABROWN1 * * changed h245_bzero to memset * * Rev 1.11 01 Mar 1996 17:24:46 DABROWN1 * * moved oss 'world' context to h245instance * * Rev 1.10 28 Feb 1996 18:45:00 EHOWARDX * * Added H245TimerStart and H245TimerStop to linkLayerInit call. * * Rev 1.9 28 Feb 1996 15:43:52 EHOWARDX * * Removed sample code. * Added code to free up all events on timer queue before deallocating. * * Rev 1.8 27 Feb 1996 13:35:10 DABROWN1 * * added h245instance in datalink initialization routine * * Rev 1.7 26 Feb 1996 18:59:34 EHOWARDX * * Added H245TimerStart and H245TimerStop functions. * Also added sample timer function, which should be removed later. * * Rev 1.6 23 Feb 1996 22:17:26 EHOWARDX * * Fixed check at start of sendRecvShutdown. * It's an error if dwInst is greater than or equal to MAXINST, not less than! * * Rev 1.5 23 Feb 1996 21:59:28 EHOWARDX * * winspox changes. * * Rev 1.4 23 Feb 1996 13:55:30 DABROWN1 * * added h245TRACE ASSERT calls * * Rev 1.3 21 Feb 1996 15:12:36 EHOWARDX * * Forgot to replace H245ReceiveComplete with H245ReceivePost. * * Rev 1.2 20 Feb 1996 19:14:20 EHOWARDX * Added in mailbox changes. * * Rev 1.1 21 Feb 1996 08:26:28 DABROWN1 * * create and free multiple receive buffers. * Make size of buffer dependent on protocol in use * * Rev 1.0 09 Feb 1996 17:34:24 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 */ /***********************/ #include "h245com.h"
#include "sr_api.h"
#include "linkapi.h"
#if defined(USE_RECEIVE_QUEUE)
DWORD ReceiveThread(VOID *lpThreadParameter) { struct InstanceStruct *pInstance = (struct InstanceStruct *)lpThreadParameter; RXMSG RxMsg; Uns uTimeout;
Bool bPendResult;
SETTASK("H245RCVTASK0");
if (pInstance == NULL) { H245PANIC(); return SR_INVALID_CONTEXT; }
// Loop until thread is ready to terminate
pInstance->SendReceive.bReceiveThread = TRUE; for ( ; ; ) { uTimeout = SYS_FOREVER; // Wait for an event (or a queued callback function) to wake us up.
// This is an alertable wait state (fAlertable == TRUE)
pInstance->SendReceive.bReceiveThread = FALSE; H245TRACE(pInstance->dwInst, 2, "ReceiveThread, uTimeout = %d", uTimeout); RESETTASK();
bPendResult = MBX_pend(pInstance->SendReceive.pMailbox, &RxMsg, uTimeout);
SETTASK("H245RCVTASK"); H245TRACE(pInstance->pInstance->dwInst, 2, "ReceiveThread, bPendResult = %d", bPendResult); pInstance->SendReceive.bReceiveThread = TRUE;
switch (RxMsg.dwMessage) { case EXIT_RECEIVE_THREAD: // Thread exiting....signal app
TRACE("H245: Receive Thread Exiting"); SEM_post(pInstance->SendReceive.hReceiveSemphore); RESETTASK(); return 0; break;
default: // Ignore timer message, which should have dwLength == 0
if (RxMsg.dwLength) { h245ReceiveComplete(RxMsg.h245Inst, RxMsg.dwMessage, RxMsg.pbDataBuf, RxMsg.dwLength); } else {
TRACE1("H245SEND: SendTask %d", RxMsg.dwMessage);
h245SendComplete(RxMsg.h245Inst, RxMsg.dwMessage, RxMsg.pbDataBuf, RxMsg.dwLength); } break; } // switch
} // for
return 0; } // ReceiveThread()
static void h245ReceivePost(DWORD h245Inst, DWORD dwMessage, PBYTE pbDataBuf, DWORD dwLength) { register struct InstanceStruct *pInstance; RXMSG RxMsg;
// Validate the instance handle
pInstance = InstanceLock(h245Inst); if (pInstance == NULL) { H245TRACE(h245Inst, 1, "h245ReceivePost h245Inst Invalid"); H245PANIC(); return; }
RxMsg.h245Inst = h245Inst; RxMsg.dwMessage = dwMessage; RxMsg.pbDataBuf = pbDataBuf; RxMsg.dwLength = dwLength;
if (MBX_post(pInstance->SendReceive.pMailbox, &RxMsg, 0) == FALSE) { H245TRACE(h245Inst, 1, "SR: MBX POST FAIL"); H245PANIC(); } InstanceUnlock(pInstance); } // h245ReceivePost()
#endif // (USE_RECEIVE_QUEUE)
HRESULT initializeLinkDllEntry ( struct InstanceStruct * pInstance, LPCTSTR szDLLFile ) {
#if(0)
if (!(pInstance->SendReceive.hLinkModule = LoadLibrary(szDLLFile))) { return H245_ERROR_FATAL; }
if (!(pInstance->SendReceive.hLinkLayerInit = (PFxnlinkLayerInit) GetProcAddress(pInstance->SendReceive.hLinkModule, LINKINITIALIZE))) { return H245_ERROR_FATAL; }
if (!(pInstance->SendReceive.hLinkShutdown = (PFxnlinkLayerShutdown) GetProcAddress(pInstance->SendReceive.hLinkModule, LINKSHUTDOWN))) { return H245_ERROR_FATAL; }
if (!(pInstance->SendReceive.hLinkGetInstance = (PFxnlinkLayerGetInstance) GetProcAddress(pInstance->SendReceive.hLinkModule, LINKGETINSTANCE))) { return H245_ERROR_FATAL; }
if (!(pInstance->SendReceive.hLinkReceiveReq = (PFxndatalinkReceiveRequest) GetProcAddress(pInstance->SendReceive.hLinkModule, LINKRECEIVEREQUEST))) { return H245_ERROR_FATAL; }
if (!(pInstance->SendReceive.hLinkSendReq = (PFxndatalinkSendRequest) GetProcAddress(pInstance->SendReceive.hLinkModule, LINKSENDREQUEST))) { return H245_ERROR_FATAL; }
if (!(pInstance->SendReceive.hLinkLayerFlushChannel = (PFxnlinkLayerFlushChannel) GetProcAddress(pInstance->SendReceive.hLinkModule, LINKFLUSHCHANNEL))) { return H245_ERROR_FATAL; }
if (!(pInstance->SendReceive.hLinkLayerFlushAll = (PFxnlinkLayerFlushAll) GetProcAddress(pInstance->SendReceive.hLinkModule, LINKFLUSHALL))) { return H245_ERROR_FATAL; } #else
pInstance->SendReceive.hLinkLayerInit = linkLayerInit; pInstance->SendReceive.hLinkShutdown = linkLayerShutdown; pInstance->SendReceive.hLinkGetInstance = linkLayerGetInstance; pInstance->SendReceive.hLinkReceiveReq = datalinkReceiveRequest; pInstance->SendReceive.hLinkSendReq = datalinkSendRequest; pInstance->SendReceive.hLinkLayerFlushChannel = linkLayerFlushChannel; pInstance->SendReceive.hLinkLayerFlushAll = linkLayerFlushAll; #endif //if(0)
H245TRACE(pInstance->dwInst, 3, "SR: %s Loaded", szDLLFile);
return (0); }
#if defined(_DEBUG) && defined(H324)
void srInitializeLogging ( struct InstanceStruct *pInstance, BOOL bTracingEnabled ) { FILE *hTraceFile; char initTraceFile[20] = "c:\\tmp\\h2450.000"; BOOL bSearch = TRUE; // search for filename
if (pInstance == NULL) { H245TRACE(h245Inst, 1, "SR:Enable Log Instance Error"); H245PANIC(); return; }
// eventually will be from registry
pInstance->SendReceive.bLoggingEnabled = bTracingEnabled; if (pInstance->SendReceive.bLoggingEnabled) { // Init the logger file for Ring0/SPOX implementations. Loop until
// we get the next available revision
memcpy(pInstance->SendReceive.fTraceFile, initTraceFile, 20); pInstance->SendReceive.fTraceFile[11] = ((unsigned char)pInstance->dwInst & 0xF) + 0x30;
do { hTraceFile = fopen(pInstance->SendReceive.fTraceFile, "r"); if ((hTraceFile == NULL) || ((int)hTraceFile == -1)) { bSearch = FALSE; } else { // able to open the file. close it and try the next one
fclose(hTraceFile);
// get the next revision number
if (pInstance->SendReceive.fTraceFile[15] == '9') { pInstance->SendReceive.fTraceFile[15] = '0'; if (pInstance->SendReceive.fTraceFile[14] == '9') { pInstance->SendReceive.fTraceFile[14] = '0'; pInstance->SendReceive.fTraceFile[13]++; } else { pInstance->SendReceive.fTraceFile[14]++; } } else { pInstance->SendReceive.fTraceFile[15]++; } } }while (bSearch);
hTraceFile = fopen(pInstance->SendReceive.fTraceFile, "wb"); if ((hTraceFile == NULL) || ((int)hTraceFile == -1)) { pInstance->SendReceive.bLoggingEnabled = FALSE; H245TRACE(h245Inst, 1, "SR: Trace File CREATE ERROR"); } else { // Close the file. Will be opened immediately before writing
// and closed immediately thereafter
pInstance->SendReceive.bLoggingEnabled = TRUE; fclose(hTraceFile); } } } #endif // (_DEBUG)
HRESULT sendRcvShutdown ( struct InstanceStruct *pInstance ) { #if defined(USE_RECEIVE_QUEUE)
RXMSG RxMsg; #endif // (USE_RECEIVE_QUEUE)
int i;
if (pInstance == NULL) { H245TRACE(pInstance->dwInst, 1, "SR: Shutdown Instance Error"); return H245_ERROR_INVALID_INST; }
if (pInstance->pWorld) {
// Shutdown the ASN.1 libraries
terminateASN1(pInstance->pWorld);
// Free the ASN.1 global structure
MemFree( pInstance->pWorld); pInstance->pWorld = NULL; }
// Shutdown link layer
#if(0)
if (pInstance->SendReceive.hLinkModule) { // First get all buffers back that may still be lurking
// if (pInstance->SendReceive.hLinkLayerFlushAll) {
// pInstance->SendReceive.hLinkLayerFlushAll(pInstance->SendReceive.hLinkLayerInstance);
// }
if (pInstance->SendReceive.hLinkShutdown) { pInstance->SendReceive.hLinkShutdown(pInstance->SendReceive.hLinkLayerInstance); }
FreeLibrary(pInstance->SendReceive.hLinkModule);
pInstance->SendReceive.hLinkModule = NULL; } #else
pInstance->SendReceive.hLinkShutdown(pInstance->SendReceive.hLinkLayerInstance); #endif // if(0)
// return buffers from data link layer
for (i = 0; i < pInstance->SendReceive.dwNumRXBuffers; ++i) { if (pInstance->SendReceive.lpRxBuffer[i]) { MemFree( pInstance->SendReceive.lpRxBuffer[i]); pInstance->SendReceive.lpRxBuffer[i] = NULL; } } #if defined(USE_RECEIVE_QUEUE)
// Terminate receive thread
if (pInstance->SendReceive.pTaskReceive && pInstance->SendReceive.pMailbox) {
TRACE("H245: Task/Mbox Present"); // First post a message to have it exit
RxMsg.h245Inst = (DWORD)pInstance; RxMsg.dwMessage = EXIT_RECEIVE_THREAD; RxMsg.pbDataBuf = NULL; RxMsg.dwLength = 0; #ifdef _IA_SPOX_
if (RIL_WriteMailbox(pInstance->SendReceive.pMailbox, (PMBoxMessage)&RxMsg, 0) == OIL_TIMEOUT) { #else
if (MBX_post(pInstance->SendReceive.pMailbox, &RxMsg, 0) == FALSE) { #endif //_IA_SPOX_
H245TRACE(h245Inst, 1, "SR: Shutdown MBX POST FAIL"); H245PANIC(); }
// Wait on semaphore for receive task to exit
#ifdef _IA_SPOX_
RIL_WaitForSemaphore(pInstance->SendReceive.hReceiveSemphore, OIL_WAITFOREVER); #else
SEM_pend(pInstance->SendReceive.hReceiveSemphore, SYS_FOREVER); #endif //_IA_SPOX_
TRACE("H245: ReceiveTask Semaphore"); #ifdef _IA_SPOX_
RIL_DeleteTask(pInstance->SendReceive.pTaskReceive); #else
TSK_delete(pInstance->SendReceive.pTaskReceive); #endif //_IA_SPOX_
pInstance->SendReceive.pTaskReceive = NULL;
#ifdef _IA_SPOX_
RIL_DeleteSemaphore(pInstance->SendReceive.hReceiveSemphore); #else
SEM_delete(pInstance->SendReceive.hReceiveSemphore); #endif //_IA_SPOX_
pInstance->SendReceive.hReceiveSemphore = NULL;
TRACE("H245: Semaphore Delete"); }
// Deallocate mailbox
if (pInstance->SendReceive.pMailbox) { #ifdef _IA_SPOX_
RIL_DeleteMailbox(pInstance->SendReceive.pMailbox); #else
MBX_delete(pInstance->SendReceive.pMailbox); #endif //_IA_SPOX_
pInstance->SendReceive.pMailbox = NULL; } #endif // (USE_RECEIVE_QUEUE)
H245TRACE(pInstance->dwInst, 3, "SR: Shutdown Complete"); return H245_ERROR_OK; } // sendRcvShutdown()
HRESULT sendRcvShutdown_ProcessDetach( struct InstanceStruct *pInstance, BOOL fProcessDetach) { #if defined(USE_RECEIVE_QUEUE)
RXMSG RxMsg; #endif // (USE_RECEIVE_QUEUE)
int i;
if (pInstance == NULL) { H245TRACE(pInstance->dwInst, 1, "SR: Shutdown Instance Error"); return H245_ERROR_INVALID_INST; }
if (pInstance->pWorld) {
// Shutdown the ASN.1 libraries
terminateASN1(pInstance->pWorld);
// Free the ASN.1 global structure
MemFree( pInstance->pWorld); pInstance->pWorld = NULL; }
// Shutdown link layer
if (pInstance->SendReceive.hLinkModule) { // First get all buffers back that may still be lurking
// if (pInstance->SendReceive.hLinkLayerFlushAll) {
// pInstance->SendReceive.hLinkLayerFlushAll(pInstance->SendReceive.hLinkLayerInstance);
// }
//[email protected]
if(!fProcessDetach) { H245TRACE(0, 0, "***** fProcessDetach = FALSE");
if (pInstance->SendReceive.hLinkShutdown) { pInstance->SendReceive.hLinkShutdown(pInstance->SendReceive.hLinkLayerInstance); } } //[email protected]
FreeLibrary(pInstance->SendReceive.hLinkModule);
pInstance->SendReceive.hLinkModule = NULL; }
// return buffers from data link layer
for (i = 0; i < pInstance->SendReceive.dwNumRXBuffers; ++i) { if (pInstance->SendReceive.lpRxBuffer[i]) { MemFree( pInstance->SendReceive.lpRxBuffer[i]); pInstance->SendReceive.lpRxBuffer[i] = NULL; } } #if defined(USE_RECEIVE_QUEUE)
// Terminate receive thread
if (pInstance->SendReceive.pTaskReceive && pInstance->SendReceive.pMailbox) {
TRACE("H245: Task/Mbox Present"); // First post a message to have it exit
RxMsg.h245Inst = (DWORD)pInstance; RxMsg.dwMessage = EXIT_RECEIVE_THREAD; RxMsg.pbDataBuf = NULL; RxMsg.dwLength = 0; #ifdef _IA_SPOX_
if (RIL_WriteMailbox(pInstance->SendReceive.pMailbox, (PMBoxMessage)&RxMsg, 0) == OIL_TIMEOUT) { #else
if (MBX_post(pInstance->SendReceive.pMailbox, &RxMsg, 0) == FALSE) { #endif //_IA_SPOX_
H245TRACE(h245Inst, 1, "SR: Shutdown MBX POST FAIL"); H245PANIC(); }
// Wait on semaphore for receive task to exit
#ifdef _IA_SPOX_
RIL_WaitForSemaphore(pInstance->SendReceive.hReceiveSemphore, OIL_WAITFOREVER); #else
SEM_pend(pInstance->SendReceive.hReceiveSemphore, SYS_FOREVER); #endif //_IA_SPOX_
TRACE("H245: ReceiveTask Semaphore"); #ifdef _IA_SPOX_
RIL_DeleteTask(pInstance->SendReceive.pTaskReceive); #else
TSK_delete(pInstance->SendReceive.pTaskReceive); #endif //_IA_SPOX_
pInstance->SendReceive.pTaskReceive = NULL;
#ifdef _IA_SPOX_
RIL_DeleteSemaphore(pInstance->SendReceive.hReceiveSemphore); #else
SEM_delete(pInstance->SendReceive.hReceiveSemphore); #endif //_IA_SPOX_
pInstance->SendReceive.hReceiveSemphore = NULL;
TRACE("H245: Semaphore Delete"); }
// Deallocate mailbox
if (pInstance->SendReceive.pMailbox) { #ifdef _IA_SPOX_
RIL_DeleteMailbox(pInstance->SendReceive.pMailbox); #else
MBX_delete(pInstance->SendReceive.pMailbox); #endif //_IA_SPOX_
pInstance->SendReceive.pMailbox = NULL; } #endif // (USE_RECEIVE_QUEUE)
H245TRACE(pInstance->dwInst, 3, "SR: Shutdown Complete"); return H245_ERROR_OK; } // sendRcvShutdown_ProcessDetach()
HRESULT sendRcvInit ( struct InstanceStruct *pInstance ) {
int rc; LPTSTR szDLLFile; int i; //MULTITHREAD
DWORD dwTmpPhysID = INVALID_PHYS_ID;
// Overall oss ASN.1 initialization routine. First allocate
// resources for its global structure, then initialize the
// subsystem.
pInstance->pWorld = (ASN1_CODER_INFO *)MemAlloc(sizeof(ASN1_CODER_INFO)); if (pInstance->pWorld == NULL) { H245TRACE(pInstance->dwInst, 1, "SR: SndRecvInit - No Memory"); return H245_ERROR_NOMEM; }
if (initializeASN1(pInstance->pWorld) != 0) { H245TRACE(pInstance->dwInst, 1, "SR: SndRecvInit - ASN.1 Encoder/Decoder initialization failed");
// Free the ASN.1 global structure
MemFree(pInstance->pWorld); pInstance->pWorld = NULL; return H245_ERROR_ASN1; }
// Initialization proceeding well. Wake up the
// data link layers, if necessary, based on the
// underlying protocol.
switch (pInstance->Configuration) { #if(0)
case H245_CONF_H324: // Get the DLL
szDLLFile = (LPTSTR)SRPDLLFILE;
// Initialize default size of PDU for SRP
pInstance->SendReceive.dwPDUSize = LL_PDU_SIZE + 4; pInstance->SendReceive.dwNumRXBuffers = NUM_SRP_LL_RCV_BUFFERS; break; #endif
case H245_CONF_H323: // Get the DLL
szDLLFile = (LPTSTR)H245WSDLLFILE;
// Initialize default size of PDU
pInstance->SendReceive.dwPDUSize = LL_PDU_SIZE; pInstance->SendReceive.dwNumRXBuffers = MAX_LL_BUFFERS; break;
default: H245TRACE(pInstance->dwInst, 1, "SR: SndRecvInit - Invalid configuration %d", pInstance->Configuration); return H245_ERROR_SUBSYS; }
// Load and Initialize Datalink layer
if ((rc = initializeLinkDllEntry(pInstance, szDLLFile)) != 0) { H245TRACE(pInstance->dwInst, 1, "SR: Link Open Lib Fail %d", rc); return rc; }
//MULTITHREAD
//use dwTmpPhysID so PhysID doesn't change.
//PhysID is different var for H245 than H245ws.
//Use hLinkLayerInstance for H245ws PhysID.
rc = pInstance->SendReceive.hLinkLayerInit(&dwTmpPhysID, pInstance->dwInst, #if defined(USE_RECEIVE_QUEUE)
h245ReceivePost, h245SendPost); #else // (USE_RECEIVE_QUEUE)
h245ReceiveComplete, h245SendComplete); #endif // (USE_RECEIVE_QUEUE)
if (FAILED(rc)) { H245TRACE(pInstance->dwInst, 1, "SR: Link Init Fail"); return rc; } // Get the Link layer's instance handle
pInstance->SendReceive.hLinkLayerInstance = pInstance->SendReceive.hLinkGetInstance(dwTmpPhysID);
#if defined(USE_RECEIVE_QUEUE)
// Allocate semaphore for task deletion procedures
#ifdef _IA_SPOX_
RIL_CreateSemaphore(0, &(pInstance->SendReceive.hReceiveSemphore)); #else
pInstance->SendReceive.hReceiveSemphore = SEM_create(0, NULL); #endif //_IA_SPOX_
if (pInstance->SendReceive.hReceiveSemphore == NULL) { H245TRACE(pInstance->dwInst, 1, "SR: Semaphore creation failed"); return SR_CREATE_SEM_FAIL; }
// Allocate mailbox
#ifdef _IA_SPOX_
RIL_CreateMailbox(pInstance->dwInst, ID_H245, 16, OIL_LOCAL, &(pInstance->SendReceive.pMailbox)); #else
pInstance->SendReceive.pMailbox = MBX_create(sizeof(RXMSG), 16, NULL); #endif _IA_SPOX_
if (pInstance->SendReceive.pMailbox == NULL) { H245TRACE(pInstance->dwInst, 1, "SR: Mailbox creation failed"); return SR_CREATE_MBX_FAIL; }
#if defined(_DEBUG) && defined(H324)
// Turn logging on/off
srInitializeLogging(pInstance, H245_TRACE_ENABLED); #endif // (_DEBUG)
#ifdef _IA_SPOX_
// Initialize the task and
// Start the receive thread
srTaskAttr.idwPriority = OIL_MINPRI; srTaskAttr.pStack = NULL; srTaskAttr.dwStackSize = 8192; srTaskAttr.pEnviron = NULL; srTaskAttr.szName = "H245ReceiveThread"; srTaskAttr.bExitFlag = TRUE;
RIL_CreateTask((PFxn)ReceiveThread, &srTaskAttr, srContext, &pInstance->SendReceive.pTaskReceive); #else
// Initialize the task and
// Start the receive thread
srTaskAttr.priority = TSK_MINPRI; srTaskAttr.stack = NULL; srTaskAttr.stacksize = 8192; srTaskAttr.stackseg = 0; // srTaskAttr.environ = NULL;
srTaskAttr.name = " "; srTaskAttr.exitflag = FALSE; // srTaskAttr.debug = TSK_DBG_NO;
pInstance->SendReceive.pTaskReceive = TSK_create((Fxn)ReceiveThread, &srTaskAttr, srContext); #endif //_IA_SPOX_
if (pInstance->SendReceive.pTaskReceive == NULL) { H245TRACE(pInstance->dwInst, 1, "SR: Thread Create FAIL"); H245PANIC(); return SR_THREAD_CREATE_ERROR; }
#endif // (USE_RECEIVE_QUEUE)
// post buffers to link layer for receive
for (i = 0; i < pInstance->SendReceive.dwNumRXBuffers; ++i) { pInstance->SendReceive.lpRxBuffer[i] = MemAlloc(pInstance->SendReceive.dwPDUSize); if (pInstance->SendReceive.lpRxBuffer[i] == NULL) { H245TRACE(pInstance->dwInst, 1, "SR: SndRecvInit - No Memory"); return H245_ERROR_NOMEM; } rc = pInstance->SendReceive.hLinkReceiveReq(pInstance->SendReceive.hLinkLayerInstance, (PBYTE)pInstance->SendReceive.lpRxBuffer[i], pInstance->SendReceive.dwPDUSize); if (rc != 0) { H245TRACE(pInstance->dwInst, 1, "SR: SndRecvInit - Receive Buffer Post returned %d", rc); return rc; } }
H245TRACE(pInstance->dwInst, 3, "SR: INIT Complete");
return H245_ERROR_OK; } // sendRcvInit()
HRESULT sendRcvFlushPDUs ( struct InstanceStruct *pInstance, DWORD dwDirection, BOOL bShutdown ) { pInstance->SendReceive.dwFlushMap = dwDirection; if (bShutdown) { pInstance->SendReceive.dwFlushMap |= SHUTDOWN_PENDING; }
// Flush the requested queue(s)
return(pInstance->SendReceive.hLinkLayerFlushChannel(pInstance->SendReceive.hLinkLayerInstance, dwDirection)); }
|