先看一下数据包结构体pbuf
/* pbuf结构体 */
struct pbuf {
struct pbuf *next; //用于将pbuf连接成链表
void *payload; //数据指针
u16_t tot_len; //当前以及后续所有pbuf包含的数据总长度
u16_t len; //当前pbuf的数据长度
u8_t type; //pbuf类型
u8_t flags; //状态位
u16_t ref; //pbuf被引用的次数
};
pbuf中有个成员type,表示pbuf的类型。pbuf共有四种类型PBUF_REF、PBUF_ROM、PBUF_POOL和PBUF_RAM。
/* pbuf类型 */
typedef enum {
PBUF_RAM, /* pbuf和数据来自连续的内存堆 */
PBUF_ROM, /* pbuf来自内存池MEMP_PBUF,数据来自ROM */
PBUF_REF, /* pbuf来自内存池MEMP_PBUF,数据来自RAM */
PBUF_POOL /* pbuf和数据来自一个或多个内存池MEMP_PBUF_POOL */
} pbuf_type;
再看一下pbuf_layer,表示层类型,上层数据包需要为下层预留足够空间用来填充头部
/* pbuf分层类型 */
typedef enum {
PBUF_TRANSPORT, //传输层
PBUF_IP, //网络层
PBUF_LINK, //链路层
PBUF_RAW //原始层
} pbuf_layer;
下面看一下申请pbuf