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_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); if (dodag != NULL) { dodag->of = (struct rpl_of_t *) 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->node_status = (uint8_t) ROOT_NODE; dodag->my_rank = RPL_ROOT_RANK; dodag->joined = 1; dodag->my_preferred_parent = NULL; } else { DEBUGF("Error - could not generate DODAG\n"); return; } i_am_root = 1; trickle_start(rpl_process_pid, &dodag->trickle, RPL_MSG_TYPE_TRICKLE_INTERVAL, RPL_MSG_TYPE_TRICKLE_CALLBACK, (1 << dodag->dio_min), dodag->dio_interval_doubling, dodag->dio_redundancy); DEBUGF("ROOT INIT FINISHED\n"); }
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"); }
void rpl_init_root(rpl_options_t *rpl_opts) { #if (RPL_DEFAULT_MOP == RPL_MOP_NON_STORING_MODE) #ifndef RPL_NODE_IS_ROOT puts("\n############################## ERROR ###############################"); puts("This configuration has NO ROUTING TABLE available for the root node!"); puts("The root will NOT be INITIALIZED."); puts("Please build the binary for root in non-storing MOP with:"); puts("\t\t'make RPL_NODE_IS_ROOT=1'"); puts("############################## ERROR ###############################\n"); return; #endif #endif rpl_instance_t *inst; rpl_dodag_t *dodag; inst = rpl_new_instance(rpl_opts ? rpl_opts->instance_id : RPL_DEFAULT_INSTANCE); if (inst == NULL) { DEBUGF("Error - No memory for another RPL instance\n"); return; } inst->joined = 1; dodag = rpl_new_dodag(inst, &my_address); if (dodag != NULL) { dodag->of = (struct rpl_of_t *) 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->node_status = (uint8_t) ROOT_NODE; dodag->my_rank = RPL_ROOT_RANK; dodag->joined = 1; dodag->my_preferred_parent = NULL; if (rpl_opts) { dodag->prefix = rpl_opts->prefix; dodag->prefix_length = rpl_opts->prefix_len; dodag->prefix_flags = rpl_opts->prefix_flags; dodag->prefix_preferred_lifetime = rpl_opts->prefix_valid_lifetime ? rpl_opts->prefix_preferred_lifetime : 0xffffffff; dodag->prefix_valid_lifetime = rpl_opts->prefix_valid_lifetime ? rpl_opts->prefix_valid_lifetime : 0xffffffff; } } else { DEBUGF("Error - could not generate DODAG\n"); return; } i_am_root = 1; trickle_start(rpl_process_pid, &dodag->trickle, RPL_MSG_TYPE_TRICKLE_INTERVAL, RPL_MSG_TYPE_TRICKLE_CALLBACK, (1 << dodag->dio_min), dodag->dio_interval_doubling, dodag->dio_redundancy); DEBUGF("ROOT INIT FINISHED\n"); }