Neighbor ETX should accumulate over retransmission timeouts;
Best neighbor has minimum sum of routing metric and neighbor ETX. Previously best neighbor prioritizes routing metric before neighbor ETX, which often causes a poor neighbor with a good upstream path to be selected.
This commit is contained in:
parent
62854151d7
commit
229d60d691
|
@ -33,7 +33,7 @@
|
||||||
*
|
*
|
||||||
* This file is part of the Contiki operating system.
|
* This file is part of the Contiki operating system.
|
||||||
*
|
*
|
||||||
* $Id: neighbor.c,v 1.15 2008/02/24 22:05:27 adamdunkels Exp $
|
* $Id: neighbor.c,v 1.16 2008/11/12 10:47:17 zhitao Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -145,7 +145,7 @@ void
|
||||||
neighbor_timedout_etx(struct neighbor *n, uint8_t etx)
|
neighbor_timedout_etx(struct neighbor *n, uint8_t etx)
|
||||||
{
|
{
|
||||||
if(n != NULL) {
|
if(n != NULL) {
|
||||||
n->etxs[n->etxptr] = etx;
|
n->etxs[n->etxptr] += etx;
|
||||||
n->etxptr = (n->etxptr + 1) % NEIGHBOR_NUM_ETXS;
|
n->etxptr = (n->etxptr + 1) % NEIGHBOR_NUM_ETXS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -277,12 +277,11 @@ neighbor_best(void)
|
||||||
{
|
{
|
||||||
int found;
|
int found;
|
||||||
/* int lowest, best;*/
|
/* int lowest, best;*/
|
||||||
struct neighbor *n, *lowest, *best;
|
struct neighbor *n, *best;
|
||||||
uint8_t rtmetric;
|
uint8_t rtmetric;
|
||||||
uint8_t etx;
|
|
||||||
|
|
||||||
rtmetric = RTMETRIC_MAX;
|
rtmetric = RTMETRIC_MAX;
|
||||||
lowest = best = NULL;
|
best = NULL;
|
||||||
found = 0;
|
found = 0;
|
||||||
|
|
||||||
/* PRINTF("%d: ", node_id);*/
|
/* PRINTF("%d: ", node_id);*/
|
||||||
|
@ -290,33 +289,14 @@ neighbor_best(void)
|
||||||
/* Find the lowest rtmetric. */
|
/* Find the lowest rtmetric. */
|
||||||
for(n = list_head(neighbors_list); n != NULL; n = n->next) {
|
for(n = list_head(neighbors_list); n != NULL; n = n->next) {
|
||||||
if(!rimeaddr_cmp(&n->addr, &rimeaddr_null) &&
|
if(!rimeaddr_cmp(&n->addr, &rimeaddr_null) &&
|
||||||
rtmetric > n->rtmetric) {
|
rtmetric > n->rtmetric + neighbor_etx(n)) {
|
||||||
rtmetric = n->rtmetric;
|
rtmetric = n->rtmetric + neighbor_etx(n);
|
||||||
lowest = n;
|
|
||||||
found = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* PRINTF("\n");*/
|
|
||||||
|
|
||||||
/* Find the neighbor with lowest etx of the ones that
|
|
||||||
have the lowest rtmetric. */
|
|
||||||
if(found) {
|
|
||||||
etx = 0;
|
|
||||||
best = lowest;
|
|
||||||
for(n = list_head(neighbors_list); n != NULL; n = n->next) {
|
|
||||||
/* for(i = 0; i < MAX_NEIGHBORS; ++i) {*/
|
|
||||||
if(!rimeaddr_cmp(&n->addr, &rimeaddr_null) &&
|
|
||||||
rtmetric == n->rtmetric &&
|
|
||||||
neighbor_etx(n) < etx) {
|
|
||||||
etx = neighbor_etx(n);
|
|
||||||
best = n;
|
best = n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return best;
|
return best;
|
||||||
}
|
}
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
void
|
void
|
||||||
neighbor_set_lifetime(int seconds)
|
neighbor_set_lifetime(int seconds)
|
||||||
|
|
Loading…
Reference in a new issue