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:
Nick Banks
2017-02-28 21:53:44 -08:00
committed by Jonathan Hui
parent 95ff7b55dc
commit 1eae7fbef1
3 changed files with 94 additions and 0 deletions
+18
View File
@@ -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
+72
View File
@@ -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)
{
+4
View File
@@ -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