数据包pbuf

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;

};

3pbuf类型:

//pbuf.h

typedef enum

{ PBUF_RAM,  //内存堆分配

  PBUF_ROM,  //内存池分配

  PBUF_REF,   //内存池分配

  PBUF_POOL //内存池分配

}pbuf_type;

1PBUF_RAM内存申请:

          struct pbuf *p

          p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length));

          分配空间:SIZEOF_STRUCT_PBUFpbuf结构头大小。offset:数据的包头(TCP包头,IP包头等)。length:数据存储空间大小。

2PBUF_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")

3PBUF_ROM内存申请:

             p = memp_malloc(MEMP_PBUF);  //在内存池中分配一个相应的pbuf结构头,而不申请数据区的空间(上面红色0)。

            PBUF_ROM指向POM空间内的某段数据。

4  PBUF_REF内存申请:

             p = memp_malloc(MEMP_PBUF);  //在内存池中分配一个相应的pbuf结构头,而不申请数据区的空间(上面红色0)。

             PBUF_REF指向RAM空间内的某段数据。

4pbuf的层次:

// pbuf.h

typedef enum {
  PBUF_TRANSPORT,
  PBUF_IP,
  PBUF_LINK,
  PBUF_RAW
} pbuf_layer;

5pbuf的处理函数

//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( );

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值