Как пересылать пакеты данных по альтернативному пути через альтернативного родителя?

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


person Hamed    schedule 04.09.2018    source источник


Ответы (1)


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

person kfx    schedule 13.09.2018
comment
Большое спасибо @kfx. Я изменил оператор условия Поиск лучшего родителя в соответствии с OF в функции best_parent в rpl-dag.c следующим образом: for(...; p != NULL && rpl_get_parent_ipaddr(p)->u8[15] != suspicious_node_id;...). Я думаю, что это работает отлично, не так ли? - person Hamed; 14.09.2018
comment
Это обязательно сработает. Наличие флага в структуре rpl_parent еще лучше стилистически, так как таким образом вы можете иметь несколько подозрительных узлов. - person kfx; 14.09.2018
comment
Ваш ответ, безусловно, работает, но я использую node_id в моем файле проекта C и добавлю флаг uint8_t is_suspicious в struct rpl_parent в rpl.h . Как установить или изменить флаг p->is_suspicious, когда я обнаруживаю подозрительный node_id в файле проекта C? Мне нужно .. || p->is_suspicious, но этот флаг не присвоил его раньше. - person Hamed; 14.09.2018