1

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

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

一个简单的RPL网络; 节点 1 是根节点,节点 2 是发送者,节点 3-18 是接收者

4

1 回答 1

1

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

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

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

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

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

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

#define COOJA_RADIO_CONF_BUFSIZE 1000
#define PACKETBUF_CONF_SIZE 1000
于 2021-12-16T08:18:15.427 回答