Например, у нас есть дерево RPL и несколько отправителей данных, передающих пакеты данных в приемник. Через некоторое время один из отправителей прекращает отправку или пересылку данных на родительский узел, поскольку мы предположили, что родительский узел подозрительный. Вместо того, чтобы отправлять или пересылать пакет данных через подозрительный узел, он пересылает пакет данных по альтернативному пути через альтернативного родителя, который выбирается из родительского списка. эм>. Как эффективно и просто реализовать этот сценарий в Contiki?
Как пересылать пакеты данных по альтернативному пути через альтернативного родителя?
Ответы (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
Большое спасибо @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
Это обязательно сработает. Наличие флага в структуре
rpl_parent
еще лучше стилистически, так как таким образом вы можете иметь несколько подозрительных узлов.
- person kfx; 14.09.2018
Ваш ответ, безусловно, работает, но я использую
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