Contiki-ng Cooja 微尘的无线电有效载荷限制

Radio payload limitation for Cooja mote of Contiki-ng

考虑如下所示的 RPL 网络。在此网络中,节点 1 是 DODAG 的根。节点 2 是发送方,向接收方节点(节点 3-18)发送单播 UDP 数据包。 DODAG 在 non-storing 模式下工作,我正在使用 Contiki-NG 的 Cooja 微尘来执行此模拟。

问题是数据包只能到达距离最多 12 跳的节点(本例中为节点 13)。例如,当发送方想要为节点 16 发送数据包时,我们收到 6lowpan 的以下警告并且数据包在根部被丢弃:“没有足够的 packetbuf space 来压缩 header(112 字节,剩下 92 个)。中止。” (第 706 行 sicslowpan.c) 我调查了这个问题,发现 root 正确创建了源路由 header,并且 header 毫无问题地添加到数据包中。但是,问题来自MAC层和无线电接口。数据包大于无线电 driver 的 MAX_PAYLOAD_LEN。所以无线电 driver 无法处理数据包。 Contiki-ng本身有nullradiodriver,但我认为radiodriver及其参数是由平台定义的。我需要减轻这种限制。是否可以修改Cooja mote源代码中的参数?如果是,我该怎么做?

至少有两个,可能是三个缓冲区大小瓶颈决定了可以使用 Contiki-NG 网络堆栈发送和处理的数据包的最大大小;三

  1. 无线电数据包缓冲区的大小。这通常由电台的硬件决定,通常可以通过请求 NETSTACK_RADIO 驱动程序的 RADIO_CONST_MAX_PAYLOAD_LEN 参数来读取。

  2. 数据包缓冲区的大小。默认情况下,这是 125 字节 - 当添加 2 字节的 FCS 时,足够小以适应标准 IEEE 802.15.4 数据包的有效负载(其最大 PHY 层有效负载为 127 字节)。可以通过定义 PACKETBUF_CONF_SIZE.

    的不同值来更改 packetbuf 大小
  3. 如果您使用 IPv6,那么还有 uIP 缓冲区的大小。这被定义为 UIP_CONF_BUFFER_SIZE 并且默认情况下相当大(1280 字节)以与相关 RFC 定义的 IPv6 MTU 兼容。但是,某些平台将其设置为较小的值以节省内存。

如果您使用模拟的 Cooja 节点,则可以在软件中更改无线电数据包的缓冲区,方法是在 project-conf.h 或 Makefile 中定义不同的 COOJA_RADIO_CONF_BUFSIZE 值。默认值为 125 字节(因此当添加 2 字节 FCS 时,大小是 IEEE 802.15.4 无线电的最大 PHY 层有效载荷)。

要解决您在 Cooja 上的问题,您可以尝试添加 project-conf.h:

#define COOJA_RADIO_CONF_BUFSIZE 1000
#define PACKETBUF_CONF_SIZE 1000