mbuf的種類:
mbuf,全稱爲"memory buffer",主要用於保存進程和網絡接口間互相傳遞的用戶數據,也用於保存源與目標地址,插口選項等。
mbuf 依據m_flags中填寫的不同標誌M_PKTHDR和M_EXT而不同。mbuf主要有四種:
1):m_flags 爲 0 ,mbuf只包含數據。mbuf中有108字節的數據空間,指針m_data指向108字節緩存的某一位置。
2):m_flags 爲 M_PKTHDR,這表示一個分組首部,描述一個分組數據的第一個mbuf。
3):這種mbuf不包含分組首部(沒有設置K_PKTHDR),但包含超過208字節的數據,這時用到了一個外部緩存cluster(需要設置M_EXT)
4):最後一個包含一個分組首部,包含超過208字節的數據
這四種mbuf的區別如下圖所示:
mbuf的結構:
/* mbuf的頭部信息 */
struct m_hdr {
struct mbuf *mh_next; /* 指向鏈中下一個mbuf的指針 */
struct mbuf *mh_nextpkt; /* 指向下一個鏈的指針 */
int mh_len; /* mbuf中數據的長度(不包括頭部) */
char *mh_data; /* 指向數據區的指針 */
short mh_type; /* mbuf的數據類型,如MT_DATA*/
short mh_flags; /* mbuf標識,具體定義見下 */
};
/* mbuf標識*/
#define M_EXT 0x0001 /* has associated external storage */
#define M_PKTHDR 0x0002 /* start of record */
#define M_EOR 0x0004 /* end of record */
struct pkthdr {
int len; /* 整個mbuf鏈表包含數據的總長度,在鏈表的第一個mbuf中維護一個帶有總長度的分組首部的原因是,當需要總長度時可以避免查看所有mbuf中的mh_len來求和*/
struct ifnet *rcvif; /* 指向接收分組的接收接口結構的指針*/
};
struct m_ext{
caddr_t ext_buf; // start of buffer
void (*ext_free)(); //free routine if not the usual
u_int ext_size;
};
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;
};
關於m_flags 的取值,前面我們已經議論了M_EXT 和M_PKTHDR.這裏m_flags 的取值有五種