-
Notifications
You must be signed in to change notification settings - Fork 1
文档:数据包缓冲区
此页面供协议开发人员参考,介绍了Contiki-NG中使用的不同类型的缓冲区。 重点是6LoWPAN堆栈,但是有关Packetbuf
和Queuebuf
的所有信息也适用于NullNet。
在网络层及更高层,数据包有效载荷存储在uip_buf
中。
为了发送数据,上层协议或应用程序应写入此缓冲区,然后触发传输。 uIP协议栈首先添加所需的IPv6报头和可能的扩展报头。 然后,6LoWPAN将压缩报头并根据需要对数据报进行分段。 每个片段将依次传递到MAC层进行传输。
在接收时,将执行相反的过程。 MAC层将调用6LoWPAN,后者将解压缩标头并将数据报重组为uip_buf
,之后再调用uIP协议栈,就可以通过uIP和上层访问该数据报以进行处理。
uip_buf的访问规则:
- 仅来自6LoWPAN,uIP或更高版本,而不来自之下的任何层
- 仅在中断上下文之外
6LoWPAN将把链路层数据包直接构建到全局packetbuf
中。 除了有效载荷外,packetbuf
还携带许多属性/元数据(请参见packetbuf.h
)。 数据包准备好后,6LoWPAN会将其传递到MAC层进行传输。 同样,当接收数据包时,MAC层会通过packetbuf
将数据包传递到6LoWPAN。 packetbuf
API的详细信息位于doxygen:packetbuf。
packetbuf
的访问规则:
- 仅来自6LoWPAN或以下,但不来自之上的任何层
- 仅在中断上下文之外
queuebuf
模块提供了一种同时管理多个数据包的方法。 每个queuebuf
实例的内容基本上与全局packetbuf
中的内容相同。 需要queuebuf
的模块负责维护指向它们的指针,没有像queuebuf
那样指向queuebuf
的全局指针。
例如,当将IPv6数据报分段为多个数据包时,6LoWPAN使用queuebuf
。 MAC层CSMA和TSCH也将queuebuf
用于其发送队列。
queuebuf
的访问规则:
- 仅来自6LoWPAN或以下,但不来自之上的任何层
- 中断上下文之外,或者如果
queuebuf
实例受锁保护(例如在TSCH中),则从中断上下文中
启用后,Contiki-NG将自动初始化queuebuf
模块。 根据您平台的配置,可以通过以下设置来禁用queuebuf
模块:
#define QUEUEBUF_CONF_ENABLED 0
请记住,某些Contiki-NG核心功能需要queuebuf
模块(例如CSMA,TSCH,6LoWPAN碎片支持),因此,仅在有确实必要理由时,才应尝试禁用它。