📄 callmgr.cpp
字号:
//********************************************************************
// 日期: 2004/08/25 - 25:8:2004 14:23
// 名前: tiamo
// 描述: call manager
//*********************************************************************
#include "stdafx.h"
// open af
NDIS_STATUS mcmOpenAf(PADAPTER pAdapter,PCO_ADDRESS_FAMILY pCoAf,NDIS_HANDLE hNdisAfHandle,PADAPTER *ppAdapter)
{
ASSERT(pAdapter && pAdapter->m_ulSig == ADAPTER_SIG && pAdapter->m_lRefCount > 0);
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
NdisAcquireSpinLock(&pAdapter->m_lockSelf);
if(pAdapter->m_hNdisAfHandle)
{
DebugError(("try to open AF again!\n"));
status = NDIS_STATUS_FAILURE;
}
else
{
// add a ref
ReferenceAdapter(pAdapter,FALSE);
// save
pAdapter->m_hNdisAfHandle = hNdisAfHandle;
DebugInfo(("AF = 0x%x,version = (%d,%d)\n",hNdisAfHandle,pCoAf->MajorVersion,pCoAf->MinorVersion));
*ppAdapter = pAdapter;
}
NdisReleaseSpinLock(&pAdapter->m_lockSelf);
return status;
}
// close af
NDIS_STATUS mcmCloseAf(PADAPTER pAdapter)
{
ASSERT(pAdapter && pAdapter->m_ulSig == ADAPTER_SIG && pAdapter->m_lRefCount > 0);
DebugInfo(("close AF = 0x%x\n",pAdapter->m_hNdisAfHandle));
NdisAcquireSpinLock(&pAdapter->m_lockSelf);
pAdapter->m_hNdisAfHandle = NULL;
NdisReleaseSpinLock(&pAdapter->m_lockSelf);
DereferenceAdapter(pAdapter);
return NDIS_STATUS_SUCCESS;
}
// register sap
NDIS_STATUS mcmRegisterSap(PADAPTER pAdapter,PCO_SAP pSap,NDIS_HANDLE hNdisSapHandle,PCHANNEL *ppChannel)
{
ASSERT(pAdapter && pAdapter->m_ulSig == ADAPTER_SIG && pAdapter->m_lRefCount > 0);
NDIS_STATUS status = NDIS_STATUS_INVALID_DATA;
PCO_AF_TAPI_SAP pTapiSap = reinterpret_cast<PCO_AF_TAPI_SAP>(pSap->Sap);
PCHANNEL pChannel = NULL;
// get channel pointer
if(pTapiSap->ulLineID < pAdapter->m_ulNumChannels)
{
pChannel = pAdapter->m_ppChannels[pTapiSap->ulLineID];
ASSERT(pChannel && pChannel->m_lRefCount > 0);
NdisAcquireSpinLock(&pChannel->m_lockSelf);
if(pChannel->m_hNdisSapHandle)
{
DebugError(("channel %d try to register SAP again!\n",pTapiSap->ulLineID));
status = NDIS_STATUS_SAP_IN_USE;
}
else
{
pChannel->m_hNdisSapHandle = hNdisSapHandle;
pChannel->m_lSapRefCount = 1;
pChannel->m_lRefCount ++;
pChannel->m_coTapiSap = *pTapiSap;
DebugInfo(("channel %d reg SAP = 0x%x,addr id = 0x%x media mode = 0x%x\n",pTapiSap->ulLineID,hNdisSapHandle,
pTapiSap->ulAddressID,pTapiSap->ulMediaModes));
*ppChannel = pChannel;
status = NDIS_STATUS_SUCCESS;
}
NdisReleaseSpinLock(&pChannel->m_lockSelf);
}
return status;
}
// deregister sap
NDIS_STATUS mcmDeregisterSap(PCHANNEL pChannel)
{
ASSERT(pChannel && pChannel->m_ulSig == CHANNEL_SIG && pChannel->m_lRefCount > 0 && pChannel->m_lSapRefCount > 0);
DebugInfo(("channel %d dereg SAP = 0x%x,addr id = 0x%x media mode = 0x%x\n",
pChannel->m_coTapiSap.ulLineID,pChannel->m_hNdisSapHandle,
pChannel->m_coTapiSap.ulAddressID,pChannel->m_coTapiSap.ulMediaModes));
DereferenceSap(pChannel);
return NDIS_STATUS_PENDING;
}
// create vc
NDIS_STATUS mcmCreateVc(PADAPTER pAdapter,NDIS_HANDLE hNdisVcHandle,PCHANNEL *ppChannel)
{
ASSERT(pAdapter && pAdapter->m_ulSig == ADAPTER_SIG && pAdapter->m_lRefCount > 0);
NDIS_STATUS status = NDIS_STATUS_VC_NOT_AVAILABLE;
PCHANNEL pChannel = NULL;
NdisAcquireSpinLock(&pAdapter->m_lockSelf);
__try
{
// loop find
for(ULONG i = 0; i < pAdapter->m_ulNumChannels; i++)
{
pChannel = pAdapter->m_ppChannels[i];
ASSERT(pChannel && pChannel->m_ulSig == CHANNEL_SIG && pChannel->m_lRefCount > 0);
NdisAcquireSpinLock(&pChannel->m_lockSelf);
// check state
if(pChannel->m_ulState == CHANNEL_CLOSE)
{
pChannel->m_ulState = CHANNEL_OPEN;
pChannel->m_hNdisVcHandle = hNdisVcHandle;
ReferenceChannel(pChannel,FALSE);
NdisReleaseSpinLock(&pChannel->m_lockSelf);
DebugInfo(("found a free channel %d at 0x%x,NdisVcHandle = 0x%x\n",pChannel->m_ulLineId,pChannel,hNdisVcHandle));
status = NDIS_STATUS_SUCCESS;
break;
}
NdisReleaseSpinLock(&pChannel->m_lockSelf);
pChannel = NULL;
}
// found one
if(!pChannel)
{
DebugInfo(("there is no free channel,failed\n"));
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
NdisReleaseSpinLock(&pAdapter->m_lockSelf);
*ppChannel = pChannel;
return status;
}
// delete vc
NDIS_STATUS mcmDeleteVc(PCHANNEL pChannel)
{
ASSERT(pChannel && pChannel->m_ulSig == CHANNEL_SIG && pChannel->m_lRefCount > 0 && pChannel->m_hNdisVcHandle);
ASSERT(pChannel->m_ulState == CHANNEL_OPEN);
DebugInfo(("channel %d delete vc,NdisVcHandle = 0x%x\n",pChannel->m_ulLineId,pChannel->m_hNdisVcHandle));
NdisAcquireSpinLock(&pChannel->m_lockSelf);
pChannel->m_hNdisVcHandle = NULL;
pChannel->m_ulState = CHANNEL_CLOSE;
NdisReleaseSpinLock(&pChannel->m_lockSelf);
DereferenceChannel(pChannel);
return NDIS_STATUS_SUCCESS;
}
// activate vc complete
VOID mcmActivateVcComplete(NDIS_STATUS status,PCHANNEL pChannel,PCO_CALL_PARAMETERS pCallParams)
{
ASSERT(pChannel && pChannel->m_ulSig == CHANNEL_SIG && pChannel->m_lRefCount > 0 && pChannel->m_hNdisVcHandle);
ASSERT(pChannel->m_ulState == CHANNEL_ACTIVATING);
DebugInfo(("channel %d activate vc complete,NdisVcHandle = 0x%x,status = 0x%x\n",
pChannel->m_ulLineId,pChannel->m_hNdisVcHandle,status));
NdisAcquireSpinLock(&pChannel->m_lockSelf);
if(status == NDIS_STATUS_SUCCESS)
{
pChannel->m_ulState = CHANNEL_ACTIVATED;
ReferenceChannel(pChannel,FALSE);
}
NdisReleaseSpinLock(&pChannel->m_lockSelf);
}
// deactivate vc complete
VOID mcmDeactivateVcComplete(NDIS_STATUS status,PCHANNEL pChannel)
{
ASSERT(pChannel && pChannel->m_ulSig == CHANNEL_SIG && pChannel->m_lRefCount > 0 && pChannel->m_hNdisVcHandle);
ASSERT(pChannel->m_ulState == CHANNEL_DEACTIVATING);
DebugInfo(("channel %d deactivate vc complete,NdisVcHandle = 0x%x,status = 0x%x\n",
pChannel->m_ulLineId,pChannel->m_hNdisVcHandle,status));
NdisAcquireSpinLock(&pChannel->m_lockSelf);
if(status == NDIS_STATUS_SUCCESS)
{
pChannel->m_ulState = CHANNEL_OPEN;
}
NdisReleaseSpinLock(&pChannel->m_lockSelf);
if(status == NDIS_STATUS_SUCCESS)
{
DereferenceChannel(pChannel);
}
}
// make call
NDIS_STATUS mcmMakeCall(PCHANNEL pChannel,PCO_CALL_PARAMETERS pCallParams,NDIS_HANDLE hNdisPartyHandle,
PNDIS_HANDLE pCallMgrPartyContext)
{
ASSERT(pChannel && pChannel->m_ulSig == CHANNEL_SIG && pChannel->m_lRefCount > 0 && pChannel->m_hNdisVcHandle);
ASSERT(pChannel->m_ulState == CHANNEL_OPEN);
if(hNdisPartyHandle)
{
DebugError(("do not support party.\n"))
return NDIS_STATUS_NOT_SUPPORTED;
}
PCO_AF_TAPI_MAKE_CALL_PARAMETERS pTapiParam =
reinterpret_cast<PCO_AF_TAPI_MAKE_CALL_PARAMETERS>(pCallParams->MediaParameters->MediaSpecific.Parameters);
PLINE_CALL_PARAMS pLineParams = reinterpret_cast<PLINE_CALL_PARAMS>(
reinterpret_cast<PUCHAR>(&pTapiParam->LineCallParams) + pTapiParam->LineCallParams.Offset);
if(pLineParams->ulBearerMode & ~pChannel->m_ulBearerMode)
{
DebugError(("unsupported bearermode.(0x%x,0x%x)\n",pLineParams->ulBearerMode,pChannel->m_ulBearerMode));
return NDIS_STATUS_NOT_SUPPORTED;
}
if(pLineParams->ulMediaMode & ~pChannel->m_ulMediaMode)
{
DebugError(("unsupported mediamode.(0x%x,0x%x)\n",pLineParams->ulMediaMode,pChannel->m_ulMediaMode));
return NDIS_STATUS_NOT_SUPPORTED;
}
// irql is too high,use work item to do it
PWORK_ITEM pReBind = AllocateWorkItem(ExecReBindForMakeCall);
if(!pReBind)
{
DebugError(("unable to allocate workitem for rebind.\n"));
return NDIS_STATUS_RESOURCES;
}
PWORK_ITEM pMakeCall = AllocateWorkItem(ExecMakeCall);
if(!pMakeCall)
{
DebugError(("unable to allocate workitem for make call.\n"));
NdisFreeToNPagedLookasideList(&g_lookasideWorkItem,pReBind);
return NDIS_STATUS_RESOURCES;
}
pReBind->m_param.REBIND_FOR_MAKE_CALL.m_pMakeCall = pMakeCall;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -