设为首页 加入收藏

TOP

TCP/IP详解2 学习笔记---mbuf(一)
2014-11-23 17:31:52 】 浏览:1409
Tags:TCP/IP 详解 学习 笔记 --- mbuf

1,mbuf就是存储要发送数据的memery buf,类似于skb_buf.不过结构比较简单。


/* header at beginning of each mbuf: */


这个结构用来描述mbuf跟具体的内容无关


struct m_hdr {


struct mbuf *mh_next; /* next buffer in chain */


struct mbuf *mh_nextpkt; /* next chain in queue/record */


int mh_len; /* amount of data in this mbuf */


caddr_t mh_data; /* location of data */


short mh_type; /* type of data in this mbuf */


short mh_flags; /* flags; see below */


};




/* record/packet header in first mbuf of chain; valid if M_PKTHDR set */


对mbuf中数据的描述,len和接收接口


struct pkthdr {


int len; /* total packet length */


struct ifnet *rcvif; /* rcv interface */


};




/* description of external storage mapped into mbuf, valid if M_EXT set */


struct m_ext {


caddr_t ext_buf; /* start of buffer */


void (*ext_free)(); /* free routine if not the usual */


u_int ext_size; /* size of buffer, for ext_free */


};


这个就是mbuf的描述,设计的比较巧妙


struct mbuf {


struct m_hdr m_hdr;


union {


struct {


struct pkthdr MH_pkthdr; /* M_PKTHDR set */


union {


struct m_ext MH_ext; /* M_EXT set */


char MH_databuf[MHLEN];


} MH_dat;


} MH;


char M_databuf[MLEN]; /* !M_PKTHDR, !M_EXT */


} M_dat;


};




2,mbuf中mhdr.md_flags:



/* mbuf flags */


一个mbuf的大小是128字节,猜测是一个cacheline的大小。如果数据比较多,就需要多个mbuf连起来或者用一个叫cluster的东西来存储数据。M_EXT就是这个标志


#define M_EXT 0x0001 /* has associated external storage */


表明分组的第一个mbuf,在数据区中有pkthdr


#define M_PKTHDR 0x0002 /* start of record */


表明记录的尾部,TCP是一个字节流,不设置这个标志


#define M_EOR 0x0004 /* end of record */




/* mbuf pkthdr flags, also in m_flags */


#define M_BCAST 0x0100 /* send/received as link-level broadcast */


#define M_MCAST 0x0200 /* send/received as link-level multicast */




/* flags copied when copying m_pkthdr */


这个具体干嘛用的不懂。。。


#define M_COPYFLAGS (M_PKTHDR|M_EOR|M_BCAST|M_MCAST)




3,mbuf的种类




/* mbuf types */


#define MT_FREE 0 /* should be on free list */


#define MT_DATA 1 /* dynamic (data) allocation */ 数据就是这个类型


#define MT_HEADER 2 /* packet header */


#define MT_SOCKET 3 /* socket structure */


#define MT_PCB 4 /* protocol control block */


#define MT_RTABLE 5 /* routing tables */


#define MT_HTABLE 6 /* IMP host tables */


#define MT_ATABLE 7 /* address resolution tables */


#define MT_SONAME 8 /* socket name */


#define MT_SOOPTS 10 /* socket options */


#define MT_FTABLE 11 /* fragment reassembly header */


#define MT_RIGHTS 12 /* access rights */


#define MT_IFADDR 13 /* interface address */


#define MT_CONTROL 14 /* extra-data protocol message */


#define MT_OOBDATA 15 /* expedited data */




4,mbuf相关函数




4.1mbuf的分配



/*


* mbuf allocation/deallocation macros:


*


* MGET(struct mbuf *m, int how, int type)


* allocates an mbuf and initializes it to contain internal data.


*


* MGETHDR(struct mbuf *m, int how, int type)


* allocates an mbuf and initializes it to contain a packet header


* and internal data.


*/


#define MGET(m, how, type) { \


mbtypes[type]把mbuf的type转换成MALLOC需要的type,如M_MBUF,M_SOCKET等


MALLOC((m), struct mbuf *, MSIZE, mbtypes[type], (how)); \


if (m) { \


(m)->m_type = (type); \


MBUFLOCK改变处理器优先级,防止被网络处理器中断,共享资源的保护


MBUFLOCK(mbstat.m_mtypes[type]++;) \


(m)->m_next = (struct mbuf *)NULL; \


(m)->m_nextpkt = (struct mbuf *)NULL; \


#define m_dat M_dat.M_databuf 为pkthdr和m_ext预留了空间


(m)->m_data = (m)->m_dat; \


(m)->m_flags = 0; \


} else \


尝试重新分配,一个主要的问题,分配的内存从哪里来?详见后面


(m) = m_retry((how), (type)); \


}




/*


* When MGET failes, ask protocols to free space when short of memory,


* then re

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇TCP/IP详解2 学习笔记2---ifne.. 下一篇Linux下的多线程编程

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目