关闭

lwip包缓冲区pbufs

标签: lwippbuf数据缓冲区pbuf类型
1618人阅读 评论(0) 收藏 举报
分类:
lwip信息包是存储在pbufs中,pbufs作为lwip的数据缓冲区,是由pbuf结构组成的链表。数据存在pbufs链中各个pbuf节点所指向存储块中。

pbuf结构体的定义如下:
struct pbuf {
  struct pbuf *next;   //pbuf链中下一个pbuf的地址

  void *payload; //指向该pbuf的数据存储区的首地址

  u16_t tot_len;//   当前 pbuf 和其后所有 pbuf的有效数据的长度

  u16_t len; // 当前pbuf中的有效数据长度

  u8_t /*pbuf_type*/ type;  pbuf的类型

  u8_t flags; //  标志位

  u16_t ref;// ref 字段表示该 pbuf 被引用的次数。该结构体每被引用一次,ref的值加1,当解除引用是,ref减1。只有当ref的值为0的时候,该结构体才能被删除成功,否则删除失败。
};

pbuf中的type成员表示pbuf的类型
pbuf一共有四种类型
在pbuf.h中的类型包含在pbuf_type枚举中。如下
typedef enum {
  PBUF_RAM, /* pbuf data is stored in RAM */
  PBUF_ROM, /* pbuf data is stored in ROM */
  PBUF_REF, /* pbuf comes from the pbuf pool */
  PBUF_POOL /* pbuf payload refers to RAM */
} pbuf_type;

1:PBUF_RAM类型的pbuf是通过内存堆分配得到的。在申请PBUF_RAM类型时,内存堆中分配相应的大小地址连续的内存块,其容量能够存储pbuf结构体+数据缓冲区。数据缓冲区可能包括数据包头+数据也可以没有数据包头,具体看申请的方式。如图所示:

2: PBUF_POOL 类型的它由分配自固定大小的 pbufs 池里的固定大小的 pbufs 组成。其他的跟PBUF_RAM很相似,其结构体+数据缓冲区也是存在于连续的内存块中。如图:一个来自于 pbuf 池中的被链接的 PBUF_POOL pbuf,这些节点的大小都是大小都是一样大的:


3:PBUF_ROM类型的pbuf是从内存堆中分配申请一个相应的结构头,并不会申请数据区的空间。其数据空间不跟结构头在一块连续的空间上,数据空间有在ROM上,有结构头中的payload指针成员指向该空间。包含有数据 包头的数据不能存储在该类型的pbuf上。

4:PBUF_REF和PBUF_ROM 类型的 pbuf 基本相同,但是数据空间在RAM上。

PBUF_REF和PBUF_ROM的结构如图所示

数据包pbufs链表可以由以上四种pbuf结构中的任意类型混合组成。

pbuf的申请
pbuf的申请函数struct pbuf *  pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
其中layer跟报文的所在协议的层有关系,不同的协议层的数据包头不一样,链表第一个节点的在数据缓冲区的包头大小也不一样。
与pbuf相关的layer有四种,PBUF_TRANSPORT(传输层), PBUF_IP(ip层),PBUF_LINK(链路层),PBUF_RAW(RAW类型)
例如,若是传输层pbuf,其报文包头占的大小为链路层报文的头部+ip头部+传输层的头部。
case PBUF_TRANSPORT:
 offset = PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;
 break;
若是ip层pbuf,offset = PBUF_LINK_HLEN + PBUF_IP_HLEN;

当申请的pbuf类型为PBUF_POOL时,先想pbuf内存池申请一块内存。
p = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);
第一块的内存块的数据存储区的首地址需要跳过数据包头的长度,即offset
p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)))
若是一块的容量不够,则继续申请第二块,还不够继续申请。这些从内存申请到的内存块,组成链表。并且返回首块的地址。

当申请的pbuf类型为PBUF_RAM时,调用mem_malloc,直接向堆栈的申请。
p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length));
当为PBUF_ROM和PBUF_REF,调用mem_malloc,直接向堆栈的申请不含数据区pbuf结构大小的内存块。

pbuf的释放
pbuf的释放由函数void  pbuf_realloc(struct pbuf *p, u16_t new_len)实现
在释放pbuf的时候,若成员pbuf结构体成员ref为0 的时候(被引用数),才能进行释放。
若第一个节点不能被释放,那么链表后面的节点的ref也至少为1。不可能被释放。只有第一个节点被释放后,后面的节点才有可能被依此释放。
























0
0
查看评论

lwIP协议栈的pbuf结构体

pbuf结构体位于src/include/lwip/pbuf.h中以太网中断收到的数据就先存放到这个结构体组成的数据链中,然后将它交付给上层协议.这个结构体可以说是无处不在.struct pbuf { /** next pbuf in singly linked pbuf
  • zhzht19861011
  • zhzht19861011
  • 2011-07-07 20:01
  • 7263

Lwip pbuf分析

在BSD中用mbuf结构体来管理网络上来的各种数据包,同样lwip中也有一个类似的结构体pbuf用来管理数据包。Pbuf结构体定义如下: struct pbuf {           struct...
  • weijitao
  • weijitao
  • 2016-12-06 21:53
  • 1350

LWIP使用经验

LWIP使用经验 介绍了LWIP的工作原理,移植到RTOS,重点讲解了TCP知识,总结了使用LWIP的经验,最后给出常见问题与解答。
  • jiangjunjie_2005
  • jiangjunjie_2005
  • 2014-05-17 11:46
  • 38484

LwIP协议栈学习--内存管理

源码 case PBUF_POOL: p = memp_malloc(MEMP_PBUF_POOL); case PBUF_RAM: p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) +...
  • zyboy2000
  • zyboy2000
  • 2009-06-22 10:23
  • 7226

STM32F4板子使用LWIP进行组播收发数据的完整过程,附代码

本文详细介绍了在STM32F4板卡,使用DP83848网卡,使用LWIP协议实现组播接收和发送的完整方法。并源代码。
  • xueyushenzhou
  • xueyushenzhou
  • 2016-05-12 10:35
  • 5057

lwip之数据收发流程

lwip从逻辑上看也是分为4层:链路层、网络层(IP、ARP、(ICMP、IGMP这两个协议是网络层的补充协议,并不严格属于网络层))、传输层(TCP、UDP)、应用层,基本等同TCP/IP,只是各层之间可以进行交叉存取,没有严格划分。 协议汇总:     1. A...
  • banruoju
  • banruoju
  • 2017-01-11 09:43
  • 5418

LWIP接收例程

以太网是TI公司9b96这款芯片特色外设,或者说之所以选择9b96这款芯片,就是要用它的以太网。但是开发板给的光盘中有关以太网的例子,如enet_lwip,初学者搞不清楚这个目录中的这些文件是干什么的,这些文件都需要吗? 大家可以看出enet_lwip例子文件结构比较混乱,不知道哪些是我们...
  • lgupen
  • lgupen
  • 2015-07-31 08:36
  • 1501

lwip中pbuf_alloc()内存申请函数

1. PBUF_RAM一次性分配size大小的连续内存 2. RBUF_ROM只需要分配小小的管理pbuf的控制管理内存 3. PBUF_ROOL分配一个链表,链表上每个元素所管理的内存最大不超过PBUF_POOL_BUFSIZE,它更像linux    中的kmem_al...
  • bytxl
  • bytxl
  • 2015-12-15 18:58
  • 958

lwIP协议栈的pbuf结构体

pbuf结构体位于src/include/lwip/pbuf.h中 以太网中断收到的数据就先存放到这个结构体组成的数据链中,然后将它交付给上层协议. 这个结构体可以说是无处不在. struct pbuf { /** next pbuf in singly linked
  • ypist
  • ypist
  • 2011-09-10 16:54
  • 4969

lwip之数据包管理

数据包结构 /***************************************************************************************************************** struct pbuf {   ...
  • banruoju
  • banruoju
  • 2017-01-05 10:11
  • 858
    个人资料
    • 访问:77889次
    • 积分:1275
    • 等级:
    • 排名:千里之外
    • 原创:49篇
    • 转载:4篇
    • 译文:0篇
    • 评论:1条
    文章分类