📄 cpgpnetdriver.cpp
字号:
/*____________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
$Id: CPGPnetDriver.cpp,v 1.3 2002/08/06 20:10:26 dallen Exp $
____________________________________________________________________________*/
#include "pgpnetBase.h"
#include "pgpnetPacket.h"
#include "pgpnetPacketHelper.h"
#include "CPGPnetDriver.h"
#include "pgpnetDebug.h"
CPGPnetDriver::CPGPnetDriver()
{
NdisAllocateSpinLock(&general_lock);
NdisAllocateSpinLock(&doTransform_lock);
}
CPGPnetDriver::~CPGPnetDriver()
{
NdisFreeSpinLock(&general_lock);
NdisFreeSpinLock(&doTransform_lock);
}
NDIS_STATUS CPGPnetDriver::AllocatePacketPool()
{
NDIS_STATUS status;
int i;
UINT block_size;
NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);
DBG_FUNC("AllocateDriverPacketPool")
DBG_ENTER();
do
{
NdisAllocatePacketPool(&status, &PGPnetDriver->packet_pool, SHARED_PACKET_POOL_SIZE,
PROTOCOL_RESERVED_LENGTH);
if (status != NDIS_STATUS_SUCCESS)
break;
NdisAllocateBufferPool(&status, &PGPnetDriver->buffer_pool, SHARED_BUFFER_POOL_SIZE);
if (status != NDIS_STATUS_SUCCESS)
break;
PGPnetDriver->free_packet_list = (PGPnetPacket*)NULL;
PGPnetDriver->free_packet_head_list = (PPGPnetPacketHead)NULL;
block_size = BLOCK_SIZE; // FIX
for (i = 0; i < PACKET_PENDING_MAXIMUM; i++) {
PGPnetPacket* packet;
status = NdisAllocateMemory((void**)&packet, sizeof(PGPnetPacket), 0, HighestAcceptableAddress);
if (status != NDIS_STATUS_SUCCESS)
break;
NdisZeroMemory(packet, sizeof(PGPnetPacket));
status = NdisAllocateMemory((void**)&packet->srcBlock, block_size, 0, HighestAcceptableAddress);
if (status != NDIS_STATUS_SUCCESS)
break;
status = NdisAllocateMemory((void**)&packet->xformBlock, block_size, 0, HighestAcceptableAddress);
if (status != NDIS_STATUS_SUCCESS)
break;
NdisAllocatePacket(&status, &packet->xformPacket, PGPnetDriver->packet_pool);
if (status != NDIS_STATUS_SUCCESS)
break;
NdisAllocateBuffer(&status, &packet->xformBuffer, PGPnetDriver->buffer_pool,
packet->xformBlock, block_size);
if (status != NDIS_STATUS_SUCCESS)
break;
NdisChainBufferAtFront(packet->xformPacket, packet->xformBuffer);
PacketEnqueue(&PGPnetDriver->free_packet_list, packet);
}
for (i = 0; i < PACKET_HEAD_PENDING_MAXIMUM; i++) {
PPGPnetPacketHead packetHead;
status = NdisAllocateMemory((void**)&packetHead, sizeof(PGPnetPacketHead), 0, HighestAcceptableAddress);
if (status != NDIS_STATUS_SUCCESS)
break;
NdisZeroMemory(packetHead, sizeof(PGPnetPacketHead));
PacketHeadEnqueue(&PGPnetDriver->free_packet_head_list, packetHead);
}
} while (0);
DBG_LEAVE(status);
return status;
}
VOID CPGPnetDriver::FreePacketPool()
{
PPGPnetPacketHead head;
PGPnetPacket* packet;
while ((head = PacketHeadDequeue(&PGPnetDriver->free_packet_head_list)) != NULL)
{
NdisFreeMemory(head, sizeof(PGPnetPacketHead), 0);
}
while ((packet = PacketDequeue(&PGPnetDriver->free_packet_list)) != NULL)
{
NdisFreeMemory(packet->srcBlock, BLOCK_SIZE, 0);
NdisFreeMemory(packet->xformBlock, BLOCK_SIZE, 0);
NdisFreeMemory(packet, sizeof(PGPnetPacket), 0);
}
PGPnetDriver->free_packet_list = (PGPnetPacket*)NULL;
PGPnetDriver->free_packet_head_list = (PPGPnetPacketHead)NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -