1、协议栈中移动的数据包,种类大小五花八门。
1)从网卡上来的原始数据包,有上千字节的TCP数据包/几字节的ICMP包。
2)上层应用可将自己发送的各异数据包递交给LWIP协议栈。
LWIP必须有一个高效的数据包管理核心:1)兼容各类数据,
2)避免各层复制。
2、数据包pbuf小小结构体:
//pbuf.h
struct pbuf
{
struct pbuf *next;
void *payload;
u16_t tot_len;
u16_t len;
u8_t type;
u8_t flags;
u16_t ref;
};
3、pbuf类型:
//pbuf.h
typedef enum
{ PBUF_RAM, //内存堆分配
PBUF_ROM, //内存池分配
PBUF_REF, //内存池分配
PBUF_POOL //内存池分配
}pbuf_type;
(1)PBUF_RAM内存申请:
struct pbuf *p;
p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length));
分配空间:SIZEOF_STRUCT_PBUF:pbuf结构头大小。offset:数据的包头(TCP包头,IP包头等)。length:数据存储空间大小。
(2)PBUF_POOL内存申请:
q = memp_malloc(MEMP_PBUF_POOL);
其中memp_malloc()中参数为memp_t类型。
对于POOL类型:MEMP_PBUF_POOL属于POOL三大类型中的PBUF_MEMPOOL类型,细节分类如下:
LWIP_PBUF_MEMPOOL(PBUF, MEMP_NUM_PBUF, 0, "PBUF_REF/ROM")
LWIP_PBUF_MEMPOOL(PBUF_POOL, PBUF_POOL_SIZE, PBUF_POOL_BUFSIZE, "PBUF_POOL")
(3)PBUF_ROM内存申请:
p = memp_malloc(MEMP_PBUF); //在内存池中分配一个相应的pbuf结构头,而不申请数据区的空间(上面红色0)。
PBUF_ROM指向POM空间内的某段数据。
(4) PBUF_REF内存申请:
p = memp_malloc(MEMP_PBUF); //在内存池中分配一个相应的pbuf结构头,而不申请数据区的空间(上面红色0)。
PBUF_REF指向RAM空间内的某段数据。
4、pbuf的层次:
// pbuf.h
typedef enum {
PBUF_TRANSPORT,
PBUF_IP,
PBUF_LINK,
PBUF_RAW
} pbuf_layer;
5、pbuf的处理函数
//pbuf.h中定义,pbuf.c中实现
struct pbuf *pbuf_alloc( );
void pbuf_realloc( );
u8_t pbuf_header( );
void pbuf_ref( );
void pbuf_ref_chain( );
u8_t pbuf_free( );
u8_t pbuf_clen( );
void pbuf_cat( );
void pbuf_chain( );
struct pbuf *pbuf_dechain( );
err_t pbuf_copy( );
u16_t pbuf_copy_partial( );