TCP-IP詳解 卷2:實現之mbuf存儲器緩存

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 的取值有五種



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章