void rpl_join_dodag(rpl_dodag_t *dodag, ipv6_addr_t *parent, uint16_t parent_rank) { rpl_dodag_t *my_dodag; rpl_parent_t *preferred_parent; my_dodag = rpl_new_dodag(dodag->instance->id, &dodag->dodag_id); if (my_dodag == NULL) { return; } preferred_parent = rpl_new_parent(dodag, parent, parent_rank); if (preferred_parent == NULL) { rpl_del_dodag(my_dodag); return; } my_dodag->instance->joined = 1; my_dodag->of = dodag->of; my_dodag->mop = dodag->mop; my_dodag->dtsn = dodag->dtsn; my_dodag->prf = dodag->prf; my_dodag->dio_interval_doubling = dodag->dio_interval_doubling; my_dodag->dio_min = dodag->dio_min; my_dodag->dio_redundancy = dodag->dio_redundancy; my_dodag->maxrankincrease = dodag->maxrankincrease; my_dodag->minhoprankincrease = dodag->minhoprankincrease; my_dodag->default_lifetime = dodag->default_lifetime; my_dodag->lifetime_unit = dodag->lifetime_unit; my_dodag->version = dodag->version; my_dodag->grounded = dodag->grounded; my_dodag->joined = 1; my_dodag->my_preferred_parent = preferred_parent; my_dodag->node_status = (uint8_t) NORMAL_NODE; my_dodag->my_rank = dodag->of->calc_rank(preferred_parent, dodag->my_rank); my_dodag->dao_seq = RPL_COUNTER_INIT; my_dodag->min_rank = my_dodag->my_rank; DEBUG("Joint DODAG:\n"); DEBUG("\tMOP:\t%02X\n", my_dodag->mop); DEBUG("\tminhoprankincrease :\t%04X\n", my_dodag->minhoprankincrease); DEBUG("\tdefault_lifetime:\t%02X\n", my_dodag->default_lifetime); DEBUG("\tgrounded:\t%02X\n", my_dodag->grounded); DEBUG("\tmy_preferred_parent:\t%s\n", ipv6_addr_to_str(addr_str, IPV6_MAX_ADDR_STR_LEN, &my_dodag->my_preferred_parent->addr)); DEBUG("\tmy_preferred_parent rank\t%02X\n", my_dodag->my_preferred_parent->rank); DEBUG("\tmy_preferred_parent lifetime\t%04X\n", my_dodag->my_preferred_parent->lifetime); start_trickle(my_dodag->dio_min, my_dodag->dio_interval_doubling, my_dodag->dio_redundancy); delay_dao(); }
void rpl_init_root_mode(void) { rpl_instance_t *inst; rpl_dodag_t *dodag; inst = rpl_new_instance(RPL_DEFAULT_INSTANCE); if (inst == NULL) { DEBUGF("Error - No memory for another RPL instance\n"); return; } inst->id = RPL_DEFAULT_INSTANCE; inst->joined = 1; dodag = rpl_new_dodag(RPL_DEFAULT_INSTANCE, &my_address); /* set root values */ i_am_root = 1; if (dodag != NULL) { dodag->of = (struct rpl_of_t *) rpl_get_of_for_ocp(RPL_DEFAULT_OCP); DEBUGF("Dodag init done.\n"); dodag->instance = inst; dodag->mop = RPL_DEFAULT_MOP; dodag->dtsn = 1; dodag->prf = 0; dodag->dio_interval_doubling = DEFAULT_DIO_INTERVAL_DOUBLINGS; dodag->dio_min = DEFAULT_DIO_INTERVAL_MIN; dodag->dio_redundancy = DEFAULT_DIO_REDUNDANCY_CONSTANT; dodag->maxrankincrease = 0; dodag->minhoprankincrease = (uint16_t)DEFAULT_MIN_HOP_RANK_INCREASE; dodag->default_lifetime = (uint8_t)RPL_DEFAULT_LIFETIME; dodag->lifetime_unit = RPL_LIFETIME_UNIT; dodag->version = RPL_COUNTER_INIT; dodag->grounded = RPL_GROUNDED; dodag->node_status = (uint8_t) ROOT_NODE; dodag->my_rank = RPL_ROOT_RANK; dodag->joined = 1; dodag->my_preferred_parent = NULL; memcpy(&dodag->dodag_id, &my_address, sizeof(ipv6_addr_t)); } else { DEBUGF("Error - could not generate DODAG\n"); return; } DEBUGF("Root init finished.\n"); start_trickle(dodag->dio_min, dodag->dio_interval_doubling, dodag->dio_redundancy); }
void rpl_init_root(void) { rpl_instance_t *inst; rpl_dodag_t *dodag; inst = rpl_new_instance(RPL_DEFAULT_INSTANCE); if(inst == NULL) { printf("Error - No memory for another RPL instance\n"); return; } inst->id = RPL_DEFAULT_INSTANCE; inst->joined = 1; dodag = rpl_new_dodag(RPL_DEFAULT_INSTANCE, &my_address); if(dodag != NULL) { dodag->of = rpl_get_of_for_ocp(RPL_DEFAULT_OCP); dodag->instance = inst; dodag->mop = RPL_DEFAULT_MOP; dodag->dtsn = 1; dodag->prf = 0; dodag->dio_interval_doubling = DEFAULT_DIO_INTERVAL_DOUBLINGS; dodag->dio_min = DEFAULT_DIO_INTERVAL_MIN; dodag->dio_redundancy = DEFAULT_DIO_REDUNDANCY_CONSTANT; dodag->maxrankincrease = 0; dodag->minhoprankincrease = (uint16_t)DEFAULT_MIN_HOP_RANK_INCREASE; dodag->default_lifetime = (uint8_t)RPL_DEFAULT_LIFETIME; dodag->lifetime_unit = RPL_LIFETIME_UNIT; dodag->version = RPL_COUNTER_INIT; dodag->grounded = RPL_GROUNDED; dodag->my_rank = RPL_ROOT_RANK; dodag->joined = 1; dodag->my_preferred_parent = NULL; } else { printf("Error - could not generate DODAG\n"); return; } i_am_root = 1; start_trickle(dodag->dio_min, dodag->dio_interval_doubling, dodag->dio_redundancy); puts("ROOT INIT FINISHED"); }