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