diff --git a/src/core/api/link_raw_api.cpp b/src/core/api/link_raw_api.cpp index 0a8c214f8..0c876ec6a 100644 --- a/src/core/api/link_raw_api.cpp +++ b/src/core/api/link_raw_api.cpp @@ -32,6 +32,7 @@ */ #include +#include #include #include #include "openthread-instance.h" @@ -46,6 +47,8 @@ ThreadError otLinkRawSetEnable(otInstance *aInstance, bool aEnabled) VerifyOrExit(!aInstance->mThreadNetif.IsUp(), error = kThreadError_InvalidState); + otLogInfoPlat("LinkRaw Enabled=%d", aEnabled ? 1 : 0); + aInstance->mLinkRaw.SetEnabled(aEnabled); exit: @@ -110,6 +113,8 @@ ThreadError otLinkRawSetPromiscuous(otInstance *aInstance, bool aEnable) VerifyOrExit(aInstance->mLinkRaw.IsEnabled(), error = kThreadError_InvalidState); + otLogInfoPlat("LinkRaw Promiscuous=%d", aEnabled ? 1 : 0); + otPlatRadioSetPromiscuous(aInstance, aEnable); exit: @@ -122,6 +127,8 @@ ThreadError otLinkRawSleep(otInstance *aInstance) VerifyOrExit(aInstance->mLinkRaw.IsEnabled(), error = kThreadError_InvalidState); + otLogDebgPlat("LinkRaw Sleep"); + error = otPlatRadioSleep(aInstance); exit: @@ -130,6 +137,7 @@ exit: ThreadError otLinkRawReceive(otInstance *aInstance, uint8_t aChannel, otLinkRawReceiveDone aCallback) { + otLogDebgPlat("LinkRaw Recv (Channel %d)", aChannel); return aInstance->mLinkRaw.Receive(aChannel, aCallback); } @@ -147,6 +155,7 @@ exit: ThreadError otLinkRawTransmit(otInstance *aInstance, RadioPacket *aPacket, otLinkRawTransmitDone aCallback) { + otLogDebgPlat("LinkRaw Transmit (%d bytes)", aPacket->mLength); return aInstance->mLinkRaw.Transmit(aPacket, aCallback); } @@ -362,6 +371,7 @@ ThreadError LinkRaw::DoTransmit(RadioPacket *aPacket) // to fire if we don't get a transmit done callback in time. if (static_cast(aPacket)->GetAckRequest()) { + otLogDebgPlat("LinkRaw Starting AckTimeout Timer"); mTimerReason = kTimerReasonAckTimeout; mTimer.Start(kAckTimeout); } @@ -373,6 +383,8 @@ ThreadError LinkRaw::DoTransmit(RadioPacket *aPacket) void LinkRaw::InvokeTransmitDone(RadioPacket *aPacket, bool aFramePending, ThreadError aError) { + otLogDebgPlat("LinkRaw Transmit Done (err=0x%x)", aError); + #if OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ACK_TIMEOUT mTimer.Stop(); #endif @@ -407,6 +419,7 @@ void LinkRaw::InvokeTransmitDone(RadioPacket *aPacket, bool aFramePending, Threa if (mTransmitDoneCallback) { + otLogDebgPlat("LinkRaw Invoke Transmit Done"); mTransmitDoneCallback(&mInstance, aPacket, aFramePending, aError); mTransmitDoneCallback = NULL; } @@ -475,6 +488,7 @@ void LinkRaw::HandleTimer(void) // Invoke completion callback for transmit InvokeTransmitDone(otPlatRadioGetTransmitBuffer(&mInstance), false, kThreadError_NoAck); + break; } #endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ACK_TIMEOUT @@ -492,6 +506,8 @@ void LinkRaw::HandleTimer(void) { InvokeTransmitDone(aPacket, false, error); } + + break; } #endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_RETRANSMIT @@ -502,6 +518,7 @@ void LinkRaw::HandleTimer(void) { // Invoke completion callback for the energy scan InvokeEnergyScanDone(mEnergyScanRssi); + break; } #endif // OPENTHREAD_CONFIG_ENABLE_SOFTWARE_ENERGY_SCAN @@ -536,6 +553,7 @@ void LinkRaw::StartCsmaBackoff(void) delay.mMs = backoff / 1000UL; delay.mUs = backoff - (delay.mMs * 1000UL); + otLogDebgPlat("LinkRaw Starting RetransmitTimeout Timer (%d ms)", backoff); mTimerReason = kTimerReasonRetransmitTimeout; otPlatUsecAlarmStartAt(&mInstance, &now, &delay, &HandleTimer, this); #else // OPENTHREAD_CONFIG_ENABLE_PLATFORM_USEC_BACKOFF_TIMER diff --git a/src/ncp/ncp_base.cpp b/src/ncp/ncp_base.cpp index 121b8a5de..fc3fa8c73 100644 --- a/src/ncp/ncp_base.cpp +++ b/src/ncp/ncp_base.cpp @@ -239,6 +239,7 @@ const NcpBase::SetPropertyHandlerEntry NcpBase::mSetPropertyHandlerTable[] = #if OPENTHREAD_ENABLE_RAW_LINK_API { SPINEL_PROP_PHY_ENABLED, &NcpBase::SetPropertyHandler_PHY_ENABLED }, + { SPINEL_PROP_MAC_15_4_SADDR, &NcpBase::SetPropertyHandler_MAC_15_4_SADDR }, { SPINEL_PROP_STREAM_RAW, &NcpBase::SetPropertyHandler_STREAM_RAW }, #endif // OPENTHREAD_ENABLE_RAW_LINK_API { SPINEL_PROP_PHY_TX_POWER, &NcpBase::SetPropertyHandler_PHY_TX_POWER }, @@ -249,6 +250,7 @@ const NcpBase::SetPropertyHandlerEntry NcpBase::mSetPropertyHandlerTable[] = { SPINEL_PROP_MAC_SCAN_STATE, &NcpBase::SetPropertyHandler_MAC_SCAN_STATE }, { SPINEL_PROP_MAC_SCAN_PERIOD, &NcpBase::SetPropertyHandler_MAC_SCAN_PERIOD }, { SPINEL_PROP_MAC_15_4_PANID, &NcpBase::SetPropertyHandler_MAC_15_4_PANID }, + { SPINEL_PROP_MAC_15_4_LADDR, &NcpBase::SetPropertyHandler_MAC_15_4_LADDR }, { SPINEL_PROP_MAC_RAW_STREAM_ENABLED, &NcpBase::SetPropertyHandler_MAC_RAW_STREAM_ENABLED }, { SPINEL_PROP_NET_IF_UP, &NcpBase::SetPropertyHandler_NET_IF_UP }, @@ -3756,6 +3758,41 @@ ThreadError NcpBase::SetPropertyHandler_MAC_15_4_PANID(uint8_t header, spinel_pr return errorCode; } +ThreadError NcpBase::SetPropertyHandler_MAC_15_4_LADDR(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, + uint16_t value_len) +{ + otExtAddress *tmp; + spinel_ssize_t parsedLength; + ThreadError errorCode = kThreadError_None; + + parsedLength = spinel_datatype_unpack( + value_ptr, + value_len, + SPINEL_DATATYPE_EUI64_S, + &tmp + ); + + if (parsedLength > 0) + { + errorCode = otSetExtendedAddress(mInstance, tmp); + + if (errorCode == kThreadError_None) + { + errorCode = HandleCommandPropertyGet(header, key); + } + else + { + errorCode = SendLastStatus(header, ThreadErrorToSpinelStatus(errorCode)); + } + } + else + { + errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR); + } + + return errorCode; +} + ThreadError NcpBase::SetPropertyHandler_MAC_RAW_STREAM_ENABLED(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr,uint16_t value_len) { @@ -3806,6 +3843,41 @@ ThreadError NcpBase::SetPropertyHandler_MAC_RAW_STREAM_ENABLED(uint8_t header, s #if OPENTHREAD_ENABLE_RAW_LINK_API +ThreadError NcpBase::SetPropertyHandler_MAC_15_4_SADDR(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, + uint16_t value_len) +{ + uint16_t tmp; + spinel_ssize_t parsedLength; + ThreadError errorCode = kThreadError_None; + + parsedLength = spinel_datatype_unpack( + value_ptr, + value_len, + SPINEL_DATATYPE_UINT16_S, + &tmp + ); + + if (parsedLength > 0) + { + errorCode = otLinkRawSetShortAddress(mInstance, tmp); + + if (errorCode == kThreadError_None) + { + errorCode = HandleCommandPropertyGet(header, key); + } + else + { + errorCode = SendLastStatus(header, ThreadErrorToSpinelStatus(errorCode)); + } + } + else + { + errorCode = SendLastStatus(header, SPINEL_STATUS_PARSE_ERROR); + } + + return errorCode; +} + ThreadError NcpBase::SetPropertyHandler_STREAM_RAW(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len) { diff --git a/src/ncp/ncp_base.hpp b/src/ncp/ncp_base.hpp index ea0fb711c..e3d60ef6c 100644 --- a/src/ncp/ncp_base.hpp +++ b/src/ncp/ncp_base.hpp @@ -417,10 +417,14 @@ private: uint16_t value_len); ThreadError SetPropertyHandler_MAC_15_4_PANID(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); + ThreadError SetPropertyHandler_MAC_15_4_LADDR(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, + uint16_t value_len); ThreadError SetPropertyHandler_MAC_RAW_STREAM_ENABLED(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); #if OPENTHREAD_ENABLE_RAW_LINK_API + ThreadError SetPropertyHandler_MAC_15_4_SADDR(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, + uint16_t value_len); ThreadError SetPropertyHandler_STREAM_RAW(uint8_t header, spinel_prop_key_t key, const uint8_t *value_ptr, uint16_t value_len); #endif // OPENTHREAD_ENABLE_RAW_LINK_API