]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/chips/tda5250/mac/DuplicateP.nc
include target address in fingerprint
[tinyos-2.x.git] / tos / chips / tda5250 / mac / DuplicateP.nc
index b07b5686676e83d889ea751b5151fed9780da243..7027d257462ff5947b10a7f0bc10c65e02c5aa8f 100644 (file)
@@ -39,11 +39,37 @@ module DuplicateP {
   }
   uses {
       interface Timer<TMilli> as Timer;
+#ifdef DUPLICATE_DEBUG
+      interface SerialDebug;
+#endif
   }
 }
-implementation {    
+implementation {
     known_t knownTable[TABLE_ENTRIES];
-
+    
+#ifdef DUPLICATE_DEBUG
+    void sdDebug(uint16_t p) {
+        call SerialDebug.putPlace(p);
+    }
+    known_t dupOldest;
+    unsigned last;
+    task void dump() {
+        sdDebug(3000 + last);
+        sdDebug(dupOldest.src);
+        sdDebug(dupOldest.dest);
+        sdDebug(dupOldest.seqno);
+        sdDebug(dupOldest.age);
+        sdDebug(4000);
+        sdDebug(knownTable[last].src);
+        sdDebug(knownTable[last].dest);
+        sdDebug(knownTable[last].seqno);
+        sdDebug(knownTable[last].age);
+        sdDebug(5000);
+    }
+#else
+    void sdDebug(uint16_t p) {};
+#endif
+    
     /** helper functions */
     task void ageMsgsTask() {
         unsigned i;
@@ -68,30 +94,41 @@ implementation {
     }
 
     /*** duplicate interface */
-    async command bool Duplicate.isNew(am_addr_t src, uint8_t seqno) {
+    async command bool Duplicate.isNew(am_addr_t src, am_addr_t dest, uint8_t seqno) {
         bool rVal = TRUE;
         unsigned i;
         for(i=0; i < TABLE_ENTRIES; i++) {
             if((knownTable[i].age < MAX_AGE) &&
                (src == knownTable[i].src) &&
+               (dest == knownTable[i].dest) &&
                (seqno == knownTable[i].seqno)) {
                 knownTable[i].age = 0;
                 rVal = FALSE;
                 break;
             }
         }
+        sdDebug(100 + rVal);
+        sdDebug(200 + i);
         return rVal;
     }
     
-    async command void Duplicate.remember(am_addr_t src, uint8_t seqno) {
+    async command void Duplicate.remember(am_addr_t src, am_addr_t dest, uint8_t seqno) {
         unsigned oldest = findOldest();
+#ifdef DUPLICATE_DEBUG
+        dupOldest = knownTable[oldest];
+        last = oldest;
+        post dump();
+#endif
         knownTable[oldest].src = src;
+        knownTable[oldest].dest = dest;
         knownTable[oldest].seqno = seqno;
         knownTable[oldest].age = 0;
+        post ageMsgsTask();
     }
 
     /** helper interfaces */
     event void Timer.fired() {
+        call Timer.startOneShot(AGE_INTERVALL);
         post ageMsgsTask();
     }
 
@@ -99,10 +136,10 @@ implementation {
         uint8_t i;
         for(i = 0; i < TABLE_ENTRIES; i++) {
             atomic {
-                    knownTable[i].age = MAX_AGE;
+                knownTable[i].age = MAX_AGE;
             }
         }
-        call Timer.startPeriodic(AGE_INTERVALL);
+        call Timer.startOneShot(AGE_INTERVALL);
         return SUCCESS;
     }
 }