+
+/*----------------- Metadata -----------------*/
+
+ inline rf212packet_metadata_t* getMeta(message_t* msg)
+ {
+ return (rf212packet_metadata_t*)(msg->metadata);
+ }
+
+ async command flags_metadata_t* PacketFlagsMetadata.get(message_t* msg)
+ {
+ return &(getMeta(msg)->flags);
+ }
+
+ async command rf212_metadata_t* PacketRF212Metadata.get(message_t* msg)
+ {
+ return &(getMeta(msg)->rf212);
+ }
+
+ async command timestamp_metadata_t* PacketTimeStampMetadata.get(message_t* msg)
+ {
+ return &(getMeta(msg)->timestamp);
+ }
+
+#ifdef LOW_POWER_LISTENING
+ async command lpl_metadata_t* PacketLplMetadata.get(message_t* msg)
+ {
+ return &(getMeta(msg)->lpl);
+ }
+#endif
+
+#ifdef PACKET_LINK
+ async command link_metadata_t* PacketLinkMetadata.get(message_t* msg)
+ {
+ return &(getMeta(msg)->link);
+ }
+#endif
+
+/*----------------- Packet -----------------*/
+
+ enum
+ {
+ PACKET_LENGTH_INCREASE =
+ sizeof(rf212packet_header_t) - 1 // the 8-bit length field is not counted
+ + sizeof(ieee154_footer_t), // the CRC is not stored in memory
+ };
+
+ command void Packet.clear(message_t* msg)
+ {
+ signal PacketFlagsMetadata.clear(msg);
+ signal PacketRF212Metadata.clear(msg);
+ signal PacketTimeStampMetadata.clear(msg);
+#ifdef LOW_POWER_LISTENING
+ signal PacketLplMetadata.clear(msg);
+#endif
+#ifdef PACKET_LINK
+ signal PacketLinkMetadata.clear(msg);
+#endif
+ call IEEE154PacketLayer.createDataFrame(msg);
+ }
+
+ inline command void Packet.setPayloadLength(message_t* msg, uint8_t len)
+ {
+ call IEEE154PacketLayer.setLength(msg, len + PACKET_LENGTH_INCREASE);
+ }
+
+ inline command uint8_t Packet.payloadLength(message_t* msg)
+ {
+ return call IEEE154PacketLayer.getLength(msg) - PACKET_LENGTH_INCREASE;
+ }
+
+ inline command uint8_t Packet.maxPayloadLength()
+ {
+ return TOSH_DATA_LENGTH;
+ }
+
+ command void* Packet.getPayload(message_t* msg, uint8_t len)
+ {
+ if( len > TOSH_DATA_LENGTH )
+ return NULL;
+
+ return msg->data;
+ }