if (totalPkt == 0) {
ne->inquality = (ALPHA * ne->inquality) / 10;
} else {
- newEst = (255 * ne->rcvcnt) / totalPkt;
+ newEst = (255UL * ne->rcvcnt) / totalPkt;
dbg("LI,LITest", " %hu: %hhu -> %hhu", ne->ll_addr, ne->inquality, (ALPHA * ne->inquality + (10-ALPHA) * newEst + 5)/10);
ne->inquality = (ALPHA * ne->inquality + (10-ALPHA) * newEst + 5)/10;
}
if (packetGap > 0) {
NeighborTable[idx].failcnt += packetGap - 1;
}
- if (packetGap > MAX_PKT_GAP) {
- NeighborTable[idx].failcnt = 0;
- NeighborTable[idx].rcvcnt = 1;
- NeighborTable[idx].inquality = 0;
- }
- if (packetGap >= BLQ_PKT_WINDOW) {
+ // The or with packetGap >= BLQ_PKT_WINDOW is needed in case
+ // failcnt gets reset above
+
+ if (((NeighborTable[idx].rcvcnt + NeighborTable[idx].failcnt) >= BLQ_PKT_WINDOW)
+ || (packetGap >= BLQ_PKT_WINDOW)) {
updateNeighborTableEst(NeighborTable[idx].ll_addr);
}
+ if (packetGap > MAX_PKT_GAP) {
+ initNeighborIdx(idx, NeighborTable[idx].ll_addr);
+ NeighborTable[idx].lastseq = seq;
+ NeighborTable[idx].rcvcnt = 1;
+ }
}