Exemplo n.º 1
0
static struct net_rpl_parent *
net_rpl_mrhof_best_parent(struct net_if *iface,
			  struct net_rpl_parent *parent1,
			  struct net_rpl_parent *parent2)
{
	struct net_rpl_dag *dag;
	u16_t min_diff;
	u16_t p1_metric;
	u16_t p2_metric;

	dag = parent1->dag; /* Both parents are in the same DAG. */

	min_diff = NET_RPL_MC_ETX_DIVISOR /
		MRHOF_PARENT_SWITCH_THRESHOLD_DIV;

	p1_metric = calculate_path_metric(parent1);
	p2_metric = calculate_path_metric(parent2);

	/* Maintain stability of the preferred parent in case of similar
	 * ranks.
	 */
	if (parent1 == dag->preferred_parent ||
	    parent2 == dag->preferred_parent) {
		if (p1_metric < p2_metric + min_diff &&
		    p1_metric > p2_metric - min_diff) {
			NET_DBG("MRHOF hysteresis %u <= %u <= %u",
				p2_metric - min_diff,
				p1_metric,
				p2_metric + min_diff);
			return dag->preferred_parent;
		}
	}

	return p1_metric < p2_metric ? parent1 : parent2;
}
Exemplo n.º 2
0
static rpl_parent_t *
best_parent(rpl_parent_t *p1, rpl_parent_t *p2)
{
  rpl_dag_t *dag;
  rpl_path_metric_t min_diff;
  rpl_path_metric_t p1_metric;
  rpl_path_metric_t p2_metric;

  dag = p1->dag; /* Both parents are in the same DAG. */

  min_diff = RPL_DAG_MC_ETX_DIVISOR /
             PARENT_SWITCH_THRESHOLD_DIV;

  p1_metric = calculate_path_metric(p1);
  p2_metric = calculate_path_metric(p2);

  /* Maintain stability of the preferred parent in case of similar ranks. */
  if(p1 == dag->preferred_parent || p2 == dag->preferred_parent) {
    if(p1_metric < p2_metric + min_diff &&
       p1_metric > p2_metric - min_diff) {
      PRINTF("RPL: MRHOF hysteresis: %u <= %u <= %u\n",
             p2_metric - min_diff,
             p1_metric,
             p2_metric + min_diff);
      return dag->preferred_parent;
    }
  }

  return p1_metric < p2_metric ? p1 : p2;
}
Exemplo n.º 3
0
static rpl_parent_t *
best_parent(rpl_parent_t *p1, rpl_parent_t *p2)
{
  rpl_dag_t *dag;
  rpl_path_metric_t min_diff;
  rpl_path_metric_t p1_metric;
  rpl_path_metric_t p2_metric;

  dag = p1->dag; /* Both parents are in the same DAG. */

  p1_metric = calculate_path_metric(p1);
  // printf("p1:");
  // printAddress(rpl_get_parent_ipaddr(p1));
  // printf(" metric %u, rank: %u\n",p1_metric, p1->rank );

  p2_metric = calculate_path_metric(p2);
  // printf("p2:");
  // printAddress(rpl_get_parent_ipaddr(p2));
  // printf(" metric %u, rank: %u\n",p2_metric, p2->rank );

  #if RPL_DAG_MC == RPL_DAG_MC_ENERGY || RPL_DAG_MC == RPL_DAG_MC_ETX
    min_diff = RPL_DAG_MC_ETX_DIVISOR /
             PARENT_SWITCH_THRESHOLD_DIV;
  #elif RPL_DAG_MC == RPL_DAG_MC_TOTALENERGY
    if (p1_metric<p2_metric)
    {
      min_diff = 10*p1_metric/100; //10 percent past cost different between to parent 
    }
    else
      min_diff = 10*p2_metric/100; 

  #else
  #error "Unsupported RPL_DAG_MC configured. See rpl.h."
  #endif /* RPL_DAG_MC */

  /* Maintain stability of the preferred parent in case of similar ranks. */
  if(p1 == dag->preferred_parent || p2 == dag->preferred_parent) {
    if((p1_metric <= p2_metric && p2_metric - p1_metric < min_diff) || (p2_metric <= p1_metric && p1_metric - p2_metric <min_diff) ) {
      if(p1_metric<=p2_metric)
        printf("Hysteresis: p1_metric >= p2_metric - min_diff(%u >= %u - %u = %u)\n", p1_metric, p2_metric, min_diff, p2_metric - min_diff );
      else
        printf("Hysteresis: p2_metric >= p1_metric - min_diff(%u >= %u - %u = %u)\n", p2_metric, p1_metric, min_diff, p1_metric - min_diff );
    return dag->preferred_parent;
    }

  }

  return p1_metric < p2_metric ? p1 : p2;
}
Exemplo n.º 4
0
static int net_rpl_mrhof_update_mc(struct net_rpl_instance *instance)
{
#if defined(CONFIG_NET_RPL_MC_NONE)
	instance->mc.type = NET_RPL_MC_NONE;
	return 0;
#else
	u16_t path_metric;
	struct net_rpl_dag *dag;

#if defined(CONFIG_NET_RPL_MC_ENERGY)
	u8_t type;

	instance->mc.type = NET_RPL_MC_ENERGY;
#else
	instance->mc.type = NET_RPL_MC_ETX;
#endif

	instance->mc.flags = NET_RPL_MC_FLAG_P;
	instance->mc.aggregated = NET_RPL_MC_A_ADDITIVE;
	instance->mc.precedence = 0;

	dag = instance->current_dag;

	if (!net_rpl_dag_is_joined(dag)) {
		NET_DBG("Cannot update the metric container when not joined.");
		return -EINVAL;
	}

	if (dag->rank == NET_RPL_ROOT_RANK(instance)) {
		path_metric = 0;
	} else {
		path_metric = calculate_path_metric(dag->preferred_parent);
	}

#if defined(CONFIG_NET_RPL_MC_ETX)
	instance->mc.length = sizeof(instance->mc.obj.etx);
	instance->mc.obj.etx = path_metric;

	NET_DBG("My path ETX to the root is %u.%u\n",
		instance->mc.obj.etx / RPL_DAG_MC_ETX_DIVISOR,
		(instance->mc.obj.etx % RPL_DAG_MC_ETX_DIVISOR * 100) /
		NET_RPL_DAG_MC_ETX_DIVISOR);

#elif defined(CONFIG_NET_RPL_MC_ENERGY)
	instance->mc.length = sizeof(instance->mc.obj.energy);

	if (dag->rank == NET_RPL_ROOT_RANK(instance)) {
		type = NET_RPL_MC_NODE_TYPE_MAINS;
	} else {
		type = NET_RPL_MC_NODE_TYPE_BATTERY;
	}

	instance->mc.obj.energy.flags = type << NET_RPL_MC_ENERGY_TYPE;
	instance->mc.obj.energy.estimation = path_metric;
#endif

	return 0;
#endif /* CONFIG_NET_RPL_MC_NONE */
}
static void
update_metric_container(rpl_instance_t *instance)
{
  rpl_path_metric_t path_metric;
  rpl_dag_t *dag;
#if RPL_DAG_MC == RPL_DAG_MC_ENERGY
  uint8_t type;
#endif

  instance->mc.flags = RPL_DAG_MC_FLAG_P;
  instance->mc.aggr = RPL_DAG_MC_AGGR_ADDITIVE;
  instance->mc.prec = 0;

  dag = instance->current_dag;

  if (!dag->joined) {
    /* We should probably do something here */
    return;
  }

  if(dag->rank == ROOT_RANK(instance)) {
    path_metric = 0;
  } else {
    path_metric = calculate_path_metric(dag->preferred_parent);
  }

#if RPL_DAG_MC == RPL_DAG_MC_ETX

  instance->mc.type = RPL_DAG_MC_ETX;
  instance->mc.length = sizeof(instance->mc.obj.etx);
  instance->mc.obj.etx = path_metric;

  PRINTF("RPL: My path ETX to the root is %u.%u\n",
	instance->mc.obj.etx / RPL_DAG_MC_ETX_DIVISOR,
	(instance->mc.obj.etx % RPL_DAG_MC_ETX_DIVISOR * 100) / RPL_DAG_MC_ETX_DIVISOR);

#elif RPL_DAG_MC == RPL_DAG_MC_ENERGY

  instance->mc.type = RPL_DAG_MC_ENERGY;
  instance->mc.length = sizeof(instance->mc.obj.energy);

  if(dag->rank == ROOT_RANK(instance)) {
    type = RPL_DAG_MC_ENERGY_TYPE_MAINS;
  } else {
    type = RPL_DAG_MC_ENERGY_TYPE_BATTERY;
  }

  instance->mc.obj.energy.flags = type << RPL_DAG_MC_ENERGY_TYPE;
  instance->mc.obj.energy.energy_est = path_metric;

#else

#error "Unsupported RPL_DAG_MC configured. See rpl.h."

#endif /* RPL_DAG_MC */
}
Exemplo n.º 6
0
static void
update_metric_container(rpl_instance_t *instance)
{
  rpl_path_metric_t path_metric;
  rpl_dag_t *dag;
#if RPL_DAG_MC == RPL_DAG_MC_ENERGY
  uint8_t type;
#endif

  instance->mc.type = RPL_DAG_MC;
  instance->mc.flags = RPL_DAG_MC_FLAG_P;
  instance->mc.aggr = RPL_DAG_MC_AGGR_ADDITIVE;
  instance->mc.prec = 0;

  dag = instance->current_dag;

  if (!dag->joined) {
    PRINTF("RPL: Cannot update the metric container when not joined\n");
    return;
  }

  if(dag->rank == ROOT_RANK(instance)) {
    path_metric = 0;
  } else {
    path_metric = calculate_path_metric(dag->preferred_parent);
  }

#if RPL_DAG_MC == RPL_DAG_MC_ETX
  instance->mc.length = sizeof(instance->mc.obj.etx);
  instance->mc.obj.etx = path_metric;

  PRINTF("RPL: My path ETX to the root is %u.%u\n",
	instance->mc.obj.etx / RPL_DAG_MC_ETX_DIVISOR,
	(instance->mc.obj.etx % RPL_DAG_MC_ETX_DIVISOR * 100) /
	 RPL_DAG_MC_ETX_DIVISOR);
#elif RPL_DAG_MC == RPL_DAG_MC_ENERGY
  instance->mc.length = sizeof(instance->mc.obj.energy);
  if(dag->rank == ROOT_RANK(instance)) {
    type = RPL_DAG_MC_ENERGY_TYPE_MAINS;
  } else {
    type = RPL_DAG_MC_ENERGY_TYPE_BATTERY;
  }

  instance->mc.obj.energy.flags = type << RPL_DAG_MC_ENERGY_TYPE;
  instance->mc.obj.energy.energy_est = path_metric;
#elif RPL_DAG_MC == RPL_DAG_MC_TOTALENERGY
  instance->mc.length = sizeof(instance->mc.obj.total_energy);
  instance->mc.obj.total_energy = path_metric;
  // printf("total_energy path_metric:%u\n", path_metric);

#endif /* RPL_DAG_MC == RPL_DAG_MC_ETX */
}
Exemplo n.º 7
0
static void
update_metric_container(rpl_dag_t *dag)
{
  rpl_path_metric_t path_metric;
#if RPL_DAG_MC == RPL_DAG_MC_ENERGY
  uint8_t type;
#endif

  dag->mc.flags = RPL_DAG_MC_FLAG_P;
  dag->mc.aggr = RPL_DAG_MC_AGGR_ADDITIVE;
  dag->mc.prec = 0;

  if(dag->rank == ROOT_RANK(dag)) {
    path_metric = 0;
  } else {
    path_metric = calculate_path_metric(dag->preferred_parent);
  }

#if RPL_DAG_MC == RPL_DAG_MC_ETX

  dag->mc.type = RPL_DAG_MC_ETX;
  dag->mc.length = sizeof(dag->mc.obj.etx);
  dag->mc.obj.etx = path_metric;

  PRINTF("RPL: My path ETX to the root is %u.%u\n",
	dag->mc.obj.etx / RPL_DAG_MC_ETX_DIVISOR,
	(dag->mc.obj.etx % RPL_DAG_MC_ETX_DIVISOR * 100) / RPL_DAG_MC_ETX_DIVISOR);

#elif RPL_DAG_MC == RPL_DAG_MC_ENERGY

  dag->mc.type = RPL_DAG_MC_ENERGY;
  dag->mc.length = sizeof(dag->mc.obj.energy);

  if(dag->rank == ROOT_RANK(dag)) {
    type = RPL_DAG_MC_ENERGY_TYPE_MAINS;
  } else {
    type = RPL_DAG_MC_ENERGY_TYPE_BATTERY;
  }

  dag->mc.obj.energy.flags = type << RPL_DAG_MC_ENERGY_TYPE;
  dag->mc.obj.energy.energy_est = path_metric;

#else

#error "Unsupported RPL_DAG_MC configured. See rpl.h."

#endif /* RPL_DAG_MC */
}