From 248036f967b45dd8f069bc1de84ee28489ad45ba Mon Sep 17 00:00:00 2001 From: mmaroti Date: Mon, 30 Mar 2009 22:29:48 +0000 Subject: [PATCH] implement the PacketLink layer --- tos/chips/rf2xx/layers/PacketLinkLayer.h | 33 +++ tos/chips/rf2xx/layers/PacketLinkLayerC.nc | 89 +++++++ tos/chips/rf2xx/layers/PacketLinkLayerP.nc | 240 +++++++++++++++++++ tos/chips/rf2xx/rf212/RF212ActiveMessageC.nc | 32 ++- tos/chips/rf2xx/rf212/RF212Packet.h | 4 + tos/chips/rf2xx/rf212/RF212PacketC.nc | 7 + tos/chips/rf2xx/rf212/RF212PacketP.nc | 27 ++- tos/chips/rf2xx/rf230/RF230ActiveMessageC.nc | 32 ++- tos/chips/rf2xx/rf230/RF230Packet.h | 4 + tos/chips/rf2xx/rf230/RF230PacketC.nc | 7 + tos/chips/rf2xx/rf230/RF230PacketP.nc | 27 ++- tos/chips/rf2xx/util/PacketData.nc | 37 +++ 12 files changed, 515 insertions(+), 24 deletions(-) create mode 100644 tos/chips/rf2xx/layers/PacketLinkLayer.h create mode 100644 tos/chips/rf2xx/layers/PacketLinkLayerC.nc create mode 100644 tos/chips/rf2xx/layers/PacketLinkLayerP.nc create mode 100644 tos/chips/rf2xx/util/PacketData.nc diff --git a/tos/chips/rf2xx/layers/PacketLinkLayer.h b/tos/chips/rf2xx/layers/PacketLinkLayer.h new file mode 100644 index 00000000..785e61ec --- /dev/null +++ b/tos/chips/rf2xx/layers/PacketLinkLayer.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2007, Vanderbilt University + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT + * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Author: Miklos Maroti + */ + +#ifndef __PACKETLINKLAYER_H__ +#define __PACKETLINKLAYER_H__ + +typedef struct packet_link_metadata_t +{ + nx_uint16_t maxRetries; + nx_uint16_t retryDelay; +} packet_link_metadata_t; + +#endif//__PACKETLINKLAYER_H__ diff --git a/tos/chips/rf2xx/layers/PacketLinkLayerC.nc b/tos/chips/rf2xx/layers/PacketLinkLayerC.nc new file mode 100644 index 00000000..34ea8911 --- /dev/null +++ b/tos/chips/rf2xx/layers/PacketLinkLayerC.nc @@ -0,0 +1,89 @@ +/* + * "Copyright (c) 2008 The Regents of the University of California. + * All rights reserved." + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Rincon Research Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Reliable Packet Link Functionality + * @author David Moss + * @author Jon Wyant + * @author Miklos Maroti + */ + +#include + +#warning "*** USING PACKET LINK LAYER" + +configuration PacketLinkLayerC { + provides { + interface Send; + interface PacketLink; + } + + uses { + interface Send as SubSend; + interface PacketData; + interface PacketAcknowledgements; + } +} + +implementation { + components PacketLinkLayerP, + RF230PacketC, + new TimerMilliC() as DelayTimerC; + + PacketLink = PacketLinkLayerP; + Send = PacketLinkLayerP.Send; + SubSend = PacketLinkLayerP.SubSend; + PacketAcknowledgements = PacketLinkLayerP; + PacketData = PacketLinkLayerP; + + PacketLinkLayerP.DelayTimer -> DelayTimerC; +} diff --git a/tos/chips/rf2xx/layers/PacketLinkLayerP.nc b/tos/chips/rf2xx/layers/PacketLinkLayerP.nc new file mode 100644 index 00000000..a54e135f --- /dev/null +++ b/tos/chips/rf2xx/layers/PacketLinkLayerP.nc @@ -0,0 +1,240 @@ +/* + * "Copyright (c) 2008 The Regents of the University of California. + * All rights reserved." + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS." + * + */ +/* + * Copyright (c) 2005-2006 Rincon Research Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * - Neither the name of the Rincon Research Corporation nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * RINCON RESEARCH OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE + */ + +/** + * Reliable Packet Link Functionality + * @author David Moss + * @author Jon Wyant + * @author Miklos Maroti + */ + +#include + +module PacketLinkLayerP { + provides { + interface Send; + interface PacketLink; + } + + uses { + interface Send as SubSend; + interface PacketAcknowledgements; + interface Timer as DelayTimer; + interface PacketData; + } +} + +implementation { + + /** The message currently being sent */ + message_t *currentSendMsg; + + /** Length of the current send message */ + uint8_t currentSendLen; + + /** The length of the current send message */ + uint16_t totalRetries; + + /***************** Prototypes ***************/ + + task void send(); + void signalDone(error_t error); + + + /***************** PacketLink Commands ***************/ + /** + * Set the maximum number of times attempt message delivery + * Default is 0 + * @param msg + * @param maxRetries the maximum number of attempts to deliver + * the message + */ + command void PacketLink.setRetries(message_t *msg, uint16_t maxRetries) { + (call PacketData.getData(msg))->maxRetries = maxRetries; + } + + /** + * Set a delay between each retry attempt + * @param msg + * @param retryDelay the delay betweeen retry attempts, in milliseconds + */ + command void PacketLink.setRetryDelay(message_t *msg, uint16_t retryDelay) { + (call PacketData.getData(msg))->retryDelay = retryDelay; + } + + /** + * @return the maximum number of retry attempts for this message + */ + command uint16_t PacketLink.getRetries(message_t *msg) { + return (call PacketData.getData(msg))->maxRetries; + } + + /** + * @return the delay between retry attempts in ms for this message + */ + command uint16_t PacketLink.getRetryDelay(message_t *msg) { + return (call PacketData.getData(msg))->retryDelay; + } + + /** + * @return TRUE if the message was delivered. + */ + command bool PacketLink.wasDelivered(message_t *msg) { + return call PacketAcknowledgements.wasAcked(msg); + } + + async event void PacketData.clear(packet_link_metadata_t* data) { + data->maxRetries = 0; + } + + /***************** Send Commands ***************/ + /** + * Each call to this send command gives the message a single + * DSN that does not change for every copy of the message + * sent out. For messages that are not acknowledged, such as + * a broadcast address message, the receiving end does not + * signal receive() more than once for that message. + */ + command error_t Send.send(message_t *msg, uint8_t len) { + error_t error = EBUSY; + if(currentSendMsg == NULL) { + + if(call PacketLink.getRetries(msg) > 0) { + call PacketAcknowledgements.requestAck(msg); + } + + if((error = call SubSend.send(msg, len)) == SUCCESS) { + currentSendMsg = msg; + currentSendLen = len; + totalRetries = 0; + } + } + return error; + } + + command error_t Send.cancel(message_t *msg) { + if(currentSendMsg == msg) { + currentSendMsg = NULL; + return call SubSend.cancel(msg); + } + + return FAIL; + } + + + 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); + } + + /***************** SubSend Events ***************/ + event void SubSend.sendDone(message_t* msg, error_t error) { + totalRetries++; + + if(call PacketAcknowledgements.wasAcked(msg)) { + signalDone(SUCCESS); + return; + + } else if(totalRetries < call PacketLink.getRetries(currentSendMsg)) { + + if(call PacketLink.getRetryDelay(currentSendMsg) > 0) { + // Resend after some delay + call DelayTimer.startOneShot(call PacketLink.getRetryDelay(currentSendMsg)); + } else { + // Resend immediately + post send(); + } + + return; + } + + signalDone(error); + } + + /***************** Timer Events ****************/ + /** + * When this timer is running, that means we're sending repeating messages + * to a node that is receive check duty cycling. + */ + event void DelayTimer.fired() { + if(currentSendMsg != NULL) { + post send(); + } + } + + /***************** Tasks ***************/ + task void send() { + if(call PacketLink.getRetries(currentSendMsg) > 0) { + call PacketAcknowledgements.requestAck(currentSendMsg); + } + + if(call SubSend.send(currentSendMsg, currentSendLen) != SUCCESS) { + post send(); + } + } + + /***************** Functions ***************/ + void signalDone(error_t error) { + message_t* msg = currentSendMsg; + currentSendMsg = NULL; + + // AT: A bit of a hack to be able to keep track of the number of retries + // printfUART("Signaling done with total retries at 0x%x\n", totalRetries); + + call DelayTimer.stop(); + call PacketLink.setRetries(msg, totalRetries); + signal Send.sendDone(msg, error); + } +} diff --git a/tos/chips/rf2xx/rf212/RF212ActiveMessageC.nc b/tos/chips/rf2xx/rf212/RF212ActiveMessageC.nc index d7b0f3aa..65eba63c 100644 --- a/tos/chips/rf2xx/rf212/RF212ActiveMessageC.nc +++ b/tos/chips/rf2xx/rf212/RF212ActiveMessageC.nc @@ -36,7 +36,14 @@ configuration RF212ActiveMessageC interface Packet; interface AMPacket; interface PacketAcknowledgements; + + // we provide a dummy LowPowerListening interface if LOW_POWER_LISTENING is not defined interface LowPowerListening; + +#ifdef PACKET_LINK + interface PacketLink; +#endif + interface RadioChannel; interface PacketField as PacketLinkQuality; @@ -77,19 +84,35 @@ implementation #else components IEEE154NetworkLayerC; #endif + #ifdef LOW_POWER_LISTENING components LowPowerListeningLayerC; + LowPowerListeningLayerC.PacketSleepInterval -> RF230PacketC; + LowPowerListeningLayerC.IEEE154Packet2 -> IEEE154Packet2C; + LowPowerListeningLayerC.PacketAcknowledgements -> RF230PacketC; #else components new DummyLayerC() as LowPowerListeningLayerC; #endif + +#ifdef PACKET_LINK + components PacketLinkLayerC; + PacketLink = PacketLinkLayerC; + PacketLinkLayerC.PacketData -> RF230PacketC; + PacketLinkLayerC.PacketAcknowledgements -> RF230PacketC; +#else + components new DummyLayerC() as PacketLinkLayerC; +#endif + components MessageBufferLayerC; components UniqueLayerC; components TrafficMonitorLayerC; + #ifdef SLOTTED_MAC components SlottedCollisionLayerC as CollisionAvoidanceLayerC; #else components RandomCollisionLayerC as CollisionAvoidanceLayerC; #endif + components SoftwareAckLayerC; components new DummyLayerC() as CsmaLayerC; components RF212DriverLayerC; @@ -112,13 +135,10 @@ implementation UniqueLayerC.SubSend -> LowPowerListeningLayerC; LowPowerListeningLayerC.SubControl -> MessageBufferLayerC; - LowPowerListeningLayerC.SubSend -> MessageBufferLayerC; + LowPowerListeningLayerC.SubSend -> PacketLinkLayerC; LowPowerListeningLayerC.SubReceive -> MessageBufferLayerC; -#ifdef LOW_POWER_LISTENING - LowPowerListeningLayerC.PacketSleepInterval -> RF212PacketC; - LowPowerListeningLayerC.IEEE154Packet2 -> IEEE154Packet2C; - LowPowerListeningLayerC.PacketAcknowledgements -> RF212PacketC; -#endif + + PacketLinkLayerC.SubSend -> MessageBufferLayerC; MessageBufferLayerC.Packet -> RF212PacketC; MessageBufferLayerC.RadioSend -> TrafficMonitorLayerC; diff --git a/tos/chips/rf2xx/rf212/RF212Packet.h b/tos/chips/rf2xx/rf212/RF212Packet.h index 15866b7a..ed378759 100644 --- a/tos/chips/rf2xx/rf212/RF212Packet.h +++ b/tos/chips/rf2xx/rf212/RF212Packet.h @@ -25,6 +25,7 @@ #define __RF212PACKET_H__ #include +#include typedef ieee154_header_t rf212packet_header_t; @@ -40,6 +41,9 @@ typedef struct rf212packet_metadata_t uint8_t power; // shared between TXPOWER and RSSI #ifdef LOW_POWER_LISTENING uint16_t lpl_sleepint; +#endif +#ifdef PACKET_LINK + packet_link_metadata_t packet_link; #endif uint32_t timestamp; } rf212packet_metadata_t; diff --git a/tos/chips/rf2xx/rf212/RF212PacketC.nc b/tos/chips/rf2xx/rf212/RF212PacketC.nc index 5a53cf42..89f82459 100644 --- a/tos/chips/rf2xx/rf212/RF212PacketC.nc +++ b/tos/chips/rf2xx/rf212/RF212PacketC.nc @@ -36,6 +36,9 @@ configuration RF212PacketC interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; +#ifdef PACKET_LINK + interface PacketData as PaketLinkMetadata; +#endif } } @@ -59,4 +62,8 @@ implementation PacketTimeStampRadio = RF212PacketP; PacketTimeStampMilli = RF212PacketP; + +#ifdef PACKET_LINK + PaketLinkMetadata = RF212PacketP; +#endif } diff --git a/tos/chips/rf2xx/rf212/RF212PacketP.nc b/tos/chips/rf2xx/rf212/RF212PacketP.nc index 3641c1bd..16581682 100644 --- a/tos/chips/rf2xx/rf212/RF212PacketP.nc +++ b/tos/chips/rf2xx/rf212/RF212PacketP.nc @@ -6,12 +6,12 @@ * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. - * + * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS @@ -24,6 +24,7 @@ #include #include #include +#include module RF212PacketP { @@ -39,6 +40,10 @@ module RF212PacketP interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; + +#ifdef PACKET_LINK + interface PacketData as PacketLinkMetadata; +#endif } uses @@ -54,7 +59,7 @@ implementation { enum { - PACKET_LENGTH_INCREASE = + 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 }; @@ -66,19 +71,19 @@ implementation /*----------------- Packet -----------------*/ - command void Packet.clear(message_t* msg) + command void Packet.clear(message_t* msg) { call IEEE154Packet2.createDataFrame(msg); getMeta(msg)->flags = RF212PACKET_CLEAR_METADATA; } - inline command void Packet.setPayloadLength(message_t* msg, uint8_t len) + inline command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call IEEE154Packet2.setLength(msg, len + PACKET_LENGTH_INCREASE); } - inline command uint8_t Packet.payloadLength(message_t* msg) + inline command uint8_t Packet.payloadLength(message_t* msg) { return call IEEE154Packet2.getLength(msg) - PACKET_LENGTH_INCREASE; } @@ -287,4 +292,14 @@ implementation getMeta(msg)->lpl_sleepint = value; #endif } + +/*----------------- PacketLinkMetadata -----------------*/ +#ifdef PACKET_LINK + + async command packet_link_metadata_t* PacketLinkMetadata.getData(message_t* msg) + { + return &(getMeta(msg)->packet_link); + } + +#endif } diff --git a/tos/chips/rf2xx/rf230/RF230ActiveMessageC.nc b/tos/chips/rf2xx/rf230/RF230ActiveMessageC.nc index a6ecda76..af6e816e 100644 --- a/tos/chips/rf2xx/rf230/RF230ActiveMessageC.nc +++ b/tos/chips/rf2xx/rf230/RF230ActiveMessageC.nc @@ -36,7 +36,14 @@ configuration RF230ActiveMessageC interface Packet; interface AMPacket; interface PacketAcknowledgements; + + // we provide a dummy LowPowerListening interface if LOW_POWER_LISTENING is not defined interface LowPowerListening; + +#ifdef PACKET_LINK + interface PacketLink; +#endif + interface RadioChannel; interface PacketField as PacketLinkQuality; @@ -77,19 +84,35 @@ implementation #else components IEEE154NetworkLayerC; #endif + #ifdef LOW_POWER_LISTENING components LowPowerListeningLayerC; + LowPowerListeningLayerC.PacketSleepInterval -> RF230PacketC; + LowPowerListeningLayerC.IEEE154Packet2 -> IEEE154Packet2C; + LowPowerListeningLayerC.PacketAcknowledgements -> RF230PacketC; #else components new DummyLayerC() as LowPowerListeningLayerC; #endif + +#ifdef PACKET_LINK + components PacketLinkLayerC; + PacketLink = PacketLinkLayerC; + PacketLinkLayerC.PacketData -> RF230PacketC; + PacketLinkLayerC.PacketAcknowledgements -> RF230PacketC; +#else + components new DummyLayerC() as PacketLinkLayerC; +#endif + components MessageBufferLayerC; components UniqueLayerC; components TrafficMonitorLayerC; + #ifdef SLOTTED_MAC components SlottedCollisionLayerC as CollisionAvoidanceLayerC; #else components RandomCollisionLayerC as CollisionAvoidanceLayerC; #endif + components SoftwareAckLayerC; components new DummyLayerC() as CsmaLayerC; components RF230DriverLayerC; @@ -112,13 +135,10 @@ implementation UniqueLayerC.SubSend -> LowPowerListeningLayerC; LowPowerListeningLayerC.SubControl -> MessageBufferLayerC; - LowPowerListeningLayerC.SubSend -> MessageBufferLayerC; + LowPowerListeningLayerC.SubSend -> PacketLinkLayerC; LowPowerListeningLayerC.SubReceive -> MessageBufferLayerC; -#ifdef LOW_POWER_LISTENING - LowPowerListeningLayerC.PacketSleepInterval -> RF230PacketC; - LowPowerListeningLayerC.IEEE154Packet2 -> IEEE154Packet2C; - LowPowerListeningLayerC.PacketAcknowledgements -> RF230PacketC; -#endif + + PacketLinkLayerC.SubSend -> MessageBufferLayerC; MessageBufferLayerC.Packet -> RF230PacketC; MessageBufferLayerC.RadioSend -> TrafficMonitorLayerC; diff --git a/tos/chips/rf2xx/rf230/RF230Packet.h b/tos/chips/rf2xx/rf230/RF230Packet.h index 5e3e8bd7..802aa51c 100644 --- a/tos/chips/rf2xx/rf230/RF230Packet.h +++ b/tos/chips/rf2xx/rf230/RF230Packet.h @@ -25,6 +25,7 @@ #define __RF230PACKET_H__ #include +#include typedef ieee154_header_t rf230packet_header_t; @@ -40,6 +41,9 @@ typedef struct rf230packet_metadata_t uint8_t power; // shared between TXPOWER and RSSI #ifdef LOW_POWER_LISTENING uint16_t lpl_sleepint; +#endif +#ifdef PACKET_LINK + packet_link_metadata_t packet_link; #endif uint32_t timestamp; } rf230packet_metadata_t; diff --git a/tos/chips/rf2xx/rf230/RF230PacketC.nc b/tos/chips/rf2xx/rf230/RF230PacketC.nc index 23115e83..31e82699 100644 --- a/tos/chips/rf2xx/rf230/RF230PacketC.nc +++ b/tos/chips/rf2xx/rf230/RF230PacketC.nc @@ -36,6 +36,9 @@ configuration RF230PacketC interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; +#ifdef PACKET_LINK + interface PacketData as PaketLinkMetadata; +#endif } } @@ -59,4 +62,8 @@ implementation PacketTimeStampRadio = RF230PacketP; PacketTimeStampMilli = RF230PacketP; + +#ifdef PACKET_LINK + PaketLinkMetadata = RF230PacketP; +#endif } diff --git a/tos/chips/rf2xx/rf230/RF230PacketP.nc b/tos/chips/rf2xx/rf230/RF230PacketP.nc index 45b94bf6..de875b02 100644 --- a/tos/chips/rf2xx/rf230/RF230PacketP.nc +++ b/tos/chips/rf2xx/rf230/RF230PacketP.nc @@ -6,12 +6,12 @@ * documentation for any purpose, without fee, and without written agreement is * hereby granted, provided that the above copyright notice, the following * two paragraphs and the author appear in all copies of this software. - * + * * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS @@ -24,6 +24,7 @@ #include #include #include +#include module RF230PacketP { @@ -39,6 +40,10 @@ module RF230PacketP interface PacketTimeStamp as PacketTimeStampRadio; interface PacketTimeStamp as PacketTimeStampMilli; + +#ifdef PACKET_LINK + interface PacketData as PacketLinkMetadata; +#endif } uses @@ -54,7 +59,7 @@ implementation { enum { - PACKET_LENGTH_INCREASE = + PACKET_LENGTH_INCREASE = sizeof(rf230packet_header_t) - 1 // the 8-bit length field is not counted + sizeof(ieee154_footer_t), // the CRC is not stored in memory }; @@ -66,19 +71,19 @@ implementation /*----------------- Packet -----------------*/ - command void Packet.clear(message_t* msg) + command void Packet.clear(message_t* msg) { call IEEE154Packet2.createDataFrame(msg); getMeta(msg)->flags = RF230PACKET_CLEAR_METADATA; } - inline command void Packet.setPayloadLength(message_t* msg, uint8_t len) + inline command void Packet.setPayloadLength(message_t* msg, uint8_t len) { call IEEE154Packet2.setLength(msg, len + PACKET_LENGTH_INCREASE); } - inline command uint8_t Packet.payloadLength(message_t* msg) + inline command uint8_t Packet.payloadLength(message_t* msg) { return call IEEE154Packet2.getLength(msg) - PACKET_LENGTH_INCREASE; } @@ -287,4 +292,14 @@ implementation getMeta(msg)->lpl_sleepint = value; #endif } + +/*----------------- PacketLinkMetadata -----------------*/ +#ifdef PACKET_LINK + + async command packet_link_metadata_t* PacketLinkMetadata.getData(message_t* msg) + { + return &(getMeta(msg)->packet_link); + } + +#endif } diff --git a/tos/chips/rf2xx/util/PacketData.nc b/tos/chips/rf2xx/util/PacketData.nc new file mode 100644 index 00000000..ea425951 --- /dev/null +++ b/tos/chips/rf2xx/util/PacketData.nc @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2007, Vanderbilt University + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice, the following + * two paragraphs and the author appear in all copies of this software. + * + * IN NO EVENT SHALL THE VANDERBILT UNIVERSITY BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE VANDERBILT + * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE VANDERBILT UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE VANDERBILT UNIVERSITY HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Author: Miklos Maroti + */ + +interface PacketData +{ + /** + * This command returns a pointer to a set of packet fields (in the header, footer + * or metadata) with the given data type. + */ + async command data_t* getData(message_t* msg); + + /** + * This event is signalled, when the these fields should be reset to their default + * value (usually called from Packet.clear) + */ + async event void clear(data_t* data); +} -- 2.39.2