⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callmgr.cpp

📁 pppoe client
💻 CPP
📖 第 1 页 / 共 2 页
字号:

//********************************************************************
//	日期:	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 + -