From 1b3726eac744305a1446f78ec96e0ef774321354 Mon Sep 17 00:00:00 2001 From: janhauer Date: Mon, 18 May 2009 12:54:10 +0000 Subject: [PATCH] Added a component that accepts beacon request frames and responds with a beacon (written by Jasper Buesch). --- tos/lib/mac/tkn154/BeaconRequestRxP.nc | 172 ++++++++++++++++++ tos/lib/mac/tkn154/DispatchUnslottedCsmaP.nc | 14 +- tos/lib/mac/tkn154/TKN154NonBeaconEnabledP.nc | 14 +- .../mac/tkn154/Ieee802154NonBeaconEnabledC.nc | 2 + 4 files changed, 198 insertions(+), 4 deletions(-) create mode 100644 tos/lib/mac/tkn154/BeaconRequestRxP.nc diff --git a/tos/lib/mac/tkn154/BeaconRequestRxP.nc b/tos/lib/mac/tkn154/BeaconRequestRxP.nc new file mode 100644 index 00000000..d9ae1e90 --- /dev/null +++ b/tos/lib/mac/tkn154/BeaconRequestRxP.nc @@ -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 + * ======================================================================== + */ + + +#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() {} + +} + diff --git a/tos/lib/mac/tkn154/DispatchUnslottedCsmaP.nc b/tos/lib/mac/tkn154/DispatchUnslottedCsmaP.nc index 6be52f45..adde0792 100644 --- a/tos/lib/mac/tkn154/DispatchUnslottedCsmaP.nc +++ b/tos/lib/mac/tkn154/DispatchUnslottedCsmaP.nc @@ -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(); diff --git a/tos/lib/mac/tkn154/TKN154NonBeaconEnabledP.nc b/tos/lib/mac/tkn154/TKN154NonBeaconEnabledP.nc index 70f527bc..1adae7ca 100644 --- a/tos/lib/mac/tkn154/TKN154NonBeaconEnabledP.nc +++ b/tos/lib/mac/tkn154/TKN154NonBeaconEnabledP.nc @@ -65,6 +65,7 @@ configuration TKN154NonBeaconEnabledP interface Notify as PIBUpdate[uint8_t attributeID]; interface IEEE154Frame; interface IEEE154BeaconFrame; + interface IEEE154TxBeaconPayload; interface SplitControl as PromiscuousMode; interface Get 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; diff --git a/tos/platforms/telosb/mac/tkn154/Ieee802154NonBeaconEnabledC.nc b/tos/platforms/telosb/mac/tkn154/Ieee802154NonBeaconEnabledC.nc index ab1d58d5..4bc755a7 100644 --- a/tos/platforms/telosb/mac/tkn154/Ieee802154NonBeaconEnabledC.nc +++ b/tos/platforms/telosb/mac/tkn154/Ieee802154NonBeaconEnabledC.nc @@ -56,6 +56,7 @@ configuration Ieee802154NonBeaconEnabledC interface MLME_START; interface IEEE154Frame; interface IEEE154BeaconFrame; + interface IEEE154TxBeaconPayload; interface SplitControl as PromiscuousMode; interface Get as LocalExtendedAddress; interface Timestamp; @@ -82,6 +83,7 @@ implementation MLME_ORPHAN = MAC; IEEE154Frame = MAC; IEEE154BeaconFrame = MAC; + IEEE154TxBeaconPayload = MAC; LocalExtendedAddress = MAC; PromiscuousMode = MAC; Packet = MAC; -- 2.39.2