📄 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -