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

📄 packet.h

📁 pppoe client
💻 H
字号:

//********************************************************************
//	日期:	2004/08/24 - 24:8:2004   20:21
//	名前:	tiamo
//	描述:	packet
//*********************************************************************

#pragma once

// forward declaration
typedef struct __tagPacketBlock *PPACKET_BLOCK;
typedef struct __tagPacketPool *PPACKET_POOL;
typedef struct __tagBufferBlock *PBUFFER_BLOCK;
typedef struct __tagBufferPool *PBUFFER_POOL;
typedef struct __tagBindContext *PBIND_CONTEXT;
typedef struct __tagChannel *PCHANNEL;
typedef struct __tagPPPOEFrame *PPPPOE_FRAME;
typedef struct __tagPPPTagHeader *PPPP_TAG;

#define PACKET_SIG										MAKE_SIG('P','A','K','T')
#define PACKET_POOL_SIG									MAKE_SIG('P','K','P','L')
#define PACKET_BLOCK_SIG								MAKE_SIG('P','K','B','L')
#define PACKET_ITEM_SIG									MAKE_SIG('P','K','I','T')
#define BUFFER_POOL_SIG									MAKE_SIG('B','F','P','O')
#define BUFFER_BLOCK_SIG								MAKE_SIG('B','F','B','L')
#define BUFFER_ITEM_SIG									MAKE_SIG('B','F','I','T')

// packet flags
#define	PPPOE_PACKET_BUFFER_FROM_POOL					0x00000001
#define	PPPOE_PACKET_FROM_POOL							0x00000002

#define	PPPOE_PACKET_HEADER_BUFFER_FROM_NDIS			0x00000010
#define	PPPOE_PACKET_HEADER_BUFFER_CHAINED				0x00000020

#define	PPPOE_PACKET_DATA_BUFFER_FROM_NDIS				0x00000100
#define	PPPOE_PACKET_DATA_BUFFER_CHAINED				0x00000200

#define	PPPOE_PACKET_NEED_RETURN_PACKET					0x00001000
#define	PPPOE_PACKET_NEED_CALL_SEND_COMPLETE			0x00002000

#define	PPPOE_PACKET_ERROR_TAG_RECV						0x00010000
#define	PPPOE_PACKET_BUFFER_REVERSED					0x00020000

// for tag !!!already swapped
#define PPPOE_TAG_SERVICE								0x0101
#define PPPOE_TAG_AC									0x0201
#define PPPOE_TAG_HOST_UNIQUE							0x0301
#define PPPOE_TAG_AC_COOKIE								0x0401
#define PPPOE_TAG_RELAY_SESSION_ID						0x1001
#define PPPOE_TAG_SERVICE_NAME_ERROR					0x0102
#define PPPOE_TAG_AC_SYSTEM_ERROR						0x0202
#define PPPOE_TAG_GEN_ERROR								0x0302
#define PPPOE_TAG_AC_COOKIE_ERROR						0x0402

// for code
#define PPPOE_CODE_PAY_LOAD								0x00
#define PPPOE_CODE_PADT									0xa7
#define PPPOE_CODE_PADI									0x09
#define PPPOE_CODE_PADO									0x07
#define PPPOE_CODE_PADR									0x19
#define PPPOE_CODE_PADS									0x65

// for VER TYPE
#define PPPOE_VER										0x01
#define PPPOE_TYPE										0x01

// for ethernet type !!!already swapped
#define PPPOE_DISCOVERY									0x6388
#define PPPOE_SESSION									0x6488

#pragma pack(push)
#pragma pack(1)

// ppp tag
typedef struct __tagPPPTagHeader
{
	USHORT												m_usType;
	USHORT												m_usLen;
}PPP_TAG,*PPPP_TAG;

// ppp frame
typedef struct __tagPPPFrame
{
	UCHAR												m_ucVer:4;
	UCHAR												m_ucType:4;
	UCHAR												m_ucCode;
	USHORT												m_usSession;
	USHORT												m_usLen;
}PPP_FRAME,*PPPP_FRAME;

// pppoe frame
typedef struct __tagPPPOEFrame
{
	UCHAR												m_dstMac[ETH_ADDR_LEN];
	UCHAR												m_srcMac[ETH_ADDR_LEN];
	USHORT												m_usProtocolType;
	PPP_FRAME											m_pppFrame;
}PPPOE_FRAME,*PPPPOE_FRAME;
#pragma pack(pop)

// pacekt item
typedef struct __tagPacketItem
{
	LIST_ENTRY											m_ltPacketItemAnchor;			// list entry
	PNDIS_PACKET										m_pNdisPacket;					// ndis packet
	PPACKET_BLOCK										m_pPacketBlock;					// block pointer
	ULONG												m_ulSig;						// sig
}PACKET_ITEM,*PPACKET_ITEM;

// packet block
typedef struct __tagPacketBlock
{
	LIST_ENTRY											m_ltPacketBlockAnchor;			// list entry
	PPACKET_POOL										m_pPacketPool;					// packet pool pointer
	NDIS_HANDLE											m_hPacketPool;					// ndis packet pool
	ULONG												m_ulTotalPacketItems;			// total packets
	ULONG												m_ulFreePacketItems;			// free packets
	ULONG												m_ulSig;						// sig
	PACKET_ITEM											m_arrayItems[1];				// array
}PACKET_BLOCK,*PPACKET_BLOCK;

// packet pool
typedef struct __tagPacketPool
{
	ULONG												m_ulSig;						// sig
	NDIS_SPIN_LOCK										m_lockSelf;						// lock
	ULONG												m_ulPacketsPerBlock;			// packet per block
	ULONG												m_ulProtocolReservedLen;		// protocol resv len
	ULONG												m_ulMaxFreeGuard;				// max free guard
	ULONG												m_ulFreePackets;				// free packets
	ULONG												m_ulTotalPackets;				// total packets
	LIST_ENTRY											m_ltPacketBlocksHead;			// list head for block
	LIST_ENTRY											m_ltFreePacketsHead;			// list head for packet
}PACKET_POOL,*PPACKET_POOL;

// buffer item
typedef struct __tagBufferItem
{
	LIST_ENTRY											m_ltBufferItemAnchor;			// list entry
	PBUFFER_BLOCK										m_pBufferBlock;					// block pointer
	PNDIS_BUFFER										m_pNdisHeadBuffer;				// pppoe head buffer
	PNDIS_BUFFER										m_pNdisDataBuffer;				// data buffer
	ULONG												m_ulSig;						// sig
	UCHAR												m_pStorage[1];					// buffer storage
}BUFFER_ITEM,*PBUFFER_ITEM;

#define GET_ITEM_FROM_BLOCK_BY_INDEX(pBlock,index,size) (PBUFFER_ITEM)((PUCHAR)pBlock->m_arrayItem + index * (size + sizeof(BUFFER_ITEM)))

// buffer block
typedef struct __tagBufferBlock
{
	LIST_ENTRY											m_ltBufferBlockAnchor;			// list entry
	PBUFFER_POOL										m_pBufferPool;					// buffer pool pointer
	NDIS_HANDLE											m_hBufferPool;					// ndis buffer pool
	ULONG												m_ulTotalBufferItems;			// total items
	ULONG												m_ulFreeBufferItems;			// free items;
	ULONG												m_ulSig;						// sig
	BUFFER_ITEM											m_arrayItem[1];					// array
}BUFFER_BLOCK,*PBUFFER_BLOCK;

// buffer pool
typedef struct __tagBufferPool
{
	ULONG												m_ulSig;						// sig
	NDIS_SPIN_LOCK										m_lockSelf;						// lock
	ULONG												m_ulBuffersPerBlock;			// buffers per block
	ULONG												m_ulBufferSize;					// buffer size
	ULONG												m_ulMaxFreeGuard;				// max free guard
	ULONG												m_ulFreeBuffers;				// free buffers
	ULONG												m_ulTotalBuffers;				// total packets
	LIST_ENTRY											m_ltBufferBlocksHead;			// list head for block
	LIST_ENTRY											m_ltFreeBuffersHead;			// list head for buffer
}BUFFER_POOL,*PBUFFER_POOL;

// packet
typedef struct __tagPacket
{
	LIST_ENTRY											m_ltPacketAnchor;				// list entry
	ULONG												m_ulSig;						// sig
	LONG												m_lRefCount;					// ref count
	ULONG												m_ulFlags;						// flags

	PUCHAR												m_pServiceName;					// service name
	PUCHAR												m_pACName;						// ac name
	PUCHAR												m_pHostUnique;					// host unique
	PUCHAR												m_pACCookie;					// ac cookie
	PUCHAR												m_pRelaySessionId;				// relay session id
	PUCHAR												m_pError;						// error

	USHORT												m_usServiceName;				// xxx len
	USHORT												m_usACName;
	USHORT												m_usHostUnique;
	USHORT												m_usACCookie;
	USHORT												m_usRelaySessionId;
	USHORT												m_usError;

	ULONG												m_ulErrorTag;

	union
	{
		PPPPOE_FRAME									m_pFrame;						// frame buffer
		PUCHAR											m_pucFrame;
		PVOID											m_pRealBuffer;
	};
	union
	{
		PPPP_TAG										m_pFirstTag;					// data buffer
		PUCHAR											m_pucDataBuffer;
		PVOID											m_pBuffer;
	};

	PNDIS_PACKET										m_pNdisPacket;					// ndis packet
	PNDIS_BUFFER										m_pNdisHeaderBuffer;			// ndis header buffer
	PNDIS_BUFFER										m_pNdisDataBuffer;				// ndis data buffer
	PNDIS_BUFFER										m_pNdisReturnBuffer;			// ndis return buffer
	PPACKET_ITEM										m_pPacketItem;					// packet item
	PBIND_CONTEXT										m_pBindContext;					// bind context
	NDIS_STATUS											m_status;						// status

	PPPOE_FRAME											m_ethFrame;						// temp storage
}PACKET,*PPACKET;

typedef struct __tagProtocolReserved
{
	PCHANNEL											m_pChannel;
	PNDIS_PACKET										m_pOrginalPacket;
	PPACKET												m_pPacket;
}PROTOCOL_RESERVED,*PPROTOCOL_RESERVED;

// public
extern "C"
{
	// init pool <= DISPATCH_LEVEL
	NDIS_STATUS InitializePoolSystem();

	// shut down pool <= DISPATCH_LEVEL
	VOID ShutdownPoolSystem();

	// get ndis packet <= DISPATCH_LEVEL
	PNDIS_PACKET GetNdisPacketFromPool(PPACKET_POOL pPacketPool,PPACKET_ITEM *ppItem);

	// get ndis buffer from pool <= DISPATCH_LEVEL
	PPPPOE_FRAME GetNdisBufferFromPool(PBUFFER_POOL pBufferPool,PNDIS_BUFFER *ppHeaderBuffer,PNDIS_BUFFER *ppDataBuffer);

	// reference packet <= DISPATCH_LEVEL
	VOID ReferencePacket(PPACKET pPacket);

	// deref packet <= DISPATCH_LEVEL
	VOID DereferencePacket(PPACKET pPacket);

	// get simple packet <= DISPATCH_LEVEL
	PPACKET GetSimplePacket();

	// clone packet  <= DISPATCH_LEVEL
	PPACKET ClonePacket(PPACKET pPacket);

	// allocate packet <= DISPATCH_LEVEL
	PPACKET AllocPacket();
}

// private
extern "C"
{
	// free buffers to pool
	VOID FreeNdisBufferToPool(PBUFFER_POOL pPool,PVOID pRealBuffer);

	// free packet to pool
	VOID FreeNdisPacketToPool(PPACKET_POOL pPool,PPACKET_ITEM pItem);

	// free packet  <= DISPATCH_LEVEL
	VOID FreePacket(PPACKET pPacket);

	// add packet block to pool  only DISPATCH_LEVEL
	PNDIS_PACKET AddPacketBlockToPool(PPACKET_POOL pPacketPool,PPACKET_ITEM *ppItem);

	// add buffer block to pool only DISPATCH_LEVEL
	PPPPOE_FRAME AddBufferBlockToPool(PBUFFER_POOL pBufferPool,PNDIS_BUFFER *ppHeaderBuffer,PNDIS_BUFFER *ppDataBuffer);

	// free unused packet block only DISPATCH_LEVEL
	VOID FreeUnusedPacketBlock(PPACKET_POOL pPacketPool);

	// free unused packet block only DISPATCH_LEVEL
	VOID FreeUnusedBufferBlock(PBUFFER_POOL pBufferPool);

	// dump packet leak <= DISPATCH_LEVEL
	VOID DumpPoolLeak();
}

// pool
extern PACKET_POOL g_poolPacket;
extern BUFFER_POOL g_poolBuffer;

// ndis buffer pool
extern NDIS_HANDLE g_hNdisBufferPool;

// packet lookaside
extern NPAGED_LOOKASIDE_LIST g_lookasidePacket;

⌨️ 快捷键说明

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