Как переслать пакеты данных по альтернативному пути через альтернативного родителя? - PullRequest
0 голосов
/ 04 сентября 2018

Например, у нас есть дерево RPL и несколько отправителей данных , передающих пакеты данных в приемник . Через некоторое время один из отправителей прекращает отправку или пересылку данных на родительский узел, поскольку мы предположили, что родительский узел является подозрительным. Вместо отправки или пересылки пакета данных через подозрительный узел он пересылает пакет данных по альтернативному пути через альтернативного родителя , который выбран из родительского списка . Что такое эффективный и простой способ для реализации этого сценария в Contiki?

1 Ответ

0 голосов
/ 13 сентября 2018

Что вы хотите сделать, это внести в черный список определенного родителя (или нескольких родителей). Для этого вы можете добавить новое поле uint8_t is_suspicious к struct 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.

.
...