LWIP之 pbuf.c 文件学习
LWIP之 pbuf.c 文件学习
Pbuf 数据结构
各字段说明:
next 字段指针指向下一个 pbuf 结构,因为实际发送或接收的数据包可能很大,而每个 pbuf 能够管理的数据可能很少,所以,往往需要多个 pbuf 结构才能完全描述一个数据包。所以,所有的描述同一个数据包的 pbuf 结构需要链在一个链表上,这一点用
是数据指针,指向该 pbuf 管理的数据的起始地址,这里,数据的起始地址可以是紧跟在 pbuf 结构之后的 RAM,也可能是在 ROM上的某个地址,而决定这点的是当前 pbuf 是什么类型的,即
len 字段表示当前
tot_len 表示当前 pbuf 和其后所有 pbuf的有效数据的长度。显然, tot_len 字段是 len 字段与 pbuf 链中随后一个 pbuf 的 tot_len 字段的和;pbuf 链中第一个 pbuf 的 tot_len 字段表示整个数据包的长度,而最后一个 pbuf 的 tot_len字段必和 len 字段相等。
type 字段表示 pbuf 的类型,主要有四种类型: PBUF_RAM、 PBUF_ROM、 PBUF_REF和
字段也表示
示该 pbuf 被引用的次数。初始化一个 pbuf 的时候, ref 字段值被设置为 1,当有其他 pbuf 的 next 指针指向该 pbuf 时,该 pbuf 的 ref 字段值加一。所以,要删除一个 pbuf 时,ref 的值必须为
详细原理见原著:
《 Design and Implementation of the LWIP:
剩余函数
void pbuf_realloc(struct pbuf *p, u16_t size);
u8_t pbuf_header(struct pbuf *p, s16_t header_size);
void pbuf_ref(struct pbuf *p);
u8_t pbuf_free(struct pbuf *p);
u8_t pbuf_clen(struct pbuf *p);
等,见:
《嵌入式网络那些事-LwIP协议深度剖析与实战演练》,第7章有比较清楚的解释pbuf数据包各函数的使用。
《LwIP协议栈源码详解》。