BEST_EETX = 0,
INVALID_RVAL = 0xff,
INVALID_NEIGHBOR_ADDR = 0xff,
- INFINITY = 0xff,
+ // if we don't know the link quality, we need to return a value so
+ // large that it will not be used to form paths
+ VERY_LARGE_EETX_VALUE = 0xff,
// decay the link estimate using this alpha
// we use a denominator of 10, so this corresponds to 0.2
- ALPHA = 2,
+ ALPHA = 9,
// number of packets to wait before computing a new
// DLQ (Data-driven Link Quality)
DLQ_PKT_WINDOW = 5,
newPrevSentIdx = 0;
for (i = 0; i < NEIGHBOR_TABLE_SIZE && j < maxEntries; i++) {
k = (prevSentIdx + i + 1) % NEIGHBOR_TABLE_SIZE;
- if (NeighborTable[k].flags & VALID_ENTRY) {
+ if ((NeighborTable[k].flags & VALID_ENTRY) &&
+ (NeighborTable[k].flags & MATURE_ENTRY)) {
footer->neighborList[j].ll_addr = NeighborTable[k].ll_addr;
footer->neighborList[j].inquality = NeighborTable[k].inquality;
newPrevSentIdx = k;
if (q1 > 0) {
q = 2550 / q1 - 10;
if (q > 255) {
- q = INFINITY;
+ q = VERY_LARGE_EETX_VALUE;
}
return (uint8_t)q;
} else {
- return INFINITY;
+ return VERY_LARGE_EETX_VALUE;
}
}
uint8_t idx;
idx = findIdx(neighbor);
if (idx == INVALID_RVAL) {
- return INFINITY;
+ return VERY_LARGE_EETX_VALUE;
} else {
- return NeighborTable[idx].eetx;
- };
+ if (NeighborTable[idx].flags & MATURE_ENTRY) {
+ return NeighborTable[idx].eetx;
+ } else {
+ return VERY_LARGE_EETX_VALUE;
+ }
+ }
}
// return the quality of the link: neighor->self
uint8_t idx;
idx = findIdx(neighbor);
if (idx == INVALID_RVAL) {
- return INFINITY;
+ return VERY_LARGE_EETX_VALUE;
} else {
- return computeEETX(NeighborTable[idx].inquality);
- };
+ if (NeighborTable[idx].flags & MATURE_ENTRY) {
+ return computeEETX(NeighborTable[idx].inquality);
+ } else {
+ return VERY_LARGE_EETX_VALUE;
+ }
+ }
}
// return the quality of the link: self->neighbor
uint8_t idx;
idx = findIdx(neighbor);
if (idx == INVALID_RVAL) {
- return INFINITY;
+ return VERY_LARGE_EETX_VALUE;
} else {
- return computeEETX(NeighborTable[idx].outquality);
- };
+ if (NeighborTable[idx].flags & MATURE_ENTRY) {
+ return computeEETX(NeighborTable[idx].outquality);
+ } else {
+ return VERY_LARGE_EETX_VALUE;
+ }
+ }
}
// insert the neighbor at any cost (if there is a room for it)