The baseline implementations supporting TimeSyncAMSend do not appear to deal
with Receive.receive correctly, in that the length parameter passed in
includes the timestamp.  This breaks code that attempts to validate messages
by comparing that length with the size of the expected structure.

Below is a patch for CC2420 that fixes this.  It took quite a while to come
up with an expression of it that would get past nesc, so if there's a better
way, I'd like to see it.

Peter

diff -r 98061e14c550 -r dcc1345ed71a tos/chips/cc2420/CC2420TimeSyncMessageC.nc
--- a/tos/chips/cc2420/CC2420TimeSyncMessageC.nc        Mon Oct 19 19:57:08 
2009 -0700
+++ b/tos/chips/cc2420/CC2420TimeSyncMessageC.nc        Sat Nov 14 19:45:51 
2009 -0700
@@ -76,7 +76,9 @@
          CC2420TimeSyncMessageP.Leds -> LedsC;

          SplitControl = CC2420ActiveMessageC;
-        Receive = CC2420ActiveMessageC.Receive;
-        Snoop = CC2420ActiveMessageC.Snoop;
+        Receive = CC2420TimeSyncMessageP.Receive;
+        Snoop = CC2420TimeSyncMessageP.Snoop;
+        CC2420TimeSyncMessageP.SubReceive -> CC2420ActiveMessageC.Receive;
+        CC2420TimeSyncMessageP.SubSnoop -> CC2420ActiveMessageC.Snoop;
          AMPacket = CC2420ActiveMessageC;
  }
diff -r 98061e14c550 -r dcc1345ed71a tos/chips/cc2420/CC2420TimeSyncMessageP.nc
--- a/tos/chips/cc2420/CC2420TimeSyncMessageP.nc        Mon Oct 19 19:57:08 
2009 -0700
+++ b/tos/chips/cc2420/CC2420TimeSyncMessageP.nc        Sat Nov 14 19:45:51 
2009 -0700
@@ -33,6 +33,10 @@

          interface TimeSyncPacket<T32khz, uint32_t> as TimeSyncPacket32khz;
          interface TimeSyncPacket<TMilli, uint32_t> as TimeSyncPacketMilli;
+
+        interface Receive[am_id_t id];
+        interface Receive as Snoop[am_id_t id];
+
      }

      uses
@@ -41,6 +45,9 @@
          interface AMPacket;
          interface Packet as SubPacket;

+        interface Receive as SubReceive[am_id_t id];
+        interface Receive as SubSnoop[am_id_t id];
+
          interface PacketTimeStamp<T32khz,uint32_t> as PacketTimeStamp32khz;
          interface PacketTimeStamp<TMilli,uint32_t> as PacketTimeStampMilli;
          interface PacketTimeSyncOffset;
@@ -144,6 +151,28 @@
          return call TimeSyncAMSend32khz.getPayload[id](msg, len);
      }

+
+/*----------------- SubReceive -------------------*/
+
+    event message_t* SubReceive.receive[am_id_t id](message_t* msg, void* 
payload, uint8_t len)
+    {
+        if (call AMPacket.isForMe(msg)) {
+            return signal Receive.receive[id](msg, payload, len - 
sizeof(timesync_radio_t));
+        }
+        return signal SubSnoop.receive[id](msg, payload, len);
+    }
+
+    default event message_t* Receive.receive[am_id_t id](message_t* msg, void* 
payload, uint8_t len) { return msg; }
+
+/*----------------- SubSnoop -------------------*/
+
+    event message_t* SubSnoop.receive[am_id_t id](message_t* msg, void* 
payload, uint8_t len)
+    {
+        return signal Snoop.receive[id](msg, payload, len - 
sizeof(timesync_radio_t));
+    }
+
+    default event message_t* Snoop.receive[am_id_t id](message_t* msg, void* 
payload, uint8_t len) { return msg; }
+
  /*----------------- SubSend.sendDone -------------------*/
      event void SubSend.sendDone(message_t* msg, error_t error)
      {


-- 
Peter A. Bigot                    Rincon Research Corporation
Eng. Spec.                        101 N. Wilmot, Ste 101
[email protected]                    Tucson AZ  85711
Voice: 520-519-4726               Fax: 520-519-4747
_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to