]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/net/le/LinkEstimatorP.nc
rename INFINITY, only send mature links on the footer, make getlinkquality* calls...
[tinyos-2.x.git] / tos / lib / net / le / LinkEstimatorP.nc
index 57bd8e87e32f8a0ddc625c3b1ec01f2493c7be45..2f7c991efb14f5d9256c0935bd14f731a55e4048 100644 (file)
@@ -39,6 +39,7 @@ module LinkEstimatorP {
     interface LinkEstimator;
     interface Init;
     interface Packet;
+    interface CompareBit;
   }
 
   uses {
@@ -46,6 +47,8 @@ module LinkEstimatorP {
     interface AMPacket as SubAMPacket;
     interface Packet as SubPacket;
     interface Receive as SubReceive;
+    interface LinkPacketMetadata;
+    interface Random;
   }
 }
 
@@ -64,10 +67,12 @@ implementation {
     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,
@@ -127,7 +132,8 @@ implementation {
     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;
@@ -267,11 +273,11 @@ implementation {
     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;
     }
   }
 
@@ -430,36 +436,48 @@ implementation {
   }
 
   // return bi-directional link quality to the neighbor
-  command uint8_t LinkEstimator.getLinkQuality(am_addr_t neighbor) {
+  command uint16_t LinkEstimator.getLinkQuality(am_addr_t neighbor) {
     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
-  command uint8_t LinkEstimator.getReverseQuality(am_addr_t neighbor) {
+  command uint16_t LinkEstimator.getReverseQuality(am_addr_t neighbor) {
     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
-  command uint8_t LinkEstimator.getForwardQuality(am_addr_t neighbor) {
+  command uint16_t LinkEstimator.getForwardQuality(am_addr_t 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)
@@ -734,7 +752,6 @@ implementation {
 
   // application payload pointer is just past the link estimation header
   command void* Packet.getPayload(message_t* msg, uint8_t len) {
-    linkest_header_t *hdr = getHeader(msg);
     void* payload = call SubPacket.getPayload(msg, len +  sizeof(linkest_header_t));
     if (payload != NULL) {
       payload += sizeof(linkest_header_t);