[Tinyos-devel] handling FTSP packets with errors

Philip Levis pal at cs.stanford.edu
Fri Mar 6 10:08:45 PST 2009


On Feb 27, 2009, at 3:11 PM, Omprakash Gnawali wrote:

> If a packet seems inconsistent (ENTRY_THROWOUT_LIMIT), FTSP will not
> only discard that packet, but ignore rest of the packets with the same
> root+sequence number, regardless of the packet origin. The latter
> seems overly aggressive unless there is an evidence that inconsistency
> is correlated in sequence number even across the nodes. If there is no
> evidence of that, it might be better to allow the possibility of
> "good" packets following "bad" packets with the same sequnence number.
> Consider the possibility of running FTSP with TS_TIMER_MODE, there is
> one node with some problem, and due to phase of the timer, this node
> might always send the first "bad" beacon in a neighborhood for every
> sequence number...

I don't think this is a major issue. But there is a bug in FTSP. In  
addNewEntry:

     uint8_t numErrors=0;
     void addNewEntry(TimeSyncMsg *msg)
     {
         int8_t i, freeItem = -1, oldestItem = 0;
         uint32_t age, oldestTime = 0;
         int32_t timeError;

         tableEntries = 0;

         // clear table if the received entry's been inconsistent for  
some time
         timeError = msg->localTime;
         call GlobalTime.local2Global((uint32_t*)(&timeError));
         timeError -= msg->globalTime;
         if( (is_synced() == SUCCESS) &&
             (timeError > ENTRY_THROWOUT_LIMIT || timeError < - 
ENTRY_THROWOUT_LIMIT))
         {
             if (++numErrors>3)
                 clearTable();
         }
         else
             numErrors = 0;

         // Code for adding an entry follows

the bug is that a bad reading is incorporated into the table. So if  
you hear one bad reading (++numErrors), you put it in the table. Then  
subsequent good readings can seem bad. So a bad reading needs to not  
be added. Furthermore, as this code counts the number of entries in  
the table, you need to move that reset later in the function. The  
function should be:

     uint8_t numErrors=0;
     void addNewEntry(TimeSyncMsg *msg)
     {
         int8_t i, freeItem = -1, oldestItem = 0;
         uint32_t age, oldestTime = 0;
         int32_t timeError;

         // clear table if the received entry's been inconsistent for  
some time
         timeError = msg->localTime;
         call GlobalTime.local2Global((uint32_t*)(&timeError));
         timeError -= msg->globalTime;
         if( (is_synced() == SUCCESS) &&
             (timeError > ENTRY_THROWOUT_LIMIT || timeError < - 
ENTRY_THROWOUT_LIMIT))
         {
             if (++numErrors>3)
                 clearTable();
             return; // Don't incorporate a bad reading
         }

         tableEntries = 0; // Don't reset table size unless you're  
recounting
         numErrors = 0;


Om and I have tested this fix and it makes FTSP maintain  
synchronization much better. Happy to provide experimental data if  
desired.

Phil




More information about the Tinyos-devel mailing list