diff --git a/include/openthread-types.h b/include/openthread-types.h index cc157cb87..b046e50e8 100644 --- a/include/openthread-types.h +++ b/include/openthread-types.h @@ -147,6 +147,32 @@ typedef struct otExtAddress uint8_t m8[OT_EXT_ADDRESS_SIZE]; ///< IEEE 802.15.4 Extended Address bytes } otExtAddress; +/** + * @addtogroup commands Commands + * + * @{ + * + */ + +#define OT_CHANNEL_11_MASK (1 << 11) ///< Channel 11 +#define OT_CHANNEL_12_MASK (1 << 12) ///< Channel 12 +#define OT_CHANNEL_13_MASK (1 << 13) ///< Channel 13 +#define OT_CHANNEL_14_MASK (1 << 14) ///< Channel 14 +#define OT_CHANNEL_15_MASK (1 << 15) ///< Channel 15 +#define OT_CHANNEL_16_MASK (1 << 16) ///< Channel 16 +#define OT_CHANNEL_17_MASK (1 << 17) ///< Channel 17 +#define OT_CHANNEL_18_MASK (1 << 18) ///< Channel 18 +#define OT_CHANNEL_19_MASK (1 << 19) ///< Channel 19 +#define OT_CHANNEL_20_MASK (1 << 20) ///< Channel 20 +#define OT_CHANNEL_21_MASK (1 << 21) ///< Channel 21 +#define OT_CHANNEL_22_MASK (1 << 22) ///< Channel 22 +#define OT_CHANNEL_23_MASK (1 << 23) ///< Channel 23 +#define OT_CHANNEL_24_MASK (1 << 24) ///< Channel 24 +#define OT_CHANNEL_25_MASK (1 << 25) ///< Channel 25 +#define OT_CHANNEL_26_MASK (1 << 26) ///< Channel 26 + +#define OT_CHANNEL_ALL 0xffffffff ///< All channels + /** * This struct represents a received IEEE 802.15.4 Beacon. * @@ -165,6 +191,11 @@ typedef struct otActiveScanResult bool mIsJoinable : 1; ///< Joining Permitted flag } otActiveScanResult; +/** + * @} + * + */ + /** * @addtogroup config Configuration * diff --git a/include/openthread.h b/include/openthread.h index 5764f64bf..89c116e14 100644 --- a/include/openthread.h +++ b/include/openthread.h @@ -176,7 +176,7 @@ typedef void (*otHandleActiveScanResult)(otActiveScanResult *aResult); /** * This function starts an IEEE 802.15.4 Active Scan * - * @param[in] aScanChannels A bit vector indicating which channels to scan. + * @param[in] aScanChannels A bit vector indicating which channels to scan (e.g. OT_CHANNEL_11_MASK). * @param[in] aScanDuration The time in milliseconds to spend scanning each channel. * @param[in] aCallback A pointer to a function that is called when a beacon is received or the scan completes. * @@ -184,7 +184,7 @@ typedef void (*otHandleActiveScanResult)(otActiveScanResult *aResult); * @retval kThreadError_Busy Already performing an Active Scan. * */ -ThreadError otActiveScan(uint16_t aScanChannels, uint16_t aScanDuration, otHandleActiveScanResult aCallback); +ThreadError otActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, otHandleActiveScanResult aCallback); /** * This function determines if an IEEE 802.15.4 Active Scan is currently in progress. diff --git a/include/platform/radio.h b/include/platform/radio.h index 64a2ee93a..0e131ddc7 100644 --- a/include/platform/radio.h +++ b/include/platform/radio.h @@ -67,11 +67,12 @@ extern "C" { enum { - kMaxPHYPacketSize = 127, ///< aMaxPHYPacketSize (IEEE 802.15.4-2006) - kPhyMinChannel = 11, ///< 2.4 GHz IEEE 802.15.4-2006 - kPhyMaxChannel = 26, ///< 2.4 GHz IEEE 802.15.4-2006 - kPhySymbolsPerOctet = 2, ///< 2.4 GHz IEEE 802.15.4-2006 - kPhyBitRate = 250000, ///< 2.4 GHz IEEE 802.15.4 (kilobits per second) + kMaxPHYPacketSize = 127, ///< aMaxPHYPacketSize (IEEE 802.15.4-2006) + kPhyMinChannel = 11, ///< 2.4 GHz IEEE 802.15.4-2006 + kPhyMaxChannel = 26, ///< 2.4 GHz IEEE 802.15.4-2006 + kPhySupportedChannelMask = 0xffff << kPhyMinChannel, ///< 2.4 GHz IEEE 802.15.4-2006 + kPhySymbolsPerOctet = 2, ///< 2.4 GHz IEEE 802.15.4-2006 + kPhyBitRate = 250000, ///< 2.4 GHz IEEE 802.15.4 (kilobits per second) kPhyBitsPerOctet = 8, kPhyUsPerSymbol = ((kPhyBitsPerOctet / kPhySymbolsPerOctet) * 1000000) / kPhyBitRate, diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index c9d35f24f..0541d7f8b 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -1140,7 +1140,7 @@ void Interpreter::ProcessScan(int argc, char *argv[]) if (argc > 0) { SuccessOrExit(error = ParseLong(argv[0], value)); - scanChannels = 1 << (value - kPhyMinChannel); + scanChannels = 1 << value; } SuccessOrExit(error = otActiveScan(scanChannels, 0, &HandleActiveScanResult)); diff --git a/src/core/mac/mac.cpp b/src/core/mac/mac.cpp index 0eb30c586..2eacdd3a5 100644 --- a/src/core/mac/mac.cpp +++ b/src/core/mac/mac.cpp @@ -122,7 +122,7 @@ Mac::Mac(ThreadNetif &aThreadNetif): otPlatRadioEnable(); } -ThreadError Mac::ActiveScan(uint16_t aScanChannels, uint16_t aScanDuration, ActiveScanHandler aHandler, void *aContext) +ThreadError Mac::ActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, ActiveScanHandler aHandler, void *aContext) { ThreadError error = kThreadError_None; @@ -134,6 +134,7 @@ ThreadError Mac::ActiveScan(uint16_t aScanChannels, uint16_t aScanDuration, Acti mScanDuration = (aScanDuration == 0) ? kScanDurationDefault : aScanDuration; mScanChannel = kPhyMinChannel; + mScanChannels >>= kPhyMinChannel; while ((mScanChannels & 1) == 0) { diff --git a/src/core/mac/mac.hpp b/src/core/mac/mac.hpp index 97bbba4e9..ccd442fa9 100644 --- a/src/core/mac/mac.hpp +++ b/src/core/mac/mac.hpp @@ -78,7 +78,7 @@ enum kDataPollTimeout = 100, ///< Timeout for receiving Data Frame (milliseconds). kNonceSize = 13, ///< Size of IEEE 802.15.4 Nonce (bytes). - kScanChannelsAll = 0xffff, ///< All channels. + kScanChannelsAll = OT_CHANNEL_ALL, ///< All channels. kScanDurationDefault = 200, ///< Default interval between channels (milliseconds). }; @@ -207,7 +207,7 @@ public: * @param[in] aContext A pointer to arbitrary context information. * */ - ThreadError ActiveScan(uint16_t aScanChannels, uint16_t aScanDuration, ActiveScanHandler aHandler, void *aContext); + ThreadError ActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, ActiveScanHandler aHandler, void *aContext); /** * This method indicates whether or not rx-on-when-idle is enabled. @@ -485,7 +485,7 @@ private: bool mActiveScanRequest; uint8_t mScanChannel; - uint16_t mScanChannels; + uint32_t mScanChannels; uint16_t mScanDuration; ActiveScanHandler mActiveScanHandler; void *mActiveScanContext; diff --git a/src/core/openthread.cpp b/src/core/openthread.cpp index 94fa514c2..ec7b6ea3c 100644 --- a/src/core/openthread.cpp +++ b/src/core/openthread.cpp @@ -671,7 +671,7 @@ ThreadError otDisable(void) return sThreadNetif->Down(); } -ThreadError otActiveScan(uint16_t aScanChannels, uint16_t aScanDuration, otHandleActiveScanResult aCallback) +ThreadError otActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, otHandleActiveScanResult aCallback) { return sThreadNetif->GetMac().ActiveScan(aScanChannels, aScanDuration, &HandleActiveScanResult, reinterpret_cast(aCallback)); diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index ffca0b36b..fb3c2d0a4 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -231,7 +231,7 @@ static spinel_status_t ThreadErrorToSpinelStatus(ThreadError error) NcpBase::NcpBase(): mUpdateChangedPropsTask(&UpdateChangedProps, this) { - mSupportedChannelMask = (0xFFFF << 11); // Default to 2.4GHz 802.15.4 channels. + mSupportedChannelMask = kPhySupportedChannelMask; mChannelMask = mSupportedChannelMask; mScanPeriod = 200; // ms sNcpContext = this; @@ -1870,7 +1870,7 @@ void NcpBase::SetPropertyHandler_MAC_SCAN_STATE(uint8_t header, spinel_prop_key_ case SPINEL_SCAN_STATE_BEACON: gActiveScanContextHack = this; errorCode = otActiveScan( - (mChannelMask >> kPhyMinChannel), + mChannelMask, mScanPeriod, &HandleActiveScanResult_Jump );