www.pudn.com > PPPOE.rar > packet.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;