0

例如,我们有一个RPL树,以及几个数据发送者sink发送数据包。过了一会儿,其中一个发送者停止向父节点发送或转发数据,因为我们假设父节点可疑。它不是通过可疑节点发送或转发数据包,而是通过从父列表中选择的替代父节点通过替代路径转发数据包。在 Contiki 中实现此场景的有效且简单的方法是什么?

4

1 回答 1

1

您要做的是将特定父母(或多个父母)列入黑名单。为此,您可以uint8_t is_suspiciousstruct rpl_parent.

我假设您已经具备设置此标志的逻辑。然后,在 RPL(中的best_parent函数rpl-dag.c)中进行父级选择时,您可以查看标志并排除设置了它的父级。

if现有代码中的条件:

/* Exclude parents from other DAGs or announcing an infinite rank */
if(p->dag != dag || p->rank == INFINITE_RANK || p->rank < ROOT_RANK(dag->instance)) {
  if(p->rank < ROOT_RANK(dag->instance)) {
    PRINTF("RPL: Parent has invalid rank\n");
  }
  continue;
}

你会添加另一个检查:... || p->is_suspicious)

最后,每次父is_suspicious状态发生变化时,都需要重新触发父选择算法。一种方法是调用函数rpl_process_parent_event

于 2018-09-13T13:39:56.960 回答