Esempio n. 1
0
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();
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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");

}