/*---------------------------------------------------------------------------*/ void rpl_dag_root_init_dag(void) { rpl_dag_root_init(); ctimer_set(&c, RPL_DAG_GRACE_PERIOD, create_dag_callback, NULL); to_become_root = 1; /* Send a DIS packet to request RPL info from neighbors. */ dis_output(NULL); }
/*---------------------------------------------------------------------------*/ int rpl_dag_root_init_dag_immediately(void) { struct uip_ds6_addr *root_if; int i; uint8_t state; uip_ipaddr_t *ipaddr = NULL; rpl_dag_root_init(); for(i = 0; i < UIP_DS6_ADDR_NB; i++) { state = uip_ds6_if.addr_list[i].state; if(uip_ds6_if.addr_list[i].isused && state == ADDR_PREFERRED && !uip_is_addr_linklocal(&uip_ds6_if.addr_list[i].ipaddr)) { ipaddr = &uip_ds6_if.addr_list[i].ipaddr; } } if(ipaddr != NULL) { root_if = uip_ds6_addr_lookup(ipaddr); if(root_if != NULL) { rpl_dag_t *dag; uip_ipaddr_t prefix; rpl_set_root(RPL_DEFAULT_INSTANCE, ipaddr); dag = rpl_get_any_dag(); /* If there are routes in this dag, we remove them all as we are from now on the new dag root and the old routes are wrong */ if(RPL_IS_STORING(dag->instance)) { rpl_remove_routes(dag); } if(dag->instance != NULL && dag->instance->def_route != NULL) { uip_ds6_defrt_rm(dag->instance->def_route); dag->instance->def_route = NULL; } uip_ip6addr(&prefix, UIP_DS6_DEFAULT_PREFIX, 0, 0, 0, 0, 0, 0, 0); rpl_set_prefix(dag, &prefix, 64); PRINTF("RPL: rpl_dag_root_init_dag: created a new RPL dag\n"); return 0; } else { PRINTF("RPL: rpl_dag_root_init_dag: failed to create a new RPL DAG\n"); return -1; } } else { PRINTF("RPL: rpl_dag_root_init_dag: failed to create a new RPL DAG, no preferred IP address found\n"); return -2; } }