mirror of
https://github.com/espressif/openthread.git
synced 2026-09-07 01:30:11 +00:00
Bug Fixes in NCP Raw Link Layer (#1399)
* Enable extra logging * Fix missing NCP commands * Add missing break statements and some logs
This commit is contained in:
@@ -32,6 +32,7 @@
|
||||
*/
|
||||
|
||||
#include <common/debug.hpp>
|
||||
#include <common/logging.hpp>
|
||||
#include <platform/random.h>
|
||||
#include <platform/usec-alarm.h>
|
||||
#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<Mac::Frame *>(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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user