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}