/*---------------------------------------------------------------------------*/ void rpl_move_parent(rpl_dag_t *dag_src, rpl_dag_t *dag_dst, rpl_parent_t *parent) { if(parent == dag_src->preferred_parent) { rpl_set_preferred_parent(dag_src, NULL); dag_src->rank = INFINITE_RANK; if(dag_src->joined && dag_src->instance->def_route != NULL) { PRINTF("RPL: Removing default route "); PRINT6ADDR(rpl_get_parent_ipaddr(parent)); PRINTF("\n"); PRINTF("rpl_move_parent\n"); uip_ds6_defrt_rm(dag_src->instance->def_route); dag_src->instance->def_route = NULL; } } else if(dag_src->joined) { /* Remove uIPv6 routes that have this parent as the next hop. */ rpl_remove_routes_by_nexthop(rpl_get_parent_ipaddr(parent), dag_src); } PRINTF("RPL: Moving parent "); PRINT6ADDR(rpl_get_parent_ipaddr(parent)); PRINTF("\n"); parent->dag = dag_dst; }
void rpl_move_parent(rpl_dag_t *dag_src, rpl_dag_t *dag_dst, rpl_parent_t *parent) { if(parent == dag_src->preferred_parent) { dag_src->preferred_parent = NULL; dag_src->rank = INFINITE_RANK; if(dag_src->joined && dag_src->instance->def_route != NULL) { if(dag_src->instance->def_route->isused) { PRINTF("RPL: Removing default route "); PRINT6ADDR(&parent->addr); PRINTF("\n"); uip_ds6_defrt_rm(dag_src->instance->def_route); } dag_src->instance->def_route = NULL; } } else if(dag_src->joined) { /* Remove uIPv6 routes that have this parent as the next hop. */ rpl_remove_routes_by_nexthop(&parent->addr, dag_src); } PRINTF("RPL: Moving parent "); PRINT6ADDR(&parent->addr); PRINTF("\n"); list_remove(dag_src->parents, parent); parent->dag = dag_dst; list_add(dag_dst->parents, parent); }