From 90dc0ceebf617fc7d93895aa95fa2031c312de75 Mon Sep 17 00:00:00 2001 From: adamdunkels Date: Sun, 9 Jan 2011 21:14:22 +0000 Subject: [PATCH] Replaced default link estimator with an exponential weighted moving average, which reduces memory consumption per neighbor. --- core/net/rime/collect-link-estimate.c | 54 +++++++++------------------ core/net/rime/collect-link-estimate.h | 8 +--- 2 files changed, 20 insertions(+), 42 deletions(-) diff --git a/core/net/rime/collect-link-estimate.c b/core/net/rime/collect-link-estimate.c index 4616ba839..ff93cdbbb 100644 --- a/core/net/rime/collect-link-estimate.c +++ b/core/net/rime/collect-link-estimate.c @@ -32,7 +32,7 @@ * * This file is part of the Contiki operating system. * - * $Id: collect-link-estimate.c,v 1.5 2010/10/11 23:34:02 adamdunkels Exp $ + * $Id: collect-link-estimate.c,v 1.6 2011/01/09 21:14:22 adamdunkels Exp $ */ /** @@ -45,14 +45,12 @@ #include "net/rime/collect.h" #include "net/rime/collect-link-estimate.h" -/* This defines the window used by the ETX computation when computing - the ETX. It cannot be larger than - COLLECT_LINK_ESTIMATE_HISTORY_SIZE, which is defined in - collect-link-estimate.h. */ -#define ETX_HISTORY_WINDOW 8 - #define INITIAL_LINK_ESTIMATE 16 +#define COLLECT_LINK_ESTIMATE_ALPHA ((3 * (COLLECT_LINK_ESTIMATE_UNIT)) / 8) + +#define MAX_ESTIMATES 255 + #define DEBUG 0 #if DEBUG #include @@ -61,25 +59,12 @@ #define PRINTF(...) #endif -/*---------------------------------------------------------------------------*/ -static void -set_all_estimates(struct collect_link_estimate *le, uint16_t value) -{ - int i; - - for(i = 0; i < ETX_HISTORY_WINDOW; i++) { - le->history[i] = value; - } -} /*---------------------------------------------------------------------------*/ void collect_link_estimate_new(struct collect_link_estimate *le) { - /* Start with a conservative / pessimistic estimate of link quality - for new links. */ - set_all_estimates(le, 0/*INITIAL_LINK_ESTIMATE*/); - le->historyptr = 0; le->num_estimates = 0; + le->etx_accumulator = COLLECT_LINK_ESTIMATE_UNIT; } /*---------------------------------------------------------------------------*/ void @@ -90,15 +75,20 @@ collect_link_estimate_update_tx(struct collect_link_estimate *le, uint8_t tx) return; } if(le != NULL) { - /* if(le->num_estimates == 0) { - set_all_estimates(le, tx); - } else*/ { - le->history[le->historyptr] = tx; - le->historyptr = (le->historyptr + 1) % ETX_HISTORY_WINDOW; + if(le->num_estimates == 0) { + le->etx_accumulator = tx * COLLECT_LINK_ESTIMATE_UNIT; } - if(le->num_estimates < ETX_HISTORY_WINDOW) { + + if(le->num_estimates < MAX_ESTIMATES) { le->num_estimates++; } + + le->etx_accumulator = (((uint32_t)tx * COLLECT_LINK_ESTIMATE_UNIT) * + COLLECT_LINK_ESTIMATE_ALPHA + + le->etx_accumulator * (COLLECT_LINK_ESTIMATE_UNIT - + COLLECT_LINK_ESTIMATE_ALPHA)) / + COLLECT_LINK_ESTIMATE_UNIT; + } } /*---------------------------------------------------------------------------*/ @@ -125,15 +115,7 @@ collect_link_estimate(struct collect_link_estimate *le) return INITIAL_LINK_ESTIMATE * COLLECT_LINK_ESTIMATE_UNIT; } - PRINTF("collect_link_estimate: "); - etx = 0; - for(i = 0; i < le->num_estimates; ++i) { - PRINTF("%d+", le->history[i]); - etx += le->history[(le->historyptr - i - 1) & (ETX_HISTORY_WINDOW - 1)]; - } - PRINTF("/%d = %d\n", i, - (COLLECT_LINK_ESTIMATE_UNIT * etx) / i); - return (COLLECT_LINK_ESTIMATE_UNIT * etx) / i; + return le->etx_accumulator; } /*---------------------------------------------------------------------------*/ int diff --git a/core/net/rime/collect-link-estimate.h b/core/net/rime/collect-link-estimate.h index fa9105d78..5f6ac6034 100644 --- a/core/net/rime/collect-link-estimate.h +++ b/core/net/rime/collect-link-estimate.h @@ -42,7 +42,7 @@ * * This file is part of the Contiki operating system. * - * $Id: collect-link-estimate.h,v 1.3 2010/10/03 20:06:25 adamdunkels Exp $ + * $Id: collect-link-estimate.h,v 1.4 2011/01/09 21:14:22 adamdunkels Exp $ */ /** @@ -59,12 +59,8 @@ - -#define COLLECT_LINK_ESTIMATE_HISTORY_SIZE 16 - struct collect_link_estimate { - uint8_t history[COLLECT_LINK_ESTIMATE_HISTORY_SIZE]; - uint8_t historyptr; + uint32_t etx_accumulator; uint8_t num_estimates; };