5.2.2. lbuf

lbuf,又名链表 buf,以链式模型对数据包的输入和输出作缓冲管理,具有如下特性:

  • 以链表的方式对读取和写入的数据进行管理;

  • 数据先进先出;

  • 在多次读写之后可能会产生碎片;

  • 适合用于以数据包为单位读写的应用。

5.2.2.1. lbuf_init

  • 函数原型:

    struct lbuff_head *lbuf_init(void *buf, u32 len, int align, int priv_head_len);
    
  • 功能说明:在使用 lbuf 前进行初始化

  • 参数说明:

    参数

    说明

    buf

    需要管理的 buf 地址

    len

    需要管理的 buf 空间大小

    align

    每次读写数据对齐单位,byte

    priv_head_len

    如果每次读写数据的数据具有 packet_header + data 结构, 传入 packet_header 数据结构长度大小, 如果没有 packet_header 配置为 0 即可

  • 返回值:

    struct lbuff_head *

    初始化后的 lbuf 句柄

  • 示例:

    1int lbuf[512] = {0};
    2struct lbuff_head *lbuf_hdl = NULL;
    3void lbuf_user_demo()
    4{
    5    lbuf_hdl = lbuf_init(lbuf, sizeof(lbuf), 4, 0);
    6}
    

5.2.2.2. lbuf_alloc

  • 函数原型:

    void *lbuf_alloc(struct lbuff_head *head, u32 len)
    
  • 功能说明:从 lbuf 中申请写入空间

  • 参数说明:

    参数

    说明

    head

    用于管理 lbuf 的句柄

    len

    需要申请写入空间的长度

  • 返回值:

    void *

    申请到 buf 的地址

  • 示例:

     1int lbuf[512] = {0};
     2struct lbuff_head *lbuf_hdl = NULL;
     3void lbuf_user_demo()
     4{
     5    u32 ret = 0;
     6    u8 *wptr = NULL;
     7    u8 *rptr = NULL;
     8    lbuf_hdl = lbuf_init(lbuf, sizeof(lbuf), 4, 0);
     9    wptr = lbuf_alloc(lbuf_hdl, 100);
    10}
    

5.2.2.3. lbuf_realloc

  • 函数原型:

    void *lbuf_realloc(void *lbuf, int size)
    
  • 功能说明:在已申请空间(lbuf_alloc)之后, 重新申请空间大小

  • 参数说明:

    参数

    说明

    lbuf

    在 lbuf_alloc 申请得到的 buf 指针

    size

    重新申请空间的长度

  • 返回值:

    成功

    申请到 buf 的地址

    失败

    NULL

  • 示例:

     1int lbuf[512] = {0};
     2struct lbuff_head *lbuf_hdl = NULL;
     3void lbuf_user_demo()
     4{
     5    u32 ret = 0;
     6    u8 *wptr = NULL;
     7    u8 *rptr = NULL;
     8    lbuf_hdl = lbuf_init(lbuf, sizeof(lbuf), 4, 0);
     9    wptr = lbuf_alloc(lbuf_hdl, 100);
    10    wptr = lbuf_realloc(wptr, 200);
    11}
    

5.2.2.4. lbuf_empty

  • 函数原型:

    int lbuf_empty(struct lbuff_head *head);
    
  • 功能说明:查询 lbuf 数据是否为空

  • 参数说明:

    参数

    说明

    head

    用于管理 lbuf 的句柄

  • 返回值:

    0

    lbuf 不为空

    1

    lbuf 为空, 无数据

  • 示例:

     1int lbuf[512] = {0};
     2struct lbuff_head *lbuf_hdl = NULL;
     3void lbuf_user_demo()
     4{
     5    u32 ret = 0;
     6    lbuf_hdl = lbuf_init(lbuf, sizeof(lbuf), 4, 0);
     7    ret = lbuf_empty(lbuf_hdl);
     8    if (ret == 1) {
     9        printf("lbuf empty");
    10    } else {
    11        printf("lbuf have data");
    12    }
    13}
    

5.2.2.5. lbuf_push

  • 函数原型:

    void lbuf_push(void *lbuf, u8 channel_map)
    
  • 功能说明:写入 lbuf 数据

  • 参数说明:

    参数

    说明

    lbuf

    在 lbuf_alloc 申请得到的 buf 指针

    channel_map

    标记使用者个数, 同支持 8 个通道, BIT(0)~BIT(7),如果使用者个数为 3, 设置为 BIT(0) | BIT(1)BIT(2), 只有当所有使用者 lbuf_pop之后, 该 buff 才释放。

  • 返回值:无

  • 示例:

     1int lbuf[512] = {0};
     2struct lbuff_head *lbuf_hdl = NULL;
     3void lbuf_user_demo()
     4{
     5    u32 ret = 0;
     6    u8 *wptr = NULL;
     7    lbuf_hdl = lbuf_init(lbuf, sizeof(lbuf), 4, 0);
     8    wptr = lbuf_alloc(lbuf_hdl, 100);
     9    //写入数据
    10    memset(wptr, 0x5A, 100);
    11    lbuf_push(wptr, BIT(0)); //channel_map, 使用者为 1 个
    12}
    

5.2.2.6. lbuf_pop

  • 函数原型:

    void *lbuf_pop(struct lbuff_head *head, u8 channel)
    
  • 功能说明:从 lbuf 中读取数据

  • 参数说明:

    参数

    说明

    head

    用于管理 lbuf 的句柄

    channel

    需要读取的通道索引, 比如读取通道 0 的数据, 配置为BIT(0)

  • 返回值:

    参数

    说明

    成功

    返回 buf 地址

    失败

    NULL

  • 示例:

     1int lbuf[512] = {0};
     2struct lbuff_head *lbuf_hdl = NULL;
     3void lbuf_user_demo()
     4{
     5    u32 ret = 0;
     6    u8 *wptr = NULL;
     7    u8 *rptr = NULL;
     8    lbuf_hdl = lbuf_init(lbuf, sizeof(lbuf), 4, 0);
     9    wptr = lbuf_alloc(lbuf_hdl, 100);
    10    //写入数据
    11    memset(wptr, 0x5A, 100);
    12    lbuf_push(wptr, BIT(0));
    13    rptr = lbuf_pop(lbuf_hdl, BIT(0));
    14}
    

5.2.2.7. lbuf_free

  • 函数原型:

    int lbuf_free(void *lbuf)
    
  • 功能说明:释放指定 buf

  • 参数说明:

    参数

    说明

    lbuf

    在 lbuf_alloc 申请得到的 buf 指针

  • 返回值:

    参数

    说明

    0

    释放失败

    1

    释放成功

  • 示例:

     1int lbuf[512] = {0};
     2struct lbuff_head *lbuf_hdl = NULL;
     3void lbuf_user_demo()
     4{
     5    u32 ret = 0;
     6    u8 *wptr = NULL;
     7    u8 *rptr = NULL;
     8    lbuf_hdl = lbuf_init(lbuf, sizeof(lbuf), 4, 0);
     9    wptr = lbuf_alloc(lbuf_hdl, 100);
    10    //写入数据
    11    memset(wptr, 0x5A, 100);
    12    lbuf_push(wptr, BIT(0));
    13    rptr = lbuf_pop(lbuf_hdl, BIT(0));
    14    lbuf_free(wptr); //释放 buf
    15}
    

5.2.2.8. lbuf_free_space

  • 函数原型:

    u32 lbuf_free_space(struct lbuff_head *head)
    
  • 功能说明:查询 lbuf 剩余空间

  • 参数说明:

    参数

    说明

    head

    用于管理 lbuf 的句柄

  • 返回值:

    参数

    说明

    u32

    输出 lbuf 剩余空间大小

  • 示例:

     1int lbuf[512] = {0};
     2struct lbuff_head *lbuf_hdl = NULL;
     3void lbuf_user_demo()
     4{
     5    u32 ret = 0;
     6    u8 *wptr = NULL;
     7    u8 *rptr = NULL;
     8    lbuf_hdl = lbuf_init(lbuf, sizeof(lbuf), 4, 0);
     9    wptr = lbuf_alloc(lbuf_hdl, 100);
    10    //写入数据
    11    memset(wptr, 0x5A, 100);
    12    lbuf_push(wptr, BIT(0));
    13    ret = lbuf_free_space(lbuf_hdl);
    14}
    

5.2.2.9. lbuf_state

  • 函数原型:

    void lbuf_state(struct lbuff_head *head, struct lbuff_state *state)
    
  • 功能说明:查询 lbuf 使用情况

  • 参数说明:

    参数

    说明

    head

    用于管理 lbuf 的句柄

    state

    返回 lbuff_state 结构体

  • 返回值:

  • 示例:

     1int lbuf[512] = {0};
     2struct lbuff_head *lbuf_hdl = NULL;
     3void lbuf_user_demo()
     4{
     5    u32 ret = 0;
     6    u8 *wptr = NULL;
     7
     8    u8 *rptr = NULL;
     9    struct lbuff_state state = {0};
    10    lbuf_hdl = lbuf_init(lbuf, sizeof(lbuf), 4, 0);
    11    wptr = lbuf_alloc(lbuf_hdl, 100);
    12    //写入数据
    13    memset(wptr, 0x5A, 100);
    14    lbuf_push(wptr, BIT(0));
    15    lbuf_state(lbuf_hdl, &state);
    16    printf(“avalialble = %d,fragment = %d”, state.avaliable, state.fragment);
    17}
    

5.2.2.10. lbuf_avaliable

  • 函数原型:

    int lbuf_avaliable(struct lbuff_head *head, int size)
    
  • 功能说明:查询 lbuf 中可以写入指定长度 buf 的数量

  • 参数说明:

    参数

    说明

    head

    用于管理 lbuf 的句柄

    size

    buf 大小

  • 返回值:

    int

    输出 lbuf 中可以写入指定长度 buf 的数量

  • 示例:

     1int lbuf[512] = {0};
     2struct lbuff_head *lbuf_hdl = NULL;
     3void lbuf_user_demo()
     4{
     5    u32 ret = 0;
     6    u8 *wptr = NULL;
     7    u8 *rptr = NULL;
     8    int num = 0;
     9    struct lbuff_state state = {0};
    10    lbuf_hdl = lbuf_init(lbuf, sizeof(lbuf), 4, 0);
    11    wptr = lbuf_alloc(lbuf_hdl, 100);
    12    //写入数据
    13    memset(wptr, 0x5A, 100);
    14    lbuf_push(wptr, BIT(0));
    15    num = lbuf_avaliable(lbuf_hdl, 100);
    16    printf(“lbuf avaliable = %d”, num);
    17}
    

5.2.2.11. lbuf_real_size

  • 函数原型:

    int lbuf_real_size(void *lbuf)
    
  • 功能说明:查询 buf 实际长度

  • 参数说明:

    参数

    说明

    lbuf

    在 lbuf_alloc 申请得到的 buf 指针或者 lbuf_pop 之后得到的buf 指针

  • 返回值:

    int

    输出 buf 实际长度

  • 示例:

     1int lbuf[512] = {0};
     2struct lbuff_head *lbuf_hdl = NULL;
     3void lbuf_user_demo()
     4{
     5    u32 ret = 0;
     6    u8 *wptr = NULL;
     7    u8 *rptr = NULL;
     8    int len = 0;
     9
    10    lbuf_hdl = lbuf_init(lbuf, sizeof(lbuf), 4, 0);
    11    wptr = lbuf_alloc(lbuf_hdl, 100);
    12    //写入数据
    13    memset(wptr, 0x5A, 100);
    14    lbuf_push(wptr, BIT(0));
    15    rptr = lbuf_pop(lbuf_hdl, BIT(0));
    16    len = lbuf_real_size(rptr);
    17    printf(“buf len %d”, len);
    18}
    

5.2.2.12. lbuf_remain_space

  • 函数原型:

    int lbuf_remain_space(struct lbuff_head *head)
    
  • 功能说明:查询 lbuf 剩余空间大小

  • 参数说明:

    参数

    说明

    head

    用于管理 lbuf 的句柄

  • 返回值:

    int

    lbuf 剩余空间大小

  • 示例:

     1int lbuf[512] = {0};
     2struct lbuff_head *lbuf_hdl = NULL;
     3void lbuf_user_demo()
     4{
     5    u32 ret = 0;
     6    u8 *wptr = NULL;
     7    u8 *rptr = NULL;
     8    int len = 0;
     9
    10    lbuf_hdl = lbuf_init(lbuf, sizeof(lbuf), 4, 0);
    11    wptr = lbuf_alloc(lbuf_hdl, 100);
    12    //写入数据
    13    memset(wptr, 0x5A, 100);
    14    lbuf_push(wptr, BIT(0));
    15    len = lbuf_remain_space(lbuf_hdl);
    16    printf(“lbuf remain len %d”, len);
    17}