예제 #1
0
/*---------------------------------------------------------------------------*/
link_metric_t
neighbor_info_get_metric(const rimeaddr_t *addr)
{
  link_metric_t *metricp;

  metricp = (link_metric_t *)neighbor_attr_get_data(&attr_etx, addr);
  return (metricp == NULL || *metricp == 0) ? NEIGHBOR_INFO_ETX2FIX(DEFAULT_METRIC) : *metricp;
}
예제 #2
0
/*---------------------------------------------------------------------------*/
static void
update_metric(const rimeaddr_t *dest, int packet_metric)
{
  link_metric_t *metricp;
  link_metric_t recorded_metric, new_metric;
  unsigned long time;
  int first_update = 0;

  metricp = (link_metric_t *)neighbor_attr_get_data(&attr_etx, dest);
  packet_metric = NEIGHBOR_INFO_ETX2FIX(packet_metric);
  if(metricp == NULL || *metricp == 0) {
    recorded_metric = packet_metric;
    new_metric = ((uint16_t)recorded_metric * 5 +
         (uint16_t)packet_metric * (ETX_SCALE - 5)) / ETX_SCALE;
    first_update = 1;
  } else {
    recorded_metric = *metricp;
    /* Update the EWMA of the ETX for the neighbor. */
    if(packet_metric != NEIGHBOR_INFO_ETX2FIX(ETX_NOACK_PENALTY)) {
      new_metric = ((uint16_t)recorded_metric * ETX_ALPHA +
          (uint16_t)packet_metric * (ETX_SCALE - ETX_ALPHA)) / ETX_SCALE;
    } else {
      new_metric = ((uint16_t)recorded_metric * 5 +
                (uint16_t)packet_metric * 5) / ETX_SCALE;
    }
  }

  printf("neighbor-info: ETX of %u changed from %d to %d (packet ETX = %d)\n",
   node_id_from_rimeaddr(dest),
	 NEIGHBOR_INFO_FIX2ETX(recorded_metric),
	 NEIGHBOR_INFO_FIX2ETX(new_metric),
	 NEIGHBOR_INFO_FIX2ETX(packet_metric)
  );

  if(neighbor_attr_has_neighbor(dest)) {
    time = clock_seconds();
    neighbor_attr_set_data(&attr_etx, dest, &new_metric);
    neighbor_attr_set_data(&attr_timestamp, dest, &time);
    if(/*(first_update || new_metric != recorded_metric) &&*/ subscriber_callback != NULL) {
      subscriber_callback(dest, 1, new_metric);
    }
  }
}
예제 #3
0
/*---------------------------------------------------------------------------*/
static void
update_metric(const rimeaddr_t *dest, int packet_metric)
{
  static link_metric_t *metricp;
  static link_metric_t recorded_metric;
  static link_metric_t new_metric;
  unsigned long time;
  int first_update = 0;

  metricp = (link_metric_t *)neighbor_attr_get_data(&attr_etx, dest);
  packet_metric = NEIGHBOR_INFO_ETX2FIX(packet_metric);
  if(metricp == NULL || *metricp == 0) {
    recorded_metric = NEIGHBOR_INFO_ETX2FIX(ETX_LIMIT);
    new_metric = packet_metric;
    first_update = 1;
  } else {
    recorded_metric = *metricp;
    /* Update the EWMA of the ETX for the neighbor. */
    new_metric = ((uint16_t)recorded_metric * ETX_ALPHA +
               (uint16_t)packet_metric * (ETX_SCALE - ETX_ALPHA)) / ETX_SCALE;
  }

  PRINTF("neighbor-info: ETX changed from %d to %d (packet ETX = %d) %d\n",
	 NEIGHBOR_INFO_FIX2ETX(recorded_metric),
	 NEIGHBOR_INFO_FIX2ETX(new_metric),
	 NEIGHBOR_INFO_FIX2ETX(packet_metric),
         dest->u8[7]);

  if(neighbor_attr_has_neighbor(dest)) {
    time = clock_seconds();
    neighbor_attr_set_data(&attr_etx, dest, &new_metric);
    neighbor_attr_set_data(&attr_timestamp, dest, &time);
    if((first_update || new_metric != recorded_metric) && subscriber_callback != NULL) {
      subscriber_callback(dest, 1, new_metric);
    }
  }
}