📄 vpnsupport.c
字号:
#include "version.h"
#include "vpn.h"
#include "vpndbg.h"
#include "ipdef.h"
#include "pgpNetKernel.h"
#include "pgpIPheader.h"
#ifdef PM_EMULATION
#include "dummypm.h"
#endif
#ifdef CHICAGO
extern unsigned long PgpKernelGetSystemTime(void);
#else
unsigned long PgpKernelGetSystemTime(void)
{
LARGE_INTEGER t;
KeQuerySystemTime(&t);
return ((unsigned long)t.LowPart/10000);
}
#endif
void PacketEnqueue(
PVPN_ADAPTER adapter,
PPGPNDIS_PACKET *packet_list,
PPGPNDIS_PACKET packet)
{
NdisAcquireSpinLock(&adapter->general_lock);
if (*packet_list == (PPGPNDIS_PACKET) NULL) {
packet->link = packet;
} else {
packet->link = (*packet_list)->link;
(*packet_list)->link = packet;
}
*packet_list = packet;
NdisReleaseSpinLock(&adapter->general_lock);
}
PPGPNDIS_PACKET PacketDequeue(
PVPN_ADAPTER adapter,
PPGPNDIS_PACKET *packet_list)
{
PPGPNDIS_PACKET packet;
NdisAcquireSpinLock(&adapter->general_lock);
if (*packet_list == (PPGPNDIS_PACKET) NULL) {
packet = (PPGPNDIS_PACKET) NULL;
} else {
packet = (*packet_list)->link;
if (packet == *packet_list) {
*packet_list = (PPGPNDIS_PACKET) NULL;
} else {
(*packet_list)->link = packet->link;
}
}
NdisReleaseSpinLock(&adapter->general_lock);
return packet;
}
PPGPNDIS_PACKET PacketRemoveByXformPacket(
PVPN_ADAPTER adapter,
PPGPNDIS_PACKET *packet_list,
PNDIS_PACKET packet)
{
PPGPNDIS_PACKET pgpPacket;
NdisAcquireSpinLock(&adapter->general_lock);
if ( (pgpPacket = *packet_list) != NULL )
{
do
{
PPGPNDIS_PACKET next = pgpPacket->link;
if (next->xformPacket == packet)
{
if (next == pgpPacket)
*packet_list = NULL;
else
{
pgpPacket->link = next->link;
if (*packet_list == next)
*packet_list = pgpPacket;
}
NdisReleaseSpinLock(&adapter->general_lock);
return next;
}
pgpPacket = next;
} while (pgpPacket != *packet_list);
};
NdisReleaseSpinLock(&adapter->general_lock);
return NULL;
}
PPGPNDIS_PACKET PacketRemoveBySrcPacket(
PVPN_ADAPTER adapter,
PPGPNDIS_PACKET *packet_list,
PNDIS_PACKET packet)
{
PPGPNDIS_PACKET pgpPacket;
NdisAcquireSpinLock(&adapter->general_lock);
if ( (pgpPacket = *packet_list) != NULL )
{
do
{
PPGPNDIS_PACKET next = pgpPacket->link;
if (next->srcPacket == packet)
{
if (next == pgpPacket)
*packet_list = NULL;
else
{
pgpPacket->link = next->link;
if (*packet_list == next)
*packet_list = pgpPacket;
}
NdisReleaseSpinLock(&adapter->general_lock);
return next;
}
pgpPacket = next;
} while (pgpPacket != *packet_list);
};
NdisReleaseSpinLock(&adapter->general_lock);
return NULL;
}
NDIS_STATUS AllocatePGPnetPacketPool(PVPN_ADAPTER adapter)
{
NDIS_STATUS status;
int i;
UINT block_size;
NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1);
DBG_FUNC("AllocatePGPnetPacketPool")
DBG_ENTER();
adapter->free_packet_list = (PPGPNDIS_PACKET)NULL;
adapter->sent_ipsecpacket_list = (PPGPNDIS_PACKET)NULL;
adapter->sent_plainpacket_list = (PPGPNDIS_PACKET)NULL;
adapter->incoming_plaintransferComplete_wait_list = (PPGPNDIS_PACKET)NULL;
adapter->incoming_ipsectransferComplete_wait_list = (PPGPNDIS_PACKET)NULL;
adapter->incoming_indicateComplete_wait_list = (PPGPNDIS_PACKET)NULL;
adapter->incoming_fragment_indicateComplete_wait_list = (PPGPNDIS_PACKET)NULL;
adapter->outgoing_multiple_ipsecpacket_list = (PPGPNDIS_PACKET)NULL;
adapter->free_packet_head_list = (PPGPNDIS_PACKET_HEAD)NULL;
adapter->outgoing_packet_head_list = (PPGPNDIS_PACKET_HEAD)NULL;
adapter->incoming_packet_head_list = (PPGPNDIS_PACKET_HEAD)NULL;
adapter->sent_packet_head_list = (PPGPNDIS_PACKET_HEAD)NULL;
adapter->free_request_list = (PPGPNDIS_REQUEST)NULL;
adapter->send_request_list = (PPGPNDIS_REQUEST)NULL;
adapter->wait_request_list = (PPGPNDIS_REQUEST)NULL;
block_size = BLOCK_SIZE; // FIX
for (i = 0; i < PACKET_PENDING_MAXIMUM; i++) {
PPGPNDIS_PACKET packet;
status = NdisAllocateMemory(&packet, sizeof(PGPNDIS_PACKET), 0, HighestAcceptableAddress);
if (status != NDIS_STATUS_SUCCESS)
{
DBG_LEAVE(status);
return status;
}
NdisZeroMemory(packet, sizeof(PGPNDIS_PACKET));
status = NdisAllocateMemory(&packet->srcBlock, block_size, 0, HighestAcceptableAddress);
if (status != NDIS_STATUS_SUCCESS)
{
DBG_LEAVE(status);
return status;
}
status = NdisAllocateMemory(&packet->xformBlock, block_size, 0, HighestAcceptableAddress);
if (status != NDIS_STATUS_SUCCESS)
{
DBG_LEAVE(status);
return status;
}
PacketEnqueue(adapter, &adapter->free_packet_list, packet);
}
for (i = 0; i < PACKET_HEAD_PENDING_MAXIMUM; i++) {
PPGPNDIS_PACKET_HEAD packetHead;
status = NdisAllocateMemory(&packetHead, sizeof(PGPNDIS_PACKET_HEAD), 0, HighestAcceptableAddress);
if (status != NDIS_STATUS_SUCCESS)
{
DBG_LEAVE(status);
return status;
}
NdisZeroMemory(packetHead, sizeof(PGPNDIS_PACKET_HEAD));
PacketHeadEnqueue(adapter, &adapter->free_packet_head_list, packetHead);
}
for (i = 0; i < REQUEST_PENDING_MAXIMUM; i++) {
PPGPNDIS_REQUEST request;
status = NdisAllocateMemory(&request, sizeof(PGPNDIS_REQUEST), 0, HighestAcceptableAddress);
if (status != NDIS_STATUS_SUCCESS)
{
DBG_LEAVE(status);
return status;
}
NdisZeroMemory(request, sizeof(PGPNDIS_REQUEST));
RequestEnqueue(adapter, &adapter->free_request_list, request);
}
DBG_LEAVE(status);
return status;
}
PPGPNDIS_PACKET PGPNdisPacketAllocWithBindingContext(
PNDIS_STATUS status,
PVPN_ADAPTER adapter)
{
PPGPNDIS_PACKET packet;
DBG_FUNC("PGPNdisPacketAllocWithBindingContext")
packet = (PPGPNDIS_PACKET) PacketDequeue( adapter, &adapter->free_packet_list);
if (packet == (PPGPNDIS_PACKET) NULL) {
DBG_PRINT(("!!!!! FATAL!!! PreAllocated PGPPacket Exhausted!!!\n"););
ASSERT(FALSE);
*status = NDIS_STATUS_RESOURCES;
return NULL;
}
*status = NDIS_STATUS_SUCCESS;
packet->Binding = NULL;
packet->link = NULL;
return packet;
}
PPGPNDIS_PACKET PGPNdisPacketAllocWithXformPacket(
PNDIS_STATUS status,
PVPN_ADAPTER adapter)
{
PPGPNDIS_PACKET packet;
DBG_FUNC("PGPNdisPacketAllocWithXformPacket")
packet = (PPGPNDIS_PACKET) PacketDequeue( adapter, &adapter->free_packet_list);
if (packet == (PPGPNDIS_PACKET) NULL) {
DBG_PRINT(("!!!!! FATAL!!! PreAllocated PGPPacket Exhausted!!!\n"););
ASSERT(FALSE);
*status = NDIS_STATUS_RESOURCES;
return NULL;
}
packet->srcPacket = NULL;
packet->srcBuffer = NULL;
NdisAllocatePacket(status, &packet->xformPacket, adapter->packet_pool);
if (*status != NDIS_STATUS_SUCCESS) {
PacketEnqueue(adapter, &adapter->free_packet_list, packet);
DBG_PRINT(("!!!!! FATAL!!! PreAllocated Packet Pool Exhausted!!!\n"););
ASSERT(FALSE);
return NULL;
}
NdisAllocateBuffer(status, &packet->xformBuffer, adapter->buffer_pool, packet->xformBlock, BLOCK_SIZE);
if (*status != NDIS_STATUS_SUCCESS) {
NdisFreePacket(packet->xformPacket);
PacketEnqueue(adapter, &adapter->free_packet_list, packet);
DBG_PRINT(("!!!!! FATAL!!! PreAllocated Buffer Pool Exhausted!!!\n"););
ASSERT(FALSE);
return NULL;
}
NdisChainBufferAtFront(packet->xformPacket, packet->xformBuffer);
packet->link = NULL;
packet->firstSrcBlock = 0;
packet->firstXformBlock = 0;
packet->lastSrcBlock = 0;
packet->lastXformBlock = 0;
return packet;
}
PPGPNDIS_PACKET PGPNdisPacketAllocWithSrcPacket(
PNDIS_STATUS status,
PVPN_ADAPTER adapter)
{
PPGPNDIS_PACKET packet;
DBG_FUNC("PGPNdisPacketAllocSrcPacket")
DBG_ENTER();
*status = NDIS_STATUS_SUCCESS;
packet = (PPGPNDIS_PACKET) PacketDequeue( adapter, &adapter->free_packet_list);
if (packet == (PPGPNDIS_PACKET) NULL) {
DBG_PRINT(("!!!!! FATAL!!! PreAllocated PGPPacket Exhausted!!!\n"););
ASSERT(FALSE);
*status = NDIS_STATUS_RESOURCES;
return NULL;
}
NdisAllocatePacket(status, &packet->srcPacket, adapter->packet_pool);
if (*status != NDIS_STATUS_SUCCESS) {
PacketEnqueue(adapter, &adapter->free_packet_list, packet);
DBG_PRINT(("!!!!! FATAL!!! PreAllocated Packet Pool Exhausted!!!\n"););
ASSERT(FALSE);
return NULL;
}
NdisAllocateBuffer(status, &packet->srcBuffer, adapter->buffer_pool, ((UCHAR*)packet->srcBlock + adapter->eth_hdr_len), BLOCK_SIZE);
if (*status != NDIS_STATUS_SUCCESS) {
NdisFreePacket(packet->srcPacket);
PacketEnqueue(adapter, &adapter->free_packet_list, packet);
DBG_PRINT(("!!!!! FATAL!!! PreAllocated Buffer Pool Exhausted!!!\n"););
ASSERT(FALSE);
return NULL;
}
NdisChainBufferAtFront(packet->srcPacket, packet->srcBuffer);
packet->xformPacket = NULL;
packet->xformBuffer = NULL;
packet->link = NULL;
packet->firstSrcBlock = 0;
packet->firstXformBlock = 0;
packet->lastSrcBlock = 0;
packet->lastXformBlock = 0;
DBG_LEAVE(0);
return packet;
}
VOID PGPNdisPacketFree(
PVPN_ADAPTER adapter,
PPGPNDIS_PACKET packet)
{
PNDIS_BUFFER buffer = NULL;
DBG_FUNC("PGPNdisPacketFree")
DBG_ENTER();
if (packet == NULL)
{
DBG_LEAVE(1);
return;
}
if (packet->xformPacket)
{
NdisUnchainBufferAtFront(packet->xformPacket, &buffer);
if (buffer)
{
//NdisFreeBuffer(packet->xformBuffer); //?
NdisFreeBuffer(buffer);
}
packet->xformBuffer = NULL;
NdisFreePacket(packet->xformPacket);
packet->xformPacket = (PNDIS_PACKET)NULL;
}
packet->fragmentNumber = 0;
PacketEnqueue(adapter, &adapter->free_packet_list, packet);
DBG_LEAVE(0);
}
VOID PGPNdisPacketFreeWithBindingContext(
PVPN_ADAPTER adapter,
PPGPNDIS_PACKET packet)
{
PNDIS_BUFFER buffer = NULL;
DBG_FUNC("PGPNdisPacketFreeWithBindingContext")
DBG_ENTER();
if (packet == NULL)
{
DBG_LEAVE(1);
return;
}
packet->fragmentNumber = 0;
PacketEnqueue(adapter, &adapter->free_packet_list, packet);
DBG_LEAVE(0);
}
VOID PGPNdisPacketFreeSrcPacket(
PVPN_ADAPTER adapter,
PPGPNDIS_PACKET packet)
{
PNDIS_BUFFER buffer = NULL;
DBG_FUNC("PGPNdisPacketFreeSrcPacket")
DBG_ENTER();
if (packet == NULL)
{
DBG_LEAVE(1);
return;
}
if (packet->srcPacket)
{
NdisUnchainBufferAtFront(packet->srcPacket, &buffer);
if (buffer)
{
//NdisFreeBuffer(packet->xformBuffer); //?
NdisFreeBuffer(buffer);
}
packet->srcBuffer = NULL;
NdisFreePacket(packet->srcPacket);
packet->srcPacket = (PNDIS_PACKET)NULL;
}
packet->fragmentNumber = 0;
PacketEnqueue(adapter, &adapter->free_packet_list, packet);
DBG_LEAVE(0);
}
VOID PGPCopyPacketToBlock(
PNDIS_PACKET packet,
PUCHAR block,
PUINT BytesCopied)
{
UINT numNdisBuffer;
PNDIS_BUFFER CurrentBuffer;
PVOID CurrentBlock;
UINT CurrentLength;
DBG_FUNC("PGPCopyPacketToBlock")
*BytesCopied = 0;
NdisQueryPacket(packet, NULL, &numNdisBuffer, &CurrentBuffer, NULL);
if (numNdisBuffer == 0)
return;
NdisQueryBuffer(CurrentBuffer, &CurrentBlock, &CurrentLength);
while(CurrentBuffer != NULL)
{
NdisMoveMemory(block, CurrentBlock, CurrentLength);
block = (PUCHAR)block + CurrentLength;
*BytesCopied = *BytesCopied + CurrentLength;
NdisGetNextBuffer(CurrentBuffer, &CurrentBuffer);
if (CurrentBuffer == NULL)
break;
NdisQueryBuffer(CurrentBuffer, &CurrentBlock, &CurrentLength);
}
}
VOID PGPnetAdjustTransferCompletePacket(PPGPNDIS_PACKET pgpPacket)
{
PGPCopyPacketToBlock(pgpPacket->srcPacket, pgpPacket->xformBlock, &pgpPacket->xformBlockLen);
NdisMoveMemory(pgpPacket->srcBlock, pgpPacket->xformBlock, pgpPacket->xformBlockLen);
pgpPacket->srcBlockLen = pgpPacket->xformBlockLen;
pgpPacket->xformBlockLen = 0;
}
VOID PGPnetAdjustPacket(PPGPNDIS_PACKET packet)
{
PNDIS_BUFFER ndisBuffer;
NdisUnchainBufferAtFront(packet->xformPacket, &ndisBuffer);
NdisAdjustBufferLength(ndisBuffer, packet->xformBlockLen);
NdisChainBufferAtFront(packet->xformPacket, ndisBuffer);
}
void RequestEnqueue(
PVPN_ADAPTER adapter,
PPGPNDIS_REQUEST *request_list,
PPGPNDIS_REQUEST request)
{
NdisAcquireSpinLock(&adapter->general_lock);
if (*request_list == (PPGPNDIS_REQUEST) NULL) {
request->link = request;
} else {
request->link = (*request_list)->link;
(*request_list)->link = request;
}
*request_list = request;
NdisReleaseSpinLock(&adapter->general_lock);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -