]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Added a component that accepts beacon request frames and responds with a beacon ...
authorjanhauer <janhauer>
Mon, 18 May 2009 12:54:10 +0000 (12:54 +0000)
committerjanhauer <janhauer>
Mon, 18 May 2009 12:54:10 +0000 (12:54 +0000)
tos/lib/mac/tkn154/BeaconRequestRxP.nc [new file with mode: 0644]
tos/lib/mac/tkn154/DispatchUnslottedCsmaP.nc
tos/lib/mac/tkn154/TKN154NonBeaconEnabledP.nc
tos/platforms/telosb/mac/tkn154/Ieee802154NonBeaconEnabledC.nc

diff --git a/tos/lib/mac/tkn154/BeaconRequestRxP.nc b/tos/lib/mac/tkn154/BeaconRequestRxP.nc
new file mode 100644 (file)
index 0000000..d9ae1e9
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2009, Technische Universitaet Berlin
+ * 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 Technische Universitaet Berlin 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 COPYRIGHT 
+ * OWNER OR 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.
+ *
+ * - Revision -------------------------------------------------------------
+ * $Revision$
+ * $Date$
+ * @author: Jasper Buesch <buesch@tkn.tu-berlin.de>
+ * ========================================================================
+ */
+
+
+#include "TKN154_MAC.h"
+#include "TKN154.h"
+module BeaconRequestRxP
+{
+  provides
+  {
+    interface Init as Reset;
+    interface IEEE154TxBeaconPayload;
+  }
+  uses
+  {
+    interface FrameRx as BeaconRequestRx;
+    interface FrameTx as BeaconRequestResponseTx;
+    interface MLME_GET;
+    interface FrameUtility;
+    interface IEEE154Frame as Frame;
+
+  }
+}
+implementation
+{
+  /* variables that describe the beacon (payload) */
+  norace ieee154_txframe_t  m_beaconFrame;
+  ieee154_header_t          m_header;
+  ieee154_metadata_t        m_metadata;  
+  uint8_t                   m_beaconPayloadLen;
+  uint8_t                   m_payload[IEEE154_aMaxBeaconPayloadLength];
+
+  /* ------------------- Init ------------------- */
+
+  command error_t Reset.init()
+  {
+    m_beaconPayloadLen = 0;
+    m_beaconFrame.header = &m_header;
+    m_beaconFrame.headerLen = 0;
+    m_beaconFrame.payload = m_payload;
+    m_beaconFrame.payloadLen = 4;  // first 4 bytes belong to superframe- & gts-fields
+    m_beaconFrame.metadata = &m_metadata;
+
+    dbg_serial("BeaconRequestResponderP","Init()\n");
+    return SUCCESS;
+  }
+
+  /* ------------------- Beacon-Request Response ------------------- */
+
+  task void sendBeaconTask(){
+    call BeaconRequestResponseTx.transmit(&m_beaconFrame);
+  }
+
+  event message_t* BeaconRequestRx.received(message_t* frame) 
+  {
+    uint8_t offset = 0;
+    ieee154_macShortAddress_t shortAddress = call MLME_GET.macShortAddress();
+    bool isShortAddr;
+
+    shortAddress = call MLME_GET.macShortAddress();
+    isShortAddr = (shortAddress != 0xFFFE);
+    m_beaconFrame.header->mhr[MHR_INDEX_FC1] = FC1_FRAMETYPE_BEACON;
+    m_beaconFrame.header->mhr[MHR_INDEX_FC2] = isShortAddr ? FC2_SRC_MODE_SHORT : FC2_SRC_MODE_EXTENDED;
+    offset = MHR_INDEX_ADDRESS;
+    *((nxle_uint16_t*) &m_beaconFrame.header->mhr[offset]) = PAN_ID;
+    offset += sizeof(ieee154_macPANId_t);
+    if (isShortAddr) {
+      *((nxle_uint16_t*) &m_beaconFrame.header->mhr[offset]) = shortAddress;
+      offset += sizeof(ieee154_macShortAddress_t);
+    } else {
+      call FrameUtility.copyLocalExtendedAddressLE(&m_beaconFrame.header->mhr[offset]);
+      offset += 8;
+    }
+    m_beaconFrame.headerLen = offset;
+
+    // Superframe-spec
+    m_payload[0] = 0xff; // beacon- and superframe order always 15 in non-beaconenabled mode
+    m_payload[1] = 0x00; 
+    if (call MLME_GET.macPanCoordinator() == TRUE) 
+      m_payload[1] |= 0x40;
+    if (call MLME_GET.macAssociationPermit() == TRUE) 
+      m_payload[1] |= 0x80;
+    if (call MLME_GET.macBattLifeExt() == TRUE) 
+      m_payload[1] |= 0x10;
+    // GTS-spec
+    m_payload[2] = 0;
+    // Pending-Address-spec
+    m_payload[3] = 0;
+
+    signal IEEE154TxBeaconPayload.aboutToTransmit(); 
+    post sendBeaconTask();
+
+    return frame;
+
+  }
+  event void BeaconRequestResponseTx.transmitDone(ieee154_txframe_t *txFrame, ieee154_status_t status){
+    signal IEEE154TxBeaconPayload.beaconTransmitted();
+  }
+
+  /* ----------------------- Beacon Payload ----------------------- */
+
+  command error_t IEEE154TxBeaconPayload.setBeaconPayload(void *beaconPayload, uint8_t length) {
+    dbg_serial("BeaconRequestResponderP","IEEE154TxBeaconPayload.setBeaconPayload\n\n");
+    if (length < IEEE154_aMaxBeaconPayloadLength){
+      memcpy(&m_payload[4], beaconPayload, length);
+      m_beaconFrame.payloadLen = 4 + length;
+      signal IEEE154TxBeaconPayload.setBeaconPayloadDone(beaconPayload, length); 
+      return SUCCESS;
+    } else 
+      return ESIZE;
+  }
+
+  command const void* IEEE154TxBeaconPayload.getBeaconPayload(){
+    return &m_payload[4]; // the first four bytes are non-user bytes
+  }
+
+  command uint8_t IEEE154TxBeaconPayload.getBeaconPayloadLength(){
+    return m_beaconFrame.payloadLen - 4; // Beacon-Payload in NonBeaconed mode at least 4 bytes (non-user payload) 
+  }
+
+  command error_t IEEE154TxBeaconPayload.modifyBeaconPayload(uint8_t offset, void *buffer, uint8_t bufferLength){
+    uint16_t totalLen = offset + bufferLength;
+    if (totalLen > IEEE154_aMaxBeaconPayloadLength ||
+        call IEEE154TxBeaconPayload.getBeaconPayloadLength() < totalLen)
+      return ESIZE;
+    else {
+      memcpy(&m_payload[4+offset], buffer, bufferLength);
+      signal IEEE154TxBeaconPayload.modifyBeaconPayloadDone(offset, buffer , bufferLength); 
+    }
+    return SUCCESS;
+  }
+
+  default event void IEEE154TxBeaconPayload.setBeaconPayloadDone(void *beaconPayload, uint8_t length) {}
+  default event void IEEE154TxBeaconPayload.modifyBeaconPayloadDone(uint8_t offset, void *buffer, uint8_t bufferLength) {}
+  default event void IEEE154TxBeaconPayload.aboutToTransmit() {}
+  default event void IEEE154TxBeaconPayload.beaconTransmitted() {}
+
+}
+
index 6be52f45ea6417af89c5037532b0a4c4f1a3aa83..adde0792f6040269fdc5ff2d507253f8af072957 100644 (file)
@@ -204,9 +204,17 @@ implementation
 
   void setCurrentFrame(ieee154_txframe_t *frame)
   {
-    ieee154_macDSN_t dsn = call MLME_GET.macDSN();
-    frame->header->mhr[MHR_INDEX_SEQNO] = dsn++;
-    call MLME_SET.macDSN(dsn);
+    if (frame->header->mhr[MHR_INDEX_FC1] != FC1_FRAMETYPE_BEACON) { 
+      // set the sequence number for command/data frame
+      ieee154_macDSN_t dsn = call MLME_GET.macDSN();
+      frame->header->mhr[MHR_INDEX_SEQNO] = dsn++;
+      call MLME_SET.macDSN(dsn);
+    } else {
+      // set the sequence number for beacon frame
+      ieee154_macBSN_t bsn = call MLME_GET.macBSN(); 
+      frame->header->mhr[MHR_INDEX_SEQNO] = bsn++;
+      call MLME_SET.macBSN(bsn);
+    }    
     m_csma.NB = 0;
     m_csma.macMaxCsmaBackoffs = m_macMaxCSMABackoffs = call MLME_GET.macMaxCSMABackoffs();
     m_csma.macMaxBE = m_macMaxBE = call MLME_GET.macMaxBE();
index 70f527bcc174b097f5efe6ba2c49338988bb25a6..1adae7caa554e1aa504a968263ff882ea5d236a0 100644 (file)
@@ -65,6 +65,7 @@ configuration TKN154NonBeaconEnabledP
     interface Notify<const void*> as PIBUpdate[uint8_t attributeID];
     interface IEEE154Frame;
     interface IEEE154BeaconFrame;
+    interface IEEE154TxBeaconPayload;
     interface SplitControl as PromiscuousMode;
     interface Get<uint64_t> as GetLocalExtendedAddress;
     interface TimeCalc;
@@ -98,6 +99,7 @@ implementation
              RadioControlP,
              IndirectTxP,
              PollP,
+             BeaconRequestRxP,
 
 #ifndef IEEE154_SCAN_DISABLED
              ScanP,
@@ -164,12 +166,13 @@ implementation
   MLME_SET = PibP;
   IEEE154Frame = PibP;
   IEEE154BeaconFrame = PibP;
+  IEEE154TxBeaconPayload = BeaconRequestRxP;
   PromiscuousMode = PromiscuousModeP;
   GetLocalExtendedAddress = PibP.GetLocalExtendedAddress;
   Packet = PibP; 
   TimeCalc = PibP;
   FrameUtility = PibP;
-  
+
   /* ----------------------- Scanning (MLME-SCAN) ----------------------- */
 
   components new RadioClientC(RADIO_CLIENT_SCAN) as ScanRadioClient;
@@ -189,6 +192,15 @@ implementation
   ScanP.Leds = Leds;
   ScanP.FrameUtility -> PibP;
 
+  /* -------------------- Responding to Active Scans  --------------------- */
+
+  PibP.MacReset -> BeaconRequestRxP;
+  BeaconRequestRxP.BeaconRequestRx -> DispatchP.FrameRx[FC1_FRAMETYPE_CMD + CMD_FRAME_BEACON_REQUEST];
+  BeaconRequestRxP.BeaconRequestResponseTx -> DispatchQueueP.FrameTx[unique(CAP_TX_CLIENT)];
+  BeaconRequestRxP.MLME_GET -> PibP;
+  BeaconRequestRxP.FrameUtility -> PibP;
+  BeaconRequestRxP.Frame -> PibP;
+
   /* -------------------- Association (MLME-ASSOCIATE) -------------------- */
 
   PibP.MacReset -> AssociateP;
index ab1d58d5075b604b18033f6bc8c9d52465d0066f..4bc755a787e066c16efb469d4ca74e9542c4bc1d 100644 (file)
@@ -56,6 +56,7 @@ configuration Ieee802154NonBeaconEnabledC
     interface MLME_START;
     interface IEEE154Frame;
     interface IEEE154BeaconFrame;
+    interface IEEE154TxBeaconPayload;
     interface SplitControl as PromiscuousMode;
     interface Get<uint64_t> as LocalExtendedAddress;
     interface Timestamp;
@@ -82,6 +83,7 @@ implementation
   MLME_ORPHAN = MAC;
   IEEE154Frame = MAC;
   IEEE154BeaconFrame = MAC;
+  IEEE154TxBeaconPayload = MAC;
   LocalExtendedAddress = MAC;
   PromiscuousMode = MAC;
   Packet = MAC;