LWIP的数据包管理

1、数据包结构-pbuf

1.1、pbuf结构

  LWIP是TCP/IP协议栈的一种具体实现,本质就是对数据包的处理,在LWIP中使用一个被称为pbuf的结构管理数据包,LWIP源码中的pbuf.c和pbuf.h这两个文件就是关于pbuf的,pbuf结构如下:
在pbuf.h文件中

1.2、tot_len

说一下tot_len的讲解

大家最好理解一下英文注释

1.3、type

从这里可是使用编译器跳过去

也就是pbuf_type的类型有

分别讲一下这四种类型

1.3.1、PBUF_RAM

      PBUF_RAM类型的pbuf空间是从LWIP的内存堆中申请得到的,协议栈和应用程序中的待发送数据就是采用的这种方法,pbuf的申请是在pbuf_alloc()中进行的

mem_malloc()函数,知道是从内存堆里申请的内存
申请的大小是:pbuf的大小 + 实际申请的大小
offset是一个偏移,这个offset里面用来存储一些首部字段,如TCP报文首部,IP首部等等。
最终申请出来的PBUF_RAM类型的pbuf结构是
下图
1部分的就是pbuf结构部分
2部分是offset部分

1.3.2、PBUF_POOL  

      PBUF_POOL类型的pbuf空间是从LWIP的内存池中申请得到的,因为是从内存池中申请的,所以这种类型的pbuf分配时间极短,在网卡接收数据包时,我们使用这种方式:
在pbuf.c文件中pbuf_alloc函数

既然PBUF_POOL类型是在内存池中申请的,那么就必须得有对应的POOL类型,在LWIP初始化的时候就会自动的两类与pbuf相关的POOL:MEMP_PBUF和MEMP_PBUF_POOL(在memp_std.h中),其中MEMP_PBUF是用于PBUF_REF和PBUF_ROM这两类的,MEMP_PBUF_POOL是用于PBUF_POOL类型的。
    事实上应用程序发送和接收的数据量可能很大,但是内存池类型的内存分配每次分配到的大小是固定的,因此可能会需要进行多次分配,最终的分配成功的PBUF_POOL类型的pbuf如下图:

1.3.3、PBUF_ROM和PBUF_REF

      PBUF_ROM和PBUF_REF类型的pbuf空间也是从LWIP的内存池中申请得到的,分配方法都一样的,他们使用内存池MEMP_PBUF,这两种类型申请的是指pbuf结构体的内存空间,并不包含数据空间,分配过程如下:

PBUF_ROM和PBUF_REF并没有给数据空间申请内存,那么他们的数据空间在哪里呢?这两个的数据空间可以应用其他地方的内存,不同之处在于PBUF_ROM的数据空间在ROM中,PBUF_REF的数据空间在RAM中。这两种类型的pbuf最终如下:

1.3.4、多种类型pbuf混合使用

实际的数据包可能会同时使用多种类型的pbuf,如下图:

2、数据包申请和释放

      pbuf的申请和释放通过函数pbuf_alloc()和pbuf_free()来完成,pbuf_alloc()函数和pbuf_free()函数原型如下:
pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)
pbuf_free(struct pbuf *p)
      pbuf_alloc()函数有两个重要的参数:layer和type,layer决定是协议栈的哪一层申请的,type决定申请的pbuf类型,layer决定了pbuf中的offset,也就是pbuf数据区中卫协议预留的首部空间,pbuf.h文件定义了一个枚举类型pbuf_layer来描述LWIP中的层,如下:
typedef enum {
  PBUF_TRANSPORT,
  PBUF_IP,
  PBUF_LINK,
  PBUF_RAW
} pbuf_layer;

点击查看本文所在的专辑,STM32F207网络开发

关注公众号,第一时间收到文章更新

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

strongercjd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值