lbuf.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #ifndef LBUF_H
  2. #define LBUF_H
  3. #include "typedef.h"
  4. #include "list.h"
  5. #include "system/spinlock.h"
  6. #define LBUF_DEBUG 0
  7. struct lbuff_head {
  8. #if LBUF_DEBUG
  9. int magic_a; /*!< 测试验证变量*/
  10. #endif
  11. struct list_head head; /*!< 指向hentry链表*/
  12. struct list_head free; /*!< 指向hfree链表*/
  13. spinlock_t lock; /*!< 混合自旋锁,单核是为开关临界区,多核是自旋锁.*/
  14. u8 align; /*!< 数据包字节对齐*/
  15. u16 priv_len; /*!< 数据包结构体的最小长度*/
  16. u32 total_size; /*!< 总大小*/
  17. u32 last_addr; /*!< 指向free链表中找到的足够长度的hfree结构体地址*/
  18. void *priv;
  19. #if LBUF_DEBUG
  20. int magic_b; /*!< 测试验证变量*/
  21. #endif
  22. };
  23. struct lbuff_state {
  24. u32 avaliable; /*!< 剩余空间的字节长度*/
  25. u32 fragment; /*!< lbuf内存碎片块数量*/
  26. u32 max_continue_len; /*!< 最大的剩余内存块的字节长度*/
  27. int num; /*!< 剩余内存块数量*/
  28. };
  29. /* --------------------------------------------------------------------------*/
  30. /**
  31. * @brief 链表buf初始化
  32. *
  33. * @param [in] buf 需要lbuf进行管理的内存
  34. * @param [in] len 内存长度
  35. * @param [in] align 输入对管理的内存进行对齐的参数,避免后续使用因地址不对齐产生碎片
  36. * @param [in] priv_head_len 要管理的一个数据包结构体的最小的长度
  37. *
  38. * @return lbuf操作句柄
  39. */
  40. /* --------------------------------------------------------------------------*/
  41. struct lbuff_head *lbuf_init(void *buf, u32 len, int align, int priv_head_len);
  42. /* --------------------------------------------------------------------------*/
  43. /**
  44. * @brief 分配内存空间进行存储数据包
  45. *
  46. * @param [in] head lbuf操作句柄
  47. * @param [in] len 需要存入的数据包的长度
  48. *
  49. * @return 成功则返回进行存储数据包的地址,调用时候需要用户把该块内存的类型初始化为数据包结构体的类型。失败则返回NULL。
  50. */
  51. /* --------------------------------------------------------------------------*/
  52. void *lbuf_alloc(struct lbuff_head *head, u32 len);
  53. /* --------------------------------------------------------------------------*/
  54. /**
  55. * @brief 重新分配lbuf_alloc()返回用于存储数据包的lbuf空间
  56. *
  57. * @param [in] lbuf lbuf_alloc()返回用于存储数据包的地址
  58. * @param [in] size 需重新分配的空间的字节长度.注:size的大小只能比lbuf_alloc()中的len小,即只能重新分配更小的lbuf空间,不能扩大空间.
  59. *
  60. * @return 重新分配后用于存储数据包的地址。失败则返回空指针。注:重新分配最好使用lbuf_real_size()获取lbuf空间的长度确认是否分配成功
  61. */
  62. /* --------------------------------------------------------------------------*/
  63. void *lbuf_realloc(void *lbuf, int size);
  64. /* --------------------------------------------------------------------------*/
  65. /**
  66. * @brief 判断lbuf空间内的内容是否为空
  67. *
  68. * @param [in] head lbuf操作句柄
  69. *
  70. * @return 返回1则为空,0则不为空
  71. */
  72. /* --------------------------------------------------------------------------*/
  73. int lbuf_empty(struct lbuff_head *head);
  74. /* --------------------------------------------------------------------------*/
  75. /**
  76. * @brief 清空lbuf空间内进行已经分配给数据包的空间
  77. *
  78. * @param [in] head lbuf操作句柄
  79. */
  80. /* --------------------------------------------------------------------------*/
  81. void lbuf_clear(struct lbuff_head *head);
  82. /* --------------------------------------------------------------------------*/
  83. /**
  84. * @brief 把数据包写入分配好的lbuf区域
  85. *
  86. * @param [in] lbuf lbuf_alloc()返回用于存储数据包的地址
  87. * @param [in] channel_map 选择映射到哪个通道,最多8个通道,使用位映射的方式进行通道对应.
  88. */
  89. /* --------------------------------------------------------------------------*/
  90. void lbuf_push(void *lbuf, u8 channel_map);
  91. /* --------------------------------------------------------------------------*/
  92. /**
  93. * @brief 读取对应的通道映射的lbuf区域存储的内容
  94. *
  95. * @param [in] head lbuf操作句柄
  96. * @param [in] channel 需要读取的通道值,一般使用BIT(n),n为需要读取的通道
  97. *
  98. * @return 成功则返回存储对应的通道映射的数据包的地址
  99. */
  100. /* --------------------------------------------------------------------------*/
  101. void *lbuf_pop(struct lbuff_head *head, u8 channel);
  102. /* --------------------------------------------------------------------------*/
  103. /**
  104. * @brief 释放存储数据包的lbuf空间
  105. *
  106. * @param [in] lbuf lbuf_alloc()返回用于存储数据包的地址
  107. *
  108. * @return 0则释放失败,存在地址越界操作或者通道还没有被读完,ref-1,读完后才能完全释放。1则释放成功。
  109. */
  110. /* --------------------------------------------------------------------------*/
  111. int lbuf_free(void *lbuf);
  112. /* --------------------------------------------------------------------------*/
  113. /**
  114. * @brief 用于调试,检查是否可以释放存储数据包的lbuf空间
  115. *
  116. * @param [in] lbuf lbuf_alloc()返回用于存储数据包的地址
  117. * @param [in] rets 调用lbuf_free_check()函数的返回地址rets,取值可参考lbuf_free()
  118. */
  119. /* --------------------------------------------------------------------------*/
  120. void lbuf_free_check(void *lbuf, u32 rets);
  121. /* --------------------------------------------------------------------------*/
  122. /**
  123. * @brief 返回可分配的用来存储数据包的最大lbuf内存空间
  124. *
  125. * @param [in] head lbuf操作句柄
  126. *
  127. * @return 可分配的最大lbuf内存空间的字节长度
  128. */
  129. /* --------------------------------------------------------------------------*/
  130. u32 lbuf_free_space(struct lbuff_head *head);
  131. /* --------------------------------------------------------------------------*/
  132. /**
  133. * @brief 获取lbuf空间的状态
  134. *
  135. * @param [in] head lbuf操作句柄
  136. * @param [out] state lbuff_state结构体
  137. */
  138. /* --------------------------------------------------------------------------*/
  139. void lbuf_state(struct lbuff_head *head, struct lbuff_state *state);
  140. /* --------------------------------------------------------------------------*/
  141. /**
  142. * @brief lbuf信息打印
  143. *
  144. * @param [in] head lbuf操作句柄
  145. */
  146. /* --------------------------------------------------------------------------*/
  147. void lbuf_dump(struct lbuff_head *head);
  148. /* --------------------------------------------------------------------------*/
  149. /**
  150. * @brief 获取已经存入lbuf空间的数据包的数量
  151. *
  152. * @param [in] head lbuf操作句柄
  153. *
  154. * @return lbuf存储的数据包的数量
  155. */
  156. /* --------------------------------------------------------------------------*/
  157. int lbuf_traversal(struct lbuff_head *head);
  158. /* --------------------------------------------------------------------------*/
  159. /**
  160. * @brief 返回lbuf空间还可以被写入size大小数据包的数量
  161. *
  162. * @param [in] head lbuf操作句柄
  163. * @param [in] size 欲检测写入数据包的大小
  164. *
  165. * @return 可以写入的数量
  166. */
  167. /* --------------------------------------------------------------------------*/
  168. int lbuf_avaliable(struct lbuff_head *head, int size);
  169. /* --------------------------------------------------------------------------*/
  170. /**
  171. * @brief 返回给数据包分配的内存空间的大小
  172. *
  173. * @param [in] lbuf lbuf_alloc()返回用于存储数据包的地址
  174. *
  175. * @return 实际占用空间的字节长度
  176. */
  177. /* --------------------------------------------------------------------------*/
  178. int lbuf_real_size(void *lbuf);
  179. /* --------------------------------------------------------------------------*/
  180. /**
  181. * @brief 计算lbuf空间剩下多少剩余空间
  182. *
  183. * @param [in] head lbuf操作句柄
  184. *
  185. * @return 剩余空间的字节长度
  186. */
  187. /* --------------------------------------------------------------------------*/
  188. int lbuf_remain_space(struct lbuff_head *head);
  189. /* --------------------------------------------------------------------------*/
  190. /**
  191. * @brief 需要被重复释放的次数+1
  192. *
  193. * @param [in] lbuf lbuf_alloc()返回用于存储数据包的地址
  194. */
  195. /* --------------------------------------------------------------------------*/
  196. void lbuf_inc_ref(void *lbuf);
  197. #endif