概述
协议栈的本质:
TCP/IP协议栈的实现,本质上就是对数据包的管理。在LwIP中,定义了一个pbuf结构体对数据包进行管理。
pbuf管理数据包的步骤:
1、用户产生要传输的数据
2、用户在内存堆/内存池中申请一个pbuf结构体
3、将数据拷贝到申请的内存中,加上应用层的首部
4、依次加上各层的首部,直至发送出去
pbuf相关特征:
pbuf管理的数据能够在各层去访问,即:每个层访问的数据内存空间是一个空间,而不是每层之间相互独立。
pbuf结构体:
struct pbuf {
struct pbuf *next;
void *payload;
u16_t tot_len;
u16_t len;
u8_t type_internal;
u8_t flags;
LWIP_PBUF_REF_T ref;
u8_t if_idx;
LWIP_PBUF_CUSTOM_DATA
};
next:当一个数据段需要分段来管理时会有多个pbuf,这些pbuf以链表形式进行连接
payload:指向数据区的指针
tot_len:pbuf的总长度,tot_len = len+next->len+....
len:当前pbuf中数据的总长度
type_internal:pbuf的类型,该值定义在pbuf_type枚举类型中
pbuf的类型 | 分配方式 | pbuf内容 |
PBUF_RAM | 内存堆 | pbuf控制头+数据区域 (一般情况下使用) |
PBUF_POOL | 内存池 | pbuf控制头+数据区域 (常用于中断) |
PBUF_ROM | 内存池 | 只有pbuf控制头,数据区域在ROM中 |
PBUF_REF | 内存池 | 只有pbuf控制头,数据区域在RAM中 |
ref:pbuf被引用的次数
pbuf_layer枚举类型:
pbuf_layer规定了pbuf的层次,不同的层次对应了不同的预留的报头空间。
typedef enum {
PBUF_TRANSPORT = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN,
PBUF_IP = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN,
PBUF_LINK = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN,
PBUF_RAW_TX = PBUF_LINK_ENCAPSULATION_HLEN,
PBUF_RAW = 0
} pbuf_layer;
PBUF_TRANSPORT:传输层报头的空闲空间,一般发送数据选择该层次
PBUF_IP:网络层IP头的空闲空间,用作ICMP协议发送
PBUF_LINK:链路层报头(IP分段、ARP数据包)
PBUF_RAW_TX:以太网前附加封装头的空闲空间
PBUF_RAW:原始层,不预留任何空间,即:没有报头,只有数据
相关函数
1、pbuf_alloc
函数功能: