diff --git a/include/openthread.h b/include/openthread.h index 9f3eec187..7c9ecbd6c 100644 --- a/include/openthread.h +++ b/include/openthread.h @@ -441,6 +441,22 @@ const uint8_t *otGetMasterKey(uint8_t *aKeyLength); */ ThreadError otSetMasterKey(const uint8_t *aKey, uint8_t aKeyLength); +/** + * This function returns the maximum transmit power setting in dBm. + * + * @returns The maximum transmit power setting. + * + */ +int8_t otGetMaxTransmitPower(void); + +/** + * This function sets the maximum transmit power in dBm. + * + * @param[in] aPower The maximum transmit power in dBm. + * + */ +void otSetMaxTransmitPower(int8_t aPower); + /** * This function returns a pointer to the Mesh Local EID. * diff --git a/src/core/mac/mac.cpp b/src/core/mac/mac.cpp index 7587918a4..edc61a8b2 100644 --- a/src/core/mac/mac.cpp +++ b/src/core/mac/mac.cpp @@ -98,6 +98,7 @@ Mac::Mac(ThreadNetif &aThreadNetif): mReceiveHead = NULL; mReceiveTail = NULL; mChannel = OPENTHREAD_CONFIG_DEFAULT_CHANNEL; + mMaxTransmitPower = OPENTHREAD_CONFIG_DEFAULT_MAX_TRANSMIT_POWER; mPanId = kPanIdBroadcast; mShortAddress = kShortAddrInvalid; @@ -238,6 +239,16 @@ ThreadError Mac::SetChannel(uint8_t aChannel) return kThreadError_None; } +int8_t Mac::GetMaxTransmitPower(void) const +{ + return mMaxTransmitPower; +} + +void Mac::SetMaxTransmitPower(int8_t aPower) +{ + mMaxTransmitPower = aPower; +} + const char *Mac::GetNetworkName(void) const { return mNetworkName.m8; @@ -472,6 +483,8 @@ void Mac::HandleBeginTransmit(void) ExitNow(); } + sendFrame.SetPower(mMaxTransmitPower); + switch (mState) { case kStateActiveScan: @@ -500,6 +513,11 @@ void Mac::HandleBeginTransmit(void) // Security Processing ProcessTransmitSecurity(sendFrame); + if (sendFrame.GetPower() > mMaxTransmitPower) + { + sendFrame.SetPower(mMaxTransmitPower); + } + SuccessOrExit(error = otPlatRadioTransmit()); if (sendFrame.GetAckRequest() && !(otPlatRadioGetCaps() & kRadioCapsAckTimeout)) diff --git a/src/core/mac/mac.hpp b/src/core/mac/mac.hpp index 64cb6f4a8..7498385b7 100644 --- a/src/core/mac/mac.hpp +++ b/src/core/mac/mac.hpp @@ -302,6 +302,22 @@ public: */ ThreadError SetChannel(uint8_t aChannel); + /** + * This method returns the maximum transmit power in dBm. + * + * @returns The maximum transmit power in dBm. + * + */ + int8_t GetMaxTransmitPower(void) const; + + /** + * This method sets the maximum transmit power in dBm. + * + * @param[in] aPower The maximum transmit power in dBm. + * + */ + void SetMaxTransmitPower(int8_t aPower); + /** * This method returns the IEEE 802.15.4 Network Name. * @@ -470,6 +486,7 @@ private: ShortAddress mShortAddress; PanId mPanId; uint8_t mChannel; + int8_t mMaxTransmitPower; otNetworkName mNetworkName; otExtendedPanId mExtendedPanId; diff --git a/src/core/openthread-core-default-config.h b/src/core/openthread-core-default-config.h index 5abb9b911..fc3787233 100644 --- a/src/core/openthread-core-default-config.h +++ b/src/core/openthread-core-default-config.h @@ -65,6 +65,16 @@ #define OPENTHREAD_CONFIG_DEFAULT_CHANNEL 11 #endif // OPENTHREAD_CONFIG_DEFAULT_CHANNEL +/** + * @def OPENTHREAD_CONFIG_DEFAULT_MAX_TRANSMIT_POWER + * + * The default IEEE 802.15.4 maximum transmit power (dBm) + * + */ +#ifndef OPENTHREAD_CONFIG_DEFAULT_MAX_TRANSMIT_POWER +#define OPENTHREAD_CONFIG_DEFAULT_MAX_TRANSMIT_POWER 0 +#endif // OPENTHREAD_CONFIG_DEFAULT_MAX_TRANSMIT_POWER + /** * @def OPENTHREAD_CONFIG_ATTACH_DATA_POLL_PERIOD * diff --git a/src/core/openthread.cpp b/src/core/openthread.cpp index ff14667e4..06794a816 100644 --- a/src/core/openthread.cpp +++ b/src/core/openthread.cpp @@ -210,6 +210,16 @@ ThreadError otSetMasterKey(const uint8_t *aKey, uint8_t aKeyLength) return sThreadNetif->GetKeyManager().SetMasterKey(aKey, aKeyLength); } +int8_t otGetMaxTransmitPower(void) +{ + return sThreadNetif->GetMac().GetMaxTransmitPower(); +} + +void otSetMaxTransmitPower(int8_t aPower) +{ + sThreadNetif->GetMac().SetMaxTransmitPower(aPower); +} + const otIp6Address *otGetMeshLocalEid(void) { return sThreadNetif->GetMle().GetMeshLocal64();