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

📄 channel.cpp

📁 pppoe client
💻 CPP
字号:

//********************************************************************
//	日期:	2004/08/25 - 25:8:2004   13:57
//	名前:	tiamo
//	描述:	channel
//*********************************************************************

#include "stdafx.h"

#define __ulFILE__											MAKE_SIG('C','H','N','L')

// create init channel
PCHANNEL CreateInitializeChannel(ULONG ulLineId)
{
	PCHANNEL pRet = NULL;
	AllocateMemory(reinterpret_cast<PVOID*>(&pRet),sizeof(CHANNEL),CHANNEL_SIG);

	NdisZeroMemory(pRet,sizeof(CHANNEL));

	pRet->m_ulSig = CHANNEL_SIG;
	pRet->m_lRefCount = 1;
	pRet->m_ulState = CHANNEL_CLOSE;
	pRet->m_ulLineId = ulLineId;
	pRet->m_ulLinkSpeed = 1000000;
	pRet->m_ulBearerMode = LINEBEARERMODE_DATA;
	pRet->m_ulMediaMode = LINEMEDIAMODE_DIGITALDATA;

	pRet->m_wanCoLinkInfo.MaxRecvFrameSize = 
				pRet->m_wanCoLinkInfo.MaxSendFrameSize = g_pAdapter->m_wanCoInfo.MaxFrameSize - PPPOE_HEADER_LEN;

	pRet->m_wanCoLinkInfo.RecvACCM = pRet->m_wanCoLinkInfo.SendACCM = g_pAdapter->m_wanCoInfo.DesiredACCM;
	pRet->m_wanCoLinkInfo.RecvCompressionBits = pRet->m_wanCoLinkInfo.SendCompressionBits = 0;
	pRet->m_wanCoLinkInfo.RecvFramingBits = pRet->m_wanCoLinkInfo.SendFramingBits = g_pAdapter->m_wanCoInfo.FramingBits;

	NdisAllocateSpinLock(&pRet->m_lockSelf);

	NdisInitializeListHead(&pRet->m_ltRecvedPacketsHead);

	return pRet;
}

// shut down channel
VOID ShutdownChannel(PCHANNEL pChannel)
{
	PAGED_CODE();

	ASSERT(pChannel && pChannel->m_ulSig == CHANNEL_SIG && !pChannel->m_hNdisSapHandle && !pChannel->m_hNdisVcHandle &&
		   pChannel->m_lRefCount == 1 && !pChannel->m_lSapRefCount && !pChannel->m_lPendingRecvedPackets &&
		   !pChannel->m_lPendingReturnPackets && !pChannel->m_lSendingPackets);

	NdisFreeSpinLock(&pChannel->m_lockSelf);

	FreeMemory(pChannel,sizeof(CHANNEL));
}

// ref
VOID ReferenceChannel(PCHANNEL pChannel,BOOLEAN bAcquireLook)
{
	ASSERT(pChannel && pChannel->m_ulSig == CHANNEL_SIG && pChannel->m_lRefCount > 0);

	if(bAcquireLook)
		NdisAcquireSpinLock(&pChannel->m_lockSelf);

	pChannel->m_lRefCount ++;

	if(bAcquireLook)
		NdisReleaseSpinLock(&pChannel->m_lockSelf);
}

// deref
VOID DereferenceChannel(PCHANNEL pChannel)
{
	ASSERT(pChannel && pChannel->m_ulSig == CHANNEL_SIG && pChannel->m_lRefCount > 0);

	NdisAcquireSpinLock(&pChannel->m_lockSelf);

	-- pChannel->m_lRefCount;

	NdisReleaseSpinLock(&pChannel->m_lockSelf);
}

// ref sap
VOID ReferenceSap(PCHANNEL pChannel,BOOLEAN bAcquireLook)
{
	ASSERT(pChannel && pChannel->m_ulSig == CHANNEL_SIG && pChannel->m_lRefCount > 0 && pChannel->m_lSapRefCount > 0);

	if(bAcquireLook)
		NdisAcquireSpinLock(&pChannel->m_lockSelf);

	pChannel->m_lSapRefCount ++;

	if(bAcquireLook)
		NdisReleaseSpinLock(&pChannel->m_lockSelf);
}

// deref sap
VOID DereferenceSap(PCHANNEL pChannel)
{
	ASSERT(pChannel && pChannel->m_ulSig == CHANNEL_SIG && pChannel->m_lRefCount > 0 && pChannel->m_lSapRefCount > 0);

	NdisAcquireSpinLock(&pChannel->m_lockSelf);

	LONG lCount = -- pChannel->m_lSapRefCount;

	NDIS_HANDLE hNdisSapHandle = NULL;

	if(!lCount)
	{
		hNdisSapHandle = pChannel->m_hNdisSapHandle;
		pChannel->m_hNdisSapHandle = NULL;
	}

	NdisReleaseSpinLock(&pChannel->m_lockSelf);

	if(!lCount)
	{
		ASSERT(hNdisSapHandle);
		NdisMCmDeregisterSapComplete(NDIS_STATUS_SUCCESS,hNdisSapHandle);
		DereferenceChannel(pChannel);
	}
}

// add channel to bind,
VOID AddChannel2Bind(PCHANNEL pChannel,PBIND_CONTEXT pBind)
{
	NdisAcquireSpinLock(&pChannel->m_lockSelf);

	// must be at activating state
	if(pChannel->m_ulState == CHANNEL_ACTIVATING)
	{
		NdisAcquireSpinLock(&pBind->m_lockSelf);

		if(pBind->m_ulBindState == BIND_LOWER_MINIPORT_OPENED)
		{
			ReferenceBind(pBind,FALSE);

			pChannel->m_pBindContext = pBind;

			NdisMoveMemory(pChannel->m_macSelf,pBind->m_macAddress,ETH_ADDR_LEN);

			pChannel->m_ulLinkSpeed = pBind->m_ulLinkSpeed;
		}

		NdisReleaseSpinLock(&pBind->m_lockSelf);
	}

	NdisReleaseSpinLock(&pChannel->m_lockSelf);
}

// remove,
VOID RemoveChannelFromBind(PCHANNEL pChannel,PBIND_CONTEXT pBind)
{
	NdisAcquireSpinLock(&pChannel->m_lockSelf);

	if(pChannel->m_ulState == CHANNEL_DEACTIVATING)
	{
		pChannel->m_pBindContext = NULL;
		pChannel->m_ulLinkSpeed = 0;
	}

	NdisReleaseSpinLock(&pChannel->m_lockSelf);

	DereferenceBind(pBind);
}

// map session id to connect
PCHANNEL MapSessionId2Channel(PPACKET pPacket)
{
	ASSERT(DISPATCH_LEVEL == KeGetCurrentIrql());

	PCHANNEL pChannel = NULL;

	// from session id get connect pointer
	NdisDprAcquireSpinLock(&g_pAdapter->m_lockSelf);

	for(ULONG i = 0; i < g_pAdapter->m_ulNumChannels; i++)
	{
		pChannel = g_pAdapter->m_ppChannels[i];

		NdisDprAcquireSpinLock(&pChannel->m_lockSelf);

		if( pChannel->m_ulState == CHANNEL_ACTIVATED && 
			pChannel->m_usSessionId == ntohs(pPacket->m_pFrame->m_pppFrame.m_usSession) &&
			RtlCompareMemory(pChannel->m_macPeer,pPacket->m_pFrame->m_srcMac,ETH_ADDR_LEN) == ETH_ADDR_LEN &&
			RtlCompareMemory(pChannel->m_macSelf,pPacket->m_pFrame->m_dstMac,ETH_ADDR_LEN) == ETH_ADDR_LEN)
		{
			break;
		}

		NdisDprReleaseSpinLock(&pChannel->m_lockSelf);

		pChannel = NULL;
	}

	NdisDprReleaseSpinLock(&g_pAdapter->m_lockSelf);

	return pChannel;
}

// map without session id to connect
PCHANNEL MapWithoutSessionId2Channel(PPACKET pPacket)
{
	ASSERT(DISPATCH_LEVEL == KeGetCurrentIrql());

	PLARGE_INTEGER pllHostUnique = reinterpret_cast<PLARGE_INTEGER>(pPacket->m_pHostUnique);

	if(pllHostUnique->LowPart >= g_pAdapter->m_ulNumChannels)
		return NULL;

	PCHANNEL pChannel = g_pAdapter->m_ppChannels[pllHostUnique->LowPart];

	if(pChannel)
	{
		NdisDprAcquireSpinLock(&pChannel->m_lockSelf);

		if(pChannel->m_ulState != CHANNEL_ACTIVATING)
		{
			NdisDprReleaseSpinLock(&pChannel->m_lockSelf);
			pChannel = NULL;
		}
	}

	return pChannel;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -