/*---------------------------------------------------------------------------*/ int rpl_process_parent_event(rpl_instance_t *instance, rpl_parent_t *p) { rpl_rank_t old_rank; int return_value; old_rank = instance->current_dag->rank; return_value = 1; if(!acceptable_rank(p->dag, p->rank)) { /* The candidate parent is no longer valid: the rank increase resulting from the choice of it as a parent would be too high. */ PRINTF("RPL: Unacceptable rank %u\n", (unsigned)p->rank); if(p != instance->current_dag->preferred_parent) { rpl_nullify_parent(p->dag, p); return 0; } else { rpl_nullify_parent(p->dag, p); return_value = 0; } } if(rpl_select_dag(instance, p) == NULL) { /* No suitable parent; trigger a local repair. */ PRINTF("RPL: No parents found in any DAG\n"); rpl_local_repair(instance); return 0; } #if DEBUG if(DAG_RANK(old_rank, instance) != DAG_RANK(instance->current_dag->rank, instance)) { PRINTF("RPL: Moving in the instance from rank %hu to %hu\n", DAG_RANK(old_rank, instance), DAG_RANK(instance->current_dag->rank, instance)); if(instance->current_dag->rank != INFINITE_RANK) { PRINTF("RPL: The preferred parent is "); PRINT6ADDR(&instance->current_dag->preferred_parent->addr); PRINTF(" (rank %u)\n", (unsigned)DAG_RANK(instance->current_dag->preferred_parent->rank, instance)); } else { PRINTF("RPL: We don't have any parent"); } } #endif /* DEBUG */ return return_value; }
/*---------------------------------------------------------------------------*/ void rpl_remove_parent(rpl_parent_t *parent) { PRINTF("RPL: Removing parent "); PRINT6ADDR(rpl_get_parent_ipaddr(parent)); PRINTF("\n"); rpl_nullify_parent(parent); nbr_table_remove(rpl_parents, parent); }
/*---------------------------------------------------------------------------*/ void rpl_remove_parent(rpl_dag_t *dag, rpl_parent_t *parent) { rpl_nullify_parent(dag, parent); PRINTF("RPL: Removing parent "); PRINT6ADDR(&parent->addr); PRINTF("\n"); list_remove(dag->parents, parent); memb_free(&parent_memb, parent); }
/*---------------------------------------------------------------------------*/ void rpl_remove_parent(rpl_dag_t *dag, rpl_parent_t *parent) { rpl_nullify_parent(dag, parent); PRINTF("RPL: Removing parent "); PRINT6ADDR(&parent->addr); PRINTF("\n"); ANNOTATE("#L %u 0\n", parent->addr.u8[sizeof(uip_ipaddr_t) - 1]); list_remove(dag->parents, parent); memb_free(&parent_memb, parent); }
/*---------------------------------------------------------------------------*/ static void nullify_parents(rpl_dag_t *dag, rpl_rank_t minimum_rank) { rpl_parent_t *p, *p2; PRINTF("RPL: Removing parents (minimum rank %u)\n", minimum_rank); for(p = list_head(dag->parents); p != NULL; p = p2) { p2 = p->next; if(p->rank >= minimum_rank) { rpl_nullify_parent(dag, p); } } }
/*---------------------------------------------------------------------------*/ static void nullify_parents(rpl_dag_t *dag, rpl_rank_t minimum_rank) { rpl_parent_t *p; // PRINTF("RPL: Removing parents (minimum rank %u)\n",minimum_rank); p = nbr_table_head(rpl_parents); while(p != NULL) { if(dag == p->dag && p->rank >= minimum_rank) { rpl_nullify_parent(p); } p = nbr_table_next(rpl_parents, p); } }