netbuf是应用程序和协议栈内核交互的一种数据结构

netbuf并不复杂,下面是实现代码

/* 创建netbuf */
struct netbuf *netbuf_new(void)
{struct netbuf *buf;/* 为netbuf申请内存空间 */buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);if(buf != NULL) {/* 清空参数 */buf->p = NULL;buf->ptr = NULL;ip_addr_set_any(&buf->addr);buf->port = 0;return buf;} else {return NULL;}
}/* 删除netbuf */
void netbuf_delete(struct netbuf *buf)
{if(buf != NULL) {/* 先释放pbuf */if(buf->p != NULL) {pbuf_free(buf->p);buf->p = buf->ptr = NULL;}/* 再释放netbuf */memp_free(MEMP_NETBUF, buf);}
}/* 为netbuf申请数据(pbuf)空间 */
void *netbuf_alloc(struct netbuf *buf, u16_t size)
{/* 为netbuf申请数据(pbuf)空间 */if(buf->p != NULL) {pbuf_free(buf->p);}buf->p = pbuf_alloc(PBUF_TRANSPORT, size, PBUF_RAM);if(buf->p == NULL) {return NULL;}/* ptr指针初始化指向第一个pbuf */buf->ptr = buf->p;/* 返回数据有效数据指针 */return buf->p->payload;
}/* 释放netbuf的数据(pbuf)空间 */
void netbuf_free(struct netbuf *buf)
{if(buf->p != NULL) {pbuf_free(buf->p);}buf->p = buf->ptr = NULL;
}/* 为netbuf申请PBUF_REF型pbuf内存,指向已存在RAM */
err_t netbuf_ref(struct netbuf *buf, const void *dataptr, u16_t size)
{if(buf->p != NULL) {pbuf_free(buf->p);}buf->p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF);if(buf->p == NULL) {buf->ptr = NULL;return ERR_MEM;}buf->p->payload = (void *)dataptr;buf->p->len = buf->p->tot_len = size;buf->ptr = buf->p;return ERR_OK;
}/* 将两个netbuf拼接起来 */
void netbuf_chain(struct netbuf *head, struct netbuf *tail)
{pbuf_cat(head->p, tail->p);head->ptr = head->p;memp_free(MEMP_NETBUF, tail);
}/* 获取netbuf有效数据指针和数据长度 */
err_t netbuf_data(struct netbuf *buf, void **dataptr, u16_t *len)
{if(buf->ptr == NULL) {return ERR_BUF;}*dataptr = buf->ptr->payload;*len = buf->ptr->len;return ERR_OK;
}/* 向后偏移netbuf的pbuf偏移指针 */
s8_t netbuf_next(struct netbuf *buf)
{if(buf->ptr->next == NULL) {return -1;}buf->ptr = buf->ptr->next;if(buf->ptr->next == NULL) {return 1;}return 0;
}/* netbuf的pbuf偏移指针指向第一个pbuf */
void netbuf_first(struct netbuf *buf)
{buf->ptr = buf->p;
}

LwIP之netbuf相关推荐

  1. lwip netbuf

    lwip2.0.2 netbuf_new--分配netbuf结构体的内存. netbuf_alloc,分配netbuf中pbuf内存(pbuf_alloc中PBUF_RAM类型,包括pbuf结构体和p ...

  2. LwIP Application Developers Manual12---Configuring lwIP

    1.前言 2.LwIP makefiles With minimal features C_SOURCES = \ src/api/err.c \ src/core/init.c \ src/core ...

  3. lwip可以用于发udp_LWIPUDP一对多

    最近在STM32F767的开发板上移植了LWIP UDP的代码,开发板的资料里面有介绍LWIP移植的文档,介绍了几种网络通信方式,如TCP server,TCP client,UDP,按照文档里面的介 ...

  4. LwIP 之一 源码目录文件详解及移植说明

       lwIP 是 TCP/IP 协议套件的一个小型独立实现.lwIP TCP/IP 实现的重点是减少 RAM 使用同时仍然有一个完整的 TCP. 这使得 lwIP 适合使用在具有数 10 千字节的可 ...

  5. STM32F7xx —— LAN8720(FreeRTOS+LWIP)

    STM32F7xx -- LAN8720 STM32F767自带以太网模块,需要外接PHY芯片,完成以太网通信(MII/RMII接口).LAN8720详细资料看手册.LWIP:1.4.1 FreeRT ...

  6. LwIP应用开发笔记之十一:LwIP带操作系统UDP服务器

      我们已经实现了在FreeRTOS系统上的LwIP的移植工作,但只是简单的在系统平台上跑了起来.我们还希望能做更多的事情,这一节我们就在FreeRTOS系统上实现基于LwIP的UDP服务器. 1.U ...

  7. LWIP源代码文件目录解析

    欢迎查看本文所在的系列,STM32的LWIP应用,点击跳转 doc文件夹结构 contrib.txt FILES rawapi.txt 告诉读者怎样使用协议栈的Raw/Callback API进行编程 ...

  8. 第二节 LwIP简介

    本专栏使用的是LwIP 2.1.2版本 ,官方下载链接:http://savannah.nongnu.org/projects/lwip/. LwIP 的优缺点 本专栏以LwIP 2. 1.2 为主要 ...

  9. LWIP netconn TCP UDP测试 实例

    本文由自己从网络上查资料整理而成 已经测试可用 只需修改下就能用到项目中 给需要的童鞋们参考 平台(LM3S9B92+UCOSII+LWIP) 在线IP地址转换器(二进制 十进制 十六进制转换) ht ...

最新文章

  1. c/c++ 获取文件夹或目录下的文件
  2. 演练:有效减法设计,才能开放加法
  3. mysql数据库设计的原则_MySQL数据库设计原则
  4. k8s安装工具:sealos设计原理及离线包结构分析
  5. _cdecl和_stdcal的区别
  6. 查找包含指定关键字的BDOC
  7. 通过 SAP Spartacus 的 Component 映射机制,更改默认购物车 Cart 页面
  8. ASCII,Unicode和UTF-8
  9. opencv读取usb摄像头_2020 款 11寸 iPad Pro 深度摄像头 RGBD 视频流可视化
  10. 最简单的基于FFmpeg的内存读写的例子:内存播放器
  11. 构造函数和方法的区别
  12. C++学习笔记(七)——log4cpp
  13. 捕获组合键 键盘组合键
  14. Horner规则求多项式
  15. 【代码审计-JAVA】javaweb代码审计思路
  16. 设备故障率高的四大原因及对策分析
  17. SQL查询 — 自连接的用法
  18. 让生活多点儿青春的气息
  19. 支持1588的交换和不支持1588的交换有什么区别?
  20. 服务器的信息失败怎么回事,发送小程序信息 本机正常 服务器就发送失败 这是怎么回事?...

热门文章

  1. Qt工作笔记-QGraphicsProxyWidget放自定义界面实现拖动
  2. Qt工作笔记-让界面飞一会(让界面旋转出来)
  3. Qt工作笔记-QLineEdit中使用setValidator里面的坑
  4. 大三软件工程小项目-小技术集合-客户端界面重画
  5. Qt实现全屏下玫瑰花(含详细注释)
  6. linux指令解压rpm,dpkg rpm apt yum 的常用指令 +linux 各种解压缩方法.docx
  7. mysql 多值属性_数据库 名词解释:单值属性和多值属性
  8. 计算机应用技术自创ppt,教师必备:超好用的课件制作工具
  9. query.exec报QSqlQuery::exec: database not open
  10. 启动mysql 1067_启动mysql遇到1067问题