Skip to content

文档:数据包缓冲区

冯基魁 edited this page Jun 13, 2020 · 3 revisions

此页面供协议开发人员参考,介绍了Contiki-NG中使用的不同类型的缓冲区。 重点是6LoWPAN堆栈,但是有关PacketbufQueuebuf的所有信息也适用于NullNet。

Uip缓冲区

在网络层及更高层,数据包有效载荷存储在uip_buf中。

为了发送数据,上层协议或应用程序应写入此缓冲区,然后触发传输。 uIP协议栈首先添加所需的IPv6报头和可能的扩展报头。 然后,6LoWPAN将压缩报头并根据需要对数据报进行分段。 每个片段将依次传递到MAC层进行传输。

在接收时,将执行相反的过程。 MAC层将调用6LoWPAN,后者将解压缩标头并将数据报重组为uip_buf,之后再调用uIP协议栈,就可以通过uIP和上层访问该数据报以进行处理。

uip_buf的访问规则:

  • 仅来自6LoWPAN,uIP或更高版本,而不来自之下的任何层
  • 仅在中断上下文之外

Packetbuf

6LoWPAN将把链路层数据包直接构建到全局packetbuf中。 除了有效载荷外,packetbuf还携带许多属性/元数据(请参见packetbuf.h)。 数据包准备好后,6LoWPAN会将其传递到MAC层进行传输。 同样,当接收数据包时,MAC层会通过packetbuf将数据包传递到6LoWPAN。 packetbuf API的详细信息位于doxygen:packetbuf

packetbuf的访问规则:

  • 仅来自6LoWPAN或以下,但不来自之上的任何层
  • 仅在中断上下文之外

Queuebuf

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碎片支持),因此,仅在有确实必要理由时,才应尝试禁用它。