?? cmbuf.h
字號:
//內存管理類 CMBUF_H
#ifndef CMBUF_H
#define CMBUF_H
#include "common.h"
//typedef char caddr_t;
/* 2007-1-11 11:59上午 djl modify*/
#define MCLBYTES 2048 /* 一個mbuf簇(外部緩存)的大小 */
#define MHLEN 100 /* 帶分組首部的mbuf的最大數據量 */
#define MINCLSIZE 208 /* 存儲到簇中的最小數據 */
#define MLEN 108 /* 在正常的mbuf中的最大數據量*/
#define MSIZE 128 /* 每個mbuf的大小*/
#define MRTNTRUE 0
#define MRTNFALSE 1
#define MRTNNULL 0
/*
#define MLEN 108 //普通mbuf的最大數據量
#define MHLEN 100 //帶分組首部mbuf的最大數據量
#define MCLBYTES 2048 //一個簇大小
#define MINCLSIZE 208 //儲存放簇中的最小數據量 實際是208+1
*/
//mbuf 標志位
#define NOMAL 0 //普通
#define PTKDHR 1 //分組普通
#define EXT 2 //普通包含簇
#define PTKDHREXT 3 //分組且包含簇
class mbufs;
//頭部結構
struct m_hdr
{
mbufs *mh_next;
mbufs *mh_nextpkt;
unsigned long mh_len;
caddr_t mh_data; //指向緩沖區開始地址
unsigned short mh_type; //說明mbuf中數據類型
short mh_flags;
};
//分組頭信息
struct pkthdr
{
unsigned long len; //整個分組總長度
struct ifnet *rcvif;
};
//mbuf的擴展影射表 結構
struct m_exts
{
caddr_t extbuf; //指向簇開始地址
void (*ext_free) ();
unsigned long ext_size; //擴展簇的大小
};
class mbufs{
public:
struct m_hdr m_hdr;
union{
struct {
struct pkthdr MH_pkthdr; //分組頭結構
union{
struct m_exts MH_ext;
char MH_databuf[MHLEN];
}MH_dat;
}MH;
char M_databuf[MLEN];
}M_dat;
};
#define m_nexts m_hdr.mh_next
#define m_leng m_hdr.mh_len
#define m_datas m_hdr.mh_data
#define m_types m_hdr.mh_type
#define m_flagss m_hdr.mh_flags
#define m_nextpkts m_hdr.mh_nextpkt
#define act m_nextpkts
#define m_pkthdrs M_dat.MH.MH_pkthdr
#define m_exts M_dat.MH.MH_dat.MH_ext
#define m_pktdat M_dat.MH.MH_dat.MH_databuf
#define m_dat M_dat.M_databuf
//內存管理表
class MemMTable
{
public:
mbufs *m_buf;
MemMTable *next;
};
//簇結構
class ExtBlock
{
public:
char extDat[MCLBYTES];
};
//簇管理表
class ExtTable
{
public:
ExtBlock *extdatptr;
ExtTable *next;
};
class CMemCtrl{
public:
CMemCtrl(unsigned long num,unsigned long extnum);
~CMemCtrl();
public:
mbufs *AllocMbuf(unsigned short type);
bool FreeMbuf(mbufs *usebuf);
ExtBlock *AllocMcl();
bool FreeMcl(ExtBlock *usemcl);
bool AddData(mbufs *mbufs,char *data,int len);
S32 GetData(mbufs *usebuf,char *destbuf,int desbufsize);
mbufs *Linktof(mbufs *destbuf,mbufs *srcbuf);
mbufs *Linktoe(mbufs *destbuf,mbufs *srcbuf);
private:
//空閑mbuf管理表隊列管理
bool PushMemtable(MemMTable *memtable);
MemMTable *PopMemtable();
//空閑簇表隊列管理
bool PushExttable(ExtTable *exttable);
ExtTable *PopExttable();
private:
mbufs *m_bufptr; //mbuf隊列首址
MemMTable *bufptr; //mbuf鏈表隊列首指針
MemMTable *bufHeadptr; //mbuf鏈首指針(使用中)
MemMTable *bufEndptr; //mbuf鏈尾指針(使用中)
MemMTable *freeHeadptr; //mbuf鏈表首指針(空閑)
MemMTable *freeEndptr; //mbuf鏈表尾指針(空閑)
SEM_ID mbufQueSemmutex; //空閑mbuf管理鏈表信號量
SEM_ID freemtQueSemmutex; //空閑mbuf管理表鏈表信號量
ExtBlock *extdatptr; //簇隊列首地址
ExtTable *exttableptr; //簇管理表隊列首地址
ExtTable *m_extbufhptr; //簇管理表首指針
ExtTable *m_extbufeptr; //簇管理表尾指針
ExtTable *m_extfreehptr; //空閑簇管理表首指針
ExtTable *m_extfreeeptr; //空閑簇管理表尾指針
SEM_ID extQueSemmutex; //空閑mbuf管理鏈表信號量
SEM_ID freeextmtQueSemmutex; //空閑mbuf管理表鏈表信號量
};
//mbuf鏈表隊列類
class CMbufLink
{
public:
CMbufLink(){
head=0;
end=0;
}
~ CMbufLink(){}
public:
bool PushLink(mbufs *mbuf)
{
if(!mbuf)
{
printf("CMbufLink PushLink error 輸入地址為空 \n");
return MRTNFALSE;
}
if(!end && head == end)
{
end=mbuf;
head=end;
}
else
{
end->m_nextpkts=mbuf;
end=end->m_nextpkts;
}
return MRTNTRUE;
}
mbufs *PopLink()
{
if(!head)
{
return 0;
}
poptempbuf=head;
if(head == end)
{
head=0;
end=0;
}
else
{
head=head->m_nextpkts;
}
return poptempbuf;
}
private:
mbufs *head;
mbufs *end;
mbufs *poptempbuf;
};
extern CMemCtrl *Cmbuf;
#endif//CMBUF_H
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -