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

📄 cmbuf.h

📁 可以用于vxworks的mbuf的自己设计的实现方式
💻 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 + -