E1000
看不懂洋文看不懂洋文啊啊啊
transimit descriptor ring structure
若干 transimit descripor 组成一个环状结构,由两个寄存器标记头和尾(TDH 和 TDT)。
HEAD 和 TAIL 之间是由硬件控制的 descriptor。新的需要传递的网络包写到 TAIL 指向的 descriptor,网卡硬件从 HEAD 指向的 descriptor 开始传输网络包,直到 HEAD 与 TAIL 之间没有其他内容。
DD 标志可以判断传输是否完成来避免软件影响被硬件控制的 descriptor,从而防止 race condition
receive descriptor 也类似。
mbuf structure
// The above functions manipulate the size and position of the buffer:
// <- push <- trim
// -> pull -> put
// [-headroom-][------buffer------][-tailroom-]
// |----------------MBUF_SIZE-----------------|
//
// These marcos automatically typecast and determine the size of header structs.
// In most situations you should use these instead of the raw ops above.
#define mbufpullhdr(mbuf, hdr) (typeof(hdr)*)mbufpull(mbuf, sizeof(hdr))
#define mbufpushhdr(mbuf, hdr) (typeof(hdr)*)mbufpush(mbuf, sizeof(hdr))
#define mbufputhdr(mbuf, hdr) (typeof(hdr)*)mbufput(mbuf, sizeof(hdr))
#define mbuftrimhdr(mbuf, hdr) (typeof(hdr)*)mbuftrim(mbuf, sizeof(hdr))
MBUF 有小部分就是中间的 buffer,前后预留了一些空间 headroom 和 tailrom 以便之后调整大小。如果需要在buffer 的头部增加一些东西就 push,如果在尾部增加东西就 put,如果从头部取出东西就 pull 等等。