]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/chips/rf2xx/layers/LowpanNetworkLayerC.nc
Use BareSend/BareReceive instead of Send/Receive to avoid duplication of payload...
[tinyos-2.x.git] / tos / chips / rf2xx / layers / LowpanNetworkLayerC.nc
index f52c4d898e3a2d0a2e62320dfebaca7fa45b9a8b..027ce10dfa46f42715f35fa3ddd713d6fc70e054 100644 (file)
  * Author: Miklos Maroti
  */
 
+#include <LowpanNetworkLayer.h>
+
 module LowpanNetworkLayerC
 {
        provides
        {
-               interface Send;
-               interface Receive;
+               interface BareSend as Send;
+               interface BareReceive as Receive;
+               interface RadioPacket;
 
                interface Receive as NonTinyosReceive[uint8_t network];
        }
 
        uses
        {
-               interface Send as SubSend;
-               interface Receive as SubReceive;
-               interface LowpanNetworkConfig as Config;
+               interface BareSend as SubSend;
+               interface BareReceive as SubReceive;
+               interface RadioPacket as SubPacket;
        }
 }
 
 implementation
 {
+       lowpan_header_t* getHeader(message_t* msg)
+       {
+               return ((void*)msg) + call SubPacket.headerLength(msg);
+       }
+
+       void* getPayload(message_t* msg)
+       {
+               return ((void*)msg) + call RadioPacket.headerLength(msg);
+       }
+
 #ifndef TINYOS_6LOWPAN_NETWORK_ID
 #define TINYOS_6LOWPAN_NETWORK_ID 0x3f
 #endif
 
-       command error_t Send.send(message_t* msg, uint8_t len)
+       command error_t Send.send(message_t* msg)
        {
-               (call Config.getHeader(msg))->network = TINYOS_6LOWPAN_NETWORK_ID;
-               return call SubSend.send(msg, len);
+               getHeader(msg)->network = TINYOS_6LOWPAN_NETWORK_ID;
+               return call SubSend.send(msg);
        }
 
        command error_t Send.cancel(message_t* msg)
@@ -56,32 +69,55 @@ implementation
                return call SubSend.cancel(msg);
        }
 
-       command uint8_t Send.maxPayloadLength()
-       {
-               return call SubSend.maxPayloadLength();
-       }
-
-       command void* Send.getPayload(message_t* msg, uint8_t len)
-       {
-               return call SubSend.getPayload(msg, len);
-       }
-  
        event void SubSend.sendDone(message_t* msg, error_t error)
        {
                signal Send.sendDone(msg, error);
        }
   
-       event message_t *SubReceive.receive(message_t *msg, void *payload, uint8_t len)
+       event message_t *SubReceive.receive(message_t *msg)
        {
-               uint8_t network = (call Config.getHeader(msg))->network;
+               uint8_t network = getHeader(msg)->network;
                if( network == TINYOS_6LOWPAN_NETWORK_ID )
-                       return signal Receive.receive(msg, payload, len);
+                       return signal Receive.receive(msg);
                else
-                       return signal NonTinyosReceive.receive[network](msg, payload, len);
+                       return signal NonTinyosReceive.receive[network](msg, 
+                               getPayload(msg), call RadioPacket.payloadLength(msg));
        }
 
        default event message_t *NonTinyosReceive.receive[uint8_t network](message_t *msg, void *payload, uint8_t len)
        {
                return msg;
        }
+
+/*----------------- RadioPacket -----------------*/
+
+       async command uint8_t RadioPacket.headerLength(message_t* msg)
+       {
+               return call SubPacket.headerLength(msg) + sizeof(lowpan_header_t);
+       }
+
+       async command uint8_t RadioPacket.payloadLength(message_t* msg)
+       {
+               return call SubPacket.payloadLength(msg) - sizeof(lowpan_header_t);
+       }
+
+       async command void RadioPacket.setPayloadLength(message_t* msg, uint8_t length)
+       {
+               call SubPacket.setPayloadLength(msg, length + sizeof(lowpan_header_t));
+       }
+
+       async command uint8_t RadioPacket.maxPayloadLength()
+       {
+               return call SubPacket.maxPayloadLength() - sizeof(lowpan_header_t);
+       }
+
+       async command uint8_t RadioPacket.metadataLength(message_t* msg)
+       {
+               return call SubPacket.metadataLength(msg);
+       }
+
+       async command void RadioPacket.clear(message_t* msg)
+       {
+               call SubPacket.clear(msg);
+       }
 }