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

📄 vpnsupport.c

📁 vc环境下的pgp源码
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -