RPL儿童名单Contiki

时间:2017-05-02 19:11:02

标签: c contiki

我正在尝试测试文件rpl-icmp6.c中的DIO消息是否来自接收DIO的节点的子节点。谁能帮我?

我看到contiki没有列出孩子的名单,只有父母。因此,我不知道该怎么做?

伪代码:

if(senderOfDIO is child) {

   check the rank of the packet

}

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

如果您在存储模式下运行RPL,您可以通过查看路径来确定哪些节点是直接连接的,并检查路由的下一跳是否与端点addess相同。

这是循环直接子代的代码示例:

#include "ipv6/uip-ds6-route.h"

static void
iterate_children(void)
{
  uip_ds6_route_t *route;

  /* Loop over routing entries */
  route = uip_ds6_route_head();
  while(route != NULL) {
    const uip_ipaddr_t *address = &route->ipaddr;
    const uip_ipaddr_t *nexthop = uip_ds6_route_nexthop(route);
    if(uip_ipaddr_cmp(&address, &nexthop)) {
       /* direct child: do somehting */
    }

    route = uip_ds6_route_next(route);
  }
}

要具体解决您的问题,请使用以下内容:

static uint8_t
is_direct_child(uip_ipaddr_t *address)
{
  uip_ds6_route_t *route;

  route = uip_ds6_route_lookup(address);
  if(route != NULL) {
    const uip_ipaddr_t *nexthop = uip_ds6_route_nexthop(route);
    if(uip_ipaddr_cmp(&address, &nexthop)) {
       /* nexthop and the address are the same */
       return 1;
    }
  }
  return 0;
}

答案 1 :(得分:0)

无论是在RPL存储模式还是非存储模式,从父节点到子节点的DIO都将在两个传感器中发送。 1在形成DODAG之前 2在DODAG形成后定期发送DIO。

每次DIO将被多重播放,除了响应子节点发送DIS。

要测试孩子是否正在接收DIO消息,可以在COOJA中看到,这是一个虚拟模拟。

在非存储模式下,路由器以外的所有节点都不会存储子地址。这里的数据包转发将由源路由头(SRH)完成,它携带所有地址。